ibmvnic: Include header descriptor support for ARP packets
authorThomas Falcon <tlfalcon@linux.vnet.ibm.com>
Mon, 18 Dec 2017 18:52:40 +0000 (12:52 -0600)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Dec 2017 19:09:33 +0000 (14:09 -0500)
In recent tests with new adapters, it was discovered that ARP
packets were not being properly processed. This patch adds
support for ARP packet headers to be passed to backing adapters,
if necessary.

Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ibm/ibmvnic.c

index df6d91116b65867721836a31540c4f2ae9e1cc3e..6911b7cc06c527429acdf094782a23c35445c647 100644 (file)
@@ -59,6 +59,7 @@
 #include <linux/mm.h>
 #include <linux/ethtool.h>
 #include <linux/proc_fs.h>
+#include <linux/if_arp.h>
 #include <linux/in.h>
 #include <linux/ip.h>
 #include <linux/ipv6.h>
@@ -1153,6 +1154,9 @@ static int build_hdr_data(u8 hdr_field, struct sk_buff *skb,
                        hdr_len[2] = tcp_hdrlen(skb);
                else if (ipv6_hdr(skb)->nexthdr == IPPROTO_UDP)
                        hdr_len[2] = sizeof(struct udphdr);
+       } else if (skb->protocol == htons(ETH_P_ARP)) {
+               hdr_len[1] = arp_hdr_len(skb->dev);
+               hdr_len[2] = 0;
        }
 
        memset(hdr_data, 0, 120);
@@ -1386,7 +1390,8 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
        /* determine if l2/3/4 headers are sent to firmware */
        if ((*hdrs >> 7) & 1 &&
            (skb->protocol == htons(ETH_P_IP) ||
-            skb->protocol == htons(ETH_P_IPV6))) {
+            skb->protocol == htons(ETH_P_IPV6) ||
+            skb->protocol == htons(ETH_P_ARP))) {
                build_hdr_descs_arr(tx_buff, &num_entries, *hdrs);
                tx_crq.v1.n_crq_elem = num_entries;
                tx_buff->indir_arr[0] = tx_crq;