Module Name: src Committed By: ozaki-r Date: Fri Jun 2 03:41:21 UTC 2017
Modified Files: src/sys/netinet: in_pcb_hdr.h tcp_output.c src/sys/netipsec: ipsec.c ipsec.h Log Message: Assert inph_locked on ipsec_pcb_skip_ipsec (was IPSEC_PCB_SKIP_IPSEC) The assertion confirms SP caches are accessed under inph lock (solock). To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/sys/netinet/in_pcb_hdr.h cvs rdiff -u -r1.195 -r1.196 src/sys/netinet/tcp_output.c cvs rdiff -u -r1.98 -r1.99 src/sys/netipsec/ipsec.c cvs rdiff -u -r1.49 -r1.50 src/sys/netipsec/ipsec.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/netinet/in_pcb_hdr.h diff -u src/sys/netinet/in_pcb_hdr.h:1.12 src/sys/netinet/in_pcb_hdr.h:1.13 --- src/sys/netinet/in_pcb_hdr.h:1.12 Tue Apr 25 05:44:11 2017 +++ src/sys/netinet/in_pcb_hdr.h Fri Jun 2 03:41:20 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: in_pcb_hdr.h,v 1.12 2017/04/25 05:44:11 ozaki-r Exp $ */ +/* $NetBSD: in_pcb_hdr.h,v 1.13 2017/06/02 03:41:20 ozaki-r Exp $ */ /* * Copyright (C) 2003 WIDE Project. @@ -89,6 +89,7 @@ struct inpcb_hdr { LIST_HEAD(inpcbhead, inpcb_hdr); struct vestigial_inpcb; +struct in6_addr; /* Hooks for vestigial pcb entries. * If vestigial entries exist for a table (TCP only) Index: src/sys/netinet/tcp_output.c diff -u src/sys/netinet/tcp_output.c:1.195 src/sys/netinet/tcp_output.c:1.196 --- src/sys/netinet/tcp_output.c:1.195 Fri Mar 3 07:13:06 2017 +++ src/sys/netinet/tcp_output.c Fri Jun 2 03:41:20 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_output.c,v 1.195 2017/03/03 07:13:06 ozaki-r Exp $ */ +/* $NetBSD: tcp_output.c,v 1.196 2017/06/02 03:41:20 ozaki-r Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -135,7 +135,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tcp_output.c,v 1.195 2017/03/03 07:13:06 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_output.c,v 1.196 2017/06/02 03:41:20 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -361,7 +361,7 @@ tcp_segsize(struct tcpcb *tp, int *txseg if (inp) { #if defined(IPSEC) if (ipsec_used && - !IPSEC_PCB_SKIP_IPSEC(inp->inp_sp, IPSEC_DIR_OUTBOUND)) + !ipsec_pcb_skip_ipsec(inp->inp_sp, IPSEC_DIR_OUTBOUND)) optlen += ipsec4_hdrsiz_tcp(tp); #endif optlen += ip_optlen(inp); @@ -372,7 +372,7 @@ tcp_segsize(struct tcpcb *tp, int *txseg if (in6p && tp->t_family == AF_INET) { #if defined(IPSEC) if (ipsec_used && - !IPSEC_PCB_SKIP_IPSEC(in6p->in6p_sp, IPSEC_DIR_OUTBOUND)) + !ipsec_pcb_skip_ipsec(in6p->in6p_sp, IPSEC_DIR_OUTBOUND)) optlen += ipsec4_hdrsiz_tcp(tp); #endif /* XXX size -= ip_optlen(in6p); */ @@ -381,7 +381,7 @@ tcp_segsize(struct tcpcb *tp, int *txseg if (in6p && tp->t_family == AF_INET6) { #if defined(IPSEC) if (ipsec_used && - !IPSEC_PCB_SKIP_IPSEC(in6p->in6p_sp, IPSEC_DIR_OUTBOUND)) + !ipsec_pcb_skip_ipsec(in6p->in6p_sp, IPSEC_DIR_OUTBOUND)) optlen += ipsec6_hdrsiz_tcp(tp); #endif optlen += ip6_optlen(in6p); @@ -641,7 +641,7 @@ tcp_output(struct tcpcb *tp) #if defined(INET) has_tso4 = tp->t_inpcb != NULL && #if defined(IPSEC) - (!ipsec_used || IPSEC_PCB_SKIP_IPSEC(tp->t_inpcb->inp_sp, + (!ipsec_used || ipsec_pcb_skip_ipsec(tp->t_inpcb->inp_sp, IPSEC_DIR_OUTBOUND)) && #endif (rt = rtcache_validate(&tp->t_inpcb->inp_route)) != NULL && @@ -654,7 +654,7 @@ tcp_output(struct tcpcb *tp) #if defined(INET6) has_tso6 = tp->t_in6pcb != NULL && #if defined(IPSEC) - (!ipsec_used || IPSEC_PCB_SKIP_IPSEC(tp->t_in6pcb->in6p_sp, + (!ipsec_used || ipsec_pcb_skip_ipsec(tp->t_in6pcb->in6p_sp, IPSEC_DIR_OUTBOUND)) && #endif (rt = rtcache_validate(&tp->t_in6pcb->in6p_route)) != NULL && Index: src/sys/netipsec/ipsec.c diff -u src/sys/netipsec/ipsec.c:1.98 src/sys/netipsec/ipsec.c:1.99 --- src/sys/netipsec/ipsec.c:1.98 Fri Jun 2 03:39:28 2017 +++ src/sys/netipsec/ipsec.c Fri Jun 2 03:41:20 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ipsec.c,v 1.98 2017/06/02 03:39:28 ozaki-r Exp $ */ +/* $NetBSD: ipsec.c,v 1.99 2017/06/02 03:41:20 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.98 2017/06/02 03:39:28 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.99 2017/06/02 03:41:20 ozaki-r Exp $"); /* * IPsec controller part. @@ -673,7 +673,7 @@ ipsec4_output(struct mbuf *m, struct inp return 0; } s = splsoftnet(); - if (inp && IPSEC_PCB_SKIP_IPSEC(inp->inp_sp, IPSEC_DIR_OUTBOUND)) { + if (inp && ipsec_pcb_skip_ipsec(inp->inp_sp, IPSEC_DIR_OUTBOUND)) { splx(s); return 0; } @@ -2281,7 +2281,7 @@ ipsec6_check_policy(struct mbuf *m, stru if (!ipsec_outdone(m)) { s = splsoftnet(); if (in6p != NULL && - IPSEC_PCB_SKIP_IPSEC(in6p->in6p_sp, IPSEC_DIR_OUTBOUND)) { + ipsec_pcb_skip_ipsec(in6p->in6p_sp, IPSEC_DIR_OUTBOUND)) { splx(s); goto skippolicycheck; } Index: src/sys/netipsec/ipsec.h diff -u src/sys/netipsec/ipsec.h:1.49 src/sys/netipsec/ipsec.h:1.50 --- src/sys/netipsec/ipsec.h:1.49 Fri Jun 2 03:39:28 2017 +++ src/sys/netipsec/ipsec.h Fri Jun 2 03:41:20 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ipsec.h,v 1.49 2017/06/02 03:39:28 ozaki-r Exp $ */ +/* $NetBSD: ipsec.h,v 1.50 2017/06/02 03:41:20 ozaki-r 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 $ */ @@ -46,7 +46,9 @@ #include <net/pfkeyv2.h> #ifdef _KERNEL +#include <sys/socketvar.h> +#include <netinet/in_pcb_hdr.h> #include <netipsec/keydb.h> /* @@ -133,9 +135,17 @@ struct inpcbpolicy { struct inpcb_hdr *sp_inph; /* back pointer */ }; -#define IPSEC_PCB_SKIP_IPSEC(inpp, dir) \ - ((inpp)->sp_cache[(dir)].cachehint == IPSEC_PCBHINT_NO && \ - (inpp)->sp_cache[(dir)].cachegen == ipsec_spdgen) +extern u_int ipsec_spdgen; + +static inline bool +ipsec_pcb_skip_ipsec(struct inpcbpolicy *pcbsp, int dir) +{ + + KASSERT(inph_locked(pcbsp->sp_inph)); + + return pcbsp->sp_cache[(dir)].cachehint == IPSEC_PCBHINT_NO && + pcbsp->sp_cache[(dir)].cachegen == ipsec_spdgen; +} /* SP acquiring list table. */ struct secspacq { @@ -257,8 +267,6 @@ void ipsec_pcbconn (struct inpcbpolicy * void ipsec_pcbdisconn (struct inpcbpolicy *); void ipsec_invalpcbcacheall (void); -extern u_int ipsec_spdgen; - struct tdb_ident; struct secpolicy *ipsec_getpolicy (const struct tdb_ident*, u_int); struct inpcb;