Index: sys/mbuf.h =================================================================== RCS file: /cvs/src/sys/sys/mbuf.h,v retrieving revision 1.210 diff -u -p -r1.210 mbuf.h --- sys/mbuf.h 4 Apr 2016 12:14:07 -0000 1.210 +++ sys/mbuf.h 6 Apr 2016 10:19:49 -0000 @@ -439,7 +438,8 @@ void m_extref(struct mbuf *, struct mbuf void m_extfree_pool(caddr_t, u_int, void *); void m_adj(struct mbuf *, int); int m_copyback(struct mbuf *, int, int, const void *, int); -void m_freem(struct mbuf *); +struct mbuf *m_freem(struct mbuf *); +void m_purge(struct mbuf *); void m_reclaim(void *, int); void m_copydata(struct mbuf *, int, int, caddr_t); void m_cat(struct mbuf *, struct mbuf *); Index: kern/uipc_mbuf.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_mbuf.c,v retrieving revision 1.222 diff -u -p -r1.222 uipc_mbuf.c --- kern/uipc_mbuf.c 6 Apr 2016 01:36:06 -0000 1.222 +++ kern/uipc_mbuf.c 6 Apr 2016 10:19:49 -0000 @@ -425,11 +425,28 @@ m_extfree(struct mbuf *m) m->m_flags &= ~(M_EXT|M_EXTWR); } -void +struct mbuf * m_freem(struct mbuf *m) { - while (m != NULL) + struct mbuf *n; + + if (m == NULL) + return (NULL); + + n = m->m_nextpkt; + + do m = m_free(m); + while (m != NULL); + + return (n); +} + +void +m_purge(struct mbuf *m) +{ + while (m != NULL) + m = m_freem(m); } /*