forked from KolibriOS/kolibrios
TCP: improved routing, connect.
git-svn-id: svn://kolibrios.org@6912 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
e15ba926dd
commit
e9dc6c5ab5
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2017. 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 ;;
|
||||||
@ -89,42 +89,9 @@ tcp_connect:
|
|||||||
test [eax + SOCKET.state], SS_ISCONNECTED
|
test [eax + SOCKET.state], SS_ISCONNECTED
|
||||||
jnz .eisconn
|
jnz .eisconn
|
||||||
|
|
||||||
inc [TCPS_connattempt] ; update stats
|
|
||||||
|
|
||||||
push eax edx
|
push eax edx
|
||||||
lea ecx, [eax + SOCKET.mutex]
|
lea ecx, [eax + SOCKET.mutex]
|
||||||
call mutex_lock
|
call mutex_lock
|
||||||
pop edx eax
|
|
||||||
|
|
||||||
; Fill in local IP
|
|
||||||
cmp [eax + IP_SOCKET.LocalIP], 0
|
|
||||||
jne @f
|
|
||||||
push [IP_LIST + 4] ; FIXME: use correct local IP
|
|
||||||
pop [eax + IP_SOCKET.LocalIP]
|
|
||||||
|
|
||||||
; Fill in remote port and IP
|
|
||||||
pushw [edx + 2]
|
|
||||||
pop [eax + TCP_SOCKET.RemotePort]
|
|
||||||
|
|
||||||
pushd [edx + 4]
|
|
||||||
pop [eax + IP_SOCKET.RemoteIP]
|
|
||||||
|
|
||||||
; Find a local port, if user didnt define one
|
|
||||||
cmp [eax + TCP_SOCKET.LocalPort], 0
|
|
||||||
jne @f
|
|
||||||
call socket_find_port
|
|
||||||
@@:
|
|
||||||
|
|
||||||
; Start the TCP sequence
|
|
||||||
mov [eax + TCP_SOCKET.timer_persist], 0
|
|
||||||
mov [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT
|
|
||||||
|
|
||||||
push [TCP_sequence_num]
|
|
||||||
add [TCP_sequence_num], 6400
|
|
||||||
pop [eax + TCP_SOCKET.ISS]
|
|
||||||
mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
|
|
||||||
|
|
||||||
tcp_sendseqinit eax
|
|
||||||
|
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
lea eax, [ebx + STREAM_SOCKET.snd]
|
lea eax, [ebx + STREAM_SOCKET.snd]
|
||||||
@ -136,20 +103,75 @@ tcp_connect:
|
|||||||
call socket_ring_create
|
call socket_ring_create
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .nomem
|
jz .nomem
|
||||||
|
pop edx eax
|
||||||
|
|
||||||
push ebx
|
; Fill in remote port and IP
|
||||||
lea ecx, [ebx + SOCKET.mutex]
|
pushw [edx + 2]
|
||||||
call mutex_unlock
|
pop [eax + TCP_SOCKET.RemotePort]
|
||||||
|
|
||||||
|
pushd [edx + 4]
|
||||||
|
pop [eax + TCP_SOCKET.RemoteIP]
|
||||||
|
|
||||||
|
; Find route to host
|
||||||
|
pusha
|
||||||
|
push eax
|
||||||
|
mov ebx, [eax + TCP_SOCKET.device]
|
||||||
|
mov edx, [eax + TCP_SOCKET.LocalIP]
|
||||||
|
mov eax, [eax + TCP_SOCKET.RemoteIP]
|
||||||
|
call ipv4_route
|
||||||
|
test eax, eax
|
||||||
|
jz .enoroute
|
||||||
pop eax
|
pop eax
|
||||||
|
mov ebx, [NET_DRV_LIST + edi]
|
||||||
|
mov [eax + TCP_SOCKET.device], ebx
|
||||||
|
mov [eax + TCP_SOCKET.LocalIP], edx
|
||||||
|
popa
|
||||||
|
|
||||||
|
; Find a local port, if user didnt define one
|
||||||
|
cmp [eax + TCP_SOCKET.LocalPort], 0
|
||||||
|
jne @f
|
||||||
|
call socket_find_port
|
||||||
|
@@:
|
||||||
|
|
||||||
|
; Compute window scaling factor
|
||||||
|
push ecx
|
||||||
|
xor ecx, ecx
|
||||||
|
mov ebx, TCP_max_win
|
||||||
|
@@:
|
||||||
|
cmp ebx, SOCKET_BUFFER_SIZE
|
||||||
|
ja @f
|
||||||
|
shl ebx, 1
|
||||||
|
inc ecx
|
||||||
|
cmp ecx, TCP_max_winshift
|
||||||
|
jb @r
|
||||||
|
@@:
|
||||||
|
mov [eax + TCP_SOCKET.request_r_scale], cl
|
||||||
|
pop ecx
|
||||||
|
|
||||||
call socket_is_connecting
|
call socket_is_connecting
|
||||||
|
inc [TCPS_connattempt]
|
||||||
|
|
||||||
|
mov [eax + TCP_SOCKET.timer_persist], 0
|
||||||
|
mov [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT
|
||||||
|
|
||||||
|
mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
|
||||||
|
|
||||||
|
push [TCP_sequence_num]
|
||||||
|
add [TCP_sequence_num], TCP_ISSINCR/2
|
||||||
|
pop [eax + TCP_SOCKET.ISS]
|
||||||
|
|
||||||
|
tcp_sendseqinit eax
|
||||||
|
|
||||||
|
push eax
|
||||||
|
lea ecx, [eax + SOCKET.mutex]
|
||||||
|
call mutex_unlock
|
||||||
|
pop eax
|
||||||
|
|
||||||
; Now send the SYN packet to remote end
|
; Now send the SYN packet to remote end
|
||||||
push eax
|
push eax
|
||||||
call tcp_output
|
call tcp_output
|
||||||
pop eax
|
pop eax
|
||||||
|
|
||||||
.block:
|
|
||||||
test [eax + SOCKET.options], SO_NONBLOCK
|
test [eax + SOCKET.options], SO_NONBLOCK
|
||||||
jz .waitforit
|
jz .waitforit
|
||||||
|
|
||||||
@ -159,6 +181,7 @@ tcp_connect:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
.nomem:
|
.nomem:
|
||||||
|
pop edx eax
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
dec eax
|
dec eax
|
||||||
mov ebx, ENOMEM
|
mov ebx, ENOMEM
|
||||||
@ -170,6 +193,14 @@ tcp_connect:
|
|||||||
mov ebx, EISCONN
|
mov ebx, EISCONN
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
.enoroute:
|
||||||
|
pop eax
|
||||||
|
popa
|
||||||
|
xor eax, eax
|
||||||
|
dec eax
|
||||||
|
mov ebx, EADDRNOTAVAIL
|
||||||
|
ret
|
||||||
|
|
||||||
.waitforit:
|
.waitforit:
|
||||||
push eax
|
push eax
|
||||||
stdcall timer_hs, TCP_time_connect, 0, .timeout, eax
|
stdcall timer_hs, TCP_time_connect, 0, .timeout, eax
|
||||||
@ -202,6 +233,5 @@ tcp_connect:
|
|||||||
|
|
||||||
.established:
|
.established:
|
||||||
stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect]
|
stdcall cancel_timer_hs, [eax + TCP_SOCKET.timer_connect]
|
||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
Loading…
Reference in New Issue
Block a user