diff options
| author | Seigo Tanimura <tanimura@FreeBSD.org> | 2002-05-31 11:52:35 +0000 |
|---|---|---|
| committer | Seigo Tanimura <tanimura@FreeBSD.org> | 2002-05-31 11:52:35 +0000 |
| commit | 4cc20ab1f0f3d1126126327aa298ab88c974c53d (patch) | |
| tree | 9d5f24794525313566896ab89aa860515db344a6 /sys/netinet | |
| parent | c82593cf2c9a5b4ccd2be043f6c9ccc8af22fcc9 (diff) | |
Notes
Diffstat (limited to 'sys/netinet')
| -rw-r--r-- | sys/netinet/accf_data.c | 10 | ||||
| -rw-r--r-- | sys/netinet/accf_http.c | 31 | ||||
| -rw-r--r-- | sys/netinet/in_pcb.c | 77 | ||||
| -rw-r--r-- | sys/netinet/ip_divert.c | 21 | ||||
| -rw-r--r-- | sys/netinet/ip_input.c | 5 | ||||
| -rw-r--r-- | sys/netinet/ip_mroute.c | 2 | ||||
| -rw-r--r-- | sys/netinet/raw_ip.c | 52 | ||||
| -rw-r--r-- | sys/netinet/tcp_input.c | 102 | ||||
| -rw-r--r-- | sys/netinet/tcp_output.c | 17 | ||||
| -rw-r--r-- | sys/netinet/tcp_reass.c | 102 | ||||
| -rw-r--r-- | sys/netinet/tcp_subr.c | 14 | ||||
| -rw-r--r-- | sys/netinet/tcp_timer.c | 68 | ||||
| -rw-r--r-- | sys/netinet/tcp_timewait.c | 14 | ||||
| -rw-r--r-- | sys/netinet/tcp_usrreq.c | 63 | ||||
| -rw-r--r-- | sys/netinet/udp_usrreq.c | 41 |
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; } |
