From 94feb7e181a89d822c7ed265cf6004a65ba42595 Mon Sep 17 00:00:00 2001 From: "Luis R. Rodriguez" Date: Tue, 4 Dec 2012 16:32:46 -0800 Subject: [PATCH] compat: backport napi_gro_receive() 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 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 Signed-off-by: David S. Miller Signed-off-by: Luis R. Rodriguez --- include/linux/compat-2.6.29.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/compat-2.6.29.h b/include/linux/compat-2.6.29.h index d95b00e1d62a..9ebc5d5dc0a8 100644 --- a/include/linux/compat-2.6.29.h +++ b/include/linux/compat-2.6.29.h @@ -19,6 +19,8 @@ #include #include +#define napi_gro_receive(napi, skb) netif_receive_skb(skb) + /* backports */ static inline void usb_autopm_put_interface_async(struct usb_interface *intf) { } -- 2.30.2