forked from KolibriOS/kolibrios
TCP: correctly close connection.
git-svn-id: svn://kolibrios.org@4366 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
fe46d27eaf
commit
e2ec33712e
@ -714,6 +714,11 @@ SOCKET_close:
|
|||||||
|
|
||||||
call TCP_usrclosed
|
call TCP_usrclosed
|
||||||
|
|
||||||
|
test eax, eax
|
||||||
|
jz @f
|
||||||
|
call TCP_output ; If connection is not closed yet, send the FIN
|
||||||
|
@@:
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
@ -2196,7 +2201,7 @@ SOCKET_check_owner:
|
|||||||
;
|
;
|
||||||
; Kernel calls this function when a certain process ends
|
; Kernel calls this function when a certain process ends
|
||||||
; This function will check if the process had any open sockets
|
; This function will check if the process had any open sockets
|
||||||
; And update them accordingly
|
; And update them accordingly (clean up)
|
||||||
;
|
;
|
||||||
; IN: edx = pid
|
; IN: edx = pid
|
||||||
; OUT: /
|
; OUT: /
|
||||||
@ -2242,7 +2247,7 @@ SOCKET_process_end:
|
|||||||
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
|
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
|
||||||
jne .free
|
jne .free
|
||||||
|
|
||||||
call TCP_close
|
call TCP_disconnect
|
||||||
jmp .closed
|
jmp .closed
|
||||||
|
|
||||||
.free:
|
.free:
|
||||||
@ -2347,20 +2352,9 @@ SOCKET_is_disconnected:
|
|||||||
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
|
||||||
|
|
||||||
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
|
|
||||||
je .tcp
|
|
||||||
|
|
||||||
cmp [eax + SOCKET.Protocol], IP_PROTO_UDP
|
|
||||||
je .udp
|
|
||||||
|
|
||||||
jmp SOCKET_notify
|
jmp SOCKET_notify
|
||||||
|
|
||||||
.tcp:
|
|
||||||
.udp:
|
|
||||||
mov [eax + UDP_SOCKET.LocalPort], 0 ; UDP and TCP structs store localport at the same offset
|
|
||||||
mov [eax + UDP_SOCKET.RemotePort], 0
|
|
||||||
|
|
||||||
jmp SOCKET_notify
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------
|
;-----------------------------------------------------------------
|
||||||
|
@ -567,12 +567,13 @@ endl
|
|||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: Header prediction failed\n"
|
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: Header prediction failed\n"
|
||||||
|
|
||||||
; Calculate receive window size
|
; Calculate receive window size
|
||||||
|
|
||||||
push edx
|
push edx
|
||||||
mov eax, SOCKETBUFFSIZE
|
mov eax, SOCKET_MAXDATA
|
||||||
sub eax, [ebx + STREAM_SOCKET.rcv.size]
|
sub eax, [ebx + STREAM_SOCKET.rcv.size]
|
||||||
|
DEBUGF DEBUG_NETWORK_VERBOSE, "Space in receive buffer=%d\n", eax
|
||||||
mov edx, [ebx + TCP_SOCKET.RCV_ADV]
|
mov edx, [ebx + TCP_SOCKET.RCV_ADV]
|
||||||
sub edx, [ebx + TCP_SOCKET.RCV_NXT]
|
sub edx, [ebx + TCP_SOCKET.RCV_NXT]
|
||||||
|
DEBUGF DEBUG_NETWORK_VERBOSE, "Current advertised window=%d\n", edx
|
||||||
cmp eax, edx
|
cmp eax, edx
|
||||||
jg @f
|
jg @f
|
||||||
mov eax, edx
|
mov eax, edx
|
||||||
@ -1189,12 +1190,9 @@ endl
|
|||||||
call mutex_unlock
|
call mutex_unlock
|
||||||
pop ebx
|
pop ebx
|
||||||
|
|
||||||
push ebx
|
|
||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call TCP_disconnect
|
call TCP_close
|
||||||
pop ebx
|
jmp .drop_no_socket
|
||||||
|
|
||||||
jmp .destroy_new_socket
|
|
||||||
|
|
||||||
.ack_tw:
|
.ack_tw:
|
||||||
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL
|
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL
|
||||||
|
@ -32,7 +32,7 @@ locals
|
|||||||
temp_bits db ?
|
temp_bits db ?
|
||||||
endl
|
endl
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_output: socket=%x\n", eax
|
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_output: socket=%x state=%u\n", eax, [eax + TCP_SOCKET.t_state]
|
||||||
|
|
||||||
push eax
|
push eax
|
||||||
lea ecx, [eax + SOCKET.mutex]
|
lea ecx, [eax + SOCKET.mutex]
|
||||||
|
@ -171,8 +171,35 @@ TCP_drop:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;-------------------------
|
||||||
|
;
|
||||||
|
; TCP_disconnect
|
||||||
|
;
|
||||||
|
; IN: eax = socket ptr
|
||||||
|
; OUT: eax = socket ptr / 0
|
||||||
|
;
|
||||||
|
;-------------------------
|
||||||
|
align 4
|
||||||
|
TCP_disconnect:
|
||||||
|
|
||||||
|
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_disconnect: %x\n", eax
|
||||||
|
|
||||||
|
cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED
|
||||||
|
jb TCP_close ; Connection not yet synchronised, just get rid of the socket
|
||||||
|
|
||||||
|
; TODO: implement LINGER
|
||||||
|
|
||||||
|
call SOCKET_is_disconnecting
|
||||||
|
call TCP_usrclosed
|
||||||
|
|
||||||
|
test eax, eax
|
||||||
|
jz @f
|
||||||
|
push eax
|
||||||
|
call TCP_output
|
||||||
|
pop eax
|
||||||
|
@@:
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
;-------------------------
|
;-------------------------
|
||||||
@ -180,7 +207,7 @@ TCP_drop:
|
|||||||
; TCP_close
|
; TCP_close
|
||||||
;
|
;
|
||||||
; IN: eax = socket ptr
|
; IN: eax = socket ptr
|
||||||
; OUT: eax = socket ptr
|
; OUT: /
|
||||||
;
|
;
|
||||||
;-------------------------
|
;-------------------------
|
||||||
align 4
|
align 4
|
||||||
@ -192,7 +219,9 @@ TCP_close:
|
|||||||
;;; TODO: update slow start threshold
|
;;; TODO: update slow start threshold
|
||||||
|
|
||||||
call SOCKET_is_disconnected
|
call SOCKET_is_disconnected
|
||||||
;; call SOCKET_free
|
call SOCKET_free
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Part of the TCP/IP network stack for KolibriOS ;;
|
;; Part of the TCP/IP network stack for KolibriOS ;;
|
||||||
@ -57,7 +57,6 @@ TCP_usrclosed:
|
|||||||
|
|
||||||
.wait1:
|
.wait1:
|
||||||
mov [eax + TCP_SOCKET.t_state], TCPS_FIN_WAIT_1
|
mov [eax + TCP_SOCKET.t_state], TCPS_FIN_WAIT_1
|
||||||
; TODO: set timer?
|
|
||||||
pop ebx
|
pop ebx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -68,7 +67,6 @@ TCP_usrclosed:
|
|||||||
|
|
||||||
.disc:
|
.disc:
|
||||||
call SOCKET_is_disconnected
|
call SOCKET_is_disconnected
|
||||||
; TODO: set timer?
|
|
||||||
.ret:
|
.ret:
|
||||||
pop ebx
|
pop ebx
|
||||||
ret
|
ret
|
||||||
@ -203,34 +201,3 @@ TCP_connect:
|
|||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;-------------------------
|
|
||||||
;
|
|
||||||
; TCP_disconnect
|
|
||||||
;
|
|
||||||
; IN: eax = socket ptr
|
|
||||||
; OUT: eax = socket ptr
|
|
||||||
;
|
|
||||||
;-------------------------
|
|
||||||
align 4
|
|
||||||
TCP_disconnect:
|
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_disconnect: %x\n", eax
|
|
||||||
|
|
||||||
cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED
|
|
||||||
jb TCP_close
|
|
||||||
|
|
||||||
|
|
||||||
; TODO: implement LINGER ?
|
|
||||||
|
|
||||||
call SOCKET_is_disconnecting
|
|
||||||
call TCP_usrclosed
|
|
||||||
|
|
||||||
push eax
|
|
||||||
call TCP_output
|
|
||||||
pop eax
|
|
||||||
|
|
||||||
ret
|
|
Loading…
Reference in New Issue
Block a user