aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorSeigo Tanimura <tanimura@FreeBSD.org>2002-05-31 11:52:35 +0000
committerSeigo Tanimura <tanimura@FreeBSD.org>2002-05-31 11:52:35 +0000
commit4cc20ab1f0f3d1126126327aa298ab88c974c53d (patch)
tree9d5f24794525313566896ab89aa860515db344a6 /sys/netinet
parentc82593cf2c9a5b4ccd2be043f6c9ccc8af22fcc9 (diff)
Notes
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/accf_data.c10
-rw-r--r--sys/netinet/accf_http.c31
-rw-r--r--sys/netinet/in_pcb.c77
-rw-r--r--sys/netinet/ip_divert.c21
-rw-r--r--sys/netinet/ip_input.c5
-rw-r--r--sys/netinet/ip_mroute.c2
-rw-r--r--sys/netinet/raw_ip.c52
-rw-r--r--sys/netinet/tcp_input.c102
-rw-r--r--sys/netinet/tcp_output.c17
-rw-r--r--sys/netinet/tcp_reass.c102
-rw-r--r--sys/netinet/tcp_subr.c14
-rw-r--r--sys/netinet/tcp_timer.c68
-rw-r--r--sys/netinet/tcp_timewait.c14
-rw-r--r--sys/netinet/tcp_usrreq.c63
-rw-r--r--sys/netinet/udp_usrreq.c41
15 files changed, 120 insertions, 499 deletions
diff --git a/sys/netinet/accf_data.c b/sys/netinet/accf_data.c
index 447073317889..46c92e3a3074 100644
--- a/sys/netinet/accf_data.c
+++ b/sys/netinet/accf_data.c
@@ -30,8 +30,6 @@
#include <sys/param.h>
#include <sys/kernel.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
#include <sys/sysctl.h>
#include <sys/signalvar.h>
#include <sys/socketvar.h>
@@ -59,15 +57,11 @@ static void
sohasdata(struct socket *so, void *arg, int waitflag)
{
- SOCK_LOCK(so);
- if (!soreadable(so)) {
- SOCK_UNLOCK(so);
+ if (!soreadable(so))
return;
- }
so->so_upcall = NULL;
so->so_rcv.sb_flags &= ~SB_UPCALL;
- soisconnected(so);
- SOCK_UNLOCK(so);
+ soisconnected_locked(so);
return;
}
diff --git a/sys/netinet/accf_http.c b/sys/netinet/accf_http.c
index 4849f6be25b8..4a3e17ee0b8e 100644
--- a/sys/netinet/accf_http.c
+++ b/sys/netinet/accf_http.c
@@ -31,9 +31,7 @@
#include <sys/param.h>
#include <sys/kernel.h>
-#include <sys/lock.h>
#include <sys/mbuf.h>
-#include <sys/mutex.h>
#include <sys/signalvar.h>
#include <sys/sysctl.h>
#include <sys/socketvar.h>
@@ -162,13 +160,11 @@ static void
sohashttpget(struct socket *so, void *arg, int waitflag)
{
- SOCK_LOCK(so);
if ((so->so_state & SS_CANTRCVMORE) == 0 && !sbfull(&so->so_rcv)) {
struct mbuf *m;
char *cmp;
int cmplen, cc;
- SOCK_UNLOCK(so);
m = so->so_rcv.sb_mb;
cc = so->so_rcv.sb_cc - 1;
if (cc < 1)
@@ -201,16 +197,13 @@ sohashttpget(struct socket *so, void *arg, int waitflag)
return;
}
DPRINT("mbufstrcmp bad");
- } else
- SOCK_UNLOCK(so);
+ }
fallout:
DPRINT("fallout");
- SOCK_LOCK(so);
so->so_upcall = NULL;
so->so_rcv.sb_flags &= ~SB_UPCALL;
- soisconnected(so);
- SOCK_UNLOCK(so);
+ soisconnected_locked(so);
return;
}
@@ -220,12 +213,8 @@ soparsehttpvers(struct socket *so, void *arg, int waitflag)
struct mbuf *m, *n;
int i, cc, spaces, inspaces;
- SOCK_LOCK(so);
- if ((so->so_state & SS_CANTRCVMORE) != 0 || sbfull(&so->so_rcv)) {
- SOCK_UNLOCK(so);
+ if ((so->so_state & SS_CANTRCVMORE) != 0 || sbfull(&so->so_rcv))
goto fallout;
- }
- SOCK_UNLOCK(so);
m = so->so_rcv.sb_mb;
cc = so->so_rcv.sb_cc;
@@ -294,11 +283,9 @@ readmore:
fallout:
DPRINT("fallout");
- SOCK_LOCK(so);
so->so_upcall = NULL;
so->so_rcv.sb_flags &= ~SB_UPCALL;
- soisconnected(so);
- SOCK_UNLOCK(so);
+ soisconnected_locked(so);
return;
}
@@ -313,12 +300,8 @@ soishttpconnected(struct socket *so, void *arg, int waitflag)
int ccleft, copied;
DPRINT("start");
- SOCK_LOCK(so);
- if ((so->so_state & SS_CANTRCVMORE) != 0 || sbfull(&so->so_rcv)) {
- SOCK_UNLOCK(so);
+ if ((so->so_state & SS_CANTRCVMORE) != 0 || sbfull(&so->so_rcv))
goto gotit;
- }
- SOCK_UNLOCK(so);
/*
* Walk the socketbuffer and copy the last NCHRS (3) into a, b, and c
@@ -370,10 +353,8 @@ readmore:
return;
gotit:
- SOCK_LOCK(so);
so->so_upcall = NULL;
so->so_rcv.sb_flags &= ~SB_UPCALL;
- soisconnected(so);
- SOCK_UNLOCK(so);
+ soisconnected_locked(so);
return;
}
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index bd4bac958d00..b4de80a3ade0 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -183,20 +183,15 @@ in_pcbbind(inp, nam, td)
struct sockaddr_in *sin;
struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
u_short lport = 0;
- int wild = 0, reuseport;
+ int wild = 0, reuseport = (so->so_options & SO_REUSEPORT);
int error, prison = 0;
- SOCK_LOCK(so);
- reuseport = (so->so_options & SO_REUSEPORT);
- SOCK_UNLOCK(so);
if (TAILQ_EMPTY(&in_ifaddrhead)) /* XXX broken! */
return (EADDRNOTAVAIL);
if (inp->inp_lport || inp->inp_laddr.s_addr != INADDR_ANY)
return (EINVAL);
- SOCK_LOCK(so);
if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0)
wild = 1;
- SOCK_UNLOCK(so);
if (nam) {
sin = (struct sockaddr_in *)nam;
if (nam->sa_len != sizeof (*sin))
@@ -221,10 +216,8 @@ in_pcbbind(inp, nam, td)
* and a multicast address is bound on both
* new and duplicated sockets.
*/
- SOCK_LOCK(so);
if (so->so_options & SO_REUSEADDR)
reuseport = SO_REUSEADDR|SO_REUSEPORT;
- SOCK_UNLOCK(so);
} else if (sin->sin_addr.s_addr != INADDR_ANY) {
sin->sin_port = 0; /* yech... */
bzero(&sin->sin_zero, sizeof(sin->sin_zero));
@@ -244,26 +237,22 @@ in_pcbbind(inp, nam, td)
t = in_pcblookup_local(inp->inp_pcbinfo,
sin->sin_addr, lport,
prison ? 0 : INPLOOKUP_WILDCARD);
- if (t != NULL) {
- SOCK_LOCK(t->inp_socket);
- if ((ntohl(sin->sin_addr.s_addr) != INADDR_ANY ||
- ntohl(t->inp_laddr.s_addr) != INADDR_ANY ||
- (t->inp_socket->so_options &
- SO_REUSEPORT) == 0) &&
- (so->so_cred->cr_uid !=
- t->inp_socket->so_cred->cr_uid)) {
- SOCK_UNLOCK(t->inp_socket);
+ if (t &&
+ (ntohl(sin->sin_addr.s_addr) != INADDR_ANY ||
+ ntohl(t->inp_laddr.s_addr) != INADDR_ANY ||
+ (t->inp_socket->so_options &
+ SO_REUSEPORT) == 0) &&
+ (so->so_cred->cr_uid !=
+ t->inp_socket->so_cred->cr_uid)) {
#if defined(INET6)
- if (ntohl(sin->sin_addr.s_addr) !=
- INADDR_ANY ||
- ntohl(t->inp_laddr.s_addr) !=
- INADDR_ANY ||
- INP_SOCKAF(so) ==
- INP_SOCKAF(t->inp_socket))
+ if (ntohl(sin->sin_addr.s_addr) !=
+ INADDR_ANY ||
+ ntohl(t->inp_laddr.s_addr) !=
+ INADDR_ANY ||
+ INP_SOCKAF(so) ==
+ INP_SOCKAF(t->inp_socket))
#endif /* defined(INET6) */
- return (EADDRINUSE);
- } else
- SOCK_UNLOCK(t->inp_socket);
+ return (EADDRINUSE);
}
}
if (prison &&
@@ -271,21 +260,17 @@ in_pcbbind(inp, nam, td)
return (EADDRNOTAVAIL);
t = in_pcblookup_local(pcbinfo, sin->sin_addr,
lport, prison ? 0 : wild);
- if (t != NULL) {
- SOCK_LOCK(t->inp_socket);
- if ((reuseport & t->inp_socket->so_options) == 0) {
- SOCK_UNLOCK(t->inp_socket);
+ if (t &&
+ (reuseport & t->inp_socket->so_options) == 0) {
#if defined(INET6)
- if (ntohl(sin->sin_addr.s_addr) !=
- INADDR_ANY ||
- ntohl(t->inp_laddr.s_addr) !=
- INADDR_ANY ||
- INP_SOCKAF(so) ==
- INP_SOCKAF(t->inp_socket))
+ if (ntohl(sin->sin_addr.s_addr) !=
+ INADDR_ANY ||
+ ntohl(t->inp_laddr.s_addr) !=
+ INADDR_ANY ||
+ INP_SOCKAF(so) ==
+ INP_SOCKAF(t->inp_socket))
#endif /* defined(INET6) */
- return (EADDRINUSE);
- } else
- SOCK_UNLOCK(t->inp_socket);
+ return (EADDRINUSE);
}
}
inp->inp_laddr = sin->sin_addr;
@@ -431,21 +416,17 @@ in_pcbladdr(inp, nam, plocal_sin)
* destination, in case of sharing the cache with IPv6.
*/
ro = &inp->inp_route;
- SOCK_LOCK(inp->inp_socket);
if (ro->ro_rt &&
(ro->ro_dst.sa_family != AF_INET ||
satosin(&ro->ro_dst)->sin_addr.s_addr !=
sin->sin_addr.s_addr ||
inp->inp_socket->so_options & SO_DONTROUTE)) {
- SOCK_UNLOCK(inp->inp_socket);
RTFREE(ro->ro_rt);
ro->ro_rt = (struct rtentry *)0;
- SOCK_LOCK(inp->inp_socket);
}
if ((inp->inp_socket->so_options & SO_DONTROUTE) == 0 && /*XXX*/
(ro->ro_rt == (struct rtentry *)0 ||
ro->ro_rt->rt_ifp == (struct ifnet *)0)) {
- SOCK_UNLOCK(inp->inp_socket);
/* No route yet, so try to acquire one */
bzero(&ro->ro_dst, sizeof(struct sockaddr_in));
ro->ro_dst.sa_family = AF_INET;
@@ -453,8 +434,7 @@ in_pcbladdr(inp, nam, plocal_sin)
((struct sockaddr_in *) &ro->ro_dst)->sin_addr =
sin->sin_addr;
rtalloc(ro);
- } else
- SOCK_UNLOCK(inp->inp_socket);
+ }
/*
* If we found a route, use the address
* corresponding to the outgoing interface
@@ -568,12 +548,8 @@ in_pcbdisconnect(inp)
inp->inp_faddr.s_addr = INADDR_ANY;
inp->inp_fport = 0;
in_pcbrehash(inp);
- SOCK_LOCK(inp->inp_socket);
- if (inp->inp_socket->so_state & SS_NOFDREF) {
- SOCK_UNLOCK(inp->inp_socket);
+ if (inp->inp_socket->so_state & SS_NOFDREF)
in_pcbdetach(inp);
- } else
- SOCK_UNLOCK(inp->inp_socket);
}
void
@@ -589,7 +565,6 @@ in_pcbdetach(inp)
inp->inp_gencnt = ++ipi->ipi_gencnt;
in_pcbremlists(inp);
so->so_pcb = 0;
- SOCK_LOCK(so);
sotryfree(so);
if (inp->inp_options)
(void)m_free(inp->inp_options);
diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c
index e29739019d7f..8f56d2c580c6 100644
--- a/sys/netinet/ip_divert.c
+++ b/sys/netinet/ip_divert.c
@@ -228,11 +228,8 @@ divert_packet(struct mbuf *m, int incoming, int port)
if (sbappendaddr(&sa->so_rcv, (struct sockaddr *)&divsrc,
m, (struct mbuf *)0) == 0)
m_freem(m);
- else {
- SOCK_LOCK(sa);
+ else
sorwakeup(sa);
- SOCK_UNLOCK(sa);
- }
} else {
m_freem(m);
ipstat.ips_noproto++;
@@ -258,7 +255,6 @@ div_output(so, m, addr, control)
register struct ip *const ip = mtod(m, struct ip *);
struct sockaddr_in *sin = (struct sockaddr_in *)addr;
int error = 0;
- int soopts;
if (control)
m_freem(control); /* XXX */
@@ -304,11 +300,8 @@ div_output(so, m, addr, control)
/* Send packet to output processing */
ipstat.ips_rawout++; /* XXX */
- SOCK_LOCK(so);
- soopts = so->so_options & SO_DONTROUTE;
- SOCK_UNLOCK(so);
error = ip_output(m, inp->inp_options, &inp->inp_route,
- soopts |
+ (so->so_options & SO_DONTROUTE) |
IP_ALLOWBROADCAST | IP_RAWOUTPUT,
inp->inp_moptions);
} else {
@@ -372,9 +365,7 @@ div_attach(struct socket *so, int proto, struct thread *td)
inp->inp_flags |= INP_HDRINCL;
/* The socket is always "connected" because
we always know "where" to send the packet */
- SOCK_LOCK(so);
so->so_state |= SS_ISCONNECTED;
- SOCK_UNLOCK(so);
return 0;
}
@@ -393,21 +384,15 @@ div_detach(struct socket *so)
static int
div_abort(struct socket *so)
{
- SOCK_LOCK(so);
soisdisconnected(so);
- SOCK_UNLOCK(so);
return div_detach(so);
}
static int
div_disconnect(struct socket *so)
{
- SOCK_LOCK(so);
- if ((so->so_state & SS_ISCONNECTED) == 0) {
- SOCK_UNLOCK(so);
+ if ((so->so_state & SS_ISCONNECTED) == 0)
return ENOTCONN;
- }
- SOCK_UNLOCK(so);
return div_abort(so);
}
diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c
index b33bc5bdf36f..b7c5ea3872c3 100644
--- a/sys/netinet/ip_input.c
+++ b/sys/netinet/ip_input.c
@@ -1836,18 +1836,15 @@ ip_savecontrol(inp, mp, ip, m)
register struct ip *ip;
register struct mbuf *m;
{
- SOCK_LOCK(inp->inp_socket);
if (inp->inp_socket->so_options & SO_TIMESTAMP) {
struct timeval tv;
- SOCK_UNLOCK(inp->inp_socket);
microtime(&tv);
*mp = sbcreatecontrol((caddr_t) &tv, sizeof(tv),
SCM_TIMESTAMP, SOL_SOCKET);
if (*mp)
mp = &(*mp)->m_next;
- } else
- SOCK_UNLOCK(inp->inp_socket);
+ }
if (inp->inp_flags & INP_RECVDSTADDR) {
*mp = sbcreatecontrol((caddr_t) &ip->ip_dst,
sizeof(struct in_addr), IP_RECVDSTADDR, IPPROTO_IP);
diff --git a/sys/netinet/ip_mroute.c b/sys/netinet/ip_mroute.c
index e2f85f25bbaf..0be45ea52bed 100644
--- a/sys/netinet/ip_mroute.c
+++ b/sys/netinet/ip_mroute.c
@@ -1133,9 +1133,7 @@ socket_send(s, mm, src)
if (sbappendaddr(&s->so_rcv,
(struct sockaddr *)src,
mm, (struct mbuf *)0) != 0) {
- SOCK_LOCK(s);
sorwakeup(s);
- SOCK_UNLOCK(s);
return 0;
}
}
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c
index aaeb61c526e0..86915fc27605 100644
--- a/sys/netinet/raw_ip.c
+++ b/sys/netinet/raw_ip.c
@@ -153,16 +153,9 @@ rip_input(m, off)
} else
#endif /*IPSEC*/
if (n) {
- if (last->inp_flags & INP_CONTROLOPTS)
- ip_savecontrol(last, &opts, ip, n);
- else {
- SOCK_LOCK(last->inp_socket);
- if(last->inp_socket->so_options & SO_TIMESTAMP) {
- SOCK_UNLOCK(last->inp_socket);
- ip_savecontrol(last, &opts, ip, n);
- } else
- SOCK_UNLOCK(last->inp_socket);
- }
+ if (last->inp_flags & INP_CONTROLOPTS ||
+ last->inp_socket->so_options & SO_TIMESTAMP)
+ ip_savecontrol(last, &opts, ip, n);
if (sbappendaddr(&last->inp_socket->so_rcv,
(struct sockaddr *)&ripsrc, n,
opts) == 0) {
@@ -170,11 +163,8 @@ rip_input(m, off)
m_freem(n);
if (opts)
m_freem(opts);
- } else {
- SOCK_LOCK(last->inp_socket);
+ } else
sorwakeup(last->inp_socket);
- SOCK_UNLOCK(last->inp_socket);
- }
opts = 0;
}
}
@@ -190,26 +180,16 @@ rip_input(m, off)
} else
#endif /*IPSEC*/
if (last) {
- if (last->inp_flags & INP_CONTROLOPTS)
+ if (last->inp_flags & INP_CONTROLOPTS ||
+ last->inp_socket->so_options & SO_TIMESTAMP)
ip_savecontrol(last, &opts, ip, m);
- else {
- SOCK_LOCK(last->inp_socket);
- if (last->inp_socket->so_options & SO_TIMESTAMP) {
- SOCK_UNLOCK(last->inp_socket);
- ip_savecontrol(last, &opts, ip, m);
- } else
- SOCK_UNLOCK(last->inp_socket);
- }
if (sbappendaddr(&last->inp_socket->so_rcv,
(struct sockaddr *)&ripsrc, m, opts) == 0) {
m_freem(m);
if (opts)
m_freem(opts);
- } else {
- SOCK_LOCK(last->inp_socket);
+ } else
sorwakeup(last->inp_socket);
- SOCK_UNLOCK(last->inp_socket);
- }
} else {
m_freem(m);
ipstat.ips_noproto++;
@@ -229,11 +209,8 @@ rip_output(m, so, dst)
{
register struct ip *ip;
register struct inpcb *inp = sotoinpcb(so);
- int flags;
+ int flags = (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST;
- SOCK_LOCK(so);
- flags = (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST;
- SOCK_UNLOCK(so);
/*
* If the user handed us a complete IP packet, use it.
* Otherwise, allocate an mbuf for a header and fill it in.
@@ -531,21 +508,15 @@ rip_detach(struct socket *so)
static int
rip_abort(struct socket *so)
{
- SOCK_LOCK(so);
soisdisconnected(so);
- SOCK_UNLOCK(so);
return rip_detach(so);
}
static int
rip_disconnect(struct socket *so)
{
- SOCK_LOCK(so);
- if ((so->so_state & SS_ISCONNECTED) == 0) {
- SOCK_UNLOCK(so);
+ if ((so->so_state & SS_ISCONNECTED) == 0)
return ENOTCONN;
- }
- SOCK_UNLOCK(so);
return rip_abort(so);
}
@@ -581,9 +552,7 @@ rip_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
(addr->sin_family != AF_IMPLINK))
return EAFNOSUPPORT;
inp->inp_faddr = addr->sin_addr;
- SOCK_LOCK(so);
soisconnected(so);
- SOCK_UNLOCK(so);
return 0;
}
@@ -601,16 +570,13 @@ rip_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
struct inpcb *inp = sotoinpcb(so);
register u_long dst;
- SOCK_LOCK(so);
if (so->so_state & SS_ISCONNECTED) {
- SOCK_UNLOCK(so);
if (nam) {
m_freem(m);
return EISCONN;
}
dst = inp->inp_faddr.s_addr;
} else {
- SOCK_UNLOCK(so);
if (nam == NULL) {
m_freem(m);
return ENOTCONN;
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index b5c6dafc3de4..b193327f3197 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -281,21 +281,15 @@ present:
flags = q->tqe_th->th_flags & TH_FIN;
nq = LIST_NEXT(q, tqe_q);
LIST_REMOVE(q, tqe_q);
- SOCK_LOCK(so);
- if (so->so_state & SS_CANTRCVMORE) {
- SOCK_UNLOCK(so);
+ if (so->so_state & SS_CANTRCVMORE)
m_freem(q->tqe_m);
- } else {
- SOCK_UNLOCK(so);
+ else
sbappend(&so->so_rcv, q->tqe_m);
- }
FREE(q, M_TSEGQ);
q = nq;
} while (q && q->tqe_th->th_seq == tp->rcv_nxt);
ND6_HINT(tp);
- SOCK_LOCK(so);
sorwakeup(so);
- SOCK_UNLOCK(so);
return (flags);
}
@@ -644,7 +638,6 @@ findpcb:
tiwin = th->th_win;
so = inp->inp_socket;
- SOCK_LOCK(so);
if (so->so_options & (SO_DEBUG|SO_ACCEPTCONN)) {
struct in_conninfo inc;
#ifdef TCPDEBUG
@@ -661,11 +654,8 @@ findpcb:
}
#endif
/* skip if this isn't a listen socket */
- if ((so->so_options & SO_ACCEPTCONN) == 0) {
- SOCK_UNLOCK(so);
+ if ((so->so_options & SO_ACCEPTCONN) == 0)
goto after_listen;
- }
- SOCK_UNLOCK(so);
#ifdef INET6
inc.inc_isipv6 = isipv6;
if (isipv6) {
@@ -878,14 +868,11 @@ findpcb:
tp->t_flags |= (TF_ACKNOW | TF_NEEDSYN);
tcpstat.tcps_connects++;
- SOCK_LOCK(so);
soisconnected(so);
- SOCK_UNLOCK(so);
goto trimthenstep6;
}
goto drop;
- } else
- SOCK_UNLOCK(so);
+ }
after_listen:
/* XXX temp debugging */
@@ -1017,9 +1004,7 @@ after_listen:
tp->t_rxtcur,
tcp_timer_rexmt, tp);
- SOCK_LOCK(so);
sowwakeup(so);
- SOCK_UNLOCK(so);
if (so->so_snd.sb_cc)
(void) tcp_output(tp);
return;
@@ -1042,9 +1027,7 @@ after_listen:
*/
m_adj(m, drop_hdrlen); /* delayed header drop */
sbappend(&so->so_rcv, m);
- SOCK_LOCK(so);
sorwakeup(so);
- SOCK_UNLOCK(so);
if (DELAY_ACK(tp)) {
callout_reset(tp->tt_delack, tcp_delacktime,
tcp_timer_delack, tp);
@@ -1154,9 +1137,7 @@ after_listen:
} else
tp->t_flags &= ~TF_RCVD_CC;
tcpstat.tcps_connects++;
- SOCK_LOCK(so);
soisconnected(so);
- SOCK_UNLOCK(so);
/* Do window scaling on this connection? */
if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
(TF_RCVD_SCALE|TF_REQ_SCALE)) {
@@ -1486,16 +1467,13 @@ trimthenstep6:
* If new data are received on a connection after the
* user processes are gone, then RST the other end.
*/
- SOCK_LOCK(so);
if ((so->so_state & SS_NOFDREF) &&
tp->t_state > TCPS_CLOSE_WAIT && tlen) {
- SOCK_UNLOCK(so);
tp = tcp_close(tp);
tcpstat.tcps_rcvafterclose++;
rstreason = BANDLIM_UNLIMITED;
goto dropwithreset;
}
- SOCK_UNLOCK(so);
/*
* If segment ends after window, drop trailing data
@@ -1585,9 +1563,7 @@ trimthenstep6:
case TCPS_SYN_RECEIVED:
tcpstat.tcps_connects++;
- SOCK_LOCK(so);
soisconnected(so);
- SOCK_UNLOCK(so);
/* Do window scaling? */
if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
(TF_RCVD_SCALE|TF_REQ_SCALE)) {
@@ -1846,9 +1822,7 @@ process_ACK:
tp->snd_wnd -= acked;
ourfinisacked = 0;
}
- SOCK_LOCK(so);
sowwakeup(so);
- SOCK_UNLOCK(so);
tp->snd_una = th->th_ack;
if (SEQ_LT(tp->snd_nxt, tp->snd_una))
tp->snd_nxt = tp->snd_una;
@@ -1869,14 +1843,11 @@ process_ACK:
* specification, but if we don't get a FIN
* we'll hang forever.
*/
- SOCK_LOCK(so);
if (so->so_state & SS_CANTRCVMORE) {
- soisdisconnected(so);
- SOCK_UNLOCK(so);
+ soisdisconnected_locked(so);
callout_reset(tp->tt_2msl, tcp_maxidle,
tcp_timer_2msl, tp);
- } else
- SOCK_UNLOCK(so);
+ }
tp->t_state = TCPS_FIN_WAIT_2;
}
break;
@@ -1901,9 +1872,7 @@ process_ACK:
else
callout_reset(tp->tt_2msl, 2 * tcp_msl,
tcp_timer_2msl, tp);
- SOCK_LOCK(so);
soisdisconnected(so);
- SOCK_UNLOCK(so);
}
break;
@@ -1987,11 +1956,8 @@ step6:
tp->rcv_up = th->th_seq + th->th_urp;
so->so_oobmark = so->so_rcv.sb_cc +
(tp->rcv_up - tp->rcv_nxt) - 1;
- if (so->so_oobmark == 0) {
- SOCK_LOCK(so);
+ if (so->so_oobmark == 0)
so->so_state |= SS_RCVATMARK;
- SOCK_UNLOCK(so);
- }
sohasoutofband(so);
tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA);
}
@@ -2001,19 +1967,13 @@ step6:
* but if two URG's are pending at once, some out-of-band
* data may creep in... ick.
*/
- if (th->th_urp <= (u_long)tlen) {
+ if (th->th_urp <= (u_long)tlen
#ifdef SO_OOBINLINE
- SOCK_LOCK(so);
- if ((so->so_options & SO_OOBINLINE) == 0) {
- SOCK_UNLOCK(so);
+ && (so->so_options & SO_OOBINLINE) == 0
#endif
- tcp_pulloutofband(so, th, m,
- drop_hdrlen); /* hdr drop is delayed */
-#ifdef SO_OOBINLINE
- } else
- SOCK_UNLOCK(so);
-#endif
- }
+ )
+ tcp_pulloutofband(so, th, m,
+ drop_hdrlen); /* hdr drop is delayed */
} else
/*
* If no out of band data is expected,
@@ -2059,9 +2019,7 @@ dodata: /* XXX */
tcpstat.tcps_rcvbyte += tlen;
ND6_HINT(tp);
sbappend(&so->so_rcv, m);
- SOCK_LOCK(so);
sorwakeup(so);
- SOCK_UNLOCK(so);
} else {
thflags = tcp_reass(tp, th, &tlen, m);
tp->t_flags |= TF_ACKNOW;
@@ -2140,9 +2098,7 @@ dodata: /* XXX */
else
callout_reset(tp->tt_2msl, 2 * tcp_msl,
tcp_timer_2msl, tp);
- SOCK_LOCK(so);
soisdisconnected(so);
- SOCK_UNLOCK(so);
break;
/*
@@ -2155,13 +2111,9 @@ dodata: /* XXX */
}
}
#ifdef TCPDEBUG
- SOCK_LOCK(so);
- if (so->so_options & SO_DEBUG) {
- SOCK_UNLOCK(so);
+ if (so->so_options & SO_DEBUG)
tcp_trace(TA_INPUT, ostate, tp, (void *)tcp_saveipgen,
&tcp_savetcp, 0);
- } else
- SOCK_UNLOCK(so);
#endif
/*
@@ -2194,13 +2146,9 @@ dropafterack:
goto dropwithreset;
}
#ifdef TCPDEBUG
- SOCK_LOCK(so);
- if (so->so_options & SO_DEBUG) {
- SOCK_UNLOCK(so);
+ if (so->so_options & SO_DEBUG)
tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
&tcp_savetcp, 0);
- } else
- SOCK_UNLOCK(so);
#endif
m_freem(m);
tp->t_flags |= TF_ACKNOW;
@@ -2236,18 +2184,9 @@ dropwithreset:
goto drop;
#ifdef TCPDEBUG
- if (tp == 0)
+ if (tp == 0 || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
&tcp_savetcp, 0);
- else {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if ((tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
- &tcp_savetcp, 0);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- }
#endif
if (thflags & TH_ACK)
/* mtod() below is safe as long as hdr dropping is delayed */
@@ -2267,18 +2206,9 @@ drop:
* Drop space held by incoming segment and return.
*/
#ifdef TCPDEBUG
- if (tp == 0)
+ if (tp == 0 || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
&tcp_savetcp, 0);
- else {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if ((tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
- &tcp_savetcp, 0);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- }
#endif
m_freem(m);
return;
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index dd2832b18fc5..40ed7ee41141 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -126,7 +126,6 @@ tcp_output(tp)
#ifdef INET6
int isipv6;
#endif
- int soopts;
#ifdef INET6
isipv6 = (tp->t_inpcb->inp_vflag & INP_IPV6) != 0;
@@ -820,12 +819,8 @@ send:
/*
* Trace.
*/
- SOCK_LOCK(so);
- if (so->so_options & SO_DEBUG) {
- SOCK_UNLOCK(so);
+ if (so->so_options & SO_DEBUG)
tcp_trace(TA_OUTPUT, tp->t_state, tp, mtod(m, void *), th, 0);
- } else
- SOCK_UNLOCK(so);
#endif
/*
@@ -859,13 +854,10 @@ send:
goto out;
}
#endif /*IPSEC*/
- SOCK_LOCK(so);
- soopts = (so->so_options & SO_DONTROUTE);
- SOCK_UNLOCK(so);
error = ip6_output(m,
tp->t_inpcb->in6p_outputopts,
&tp->t_inpcb->in6p_route,
- soopts, NULL, NULL);
+ (so->so_options & SO_DONTROUTE), NULL, NULL);
} else
#endif /* INET6 */
{
@@ -897,11 +889,8 @@ send:
#ifdef IPSEC
ipsec_setsocket(m, so);
#endif /*IPSEC*/
- SOCK_LOCK(so);
- soopts = (so->so_options & SO_DONTROUTE);
- SOCK_UNLOCK(so);
error = ip_output(m, tp->t_inpcb->inp_options, &tp->t_inpcb->inp_route,
- soopts, 0);
+ (so->so_options & SO_DONTROUTE), 0);
}
if (error) {
diff --git a/sys/netinet/tcp_reass.c b/sys/netinet/tcp_reass.c
index b5c6dafc3de4..b193327f3197 100644
--- a/sys/netinet/tcp_reass.c
+++ b/sys/netinet/tcp_reass.c
@@ -281,21 +281,15 @@ present:
flags = q->tqe_th->th_flags & TH_FIN;
nq = LIST_NEXT(q, tqe_q);
LIST_REMOVE(q, tqe_q);
- SOCK_LOCK(so);
- if (so->so_state & SS_CANTRCVMORE) {
- SOCK_UNLOCK(so);
+ if (so->so_state & SS_CANTRCVMORE)
m_freem(q->tqe_m);
- } else {
- SOCK_UNLOCK(so);
+ else
sbappend(&so->so_rcv, q->tqe_m);
- }
FREE(q, M_TSEGQ);
q = nq;
} while (q && q->tqe_th->th_seq == tp->rcv_nxt);
ND6_HINT(tp);
- SOCK_LOCK(so);
sorwakeup(so);
- SOCK_UNLOCK(so);
return (flags);
}
@@ -644,7 +638,6 @@ findpcb:
tiwin = th->th_win;
so = inp->inp_socket;
- SOCK_LOCK(so);
if (so->so_options & (SO_DEBUG|SO_ACCEPTCONN)) {
struct in_conninfo inc;
#ifdef TCPDEBUG
@@ -661,11 +654,8 @@ findpcb:
}
#endif
/* skip if this isn't a listen socket */
- if ((so->so_options & SO_ACCEPTCONN) == 0) {
- SOCK_UNLOCK(so);
+ if ((so->so_options & SO_ACCEPTCONN) == 0)
goto after_listen;
- }
- SOCK_UNLOCK(so);
#ifdef INET6
inc.inc_isipv6 = isipv6;
if (isipv6) {
@@ -878,14 +868,11 @@ findpcb:
tp->t_flags |= (TF_ACKNOW | TF_NEEDSYN);
tcpstat.tcps_connects++;
- SOCK_LOCK(so);
soisconnected(so);
- SOCK_UNLOCK(so);
goto trimthenstep6;
}
goto drop;
- } else
- SOCK_UNLOCK(so);
+ }
after_listen:
/* XXX temp debugging */
@@ -1017,9 +1004,7 @@ after_listen:
tp->t_rxtcur,
tcp_timer_rexmt, tp);
- SOCK_LOCK(so);
sowwakeup(so);
- SOCK_UNLOCK(so);
if (so->so_snd.sb_cc)
(void) tcp_output(tp);
return;
@@ -1042,9 +1027,7 @@ after_listen:
*/
m_adj(m, drop_hdrlen); /* delayed header drop */
sbappend(&so->so_rcv, m);
- SOCK_LOCK(so);
sorwakeup(so);
- SOCK_UNLOCK(so);
if (DELAY_ACK(tp)) {
callout_reset(tp->tt_delack, tcp_delacktime,
tcp_timer_delack, tp);
@@ -1154,9 +1137,7 @@ after_listen:
} else
tp->t_flags &= ~TF_RCVD_CC;
tcpstat.tcps_connects++;
- SOCK_LOCK(so);
soisconnected(so);
- SOCK_UNLOCK(so);
/* Do window scaling on this connection? */
if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
(TF_RCVD_SCALE|TF_REQ_SCALE)) {
@@ -1486,16 +1467,13 @@ trimthenstep6:
* If new data are received on a connection after the
* user processes are gone, then RST the other end.
*/
- SOCK_LOCK(so);
if ((so->so_state & SS_NOFDREF) &&
tp->t_state > TCPS_CLOSE_WAIT && tlen) {
- SOCK_UNLOCK(so);
tp = tcp_close(tp);
tcpstat.tcps_rcvafterclose++;
rstreason = BANDLIM_UNLIMITED;
goto dropwithreset;
}
- SOCK_UNLOCK(so);
/*
* If segment ends after window, drop trailing data
@@ -1585,9 +1563,7 @@ trimthenstep6:
case TCPS_SYN_RECEIVED:
tcpstat.tcps_connects++;
- SOCK_LOCK(so);
soisconnected(so);
- SOCK_UNLOCK(so);
/* Do window scaling? */
if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
(TF_RCVD_SCALE|TF_REQ_SCALE)) {
@@ -1846,9 +1822,7 @@ process_ACK:
tp->snd_wnd -= acked;
ourfinisacked = 0;
}
- SOCK_LOCK(so);
sowwakeup(so);
- SOCK_UNLOCK(so);
tp->snd_una = th->th_ack;
if (SEQ_LT(tp->snd_nxt, tp->snd_una))
tp->snd_nxt = tp->snd_una;
@@ -1869,14 +1843,11 @@ process_ACK:
* specification, but if we don't get a FIN
* we'll hang forever.
*/
- SOCK_LOCK(so);
if (so->so_state & SS_CANTRCVMORE) {
- soisdisconnected(so);
- SOCK_UNLOCK(so);
+ soisdisconnected_locked(so);
callout_reset(tp->tt_2msl, tcp_maxidle,
tcp_timer_2msl, tp);
- } else
- SOCK_UNLOCK(so);
+ }
tp->t_state = TCPS_FIN_WAIT_2;
}
break;
@@ -1901,9 +1872,7 @@ process_ACK:
else
callout_reset(tp->tt_2msl, 2 * tcp_msl,
tcp_timer_2msl, tp);
- SOCK_LOCK(so);
soisdisconnected(so);
- SOCK_UNLOCK(so);
}
break;
@@ -1987,11 +1956,8 @@ step6:
tp->rcv_up = th->th_seq + th->th_urp;
so->so_oobmark = so->so_rcv.sb_cc +
(tp->rcv_up - tp->rcv_nxt) - 1;
- if (so->so_oobmark == 0) {
- SOCK_LOCK(so);
+ if (so->so_oobmark == 0)
so->so_state |= SS_RCVATMARK;
- SOCK_UNLOCK(so);
- }
sohasoutofband(so);
tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA);
}
@@ -2001,19 +1967,13 @@ step6:
* but if two URG's are pending at once, some out-of-band
* data may creep in... ick.
*/
- if (th->th_urp <= (u_long)tlen) {
+ if (th->th_urp <= (u_long)tlen
#ifdef SO_OOBINLINE
- SOCK_LOCK(so);
- if ((so->so_options & SO_OOBINLINE) == 0) {
- SOCK_UNLOCK(so);
+ && (so->so_options & SO_OOBINLINE) == 0
#endif
- tcp_pulloutofband(so, th, m,
- drop_hdrlen); /* hdr drop is delayed */
-#ifdef SO_OOBINLINE
- } else
- SOCK_UNLOCK(so);
-#endif
- }
+ )
+ tcp_pulloutofband(so, th, m,
+ drop_hdrlen); /* hdr drop is delayed */
} else
/*
* If no out of band data is expected,
@@ -2059,9 +2019,7 @@ dodata: /* XXX */
tcpstat.tcps_rcvbyte += tlen;
ND6_HINT(tp);
sbappend(&so->so_rcv, m);
- SOCK_LOCK(so);
sorwakeup(so);
- SOCK_UNLOCK(so);
} else {
thflags = tcp_reass(tp, th, &tlen, m);
tp->t_flags |= TF_ACKNOW;
@@ -2140,9 +2098,7 @@ dodata: /* XXX */
else
callout_reset(tp->tt_2msl, 2 * tcp_msl,
tcp_timer_2msl, tp);
- SOCK_LOCK(so);
soisdisconnected(so);
- SOCK_UNLOCK(so);
break;
/*
@@ -2155,13 +2111,9 @@ dodata: /* XXX */
}
}
#ifdef TCPDEBUG
- SOCK_LOCK(so);
- if (so->so_options & SO_DEBUG) {
- SOCK_UNLOCK(so);
+ if (so->so_options & SO_DEBUG)
tcp_trace(TA_INPUT, ostate, tp, (void *)tcp_saveipgen,
&tcp_savetcp, 0);
- } else
- SOCK_UNLOCK(so);
#endif
/*
@@ -2194,13 +2146,9 @@ dropafterack:
goto dropwithreset;
}
#ifdef TCPDEBUG
- SOCK_LOCK(so);
- if (so->so_options & SO_DEBUG) {
- SOCK_UNLOCK(so);
+ if (so->so_options & SO_DEBUG)
tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
&tcp_savetcp, 0);
- } else
- SOCK_UNLOCK(so);
#endif
m_freem(m);
tp->t_flags |= TF_ACKNOW;
@@ -2236,18 +2184,9 @@ dropwithreset:
goto drop;
#ifdef TCPDEBUG
- if (tp == 0)
+ if (tp == 0 || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
&tcp_savetcp, 0);
- else {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if ((tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
- &tcp_savetcp, 0);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- }
#endif
if (thflags & TH_ACK)
/* mtod() below is safe as long as hdr dropping is delayed */
@@ -2267,18 +2206,9 @@ drop:
* Drop space held by incoming segment and return.
*/
#ifdef TCPDEBUG
- if (tp == 0)
+ if (tp == 0 || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
&tcp_savetcp, 0);
- else {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if ((tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
- &tcp_savetcp, 0);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- }
#endif
m_freem(m);
return;
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 20d3bf55bae6..13d8300cb862 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -469,16 +469,8 @@ tcp_respond(tp, ipgen, th, m, ack, seq, flags)
m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum);
}
#ifdef TCPDEBUG
- if (tp == NULL)
+ if (tp == NULL || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
tcp_trace(TA_OUTPUT, 0, tp, mtod(m, void *), th, 0);
- else {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if ((tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- tcp_trace(TA_OUTPUT, 0, tp, mtod(m, void *), th, 0);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- }
#endif
#ifdef IPSEC
if (ipsec_setsocket(m, tp ? tp->t_inpcb->inp_socket : NULL) != 0) {
@@ -728,9 +720,7 @@ tcp_close(tp)
FREE(q, M_TSEGQ);
}
inp->inp_ppcb = NULL;
- SOCK_LOCK(so);
soisdisconnected(so);
- SOCK_UNLOCK(so);
#ifdef INET6
if (INP_CHECK_SOCKAF(so, AF_INET6))
in6_pcbdetach(inp);
@@ -803,11 +793,9 @@ tcp_notify(inp, error)
else
tp->t_softerror = error;
#if 0
- SOCK_LOCK(so);
wakeup((caddr_t) &so->so_timeo);
sorwakeup(so);
sowwakeup(so);
- SOCK_UNLOCK(so);
#endif
}
diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c
index 5ee54cfbf901..087e243a513e 100644
--- a/sys/netinet/tcp_timer.c
+++ b/sys/netinet/tcp_timer.c
@@ -39,15 +39,13 @@
#include "opt_tcpdebug.h"
#include <sys/param.h>
+#include <sys/systm.h>
#include <sys/kernel.h>
-#include <sys/lock.h>
#include <sys/mbuf.h>
-#include <sys/mutex.h>
-#include <sys/protosw.h>
+#include <sys/sysctl.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
-#include <sys/sysctl.h>
-#include <sys/systm.h>
+#include <sys/protosw.h>
#include <machine/cpu.h> /* before tcp_seq.h, for tcp_random18() */
@@ -213,15 +211,9 @@ tcp_timer_2msl(xtp)
tp = tcp_close(tp);
#ifdef TCPDEBUG
- if (tp != 0) {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if ((tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
- PRU_SLOWTIMO);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- }
+ if (tp && (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
+ tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
+ PRU_SLOWTIMO);
#endif
splx(s);
}
@@ -251,11 +243,9 @@ tcp_timer_keep(xtp)
tcpstat.tcps_keeptimeo++;
if (tp->t_state < TCPS_ESTABLISHED)
goto dropit;
- SOCK_LOCK(tp->t_inpcb->inp_socket);
if ((always_keepalive ||
tp->t_inpcb->inp_socket->so_options & SO_KEEPALIVE) &&
tp->t_state <= TCPS_CLOSING) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
if ((ticks - tp->t_rcvtime) >= tcp_keepidle + tcp_maxidle)
goto dropit;
/*
@@ -279,19 +269,13 @@ tcp_timer_keep(xtp)
(void) m_free(dtom(t_template));
}
callout_reset(tp->tt_keep, tcp_keepintvl, tcp_timer_keep, tp);
- } else {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
+ } else
callout_reset(tp->tt_keep, tcp_keepidle, tcp_timer_keep, tp);
- }
#ifdef TCPDEBUG
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if (tp->t_inpcb->inp_socket->so_options & SO_DEBUG) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
+ if (tp->t_inpcb->inp_socket->so_options & SO_DEBUG)
tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
PRU_SLOWTIMO);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
#endif
splx(s);
return;
@@ -301,15 +285,9 @@ dropit:
tp = tcp_drop(tp, ETIMEDOUT);
#ifdef TCPDEBUG
- if (tp != 0) {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if ((tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
- PRU_SLOWTIMO);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- }
+ if (tp && (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
+ tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
+ PRU_SLOWTIMO);
#endif
splx(s);
}
@@ -357,15 +335,9 @@ tcp_timer_persist(xtp)
out:
#ifdef TCPDEBUG
- if (tp != 0) {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if (tp->t_inpcb->inp_socket->so_options & SO_DEBUG) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
- PRU_SLOWTIMO);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- }
+ if (tp && tp->t_inpcb->inp_socket->so_options & SO_DEBUG)
+ tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
+ PRU_SLOWTIMO);
#endif
splx(s);
}
@@ -498,15 +470,9 @@ tcp_timer_rexmt(xtp)
out:
#ifdef TCPDEBUG
- if (tp != 0) {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if ((tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
- PRU_SLOWTIMO);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- }
+ if (tp && (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
+ tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
+ PRU_SLOWTIMO);
#endif
splx(s);
}
diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c
index 20d3bf55bae6..13d8300cb862 100644
--- a/sys/netinet/tcp_timewait.c
+++ b/sys/netinet/tcp_timewait.c
@@ -469,16 +469,8 @@ tcp_respond(tp, ipgen, th, m, ack, seq, flags)
m->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum);
}
#ifdef TCPDEBUG
- if (tp == NULL)
+ if (tp == NULL || (tp->t_inpcb->inp_socket->so_options & SO_DEBUG))
tcp_trace(TA_OUTPUT, 0, tp, mtod(m, void *), th, 0);
- else {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
- if ((tp->t_inpcb->inp_socket->so_options & SO_DEBUG)) {
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- tcp_trace(TA_OUTPUT, 0, tp, mtod(m, void *), th, 0);
- } else
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
- }
#endif
#ifdef IPSEC
if (ipsec_setsocket(m, tp ? tp->t_inpcb->inp_socket : NULL) != 0) {
@@ -728,9 +720,7 @@ tcp_close(tp)
FREE(q, M_TSEGQ);
}
inp->inp_ppcb = NULL;
- SOCK_LOCK(so);
soisdisconnected(so);
- SOCK_UNLOCK(so);
#ifdef INET6
if (INP_CHECK_SOCKAF(so, AF_INET6))
in6_pcbdetach(inp);
@@ -803,11 +793,9 @@ tcp_notify(inp, error)
else
tp->t_softerror = error;
#if 0
- SOCK_LOCK(so);
wakeup((caddr_t) &so->so_timeo);
sorwakeup(so);
sowwakeup(so);
- SOCK_UNLOCK(so);
#endif
}
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index 5d8934cbffc0..e1f4c1a8a9e5 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -103,17 +103,8 @@ static struct tcpcb *
#ifdef TCPDEBUG
#define TCPDEBUG0 int ostate = 0
#define TCPDEBUG1() ostate = tp ? tp->t_state : 0
-#define TCPDEBUG2(req) \
- do { \
- if (tp != 0) { \
- SOCK_LOCK(so); \
- if (so->so_options & SO_DEBUG) { \
- SOCK_UNLOCK(so); \
- tcp_trace(TA_USER, ostate, tp, 0, 0, req); \
- } else \
- SOCK_UNLOCK(so); \
- } \
- } while(0)
+#define TCPDEBUG2(req) if (tp && (so->so_options & SO_DEBUG)) \
+ tcp_trace(TA_USER, ostate, tp, 0, 0, req)
#else
#define TCPDEBUG0
#define TCPDEBUG1()
@@ -143,10 +134,8 @@ tcp_usr_attach(struct socket *so, int proto, struct thread *td)
if (error)
goto out;
- SOCK_LOCK(so);
if ((so->so_options & SO_LINGER) && so->so_linger == 0)
so->so_linger = TCP_LINGERTIME;
- SOCK_UNLOCK(so);
tp = sototcpcb(so);
out:
TCPDEBUG2(PRU_ATTACH);
@@ -435,13 +424,10 @@ tcp_usr_accept(struct socket *so, struct sockaddr **nam)
struct tcpcb *tp = NULL;
TCPDEBUG0;
- SOCK_LOCK(so);
if (so->so_state & SS_ISDISCONNECTED) {
- SOCK_UNLOCK(so);
error = ECONNABORTED;
goto out;
}
- SOCK_UNLOCK(so);
if (inp == 0) {
splx(s);
return (EINVAL);
@@ -462,13 +448,10 @@ tcp6_usr_accept(struct socket *so, struct sockaddr **nam)
struct tcpcb *tp = NULL;
TCPDEBUG0;
- SOCK_LOCK(so);
if (so->so_state & SS_ISDISCONNECTED) {
- SOCK_UNLOCK(so);
error = ECONNABORTED;
goto out;
}
- SOCK_UNLOCK(so);
if (inp == 0) {
splx(s);
return (EINVAL);
@@ -671,16 +654,10 @@ tcp_usr_rcvoob(struct socket *so, struct mbuf *m, int flags)
struct tcpcb *tp;
COMMON_START();
- SOCK_LOCK(so);
if ((so->so_oobmark == 0 &&
(so->so_state & SS_RCVATMARK) == 0) ||
- so->so_options & SO_OOBINLINE) {
- SOCK_UNLOCK(so);
- error = EINVAL;
- goto out;
- }
- SOCK_UNLOCK(so);
- if (tp->t_oobflags & TCPOOB_HADDATA) {
+ so->so_options & SO_OOBINLINE ||
+ tp->t_oobflags & TCPOOB_HADDATA) {
error = EINVAL;
goto out;
}
@@ -778,9 +755,7 @@ tcp_connect(tp, nam, td)
(TCP_MAXWIN << tp->request_r_scale) < so->so_rcv.sb_hiwat)
tp->request_r_scale++;
- SOCK_LOCK(so);
soisconnecting(so);
- SOCK_UNLOCK(so);
tcpstat.tcps_connattempt++;
tp->t_state = TCPS_SYN_SENT;
callout_reset(tp->tt_keep, tcp_keepinit, tcp_timer_keep, tp);
@@ -866,9 +841,7 @@ tcp6_connect(tp, nam, td)
(TCP_MAXWIN << tp->request_r_scale) < so->so_rcv.sb_hiwat)
tp->request_r_scale++;
- SOCK_LOCK(so);
soisconnecting(so);
- SOCK_UNLOCK(so);
tcpstat.tcps_connattempt++;
tp->t_state = TCPS_SYN_SENT;
callout_reset(tp->tt_keep, tcp_keepinit, tcp_timer_keep, tp);
@@ -1066,21 +1039,16 @@ tcp_attach(so, td)
inp->inp_vflag |= INP_IPV4;
tp = tcp_newtcpcb(inp);
if (tp == 0) {
- int nofd;
+ int nofd = so->so_state & SS_NOFDREF; /* XXX */
- SOCK_LOCK(so);
- nofd = so->so_state & SS_NOFDREF; /* XXX */
so->so_state &= ~SS_NOFDREF; /* don't free the socket yet */
- SOCK_UNLOCK(so);
#ifdef INET6
if (isipv6)
in6_pcbdetach(inp);
else
#endif
in_pcbdetach(inp);
- SOCK_LOCK(so);
so->so_state |= nofd;
- SOCK_UNLOCK(so);
return (ENOBUFS);
}
tp->t_state = TCPS_CLOSED;
@@ -1103,19 +1071,14 @@ tcp_disconnect(tp)
if (tp->t_state < TCPS_ESTABLISHED)
tp = tcp_close(tp);
+ else if ((so->so_options & SO_LINGER) && so->so_linger == 0)
+ tp = tcp_drop(tp, 0);
else {
- SOCK_LOCK(so);
- if ((so->so_options & SO_LINGER) && so->so_linger == 0) {
- SOCK_UNLOCK(so);
- tp = tcp_drop(tp, 0);
- } else {
- soisdisconnecting(so);
- SOCK_UNLOCK(so);
- sbflush(&so->so_rcv);
- tp = tcp_usrclosed(tp);
- if (tp)
- (void) tcp_output(tp);
- }
+ soisdisconnecting(so);
+ sbflush(&so->so_rcv);
+ tp = tcp_usrclosed(tp);
+ if (tp)
+ (void) tcp_output(tp);
}
return (tp);
}
@@ -1157,9 +1120,7 @@ tcp_usrclosed(tp)
break;
}
if (tp && tp->t_state >= TCPS_FIN_WAIT_2) {
- SOCK_LOCK(tp->t_inpcb->inp_socket);
soisdisconnected(tp->t_inpcb->inp_socket);
- SOCK_UNLOCK(tp->t_inpcb->inp_socket);
/* To prevent the connection hanging in FIN_WAIT_2 forever. */
if (tp->t_state == TCPS_FIN_WAIT_2)
callout_reset(tp->tt_2msl, tcp_maxidle,
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index 152296669775..af4769fd0d5c 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -319,12 +319,8 @@ udp_input(m, off)
* port. It * assumes that an application will never
* clear these options after setting them.
*/
- SOCK_LOCK(last->inp_socket);
- if ((last->inp_socket->so_options&(SO_REUSEPORT|SO_REUSEADDR)) == 0) {
- SOCK_UNLOCK(last->inp_socket);
+ if ((last->inp_socket->so_options&(SO_REUSEPORT|SO_REUSEADDR)) == 0)
break;
- } else
- SOCK_UNLOCK(last->inp_socket);
}
if (last == NULL) {
@@ -388,10 +384,8 @@ udp_input(m, off)
*/
udp_in.sin_port = uh->uh_sport;
udp_in.sin_addr = ip->ip_src;
- SOCK_LOCK(inp->inp_socket);
if (inp->inp_flags & INP_CONTROLOPTS
|| inp->inp_socket->so_options & SO_TIMESTAMP) {
- SOCK_UNLOCK(inp->inp_socket);
#ifdef INET6
if (inp->inp_vflag & INP_IPV6) {
int savedflags;
@@ -404,8 +398,7 @@ udp_input(m, off)
} else
#endif
ip_savecontrol(inp, &opts, ip, m);
- } else
- SOCK_UNLOCK(inp->inp_socket);
+ }
m_adj(m, iphlen + sizeof(struct udphdr));
#ifdef INET6
if (inp->inp_vflag & INP_IPV6) {
@@ -418,9 +411,7 @@ udp_input(m, off)
udpstat.udps_fullsock++;
goto bad;
}
- SOCK_LOCK(inp->inp_socket);
sorwakeup(inp->inp_socket);
- SOCK_UNLOCK(inp->inp_socket);
return;
bad:
m_freem(m);
@@ -462,10 +453,8 @@ udp_append(last, ip, n, off)
struct sockaddr *append_sa;
struct mbuf *opts = 0;
- SOCK_LOCK(last->inp_socket);
if (last->inp_flags & INP_CONTROLOPTS ||
last->inp_socket->so_options & SO_TIMESTAMP) {
- SOCK_UNLOCK(last->inp_socket);
#ifdef INET6
if (last->inp_vflag & INP_IPV6) {
int savedflags;
@@ -481,8 +470,7 @@ udp_append(last, ip, n, off)
} else
#endif
ip_savecontrol(last, &opts, ip, n);
- } else
- SOCK_UNLOCK(last->inp_socket);
+ }
#ifdef INET6
if (last->inp_vflag & INP_IPV6) {
if (udp_in6.uin6_init_done == 0) {
@@ -499,11 +487,8 @@ udp_append(last, ip, n, off)
if (opts)
m_freem(opts);
udpstat.udps_fullsock++;
- } else {
- SOCK_LOCK(last->inp_socket);
+ } else
sorwakeup(last->inp_socket);
- SOCK_UNLOCK(last->inp_socket);
- }
}
/*
@@ -516,10 +501,8 @@ udp_notify(inp, errno)
int errno;
{
inp->inp_socket->so_error = errno;
- SOCK_LOCK(inp->inp_socket);
sorwakeup(inp->inp_socket);
sowwakeup(inp->inp_socket);
- SOCK_UNLOCK(inp->inp_socket);
}
void
@@ -695,7 +678,7 @@ udp_output(inp, m, addr, control, td)
register int len = m->m_pkthdr.len;
struct in_addr laddr;
struct sockaddr_in *sin;
- int s = 0, error = 0, soopts;
+ int s = 0, error = 0;
if (control)
m_freem(control); /* XXX */
@@ -776,11 +759,8 @@ udp_output(inp, m, addr, control, td)
goto release;
}
#endif /*IPSEC*/
- SOCK_LOCK(inp->inp_socket);
- soopts = inp->inp_socket->so_options & (SO_DONTROUTE | SO_BROADCAST);
- SOCK_UNLOCK(inp->inp_socket);
error = ip_output(m, inp->inp_options, &inp->inp_route,
- soopts,
+ (inp->inp_socket->so_options & (SO_DONTROUTE | SO_BROADCAST)),
inp->inp_moptions);
if (addr) {
@@ -819,9 +799,7 @@ udp_abort(struct socket *so)
inp = sotoinpcb(so);
if (inp == 0)
return EINVAL; /* ??? possible? panic instead? */
- SOCK_LOCK(so);
soisdisconnected(so);
- SOCK_UNLOCK(so);
s = splnet();
in_pcbdetach(inp);
splx(s);
@@ -886,11 +864,8 @@ udp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
prison_remote_ip(td->td_ucred, 0, &sin->sin_addr.s_addr);
error = in_pcbconnect(inp, nam, td);
splx(s);
- if (error == 0) {
- SOCK_LOCK(so);
+ if (error == 0)
soisconnected(so);
- SOCK_UNLOCK(so);
- }
return error;
}
@@ -925,9 +900,7 @@ udp_disconnect(struct socket *so)
in_pcbdisconnect(inp);
inp->inp_laddr.s_addr = INADDR_ANY;
splx(s);
- SOCK_LOCK(so);
so->so_state &= ~SS_ISCONNECTED; /* XXX */
- SOCK_UNLOCK(so);
return 0;
}