m_pad was introduced with an "ipsec package" import in openbsd in 1997. m_inject was introduced in 1999 but this code wasn't changed.
m_pad is equivalent to m_inject with an offset equal to the actual data length. Doesn't break anything here, but additional tests won't harm. OK? Index: netinet/ip_esp.c =================================================================== RCS file: /home/cvs/src/sys/netinet/ip_esp.c,v retrieving revision 1.112 diff -u -p -r1.112 ip_esp.c --- netinet/ip_esp.c 22 Sep 2010 13:40:05 -0000 1.112 +++ netinet/ip_esp.c 22 Sep 2010 15:47:38 -0000 @@ -932,9 +932,10 @@ esp_output(struct mbuf *m, struct tdb *t * Add padding -- better to do it ourselves than use the crypto engine, * although if/when we support compression, we'd have to do that. */ - pad = (u_char *) m_pad(m, padding + alen); + mo = m_inject(m, m->m_pkthdr.len, padding + alen, M_DONTWAIT); + pad = mtod(mo, u_char *); if (pad == NULL) { - DPRINTF(("esp_output(): m_pad() failed for SA %s/%08x\n", + DPRINTF(("esp_output(): m_inject failed for SA %s/%08x\n", ipsp_address(tdb->tdb_dst), ntohl(tdb->tdb_spi))); return ENOBUFS; } @@ -1178,77 +1179,4 @@ checkreplaywindow32(u_int32_t seq, u_int *bitmap |= (((u_int32_t) 1) << diff); return 0; -} - -/* - * m_pad(m, n) pads <m> with <n> bytes at the end. The packet header - * length is updated, and a pointer to the first byte of the padding - * (which is guaranteed to be all in one mbuf) is returned. - */ - -caddr_t -m_pad(struct mbuf *m, int n) -{ - struct mbuf *m0, *m1; - int len, pad; - caddr_t retval; - - if (n <= 0) { /* No stupid arguments. */ - DPRINTF(("m_pad(): pad length invalid (%d)\n", n)); - m_freem(m); - return NULL; - } - - len = m->m_pkthdr.len; - pad = n; - m0 = m; - - while (m0->m_len < len) { - len -= m0->m_len; - m0 = m0->m_next; - } - - if (m0->m_len != len) { - DPRINTF(("m_pad(): length mismatch (should be %d instead of " - "%d)\n", m->m_pkthdr.len, - m->m_pkthdr.len + m0->m_len - len)); - - m_freem(m); - return NULL; - } - - /* Check for zero-length trailing mbufs, and find the last one. */ - for (m1 = m0; m1->m_next; m1 = m1->m_next) { - if (m1->m_next->m_len != 0) { - DPRINTF(("m_pad(): length mismatch (should be %d " - "instead of %d)\n", m->m_pkthdr.len, - m->m_pkthdr.len + m1->m_next->m_len)); - - m_freem(m); - return NULL; - } - - m0 = m1->m_next; - } - - if ((m0->m_flags & M_EXT) || - m0->m_data + m0->m_len + pad >= &(m0->m_dat[MLEN])) { - /* Add an mbuf to the chain. */ - MGET(m1, M_DONTWAIT, MT_DATA); - if (m1 == 0) { - m_freem(m0); - DPRINTF(("m_pad(): cannot append\n")); - return NULL; - } - - m0->m_next = m1; - m0 = m1; - m0->m_len = 0; - } - - retval = m0->m_data + m0->m_len; - m0->m_len += pad; - m->m_pkthdr.len += pad; - - return retval; } Index: netinet/ip_ipsp.h =================================================================== RCS file: /home/cvs/src/sys/netinet/ip_ipsp.h,v retrieving revision 1.144 diff -u -p -r1.144 ip_ipsp.h --- netinet/ip_ipsp.h 9 Jul 2010 16:58:06 -0000 1.144 +++ netinet/ip_ipsp.h 22 Sep 2010 15:49:32 -0000 @@ -624,9 +624,6 @@ extern int tcp_signature_tdb_input(struc extern int tcp_signature_tdb_output(struct mbuf *, struct tdb *, struct mbuf **, int, int); -/* Padding */ -extern caddr_t m_pad(struct mbuf *, int); - /* Replay window */ extern int checkreplaywindow32(u_int32_t, u_int32_t, u_int32_t *, u_int32_t, u_int32_t *, int);