Rev 8024 | Go to most recent revision | 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] |