Revision 31a60e22 slirp/tcp_input.c
b/slirp/tcp_input.c | ||
---|---|---|
79 | 79 |
tp->t_flags |= TF_DELACK; \ |
80 | 80 |
(tp)->rcv_nxt += (ti)->ti_len; \ |
81 | 81 |
flags = (ti)->ti_flags & TH_FIN; \ |
82 |
tcpstat.tcps_rcvpack++;\
|
|
83 |
tcpstat.tcps_rcvbyte += (ti)->ti_len;\
|
|
82 |
STAT(tcpstat.tcps_rcvpack++); \
|
|
83 |
STAT(tcpstat.tcps_rcvbyte += (ti)->ti_len); \
|
|
84 | 84 |
if (so->so_emu) { \ |
85 | 85 |
if (tcp_emu((so),(m))) sbappend((so), (m)); \ |
86 | 86 |
} else \ |
... | ... | |
99 | 99 |
tp->t_flags |= TF_DELACK; \ |
100 | 100 |
(tp)->rcv_nxt += (ti)->ti_len; \ |
101 | 101 |
flags = (ti)->ti_flags & TH_FIN; \ |
102 |
tcpstat.tcps_rcvpack++;\
|
|
103 |
tcpstat.tcps_rcvbyte += (ti)->ti_len;\
|
|
102 |
STAT(tcpstat.tcps_rcvpack++); \
|
|
103 |
STAT(tcpstat.tcps_rcvbyte += (ti)->ti_len); \
|
|
104 | 104 |
if (so->so_emu) { \ |
105 | 105 |
if (tcp_emu((so),(m))) sbappend(so, (m)); \ |
106 | 106 |
} else \ |
... | ... | |
150 | 150 |
i = q->ti_seq + q->ti_len - ti->ti_seq; |
151 | 151 |
if (i > 0) { |
152 | 152 |
if (i >= ti->ti_len) { |
153 |
tcpstat.tcps_rcvduppack++;
|
|
154 |
tcpstat.tcps_rcvdupbyte += ti->ti_len;
|
|
153 |
STAT(tcpstat.tcps_rcvduppack++);
|
|
154 |
STAT(tcpstat.tcps_rcvdupbyte += ti->ti_len);
|
|
155 | 155 |
m_freem(m); |
156 | 156 |
/* |
157 | 157 |
* Try to present any queued data |
... | ... | |
167 | 167 |
} |
168 | 168 |
q = (struct tcpiphdr *)(q->ti_next); |
169 | 169 |
} |
170 |
tcpstat.tcps_rcvoopack++;
|
|
171 |
tcpstat.tcps_rcvoobyte += ti->ti_len;
|
|
170 |
STAT(tcpstat.tcps_rcvoopack++);
|
|
171 |
STAT(tcpstat.tcps_rcvoobyte += ti->ti_len);
|
|
172 | 172 |
REASS_MBUF(ti) = (mbufp_32) m; /* XXX */ |
173 | 173 |
|
174 | 174 |
/* |
... | ... | |
275 | 275 |
} |
276 | 276 |
|
277 | 277 |
|
278 |
tcpstat.tcps_rcvtotal++;
|
|
278 |
STAT(tcpstat.tcps_rcvtotal++);
|
|
279 | 279 |
/* |
280 | 280 |
* Get IP and TCP header together in first mbuf. |
281 | 281 |
* Note: IP leaves IP header in first mbuf. |
... | ... | |
308 | 308 |
* ti->ti_sum = cksum(m, len); |
309 | 309 |
* if (ti->ti_sum) { */ |
310 | 310 |
if(cksum(m, len)) { |
311 |
tcpstat.tcps_rcvbadsum++;
|
|
311 |
STAT(tcpstat.tcps_rcvbadsum++);
|
|
312 | 312 |
goto drop; |
313 | 313 |
} |
314 | 314 |
|
... | ... | |
318 | 318 |
*/ |
319 | 319 |
off = ti->ti_off << 2; |
320 | 320 |
if (off < sizeof (struct tcphdr) || off > tlen) { |
321 |
tcpstat.tcps_rcvbadoff++;
|
|
321 |
STAT(tcpstat.tcps_rcvbadoff++);
|
|
322 | 322 |
goto drop; |
323 | 323 |
} |
324 | 324 |
tlen -= off; |
... | ... | |
375 | 375 |
ti->ti_dst, ti->ti_dport); |
376 | 376 |
if (so) |
377 | 377 |
tcp_last_so = so; |
378 |
++tcpstat.tcps_socachemiss;
|
|
378 |
STAT(tcpstat.tcps_socachemiss++);
|
|
379 | 379 |
} |
380 | 380 |
|
381 | 381 |
/* |
... | ... | |
503 | 503 |
/* |
504 | 504 |
* this is a pure ack for outstanding data. |
505 | 505 |
*/ |
506 |
++tcpstat.tcps_predack;
|
|
506 |
STAT(tcpstat.tcps_predack++);
|
|
507 | 507 |
/* if (ts_present) |
508 | 508 |
* tcp_xmit_timer(tp, tcp_now-ts_ecr+1); |
509 | 509 |
* else |
... | ... | |
511 | 511 |
SEQ_GT(ti->ti_ack, tp->t_rtseq)) |
512 | 512 |
tcp_xmit_timer(tp, tp->t_rtt); |
513 | 513 |
acked = ti->ti_ack - tp->snd_una; |
514 |
tcpstat.tcps_rcvackpack++;
|
|
515 |
tcpstat.tcps_rcvackbyte += acked;
|
|
514 |
STAT(tcpstat.tcps_rcvackpack++);
|
|
515 |
STAT(tcpstat.tcps_rcvackbyte += acked);
|
|
516 | 516 |
sbdrop(&so->so_snd, acked); |
517 | 517 |
tp->snd_una = ti->ti_ack; |
518 | 518 |
m_freem(m); |
... | ... | |
556 | 556 |
* with nothing on the reassembly queue and |
557 | 557 |
* we have enough buffer space to take it. |
558 | 558 |
*/ |
559 |
++tcpstat.tcps_preddat;
|
|
559 |
STAT(tcpstat.tcps_preddat++);
|
|
560 | 560 |
tp->rcv_nxt += ti->ti_len; |
561 |
tcpstat.tcps_rcvpack++;
|
|
562 |
tcpstat.tcps_rcvbyte += ti->ti_len;
|
|
561 |
STAT(tcpstat.tcps_rcvpack++);
|
|
562 |
STAT(tcpstat.tcps_rcvbyte += ti->ti_len);
|
|
563 | 563 |
/* |
564 | 564 |
* Add data to socket buffer. |
565 | 565 |
*/ |
... | ... | |
726 | 726 |
tp->t_flags |= TF_ACKNOW; |
727 | 727 |
tp->t_state = TCPS_SYN_RECEIVED; |
728 | 728 |
tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT; |
729 |
tcpstat.tcps_accepts++;
|
|
729 |
STAT(tcpstat.tcps_accepts++);
|
|
730 | 730 |
goto trimthenstep6; |
731 | 731 |
} /* case TCPS_LISTEN */ |
732 | 732 |
|
... | ... | |
767 | 767 |
tcp_rcvseqinit(tp); |
768 | 768 |
tp->t_flags |= TF_ACKNOW; |
769 | 769 |
if (tiflags & TH_ACK && SEQ_GT(tp->snd_una, tp->iss)) { |
770 |
tcpstat.tcps_connects++;
|
|
770 |
STAT(tcpstat.tcps_connects++);
|
|
771 | 771 |
soisfconnected(so); |
772 | 772 |
tp->t_state = TCPS_ESTABLISHED; |
773 | 773 |
|
... | ... | |
801 | 801 |
m_adj(m, -todrop); |
802 | 802 |
ti->ti_len = tp->rcv_wnd; |
803 | 803 |
tiflags &= ~TH_FIN; |
804 |
tcpstat.tcps_rcvpackafterwin++;
|
|
805 |
tcpstat.tcps_rcvbyteafterwin += todrop;
|
|
804 |
STAT(tcpstat.tcps_rcvpackafterwin++);
|
|
805 |
STAT(tcpstat.tcps_rcvbyteafterwin += todrop);
|
|
806 | 806 |
} |
807 | 807 |
tp->snd_wl1 = ti->ti_seq - 1; |
808 | 808 |
tp->rcv_up = ti->ti_seq; |
... | ... | |
873 | 873 |
*/ |
874 | 874 |
tp->t_flags |= TF_ACKNOW; |
875 | 875 |
todrop = ti->ti_len; |
876 |
tcpstat.tcps_rcvduppack++;
|
|
877 |
tcpstat.tcps_rcvdupbyte += todrop;
|
|
876 |
STAT(tcpstat.tcps_rcvduppack++);
|
|
877 |
STAT(tcpstat.tcps_rcvdupbyte += todrop);
|
|
878 | 878 |
} else { |
879 |
tcpstat.tcps_rcvpartduppack++;
|
|
880 |
tcpstat.tcps_rcvpartdupbyte += todrop;
|
|
879 |
STAT(tcpstat.tcps_rcvpartduppack++);
|
|
880 |
STAT(tcpstat.tcps_rcvpartdupbyte += todrop);
|
|
881 | 881 |
} |
882 | 882 |
m_adj(m, todrop); |
883 | 883 |
ti->ti_seq += todrop; |
... | ... | |
896 | 896 |
if ((so->so_state & SS_NOFDREF) && |
897 | 897 |
tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) { |
898 | 898 |
tp = tcp_close(tp); |
899 |
tcpstat.tcps_rcvafterclose++;
|
|
899 |
STAT(tcpstat.tcps_rcvafterclose++);
|
|
900 | 900 |
goto dropwithreset; |
901 | 901 |
} |
902 | 902 |
|
... | ... | |
906 | 906 |
*/ |
907 | 907 |
todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd); |
908 | 908 |
if (todrop > 0) { |
909 |
tcpstat.tcps_rcvpackafterwin++;
|
|
909 |
STAT(tcpstat.tcps_rcvpackafterwin++);
|
|
910 | 910 |
if (todrop >= ti->ti_len) { |
911 |
tcpstat.tcps_rcvbyteafterwin += ti->ti_len;
|
|
911 |
STAT(tcpstat.tcps_rcvbyteafterwin += ti->ti_len);
|
|
912 | 912 |
/* |
913 | 913 |
* If a new connection request is received |
914 | 914 |
* while in TIME_WAIT, drop the old connection |
... | ... | |
931 | 931 |
*/ |
932 | 932 |
if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) { |
933 | 933 |
tp->t_flags |= TF_ACKNOW; |
934 |
tcpstat.tcps_rcvwinprobe++;
|
|
934 |
STAT(tcpstat.tcps_rcvwinprobe++);
|
|
935 | 935 |
} else |
936 | 936 |
goto dropafterack; |
937 | 937 |
} else |
938 |
tcpstat.tcps_rcvbyteafterwin += todrop;
|
|
938 |
STAT(tcpstat.tcps_rcvbyteafterwin += todrop);
|
|
939 | 939 |
m_adj(m, -todrop); |
940 | 940 |
ti->ti_len -= todrop; |
941 | 941 |
tiflags &= ~(TH_PUSH|TH_FIN); |
... | ... | |
976 | 976 |
/* so->so_error = ECONNRESET; */ |
977 | 977 |
close: |
978 | 978 |
tp->t_state = TCPS_CLOSED; |
979 |
tcpstat.tcps_drops++;
|
|
979 |
STAT(tcpstat.tcps_drops++);
|
|
980 | 980 |
tp = tcp_close(tp); |
981 | 981 |
goto drop; |
982 | 982 |
|
... | ... | |
1015 | 1015 |
if (SEQ_GT(tp->snd_una, ti->ti_ack) || |
1016 | 1016 |
SEQ_GT(ti->ti_ack, tp->snd_max)) |
1017 | 1017 |
goto dropwithreset; |
1018 |
tcpstat.tcps_connects++;
|
|
1018 |
STAT(tcpstat.tcps_connects++);
|
|
1019 | 1019 |
tp->t_state = TCPS_ESTABLISHED; |
1020 | 1020 |
/* |
1021 | 1021 |
* The sent SYN is ack'ed with our sequence number +1 |
... | ... | |
1072 | 1072 |
|
1073 | 1073 |
if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) { |
1074 | 1074 |
if (ti->ti_len == 0 && tiwin == tp->snd_wnd) { |
1075 |
tcpstat.tcps_rcvdupack++;
|
|
1075 |
STAT(tcpstat.tcps_rcvdupack++);
|
|
1076 | 1076 |
DEBUG_MISC((dfd," dup ack m = %lx so = %lx \n", |
1077 | 1077 |
(long )m, (long )so)); |
1078 | 1078 |
/* |
... | ... | |
1140 | 1140 |
tp->snd_cwnd = tp->snd_ssthresh; |
1141 | 1141 |
tp->t_dupacks = 0; |
1142 | 1142 |
if (SEQ_GT(ti->ti_ack, tp->snd_max)) { |
1143 |
tcpstat.tcps_rcvacktoomuch++;
|
|
1143 |
STAT(tcpstat.tcps_rcvacktoomuch++);
|
|
1144 | 1144 |
goto dropafterack; |
1145 | 1145 |
} |
1146 | 1146 |
acked = ti->ti_ack - tp->snd_una; |
1147 |
tcpstat.tcps_rcvackpack++;
|
|
1148 |
tcpstat.tcps_rcvackbyte += acked;
|
|
1147 |
STAT(tcpstat.tcps_rcvackpack++);
|
|
1148 |
STAT(tcpstat.tcps_rcvackbyte += acked);
|
|
1149 | 1149 |
|
1150 | 1150 |
/* |
1151 | 1151 |
* If we have a timestamp reply, update smoothed |
... | ... | |
1284 | 1284 |
/* keep track of pure window updates */ |
1285 | 1285 |
if (ti->ti_len == 0 && |
1286 | 1286 |
tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd) |
1287 |
tcpstat.tcps_rcvwinupd++;
|
|
1287 |
STAT(tcpstat.tcps_rcvwinupd++);
|
|
1288 | 1288 |
tp->snd_wnd = tiwin; |
1289 | 1289 |
tp->snd_wl1 = ti->ti_seq; |
1290 | 1290 |
tp->snd_wl2 = ti->ti_ack; |
... | ... | |
1616 | 1616 |
DEBUG_ARG("tp = %lx", (long)tp); |
1617 | 1617 |
DEBUG_ARG("rtt = %d", rtt); |
1618 | 1618 |
|
1619 |
tcpstat.tcps_rttupdated++;
|
|
1619 |
STAT(tcpstat.tcps_rttupdated++);
|
|
1620 | 1620 |
if (tp->t_srtt != 0) { |
1621 | 1621 |
/* |
1622 | 1622 |
* srtt is stored as fixed point with 3 bits after the |
Also available in: Unified diff