aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNavdeep Parhar <np@FreeBSD.org>2021-04-28 20:45:58 +0000
committerNavdeep Parhar <np@FreeBSD.org>2021-04-28 21:04:53 +0000
commitb9820bca183aba6c0c03a8b717bedd24da7428da (patch)
treeede124af0825e24f6b13ad9bb6dbd4ccefc14b95
parent41ce0e34ea42a4f7113d1ba15d25b9b64d5921b8 (diff)
downloadsrc-b9820bca183aba6c0c03a8b717bedd24da7428da.tar.gz
src-b9820bca183aba6c0c03a8b717bedd24da7428da.zip
cxgbe(4): Do not panic when tx is called with invalid checksum requests.
There is no need to panic in if_transmit if the checksums requested are inconsistent with the frame being transmitted. This typically indicates that the kernel and driver were built with different INET/INET6 options, or there is some other kernel bug. The driver should just throw away the requests that it doesn't understand and move on. MFC after: 1 week Sponsored by: Chelsio Communications
-rw-r--r--sys/dev/cxgbe/t4_sge.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/sys/dev/cxgbe/t4_sge.c b/sys/dev/cxgbe/t4_sge.c
index 93e19f43d2bc..2f6c7e2e7914 100644
--- a/sys/dev/cxgbe/t4_sge.c
+++ b/sys/dev/cxgbe/t4_sge.c
@@ -2652,6 +2652,9 @@ max_nsegs_allowed(struct mbuf *m, bool vm_wr)
return (TX_SGL_SEGS);
}
+static struct timeval txerr_ratecheck = {0};
+static const struct timeval txerr_interval = {3, 0};
+
/*
* Analyze the mbuf to determine its tx needs. The mbuf passed in may change:
* a) caller can assume it's been freed if this function returns with an error.
@@ -2803,9 +2806,14 @@ restart:
}
#endif
default:
- panic("%s: ethertype 0x%04x unknown. if_cxgbe must be compiled"
- " with the same INET/INET6 options as the kernel.",
- __func__, eh_type);
+ if (ratecheck(&txerr_ratecheck, &txerr_interval)) {
+ log(LOG_ERR, "%s: ethertype 0x%04x unknown. "
+ "if_cxgbe must be compiled with the same "
+ "INET/INET6 options as the kernel.\n", __func__,
+ eh_type);
+ }
+ rc = EINVAL;
+ goto fail;
}
if (needs_vxlan_csum(m0)) {
@@ -2841,10 +2849,15 @@ restart:
}
#endif
default:
- panic("%s: VXLAN hw offload requested with unknown "
- "ethertype 0x%04x. if_cxgbe must be compiled"
- " with the same INET/INET6 options as the kernel.",
- __func__, eh_type);
+ if (ratecheck(&txerr_ratecheck, &txerr_interval)) {
+ log(LOG_ERR, "%s: VXLAN hw offload requested"
+ "with unknown ethertype 0x%04x. if_cxgbe "
+ "must be compiled with the same INET/INET6 "
+ "options as the kernel.\n", __func__,
+ eh_type);
+ }
+ rc = EINVAL;
+ goto fail;
}
#if defined(INET) || defined(INET6)
if (needs_inner_tcp_csum(m0)) {