diff options
Diffstat (limited to 'sys/netipsec/keysock.c')
-rw-r--r-- | sys/netipsec/keysock.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/sys/netipsec/keysock.c b/sys/netipsec/keysock.c index 4b55e05..fa9f839 100644 --- a/sys/netipsec/keysock.c +++ b/sys/netipsec/keysock.c @@ -284,6 +284,16 @@ key_sendup_mbuf(struct socket *so, struct mbuf *m, int target) msg = mtod(m, struct sadb_msg *); PFKEYSTAT_INC(in_msgtype[msg->sadb_msg_type]); } + if (target == KEY_SENDUP_ONESHOT) { + rp = sotorawcb(so); + if (!sbappendaddrchain(&rp->rcb_socket->so_rcv, + (struct sockaddr *) &key_src, m)) { + m_freem(m); + error = ENOBUFS; + } + sorwakeup(rp->rcb_socket); + return error; + } mtx_lock(&rawcb_mtx); LIST_FOREACH(rp, &V_rawcb_list, list) { @@ -339,12 +349,7 @@ key_sendup_mbuf(struct socket *so, struct mbuf *m, int target) return ENOBUFS; } - if ((error = key_sendup0(rp, n, 0)) != 0) { - m_freem(m); - mtx_unlock(&rawcb_mtx); - return error; - } - + key_sendup0(rp, n, 0); n = NULL; } |