git: 841433148101 - main - debugnet: Handle batches of packets from if_input
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 16 Jun 2022 14:36:24 UTC
The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=841433148101aafcec8c24ae02efb042c7dfb34b commit 841433148101aafcec8c24ae02efb042c7dfb34b Author: Mark Johnston <markj@FreeBSD.org> AuthorDate: 2022-06-16 14:02:00 +0000 Commit: Mark Johnston <markj@FreeBSD.org> CommitDate: 2022-06-16 14:02:00 +0000 debugnet: Handle batches of packets from if_input Some drivers will collect multiple mbuf chains, linked by m_nextpkt, before passing them to upper layers. debugnet_pkt_in() didn't handle this and would process only the first packet, typically leading to retransmits. MFC after: 2 weeks Sponsored by: The FreeBSD Foundation --- sys/net/debugnet.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/sys/net/debugnet.c b/sys/net/debugnet.c index fa8d64ab86c8..a197017c1767 100644 --- a/sys/net/debugnet.c +++ b/sys/net/debugnet.c @@ -523,7 +523,7 @@ debugnet_handle_udp(struct debugnet_pcb *pcb, struct mbuf **mb) * m an mbuf containing the packet received */ static void -debugnet_pkt_in(struct ifnet *ifp, struct mbuf *m) +debugnet_input_one(struct ifnet *ifp, struct mbuf *m) { struct ifreq ifr; struct ether_header *eh; @@ -582,6 +582,19 @@ done: m_freem(m); } +static void +debugnet_input(struct ifnet *ifp, struct mbuf *m) +{ + struct mbuf *n; + + do { + n = m->m_nextpkt; + m->m_nextpkt = NULL; + debugnet_input_one(ifp, m); + m = n; + } while (m != NULL); +} + /* * Network polling primitive. * @@ -736,13 +749,13 @@ debugnet_connect(const struct debugnet_conn_params *dcp, /* * We maintain the invariant that g_debugnet_pcb_inuse is always true * while the debugnet ifp's if_input is overridden with - * debugnet_pkt_in. + * debugnet_input(). */ g_debugnet_pcb_inuse = true; /* Make the card use *our* receive callback. */ pcb->dp_drv_input = ifp->if_input; - ifp->if_input = debugnet_pkt_in; + ifp->if_input = debugnet_input; printf("%s: searching for %s MAC...\n", __func__, (dcp->dc_gateway == INADDR_ANY) ? "server" : "gateway");