Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci Adapt ena_rx_checksum() to NetBSD.



details:   https://anonhg.NetBSD.org/src/rev/73e0e85481cf
branches:  trunk
changeset: 446236:73e0e85481cf
user:      bad <bad%NetBSD.org@localhost>
date:      Wed Nov 28 11:50:48 2018 +0000

description:
Adapt ena_rx_checksum() to NetBSD.
It wasn't ported to the NetBSD conventions of indicating hardware checkum
status.

Compile tested only.

diffstat:

 sys/dev/pci/if_ena.c |  55 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 35 insertions(+), 20 deletions(-)

diffs (73 lines):

diff -r 61865109fc60 -r 73e0e85481cf sys/dev/pci/if_ena.c
--- a/sys/dev/pci/if_ena.c      Wed Nov 28 10:01:28 2018 +0000
+++ b/sys/dev/pci/if_ena.c      Wed Nov 28 11:50:48 2018 +0000
@@ -31,7 +31,7 @@
 #if 0
 __FBSDID("$FreeBSD: head/sys/dev/ena/ena.c 333456 2018-05-10 09:37:54Z mw $");
 #endif
-__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.5 2018/06/26 06:48:01 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.6 2018/11/28 11:50:48 bad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1593,26 +1593,41 @@
     struct mbuf *mbuf)
 {
 
-       /* if IP and error */
-       if (unlikely((ena_rx_ctx->l3_proto == ENA_ETH_IO_L3_PROTO_IPV4) &&
-           ena_rx_ctx->l3_csum_err)) {
-               /* ipv4 checksum error */
-               mbuf->m_pkthdr.csum_flags = 0;
-               counter_u64_add(rx_ring->rx_stats.bad_csum, 1);
-               ena_trace(ENA_DBG, "RX IPv4 header checksum error");
-               return;
+       /* IPv4 */
+       if ((ena_rx_ctx->l3_proto == ENA_ETH_IO_L3_PROTO_IPV4)) {
+               mbuf->m_pkthdr.csum_flags |= M_CSUM_IPv4;
+               if (ena_rx_ctx->l3_csum_err) {
+                       /* ipv4 checksum error */
+                       mbuf->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD;
+                       counter_u64_add(rx_ring->rx_stats.bad_csum, 1);
+                       ena_trace(ENA_DBG, "RX IPv4 header checksum error");
+                       return;
+               }
+
+               /*  TCP/UDP */
+               if ((ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_TCP) ||
+                   (ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_UDP)) {
+                       mbuf->m_pkthdr.csum_flags |= (ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_TCP) ? M_CSUM_TCPv4 : M_CSUM_UDPv4;
+                       if (ena_rx_ctx->l4_csum_err) {
+                               /* TCP/UDP checksum error */
+                               mbuf->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
+                               counter_u64_add(rx_ring->rx_stats.bad_csum, 1);
+                               ena_trace(ENA_DBG, "RX L4 checksum error");
+                       }
+               }
        }
-
-       /* if TCP/UDP */
-       if ((ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_TCP) ||
-           (ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_UDP)) {
-               if (ena_rx_ctx->l4_csum_err) {
-                       /* TCP/UDP checksum error */
-                       mbuf->m_pkthdr.csum_flags = M_CSUM_IPv4_BAD;
-                       counter_u64_add(rx_ring->rx_stats.bad_csum, 1);
-                       ena_trace(ENA_DBG, "RX L4 checksum error");
-               } else {
-                       mbuf->m_pkthdr.csum_flags = M_CSUM_IPv4;
+       /* IPv6 */
+       else if ((ena_rx_ctx->l3_proto == ENA_ETH_IO_L3_PROTO_IPV6)) {
+               /*  TCP/UDP */
+               if ((ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_TCP) ||
+                   (ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_UDP)) {
+                       mbuf->m_pkthdr.csum_flags |= (ena_rx_ctx->l4_proto == ENA_ETH_IO_L4_PROTO_TCP) ? M_CSUM_TCPv6 : M_CSUM_UDPv6;
+                       if (ena_rx_ctx->l4_csum_err) {
+                               /* TCP/UDP checksum error */
+                               mbuf->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD;
+                               counter_u64_add(rx_ring->rx_stats.bad_csum, 1);
+                               ena_trace(ENA_DBG, "RX L4 checksum error");
+                       }
                }
        }
 }



Home | Main Index | Thread Index | Old Index