• V
    vlan: Fix untag operations of stacked vlans with REORDER_HEADER off · a6e18ff1
    Vlad Yasevich 提交于
    When we have multiple stacked vlan devices all of which have
    turned off REORDER_HEADER flag, the untag operation does not
    locate the ethernet addresses correctly for nested vlans.
    The reason is that in case of REORDER_HEADER flag being off,
    the outer vlan headers are put back and the mac_len is adjusted
    to account for the presense of the header.  Then, the subsequent
    untag operation, for the next level vlan, always use VLAN_ETH_HLEN
    to locate the begining of the ethernet header and that ends up
    being a multiple of 4 bytes short of the actuall beginning
    of the mac header (the multiple depending on the how many vlan
    encapsulations ethere are).
    
    As a reslult, if there are multiple levles of vlan devices
    with REODER_HEADER being off, the recevied packets end up
    being dropped.
    
    To solve this, we use skb->mac_len as the offset.  The value
    is always set on receive path and starts out as a ETH_HLEN.
    The value is also updated when the vlan header manupations occur
    so we know it will be correct.
    Signed-off-by: NVladislav Yasevich <vyasevic@redhat.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    a6e18ff1
skbuff.c 111.1 KB