diff options
-rw-r--r-- | sys/kern/uipc_mbuf.c | 24 | ||||
-rw-r--r-- | sys/sys/mbuf.h | 1 |
2 files changed, 25 insertions, 0 deletions
diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index 6a0e9ba..6932245 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -270,6 +270,30 @@ mb_free_ext(struct mbuf *m) } /* + * Clean up mbuf (chain) from any tags and packet headers. + * If "all" is set then the first mbuf in the chain will be + * cleaned too. + */ +void +m_demote(struct mbuf *m0, int all) +{ + struct mbuf *m; + + for (m = all ? m0 : m0->m_next; m != NULL; m = m->m_next) { + if (m->m_flags & M_PKTHDR) { + m_tag_delete_chain(m, NULL); + m->m_flags &= ~M_PKTHDR; + bzero(&m->m_pkthdr, sizeof(struct pkthdr)); + } + if (m->m_type & MT_HEADER) + m->m_type = MT_DATA; + if (m != m0 && m->m_nextpkt) + m->m_nextpkt = NULL; + m->m_flags = m->m_flags & (M_EXT|M_EOR|M_RDONLY|M_FREELIST); + } +} + +/* * "Move" mbuf pkthdr from "from" to "to". * "from" must have M_PKTHDR set, and "to" must be empty. */ diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h index a07b685..7f2b540 100644 --- a/sys/sys/mbuf.h +++ b/sys/sys/mbuf.h @@ -577,6 +577,7 @@ struct mbuf *m_copypacket(struct mbuf *, int); void m_copy_pkthdr(struct mbuf *, struct mbuf *); struct mbuf *m_copyup(struct mbuf *n, int len, int dstoff); struct mbuf *m_defrag(struct mbuf *, int); +void m_demote(struct mbuf *, int); struct mbuf *m_devget(char *, int, int, struct ifnet *, void (*)(char *, caddr_t, u_int)); struct mbuf *m_dup(struct mbuf *, int); |