projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
clean up some stuff; fix problem with lost mbufs
[unix-history]
/
usr
/
src
/
sys
/
netinet
/
tcp_input.c
diff --git
a/usr/src/sys/netinet/tcp_input.c
b/usr/src/sys/netinet/tcp_input.c
index
64c1e62
..
c85c244
100644
(file)
--- a/
usr/src/sys/netinet/tcp_input.c
+++ b/
usr/src/sys/netinet/tcp_input.c
@@
-1,4
+1,4
@@
-/* tcp_input.c 1.
76 82/10/09
*/
+/* tcp_input.c 1.
85 83/01/04
*/
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
@@
-24,7
+24,6
@@
int tcpprintfs = 0;
int tcpcksum = 1;
int tcpprintfs = 0;
int tcpcksum = 1;
-struct mbuf tcp_mb;
struct tcpiphdr tcp_saveti;
extern tcpnodelack;
struct tcpiphdr tcp_saveti;
extern tcpnodelack;
@@
-73,9
+72,7
@@
tcp_input(m0)
ti->ti_next = ti->ti_prev = 0;
ti->ti_x1 = 0;
ti->ti_len = (u_short)tlen;
ti->ti_next = ti->ti_prev = 0;
ti->ti_x1 = 0;
ti->ti_len = (u_short)tlen;
-#if vax || pdp11
ti->ti_len = htons((u_short)ti->ti_len);
ti->ti_len = htons((u_short)ti->ti_len);
-#endif
if (ti->ti_sum = in_cksum(m, len)) {
tcpstat.tcps_badsum++;
if (tcpprintfs)
if (ti->ti_sum = in_cksum(m, len)) {
tcpstat.tcps_badsum++;
if (tcpprintfs)
@@
-101,7
+98,7
@@
tcp_input(m0)
goto drop;
}
ti = mtod(m, struct tcpiphdr *);
goto drop;
}
ti = mtod(m, struct tcpiphdr *);
- om = m_get(M_DONTWAIT);
+ om = m_get(M_DONTWAIT
, MT_DATA
);
if (om == 0)
goto drop;
om->m_len = off - sizeof (struct tcphdr);
if (om == 0)
goto drop;
om->m_len = off - sizeof (struct tcphdr);
@@
-121,7
+118,6
@@
tcp_input(m0)
m->m_off += off;
m->m_len -= off;
m->m_off += off;
m->m_len -= off;
-#if vax || pdp11
/*
* Convert TCP protocol specific fields to host format.
*/
/*
* Convert TCP protocol specific fields to host format.
*/
@@
-129,7
+125,6
@@
tcp_input(m0)
ti->ti_ack = ntohl(ti->ti_ack);
ti->ti_win = ntohs(ti->ti_win);
ti->ti_urp = ntohs(ti->ti_urp);
ti->ti_ack = ntohl(ti->ti_ack);
ti->ti_win = ntohs(ti->ti_win);
ti->ti_urp = ntohs(ti->ti_urp);
-#endif
/*
* Locate pcb for segment.
/*
* Locate pcb for segment.
@@
-201,31
+196,32
@@
tcp_input(m0)
* segment in this state.
*/
case TCPS_LISTEN: {
* segment in this state.
*/
case TCPS_LISTEN: {
- struct mbuf *
m = m_get(M_DONTWAIT)
;
+ struct mbuf *
am
;
register struct sockaddr_in *sin;
register struct sockaddr_in *sin;
- if (m == 0)
- goto drop;
- m->m_len = sizeof (struct sockaddr_in);
if (tiflags & TH_RST)
goto drop;
if (tiflags & TH_ACK)
goto dropwithreset;
if ((tiflags & TH_SYN) == 0)
goto drop;
if (tiflags & TH_RST)
goto drop;
if (tiflags & TH_ACK)
goto dropwithreset;
if ((tiflags & TH_SYN) == 0)
goto drop;
- sin = mtod(m, struct sockaddr_in *);
+ am = m_get(M_DONTWAIT, MT_SONAME);
+ if (am == NULL)
+ goto drop;
+ am->m_len = sizeof (struct sockaddr_in);
+ sin = mtod(am, struct sockaddr_in *);
sin->sin_family = AF_INET;
sin->sin_addr = ti->ti_src;
sin->sin_port = ti->ti_sport;
laddr = inp->inp_laddr;
sin->sin_family = AF_INET;
sin->sin_addr = ti->ti_src;
sin->sin_port = ti->ti_sport;
laddr = inp->inp_laddr;
- if (inp->inp_laddr.s_addr ==
0
)
+ if (inp->inp_laddr.s_addr ==
INADDR_ANY
)
inp->inp_laddr = ti->ti_dst;
inp->inp_laddr = ti->ti_dst;
- if (in_pcbconnect(inp, m)) {
+ if (in_pcbconnect(inp,
a
m)) {
inp->inp_laddr = laddr;
inp->inp_laddr = laddr;
-
m_free(
m);
+
(void) m_free(a
m);
goto drop;
}
goto drop;
}
-
m_free(
m);
+
(void) m_free(a
m);
tp->t_template = tcp_template(tp);
if (tp->t_template == 0) {
in_pcbdisconnect(inp);
tp->t_template = tcp_template(tp);
if (tp->t_template == 0) {
in_pcbdisconnect(inp);
@@
-365,10
+361,10
@@
trimthenstep6:
}
/*
}
/*
- * If
a segment
is received on a connection after the
+ * If
data
is received on a connection after the
* user processes are gone, then RST the other end.
*/
* user processes are gone, then RST the other end.
*/
- if (
so->so_state & SS_NOFDREF
) {
+ if (
(so->so_state & SS_NOFDREF) && ti->ti_len
) {
tcp_close(tp);
tp = 0;
goto dropwithreset;
tcp_close(tp);
tp = 0;
goto dropwithreset;
@@
-481,7
+477,6
@@
trimthenstep6:
tp->t_srtt =
tcp_alpha * tp->t_srtt +
(1 - tcp_alpha) * tp->t_rtt;
tp->t_srtt =
tcp_alpha * tp->t_srtt +
(1 - tcp_alpha) * tp->t_rtt;
-/* printf("rtt %d srtt*100 now %d\n", tp->t_rtt, (int)(tp->t_srtt*100)); */
tp->t_rtt = 0;
}
tp->t_rtt = 0;
}
@@
-576,7
+571,7
@@
step6:
tp->snd_wnd = ti->ti_win;
tp->snd_wl1 = ti->ti_seq;
tp->snd_wl2 = ti->ti_ack;
tp->snd_wnd = ti->ti_win;
tp->snd_wl1 = ti->ti_seq;
tp->snd_wl2 = ti->ti_ack;
- if (tp->snd_wnd
>
0)
+ if (tp->snd_wnd
!=
0)
tp->t_timer[TCPT_PERSIST] = 0;
}
tp->t_timer[TCPT_PERSIST] = 0;
}
@@
-757,9
+752,7
@@
tcp_dooptions(tp, om)
if (optlen != 4)
continue;
tp->t_maxseg = *(u_short *)(cp + 2);
if (optlen != 4)
continue;
tp->t_maxseg = *(u_short *)(cp + 2);
-#if vax || pdp11
tp->t_maxseg = ntohs((u_short)tp->t_maxseg);
tp->t_maxseg = ntohs((u_short)tp->t_maxseg);
-#endif
break;
}
}
break;
}
}