aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/neta/if_mvneta.c
diff options
context:
space:
mode:
authorMarcin Wojtas <mw@FreeBSD.org>2020-08-01 09:40:19 +0000
committerMarcin Wojtas <mw@FreeBSD.org>2020-08-01 09:40:19 +0000
commitacdc9154615de09e89a6469fbb8af281c334e044 (patch)
tree3f6339335c3c885e89a10a999a57ebec17d908a0 /sys/dev/neta/if_mvneta.c
parent208fb7e5cf3154ed506a7ed8d4d4b1b6e100ce26 (diff)
Fix TX csum handling in if_mvneta
The mvneta device requires MVNETA_TX_CMD_L4_CHECKSUM_NONE bit to be set in the tx descriptor is checksum not required. However, mvneta_tx_set_csumflag() is not setting this flag currently, causing the hardware to randomly corrupt IP header during transmission. This affects injected IPv4 packets that skips kernel IP stack processing (e.g. DHCP), as well as all IPv6 packets, since the driver currently does not offload csum for IPv6. The fix is to remove all the early return paths from mvneta_tx_set_csumflag() which do not set the MVNETA_TX_CMD_L4_CHECKSUM_NONE flag. PR: 248306 Submitted by: Mike Cui <cuicui@gmail.com> Reported by: Mike Cui <cuicui@gmail.com>
Notes
Notes: svn path=/head/; revision=363759
Diffstat (limited to 'sys/dev/neta/if_mvneta.c')
-rw-r--r--sys/dev/neta/if_mvneta.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/sys/dev/neta/if_mvneta.c b/sys/dev/neta/if_mvneta.c
index fbf7ade862c4..c5cdf8bcb9ee 100644
--- a/sys/dev/neta/if_mvneta.c
+++ b/sys/dev/neta/if_mvneta.c
@@ -2828,18 +2828,15 @@ mvneta_tx_set_csumflag(struct ifnet *ifp,
csum_flags = ifp->if_hwassist & m->m_pkthdr.csum_flags;
eh = mtod(m, struct ether_header *);
- if (csum_flags == 0)
- return;
-
switch (ntohs(eh->ether_type)) {
case ETHERTYPE_IP:
ipoff = ETHER_HDR_LEN;
break;
- case ETHERTYPE_IPV6:
- return;
case ETHERTYPE_VLAN:
ipoff = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
break;
+ default:
+ csum_flags = 0;
}
if (__predict_true(csum_flags & (CSUM_IP|CSUM_IP_TCP|CSUM_IP_UDP))) {