forked from KolibriOS/kolibrios
small updates and fixes in TCP for net branch
git-svn-id: svn://kolibrios.org@2309 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
63bc53c598
commit
29c0d093db
@ -120,7 +120,7 @@ local .loop
|
|||||||
|
|
||||||
macro IPv4_checksum ptr {
|
macro IPv4_checksum ptr {
|
||||||
|
|
||||||
; This is the fast procedure to create or check a IP header without options
|
; This is the fast procedure to create or check an IP header without options
|
||||||
; To create a new checksum, the checksum field must be set to 0 before computation
|
; To create a new checksum, the checksum field must be set to 0 before computation
|
||||||
; To check an existing checksum, leave the checksum as is, and it will be 0 after this procedure, if it was correct
|
; To check an existing checksum, leave the checksum as is, and it will be 0 after this procedure, if it was correct
|
||||||
|
|
||||||
|
@ -34,52 +34,47 @@ $Revision$
|
|||||||
align 4
|
align 4
|
||||||
TCP_input:
|
TCP_input:
|
||||||
|
|
||||||
DEBUGF 1,"TCP_input size=%u ", ecx
|
DEBUGF 1,"TCP_input size=%u\n", ecx
|
||||||
; Offset must be greater than or equal to the size of the standard TCP header (20) and less than or equal to the TCP length.
|
|
||||||
|
|
||||||
movzx eax, [edx + TCP_header.DataOffset]
|
and [edx + TCP_header.DataOffset], 0xf0 ; Calculate TCP segment header size (throwing away unused reserved bits in TCP header)
|
||||||
and eax, 0xf0
|
shr [edx + TCP_header.DataOffset], 2
|
||||||
shr al, 2
|
cmp [edx + TCP_header.DataOffset], sizeof.TCP_header ; Now see if it's at least the size of a standard TCP header
|
||||||
|
jb .drop_not_locked ; If not, drop the packet
|
||||||
DEBUGF 1,"headersize=%u\n", eax
|
|
||||||
|
|
||||||
cmp eax, TCP_header.DataOffset
|
|
||||||
jb .drop_not_locked
|
|
||||||
|
|
||||||
;-------------------------------
|
;-------------------------------
|
||||||
; Now, re-calculate the checksum
|
; Now, re-calculate the checksum
|
||||||
|
|
||||||
push eax ecx edx
|
push ecx edx
|
||||||
pushw [edx + TCP_header.Checksum]
|
pushw [edx + TCP_header.Checksum]
|
||||||
mov [edx + TCP_header.Checksum], 0
|
mov [edx + TCP_header.Checksum], 0
|
||||||
mov esi, edx
|
mov esi, edx
|
||||||
TCP_checksum (edi), (edi+4)
|
TCP_checksum (edi), (edi+4)
|
||||||
pop cx ; previous checksum
|
pop cx ; previous checksum
|
||||||
cmp cx, dx
|
cmp cx, dx
|
||||||
pop edx ecx esi
|
pop edx ecx
|
||||||
jnz .drop_not_locked
|
jnz .drop_not_locked
|
||||||
|
|
||||||
DEBUGF 1,"Checksum is correct\n"
|
DEBUGF 1,"Checksum ok\n"
|
||||||
|
|
||||||
sub ecx, esi ; substract TCP header size from total segment size
|
sub ecx, [edx + TCP_header.DataOffset] ; substract TCP header size from total segment size
|
||||||
jb .drop_not_locked
|
jb .drop_not_locked ; If total segment size is less then the advertised header size, drop packet
|
||||||
DEBUGF 1,"we got %u bytes of data\n", ecx
|
DEBUGF 1,"we got %u bytes of data\n", ecx
|
||||||
|
|
||||||
;-----------------------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------------------
|
||||||
; Check if this packet has a timestamp option (We do it here so we can process it quickly)
|
; Check if this packet has a timestamp option (We do it here so we can process it quickly)
|
||||||
|
|
||||||
cmp esi, TCP_header.DataOffset + 12 ; Timestamp option is 12 bytes
|
cmp [edx + TCP_header.DataOffset], sizeof.TCP_header + 12 ; Timestamp option is 12 bytes
|
||||||
jb .no_timestamp
|
jb .no_timestamp
|
||||||
je .is_ok
|
je .is_ok
|
||||||
|
|
||||||
cmp byte [edx + sizeof.TCP_header + 12], TCP_OPT_EOL ; end of option list
|
cmp byte [edx + sizeof.TCP_header + 12], TCP_OPT_EOL ; end of option list
|
||||||
jne .no_timestamp
|
jne .no_timestamp
|
||||||
|
|
||||||
.is_ok:
|
.is_ok:
|
||||||
test [edx + TCP_header.Flags], TH_SYN ; SYN flag must not be set
|
test [edx + TCP_header.Flags], TH_SYN ; SYN flag must not be set
|
||||||
jnz .no_timestamp
|
jnz .no_timestamp
|
||||||
|
|
||||||
cmp dword [edx + sizeof.TCP_header], 0x0101080a ; Timestamp header
|
cmp dword [edx + sizeof.TCP_header], 0x0101080a ; Timestamp header
|
||||||
jne .no_timestamp
|
jne .no_timestamp
|
||||||
|
|
||||||
DEBUGF 1,"timestamp ok\n"
|
DEBUGF 1,"timestamp ok\n"
|
||||||
@ -105,9 +100,10 @@ TCP_input:
|
|||||||
|
|
||||||
; IP Packet TCP Destination Port = local Port
|
; IP Packet TCP Destination Port = local Port
|
||||||
; (IP Packet SenderAddress = Remote IP) OR (Remote IP = 0)
|
; (IP Packet SenderAddress = Remote IP) OR (Remote IP = 0)
|
||||||
; (IP Packet TCP Source Port = remote Port) OR (remote Port = 0)
|
; (IP Packet TCP Source Port = remote Port) OR (remote Port = 0)
|
||||||
|
|
||||||
mov ebx, net_sockets
|
mov ebx, net_sockets
|
||||||
|
mov si, [edx + TCP_header.DestinationPort]
|
||||||
|
|
||||||
.socket_loop:
|
.socket_loop:
|
||||||
mov ebx, [ebx + SOCKET.NextPtr]
|
mov ebx, [ebx + SOCKET.NextPtr]
|
||||||
@ -120,8 +116,7 @@ TCP_input:
|
|||||||
cmp [ebx + SOCKET.Protocol], IP_PROTO_TCP
|
cmp [ebx + SOCKET.Protocol], IP_PROTO_TCP
|
||||||
jne .socket_loop
|
jne .socket_loop
|
||||||
|
|
||||||
mov ax, [edx + TCP_header.DestinationPort]
|
cmp [ebx + TCP_SOCKET.LocalPort], si
|
||||||
cmp [ebx + TCP_SOCKET.LocalPort], ax
|
|
||||||
jne .socket_loop
|
jne .socket_loop
|
||||||
|
|
||||||
mov eax, [ebx + IP_SOCKET.RemoteIP]
|
mov eax, [ebx + IP_SOCKET.RemoteIP]
|
||||||
@ -136,10 +131,9 @@ TCP_input:
|
|||||||
je .found_socket
|
je .found_socket
|
||||||
test ax, ax
|
test ax, ax
|
||||||
jnz .socket_loop
|
jnz .socket_loop
|
||||||
.found_socket:
|
.found_socket: ; ebx now contains the socketpointer
|
||||||
DEBUGF 1,"Socket ptr: %x\n", ebx
|
DEBUGF 1,"Socket ptr: %x\n", ebx
|
||||||
|
|
||||||
; ebx now contains the pointer to the socket
|
|
||||||
|
|
||||||
;----------------------------
|
;----------------------------
|
||||||
; Check if socket isnt closed
|
; Check if socket isnt closed
|
||||||
@ -158,7 +152,6 @@ TCP_input:
|
|||||||
call wait_mutex
|
call wait_mutex
|
||||||
sub ebx, SOCKET.lock
|
sub ebx, SOCKET.lock
|
||||||
|
|
||||||
|
|
||||||
DEBUGF 1,"Socket locked\n"
|
DEBUGF 1,"Socket locked\n"
|
||||||
|
|
||||||
;---------------------------------------
|
;---------------------------------------
|
||||||
@ -209,7 +202,8 @@ TCP_input:
|
|||||||
;--------------------
|
;--------------------
|
||||||
; Process TCP options
|
; Process TCP options
|
||||||
|
|
||||||
cmp esi, TCP_header.DataOffset ; Does header contain any options?
|
mov eax, [edx + TCP_header.DataOffset]
|
||||||
|
cmp eax, TCP_header.DataOffset ; Does header contain any options?
|
||||||
je .no_options
|
je .no_options
|
||||||
|
|
||||||
DEBUGF 1,"Segment has options\n"
|
DEBUGF 1,"Segment has options\n"
|
||||||
@ -217,7 +211,7 @@ TCP_input:
|
|||||||
cmp [ebx + TCP_SOCKET.t_state], TCPS_LISTEN ; no options when in listen state
|
cmp [ebx + TCP_SOCKET.t_state], TCPS_LISTEN ; no options when in listen state
|
||||||
jz .not_uni_xfer ; also no header prediction
|
jz .not_uni_xfer ; also no header prediction
|
||||||
|
|
||||||
lea eax, [edx + esi]
|
add eax, edx
|
||||||
lea esi, [edx + sizeof.TCP_header]
|
lea esi, [edx + sizeof.TCP_header]
|
||||||
|
|
||||||
.opt_loop:
|
.opt_loop:
|
||||||
@ -413,8 +407,6 @@ TCP_input:
|
|||||||
add [ebx + TCP_SOCKET.RCV_NXT], ecx ; Update sequence number with number of bytes we have copied
|
add [ebx + TCP_SOCKET.RCV_NXT], ecx ; Update sequence number with number of bytes we have copied
|
||||||
|
|
||||||
movzx esi, [edx + TCP_header.DataOffset]
|
movzx esi, [edx + TCP_header.DataOffset]
|
||||||
and esi, 0xf0
|
|
||||||
shr esi, 2
|
|
||||||
add esi, edx
|
add esi, edx
|
||||||
lea eax, [ebx + STREAM_SOCKET.rcv]
|
lea eax, [ebx + STREAM_SOCKET.rcv]
|
||||||
call SOCKET_ring_write ; Add the data to the socket buffer
|
call SOCKET_ring_write ; Add the data to the socket buffer
|
||||||
@ -909,7 +901,8 @@ align 4
|
|||||||
cmp eax, [ebx + TCP_SOCKET.SND_MAX]
|
cmp eax, [ebx + TCP_SOCKET.SND_MAX]
|
||||||
ja .drop_with_reset
|
ja .drop_with_reset
|
||||||
|
|
||||||
;;; update stats
|
;;; TODO: update stats
|
||||||
|
|
||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call SOCKET_is_connected
|
call SOCKET_is_connected
|
||||||
mov [ebx + TCP_SOCKET.t_state], TCPS_ESTABLISHED
|
mov [ebx + TCP_SOCKET.t_state], TCPS_ESTABLISHED
|
||||||
@ -921,11 +914,11 @@ align 4
|
|||||||
test [ebx + TCP_SOCKET.t_flags], TF_REQ_SCALE
|
test [ebx + TCP_SOCKET.t_flags], TF_REQ_SCALE
|
||||||
jz @f
|
jz @f
|
||||||
|
|
||||||
;;; 810-811
|
push word [ebx + TCP_SOCKET.requested_s_scale] ; Set send and receive scale factors to the received values
|
||||||
|
pop word [ebx + TCP_SOCKET.SND_SCALE]
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
;;; 813 ?
|
;;; TODO: copy the data (if any) into the socket
|
||||||
|
|
||||||
mov eax, [edx + TCP_header.SequenceNumber]
|
mov eax, [edx + TCP_header.SequenceNumber]
|
||||||
dec eax
|
dec eax
|
||||||
@ -949,7 +942,7 @@ align 4
|
|||||||
|
|
||||||
DEBUGF 1,"Processing a duplicate ACK..\n"
|
DEBUGF 1,"Processing a duplicate ACK..\n"
|
||||||
|
|
||||||
cmp [ebx + TCP_SOCKET.timer_retransmission], 10000 ;;;;
|
cmp [ebx + TCP_SOCKET.timer_retransmission], 10000 ;;;; FIXME
|
||||||
ja @f
|
ja @f
|
||||||
|
|
||||||
mov eax, [edx + TCP_header.AckNumber]
|
mov eax, [edx + TCP_header.AckNumber]
|
||||||
@ -1246,7 +1239,7 @@ align 4
|
|||||||
cmp eax, [edx + TCP_header.AckNumber]
|
cmp eax, [edx + TCP_header.AckNumber]
|
||||||
jne .no_window_update
|
jne .no_window_update
|
||||||
|
|
||||||
movzx eax, [edx + TCP_header.Window]
|
mov eax, dword [edx + TCP_header.Window]
|
||||||
cmp eax, [ebx + TCP_SOCKET.SND_WND]
|
cmp eax, [ebx + TCP_SOCKET.SND_WND]
|
||||||
jbe .no_window_update
|
jbe .no_window_update
|
||||||
|
|
||||||
@ -1353,8 +1346,6 @@ align 4
|
|||||||
;; TODO: check if data is in sequence !
|
;; TODO: check if data is in sequence !
|
||||||
|
|
||||||
movzx esi, [edx + TCP_header.DataOffset]
|
movzx esi, [edx + TCP_header.DataOffset]
|
||||||
and esi, 0xf0
|
|
||||||
shr esi, 2
|
|
||||||
add esi, edx
|
add esi, edx
|
||||||
|
|
||||||
or [ebx + TCP_SOCKET.t_flags], TF_DELACK
|
or [ebx + TCP_SOCKET.t_flags], TF_DELACK
|
||||||
|
Loading…
Reference in New Issue
Block a user