--- src/sys/netproto/ipsec/keysock.c 2006/09/05 00:55:49 1.13 +++ src/sys/netproto/ipsec/keysock.c 2006/10/19 07:12:14 1.14 @@ -212,31 +212,17 @@ key_sendup(struct socket *so, struct sad tlen = len; m = mprev = NULL; while (tlen > 0) { - if (tlen == len) { - MGETHDR(n, MB_DONTWAIT, MT_DATA); - n->m_len = MHLEN; - } else { - MGET(n, MB_DONTWAIT, MT_DATA); - n->m_len = MLEN; - } - if (!n) { + int nsize; + + n = m_getl(tlen, MB_DONTWAIT, MT_DATA, + (tlen == len) ? M_PKTHDR : 0, &nsize); + if (n == NULL) { + m_freem(m); pfkeystat.in_nomem++; return ENOBUFS; } - if (tlen >= MCLBYTES) { /*XXX better threshold? */ - MCLGET(n, MB_DONTWAIT); - if ((n->m_flags & M_EXT) == 0) { - m_free(n); - m_freem(m); - pfkeystat.in_nomem++; - return ENOBUFS; - } - n->m_len = MCLBYTES; - } + n->m_len = (tlen < n->m_len) ? tlen : nsize; - if (tlen < n->m_len) - n->m_len = tlen; - n->m_next = NULL; if (m == NULL) m = mprev = n; else { @@ -244,10 +230,8 @@ key_sendup(struct socket *so, struct sad mprev = n; } tlen -= n->m_len; - n = NULL; } m->m_pkthdr.len = len; - m->m_pkthdr.rcvif = NULL; m_copyback(m, 0, len, (caddr_t)msg); /* avoid duplicated statistics */