Subversion Repositories Kolibri OS

Rev

Rev 8024 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8024 Rev 8026
Line 12... Line 12...
12
;;          GNU GENERAL PUBLIC LICENSE                             ;;
12
;;          GNU GENERAL PUBLIC LICENSE                             ;;
13
;;             Version 2, June 1991                                ;;
13
;;             Version 2, June 1991                                ;;
14
;;                                                                 ;;
14
;;                                                                 ;;
15
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 16... Line 16...
16
 
16
 
Line 17... Line 17...
17
$Revision: 8024 $
17
$Revision: 8026 $
Line 18... Line 18...
18
 
18
 
19
TCP_BIT_SENDALOT        = 1 shl 0
19
TCP_BIT_SENDALOT        = 1 shl 0
Line 30... Line 30...
30
align 4
30
align 4
31
proc tcp_output
31
proc tcp_output
Line 32... Line 32...
32
 
32
 
33
locals
33
locals
34
        temp_bits       db ?
34
        temp_bits       db ?
35
        window          dd ?
35
        rcv_window      dd ?
Line 36... Line 36...
36
endl
36
endl
Line 37... Line 37...
37
 
37
 
Line 126... Line 126...
126
; check for window shrink
126
; check for window shrink
Line 127... Line 127...
127
 
127
 
128
; If FIN has been sent, but not ACKed, but we havent been called to retransmit, esi will be -1
128
; If FIN has been sent, but not ACKed, but we havent been called to retransmit, esi will be -1
Line 129... Line 129...
129
; Otherwise, window shrank after we sent into it.
129
; Otherwise, window shrank after we sent into it.
Line 130... Line 130...
130
 
130
 
Line 131... Line 131...
131
        jae     .not_persist
131
        jge     .not_persist
Line 174... Line 174...
174
       @@:
174
       @@:
Line 175... Line 175...
175
 
175
 
176
;-------------------------------
176
;-------------------------------
Line -... Line 177...
-
 
177
; calculate window advertisement
-
 
178
 
-
 
179
        xor     ecx, ecx
177
; calculate window advertisement
180
        test    [eax + SOCKET.state], SS_CANTRCVMORE
178
 
181
        jnz     @f
-
 
182
        mov     ecx, SOCKET_BUFFER_SIZE
Line 179... Line 183...
179
        mov     ecx, SOCKET_BUFFER_SIZE
183
        sub     ecx, [eax + STREAM_SOCKET.rcv.size]
180
        sub     ecx, [eax + STREAM_SOCKET.rcv.size]
184
  @@:
Line 181... Line 185...
181
 
185
 
Line 233... Line 237...
233
        pop     ecx
237
        pop     ecx
234
        sub     ebx, [eax + TCP_SOCKET.RCV_ADV]
238
        sub     ebx, [eax + TCP_SOCKET.RCV_ADV]
235
        add     ebx, [eax + TCP_SOCKET.RCV_NXT]
239
        add     ebx, [eax + TCP_SOCKET.RCV_NXT]
Line 236... Line 240...
236
 
240
 
237
        cmp     ebx, ecx
241
        cmp     ebx, ecx
238
        jb      @f
242
        jl      @f
239
        mov     ebx, ecx
243
        mov     ebx, ecx
Line 240... Line 244...
240
       @@:
244
       @@:
Line 241... Line 245...
241
 
245
 
242
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_output: we can increase window by %d bytes\n", ebx
246
        DEBUGF  DEBUG_NETWORK_VERBOSE, "TCP_output: we can increase window by %d bytes\n", ebx
243
 
247
 
244
        mov     edi, [eax + TCP_SOCKET.t_maxseg]
248
        mov     edi, [eax + TCP_SOCKET.t_maxseg]
Line 245... Line 249...
245
        shl     edi, 1
249
        shl     edi, 1
246
        cmp     ebx, edi
-
 
247
        jae     .send
250
        cmp     ebx, edi
Line 248... Line 251...
248
 
251
        jae     .send
Line 249... Line 252...
249
        shl     ebx, 1
252
 
250
;        cmp     ebx, [eax + TCP_SOCKET.]    ;;; TODO: check with receive buffer high water mark
253
        cmp     ebx, SOCKET_BUFFER_SIZE/2
Line 287... Line 290...
287
; Enter persist state
290
; Enter persist state
Line 288... Line 291...
288
 
