• Alexander Sverdlin's avatar
    macvlan: Skip loopback packets in RX handler · 81f3dc93
    Alexander Sverdlin authored
    Ignore loopback-originatig packets soon enough and don't try to process L2
    header where it doesn't exist. The very similar br_handle_frame() in bridge
    code performs exactly the same check.
    
    This is an example of such ICMPv6 packet:
    
    skb len=96 headroom=40 headlen=96 tailroom=56
    mac=(40,0) net=(40,40) trans=80
    shinfo(txflags=0 nr_frags=0 gso(size=0 type=0 segs=0))
    csum(0xae2e9a2f ip_summed=1 complete_sw=0 valid=0 level=0)
    hash(0xc97ebd88 sw=1 l4=1) proto=0x86dd pkttype=5 iif=24
    dev name=etha01.212 feat=0x0x0000000040005000
    skb headroom: 00000000: 00 7c 86 52 84 88 ff ff 00 00 00 00 00 00 08 00
    skb headroom: 00000010: 45 00 00 9e 5d 5c 40 00 40 11 33 33 00 00 00 01
    skb headroom: 00000020: 02 40 43 80 00 00 86 dd
    skb linear:   00000000: 60 09 88 bd 00 38 3a ff fe 80 00 00 00 00 00 00
    skb linear:   00000010: 00 40 43 ff fe 80 00 00 ff 02 00 00 00 00 00 00
    skb linear:   00000020: 00 00 00 00 00 00 00 01 86 00 61 00 40 00 00 2d
    skb linear:   00000030: 00 00 00 00 00 00 00 00 03 04 40 e0 00 00 01 2c
    skb linear:   00000040: 00 00 00 78 00 00 00 00 fd 5f 42 68 23 87 a8 81
    skb linear:   00000050: 00 00 00 00 00 00 00 00 01 01 02 40 43 80 00 00
    skb tailroom: 00000000: ...
    skb tailroom: 00000010: ...
    skb tailroom: 00000020: ...
    skb tailroom: 00000030: ...
    
    Call Trace, how it happens exactly:
     ...
     macvlan_handle_frame+0x321/0x425 [macvlan]
     ? macvlan_forward_source+0x110/0x110 [macvlan]
     __netif_receive_skb_core+0x545/0xda0
     ? enqueue_task_fair+0xe5/0x8e0
     ? __netif_receive_skb_one_core+0x36/0x70
     __netif_receive_skb_one_core+0x36/0x70
     process_backlog+0x97/0x140
     net_rx_action+0x1eb/0x350
     ? __hrtimer_run_queues+0x136/0x2e0
     __do_softirq+0xe3/0x383
     do_softirq_own_stack+0x2a/0x40
     </IRQ>
     do_softirq.part.4+0x4e/0x50
     netif_rx_ni+0x60/0xd0
     dev_loopback_xmit+0x83/0xf0
     ip6_finish_output2+0x575/0x590 [ipv6]
     ? ip6_cork_release.isra.1+0x64/0x90 [ipv6]
     ? __ip6_make_skb+0x38d/0x680 [ipv6]
     ? ip6_output+0x6c/0x140 [ipv6]
     ip6_output+0x6c/0x140 [ipv6]
     ip6_send_skb+0x1e/0x60 [ipv6]
     rawv6_sendmsg+0xc4b/0xe10 [ipv6]
     ? proc_put_long+0xd0/0xd0
     ? rw_copy_check_uvector+0x4e/0x110
     ? sock_sendmsg+0x36/0x40
     sock_sendmsg+0x36/0x40
     ___sys_sendmsg+0x2b6/0x2d0
     ? proc_dointvec+0x23/0x30
     ? addrconf_sysctl_forward+0x8d/0x250 [ipv6]
     ? dev_forward_change+0x130/0x130 [ipv6]
     ? _raw_spin_unlock+0x12/0x30
     ? proc_sys_call_handler.isra.14+0x9f/0x110
     ? __call_rcu+0x213/0x510
     ? get_max_files+0x10/0x10
     ? trace_hardirqs_on+0x2c/0xe0
     ? __sys_sendmsg+0x63/0xa0
     __sys_sendmsg+0x63/0xa0
     do_syscall_64+0x6c/0x1e0
     entry_SYSCALL_64_after_hwframe+0x49/0xbe
    Signed-off-by: default avatarAlexander Sverdlin <alexander.sverdlin@nokia.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    81f3dc93
macvlan.c 44.5 KB