26 May, 2011

1 commit


13 May, 2011

1 commit

  • Fix VLAN features propagation for devices which change vlan_features.
    For this to work, driver needs to make sure netdev_features_changed()
    gets called after the change (it is e.g. after ndo_set_features()).

    Side effect is that a user might request features that will never
    be enabled on a VLAN device.

    Signed-off-by: Michał Mirosław
    Signed-off-by: David S. Miller

    Michał Mirosław
     

12 May, 2011

1 commit


11 May, 2011

1 commit

  • ip link add link eth2 eth2.103 type vlan id 103 gvrp on loose_binding on
    ip link set eth2.103 up
    rmmod tg3 # driver providing eth2

    BUG: unable to handle kernel NULL pointer dereference at (null)
    IP: [] garp_request_leave+0x3e/0xc0 [garp]
    PGD 11d251067 PUD 11b9e0067 PMD 0
    Oops: 0000 [#1] SMP
    last sysfs file: /sys/devices/virtual/net/eth2.104/ifindex
    CPU 0
    Modules linked in: tg3(-) 8021q garp nfsd lockd auth_rpcgss sunrpc libphy sg [last unloaded: x_tables]

    Pid: 11494, comm: rmmod Tainted: G W 2.6.39-rc6-00261-gfd71257-dirty #580 HP ProLiant BL460c G6
    RIP: 0010:[] [] garp_request_leave+0x3e/0xc0 [garp]
    RSP: 0018:ffff88007a19bae8 EFLAGS: 00010286
    RAX: 0000000000000000 RBX: ffff88011b5e2000 RCX: 0000000000000002
    RDX: 0000000000000000 RSI: 0000000000000175 RDI: ffffffffa0030d5b
    RBP: ffff88007a19bb18 R08: 0000000000000001 R09: ffff88011bd64a00
    R10: ffff88011d34ec00 R11: 0000000000000000 R12: 0000000000000002
    R13: ffff88007a19bc48 R14: ffff88007a19bb88 R15: 0000000000000001
    FS: 0000000000000000(0000) GS:ffff88011fc00000(0063) knlGS:00000000f77d76c0
    CS: 0010 DS: 002b ES: 002b CR0: 000000008005003b
    CR2: 0000000000000000 CR3: 000000011a675000 CR4: 00000000000006f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process rmmod (pid: 11494, threadinfo ffff88007a19a000, task ffff8800798595c0)
    Stack:
    ffff88007a19bb36 ffff88011c84b800 ffff88011b5e2000 ffff88007a19bc48
    ffff88007a19bb88 0000000000000006 ffff88007a19bb38 ffffffffa003a5f6
    ffff88007a19bb38 670088007a19bba8 ffff88007a19bb58 ffffffffa00397e7
    Call Trace:
    [] vlan_gvrp_request_leave+0x46/0x50 [8021q]
    [] vlan_dev_stop+0xb7/0xc0 [8021q]
    [] __dev_close_many+0x87/0xe0
    [] dev_close_many+0x87/0x110
    [] rollback_registered_many+0xa0/0x240
    [] unregister_netdevice_many+0x19/0x60
    [] vlan_device_event+0x53b/0x550 [8021q]
    [] ? ip6mr_device_event+0xa8/0xd0
    [] notifier_call_chain+0x53/0x80
    [] __raw_notifier_call_chain+0x9/0x10
    [] raw_notifier_call_chain+0x11/0x20
    [] call_netdevice_notifiers+0x32/0x60
    [] rollback_registered_many+0x10f/0x240
    [] rollback_registered+0x2f/0x40
    [] unregister_netdevice_queue+0x58/0x90
    [] unregister_netdev+0x1b/0x30
    [] tg3_remove_one+0x6f/0x10b [tg3]

    We should call vlan_gvrp_request_leave() from unregister_vlan_dev(),
    not from vlan_dev_stop(), because vlan_gvrp_uninit_applicant()
    is called right after unregister_netdevice_queue(). In batch mode,
    unregister_netdevice_queue() doesn’t immediately call vlan_dev_stop().

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

10 May, 2011

1 commit

  • At VLAN dismantle phase, unregister_vlan_dev() makes one
    synchronize_net() call after vlan_group_set_device(grp, vlan_id, NULL).

    This call can be safely removed because we are calling
    unregister_netdevice_queue() to queue device for deletion, and this
    process needs at least one rcu grace period to complete.

    Signed-off-by: Eric Dumazet
    Cc: Ben Greear
    Cc: Patrick McHardy
    Cc: Paul E. McKenney
    Cc: Jesse Gross
    Cc: Michał Mirosław
    Acked-by: Jesse Gross
    Signed-off-by: David S. Miller

    Eric Dumazet
     

18 Apr, 2011

2 commits


13 Apr, 2011

1 commit

  • Now there are 2 paths for rx vlan frames. When rx-vlan-hw-accel is
    enabled, skb is untagged by NIC, vlan_tci is set and the skb gets into
    vlan code in __netif_receive_skb - vlan_hwaccel_do_receive.

    For non-rx-vlan-hw-accel however, tagged skb goes thru whole
    __netif_receive_skb, it's untagged in ptype_base hander and reinjected

    This incosistency is fixed by this patch. Vlan untagging happens early in
    __netif_receive_skb so the rest of code (ptype_all handlers, rx_handlers)
    see the skb like it was untagged by hw.

    Signed-off-by: Jiri Pirko

    v1->v2:
    remove "inline" from vlan_core.c functions
    Signed-off-by: David S. Miller

    Jiri Pirko
     

12 Apr, 2011

1 commit


03 Apr, 2011

1 commit

  • Note: get_flags was actually broken, because it should return the
    flags capped with vlan_features. This is now done implicitly by
    limiting netdev->hw_features.

    RX checksumming offload control is (and was) broken, as there was no way
    before to say whether it's done for tagged packets.

    Signed-off-by: Michał Mirosław
    Signed-off-by: David S. Miller

    Michał Mirosław
     

31 Mar, 2011

1 commit


19 Mar, 2011

1 commit

  • Commit c95b819ad7 (gre: Use needed_headroom)
    made gre use needed_headroom instead of hard_header_len

    This uncover a bug in vlan code.

    We should make sure vlan devices take into account their
    real_dev->needed_headroom or we risk a crash in ipgre_header(), because
    we dont have enough room to push IP header in skb.

    Reported-by: Diddi Oscarsson
    Signed-off-by: Eric Dumazet
    Cc: Patrick McHardy
    Cc: Herbert Xu
    Acked-by: Herbert Xu
    Signed-off-by: David S. Miller

    Eric Dumazet
     

08 Mar, 2011

1 commit


25 Jan, 2011

1 commit

  • Quoting Ben Hutchings: we presumably won't be defining features that
    can only be enabled on 64-bit architectures.

    Occurences found by `grep -r` on net/, drivers/net, include/

    [ Move features and vlan_features next to each other in
    struct netdev, as per Eric Dumazet's suggestion -DaveM ]

    Signed-off-by: Michał Mirosław
    Signed-off-by: David S. Miller

    Michał Mirosław
     

29 Nov, 2010

1 commit

  • Now that the vlan device is lockless and single queue do not
    transfer the real num queues. This is causing a BUG_ON to occur.

    kernel BUG at net/8021q/vlan.c:345!
    Call Trace:
    [] ? fib_rules_event+0x28/0x1b0
    [] notifier_call_chain+0x55/0x80
    [] raw_notifier_call_chain+0x16/0x20
    [] call_netdevice_notifiers+0x37/0x70
    [] netdev_features_change+0x16/0x20
    [] ixgbe_fcoe_enable+0xae/0x100 [ixgbe]
    [] vlan_dev_fcoe_enable+0x2a/0x30 [8021q]
    [] fcoe_create+0x163/0x630 [fcoe]
    [] ? mmap_region+0x255/0x5a0
    [] param_attr_store+0x50/0x80
    [] module_attr_store+0x26/0x30
    [] sysfs_write_file+0xf2/0x180
    [] vfs_write+0xc8/0x190
    [] sys_write+0x51/0x90
    [] system_call_fastpath+0x16/0x1b

    Signed-off-by: John Fastabend
    Signed-off-by: David S. Miller

    John Fastabend
     

17 Nov, 2010

2 commits

  • Now vlan are lockless, we dont need special ndo_select_queue() logic.
    dev_pick_tx() will do the multiqueue stuff on the real device transmit.

    Suggested-by: Jesse Gross
    Signed-off-by: Eric Dumazet
    Acked-by: Patrick McHardy
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • vlan is a stacked device, like tunnels. We should use the lockless
    mechanism we are using in tunnels and loopback.

    This patch completely removes locking in TX path.

    tx stat counters are added into existing percpu stat structure, renamed
    from vlan_rx_stats to vlan_pcpu_stats.

    Note : this partially reverts commit 2e59af3dcbdf (vlan: multiqueue vlan
    device)

    Signed-off-by: Eric Dumazet
    Cc: Patrick McHardy
    Signed-off-by: David S. Miller

    Eric Dumazet
     

16 Nov, 2010

4 commits

  • net/8021q/vlanproc.c: In function 'vlandev_seq_show':
    net/8021q/vlanproc.c:283:20: warning: unused variable 'fmt'

    Signed-off-by: David S. Miller

    David S. Miller
     
  • Now that VLAN packets are tagged in dev_hard_start_xmit()
    at the bottom of the stack we no longer need to tag them
    in the 8021Q module (Except in the !VLAN_FLAG_REORDER_HDR
    case).

    This allows the accel path and non accel paths to be consolidated.
    Here the vlan_tci in the skb is always set and we allow the
    stack to add the actual tag in dev_hard_start_xmit().

    Signed-off-by: John Fastabend
    Acked-by: Jesse Gross
    Signed-off-by: David S. Miller

    John Fastabend
     
  • It is possible for the headroom to be smaller then the
    hard_header_len for a short period of time after toggling
    the vlan offload setting.

    This is not a hard error and skb_cow_head is called in
    __vlan_put_tag() to resolve this.

    Signed-off-by: John Fastabend
    Acked-by: Jesse Gross
    Signed-off-by: David S. Miller

    John Fastabend
     
  • Toggling the vlan tx|rx hw offloads needs to set the hard_header_len
    as well otherwise we end up using LL_RESERVED_SPACE incorrectly.
    This results in pskb_expand_head() being used unnecessarily.

    Signed-off-by: John Fastabend
    Acked-by: Jesse Gross
    Signed-off-by: David S. Miller

    John Fastabend
     

26 Oct, 2010

1 commit


21 Oct, 2010

3 commits

  • Currently each driver that is capable of vlan hardware acceleration
    must be aware of the vlan groups that are configured and then pass
    the stripped tag to a specialized receive function. This is

    different from other types of hardware offload in that it places a
    significant amount of knowledge in the driver itself rather keeping
    it in the networking core.

    This makes vlan offloading function more similarly to other forms
    of offloading (such as checksum offloading or TSO) by doing the
    following:
    * On receive, stripped vlans are passed directly to the network
    core, without attempting to check for vlan groups or reconstructing
    the header if no group
    * vlans are made less special by folding the logic into the main
    receive routines
    * On transmit, the device layer will add the vlan header in software
    if the hardware doesn't support it, instead of spreading that logic
    out in upper layers, such as bonding.

    There are a number of advantages to this:
    * Fixes all bugs with drivers incorrectly dropping vlan headers at once.
    * Avoids having to disable VLAN acceleration when in promiscuous mode
    (good for bridging since it always puts devices in promiscuous mode).
    * Keeps VLAN tag separate until given to ultimate consumer, which
    avoids needing to do header reconstruction as in tg3 unless absolutely
    necessary.
    * Consolidates common code in core networking.

    Signed-off-by: Jesse Gross
    Signed-off-by: David S. Miller

    Jesse Gross
     
  • A struct net_device always maps to zero or one vlan groups and we
    always know the device when we are looking up a group. We currently
    do a hash table lookup on the device to find the group but it is
    much simpler to just store a pointer.

    Signed-off-by: Jesse Gross
    Signed-off-by: David S. Miller

    Jesse Gross
     
  • VLAN_GROUP_ARRAY_LEN is simply the number of possible vlan VIDs.
    Since vlan groups will soon be more of an implementation detail
    for vlan devices, rename the constant to be descriptive of its
    actual purpose.

    Signed-off-by: Jesse Gross
    Signed-off-by: David S. Miller

    Jesse Gross
     

06 Oct, 2010

1 commit

  • In various situations, a device provides a packet to our stack and we
    drop it before it enters protocol stack :
    - softnet backlog full (accounted in /proc/net/softnet_stat)
    - bad vlan tag (not accounted)
    - unknown/unregistered protocol (not accounted)

    We can handle a per-device counter of such dropped frames at core level,
    and automatically adds it to the device provided stats (rx_dropped), so
    that standard tools can be used (ifconfig, ip link, cat /proc/net/dev)

    This is a generalization of commit 8990f468a (net: rx_dropped
    accounting), thus reverting it.

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

05 Oct, 2010

1 commit


01 Oct, 2010

1 commit

  • Roger Luethi noticed packets for unknown VLANs getting silently dropped
    even in promiscuous mode.

    Check for promiscuous mode in __vlan_hwaccel_rx() and vlan_gro_common()
    before drops.

    As suggested by Patrick, mark such packets to have skb->pkt_type set to
    PACKET_OTHERHOST to make sure they are dropped by IP stack.

    Reported-by: Roger Luethi
    Signed-off-by: Eric Dumazet
    CC: Patrick McHardy
    Signed-off-by: David S. Miller

    Eric Dumazet
     

28 Sep, 2010

2 commits


24 Sep, 2010

1 commit


21 Sep, 2010

1 commit

  • Under load, netif_rx() can drop incoming packets but administrators dont
    have a chance to spot which device needs some tuning (RPS activation for
    example)

    This patch adds rx_dropped accounting in vlans and tunnels.

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

18 Sep, 2010

1 commit

  • previously, if a vlan master device was moved from one network namespace
    to another, all 802.1q and macvlan slaves were deleted.

    we can use dev->reg_state to figure out whether dev_change_net_namespace
    is happening, since that won't set dev->reg_state NETREG_UNREGISTERING.
    so, this changes 8021q and macvlan to ignore NETDEV_UNREGISTER when
    reg_state is not NETREG_UNREGISTERING.

    Signed-off-by: David Lamparter
    Reviewed-by: "Eric W. Biederman"
    Acked-by: Daniel Lezcano
    Acked-by: Patrick McHardy
    Signed-off-by: David S. Miller

    David Lamparter
     

01 Sep, 2010

1 commit


27 Aug, 2010

1 commit

  • compare_ether_header() can have a special implementation on 64 bit
    arches if CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is defined.

    __napi_gro_receive() and vlan_gro_common() can avoid a conditional
    branch to perform device match.

    On x86_64, __napi_gro_receive() has now 38 instructions instead of 53

    As gcc-4.4.3 still choose to not inline it, add inline keyword to this
    performance critical function.

    Signed-off-by: Eric Dumazet
    CC: Herbert Xu
    Signed-off-by: David S. Miller

    Eric Dumazet
     

23 Aug, 2010

1 commit


19 Aug, 2010

1 commit

  • When adding a new vlan, if the underlying interface has no carrier,
    then the newly added vlan interface should also have no carrier.
    At present, this is not true - the newly added vlan is added with
    carrier up. Fix by checking state of real device.

    Signed-off-by: Phil Oester
    Signed-off-by: David S. Miller

    Phil Oester
     

19 Jul, 2010

1 commit

  • - Without the 8021q module loaded in the kernel, all 802.1p packets
    (VLAN 0 but QoS tagging) are silently discarded (as expected, as
    the protocol is not loaded).

    - Without this patch in 8021q module, these packets are forwarded to
    the module, but they are discarded also if VLAN 0 is not configured,
    which should not be the default behaviour, as VLAN 0 is not really
    a VLANed packet but a 802.1p packet. Defining VLAN 0 makes it almost
    impossible to communicate with mixed 802.1p and non 802.1p devices on
    the same network due to arp table issues.

    - Changed logic to skip vlan specific code in vlan_skb_recv if VLAN
    is 0 and we have not defined a VLAN with ID 0, but we accept the
    packet with the encapsulated proto and pass it later to netif_rx.

    - In the vlan device event handler, added some logic to add VLAN 0
    to HW filter in devices that support it (this prevented any traffic
    in VLAN 0 to reach the stack in e1000e with HW filter under 2.6.35,
    and probably also with other HW filtered cards, so we fix it here).

    - In the vlan unregister logic, prevent the elimination of VLAN 0
    in devices with HW filter.

    - The default behaviour is to ignore the VLAN 0 tagging and accept
    the packet as if it was not tagged, but we can still define a
    VLAN 0 if desired (so it is backwards compatible).

    Signed-off-by: Pedro Garcia
    Signed-off-by: David S. Miller

    Pedro Garcia
     

10 Jul, 2010

1 commit

  • In commit be1f3c2c027cc5ad735df6a45a542ed1db7ec48b "net: Enable 64-bit
    net device statistics on 32-bit architectures" I redefined struct
    net_device_stats so that it could be used in a union with struct
    rtnl_link_stats64, avoiding the need for explicit copying or
    conversion between the two. However, this is unsafe because there is
    no locking required and no lock consistently held around calls to
    dev_get_stats() and use of the statistics structure it returns.

    In commit 28172739f0a276eb8d6ca917b3974c2edb036da3 "net: fix 64 bit
    counters on 32 bit arches" Eric Dumazet dealt with that problem by
    requiring callers of dev_get_stats() to provide storage for the
    result. This means that the net_device::stats64 field and the padding
    in struct net_device_stats are now redundant, so remove them.

    Update the comment on net_device_ops::ndo_get_stats64 to reflect its
    new usage.

    Change dev_txq_stats_fold() to use struct rtnl_link_stats64, since
    that is what all its callers are really using and it is no longer
    going to be compatible with struct net_device_stats.

    Eric Dumazet suggested the separate function for the structure
    conversion.

    Signed-off-by: Ben Hutchings
    Acked-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Ben Hutchings
     

09 Jul, 2010

1 commit

  • When we need to shape traffic using low speeds, we need to
    disable tso on network interface :

    ethtool -K eth0.2240 tso off

    It seems vlan interfaces miss the set_tso() ethtool method.

    Before enabling TSO, we must check real device supports
    TSO for VLAN-tagged packets and enables TSO.

    Note that a TSO change on real device propagates TSO setting
    on all vlans, even if admin selected a different TSO setting.

    Signed-off-by: Eric Dumazet
    Signed-off-by: Ben Hutchings
    Signed-off-by: David S. Miller

    Eric Dumazet