291
 
Line 289... Line 292...
289
  .enter_persist:
292
  .enter_persist:
290
 
293
 
291
        cmp     [eax + STREAM_SOCKET.snd.size], 0                       ; Data ready to send?
-
 
292
        jne     @f
-
 
293
        and     [eax + TCP_SOCKET.timer_flags], not timer_flag_retransmission
-
 
294
        jne     @f
294
        cmp     [eax + STREAM_SOCKET.snd.size], 0                       ; Data ready to send?
295
 
295
        je      @f
Line 296... Line 296...
296
        test    [eax + TCP_SOCKET.timer_flags], timer_flag_persist      ; Persist timer already expired?
296
        test    [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission or timer_flag_persist
Line 297... Line 297...
297
        jnz     @f
297
        jnz     @f
Line 483... Line 483...
483
 
483
 
484
;----------------------------------------------------
484
;----------------------------------------------------
485
; Calculate the receive window.
485
; Calculate the receive window.
Line -... Line 486...
-
 
486
; Dont shrink window, but avoid silly window syndrome
-
 
487
 
-
 
488
        xor     ebx, ebx
486
; Dont shrink window, but avoid silly window syndrome
489
        test    [eax + SOCKET.state], SS_CANTRCVMORE
487
 
490
        jnz     @f
Line 488... Line 491...
488
        mov     ebx, SOCKET_BUFFER_SIZE
491
        mov     ebx, SOCKET_BUFFER_SIZE
489
        sub     ebx, [eax + STREAM_SOCKET.rcv.size]
492
        sub     ebx, [eax + STREAM_SOCKET.rcv.size]
490
 
493
 
491
        cmp     ebx, SOCKET_BUFFER_SIZE/4
494
        cmp     ebx, SOCKET_BUFFER_SIZE/4
492
        jae     @f
495
        jge     @f
493
        cmp     ebx, [eax + TCP_SOCKET.t_maxseg]
496
        cmp     ebx, [eax + TCP_SOCKET.t_maxseg]
Line -... Line 497...
-
 
497
        jge     @f
-
 
498
        xor     ebx, ebx
-
 
499
  @@:
494
        jae     @f
500
 
-
 
501
 
-
 
502
        mov     cl, [eax + TCP_SOCKET.RCV_SCALE]
495
        xor     ebx, ebx
503
        push    eax
496
  @@:
504
        mov     eax, TCP_max_win
497
 
505
        shl     eax, cl
-
 
506
        cmp     ebx, eax
-
 
507
        jle     @f
Line 498... Line 508...
498
        cmp     ebx, TCP_max_win ;;;; shl rcv_scale
508
        mov     ebx, eax
499
        jbe     @f
509
  @@:
500
        mov     ebx, TCP_max_win ;;;; shl rcv_scale
510
        pop     eax
501
  @@:
511
 
502
 
512
 
503
        mov     ecx, [eax + TCP_SOCKET.RCV_ADV]
513
        mov     ecx, [eax + TCP_SOCKET.RCV_ADV]
Line -... Line 514...
-
 
514
        sub     ecx, [eax + TCP_SOCKET.RCV_NXT]
-
 
515
        cmp     ebx, ecx
504
        sub     ecx, [eax + TCP_SOCKET.RCV_NXT]
516
        jg      @f
505
        cmp     ebx, ecx
517
        mov     ebx, ecx
Line 506... Line 518...
506
        jg      @f
518
  @@:
507
        mov     ebx, ecx
519
 
508
  @@:
520
;; TODO URGENT POINTER
Line 666... Line 678...
666
        inc     [TCP_segments_tx + edi]
678
        inc     [TCP_segments_tx + edi]
667
        inc     [TCPS_sndtotal]
679
        inc     [TCPS_sndtotal]
Line 668... Line 680...
668
 
680
 
Line 669... Line 681...
669
; update advertised receive window
681
; update advertised receive window
670
 
682
 
671
        mov     ecx, [window]
683
        mov     ecx, [rcv_window]
672
        test    ecx, ecx
684
        test    ecx, ecx
673
        jz      @f
685
        jz      @f
674
        add     ecx, [eax + TCP_SOCKET.RCV_NXT]
686
        add     ecx, [eax + TCP_SOCKET.RCV_NXT]