Module Name: src Committed By: rtr Date: Sat Aug 2 03:55:26 UTC 2014
Modified Files: src/sys/netinet: raw_ip.c tcp_usrreq.c udp_usrreq.c Log Message: restore splsoftnet() in various usrreqs that were removed during the PRU splits. we will properly review removal after the PRU split work is complete. To generate a diff of this commit: cvs rdiff -u -r1.139 -r1.140 src/sys/netinet/raw_ip.c cvs rdiff -u -r1.194 -r1.195 src/sys/netinet/tcp_usrreq.c cvs rdiff -u -r1.212 -r1.213 src/sys/netinet/udp_usrreq.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/netinet/raw_ip.c diff -u src/sys/netinet/raw_ip.c:1.139 src/sys/netinet/raw_ip.c:1.140 --- src/sys/netinet/raw_ip.c:1.139 Thu Jul 31 03:39:35 2014 +++ src/sys/netinet/raw_ip.c Sat Aug 2 03:55:26 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.139 2014/07/31 03:39:35 rtr Exp $ */ +/* $NetBSD: raw_ip.c,v 1.140 2014/08/02 03:55:26 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.139 2014/07/31 03:39:35 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.140 2014/08/02 03:55:26 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -618,8 +618,8 @@ rip_connect(struct socket *so, struct mb error = rip_connect_pcb(inp, nam); if (! error) soisconnected(so); - splx(s); + return error; } @@ -627,24 +627,33 @@ static int rip_disconnect(struct socket *so) { struct inpcb *inp = sotoinpcb(so); + int s; KASSERT(solocked(so)); KASSERT(inp != NULL); + s = splsoftnet(); soisdisconnected(so); rip_disconnect1(inp); + splx(s); + return 0; } static int rip_shutdown(struct socket *so) { + int s; + KASSERT(solocked(so)); /* * Mark the connection as being incapable of further input. */ + s = splsoftnet(); socantsendmore(so); + splx(s); + return 0; } @@ -676,22 +685,32 @@ rip_stat(struct socket *so, struct stat static int rip_peeraddr(struct socket *so, struct mbuf *nam) { + int s; + KASSERT(solocked(so)); KASSERT(sotoinpcb(so) != NULL); KASSERT(nam != NULL); + s = splsoftnet(); in_setpeeraddr(sotoinpcb(so), nam); + splx(s); + return 0; } static int rip_sockaddr(struct socket *so, struct mbuf *nam) { + int s; + KASSERT(solocked(so)); KASSERT(sotoinpcb(so) != NULL); KASSERT(nam != NULL); + s = splsoftnet(); in_setsockaddr(sotoinpcb(so), nam); + splx(s); + return 0; } Index: src/sys/netinet/tcp_usrreq.c diff -u src/sys/netinet/tcp_usrreq.c:1.194 src/sys/netinet/tcp_usrreq.c:1.195 --- src/sys/netinet/tcp_usrreq.c:1.194 Thu Jul 31 03:39:35 2014 +++ src/sys/netinet/tcp_usrreq.c Sat Aug 2 03:55:26 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_usrreq.c,v 1.194 2014/07/31 03:39:35 rtr Exp $ */ +/* $NetBSD: tcp_usrreq.c,v 1.195 2014/08/02 03:55:26 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -99,7 +99,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.194 2014/07/31 03:39:35 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.195 2014/08/02 03:55:26 rtr Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -705,6 +705,7 @@ tcp_accept(struct socket *so, struct mbu struct tcpcb *tp = NULL; int ostate = 0; int error = 0; + int s; KASSERT(solocked(so)); @@ -718,6 +719,7 @@ tcp_accept(struct socket *so, struct mbu * done at higher levels; just return the address * of the peer, storing through addr. */ + s = splsoftnet(); #ifdef INET if (inp) { in_setpeeraddr(inp, nam); @@ -729,6 +731,7 @@ tcp_accept(struct socket *so, struct mbu } #endif tcp_debug_trace(so, tp, ostate, PRU_ACCEPT); + splx(s); return 0; } @@ -773,7 +776,6 @@ tcp_bind(struct socket *so, struct mbuf break; #endif } - tcp_debug_trace(so, tp, ostate, PRU_BIND); splx(s); @@ -786,9 +788,9 @@ tcp_listen(struct socket *so) struct inpcb *inp = NULL; struct in6pcb *in6p = NULL; struct tcpcb *tp = NULL; - int s; int error = 0; int ostate = 0; + int s; KASSERT(solocked(so)); @@ -841,8 +843,6 @@ tcp_connect(struct socket *so, struct mb ostate = tcp_debug_capture(tp, PRU_CONNECT); - s = splsoftnet(); - /* * Initiate connection to peer. * Create a template for use in transmissions on this connection. @@ -850,6 +850,7 @@ tcp_connect(struct socket *so, struct mb * Start keep-alive timer, and seed output sequence space. * Send initial segment on connection. */ + s = splsoftnet(); #ifdef INET if (inp) { if (inp->inp_lport == 0) { @@ -920,9 +921,9 @@ tcp_disconnect(struct socket *so) struct inpcb *inp = NULL; struct in6pcb *in6p = NULL; struct tcpcb *tp = NULL; - int s; int error = 0; int ostate = 0; + int s; KASSERT(solocked(so)); @@ -956,9 +957,9 @@ tcp_shutdown(struct socket *so) struct inpcb *inp = NULL; struct in6pcb *in6p = NULL; struct tcpcb *tp = NULL; - int s; int error = 0; int ostate = 0; + int s; KASSERT(solocked(so)); @@ -986,9 +987,9 @@ tcp_abort(struct socket *so) struct inpcb *inp = NULL; struct in6pcb *in6p = NULL; struct tcpcb *tp = NULL; - int s; int error = 0; int ostate = 0; + int s; KASSERT(solocked(so)); @@ -1042,12 +1043,14 @@ tcp_peeraddr(struct socket *so, struct m struct tcpcb *tp = NULL; int ostate = 0; int error = 0; + int s; if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) return error; ostate = tcp_debug_capture(tp, PRU_PEERADDR); + s = splsoftnet(); #ifdef INET if (inp) in_setpeeraddr(inp, nam); @@ -1056,8 +1059,8 @@ tcp_peeraddr(struct socket *so, struct m if (in6p) in6_setpeeraddr(in6p, nam); #endif - tcp_debug_trace(so, tp, ostate, PRU_PEERADDR); + splx(s); return 0; } @@ -1070,12 +1073,14 @@ tcp_sockaddr(struct socket *so, struct m struct tcpcb *tp = NULL; int ostate = 0; int error = 0; + int s; if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) return error; ostate = tcp_debug_capture(tp, PRU_SOCKADDR); + s = splsoftnet(); #ifdef INET if (inp) in_setsockaddr(inp, nam); @@ -1084,8 +1089,8 @@ tcp_sockaddr(struct socket *so, struct m if (in6p) in6_setsockaddr(in6p, nam); #endif - tcp_debug_trace(so, tp, ostate, PRU_SOCKADDR); + splx(s); return 0; } @@ -1098,20 +1103,26 @@ tcp_recvoob(struct socket *so, struct mb struct tcpcb *tp = NULL; int ostate = 0; int error = 0; + int s; if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) return error; ostate = tcp_debug_capture(tp, PRU_RCVOOB); + s = splsoftnet(); if ((so->so_oobmark == 0 && (so->so_state & SS_RCVATMARK) == 0) || so->so_options & SO_OOBINLINE || - tp->t_oobflags & TCPOOB_HADDATA) + tp->t_oobflags & TCPOOB_HADDATA) { + splx(s); return EINVAL; + } - if ((tp->t_oobflags & TCPOOB_HAVEDATA) == 0) + if ((tp->t_oobflags & TCPOOB_HAVEDATA) == 0) { + splx(s); return EWOULDBLOCK; + } m->m_len = 1; *mtod(m, char *) = tp->t_iobc; @@ -1119,6 +1130,7 @@ tcp_recvoob(struct socket *so, struct mb tp->t_oobflags ^= (TCPOOB_HAVEDATA | TCPOOB_HADDATA); tcp_debug_trace(so, tp, ostate, PRU_RCVOOB); + splx(s); return 0; } @@ -1131,14 +1143,17 @@ tcp_sendoob(struct socket *so, struct mb struct tcpcb *tp = NULL; int ostate = 0; int error = 0; + int s; if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) return error; ostate = tcp_debug_capture(tp, PRU_SENDOOB); + s = splsoftnet(); if (sbspace(&so->so_snd) < -512) { m_freem(m); + splx(s); return ENOBUFS; } /* @@ -1154,8 +1169,8 @@ tcp_sendoob(struct socket *so, struct mb tp->t_force = 1; error = tcp_output(tp); tp->t_force = 0; - tcp_debug_trace(so, tp, ostate, PRU_SENDOOB); + splx(s); return error; } Index: src/sys/netinet/udp_usrreq.c diff -u src/sys/netinet/udp_usrreq.c:1.212 src/sys/netinet/udp_usrreq.c:1.213 --- src/sys/netinet/udp_usrreq.c:1.212 Thu Jul 31 03:39:35 2014 +++ src/sys/netinet/udp_usrreq.c Sat Aug 2 03:55:26 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.212 2014/07/31 03:39:35 rtr Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.213 2014/08/02 03:55:26 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.212 2014/07/31 03:39:35 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.213 2014/08/02 03:55:26 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -1011,22 +1011,32 @@ udp_stat(struct socket *so, struct stat static int udp_peeraddr(struct socket *so, struct mbuf *nam) { + int s; + KASSERT(solocked(so)); KASSERT(sotoinpcb(so) != NULL); KASSERT(nam != NULL); + s = splsoftnet(); in_setpeeraddr(sotoinpcb(so), nam); + splx(s); + return 0; } static int udp_sockaddr(struct socket *so, struct mbuf *nam) { + int s; + KASSERT(solocked(so)); KASSERT(sotoinpcb(so) != NULL); KASSERT(nam != NULL); + s = splsoftnet(); in_setsockaddr(sotoinpcb(so), nam); + splx(s); + return 0; }