Module Name: src
Committed By: ozaki-r
Date: Tue Nov 21 07:03:08 UTC 2017
Modified Files:
src/sys/netipsec: ipsec.c key.c key.h
Log Message:
Use M_WAITOK to allocate mbufs wherever sleepable
Further changes will get rid of unnecessary NULL checks then.
To generate a diff of this commit:
cvs rdiff -u -r1.122 -r1.123 src/sys/netipsec/ipsec.c
cvs rdiff -u -r1.238 -r1.239 src/sys/netipsec/key.c
cvs rdiff -u -r1.32 -r1.33 src/sys/netipsec/key.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netipsec/ipsec.c
diff -u src/sys/netipsec/ipsec.c:1.122 src/sys/netipsec/ipsec.c:1.123
--- src/sys/netipsec/ipsec.c:1.122 Tue Oct 17 07:23:08 2017
+++ src/sys/netipsec/ipsec.c Tue Nov 21 07:03:08 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: ipsec.c,v 1.122 2017/10/17 07:23:08 ozaki-r Exp $ */
+/* $NetBSD: ipsec.c,v 1.123 2017/11/21 07:03:08 ozaki-r Exp $ */
/* $FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/netipsec/ipsec.c,v 1.2.2.2 2003/07/01 01:38:13 sam Exp $ */
/* $KAME: ipsec.c,v 1.103 2001/05/24 07:14:18 sakane Exp $ */
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.122 2017/10/17 07:23:08 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.123 2017/11/21 07:03:08 ozaki-r Exp $");
/*
* IPsec controller part.
@@ -1422,7 +1422,7 @@ ipsec_get_policy(struct secpolicy *polic
if (policy == NULL || mp == NULL)
return EINVAL;
- *mp = key_sp2msg(policy);
+ *mp = key_sp2msg(policy, M_NOWAIT);
if (!*mp) {
IPSECLOG(LOG_DEBUG, "No more memory.\n");
return ENOBUFS;
Index: src/sys/netipsec/key.c
diff -u src/sys/netipsec/key.c:1.238 src/sys/netipsec/key.c:1.239
--- src/sys/netipsec/key.c:1.238 Tue Nov 21 06:52:51 2017
+++ src/sys/netipsec/key.c Tue Nov 21 07:03:08 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: key.c,v 1.238 2017/11/21 06:52:51 ozaki-r Exp $ */
+/* $NetBSD: key.c,v 1.239 2017/11/21 07:03:08 ozaki-r Exp $ */
/* $FreeBSD: src/sys/netipsec/key.c,v 1.3.2.3 2004/02/14 22:23:23 bms Exp $ */
/* $KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $ */
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.238 2017/11/21 06:52:51 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.239 2017/11/21 07:03:08 ozaki-r Exp $");
/*
* This code is referred to RFC 2367
@@ -684,17 +684,17 @@ static struct mbuf *key_setsadbxfrag (u_
static void key_porttosaddr (union sockaddr_union *, u_int16_t);
static int key_checksalen (const union sockaddr_union *);
static struct mbuf *key_setsadbmsg (u_int8_t, u_int16_t, u_int8_t,
- u_int32_t, pid_t, u_int16_t);
+ u_int32_t, pid_t, u_int16_t, int);
static struct mbuf *key_setsadbsa (struct secasvar *);
-static struct mbuf *key_setsadbaddr (u_int16_t,
- const struct sockaddr *, u_int8_t, u_int16_t);
+static struct mbuf *key_setsadbaddr(u_int16_t,
+ const struct sockaddr *, u_int8_t, u_int16_t, int);
#if 0
static struct mbuf *key_setsadbident (u_int16_t, u_int16_t, void *,
int, u_int64_t);
#endif
static struct mbuf *key_setsadbxsa2 (u_int8_t, u_int32_t, u_int16_t);
static struct mbuf *key_setsadbxpolicy (u_int16_t, u_int8_t,
- u_int32_t);
+ u_int32_t, int);
static void *key_newbuf (const void *, u_int);
#ifdef INET6
static int key_ismyaddr6 (const struct sockaddr_in6 *);
@@ -748,12 +748,13 @@ static int key_api_get(struct socket *,
const struct sadb_msghdr *);
static void key_getcomb_setlifetime (struct sadb_comb *);
-static struct mbuf *key_getcomb_esp (void);
-static struct mbuf *key_getcomb_ah (void);
-static struct mbuf *key_getcomb_ipcomp (void);
-static struct mbuf *key_getprop (const struct secasindex *);
+static struct mbuf *key_getcomb_esp(int);
+static struct mbuf *key_getcomb_ah(int);
+static struct mbuf *key_getcomb_ipcomp(int);
+static struct mbuf *key_getprop(const struct secasindex *, int);
-static int key_acquire(const struct secasindex *, const struct secpolicy *);
+static int key_acquire(const struct secasindex *, const struct secpolicy *,
+ int);
static int key_acquire_sendup_mbuf_later(struct mbuf *);
static void key_acquire_sendup_pending_mbuf(void);
#ifndef IPSEC_NONBLOCK_ACQUIRE
@@ -787,7 +788,7 @@ static const char *key_getuserfqdn (void
#endif
static void key_sa_chgstate (struct secasvar *, u_int8_t);
-static struct mbuf *key_alloc_mbuf (int);
+static struct mbuf *key_alloc_mbuf(int, int);
static struct mbuf *key_alloc_mbuf_simple(int, int);
static void key_timehandler(void *);
@@ -1026,7 +1027,7 @@ key_checkrequest(const struct ipsecreque
}
/* there is no SA */
- error = key_acquire(saidx, isr->sp);
+ error = key_acquire(saidx, isr->sp, M_NOWAIT);
if (error != 0) {
/* XXX What should I do ? */
IPSECLOG(LOG_DEBUG, "error %d returned from key_acquire.\n",
@@ -1970,7 +1971,7 @@ key_newreqid(void)
* copy secpolicy struct to sadb_x_policy structure indicated.
*/
struct mbuf *
-key_sp2msg(const struct secpolicy *sp)
+key_sp2msg(const struct secpolicy *sp, int mflag)
{
struct sadb_x_policy *xpl;
int tlen;
@@ -1981,7 +1982,7 @@ key_sp2msg(const struct secpolicy *sp)
tlen = key_getspreqmsglen(sp);
- m = key_alloc_mbuf(tlen);
+ m = key_alloc_mbuf(tlen, mflag);
if (!m || m->m_next) { /*XXX*/
if (m)
m_freem(m);
@@ -2043,6 +2044,7 @@ key_gather_mbuf(struct mbuf *m, const st
KASSERT(m != NULL);
KASSERT(mhp != NULL);
+ KASSERT(!cpu_softintr_p());
va_start(ap, nitem);
for (i = 0; i < nitem; i++) {
@@ -2059,7 +2061,7 @@ key_gather_mbuf(struct mbuf *m, const st
if (idx == SADB_EXT_RESERVED) {
CTASSERT(PFKEY_ALIGN8(sizeof(struct sadb_msg)) <= MHLEN);
len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
- MGETHDR(n, M_DONTWAIT, MT_DATA);
+ MGETHDR(n, M_WAITOK, MT_DATA);
if (!n)
goto fail;
n->m_len = len;
@@ -2068,7 +2070,7 @@ key_gather_mbuf(struct mbuf *m, const st
mtod(n, void *));
} else if (i < ndeep) {
len = mhp->extlen[idx];
- n = key_alloc_mbuf(len);
+ n = key_alloc_mbuf(len, M_WAITOK);
if (!n || n->m_next) { /*XXX*/
if (n)
m_freem(n);
@@ -2078,7 +2080,7 @@ key_gather_mbuf(struct mbuf *m, const st
mtod(n, void *));
} else {
n = m_copym(m, mhp->extoff[idx], mhp->extlen[idx],
- M_DONTWAIT);
+ M_WAITOK);
}
if (n == NULL)
goto fail;
@@ -2422,6 +2424,8 @@ key_alloc_mbuf_simple(int len, int mflag
{
struct mbuf *n;
+ KASSERT(mflag == M_NOWAIT || (mflag == M_WAITOK && !cpu_softintr_p()));
+
MGETHDR(n, mflag, MT_DATA);
if (n && len > MHLEN) {
MCLGET(n, mflag);
@@ -2482,7 +2486,7 @@ key_api_spddelete2(struct socket *so, st
/* create new sadb_msg to reply. */
len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
- n = key_alloc_mbuf_simple(len, M_DONTWAIT);
+ n = key_alloc_mbuf_simple(len, M_WAITOK);
if (!n)
return key_senderror(so, m, ENOBUFS);
@@ -2496,7 +2500,7 @@ key_api_spddelete2(struct socket *so, st
KASSERTMSG(off == len, "length inconsistency");
n->m_next = m_copym(m, mhp->extoff[SADB_X_EXT_POLICY],
- mhp->extlen[SADB_X_EXT_POLICY], M_DONTWAIT);
+ mhp->extlen[SADB_X_EXT_POLICY], M_WAITOK);
if (!n->m_next) {
m_freem(n);
return key_senderror(so, m, ENOBUFS);
@@ -2886,25 +2890,27 @@ key_setdumpsp(struct secpolicy *sp, u_in
{
struct mbuf *result = NULL, *m;
+ KASSERT(!cpu_softintr_p());
+
m = key_setsadbmsg(type, 0, SADB_SATYPE_UNSPEC, seq, pid,
- key_sp_refcnt(sp));
+ key_sp_refcnt(sp), M_WAITOK);
if (!m)
goto fail;
result = m;
m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC,
- &sp->spidx.src.sa, sp->spidx.prefs, sp->spidx.ul_proto);
+ &sp->spidx.src.sa, sp->spidx.prefs, sp->spidx.ul_proto, M_WAITOK);
if (!m)
goto fail;
m_cat(result, m);
m = key_setsadbaddr(SADB_EXT_ADDRESS_DST,
- &sp->spidx.dst.sa, sp->spidx.prefd, sp->spidx.ul_proto);
+ &sp->spidx.dst.sa, sp->spidx.prefd, sp->spidx.ul_proto, M_WAITOK);
if (!m)
goto fail;
m_cat(result, m);
- m = key_sp2msg(sp);
+ m = key_sp2msg(sp, M_WAITOK);
if (!m)
goto fail;
m_cat(result, m);
@@ -2986,7 +2992,7 @@ key_spdexpire(struct secpolicy *sp)
KASSERT(sp != NULL);
/* set msg header */
- m = key_setsadbmsg(SADB_X_SPDEXPIRE, 0, 0, 0, 0, 0);
+ m = key_setsadbmsg(SADB_X_SPDEXPIRE, 0, 0, 0, 0, 0, M_WAITOK);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -2995,7 +3001,7 @@ key_spdexpire(struct secpolicy *sp)
/* create lifetime extension (current and hard) */
len = PFKEY_ALIGN8(sizeof(*lt)) * 2;
- m = key_alloc_mbuf(len);
+ m = key_alloc_mbuf(len, M_WAITOK);
if (!m || m->m_next) { /*XXX*/
if (m)
m_freem(m);
@@ -3021,7 +3027,7 @@ key_spdexpire(struct secpolicy *sp)
/* set sadb_address for source */
m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, &sp->spidx.src.sa,
- sp->spidx.prefs, sp->spidx.ul_proto);
+ sp->spidx.prefs, sp->spidx.ul_proto, M_WAITOK);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -3030,7 +3036,7 @@ key_spdexpire(struct secpolicy *sp)
/* set sadb_address for destination */
m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, &sp->spidx.dst.sa,
- sp->spidx.prefd, sp->spidx.ul_proto);
+ sp->spidx.prefd, sp->spidx.ul_proto, M_WAITOK);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -3038,7 +3044,7 @@ key_spdexpire(struct secpolicy *sp)
m_cat(result, m);
/* set secpolicy */
- m = key_sp2msg(sp);
+ m = key_sp2msg(sp, M_WAITOK);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -3743,7 +3749,7 @@ key_setdumpsa(struct secasvar *sav, u_in
};
- m = key_setsadbmsg(type, 0, satype, seq, pid, key_sa_refcnt(sav));
+ m = key_setsadbmsg(type, 0, satype, seq, pid, key_sa_refcnt(sav), M_WAITOK);
if (m == NULL)
goto fail;
result = m;
@@ -3765,13 +3771,13 @@ key_setdumpsa(struct secasvar *sav, u_in
case SADB_EXT_ADDRESS_SRC:
m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC,
&sav->sah->saidx.src.sa,
- FULLMASK, IPSEC_ULPROTO_ANY);
+ FULLMASK, IPSEC_ULPROTO_ANY, M_WAITOK);
break;
case SADB_EXT_ADDRESS_DST:
m = key_setsadbaddr(SADB_EXT_ADDRESS_DST,
&sav->sah->saidx.dst.sa,
- FULLMASK, IPSEC_ULPROTO_ANY);
+ FULLMASK, IPSEC_ULPROTO_ANY, M_WAITOK);
break;
case SADB_EXT_KEY_AUTH:
@@ -3857,14 +3863,14 @@ key_setdumpsa(struct secasvar *sav, u_in
if (!m && !p)
goto fail;
if (p && tres) {
- M_PREPEND(tres, l, M_DONTWAIT);
+ M_PREPEND(tres, l, M_WAITOK);
if (!tres)
goto fail;
memcpy(mtod(tres, void *), p, l);
continue;
}
if (p) {
- m = key_alloc_mbuf(l);
+ m = key_alloc_mbuf(l, M_WAITOK);
if (!m)
goto fail;
m_copyback(m, 0, l, p);
@@ -3912,7 +3918,7 @@ key_setsadbxtype(u_int16_t type)
len = PFKEY_ALIGN8(sizeof(struct sadb_x_nat_t_type));
- m = key_alloc_mbuf(len);
+ m = key_alloc_mbuf(len, M_WAITOK);
if (!m || m->m_next) { /*XXX*/
if (m)
m_freem(m);
@@ -3940,7 +3946,7 @@ key_setsadbxport(u_int16_t port, u_int16
len = PFKEY_ALIGN8(sizeof(struct sadb_x_nat_t_port));
- m = key_alloc_mbuf(len);
+ m = key_alloc_mbuf(len, M_WAITOK);
if (!m || m->m_next) { /*XXX*/
if (m)
m_freem(m);
@@ -3969,7 +3975,7 @@ key_setsadbxfrag(u_int16_t flen)
len = PFKEY_ALIGN8(sizeof(struct sadb_x_nat_t_frag));
- m = key_alloc_mbuf(len);
+ m = key_alloc_mbuf(len, M_WAITOK);
if (!m || m->m_next) { /*XXX*/
if (m)
m_freem(m);
@@ -4073,7 +4079,7 @@ key_checksalen(const union sockaddr_unio
*/
static struct mbuf *
key_setsadbmsg(u_int8_t type, u_int16_t tlen, u_int8_t satype,
- u_int32_t seq, pid_t pid, u_int16_t reserved)
+ u_int32_t seq, pid_t pid, u_int16_t reserved, int mflag)
{
struct mbuf *m;
struct sadb_msg *p;
@@ -4083,7 +4089,7 @@ key_setsadbmsg(u_int8_t type, u_int16_t
len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
- m = key_alloc_mbuf_simple(len, M_DONTWAIT);
+ m = key_alloc_mbuf_simple(len, mflag);
if (!m)
return NULL;
m->m_pkthdr.len = m->m_len = len;
@@ -4115,7 +4121,7 @@ key_setsadbsa(struct secasvar *sav)
int len;
len = PFKEY_ALIGN8(sizeof(struct sadb_sa));
- m = key_alloc_mbuf(len);
+ m = key_alloc_mbuf(len, M_WAITOK);
if (!m || m->m_next) { /*XXX*/
if (m)
m_freem(m);
@@ -4142,7 +4148,7 @@ key_setsadbsa(struct secasvar *sav)
*/
static struct mbuf *
key_setsadbaddr(u_int16_t exttype, const struct sockaddr *saddr,
- u_int8_t prefixlen, u_int16_t ul_proto)
+ u_int8_t prefixlen, u_int16_t ul_proto, int mflag)
{
struct mbuf *m;
struct sadb_address *p;
@@ -4150,7 +4156,7 @@ key_setsadbaddr(u_int16_t exttype, const
len = PFKEY_ALIGN8(sizeof(struct sadb_address)) +
PFKEY_ALIGN8(saddr->sa_len);
- m = key_alloc_mbuf(len);
+ m = key_alloc_mbuf(len, mflag);
if (!m || m->m_next) { /*XXX*/
if (m)
m_freem(m);
@@ -4231,7 +4237,7 @@ key_setsadbxsa2(u_int8_t mode, u_int32_t
size_t len;
len = PFKEY_ALIGN8(sizeof(struct sadb_x_sa2));
- m = key_alloc_mbuf(len);
+ m = key_alloc_mbuf(len, M_WAITOK);
if (!m || m->m_next) { /*XXX*/
if (m)
m_freem(m);
@@ -4256,14 +4262,15 @@ key_setsadbxsa2(u_int8_t mode, u_int32_t
* set data into sadb_x_policy
*/
static struct mbuf *
-key_setsadbxpolicy(const u_int16_t type, const u_int8_t dir, const u_int32_t id)
+key_setsadbxpolicy(const u_int16_t type, const u_int8_t dir, const u_int32_t id,
+ int mflag)
{
struct mbuf *m;
struct sadb_x_policy *p;
size_t len;
len = PFKEY_ALIGN8(sizeof(struct sadb_x_policy));
- m = key_alloc_mbuf(len);
+ m = key_alloc_mbuf(len, mflag);
if (!m || m->m_next) { /*XXX*/
if (m)
m_freem(m);
@@ -5261,7 +5268,7 @@ key_api_getspi(struct socket *so, struct
len = PFKEY_ALIGN8(sizeof(struct sadb_msg)) +
PFKEY_ALIGN8(sizeof(struct sadb_sa));
- n = key_alloc_mbuf_simple(len, M_DONTWAIT);
+ n = key_alloc_mbuf_simple(len, M_WAITOK);
if (!n)
return key_senderror(so, m, ENOBUFS);
@@ -6284,7 +6291,7 @@ key_getcomb_setlifetime(struct sadb_comb
* XXX no idea if the user wants ESP authentication or not
*/
static struct mbuf *
-key_getcomb_esp(void)
+key_getcomb_esp(int mflag)
{
struct sadb_comb *comb;
const struct enc_xform *algo;
@@ -6309,11 +6316,11 @@ key_getcomb_esp(void)
encmin = _BITS(algo->minkey);
if (ipsec_esp_auth)
- m = key_getcomb_ah();
+ m = key_getcomb_ah(mflag);
else {
KASSERTMSG(l <= MLEN,
"l=%u > MLEN=%lu", l, (u_long) MLEN);
- MGET(m, M_DONTWAIT, MT_DATA);
+ MGET(m, mflag, MT_DATA);
if (m) {
M_ALIGN(m, l);
m->m_len = l;
@@ -6382,7 +6389,7 @@ key_getsizes_ah(const struct auth_hash *
* XXX reorder combinations by preference
*/
static struct mbuf *
-key_getcomb_ah(void)
+key_getcomb_ah(int mflag)
{
struct sadb_comb *comb;
const struct auth_hash *algo;
@@ -6413,14 +6420,14 @@ key_getcomb_ah(void)
if (!m) {
KASSERTMSG(l <= MLEN,
"l=%u > MLEN=%lu", l, (u_long) MLEN);
- MGET(m, M_DONTWAIT, MT_DATA);
+ MGET(m, mflag, MT_DATA);
if (m) {
M_ALIGN(m, l);
m->m_len = l;
m->m_next = NULL;
}
} else
- M_PREPEND(m, l, M_DONTWAIT);
+ M_PREPEND(m, l, mflag);
if (!m)
return NULL;
@@ -6446,7 +6453,7 @@ key_getcomb_ah(void)
* XXX reorder combinations by preference
*/
static struct mbuf *
-key_getcomb_ipcomp(void)
+key_getcomb_ipcomp(int mflag)
{
struct sadb_comb *comb;
const struct comp_algo *algo;
@@ -6463,14 +6470,14 @@ key_getcomb_ipcomp(void)
if (!m) {
KASSERTMSG(l <= MLEN,
"l=%u > MLEN=%lu", l, (u_long) MLEN);
- MGET(m, M_DONTWAIT, MT_DATA);
+ MGET(m, mflag, MT_DATA);
if (m) {
M_ALIGN(m, l);
m->m_len = l;
m->m_next = NULL;
}
} else
- M_PREPEND(m, l, M_DONTWAIT);
+ M_PREPEND(m, l, mflag);
if (!m)
return NULL;
@@ -6496,7 +6503,7 @@ key_getcomb_ipcomp(void)
* XXX sysctl interface to ipsec_{ah,esp}_keymin
*/
static struct mbuf *
-key_getprop(const struct secasindex *saidx)
+key_getprop(const struct secasindex *saidx, int mflag)
{
struct sadb_prop *prop;
struct mbuf *m, *n;
@@ -6505,13 +6512,13 @@ key_getprop(const struct secasindex *sai
switch (saidx->proto) {
case IPPROTO_ESP:
- m = key_getcomb_esp();
+ m = key_getcomb_esp(mflag);
break;
case IPPROTO_AH:
- m = key_getcomb_ah();
+ m = key_getcomb_ah(mflag);
break;
case IPPROTO_IPCOMP:
- m = key_getcomb_ipcomp();
+ m = key_getcomb_ipcomp(mflag);
break;
default:
return NULL;
@@ -6519,7 +6526,7 @@ key_getprop(const struct secasindex *sai
if (!m)
return NULL;
- M_PREPEND(m, l, M_DONTWAIT);
+ M_PREPEND(m, l, mflag);
if (!m)
return NULL;
@@ -6557,7 +6564,7 @@ key_getprop(const struct secasindex *sai
* others: error number
*/
static int
-key_acquire(const struct secasindex *saidx, const struct secpolicy *sp)
+key_acquire(const struct secasindex *saidx, const struct secpolicy *sp, int mflag)
{
struct mbuf *result = NULL, *m;
#ifndef IPSEC_NONBLOCK_ACQUIRE
@@ -6609,7 +6616,7 @@ key_acquire(const struct secasindex *sai
#else
seq = (acq_seq = (acq_seq == ~0 ? 1 : ++acq_seq));
#endif
- m = key_setsadbmsg(SADB_ACQUIRE, 0, satype, seq, 0, 0);
+ m = key_setsadbmsg(SADB_ACQUIRE, 0, satype, seq, 0, 0, mflag);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -6618,7 +6625,7 @@ key_acquire(const struct secasindex *sai
/* set sadb_address for saidx's. */
m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, &saidx->src.sa, FULLMASK,
- IPSEC_ULPROTO_ANY);
+ IPSEC_ULPROTO_ANY, mflag);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -6626,7 +6633,7 @@ key_acquire(const struct secasindex *sai
m_cat(result, m);
m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, &saidx->dst.sa, FULLMASK,
- IPSEC_ULPROTO_ANY);
+ IPSEC_ULPROTO_ANY, mflag);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -6637,7 +6644,8 @@ key_acquire(const struct secasindex *sai
/* set sadb_x_policy */
if (sp) {
- m = key_setsadbxpolicy(sp->policy, sp->spidx.dir, sp->id);
+ m = key_setsadbxpolicy(sp->policy, sp->spidx.dir, sp->id,
+ mflag);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -6689,7 +6697,7 @@ key_acquire(const struct secasindex *sai
/* XXX sensitivity (optional) */
/* create proposal/combination extension */
- m = key_getprop(saidx);
+ m = key_getprop(saidx, mflag);
#if 0
/*
* spec conformant: always attach proposal/combination extension,
@@ -7014,7 +7022,7 @@ key_api_acquire(struct socket *so, struc
pserialize_read_exit(s);
}
- error = key_acquire(&saidx, NULL);
+ error = key_acquire(&saidx, NULL, M_WAITOK);
if (error != 0) {
IPSECLOG(LOG_DEBUG, "error %d returned from key_acquire.\n",
error);
@@ -7102,7 +7110,7 @@ key_api_register(struct socket *so, stru
if (len > MCLBYTES)
return key_senderror(so, m, ENOBUFS);
- n = key_alloc_mbuf_simple(len, M_DONTWAIT);
+ n = key_alloc_mbuf_simple(len, M_WAITOK);
if (!n)
return key_senderror(so, m, ENOBUFS);
@@ -7233,7 +7241,8 @@ key_expire(struct secasvar *sav)
KASSERTMSG(satype != 0, "invalid proto is passed");
/* set msg header */
- m = key_setsadbmsg(SADB_EXPIRE, 0, satype, sav->seq, 0, key_sa_refcnt(sav));
+ m = key_setsadbmsg(SADB_EXPIRE, 0, satype, sav->seq, 0, key_sa_refcnt(sav),
+ M_WAITOK);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -7259,7 +7268,7 @@ key_expire(struct secasvar *sav)
/* create lifetime extension (current and soft) */
len = PFKEY_ALIGN8(sizeof(*lt)) * 2;
- m = key_alloc_mbuf(len);
+ m = key_alloc_mbuf(len, M_WAITOK);
if (!m || m->m_next) { /*XXX*/
if (m)
m_freem(m);
@@ -7282,7 +7291,7 @@ key_expire(struct secasvar *sav)
/* set sadb_address for source */
m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, &sav->sah->saidx.src.sa,
- FULLMASK, IPSEC_ULPROTO_ANY);
+ FULLMASK, IPSEC_ULPROTO_ANY, M_WAITOK);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -7291,7 +7300,7 @@ key_expire(struct secasvar *sav)
/* set sadb_address for destination */
m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, &sav->sah->saidx.dst.sa,
- FULLMASK, IPSEC_ULPROTO_ANY);
+ FULLMASK, IPSEC_ULPROTO_ANY, M_WAITOK);
if (!m) {
error = ENOBUFS;
goto fail;
@@ -7718,7 +7727,7 @@ key_parse(struct mbuf *m, struct socket
if (m->m_next) {
struct mbuf *n;
- n = key_alloc_mbuf_simple(m->m_pkthdr.len, M_DONTWAIT);
+ n = key_alloc_mbuf_simple(m->m_pkthdr.len, M_WAITOK);
if (!n) {
m_freem(m);
return ENOBUFS;
@@ -8345,16 +8354,18 @@ key_sa_chgstate(struct secasvar *sav, u_
/* XXX too much? */
static struct mbuf *
-key_alloc_mbuf(int l)
+key_alloc_mbuf(int l, int mflag)
{
struct mbuf *m = NULL, *n;
int len, t;
+ KASSERT(mflag == M_NOWAIT || (mflag == M_WAITOK && !cpu_softintr_p()));
+
len = l;
while (len > 0) {
- MGET(n, M_DONTWAIT, MT_DATA);
+ MGET(n, mflag, MT_DATA);
if (n && len > MLEN) {
- MCLGET(n, M_DONTWAIT);
+ MCLGET(n, mflag);
if ((n->m_flags & M_EXT) == 0) {
m_freem(n);
n = NULL;
Index: src/sys/netipsec/key.h
diff -u src/sys/netipsec/key.h:1.32 src/sys/netipsec/key.h:1.33
--- src/sys/netipsec/key.h:1.32 Tue Oct 3 08:56:52 2017
+++ src/sys/netipsec/key.h Tue Nov 21 07:03:08 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: key.h,v 1.32 2017/10/03 08:56:52 ozaki-r Exp $ */
+/* $NetBSD: key.h,v 1.33 2017/11/21 07:03:08 ozaki-r Exp $ */
/* $FreeBSD: src/sys/netipsec/key.h,v 1.1.4.1 2003/01/24 05:11:36 sam Exp $ */
/* $KAME: key.h,v 1.21 2001/07/27 03:51:30 itojun Exp $ */
@@ -101,7 +101,7 @@ int key_checkrequest(const struct ipsecr
struct secasvar **);
struct secpolicy *key_msg2sp (const struct sadb_x_policy *, size_t, int *);
-struct mbuf *key_sp2msg (const struct secpolicy *);
+struct mbuf *key_sp2msg(const struct secpolicy *, int);
int key_ismyaddr (const struct sockaddr *);
int key_spdacquire (const struct secpolicy *);
u_long key_random (void);