aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2019-04-22 07:27:24 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2019-04-22 07:27:24 +0000
commit40eb389666a27530ba4b3c961616a822f9907282 (patch)
treee5b670ccb20b016ac7f8d2a515cd470b940b3f67 /sys/netinet
parent83efd2885e904627f979ae37dc61e85680881e40 (diff)
Notes
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/ip_reass.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/sys/netinet/ip_reass.c b/sys/netinet/ip_reass.c
index bb97b8b07d7d5..65825dedfd71e 100644
--- a/sys/netinet/ip_reass.c
+++ b/sys/netinet/ip_reass.c
@@ -46,7 +46,10 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/sysctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/if_var.h>
#include <net/rss_config.h>
#include <net/netisr.h>
#include <net/vnet.h>
@@ -606,6 +609,37 @@ ipreass_drain(void)
}
}
+/*
+ * Drain off all datagram fragments belonging to
+ * the given network interface.
+ */
+static void
+ipreass_cleanup(void *arg __unused, struct ifnet *ifp)
+{
+ struct ipq *fp, *temp;
+ struct mbuf *m;
+ int i;
+
+ KASSERT(ifp != NULL, ("%s: ifp is NULL", __func__));
+
+ CURVNET_SET_QUIET(ifp->if_vnet);
+ for (i = 0; i < IPREASS_NHASH; i++) {
+ IPQ_LOCK(i);
+ /* Scan fragment list. */
+ TAILQ_FOREACH_SAFE(fp, &V_ipq[i].head, ipq_list, temp) {
+ for (m = fp->ipq_frags; m != NULL; m = m->m_nextpkt) {
+ if (m->m_pkthdr.rcvif == ifp) {
+ ipq_drop(&V_ipq[i], fp);
+ break;
+ }
+ }
+ }
+ IPQ_UNLOCK(i);
+ }
+ CURVNET_RESTORE();
+}
+EVENTHANDLER_DEFINE(ifnet_departure_event, ipreass_cleanup, NULL, 0);
+
#ifdef VIMAGE
/*
* Destroy IP reassembly structures.