diff options
author | Rajesh Borundia <rajesh.borundia@qlogic.com> | 2011-08-06 16:46:44 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-08-07 22:50:49 -0700 |
commit | 57569d0e12eaf31717e295960cd2a26f626c8e5b (patch) | |
tree | fd55f80ac7d6286541f4c8abe1400c76ca55c057 /drivers/net/netxen/netxen_nic_init.c | |
parent | 2ae40ee9872953b4f329a54c82970dfb6854e17e (diff) |
netxen: add vlan LRO support
o To support vlan lro, driver need to program ip address in device.
o Same ip addresses need to be program after fw recovery, so sotre them
in list.
o In case of vlan packet, include vlan header length while
calculating ip and tcp headers.
Signed-off-by: Rajesh Borundia <rajesh.borundia@qlogic.com>
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netxen/netxen_nic_init.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index e8993a76a08..d6c6357de6a 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c @@ -26,6 +26,7 @@ #include <linux/netdevice.h> #include <linux/delay.h> #include <linux/slab.h> +#include <linux/if_vlan.h> #include "netxen_nic.h" #include "netxen_nic_hw.h" @@ -1619,6 +1620,7 @@ netxen_process_lro(struct netxen_adapter *adapter, int index; u16 lro_length, length, data_offset; u32 seq_number; + u8 vhdr_len; if (unlikely(ring > adapter->max_rds_rings)) return NULL; @@ -1652,8 +1654,10 @@ netxen_process_lro(struct netxen_adapter *adapter, skb_pull(skb, l2_hdr_offset); skb->protocol = eth_type_trans(skb, netdev); - iph = (struct iphdr *)skb->data; - th = (struct tcphdr *)(skb->data + (iph->ihl << 2)); + if (skb->protocol == htons(ETH_P_8021Q)) + vhdr_len = VLAN_HLEN; + iph = (struct iphdr *)(skb->data + vhdr_len); + th = (struct tcphdr *)((skb->data + vhdr_len) + (iph->ihl << 2)); length = (iph->ihl << 2) + (th->doff << 2) + lro_length; iph->tot_len = htons(length); |