net: Add an option for RX checksum offload
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 8 Nov 2017 20:49:49 +0000 (15:49 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Nov 2017 15:46:56 +0000 (10:46 -0500)
Plan 9 drivers assume that this feature is always on, if available, and it
is unqueryable.

Linux drivers have a flag for this, and by setting that flag to zero, NICs
(e.g. r8169) turn off their feature since they think the user doesn't want
it.

It's likely this will turn on RX checksumming on bnx2x and mlx4.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/net/ether82563.c
kern/drivers/net/etherigbe.c
kern/include/linux_compat.h
kern/include/net/ip.h
kern/src/net/ethermedium.c
kern/src/net/netif.c

index 6fdb805..aee6070 100644 (file)
@@ -2214,6 +2214,9 @@ static int pnp(struct ether *edev, int type)
        edev->max_mtu = ctlr->rbsz - ETHERHDRSIZE;
        edev->mtu = edev->mtu;
        memmove(edev->ea, ctlr->ra, Eaddrlen);
+       /* Jim or whoever have this turned on already.  We might be capable of other
+        * features. */
+       edev->feat = NETF_RXCSUM;
 
        /*
         * Linkage to the generic ethernet driver.
index ad973e1..06b13a6 100644 (file)
@@ -2041,6 +2041,9 @@ igbepnp(struct ether* edev)
        edev->tbdf = pci_to_tbdf(ctlr->pci);
        edev->mbps = 1000;
        memmove(edev->ea, ctlr->ra, Eaddrlen);
+       /* Jim or whoever have this turned on already.  We might be capable of other
+        * features. */
+       edev->feat = NETF_RXCSUM;
 
        /*
         * Linkage to the generic ethernet driver.
index a2fd051..0d58956 100644 (file)
@@ -531,7 +531,7 @@ typedef unsigned int netdev_features_t;
  * it.  For transmits, the stack needs to know in advance if the device can
  * handle the checksum or not. */
 #define NETIF_F_RXHASH                         0
-#define NETIF_F_RXCSUM                         0
+#define NETIF_F_RXCSUM                         NETF_RXCSUM
 #define NETIF_F_LRO                                    NETF_LRO
 #define NETIF_F_GRO                                    0
 #define NETIF_F_LOOPBACK                       0
index 4e376c6..fe2ff8a 100644 (file)
@@ -1005,6 +1005,7 @@ struct netaddr {
 #define NETF_PADMIN_SHIFT      (NETF_BASE_SHIFT + 0)
 #define NETF_SG_SHIFT          (NETF_BASE_SHIFT + 1)
 #define NETF_LRO_SHIFT         (NETF_BASE_SHIFT + 2)
+#define NETF_RXCSUM_SHIFT      (NETF_BASE_SHIFT + 3)
 enum {
        NETF_IPCK = (1 << NS_IPCK_SHIFT),       /* xmit ip checksum */
        NETF_UDPCK = (1 << NS_UDPCK_SHIFT),     /* xmit udp checksum */
@@ -1013,6 +1014,7 @@ enum {
        NETF_SG = (1 << NETF_SG_SHIFT),         /* device can do scatter/gather */
        NETF_TSO = (1 << NS_TSO_SHIFT),         /* device can do TSO */
        NETF_LRO = (1 << NETF_LRO_SHIFT),       /* device can do LRO */
+       NETF_RXCSUM = (1 << NETF_RXCSUM_SHIFT), /* device can do rx checksums */
 };
 
 /* Linux's rtnl_link_stats64 */
index 1771414..def7a9c 100644 (file)
@@ -163,6 +163,10 @@ static unsigned int parsefeat(char *ptr)
                feat |= NETF_SG;
        if (strstr(ptr, "tso"))
                feat |= NETF_TSO;
+       if (strstr(ptr, "lro"))
+               feat |= NETF_LRO;
+       if (strstr(ptr, "rxcsum"))
+               feat |= NETF_RXCSUM;
        return feat;
 }
 
index 6ffb7ad..f809a9d 100644 (file)
@@ -316,6 +316,8 @@ netifread(struct ether *nif, struct chan *c, void *a, long n,
                                j += snprintf(p + j, READSTR - j, "tso ");
                        if (nif->feat & NETF_LRO)
                                j += snprintf(p + j, READSTR - j, "lro ");
+                       if (nif->feat & NETF_RXCSUM)
+                               j += snprintf(p + j, READSTR - j, "rxcsum ");
                        snprintf(p + j, READSTR - j, "\n");
                        n = readstr(offset, a, n, p);
                        kfree(p);