diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2014-09-05 19:20:43 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-09-05 20:47:02 -0400 |
commit | 24cd23d3d2e3966bc48a535cacc92356715b50c0 (patch) | |
tree | 4b1d9447bf985ed81eacee5f87d3d7af497277e8 | |
parent | 56193d1bce2b2759cb4bdcc00cd05544894a0c90 (diff) |
igb: use new eth_get_headlen interface
Update igb to drop the igb_get_headlen function in favor of eth_get_headlen.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Acked-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 109 |
1 files changed, 1 insertions, 108 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 89de7fee5e94..4c023f0e54e4 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
@@ -6769,113 +6769,6 @@ static bool igb_is_non_eop(struct igb_ring *rx_ring, | |||
6769 | } | 6769 | } |
6770 | 6770 | ||
6771 | /** | 6771 | /** |
6772 | * igb_get_headlen - determine size of header for LRO/GRO | ||
6773 | * @data: pointer to the start of the headers | ||
6774 | * @max_len: total length of section to find headers in | ||
6775 | * | ||
6776 | * This function is meant to determine the length of headers that will | ||
6777 | * be recognized by hardware for LRO, and GRO offloads. The main | ||
6778 | * motivation of doing this is to only perform one pull for IPv4 TCP | ||
6779 | * packets so that we can do basic things like calculating the gso_size | ||
6780 | * based on the average data per packet. | ||
6781 | **/ | ||
6782 | static unsigned int igb_get_headlen(unsigned char *data, | ||
6783 | unsigned int max_len) | ||
6784 | { | ||
6785 | union { | ||
6786 | unsigned char *network; | ||
6787 | /* l2 headers */ | ||
6788 | struct ethhdr *eth; | ||
6789 | struct vlan_hdr *vlan; | ||
6790 | /* l3 headers */ | ||
6791 | struct iphdr *ipv4; | ||
6792 | struct ipv6hdr *ipv6; | ||
6793 | } hdr; | ||
6794 | __be16 protocol; | ||
6795 | u8 nexthdr = 0; /* default to not TCP */ | ||
6796 | u8 hlen; | ||
6797 | |||
6798 | /* this should never happen, but better safe than sorry */ | ||
6799 | if (max_len < ETH_HLEN) | ||
6800 | return max_len; | ||
6801 | |||
6802 | /* initialize network frame pointer */ | ||
6803 | hdr.network = data; | ||
6804 | |||
6805 | /* set first protocol and move network header forward */ | ||
6806 | protocol = hdr.eth->h_proto; | ||
6807 | hdr.network += ETH_HLEN; | ||
6808 | |||
6809 | /* handle any vlan tag if present */ | ||
6810 | if (protocol == htons(ETH_P_8021Q)) { | ||
6811 | if ((hdr.network - data) > (max_len - VLAN_HLEN)) | ||
6812 | return max_len; | ||
6813 | |||
6814 | protocol = hdr.vlan->h_vlan_encapsulated_proto; | ||
6815 | hdr.network += VLAN_HLEN; | ||
6816 | } | ||
6817 | |||
6818 | /* handle L3 protocols */ | ||
6819 | if (protocol == htons(ETH_P_IP)) { | ||
6820 | if ((hdr.network - data) > (max_len - sizeof(struct iphdr))) | ||
6821 | return max_len; | ||
6822 | |||
6823 | /* access ihl as a u8 to avoid unaligned access on ia64 */ | ||
6824 | hlen = (hdr.network[0] & 0x0F) << 2; | ||
6825 | |||
6826 | /* verify hlen meets minimum size requirements */ | ||
6827 | if (hlen < sizeof(struct iphdr)) | ||
6828 | return hdr.network - data; | ||
6829 | |||
6830 | /* record next protocol if header is present */ | ||
6831 | if (!(hdr.ipv4->frag_off & htons(IP_OFFSET))) | ||
6832 | nexthdr = hdr.ipv4->protocol; | ||
6833 | } else if (protocol == htons(ETH_P_IPV6)) { | ||
6834 | if ((hdr.network - data) > (max_len - sizeof(struct ipv6hdr))) | ||
6835 | return max_len; | ||
6836 | |||
6837 | /* record next protocol */ | ||
6838 | nexthdr = hdr.ipv6->nexthdr; | ||
6839 | hlen = sizeof(struct ipv6hdr); | ||
6840 | } else { | ||
6841 | return hdr.network - data; | ||
6842 | } | ||
6843 | |||
6844 | /* relocate pointer to start of L4 header */ | ||
6845 | hdr.network += hlen; | ||
6846 | |||
6847 | /* finally sort out TCP */ | ||
6848 | if (nexthdr == IPPROTO_TCP) { | ||
6849 | if ((hdr.network - data) > (max_len - sizeof(struct tcphdr))) | ||
6850 | return max_len; | ||
6851 | |||
6852 | /* access doff as a u8 to avoid unaligned access on ia64 */ | ||
6853 | hlen = (hdr.network[12] & 0xF0) >> 2; | ||
6854 | |||
6855 | /* verify hlen meets minimum size requirements */ | ||
6856 | if (hlen < sizeof(struct tcphdr)) | ||
6857 | return hdr.network - data; | ||
6858 | |||
6859 | hdr.network += hlen; | ||
6860 | } else if (nexthdr == IPPROTO_UDP) { | ||
6861 | if ((hdr.network - data) > (max_len - sizeof(struct udphdr))) | ||
6862 | return max_len; | ||
6863 | |||
6864 | hdr.network += sizeof(struct udphdr); | ||
6865 | } | ||
6866 | |||
6867 | /* If everything has gone correctly hdr.network should be the | ||
6868 | * data section of the packet and will be the end of the header. | ||
6869 | * If not then it probably represents the end of the last recognized | ||
6870 | * header. | ||
6871 | */ | ||
6872 | if ((hdr.network - data) < max_len) | ||
6873 | return hdr.network - data; | ||
6874 | else | ||
6875 | return max_len; | ||
6876 | } | ||
6877 | |||
6878 | /** | ||
6879 | * igb_pull_tail - igb specific version of skb_pull_tail | 6772 | * igb_pull_tail - igb specific version of skb_pull_tail |
6880 | * @rx_ring: rx descriptor ring packet is being transacted on | 6773 | * @rx_ring: rx descriptor ring packet is being transacted on |
6881 | * @rx_desc: pointer to the EOP Rx descriptor | 6774 | * @rx_desc: pointer to the EOP Rx descriptor |
@@ -6919,7 +6812,7 @@ static void igb_pull_tail(struct igb_ring *rx_ring, | |||
6919 | /* we need the header to contain the greater of either ETH_HLEN or | 6812 | /* we need the header to contain the greater of either ETH_HLEN or |
6920 | * 60 bytes if the skb->len is less than 60 for skb_pad. | 6813 | * 60 bytes if the skb->len is less than 60 for skb_pad. |
6921 | */ | 6814 | */ |
6922 | pull_len = igb_get_headlen(va, IGB_RX_HDR_LEN); | 6815 | pull_len = eth_get_headlen(va, IGB_RX_HDR_LEN); |
6923 | 6816 | ||
6924 | /* align pull length to size of long to optimize memcpy performance */ | 6817 | /* align pull length to size of long to optimize memcpy performance */ |
6925 | skb_copy_to_linear_data(skb, va, ALIGN(pull_len, sizeof(long))); | 6818 | skb_copy_to_linear_data(skb, va, ALIGN(pull_len, sizeof(long))); |