compat: backport napi_gro_receive()
authorLuis R. Rodriguez <mcgrof@do-not-panic.com>
Wed, 5 Dec 2012 00:32:46 +0000 (16:32 -0800)
committerLuis R. Rodriguez <mcgrof@do-not-panic.com>
Wed, 5 Dec 2012 00:32:46 +0000 (16:32 -0800)
Just call netif_receive_skb() for kernels older than
v2.6.29. If Enterprise Linux distributions decided to
backport GRO support onto a kernel older than 2.6.29,
they'll likely want #ifdef this out accordingly.

mcgrof@frijol ~/linux-next (git::master)$ git describe --contains d565b0a1
v2.6.29-rc1~581^2~181

commit d565b0a1a9b6ee7dff46e1f68b26b526ac11ae50
Author: Herbert Xu <herbert@gondor.apana.org.au>
Date:   Mon Dec 15 23:38:52 2008 -0800

    net: Add Generic Receive Offload infrastructure

    This patch adds the top-level GRO (Generic Receive Offload) infrastructure.
    This is pretty similar to LRO except that this is protocol-independent.
    Instead of holding packets in an lro_mgr structure, they're now held in
    napi_struct.

    For drivers that intend to use this, they can set the NETIF_F_GRO bit and
    call napi_gro_receive instead of netif_receive_skb or just call netif_rx.
    The latter will call napi_receive_skb automatically.  When napi_gro_receive
    is used, the driver must either call napi_complete/napi_rx_complete, or
    call napi_gro_flush in softirq context if the driver uses the primitives
    __napi_complete/__napi_rx_complete.

    Protocols will set the gro_receive and gro_complete function pointers in
    order to participate in this scheme.

    In addition to the packet, gro_receive will get a list of currently held
    packets.  Each packet in the list has a same_flow field which is non-zero
    if it is a potential match for the new packet.  For each packet that may
    match, they also have a flush field which is non-zero if the held packet
    must not be merged with the new packet.

    Once gro_receive has determined that the new skb matches a held packet,
    the held packet may be processed immediately if the new skb cannot be
    merged with it.  In this case gro_receive should return the pointer to
    the existing skb in gro_list.  Otherwise the new skb should be merged into
    the existing packet and NULL should be returned, unless the new skb makes
    it impossible for any further merges to be made (e.g., FIN packet) where
    the merged skb should be returned.

    Whenever the skb is merged into an existing entry, the gro_receive
    function should set NAPI_GRO_CB(skb)->same_flow.  Note that if an skb
    merely matches an existing entry but can't be merged with it, then
    this shouldn't be set.

    If gro_receive finds it pointless to hold the new skb for future merging,
    it should set NAPI_GRO_CB(skb)->flush.

    Held packets will be flushed by napi_gro_flush which is called by
    napi_complete and napi_rx_complete.

    Currently held packets are stored in a singly liked list just like LRO.
    The list is limited to a maximum of 8 entries.  In future, this may be
    expanded to use a hash table to allow more flows to be held for merging.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
include/linux/compat-2.6.29.h

index d95b00e1d62a8298b2a8cc481fe1a5ecfb9f8bf2..9ebc5d5dc0a85416f3f08c16c9f75862719915d6 100644 (file)
@@ -19,6 +19,8 @@
 #include <linux/types.h>
 #include <linux/pci_regs.h>
 
+#define napi_gro_receive(napi, skb) netif_receive_skb(skb)
+
 /* backports  */
 static inline void usb_autopm_put_interface_async(struct usb_interface *intf)
 { }