summaryrefslogtreecommitdiffstats
path: root/sys/netinet/tcp_input.c
diff options
context:
space:
mode:
authortanimura <tanimura@FreeBSD.org>2002-05-31 11:52:35 +0000
committertanimura <tanimura@FreeBSD.org>2002-05-31 11:52:35 +0000
commite6fa9b9e922913444c2e6b2b58bf3de5eaed868d (patch)
tree9d5f24794525313566896ab89aa860515db344a6 /sys/netinet/tcp_input.c
parent1ea6cbb8c29088e04528460633798a6c131ca1ba (diff)
downloadFreeBSD-src-e6fa9b9e922913444c2e6b2b58bf3de5eaed868d.zip
FreeBSD-src-e6fa9b9e922913444c2e6b2b58bf3de5eaed868d.tar.gz
Back out my lats commit of locking down a socket, it conflicts with hsu's work.
Requested by: hsu
Diffstat (limited to 'sys/netinet/tcp_input.c')
-rw-r--r--sys/netinet/tcp_input.c102
1 files changed, 16 insertions, 86 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index b5c6daf..b193327 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;
OpenPOWER on IntegriCloud