diff options
| author | Hans Petter Selasky <hselasky@FreeBSD.org> | 2019-04-22 07:27:24 +0000 |
|---|---|---|
| committer | Hans Petter Selasky <hselasky@FreeBSD.org> | 2019-04-22 07:27:24 +0000 |
| commit | 40eb389666a27530ba4b3c961616a822f9907282 (patch) | |
| tree | e5b670ccb20b016ac7f8d2a515cd470b940b3f67 /sys/netinet | |
| parent | 83efd2885e904627f979ae37dc61e85680881e40 (diff) | |
Notes
Diffstat (limited to 'sys/netinet')
| -rw-r--r-- | sys/netinet/ip_reass.c | 34 |
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. |
