forked from KolibriOS/kolibrios
Proper initialization for TCP socket (net branch)
git-svn-id: svn://kolibrios.org@2612 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
d6ef0c989b
commit
6b6bbac3ce
@ -324,7 +324,7 @@ align 4
|
|||||||
mov [eax + SOCKET.snd_proc], SOCKET_send_tcp
|
mov [eax + SOCKET.snd_proc], SOCKET_send_tcp
|
||||||
mov [eax + SOCKET.rcv_proc], SOCKET_receive_tcp
|
mov [eax + SOCKET.rcv_proc], SOCKET_receive_tcp
|
||||||
|
|
||||||
mov [eax + TCP_SOCKET.t_maxseg], 1480 ;;;;; FIXME
|
TCP_init_socket eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
@ -498,11 +498,13 @@ align 4
|
|||||||
|
|
||||||
mov [eax + TCP_SOCKET.timer_persist], 0
|
mov [eax + TCP_SOCKET.timer_persist], 0
|
||||||
mov [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT
|
mov [eax + TCP_SOCKET.t_state], TCPS_SYN_SENT
|
||||||
|
|
||||||
push [TCP_sequence_num]
|
push [TCP_sequence_num]
|
||||||
add [TCP_sequence_num], 6400
|
add [TCP_sequence_num], 6400
|
||||||
pop [eax + TCP_SOCKET.ISS]
|
pop [eax + TCP_SOCKET.ISS]
|
||||||
mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
|
mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init
|
||||||
|
|
||||||
|
|
||||||
TCP_sendseqinit eax
|
TCP_sendseqinit eax
|
||||||
|
|
||||||
; mov [ebx + TCP_SOCKET.timer_retransmission], ;; todo: create macro to set retransmission timer
|
; mov [ebx + TCP_SOCKET.timer_retransmission], ;; todo: create macro to set retransmission timer
|
||||||
|
@ -17,87 +17,90 @@
|
|||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
; Socket states
|
; Socket states
|
||||||
TCPS_CLOSED equ 0
|
TCPS_CLOSED equ 0
|
||||||
TCPS_LISTEN equ 1
|
TCPS_LISTEN equ 1
|
||||||
TCPS_SYN_SENT equ 2
|
TCPS_SYN_SENT equ 2
|
||||||
TCPS_SYN_RECEIVED equ 3
|
TCPS_SYN_RECEIVED equ 3
|
||||||
TCPS_ESTABLISHED equ 4
|
TCPS_ESTABLISHED equ 4
|
||||||
TCPS_CLOSE_WAIT equ 5
|
TCPS_CLOSE_WAIT equ 5
|
||||||
TCPS_FIN_WAIT_1 equ 6
|
TCPS_FIN_WAIT_1 equ 6
|
||||||
TCPS_CLOSING equ 7
|
TCPS_CLOSING equ 7
|
||||||
TCPS_LAST_ACK equ 8
|
TCPS_LAST_ACK equ 8
|
||||||
TCPS_FIN_WAIT_2 equ 9
|
TCPS_FIN_WAIT_2 equ 9
|
||||||
TCPS_TIMED_WAIT equ 10
|
TCPS_TIMED_WAIT equ 10
|
||||||
|
|
||||||
; Socket Flags
|
; Socket Flags
|
||||||
TF_ACKNOW equ 1 shl 0 ; ack peer immediately
|
TF_ACKNOW equ 1 shl 0 ; ack peer immediately
|
||||||
TF_DELACK equ 1 shl 1 ; ack, but try to delay it
|
TF_DELACK equ 1 shl 1 ; ack, but try to delay it
|
||||||
TF_NODELAY equ 1 shl 2 ; don't delay packets to coalesce
|
TF_NODELAY equ 1 shl 2 ; don't delay packets to coalesce
|
||||||
TF_NOOPT equ 1 shl 3 ; don't use tcp options
|
TF_NOOPT equ 1 shl 3 ; don't use tcp options
|
||||||
TF_SENTFIN equ 1 shl 4 ; have sent FIN
|
TF_SENTFIN equ 1 shl 4 ; have sent FIN
|
||||||
TF_REQ_SCALE equ 1 shl 5 ; have/will request window scaling
|
TF_REQ_SCALE equ 1 shl 5 ; have/will request window scaling
|
||||||
TF_RCVD_SCALE equ 1 shl 6 ; other side has requested scaling
|
TF_RCVD_SCALE equ 1 shl 6 ; other side has requested scaling
|
||||||
TF_REQ_TSTMP equ 1 shl 7 ; have/will request timestamps
|
TF_REQ_TSTMP equ 1 shl 7 ; have/will request timestamps
|
||||||
TF_RCVD_TSTMP equ 1 shl 8 ; a timestamp was received in SYN
|
TF_RCVD_TSTMP equ 1 shl 8 ; a timestamp was received in SYN
|
||||||
TF_SACK_PERMIT equ 1 shl 9 ; other side said I could SACK
|
TF_SACK_PERMIT equ 1 shl 9 ; other side said I could SACK
|
||||||
|
|
||||||
; Segment flags
|
; Segment flags
|
||||||
TH_FIN equ 1 shl 0
|
TH_FIN equ 1 shl 0
|
||||||
TH_SYN equ 1 shl 1
|
TH_SYN equ 1 shl 1
|
||||||
TH_RST equ 1 shl 2
|
TH_RST equ 1 shl 2
|
||||||
TH_PUSH equ 1 shl 3
|
TH_PUSH equ 1 shl 3
|
||||||
TH_ACK equ 1 shl 4
|
TH_ACK equ 1 shl 4
|
||||||
TH_URG equ 1 shl 5
|
TH_URG equ 1 shl 5
|
||||||
|
|
||||||
; Segment header options
|
; Segment header options
|
||||||
TCP_OPT_EOL equ 0 ; End of option list.
|
TCP_OPT_EOL equ 0 ; End of option list.
|
||||||
TCP_OPT_NOP equ 1 ; No-Operation.
|
TCP_OPT_NOP equ 1 ; No-Operation.
|
||||||
TCP_OPT_MAXSEG equ 2 ; Maximum Segment Size.
|
TCP_OPT_MAXSEG equ 2 ; Maximum Segment Size.
|
||||||
TCP_OPT_WINDOW equ 3 ; window scale
|
TCP_OPT_WINDOW equ 3 ; window scale
|
||||||
TCP_OPT_TIMESTAMP equ 8
|
TCP_OPT_TIMESTAMP equ 8
|
||||||
|
|
||||||
; Fundamental timer values
|
; Fundamental timer values
|
||||||
TCP_time_MSL equ 47 ; max segment lifetime (30s)
|
TCP_time_MSL equ 47 ; max segment lifetime (30s)
|
||||||
TCP_time_re_min equ 2 ; min retransmission (1,28s)
|
TCP_time_re_min equ 2 ; min retransmission (1,28s)
|
||||||
TCP_time_re_max equ 100 ; max retransmission (64s)
|
TCP_time_re_max equ 100 ; max retransmission (64s)
|
||||||
TCP_time_pers_min equ 8 ; min persist (5,12s)
|
TCP_time_pers_min equ 8 ; min persist (5,12s)
|
||||||
TCP_time_pers_max equ 94 ; max persist (60,16s)
|
TCP_time_pers_max equ 94 ; max persist (60,16s)
|
||||||
TCP_time_keep_init equ 118 ; connectione stablishment (75,52s)
|
TCP_time_keep_init equ 118 ; connectione stablishment (75,52s)
|
||||||
TCP_time_keep_idle equ 4608 ; idle time before 1st probe (2h)
|
TCP_time_keep_idle equ 4608 ; idle time before 1st probe (2h)
|
||||||
TCP_time_keep_interval equ 118 ; between probes when no response (75,52s)
|
TCP_time_keep_interval equ 118 ; between probes when no response (75,52s)
|
||||||
TCP_time_rtt_default equ 5 ; default Round Trip Time (3,2s)
|
TCP_time_rtt_default equ 5 ; default Round Trip Time (3,2s)
|
||||||
|
TCP_time_srtt_default equ 0 ;
|
||||||
|
|
||||||
; timer constants
|
; timer constants
|
||||||
TCP_max_rxtshift equ 12 ; max retransmissions waiting for ACK
|
TCP_max_rxtshift equ 12 ; max retransmissions waiting for ACK
|
||||||
TCP_max_keepcnt equ 8 ; max keepalive probes
|
TCP_max_keepcnt equ 8 ; max keepalive probes
|
||||||
|
|
||||||
;
|
;
|
||||||
TCP_max_winshift equ 14
|
TCP_max_winshift equ 14
|
||||||
TCP_max_win equ 65535
|
TCP_max_win equ 65535
|
||||||
|
|
||||||
TCP_re_xmit_thresh equ 3
|
TCP_re_xmit_thresh equ 3
|
||||||
|
|
||||||
struct TCP_header
|
TCP_mss_default equ 1480 ; default max segment size
|
||||||
|
|
||||||
SourcePort dw ?
|
struct TCP_header
|
||||||
DestinationPort dw ?
|
|
||||||
SequenceNumber dd ?
|
SourcePort dw ?
|
||||||
AckNumber dd ?
|
DestinationPort dw ?
|
||||||
DataOffset db ? ; DataOffset[0-3 bits] and Reserved[4-7]
|
SequenceNumber dd ?
|
||||||
Flags db ? ; Reserved[0-1 bits]|URG|ACK|PSH|RST|SYN|FIN
|
AckNumber dd ?
|
||||||
Window dw ?
|
DataOffset db ? ; DataOffset[0-3 bits] and Reserved[4-7]
|
||||||
Checksum dw ?
|
Flags db ? ; Reserved[0-1 bits]|URG|ACK|PSH|RST|SYN|FIN
|
||||||
UrgentPointer dw ?
|
Window dw ?
|
||||||
|
Checksum dw ?
|
||||||
|
UrgentPointer dw ?
|
||||||
|
|
||||||
ends
|
ends
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
uglobal
|
uglobal
|
||||||
TCP_headers_tx rd IP_MAX_INTERFACES
|
TCP_headers_tx rd IP_MAX_INTERFACES
|
||||||
TCP_headers_rx rd IP_MAX_INTERFACES
|
TCP_headers_rx rd IP_MAX_INTERFACES
|
||||||
TCP_bytes_rx rq IP_MAX_INTERFACES
|
TCP_bytes_rx rq IP_MAX_INTERFACES
|
||||||
TCP_bytes_tx rq IP_MAX_INTERFACES
|
TCP_bytes_tx rq IP_MAX_INTERFACES
|
||||||
TCP_sequence_num dd ?
|
TCP_sequence_num dd ?
|
||||||
endg
|
endg
|
||||||
|
|
||||||
|
|
||||||
@ -108,15 +111,15 @@ endg
|
|||||||
; This function resets all TCP variables
|
; This function resets all TCP variables
|
||||||
;
|
;
|
||||||
;-----------------------------------------------------------------
|
;-----------------------------------------------------------------
|
||||||
macro TCP_init {
|
macro TCP_init {
|
||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov edi, TCP_headers_tx
|
mov edi, TCP_headers_tx
|
||||||
mov ecx, (6*IP_MAX_INTERFACES)
|
mov ecx, (6*IP_MAX_INTERFACES)
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
pseudo_random eax
|
pseudo_random eax
|
||||||
mov [TCP_sequence_num], eax
|
mov [TCP_sequence_num], eax
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,24 +146,24 @@ include 'tcp_output.inc'
|
|||||||
align 4
|
align 4
|
||||||
TCP_API:
|
TCP_API:
|
||||||
|
|
||||||
movzx eax, bh
|
movzx eax, bh
|
||||||
shl eax, 2
|
shl eax, 2
|
||||||
|
|
||||||
test bl, bl
|
test bl, bl
|
||||||
jz .packets_tx ; 0
|
jz .packets_tx ; 0
|
||||||
dec bl
|
dec bl
|
||||||
jz .packets_rx ; 1
|
jz .packets_rx ; 1
|
||||||
|
|
||||||
.error:
|
.error:
|
||||||
mov eax, -1
|
mov eax, -1
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.packets_tx:
|
.packets_tx:
|
||||||
add eax, TCP_headers_tx
|
add eax, TCP_headers_tx
|
||||||
mov eax, [eax]
|
mov eax, [eax]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.packets_rx:
|
.packets_rx:
|
||||||
add eax, TCP_headers_rx
|
add eax, TCP_headers_rx
|
||||||
mov eax, [eax]
|
mov eax, [eax]
|
||||||
ret
|
ret
|
||||||
|
@ -595,6 +595,8 @@ align 4
|
|||||||
mov [ebx + TCP_SOCKET.t_state], TCPS_ESTABLISHED
|
mov [ebx + TCP_SOCKET.t_state], TCPS_ESTABLISHED
|
||||||
|
|
||||||
;;; TODO: check if we should scale the connection (567-572)
|
;;; TODO: check if we should scale the connection (567-572)
|
||||||
|
mov [ebx + TCP_SOCKET.SND_SCALE], 0
|
||||||
|
|
||||||
;;; TODO: update RTT estimators
|
;;; TODO: update RTT estimators
|
||||||
|
|
||||||
jmp .trim_then_step6
|
jmp .trim_then_step6
|
||||||
@ -1249,24 +1251,7 @@ align 4
|
|||||||
|
|
||||||
.update_window:
|
.update_window:
|
||||||
|
|
||||||
DEBUGF 1,"Updating window\n"
|
;;; TODO: Keep track of pure window updates
|
||||||
|
|
||||||
; Keep track of pure window updates
|
|
||||||
|
|
||||||
; test ecx, ecx
|
|
||||||
; jz @f
|
|
||||||
;
|
|
||||||
; mov eax, [ebx + TCP_SOCKET.SND_WL2]
|
|
||||||
; cmp eax, [edx + TCP_header.AckNumber]
|
|
||||||
; jne @f
|
|
||||||
;
|
|
||||||
; ;; mov eax, tiwin
|
|
||||||
; cmp eax, [ebx + TCP_SOCKET.SND_WND]
|
|
||||||
; jbe @f
|
|
||||||
;
|
|
||||||
; ;;; update stats
|
|
||||||
;
|
|
||||||
; @@:
|
|
||||||
|
|
||||||
mov eax, dword [edx + TCP_header.Window]
|
mov eax, dword [edx + TCP_header.Window]
|
||||||
cmp eax, [ebx + TCP_SOCKET.max_sndwnd]
|
cmp eax, [ebx + TCP_SOCKET.max_sndwnd]
|
||||||
@ -1275,6 +1260,8 @@ align 4
|
|||||||
@@:
|
@@:
|
||||||
mov [ebx + TCP_SOCKET.SND_WND], eax
|
mov [ebx + TCP_SOCKET.SND_WND], eax
|
||||||
|
|
||||||
|
DEBUGF 1,"Updating window to %d\n", eax
|
||||||
|
|
||||||
push [edx + TCP_header.SequenceNumber]
|
push [edx + TCP_header.SequenceNumber]
|
||||||
pop [ebx + TCP_SOCKET.SND_WL1]
|
pop [ebx + TCP_SOCKET.SND_WL1]
|
||||||
|
|
||||||
|
@ -100,13 +100,14 @@ TCP_output:
|
|||||||
@@:
|
@@:
|
||||||
sub esi, ebx
|
sub esi, ebx
|
||||||
|
|
||||||
|
|
||||||
;------------------------
|
;------------------------
|
||||||
; check for window shrink (107)
|
; check for window shrink (107)
|
||||||
|
|
||||||
; If FIN has been set, but not ACKed, but we havent been called to retransmit, esi will be -1
|
; If FIN has been set, 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.
|
||||||
|
|
||||||
jns .not_negative
|
jae .not_persist
|
||||||
|
|
||||||
; enter persist state
|
; enter persist state
|
||||||
xor esi, esi
|
xor esi, esi
|
||||||
@ -126,7 +127,7 @@ TCP_output:
|
|||||||
|
|
||||||
; If window didn't close completely, just wait for an ACK
|
; If window didn't close completely, just wait for an ACK
|
||||||
|
|
||||||
.not_negative:
|
.not_persist:
|
||||||
|
|
||||||
;---------------------------
|
;---------------------------
|
||||||
; Send one segment at a time (124)
|
; Send one segment at a time (124)
|
||||||
@ -291,7 +292,7 @@ TCP_output:
|
|||||||
|
|
||||||
.send:
|
.send:
|
||||||
|
|
||||||
DEBUGF 1,"Preparing to send a segment\n"
|
DEBUGF 1,"Preparing to send a segment socket: %x length: %u flags: %x\n", eax, esi, dl
|
||||||
|
|
||||||
mov edi, sizeof.TCP_header ; edi will contain headersize
|
mov edi, sizeof.TCP_header ; edi will contain headersize
|
||||||
|
|
||||||
|
@ -82,11 +82,21 @@ macro TCP_rcvseqinit ptr {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
macro TCP_init_socket socket {
|
||||||
|
|
||||||
|
mov [socket + TCP_SOCKET.t_maxseg], TCP_mss_default
|
||||||
|
mov [socket + TCP_SOCKET.t_flags], 0 ; we could also request scale and timestamp
|
||||||
|
|
||||||
|
mov [socket + TCP_SOCKET.t_srtt], TCP_time_srtt_default
|
||||||
|
mov [socket + TCP_SOCKET.t_rttvar], TCP_time_rtt_default * 4
|
||||||
|
mov [socket + TCP_SOCKET.t_rttmin], TCP_time_re_min
|
||||||
|
;;; TODO: TCP_time_rangeset
|
||||||
|
|
||||||
|
mov [socket + TCP_SOCKET.SND_CWND], TCP_max_win shl TCP_max_winshift
|
||||||
|
mov [socket + TCP_SOCKET.SND_SSTHRESH], TCP_max_win shl TCP_max_winshift
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;---------------------------
|
;---------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user