Module Name:    src
Committed By:   tls
Date:           Sun Aug 10 06:56:34 UTC 2014

Modified Files:
        src/sys/netipsec [tls-earlyentropy]: ipsec.c ipsec.h ipsec_netbsd.c
            key.c key.h keysock.c keysock.h xform_ipip.c

Log Message:
Rebase.


To generate a diff of this commit:
cvs rdiff -u -r1.62 -r1.62.2.1 src/sys/netipsec/ipsec.c
cvs rdiff -u -r1.34 -r1.34.6.1 src/sys/netipsec/ipsec.h
cvs rdiff -u -r1.36 -r1.36.2.1 src/sys/netipsec/ipsec_netbsd.c
cvs rdiff -u -r1.86 -r1.86.2.1 src/sys/netipsec/key.c
cvs rdiff -u -r1.12 -r1.12.6.1 src/sys/netipsec/key.h
cvs rdiff -u -r1.21 -r1.21.26.1 src/sys/netipsec/keysock.c
cvs rdiff -u -r1.6 -r1.6.62.1 src/sys/netipsec/keysock.h
cvs rdiff -u -r1.29 -r1.29.6.1 src/sys/netipsec/xform_ipip.c

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.62 src/sys/netipsec/ipsec.c:1.62.2.1
--- src/sys/netipsec/ipsec.c:1.62	Tue Dec 24 15:48:53 2013
+++ src/sys/netipsec/ipsec.c	Sun Aug 10 06:56:34 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipsec.c,v 1.62 2013/12/24 15:48:53 christos Exp $	*/
+/*	$NetBSD: ipsec.c,v 1.62.2.1 2014/08/10 06:56:34 tls 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.62 2013/12/24 15:48:53 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.62.2.1 2014/08/10 06:56:34 tls Exp $");
 
 /*
  * IPsec controller part.
@@ -106,6 +106,9 @@ __KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.
 
 #include <net/net_osdep.h>
 
+int ipsec_used = 0;
+int ipsec_enabled = 1;
+
 #ifdef IPSEC_DEBUG
 int ipsec_debug = 1;
 

Index: src/sys/netipsec/ipsec.h
diff -u src/sys/netipsec/ipsec.h:1.34 src/sys/netipsec/ipsec.h:1.34.6.1
--- src/sys/netipsec/ipsec.h:1.34	Sat Jun  8 13:50:22 2013
+++ src/sys/netipsec/ipsec.h	Sun Aug 10 06:56:34 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipsec.h,v 1.34 2013/06/08 13:50:22 rmind Exp $	*/
+/*	$NetBSD: ipsec.h,v 1.34.6.1 2014/08/10 06:56:34 tls Exp $	*/
 /*	$FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/netipsec/ipsec.h,v 1.2.4.2 2004/02/14 22:23:23 bms Exp $	*/
 /*	$KAME: ipsec.h,v 1.53 2001/11/20 08:32:38 itojun Exp $	*/
 
