Rev 3556 | Rev 3644 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3556 | Rev 3600 | ||
---|---|---|---|
Line 251... | Line 251... | ||
251 | ;------------------------------------- |
251 | ;------------------------------------- |
252 | ; Reset idle timer and keepalive timer |
252 | ; Reset idle timer and keepalive timer |
Line 253... | Line 253... | ||
253 | 253 | ||
254 | mov [ebx + TCP_SOCKET.t_idle], 0 |
254 | mov [ebx + TCP_SOCKET.t_idle], 0 |
- | 255 | mov [ebx + TCP_SOCKET.timer_keepalive], TCP_time_keep_idle |
|
Line 255... | Line 256... | ||
255 | mov [ebx + TCP_SOCKET.timer_keepalive], TCP_time_keep_idle |
256 | or [ebx + TCP_SOCKET.timer_flags], timer_flag_keepalive |
256 | 257 | ||
Line 257... | Line 258... | ||
257 | ;-------------------- |
258 | ;-------------------- |
Line 486... | Line 487... | ||
486 | ; update window pointers |
487 | ; update window pointers |
487 | mov eax, [edx + TCP_header.AckNumber] |
488 | mov eax, [edx + TCP_header.AckNumber] |
488 | mov [ebx + TCP_SOCKET.SND_UNA], eax |
489 | mov [ebx + TCP_SOCKET.SND_UNA], eax |
Line 489... | Line 490... | ||
489 | 490 | ||
490 | ; Stop retransmit timer |
491 | ; Stop retransmit timer |
Line 491... | Line 492... | ||
491 | mov [ebx + TCP_SOCKET.timer_retransmission], 0 |
492 | and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission |
492 | 493 | ||
493 | ; Unlock the socket |
494 | ; Unlock the socket |
494 | pusha |
495 | pusha |
Line 850... | Line 851... | ||
850 | 851 | ||
851 | ; If we have outstanding data, other than a window probe, this is a completely duplicate ACK |
852 | ; If we have outstanding data, other than a window probe, this is a completely duplicate ACK |
852 | ; (window info didnt change) The ACK is the biggest we've seen and we've seen exactly our rexmt threshold of them, |
853 | ; (window info didnt change) The ACK is the biggest we've seen and we've seen exactly our rexmt threshold of them, |
Line 853... | Line 854... | ||
853 | ; assume a packet has been dropped and retransmit it. Kludge snd_nxt & the congestion window so we send only this one packet. |
854 | ; assume a packet has been dropped and retransmit it. Kludge snd_nxt & the congestion window so we send only this one packet. |
854 | 855 | ||
Line 855... | Line 856... | ||
855 | cmp [ebx + TCP_SOCKET.timer_retransmission], 0 ;;;; FIXME |
856 | test [ebx + TCP_SOCKET.timer_flags], timer_flag_retransmission |
856 | jg @f |
857 | jz @f |
857 | 858 | ||
Line 884... | Line 885... | ||
884 | @@: |
885 | @@: |
885 | mul [ebx + TCP_SOCKET.t_maxseg] |
886 | mul [ebx + TCP_SOCKET.t_maxseg] |
886 | pop edx |
887 | pop edx |
887 | mov [ebx + TCP_SOCKET.SND_SSTHRESH], eax |
888 | mov [ebx + TCP_SOCKET.SND_SSTHRESH], eax |
Line 888... | Line 889... | ||
888 | 889 | ||
889 | mov [ebx + TCP_SOCKET.timer_retransmission], 0 ; turn off retransmission timer |
890 | and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission ; turn off retransmission timer |
890 | mov [ebx + TCP_SOCKET.t_rtt], 0 |
891 | mov [ebx + TCP_SOCKET.t_rtt], 0 |
891 | mov eax, [edx + TCP_header.AckNumber] |
892 | mov eax, [edx + TCP_header.AckNumber] |
892 | mov [ebx + TCP_SOCKET.SND_NXT], eax |
893 | mov [ebx + TCP_SOCKET.SND_NXT], eax |
893 | mov eax, [ebx + TCP_SOCKET.t_maxseg] |
894 | mov eax, [ebx + TCP_SOCKET.t_maxseg] |
Line 1015... | Line 1016... | ||
1015 | ; If there is more data to be acked, restart retransmit timer, using current (possible backed-off) value. |
1016 | ; If there is more data to be acked, restart retransmit timer, using current (possible backed-off) value. |
Line 1016... | Line 1017... | ||
1016 | 1017 | ||
1017 | mov eax, [ebx + TCP_SOCKET.SND_MAX] |
1018 | mov eax, [ebx + TCP_SOCKET.SND_MAX] |
1018 | cmp eax, [edx + TCP_header.AckNumber] |
1019 | cmp eax, [edx + TCP_header.AckNumber] |
1019 | jne .more_data |
1020 | jne .more_data |
1020 | mov [ebx + TCP_SOCKET.timer_retransmission], 0 |
1021 | and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission |
1021 | or [ebx + TCP_SOCKET.temp_bits], TCP_BIT_NEEDOUTPUT |
1022 | or [ebx + TCP_SOCKET.temp_bits], TCP_BIT_NEEDOUTPUT |
1022 | jmp .no_restart |
1023 | jmp .no_restart |
1023 | .more_data: |
1024 | .more_data: |
1024 | cmp [ebx + TCP_SOCKET.timer_persist], 0 |
1025 | test [ebx + TCP_SOCKET.timer_flags], timer_flag_persist |
Line 1025... | Line 1026... | ||
1025 | jne .no_restart |
1026 | jnz .no_restart |
1026 | 1027 | ||
1027 | mov eax, [ebx + TCP_SOCKET.t_rxtcur] |
- | |
- | 1028 | mov eax, [ebx + TCP_SOCKET.t_rxtcur] |
|
1028 | mov [ebx + TCP_SOCKET.timer_retransmission], eax |
1029 | mov [ebx + TCP_SOCKET.timer_retransmission], eax |
Line 1029... | Line 1030... | ||
1029 | 1030 | or [ebx + TCP_SOCKET.timer_flags], timer_flag_retransmission |
|
1030 | .no_restart: |
1031 | .no_restart: |
Line 1138... | Line 1139... | ||
1138 | test [ebx + SOCKET.state], SS_CANTRCVMORE |
1139 | test [ebx + SOCKET.state], SS_CANTRCVMORE |
1139 | jnz @f |
1140 | jnz @f |
1140 | mov eax, ebx |
1141 | mov eax, ebx |
1141 | call SOCKET_is_disconnected |
1142 | call SOCKET_is_disconnected |
1142 | mov [ebx + TCP_SOCKET.timer_timed_wait], TCP_time_max_idle |
1143 | mov [ebx + TCP_SOCKET.timer_timed_wait], TCP_time_max_idle |
- | 1144 | or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait |
|
1143 | @@: |
1145 | @@: |
1144 | mov [ebx + TCP_SOCKET.t_state], TCPS_FIN_WAIT_2 |
1146 | mov [ebx + TCP_SOCKET.t_state], TCPS_FIN_WAIT_2 |
1145 | jmp .ack_processed |
1147 | jmp .ack_processed |
Line 1146... | Line 1148... | ||
1146 | 1148 | ||
Line 1149... | Line 1151... | ||
1149 | 1151 | ||
1150 | mov [ebx + TCP_SOCKET.t_state], TCPS_TIMED_WAIT |
1152 | mov [ebx + TCP_SOCKET.t_state], TCPS_TIMED_WAIT |
1151 | mov eax, ebx |
1153 | mov eax, ebx |
1152 | call TCP_cancel_timers |
1154 | call TCP_cancel_timers |
- | 1155 | mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
|
1153 | mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
1156 | or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait |
1154 | mov eax, ebx |
1157 | mov eax, ebx |
1155 | call SOCKET_is_disconnected |
1158 | call SOCKET_is_disconnected |
Line 1156... | Line 1159... | ||
1156 | jmp .ack_processed |
1159 | jmp .ack_processed |
Line 1162... | Line 1165... | ||
1162 | call TCP_disconnect |
1165 | call TCP_disconnect |
1163 | jmp .drop |
1166 | jmp .drop |
Line 1164... | Line 1167... | ||
1164 | 1167 | ||
1165 | .ack_tw: |
1168 | .ack_tw: |
- | 1169 | mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
|
1166 | mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
1170 | or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait |
Line 1167... | Line 1171... | ||
1167 | jmp .drop_after_ack |
1171 | jmp .drop_after_ack |
1168 | 1172 | ||
1169 | .reset_dupacks: ; We got a new ACK, reset duplicate ACK counter |
1173 | .reset_dupacks: ; We got a new ACK, reset duplicate ACK counter |
Line 1207... | Line 1211... | ||
1207 | TCP_rcvseqinit ebx |
1211 | TCP_rcvseqinit ebx |
Line 1208... | Line 1212... | ||
1208 | 1212 | ||
1209 | mov [ebx + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED |
1213 | mov [ebx + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED |
1210 | mov [ebx + TCP_SOCKET.t_flags], TF_ACKNOW |
1214 | mov [ebx + TCP_SOCKET.t_flags], TF_ACKNOW |
- | 1215 | mov [ebx + TCP_SOCKET.timer_keepalive], TCP_time_keep_interval ;;;; macro |
|
Line 1211... | Line 1216... | ||
1211 | mov [ebx + TCP_SOCKET.timer_keepalive], TCP_time_keep_interval ;;;; macro |
1216 | or [ebx + TCP_SOCKET.timer_flags], timer_flag_keepalive |
1212 | 1217 | ||
Line 1213... | Line 1218... | ||
1213 | lea eax, [ebx + STREAM_SOCKET.snd] |
1218 | lea eax, [ebx + STREAM_SOCKET.snd] |
Line 1270... | Line 1275... | ||
1270 | jbe @f |
1275 | jbe @f |
1271 | mov [ebx + TCP_SOCKET.SND_NXT], eax |
1276 | mov [ebx + TCP_SOCKET.SND_NXT], eax |
1272 | @@: |
1277 | @@: |
Line 1273... | Line 1278... | ||
1273 | 1278 | ||
1274 | .no_syn_ack: |
1279 | .no_syn_ack: |
Line 1275... | Line 1280... | ||
1275 | mov [ebx + TCP_SOCKET.timer_retransmission], 0 ; disable retransmission |
1280 | and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission ; disable retransmission timer |
1276 | 1281 | ||
Line 1277... | Line 1282... | ||
1277 | push [edx + TCP_header.SequenceNumber] |
1282 | push [edx + TCP_header.SequenceNumber] |
Line 1523... | Line 1528... | ||
1523 | 1528 | ||
1524 | mov [ebx + TCP_SOCKET.t_state], TCPS_TIMED_WAIT |
1529 | mov [ebx + TCP_SOCKET.t_state], TCPS_TIMED_WAIT |
1525 | mov eax, ebx |
1530 | mov eax, ebx |
1526 | call TCP_cancel_timers |
1531 | call TCP_cancel_timers |
- | 1532 | mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
|
1527 | mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
1533 | or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait |
1528 | call SOCKET_is_disconnected |
1534 | call SOCKET_is_disconnected |
Line 1529... | Line 1535... | ||
1529 | jmp .final_processing |
1535 | jmp .final_processing |
1530 | 1536 | ||
- | 1537 | .fin_timed: |
|
1531 | .fin_timed: |
1538 | mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
Line 1532... | Line 1539... | ||
1532 | mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
1539 | or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait |
1533 | jmp .final_processing |
1540 | jmp .final_processing |