Module Name: src Committed By: bad Date: Wed Nov 28 11:50:48 UTC 2018
Modified Files: src/sys/dev/pci: if_ena.c Log Message: Adapt ena_rx_checksum() to NetBSD. It wasn't ported to the NetBSD conventions of indicating hardware checkum status. Compile tested only. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/dev/pci/if_ena.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_ena.c diff -u src/sys/dev/pci/if_ena.c:1.5 src/sys/dev/pci/if_ena.c:1.6 --- src/sys/dev/pci/if_ena.c:1.5 Tue Jun 26 06:48:01 2018 +++ src/sys/dev/pci/if_ena.c Wed Nov 28 11:50:48 2018 @@ -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 @@ ena_rx_checksum(struct ena_ring *rx_ring 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; - } - - /* 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; + /* 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 L4 checksum error"); - } else { - mbuf->m_pkthdr.csum_flags = M_CSUM_IPv4; + 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"); + } + } + } + /* 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"); + } } } }