Subversion Repositories Kolibri OS

Rev

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