From 9504fccf29f84550ec9df33c1c8cc9d566bb5076 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Fri, 26 Jan 2024 16:00:13 -0500 Subject: [PATCH] freebsd_network: ether_input needs to support multiple packets. It does on FreeBSD, though not many drivers make use of this functionality (on Haiku, only iflib appeared to, and it has a workaround at the moment.) --- src/libs/compat/freebsd_network/if.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/libs/compat/freebsd_network/if.c b/src/libs/compat/freebsd_network/if.c index a662b275d0..a48d179a36 100644 --- a/src/libs/compat/freebsd_network/if.c +++ b/src/libs/compat/freebsd_network/if.c @@ -793,10 +793,24 @@ ether_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, } -static void ether_input(struct ifnet *ifp, struct mbuf *m) +static void +ether_input(struct ifnet *ifp, struct mbuf *m) { - IF_ENQUEUE(&ifp->receive_queue, m); - release_sem_etc(ifp->receive_sem, 1, B_DO_NOT_RESCHEDULE); + int32 count = 0; + + IF_LOCK(&ifp->receive_queue); + while (m != NULL) { + struct mbuf *mn = m->m_nextpkt; + m->m_nextpkt = NULL; + + _IF_ENQUEUE(&ifp->receive_queue, m); + count++; + + m = mn; + } + IF_UNLOCK(&ifp->receive_queue); + + release_sem_etc(ifp->receive_sem, count, B_DO_NOT_RESCHEDULE); }