diff options
Diffstat (limited to 'sys/netinet/libalias')
-rw-r--r-- | sys/netinet/libalias/alias.c | 38 | ||||
-rw-r--r-- | sys/netinet/libalias/alias.h | 3 |
2 files changed, 41 insertions, 0 deletions
diff --git a/sys/netinet/libalias/alias.c b/sys/netinet/libalias/alias.c index 0120c19..6747232 100644 --- a/sys/netinet/libalias/alias.c +++ b/sys/netinet/libalias/alias.c @@ -1574,3 +1574,41 @@ LibAliasUnLoadAllModule(void) } #endif + +#ifdef _KERNEL +/* + * m_megapullup() function is a big hack (only used in ng_nat and ipfw+nat). + * + * It allocates an mbuf with cluster and copies the whole + * chain into cluster, so that it is all contigous and the + * whole packet can be accessed via char pointer. + * This is required, because libalias doesn't have idea + * about mbufs. + * + * On success, m_megapullup returns an mbuf with cluster + * containing the input packet, on failure NULL. + * In both cases, the input packet is consumed. + */ +struct mbuf * +m_megapullup(struct mbuf *m, int len) { + struct mbuf *mcl; + caddr_t cp; + + if (len > MCLBYTES) + goto bad; + + if ((mcl = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR)) == NULL) + goto bad; + + cp = mtod(mcl, caddr_t); + m_copydata(m, 0, len, cp); + m_move_pkthdr(mcl, m); + mcl->m_len = mcl->m_pkthdr.len; + m_freem(m); + + return (mcl); +bad: + m_freem(m); + return (NULL); +} +#endif diff --git a/sys/netinet/libalias/alias.h b/sys/netinet/libalias/alias.h index 4a809f4..358109c 100644 --- a/sys/netinet/libalias/alias.h +++ b/sys/netinet/libalias/alias.h @@ -189,6 +189,9 @@ int LibAliasLoadModule(char *); int LibAliasUnLoadAllModule(void); int LibAliasRefreshModules(void); +/* Mbuf helper function. */ +struct mbuf *m_megapullup(struct mbuf *, int); + /* * Mode flags and other constants. */ |