@@ -354,6 +354,7 @@ int ipsec_clear_socket_cache(struct mbuf
 
 void nat_t_ports_get(struct mbuf *, u_int16_t *, u_int16_t *);
 
+extern int ipsec_used __read_mostly, ipsec_enabled __read_mostly;
 
 #endif /* _KERNEL */
 

Index: src/sys/netipsec/ipsec_netbsd.c
diff -u src/sys/netipsec/ipsec_netbsd.c:1.36 src/sys/netipsec/ipsec_netbsd.c:1.36.2.1
--- src/sys/netipsec/ipsec_netbsd.c:1.36	Tue Feb 25 18:30:12 2014
+++ src/sys/netipsec/ipsec_netbsd.c	Sun Aug 10 06:56:34 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipsec_netbsd.c,v 1.36 2014/02/25 18:30:12 pooka Exp $	*/
+/*	$NetBSD: ipsec_netbsd.c,v 1.36.2.1 2014/08/10 06:56:34 tls Exp $	*/
 /*	$KAME: esp_input.c,v 1.60 2001/09/04 08:43:19 itojun Exp $	*/
 /*	$KAME: ah_input.c,v 1.64 2001/09/04 08:43:19 itojun Exp $	*/
 
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipsec_netbsd.c,v 1.36 2014/02/25 18:30:12 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipsec_netbsd.c,v 1.36.2.1 2014/08/10 06:56:34 tls Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -473,6 +473,34 @@ sysctl_net_inet_ipip_stats(SYSCTLFN_ARGS
 	return (NETSTAT_SYSCTL(ipipstat_percpu, IPIP_NSTATS));
 }
 
+static int
+sysctl_net_ipsec_enabled(SYSCTLFN_ARGS)
+{
+	int newenabled, error;
+	struct sysctlnode node;
+	node = *rnode;
+	node.sysctl_data = &newenabled;
+
+	newenabled = ipsec_enabled;
+	error = sysctl_lookup(SYSCTLFN_CALL(&node));
+	if (error || newp == NULL)
+		return error;
+
+	switch (newenabled) {
+	case 0:
+		if (key_get_used())
+			return EBUSY;
+		/*FALLTHROUGH*/
+	case 1:
+	case 2:
+		ipsec_enabled = newenabled;
+		key_update_used();
+		return 0;
+	default:
+		return EINVAL;
+	}
+}
+
 /* XXX will need a different oid at parent */
 SYSCTL_SETUP(sysctl_net_inet_ipsec_setup, "sysctl net.inet.ipsec subtree setup")
 {
@@ -660,6 +688,20 @@ SYSCTL_SETUP(sysctl_net_inet_ipsec_setup
 		       sysctl_net_inet_ipsec_stats, 0, NULL, 0,
 		       CTL_NET, PF_INET, ipproto_ipsec,
 		       CTL_CREATE, CTL_EOL);
+	sysctl_createv(clog, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+		       CTLTYPE_INT, "enabled",
+		       SYSCTL_DESCR("Enable IPSec processing"),
+		       sysctl_net_ipsec_enabled, 0, NULL, 0,
+		       CTL_NET, PF_INET, ipproto_ipsec,
+		       CTL_CREATE, CTL_EOL);
+	sysctl_createv(clog, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT|CTLFLAG_READONLY,
+		       CTLTYPE_INT, "used",
+		       SYSCTL_DESCR("Is IPSec active?"),
+		       NULL, 0, &ipsec_used, 0,
+		       CTL_NET, PF_INET, ipproto_ipsec,
+		       CTL_CREATE, CTL_EOL);
 #ifdef IPSEC_DEBUG
 	sysctl_createv(clog, 0, NULL, NULL,
 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
@@ -755,7 +797,20 @@ SYSCTL_SETUP(sysctl_net_inet6_ipsec6_set
 		       NULL, 0, &ipsec_debug, 0,
 		       CTL_NET, PF_INET6, IPPROTO_AH,
 		       IPSECCTL_DEBUG, CTL_EOL);
-
+	sysctl_createv(clog, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+		       CTLTYPE_INT, "enabled",
+		       SYSCTL_DESCR("Enable IPSec processing"),
+		       sysctl_net_ipsec_enabled, 0, NULL, 0,
+		       CTL_NET, PF_INET6, IPPROTO_AH,
+		       CTL_CREATE, CTL_EOL);
+	sysctl_createv(clog, 0, NULL, NULL,
+		       CTLFLAG_PERMANENT|CTLFLAG_READONLY,
+		       CTLTYPE_INT, "used",
+		       SYSCTL_DESCR("Is IPSec active?"),
+		       NULL, 0, &ipsec_used, 0,
+		       CTL_NET, PF_INET6, IPPROTO_AH,
+		       CTL_CREATE, CTL_EOL);
 	/*
 	 * "aliases" for the ipsec6 subtree
 	 */

Index: src/sys/netipsec/key.c
diff -u src/sys/netipsec/key.c:1.86 src/sys/netipsec/key.c:1.86.2.1
--- src/sys/netipsec/key.c:1.86	Sat Mar  1 12:55:23 2014
+++ src/sys/netipsec/key.c	Sun Aug 10 06:56:34 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: key.c,v 1.86 2014/03/01 12:55:23 joerg Exp $	*/
+/*	$NetBSD: key.c,v 1.86.2.1 2014/08/10 06:56:34 tls 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.86 2014/03/01 12:55:23 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.86.2.1 2014/08/10 06:56:34 tls Exp $");
 
 /*
  * This code is referd to RFC 2367
@@ -1224,8 +1224,10 @@ key_freeso(struct socket *so)
 		/* Does it have a PCB ? */
 		if (pcb == NULL)
 			return;
-		key_freesp_so(&pcb->inp_sp->sp_in);
-		key_freesp_so(&pcb->inp_sp->sp_out);
+
+		struct inpcbpolicy *sp = pcb->inp_sp;
+		key_freesp_so(&sp->sp_in);
+		key_freesp_so(&sp->sp_out);
 	    }
 		break;
 #endif
@@ -1234,12 +1236,13 @@ key_freeso(struct socket *so)
 	    {
 #ifdef HAVE_NRL_INPCB
 		struct inpcb *pcb  = sotoinpcb(so);
+		struct inpcbpolicy *sp = pcb->inp_sp;
 
 		/* Does it have a PCB ? */
 		if (pcb == NULL)
 			return;
-		key_freesp_so(&pcb->inp_sp->sp_in);
-		key_freesp_so(&pcb->inp_sp->sp_out);
+		key_freesp_so(&sp->sp_in);
+		key_freesp_so(&sp->sp_out);
 #else
 		struct in6pcb *pcb  = sotoin6pcb(so);
 
@@ -1770,7 +1773,7 @@ key_gather_mbuf(struct mbuf *m, const st
 	}
 	va_end(ap);
 
-	if ((result->m_flags & M_PKTHDR) != 0) {
+	if (result && (result->m_flags & M_PKTHDR) != 0) {
 		result->m_pkthdr.len = 0;
 		for (n = result; n; n = n->m_next)
 			result->m_pkthdr.len += n->m_len;
@@ -2005,6 +2008,7 @@ key_spdadd(struct socket *so, struct mbu
 	xpl->sadb_x_policy_id = newsp->id;
 
 	m_freem(m);
+	key_update_used();
 	return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
     }
 }
@@ -2137,6 +2141,7 @@ key_spddelete(struct socket *so, struct 
 	newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len);
 
 	m_freem(m);
+	key_update_used();
 	return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
     }
 }
@@ -5077,81 +5082,82 @@ static int
 key_handle_natt_info(struct secasvar *sav,
       		     const struct sadb_msghdr *mhp)
 {
+	const char *msg = "?" ;
+	struct sadb_x_nat_t_type *type;
+	struct sadb_x_nat_t_port *sport, *dport;
+	struct sadb_address *iaddr, *raddr;
+	struct sadb_x_nat_t_frag *frag;
 
-	if (mhp->ext[SADB_X_EXT_NAT_T_OAI] != NULL)
-		ipseclog((LOG_DEBUG,"update: NAT-T OAi present\n"));
-	if (mhp->ext[SADB_X_EXT_NAT_T_OAR] != NULL)
-		ipseclog((LOG_DEBUG,"update: NAT-T OAr present\n"));
+	if (mhp->ext[SADB_X_EXT_NAT_T_TYPE] == NULL ||
+	    mhp->ext[SADB_X_EXT_NAT_T_SPORT] == NULL ||
+	    mhp->ext[SADB_X_EXT_NAT_T_DPORT] == NULL)
+		return 0;
 
-	if ((mhp->ext[SADB_X_EXT_NAT_T_TYPE] != NULL) &&
-	    (mhp->ext[SADB_X_EXT_NAT_T_SPORT] != NULL) &&
-	    (mhp->ext[SADB_X_EXT_NAT_T_DPORT] != NULL)) {
-		struct sadb_x_nat_t_type *type;
-		struct sadb_x_nat_t_port *sport;
-		struct sadb_x_nat_t_port *dport;
-		struct sadb_address *iaddr, *raddr;
-		struct sadb_x_nat_t_frag *frag;
+	if (mhp->extlen[SADB_X_EXT_NAT_T_TYPE] < sizeof(*type)) {
+		msg = "TYPE";
+		goto bad;
+	}
 
-		if ((mhp->extlen[SADB_X_EXT_NAT_T_TYPE] < sizeof(*type)) ||
-		    (mhp->extlen[SADB_X_EXT_NAT_T_SPORT] < sizeof(*sport)) ||
-		    (mhp->extlen[SADB_X_EXT_NAT_T_DPORT] < sizeof(*dport))) {
-			ipseclog((LOG_DEBUG, "key_update: "
-			    "invalid message.\n"));
-			return -1;
-		}
+	if (mhp->extlen[SADB_X_EXT_NAT_T_SPORT] < sizeof(*sport)) {
+		msg = "SPORT";
+		goto bad;
+	}
 
-		if ((mhp->ext[SADB_X_EXT_NAT_T_OAI] != NULL) &&
-		    (mhp->extlen[SADB_X_EXT_NAT_T_OAI] < sizeof(*iaddr))) {
-			ipseclog((LOG_DEBUG, "key_update: invalid message\n"));
-			return -1;
-		}
+	if (mhp->extlen[SADB_X_EXT_NAT_T_DPORT] < sizeof(*dport)) {
+		msg = "DPORT";
+		goto bad;
+	}
 
-		if ((mhp->ext[SADB_X_EXT_NAT_T_OAR] != NULL) &&
-		    (mhp->extlen[SADB_X_EXT_NAT_T_OAR] < sizeof(*raddr))) {
-			ipseclog((LOG_DEBUG, "key_update: invalid message\n"));
-			return -1;
+	if (mhp->ext[SADB_X_EXT_NAT_T_OAI] != NULL) {
+		ipseclog((LOG_DEBUG,"%s: NAT-T OAi present\n", __func__));
+		if (mhp->extlen[SADB_X_EXT_NAT_T_OAI] < sizeof(*iaddr)) {
+			msg = "OAI";
+			goto bad;
 		}
+	}
 
-		if ((mhp->ext[SADB_X_EXT_NAT_T_FRAG] != NULL) &&
-		    (mhp->extlen[SADB_X_EXT_NAT_T_FRAG] < sizeof(*frag))) {
-			ipseclog((LOG_DEBUG, "key_update: invalid message\n"));
-			return -1;
+	if (mhp->ext[SADB_X_EXT_NAT_T_OAR] != NULL) {
+		ipseclog((LOG_DEBUG,"%s: NAT-T OAr present\n", __func__));
+		if (mhp->extlen[SADB_X_EXT_NAT_T_OAR] < sizeof(*raddr)) {
+			msg = "OAR";
+			goto bad;
 		}
+	}
 
-		type = (struct sadb_x_nat_t_type *)
-		    mhp->ext[SADB_X_EXT_NAT_T_TYPE];
-		sport = (struct sadb_x_nat_t_port *)
-		    mhp->ext[SADB_X_EXT_NAT_T_SPORT];
-		dport = (struct sadb_x_nat_t_port *)
-		    mhp->ext[SADB_X_EXT_NAT_T_DPORT];
-		iaddr = (struct sadb_address *)
-		    mhp->ext[SADB_X_EXT_NAT_T_OAI];
-		raddr = (struct sadb_address *)
-		    mhp->ext[SADB_X_EXT_NAT_T_OAR];
-		frag = (struct sadb_x_nat_t_frag *)
-		    mhp->ext[SADB_X_EXT_NAT_T_FRAG];
-
-		ipseclog((LOG_DEBUG,
-			"key_update: type %d, sport = %d, dport = %d\n",
-			type->sadb_x_nat_t_type_type,
-			sport->sadb_x_nat_t_port_port,
-			dport->sadb_x_nat_t_port_port));
-
-		if (type)
-			sav->natt_type = type->sadb_x_nat_t_type_type;
-		if (sport)
-			key_porttosaddr(&sav->sah->saidx.src,
-			    sport->sadb_x_nat_t_port_port);
-		if (dport)
-			key_porttosaddr(&sav->sah->saidx.dst,
-			    dport->sadb_x_nat_t_port_port);
-		if (frag)
-			sav->esp_frag = frag->sadb_x_nat_t_frag_fraglen;
-		else
-			sav->esp_frag = IP_MAXPACKET;
+	if (mhp->ext[SADB_X_EXT_NAT_T_FRAG] != NULL) {
+	    if (mhp->extlen[SADB_X_EXT_NAT_T_FRAG] < sizeof(*frag)) {
+		    msg = "FRAG";
+		    goto bad;
+	    }
 	}
 
+	type = (struct sadb_x_nat_t_type *)mhp->ext[SADB_X_EXT_NAT_T_TYPE];
+	sport = (struct sadb_x_nat_t_port *)mhp->ext[SADB_X_EXT_NAT_T_SPORT];
+	dport = (struct sadb_x_nat_t_port *)mhp->ext[SADB_X_EXT_NAT_T_DPORT];
+	iaddr = (struct sadb_address *)mhp->ext[SADB_X_EXT_NAT_T_OAI];
+	raddr = (struct sadb_address *)mhp->ext[SADB_X_EXT_NAT_T_OAR];
+	frag = (struct sadb_x_nat_t_frag *)mhp->ext[SADB_X_EXT_NAT_T_FRAG];
+
+	ipseclog((LOG_DEBUG, "%s: type %d, sport = %d, dport = %d\n",
+	    __func__, type->sadb_x_nat_t_type_type,
+	    ntohs(sport->sadb_x_nat_t_port_port),
+	    ntohs(dport->sadb_x_nat_t_port_port)));
+
+	sav->natt_type = type->sadb_x_nat_t_type_type;
+	key_porttosaddr(&sav->sah->saidx.src,
+	    sport->sadb_x_nat_t_port_port);
+	key_porttosaddr(&sav->sah->saidx.dst,
+	    dport->sadb_x_nat_t_port_port);
+	if (frag)
+		sav->esp_frag = frag->sadb_x_nat_t_frag_fraglen;
+	else
+		sav->esp_frag = IP_MAXPACKET;
+
 	return 0;
+bad:
+	ipseclog((LOG_DEBUG, "%s: invalid message %s\n", __func__, msg));
+	__USE(msg);
+	return -1;
 }
 
 /* Just update the IPSEC_NAT_T ports if present */
@@ -5159,11 +5165,10 @@ static int
 key_set_natt_ports(union sockaddr_union *src, union sockaddr_union *dst,
       		     const struct sadb_msghdr *mhp)
 {
-
 	if (mhp->ext[SADB_X_EXT_NAT_T_OAI] != NULL)
-		ipseclog((LOG_DEBUG,"update: NAT-T OAi present\n"));
+		ipseclog((LOG_DEBUG,"%s: NAT-T OAi present\n", __func__));
 	if (mhp->ext[SADB_X_EXT_NAT_T_OAR] != NULL)
-		ipseclog((LOG_DEBUG,"update: NAT-T OAr present\n"));
+		ipseclog((LOG_DEBUG,"%s: NAT-T OAr present\n", __func__));
 
 	if ((mhp->ext[SADB_X_EXT_NAT_T_TYPE] != NULL) &&
 	    (mhp->ext[SADB_X_EXT_NAT_T_SPORT] != NULL) &&
@@ -5175,22 +5180,25 @@ key_set_natt_ports(union sockaddr_union 
 		if ((mhp->extlen[SADB_X_EXT_NAT_T_TYPE] < sizeof(*type)) ||
 		    (mhp->extlen[SADB_X_EXT_NAT_T_SPORT] < sizeof(*sport)) ||
 		    (mhp->extlen[SADB_X_EXT_NAT_T_DPORT] < sizeof(*dport))) {
-			ipseclog((LOG_DEBUG, "key_update: "
-			    "invalid message.\n"));
+			ipseclog((LOG_DEBUG, "%s: invalid message\n",
+			    __func__));
 			return -1;
 		}
 
+		type = (struct sadb_x_nat_t_type *)
+		    mhp->ext[SADB_X_EXT_NAT_T_TYPE];
 		sport = (struct sadb_x_nat_t_port *)
 		    mhp->ext[SADB_X_EXT_NAT_T_SPORT];
 		dport = (struct sadb_x_nat_t_port *)
 		    mhp->ext[SADB_X_EXT_NAT_T_DPORT];
 
-		if (sport)
-			key_porttosaddr(src,
-			    sport->sadb_x_nat_t_port_port);
-		if (dport)
-			key_porttosaddr(dst,
-			    dport->sadb_x_nat_t_port_port);
+		key_porttosaddr(src, sport->sadb_x_nat_t_port_port);
+		key_porttosaddr(dst, dport->sadb_x_nat_t_port_port);
+
+		ipseclog((LOG_DEBUG, "%s: type %d, sport = %d, dport = %d\n",
+		    __func__, type->sadb_x_nat_t_type_type,
+		    ntohs(sport->sadb_x_nat_t_port_port),
+		    ntohs(dport->sadb_x_nat_t_port_port)));
 	}
 
 	return 0;
@@ -8080,6 +8088,36 @@ key_setspddump(int *errorp, pid_t pid)
 	return (m);
 }
 
+int
+key_get_used(void) {
+	return !LIST_EMPTY(&sptree[IPSEC_DIR_INBOUND]) ||
+	    !LIST_EMPTY(&sptree[IPSEC_DIR_OUTBOUND]);
+}
+
+void
+key_update_used(void)
+{
+	switch (ipsec_enabled) {
+	default:
+	case 0:
+#ifdef notyet
+		/* XXX: racy */
+		ipsec_used = 0;
+#endif
+		break;
+	case 1:
+#ifndef notyet
+		/* XXX: racy */
+		if (!ipsec_used)
+#endif
+		ipsec_used = key_get_used();
+		break;
+	case 2:
+		ipsec_used = 1;
+		break;
+	}
+}
+
 static int
 sysctl_net_key_dumpsa(SYSCTLFN_ARGS)
 {

Index: src/sys/netipsec/key.h
diff -u src/sys/netipsec/key.h:1.12 src/sys/netipsec/key.h:1.12.6.1
--- src/sys/netipsec/key.h:1.12	Tue Jun  4 22:47:37 2013
+++ src/sys/netipsec/key.h	Sun Aug 10 06:56:34 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: key.h,v 1.12 2013/06/04 22:47:37 christos Exp $	*/
+/*	$NetBSD: key.h,v 1.12.6.1 2014/08/10 06:56:34 tls 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 $	*/
 
@@ -106,6 +106,8 @@ int key_parse (struct mbuf *, struct soc
 void key_init (void);
 void key_sa_recordxfer (struct secasvar *, struct mbuf *);
 void key_sa_routechange (struct sockaddr *);
+void key_update_used(void);
+int key_get_used(void);
 
 u_int16_t key_portfromsaddr (const union sockaddr_union *);
 

Index: src/sys/netipsec/keysock.c
diff -u src/sys/netipsec/keysock.c:1.21 src/sys/netipsec/keysock.c:1.21.26.1
--- src/sys/netipsec/keysock.c:1.21	Sun Jul 17 20:54:54 2011
+++ src/sys/netipsec/keysock.c	Sun Aug 10 06:56:34 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: keysock.c,v 1.21 2011/07/17 20:54:54 joerg Exp $	*/
+/*	$NetBSD: keysock.c,v 1.21.26.1 2014/08/10 06:56:34 tls Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $	*/
 /*	$KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $	*/
 
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.21 2011/07/17 20:54:54 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.21.26.1 2014/08/10 06:56:34 tls Exp $");
 
 #include "opt_ipsec.h"
 
@@ -43,7 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: keysock.c,v 
 #include <sys/domain.h>
 #include <sys/errno.h>
 #include <sys/kernel.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
 #include <sys/mbuf.h>
 #include <sys/protosw.h>
 #include <sys/signalvar.h>
@@ -85,12 +85,6 @@ static int key_sendup0(struct rawcb *, s
 
 int key_registered_sb_max = (2048 * MHLEN); /* XXX arbitrary */
 
-/* XXX sysctl */
-#ifdef __FreeBSD__
-SYSCTL_INT(_net_key, OID_AUTO, registered_sbmax, CTLFLAG_RD,
-    &key_registered_sb_max , 0, "Maximum kernel-to-user PFKEY datagram size");
-#endif
-
 /*
  * key_output()
  */
@@ -249,17 +243,19 @@ key_sendup(struct socket *so, struct sad
 	tlen = len;
 	m = mprev = NULL;
 	while (tlen > 0) {
+		int mlen;	
 		if (tlen == len) {
 			MGETHDR(n, M_DONTWAIT, MT_DATA);
-			n->m_len = MHLEN;
+			mlen = MHLEN;
 		} else {
 			MGET(n, M_DONTWAIT, MT_DATA);
-			n->m_len = MLEN;
+			mlen = MLEN;
 		}
 		if (!n) {
 			PFKEY_STATINC(PFKEY_STAT_IN_NOMEM);
 			return ENOBUFS;
 		}
+		n->m_len = mlen;
 		if (tlen >= MCLBYTES) {	/*XXX better threshold? */
 			MCLGET(n, M_DONTWAIT);
 			if ((n->m_flags & M_EXT) == 0) {
@@ -435,54 +431,24 @@ key_sendup_mbuf(struct socket *so, struc
 	return error;
 }
 
-#ifdef __FreeBSD__
-
-/*
- * key_abort()
- * derived from net/rtsock.c:rts_abort()
- */
 static int
-key_abort(struct socket *so)
-{
-	int s, error;
-	s = splnet(); 	/* FreeBSD */
-	error = raw_usrreqs.pru_abort(so);
-	splx(s);
-	return error;
-}
-
-/*
- * key_attach()
- * derived from net/rtsock.c:rts_attach()
- */
-static int
-key_attach(struct socket *so, int proto, struct proc *td)
+key_attach(struct socket *so, int proto)
 {
 	struct keycb *kp;
 	int s, error;
 
-	if (sotorawcb(so) != 0)
-		return EISCONN;	/* XXX panic? */
-	kp = (struct keycb *)malloc(sizeof *kp, M_PCB, M_WAITOK|M_ZERO); /* XXX */
-	if (kp == 0)
-		return ENOBUFS;
-
-	/*
-	 * The spl[soft]net() is necessary to block protocols from sending
-	 * error notifications (like RTM_REDIRECT or RTM_LOSING) while
-	 * this PCB is extant but incompletely initialized.
-	 * Probably we should try to do more of this work beforehand and
-	 * eliminate the spl.
-	 */
-	s = splnet();	/* FreeBSD */
+	KASSERT(sotorawcb(so) == NULL);
+	kp = kmem_zalloc(sizeof(*kp), KM_SLEEP);
+	kp->kp_raw.rcb_len = sizeof(*kp);
 	so->so_pcb = kp;
-	error = raw_usrreqs.pru_attach(so, proto, td);
-	kp = (struct keycb *)sotorawcb(so);
+
+	s = splsoftnet();
+	error = raw_attach(so, proto);
 	if (error) {
-		free(kp, M_PCB);
+		PFKEY_STATINC(PFKEY_STAT_SOCKERR);
+		kmem_free(kp, sizeof(*kp));
 		so->so_pcb = NULL;
-		splx(s);
-		return error;
+		goto out;
 	}
 
 	kp->kp_promisc = kp->kp_registered = 0;
@@ -494,240 +460,303 @@ key_attach(struct socket *so, int proto,
 	kp->kp_raw.rcb_faddr = &key_dst;
 	soisconnected(so);
 	so->so_options |= SO_USELOOPBACK;
+out:
+	KASSERT(solocked(so));
+	splx(s);
+	return error;
+}
 
+static void
+key_detach(struct socket *so)
+{
+	struct keycb *kp = (struct keycb *)sotorawcb(so);
+	int s;
+
+	KASSERT(solocked(so));
+	KASSERT(kp != NULL);
+
+	s = splsoftnet();
+	if (kp->kp_raw.rcb_proto.sp_protocol == PF_KEY) /* XXX: AF_KEY */
+		key_cb.key_count--;
+	key_cb.any_count--;
+	key_freereg(so);
+	raw_detach(so);
 	splx(s);
-	return 0;
 }
 
-/*
- * key_bind()
- * derived from net/rtsock.c:rts_bind()
- */
 static int
-key_bind(struct socket *so, struct sockaddr *nam, struct proc *td)
+key_accept(struct socket *so, struct mbuf *nam)
 {
-	int s, error;
-	s = splnet();	/* FreeBSD */
-	error = raw_usrreqs.pru_bind(so, nam, td); /* xxx just EINVAL */
-	splx(s);
-	return error;
+	KASSERT(solocked(so));
+
+	panic("key_accept");
+
+	return EOPNOTSUPP;
 }
 
-/*
- * key_connect()
- * derived from net/rtsock.c:rts_connect()
- */
 static int
-key_connect(struct socket *so, struct sockaddr *nam, struct proc *td)
+key_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
 {
-	int s, error;
-	s = splnet();	/* FreeBSD */
-	error = raw_usrreqs.pru_connect(so, nam, td); /* XXX just EINVAL */
-	splx(s);
-	return error;
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
 }
 
-/*
- * key_detach()
- * derived from net/rtsock.c:rts_detach()
- */
 static int
-key_detach(struct socket *so)
+key_listen(struct socket *so, struct lwp *l)
 {
-	struct keycb *kp = (struct keycb *)sotorawcb(so);
-	int s, error;
+	KASSERT(solocked(so));
 
-	s = splnet();	/* FreeBSD */
-	if (kp != 0) {
-		if (kp->kp_raw.rcb_proto.sp_protocol
-		    == PF_KEY) /* XXX: AF_KEY */
-			key_cb.key_count--;
-		key_cb.any_count--;
+	return EOPNOTSUPP;
+}
 
-		key_freereg(so);
-	}
-	error = raw_usrreqs.pru_detach(so);
-	splx(s);
-	return error;
+static int
+key_connect(struct socket *so, struct mbuf *nam, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
+key_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
 }
 
-/*
- * key_disconnect()
- * derived from net/rtsock.c:key_disconnect()
- */
 static int
 key_disconnect(struct socket *so)
 {
-	int s, error;
-	s = splnet();	/* FreeBSD */
-	error = raw_usrreqs.pru_disconnect(so);
+	struct rawcb *rp = sotorawcb(so);
+	int s;
+        
+	KASSERT(solocked(so));
+	KASSERT(rp != NULL);
+
+	s = splsoftnet();
+	soisdisconnected(so);
+	raw_disconnect(rp);
 	splx(s);
-	return error;
+ 
+	return 0;                               
 }
 
-/*
- * key_peeraddr()
- * derived from net/rtsock.c:rts_peeraddr()
- */
 static int
-key_peeraddr(struct socket *so, struct sockaddr **nam)
+key_shutdown(struct socket *so)
 {
-	int s, error;
-	s = splnet();	/* FreeBSD */
-	error = raw_usrreqs.pru_peeraddr(so, nam);
+	int s;
+
+	KASSERT(solocked(so));
+
+	/*
+	 * Mark the connection as being incapable of further input.
+	 */
+	s = splsoftnet();
+	socantsendmore(so);
 	splx(s);
-	return error;
+
+	return 0;
 }
 
-/*
- * key_send()
- * derived from net/rtsock.c:rts_send()
- */
 static int
-key_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
-	 struct mbuf *control, struct proc *td)
+key_abort(struct socket *so)
 {
-	int s, error;
-	s = splnet();	/* FreeBSD */
-	error = raw_usrreqs.pru_send(so, flags, m, nam, control, td);
-	splx(s);
-	return error;
+	KASSERT(solocked(so));
+
+	panic("key_abort");
+
+	return EOPNOTSUPP;
 }
 
-/*
- * key_shutdown()
- * derived from net/rtsock.c:rts_shutdown()
- */
 static int
-key_shutdown(struct socket *so)
+key_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
-	int s, error;
-	s = splnet();	/* FreeBSD */
-	error = raw_usrreqs.pru_shutdown(so);
-	splx(s);
-	return error;
+	return EOPNOTSUPP;
 }
 
-/*
- * key_sockaddr()
- * derived from net/rtsock.c:rts_sockaddr()
- */
 static int
-key_sockaddr(struct socket *so, struct sockaddr **nam)
+key_stat(struct socket *so, struct stat *ub)
 {
-	int s, error;
-	s = splnet();	/* FreeBSD */
-	error = raw_usrreqs.pru_sockaddr(so, nam);
-	splx(s);
-	return error;
+	KASSERT(solocked(so));
+
+	return 0;
 }
-#else /*!__FreeBSD__ -- traditional proto_usrreq() switch */
 
-/*
- * key_usrreq()
- * derived from net/rtsock.c:route_usrreq()
- */
-int
-key_usrreq(struct socket *so, int req,struct mbuf *m, struct mbuf *nam, 
-	   struct mbuf *control, struct lwp *l)
+static int
+key_peeraddr(struct socket *so, struct mbuf *nam)
+{
+	struct rawcb *rp = sotorawcb(so);
+
+	KASSERT(solocked(so));
+	KASSERT(rp != NULL);
+	KASSERT(nam != NULL);
+
+	if (rp->rcb_faddr == NULL)
+		return ENOTCONN;
+
+	raw_setpeeraddr(rp, nam);
+	return 0;
+}
+
+static int
+key_sockaddr(struct socket *so, struct mbuf *nam)
+{
+	struct rawcb *rp = sotorawcb(so);
+
+	KASSERT(solocked(so));
+	KASSERT(rp != NULL);
+	KASSERT(nam != NULL);
+
+	if (rp->rcb_faddr == NULL)
+		return ENOTCONN;
+
+	raw_setsockaddr(rp, nam);
+	return 0;
+}
+
+static int
+key_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
+key_recvoob(struct socket *so, struct mbuf *m, int flags)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
+key_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
+    struct mbuf *control, struct lwp *l)
 {
 	int error = 0;
-	struct keycb *kp = (struct keycb *)sotorawcb(so);
 	int s;
 
-	s = splsoftnet();
-	if (req == PRU_ATTACH) {
-		kp = (struct keycb *)malloc(sizeof(*kp), M_PCB, M_WAITOK);
-		sosetlock(so);
-		so->so_pcb = kp;
-		if (so->so_pcb)
-			memset(so->so_pcb, 0, sizeof(*kp));
-	}
-	if (req == PRU_DETACH && kp) {
-		int af = kp->kp_raw.rcb_proto.sp_protocol;
-		if (af == PF_KEY) /* XXX: AF_KEY */
-			key_cb.key_count--;
-		key_cb.any_count--;
-
-		key_freereg(so);
-	}
+	KASSERT(solocked(so));
 
-	error = raw_usrreq(so, req, m, nam, control, l);
-	m = control = NULL;	/* reclaimed in raw_usrreq */
-	kp = (struct keycb *)sotorawcb(so);
-	if (req == PRU_ATTACH && kp) {
-		int af = kp->kp_raw.rcb_proto.sp_protocol;
-		if (error) {
-			PFKEY_STATINC(PFKEY_STAT_SOCKERR);
-			free(kp, M_PCB);
-			so->so_pcb = NULL;
-			splx(s);
-			return (error);
-		}
-
-		kp->kp_promisc = kp->kp_registered = 0;
-
-		if (af == PF_KEY) /* XXX: AF_KEY */
-			key_cb.key_count++;
-		key_cb.any_count++;
-		kp->kp_raw.rcb_laddr = &key_src;
-		kp->kp_raw.rcb_faddr = &key_dst;
-		soisconnected(so);
-		so->so_options |= SO_USELOOPBACK;
-	}
+	s = splsoftnet();
+	error = raw_send(so, m, nam, control, l);
 	splx(s);
-	return (error);
+
+	return error;
 }
-#endif /*!__FreeBSD__*/
 
-/* sysctl */
-#ifdef SYSCTL_NODE
-SYSCTL_NODE(_net, PF_KEY, key, CTLFLAG_RW, 0, "Key Family");
-#endif /* SYSCTL_NODE */
+static int
+key_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control)
+{
+	KASSERT(solocked(so));
 
-/*
- * Definitions of protocols supported in the KEY domain.
- */
+	m_freem(m);
+	m_freem(control);
 
-#ifdef __FreeBSD__
-extern struct domain keydomain;
+	return EOPNOTSUPP;
+}
 
-struct pr_usrreqs key_usrreqs = {
-	key_abort, pru_accept_notsupp, key_attach, key_bind,
-	key_connect,
-	pru_connect2_notsupp, pru_control_notsupp, key_detach,
-	key_disconnect, pru_listen_notsupp, key_peeraddr,
-	pru_rcvd_notsupp,
-	pru_rcvoob_notsupp, key_send, pru_sense_null, key_shutdown,
-	key_sockaddr, sosend, soreceive, sopoll
-};
+static int
+key_purgeif(struct socket *so, struct ifnet *ifa)
+{
+
+	panic("key_purgeif");
 
-struct protosw keysw[] = {
-{ SOCK_RAW,	&keydomain,	PF_KEY_V2,	PR_ATOMIC|PR_ADDR,
-  0,		(pr_output_t *)key_output,	raw_ctlinput, 0,
-  0,
-  raw_init,	0,		0,		0,
-  &key_usrreqs
+	return EOPNOTSUPP;
 }
-};
 
-static void
-key_init0(void)
+/*
+ * key_usrreq()
+ * derived from net/rtsock.c:route_usrreq()
+ */
+static int
+key_usrreq(struct socket *so, int req,struct mbuf *m, struct mbuf *nam,
+    struct mbuf *control, struct lwp *l)
 {
-	memset(&key_cb, 0, sizeof(key_cb));
-	key_init();
-}
+	int s, error = 0;
+
+	KASSERT(req != PRU_ATTACH);
+	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
+	KASSERT(req != PRU_DISCONNECT);
+	KASSERT(req != PRU_SHUTDOWN);
+	KASSERT(req != PRU_ABORT);
+	KASSERT(req != PRU_CONTROL);
+	KASSERT(req != PRU_SENSE);
+	KASSERT(req != PRU_PEERADDR);
+	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
+	KASSERT(req != PRU_RCVOOB);
+	KASSERT(req != PRU_SEND);
+	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
-struct domain keydomain =
-    { PF_KEY, "key", key_init0, 0, 0,
-      keysw, &keysw[sizeof(keysw)/sizeof(keysw[0])] };
+	s = splsoftnet();
+	error = raw_usrreq(so, req, m, nam, control, l);
+	m = control = NULL;	/* reclaimed in raw_usrreq */
+	splx(s);
 
-DOMAIN_SET(key);
+	return error;
+}
 
-#else /* !__FreeBSD__ */
+/*
+ * Definitions of protocols supported in the KEY domain.
+ */
 
 DOMAIN_DEFINE(keydomain);
 
+PR_WRAP_USRREQS(key)
+#define	key_attach	key_attach_wrapper
+#define	key_detach	key_detach_wrapper
+#define	key_accept	key_accept_wrapper
+#define	key_bind	key_bind_wrapper
+#define	key_listen	key_listen_wrapper
+#define	key_connect	key_connect_wrapper
+#define	key_connect2	key_connect2_wrapper
+#define	key_disconnect	key_disconnect_wrapper
+#define	key_shutdown	key_shutdown_wrapper
+#define	key_abort	key_abort_wrapper
+#define	key_ioctl	key_ioctl_wrapper
+#define	key_stat	key_stat_wrapper
+#define	key_peeraddr	key_peeraddr_wrapper
+#define	key_sockaddr	key_sockaddr_wrapper
+#define	key_rcvd	key_rcvd_wrapper
+#define	key_recvoob	key_recvoob_wrapper
+#define	key_send	key_send_wrapper
+#define	key_sendoob	key_sendoob_wrapper
+#define	key_purgeif	key_purgeif_wrapper
+#define	key_usrreq	key_usrreq_wrapper
+
+const struct pr_usrreqs key_usrreqs = {
+	.pr_attach	= key_attach,
+	.pr_detach	= key_detach,
+	.pr_accept	= key_accept,
+	.pr_bind	= key_bind,
+	.pr_listen	= key_listen,
+	.pr_connect	= key_connect,
+	.pr_connect2	= key_connect2,
+	.pr_disconnect	= key_disconnect,
+	.pr_shutdown	= key_shutdown,
+	.pr_abort	= key_abort,
+	.pr_ioctl	= key_ioctl,
+	.pr_stat	= key_stat,
+	.pr_peeraddr	= key_peeraddr,
+	.pr_sockaddr	= key_sockaddr,
+	.pr_rcvd	= key_rcvd,
+	.pr_recvoob	= key_recvoob,
+	.pr_send	= key_send,
+	.pr_sendoob	= key_sendoob,
+	.pr_purgeif	= key_purgeif,
+	.pr_generic	= key_usrreq,
+};
+
 const struct protosw keysw[] = {
     {
 	.pr_type = SOCK_RAW,
@@ -736,7 +765,7 @@ const struct protosw keysw[] = {
 	.pr_flags = PR_ATOMIC|PR_ADDR,
 	.pr_output = key_output,
 	.pr_ctlinput = raw_ctlinput,
-	.pr_usrreq = key_usrreq,
+	.pr_usrreqs = &key_usrreqs,
 	.pr_init = raw_init,
     }
 };
@@ -748,5 +777,3 @@ struct domain keydomain = {
     .dom_protosw = keysw,
     .dom_protoswNPROTOSW = &keysw[__arraycount(keysw)],
 };
-
-#endif

Index: src/sys/netipsec/keysock.h
diff -u src/sys/netipsec/keysock.h:1.6 src/sys/netipsec/keysock.h:1.6.62.1
--- src/sys/netipsec/keysock.h:1.6	Wed Apr 23 07:29:47 2008
+++ src/sys/netipsec/keysock.h	Sun Aug 10 06:56:34 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: keysock.h,v 1.6 2008/04/23 07:29:47 thorpej Exp $	*/
+/*	$NetBSD: keysock.h,v 1.6.62.1 2014/08/10 06:56:34 tls Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/keysock.h,v 1.1.4.1 2003/01/24 05:11:36 sam Exp $	*/
 /*	$KAME: keysock.h,v 1.8 2000/03/27 05:11:06 sumikawa Exp $	*/
 
@@ -71,14 +71,6 @@ struct keycb {
 };
 
 int key_output (struct mbuf *, ...);
-#ifndef __NetBSD__
-int key_usrreq (struct socket *,
-	int, struct mbuf *, struct mbuf *, struct mbuf *);
-#else
-int key_usrreq (struct socket *,
-	int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *);
-#endif
-
 int key_sendup (struct socket *, struct sadb_msg *, u_int, int);
 int key_sendup_mbuf (struct socket *, struct mbuf *, int);
 #endif /* _KERNEL */

Index: src/sys/netipsec/xform_ipip.c
diff -u src/sys/netipsec/xform_ipip.c:1.29 src/sys/netipsec/xform_ipip.c:1.29.6.1
--- src/sys/netipsec/xform_ipip.c:1.29	Wed Jun  5 19:01:26 2013
+++ src/sys/netipsec/xform_ipip.c	Sun Aug 10 06:56:34 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: xform_ipip.c,v 1.29 2013/06/05 19:01:26 christos Exp $	*/
+/*	$NetBSD: xform_ipip.c,v 1.29.6.1 2014/08/10 06:56:34 tls Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/xform_ipip.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $	*/
 /*	$OpenBSD: ip_ipip.c,v 1.25 2002/06/10 18:04:55 itojun Exp $ */
 
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xform_ipip.c,v 1.29 2013/06/05 19:01:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xform_ipip.c,v 1.29.6.1 2014/08/10 06:56:34 tls Exp $");
 
 /*
  * IP-inside-IP processing
@@ -194,14 +194,13 @@ _ipip_input(struct mbuf *m, int iphlen, 
 	register struct sockaddr_in *sin;
 	register struct ifnet *ifp;
 	register struct ifaddr *ifa;
-	struct ifqueue *ifq = NULL;
+	pktqueue_t *pktq = NULL;
 	struct ip *ipo;
 #ifdef INET6
 	register struct sockaddr_in6 *sin6;
 	struct ip6_hdr *ip6 = NULL;
 	u_int8_t itos;
 #endif
-	int isr;
 	u_int8_t otos;
 	u_int8_t v;
 	int hlen;
@@ -392,27 +391,24 @@ _ipip_input(struct mbuf *m, int iphlen, 
 	switch (v >> 4) {
 #ifdef INET
 	case 4:
-		ifq = &ipintrq;
-		isr = NETISR_IP;
+		pktq = ip_pktq;
 		break;
 #endif
 #ifdef INET6
 	case 6:
-		ifq = &ip6intrq;
-		isr = NETISR_IPV6;
+		pktq = ip6_pktq;
 		break;
 #endif
 	default:
 		panic("ipip_input: should never reach here");
 	}
 
-	if (!IF_HANDOFF(ifq, m, NULL)) {
+	int s = splnet();
+	if (__predict_false(!pktq_enqueue(pktq, m, 0))) {
 		IPIP_STATINC(IPIP_STAT_QFULL);
-
-		DPRINTF(("ipip_input: packet dropped because of full queue\n"));
-	} else {
-		schednetisr(isr);
+		m_freem(m);
 	}
+	splx(s);
 }
 
 int
@@ -688,9 +684,7 @@ static struct xformsw ipe4_xformsw = {
 
 #ifdef INET
 PR_WRAP_CTLOUTPUT(rip_ctloutput)
-PR_WRAP_USRREQ(rip_usrreq)
 #define	rip_ctloutput	rip_ctloutput_wrapper
-#define	rip_usrreq	rip_usrreq_wrapper
 
 extern struct domain inetdomain;
 static struct ipprotosw ipe4_protosw = {
@@ -702,7 +696,7 @@ static struct ipprotosw ipe4_protosw = {
  .pr_output = 0,
  .pr_ctlinput = 0,
  .pr_ctloutput = rip_ctloutput,
- .pr_usrreq = rip_usrreq,
+ .pr_usrreqs = &rip_usrreqs,
  .pr_init = 0,
  .pr_fasttimo = 0,
  .pr_slowtimo =	0,
@@ -711,9 +705,7 @@ static struct ipprotosw ipe4_protosw = {
 #endif
 #ifdef INET6
 PR_WRAP_CTLOUTPUT(rip6_ctloutput)
-PR_WRAP_USRREQ(rip6_usrreq)
 #define	rip6_ctloutput	rip6_ctloutput_wrapper
-#define	rip6_usrreq	rip6_usrreq_wrapper
 
 extern struct domain inet6domain;
 static struct ip6protosw ipe4_protosw6 = {
@@ -725,7 +717,7 @@ static struct ip6protosw ipe4_protosw6 =
  .pr_output = 0,
  .pr_ctlinput = 0,
  .pr_ctloutput = rip6_ctloutput,
- .pr_usrreq = rip6_usrreq,
+ .pr_usrreqs = &rip6_usrreqs,
  .pr_init = 0,
  .pr_fasttimo = 0,
  .pr_slowtimo = 0,

Reply via email to