More TCP advertised window size fixes, small updates regarding closing of TCP sockets.

git-svn-id: svn://kolibrios.org@8026 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2020-06-08 19:57:03 +00:00
parent 8ef9f2b1e7
commit d6b05dd5d5
3 changed files with 53 additions and 25 deletions

View File

@ -750,12 +750,15 @@ socket_close:
ret ret
.tcp: .tcp:
call tcp_usrclosed test [eax + SOCKET.state], SS_ISCONNECTED
test eax, eax
jz @f jz @f
call tcp_output ; If connection is not closed yet, send the FIN test [eax + SOCKET.state], SS_ISDISCONNECTING
jnz @f
call tcp_disconnect
@@: @@:
; TODO:
; ...
; call socket_free
ret ret
@ -2471,7 +2474,7 @@ socket_is_disconnecting:
align 4 align 4
socket_is_disconnected: socket_is_disconnected:
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_is_disconnected: %x\n", eax DEBUGF 1, "SOCKET_is_disconnected: %x\n", eax
and [eax + SOCKET.state], not (SS_ISCONNECTING + SS_ISCONNECTED + SS_ISDISCONNECTING) and [eax + SOCKET.state], not (SS_ISCONNECTING + SS_ISCONNECTED + SS_ISDISCONNECTING)
or [eax + SOCKET.state], SS_CANTRCVMORE + SS_CANTSENDMORE or [eax + SOCKET.state], SS_CANTRCVMORE + SS_CANTSENDMORE

View File

