git: 7cbf1de38e06 - main - debugnet: Fix false-positive assertions for dp_state
Bryan Drewery
bdrewery at FreeBSD.org
Wed Jul 28 23:34:17 UTC 2021
The branch main has been updated by bdrewery:
URL: https://cgit.FreeBSD.org/src/commit/?id=7cbf1de38e06663c76f4f075db31ea25f429f1b3
commit 7cbf1de38e06663c76f4f075db31ea25f429f1b3
Author: Bryan Drewery <bdrewery at FreeBSD.org>
AuthorDate: 2021-07-27 20:12:37 +0000
Commit: Bryan Drewery <bdrewery at FreeBSD.org>
CommitDate: 2021-07-28 23:34:14 +0000
debugnet: Fix false-positive assertions for dp_state
debugnet_handle_arp:
An assertion is present to ensure the pcb is only modified when the state is
DN_STATE_INIT. Because debugnet_arp_gw() is asynchronous it is possible for
ARP replies to come in after the gateway address is known and the state
already changed.
debugnet_handle_ip:
Similarly it is possible for packets to come in, from the expected
server, during the gateway mac discovery phase. This can happen from
testing disconnects / reconnects in quick succession. This later
causes some acks to be sent back but hit an assertion because the
state is wrong.
Reviewed by: cem, debugnet_handle_arp: markj, vangyzen
Sponsored by: Dell EMC
Differential Revision: https://reviews.freebsd.org/D31327
---
sys/net/debugnet_inet.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/sys/net/debugnet_inet.c b/sys/net/debugnet_inet.c
index 837f838fa6d9..e7449113ba10 100644
--- a/sys/net/debugnet_inet.c
+++ b/sys/net/debugnet_inet.c
@@ -86,6 +86,9 @@ debugnet_handle_ip(struct debugnet_pcb *pcb, struct mbuf **mb)
struct mbuf *m;
unsigned short hlen;
+ if (pcb->dp_state < DN_STATE_HAVE_GW_MAC)
+ return;
+
/* IP processing. */
m = *mb;
if (m->m_pkthdr.len < sizeof(struct ip)) {
@@ -347,13 +350,19 @@ debugnet_handle_arp(struct debugnet_pcb *pcb, struct mbuf **mb)
" server or gateway)\n", buf);
return;
}
+ if (pcb->dp_state >= DN_STATE_HAVE_GW_MAC) {
+ inet_ntoa_r(isaddr, buf);
+ DNETDEBUG("ignoring server ARP reply from %s (already"
+ " have gateway address)\n", buf);
+ return;
+ }
+ MPASS(pcb->dp_state == DN_STATE_INIT);
memcpy(pcb->dp_gw_mac.octet, ar_sha(ah),
min(ah->ar_hln, ETHER_ADDR_LEN));
DNETDEBUG("got server MAC address %6D\n",
pcb->dp_gw_mac.octet, ":");
- MPASS(pcb->dp_state == DN_STATE_INIT);
pcb->dp_state = DN_STATE_HAVE_GW_MAC;
return;
}
More information about the dev-commits-src-all
mailing list