@ -32,7 +32,7 @@ proc tcp_output
locals locals
temp_bits db ? temp_bits db ?
window dd ? rcv_window dd ?
endl endl
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_output: socket=%x state=%u\n", eax, [eax + TCP_SOCKET.t_state] DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_output: socket=%x state=%u\n", eax, [eax + TCP_SOCKET.t_state]
@ -128,7 +128,7 @@ endl
; If FIN has been sent, but not ACKed, but we havent been called to retransmit, esi will be -1 ; If FIN has been sent, but not ACKed, but we havent been called to retransmit, esi will be -1
; Otherwise, window shrank after we sent into it. ; Otherwise, window shrank after we sent into it.
jae .not_persist jge .not_persist
; enter persist state ; enter persist state
@ -176,8 +176,12 @@ endl
;------------------------------- ;-------------------------------
; calculate window advertisement ; calculate window advertisement
xor ecx, ecx
test [eax + SOCKET.state], SS_CANTRCVMORE
jnz @f
mov ecx, SOCKET_BUFFER_SIZE mov ecx, SOCKET_BUFFER_SIZE
sub ecx, [eax + STREAM_SOCKET.rcv.size] sub ecx, [eax + STREAM_SOCKET.rcv.size]
@@:
;------------------------------ ;------------------------------
; Sender silly window avoidance ; Sender silly window avoidance
@ -235,7 +239,7 @@ endl
add ebx, [eax + TCP_SOCKET.RCV_NXT] add ebx, [eax + TCP_SOCKET.RCV_NXT]
cmp ebx, ecx cmp ebx, ecx
jb @f jl @f
mov ebx, ecx mov ebx, ecx
@@: @@:
@ -246,9 +250,8 @@ endl
cmp ebx, edi cmp ebx, edi
jae .send jae .send
shl ebx, 1 cmp ebx, SOCKET_BUFFER_SIZE/2
; cmp ebx, [eax + TCP_SOCKET.] ;;; TODO: check with receive buffer high water mark jae .send
; jae TCP_send
.no_window: .no_window:
@ -289,11 +292,8 @@ endl
.enter_persist: .enter_persist:
cmp [eax + STREAM_SOCKET.snd.size], 0 ; Data ready to send? cmp [eax + STREAM_SOCKET.snd.size], 0 ; Data ready to send?
jne @f je @f
and [eax + TCP_SOCKET.timer_flags], not timer_flag_retransmission test [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission or timer_flag_persist
jne @f
test [eax + TCP_SOCKET.timer_flags], timer_flag_persist ; Persist timer already expired?
jnz @f jnz @f
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_output: Entering persist state\n" DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_output: Entering persist state\n"
@ -485,20 +485,30 @@ endl
; Calculate the receive window. ; Calculate the receive window.
; Dont shrink window, but avoid silly window syndrome ; Dont shrink window, but avoid silly window syndrome
xor ebx, ebx
test [eax + SOCKET.state], SS_CANTRCVMORE
jnz @f
mov ebx, SOCKET_BUFFER_SIZE mov ebx, SOCKET_BUFFER_SIZE
sub ebx, [eax + STREAM_SOCKET.rcv.size] sub ebx, [eax + STREAM_SOCKET.rcv.size]
cmp ebx, SOCKET_BUFFER_SIZE/4 cmp ebx, SOCKET_BUFFER_SIZE/4
jae @f jge @f
cmp ebx, [eax + TCP_SOCKET.t_maxseg] cmp ebx, [eax + TCP_SOCKET.t_maxseg]
jae @f jge @f
xor ebx, ebx xor ebx, ebx
@@: @@:
cmp ebx, TCP_max_win ;;;; shl rcv_scale
jbe @f mov cl, [eax + TCP_SOCKET.RCV_SCALE]
mov ebx, TCP_max_win ;;;; shl rcv_scale push eax
mov eax, TCP_max_win
shl eax, cl
cmp ebx, eax
jle @f
mov ebx, eax
@@: @@:
pop eax
mov ecx, [eax + TCP_SOCKET.RCV_ADV] mov ecx, [eax + TCP_SOCKET.RCV_ADV]
sub ecx, [eax + TCP_SOCKET.RCV_NXT] sub ecx, [eax + TCP_SOCKET.RCV_NXT]
@ -507,8 +517,10 @@ endl
mov ebx, ecx mov ebx, ecx
@@: @@:
;; TODO URGENT POINTER
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_send: window=%u\n", ebx DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_send: window=%u\n", ebx
mov [window], ebx mov [rcv_window], ebx
mov cl, [eax + TCP_SOCKET.RCV_SCALE] mov cl, [eax + TCP_SOCKET.RCV_SCALE]
shr ebx, cl shr ebx, cl
@ -668,7 +680,7 @@ endl
; update advertised receive window ; update advertised receive window
mov ecx, [window] mov ecx, [rcv_window]
test ecx, ecx test ecx, ecx
jz @f jz @f
add ecx, [eax + TCP_SOCKET.RCV_NXT] add ecx, [eax + TCP_SOCKET.RCV_NXT]

View File

@ -185,9 +185,22 @@ tcp_disconnect:
cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED
jb tcp_close ; Connection not yet synchronised, just get rid of the socket jb tcp_close ; Connection not yet synchronised, just get rid of the socket
; TODO: implement LINGER test [eax + SOCKET.options], SO_LINGER
jz .nolinger
; TODO: implement LINGER
; cmp [eax + SOCKET.so_linger], 0
; je TCP_drop
.nolinger:
call socket_is_disconnecting call socket_is_disconnecting
push eax
add eax, STREAM_SOCKET.rcv
mov ecx, [eax + RING_BUFFER.size]
call socket_ring_free
pop eax
call tcp_usrclosed call tcp_usrclosed
test eax, eax test eax, eax
@ -311,7 +324,7 @@ tcp_respond:
cmp eax, TCP_max_win cmp eax, TCP_max_win
jbe .lessthanmax jbe .lessthanmax
mov eax, TCP_max_win mov eax, TCP_max_win
.lessthanmax: .lessthanmax:
mov cl, [esi + TCP_SOCKET.RCV_SCALE] mov cl, [esi + TCP_SOCKET.RCV_SCALE]
shr eax, cl shr eax, cl