More updates to TCP code of new stack.

git-svn-id: svn://kolibrios.org@1763 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2011-01-24 22:01:54 +00:00
parent 6af42a9b8e
commit db55961834
7 changed files with 255 additions and 91 deletions

View File

@ -1,10 +1,8 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;; SOCKET.INC ;;
;; ;;
;; Written by hidnplayr@kolibrios.org, ;; ;; Written by hidnplayr@kolibrios.org, ;;
;; and Clevermouse. ;; ;; and Clevermouse. ;;
;; ;; ;; ;;
@ -45,12 +43,8 @@ end virtual
virtual at SOCKET.end virtual at SOCKET.end
IP_SOCKET: IP_SOCKET:
.LocalIP rd 4
.LocalIP dd ? .RemoteIP rd 4
rd 3 ; for IPv6 addresses
.RemoteIP dd ?
rd 3 ; for IPv6 addresses
.end: .end:
end virtual end virtual
@ -788,6 +782,9 @@ SOCKET_send:
call SOCKET_num_to_ptr call SOCKET_num_to_ptr
jz s_error jz s_error
mov ecx, esi
mov esi, edx
jmp [eax + SOCKET.snd_proc] jmp [eax + SOCKET.snd_proc]
@ -796,9 +793,6 @@ SOCKET_send_udp:
DEBUGF 1,"SOCKET_send: UDP\n" DEBUGF 1,"SOCKET_send: UDP\n"
mov ecx, esi
mov esi, edx
call UDP_output call UDP_output
mov dword [esp+32], 0 mov dword [esp+32], 0
@ -811,8 +805,6 @@ SOCKET_send_tcp:
DEBUGF 1,"SOCKET_send: TCP\n" DEBUGF 1,"SOCKET_send: TCP\n"
push eax push eax
mov ecx, esi
mov esi, edx
add eax, STREAM_SOCKET.snd add eax, STREAM_SOCKET.snd
call SOCKET_ring_write call SOCKET_ring_write
pop eax pop eax
@ -828,12 +820,9 @@ SOCKET_send_ip:
DEBUGF 1,"type: IP\n" DEBUGF 1,"type: IP\n"
mov ecx, esi
mov esi, edx
call IPv4_output_raw call IPv4_output_raw
mov dword [esp+32], eax mov [esp+32], eax
ret ret
align 4 align 4
@ -841,7 +830,6 @@ SOCKET_send_icmp:
DEBUGF 1,"SOCKET_send: ICMP\n" DEBUGF 1,"SOCKET_send: ICMP\n"
mov ecx, esi
call ICMP_output_raw call ICMP_output_raw
mov dword [esp+32], 0 mov dword [esp+32], 0

View File

@ -1,16 +1,20 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;; STACK.INC ;; ;; STACK.INC ;;
;; ;; ;; ;;
;; BASIC TCP/IP stack for KolibriOS ;; ;; TCP/IP stack for KolibriOS ;;
;; ;; ;; ;;
;; Written by hidnplayr@kolibrios.org ;; ;; Written by hidnplayr@kolibrios.org ;;
;; ;; ;; ;;
;; based on the work of Mike Hibbett, mikeh@oceanfree.net ;; ;; Some parts of code are based on the work of: ;;
;; but also Paolo Franchetti ;; ;; Mike Hibbett (menuetos network stack) ;;
;; Eugen Brasoveanu (solar os network stack and drivers) ;;
;; mike.dld (kolibrios socket code) ;;
;; ;;
;; TCP part is based on 4.4BSD ;;
;; ;; ;; ;;
;; GNU GENERAL PUBLIC LICENSE ;; ;; GNU GENERAL PUBLIC LICENSE ;;
;; Version 2, June 1991 ;; ;; Version 2, June 1991 ;;
@ -19,19 +23,18 @@
$Revision$ $Revision$
__DEBUG_LEVEL_OLD__ equ __DEBUG_LEVEL__ __DEBUG_LEVEL_OLD__ equ __DEBUG_LEVEL__ ; use seperate debug level for network part of kernel
__DEBUG_LEVEL__ equ 1
__DEBUG_LEVEL__ equ 1 ; this sets the debug level for network part of kernel
uglobal uglobal
net_10ms dd ? net_10ms dd ?
net_tmr_count dw ? net_tmr_count dw ?
endg endg
MAX_NET_DEVICES equ 16 MAX_NET_DEVICES equ 16
MIN_EPHEMERAL_PORT equ 49152 MIN_EPHEMERAL_PORT equ 49152
MAX_EPHEMERAL_PORT equ 61000 MAX_EPHEMERAL_PORT equ 61000
; Ethernet protocol numbers ; Ethernet protocol numbers
ETHER_ARP equ 0x0608 ETHER_ARP equ 0x0608
@ -43,13 +46,6 @@ ETHER_PPP_SESSION equ 0x6488
AF_UNSPEC equ 0 AF_UNSPEC equ 0
AF_UNIX equ 1 AF_UNIX equ 1
AF_INET4 equ 2 AF_INET4 equ 2
;AF_AX25 equ 3
;AF_IPX equ 4
;AF_APPLETALK equ 5
;AF_NETROM equ 6
;AF_BRIDGE equ 7
;AF_AAL5 equ 8
;AF_X25 equ 9
AF_INET6 equ 10 AF_INET6 equ 10
; Internet protocol numbers ; Internet protocol numbers
@ -100,7 +96,7 @@ virtual at 0
.packets_tx dd ? ; .packets_tx dd ? ;
.packets_rx dd ? ; .packets_rx dd ? ;
; .chksum dd ? ; bitmask stating available checksum routines on hardware ; .hwacc dd ? ; bitmask stating available hardware accelerations (offload engines)
.end: .end:

View File

@ -1,10 +1,8 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;; TCP.INC ;;
;; ;;
;; Part of the tcp/ip network stack for KolibriOS ;; ;; Part of the tcp/ip network stack for KolibriOS ;;
;; ;; ;; ;;
;; Written by hidnplayr@kolibrios.org ;; ;; Written by hidnplayr@kolibrios.org ;;
@ -77,6 +75,8 @@ 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
struct TCP_segment struct TCP_segment
.SourcePort dw ? .SourcePort dw ?
.DestinationPort dw ? .DestinationPort dw ?

View File

@ -1,3 +1,21 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; Part of the tcp/ip network stack for KolibriOS ;;
;; ;;
;; Written by hidnplayr@kolibrios.org ;;
;; ;;
;; Based on the code of 4.4BSD ;;
;; ;;
;; GNU GENERAL PUBLIC LICENSE ;;
;; Version 2, June 1991 ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
;----------------------------------------------------------------- ;-----------------------------------------------------------------
; ;
; TCP_input: ; TCP_input:
@ -339,8 +357,9 @@ TCP_input:
; Update RTT estimators ; Update RTT estimators
; Delete acknowledged bytes from send buffer ;;; TODO
; Delete acknowledged bytes from send buffer
pusha pusha
mov ecx, eax mov ecx, eax
lea eax, [ebx + STREAM_SOCKET.snd] lea eax, [ebx + STREAM_SOCKET.snd]
@ -349,22 +368,20 @@ TCP_input:
; update window pointers ; update window pointers
mov eax, [edx + TCP_segment.AckNumber] mov eax, [edx + TCP_segment.AckNumber]
dec eax mov [ebx + TCP_SOCKET.SND_UNA], eax
mov [ebx + TCP_SOCKET.SND_WL1], eax
; Stop retransmit timer ; Stop retransmit timer
mov [ebx + TCP_SOCKET.timer_ack], 0 mov [ebx + TCP_SOCKET.timer_ack], 0
; Awaken waiting processes ; Awaken waiting processes
mov [ebx + SOCKET.lock], 0
mov eax, ebx mov eax, ebx
call SOCKET_notify_owner call SOCKET_notify_owner
;; Generate more output FIXME ; Generate more output
;; mov eax, ebx call TCP_output
;; call TCP_output
;; jmp .drop_not_locked
;; jmp .drop
jmp .ack_processed
;------------------------------------------------- ;-------------------------------------------------
; maybe we are the receiver in the uni-xfer then.. ; maybe we are the receiver in the uni-xfer then..
@ -387,16 +404,15 @@ TCP_input:
DEBUGF 1,"header prediction: we are receiver\nreceiving %u bytes of data\n", ecx DEBUGF 1,"header prediction: we are receiver\nreceiving %u bytes of data\n", ecx
pusha add [ebx + TCP_SOCKET.RCV_NXT], ecx ; Update sequence number with number of bytes we have copied
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
mov eax, ebx mov eax, ebx
call SOCKET_notify_owner call SOCKET_notify_owner
popa
add [ebx + TCP_SOCKET.RCV_NXT], ecx ; Update sequence number with number of bytes we have copied
or [ebx + TCP_SOCKET.t_flags], TF_DELACK ; Set delayed ack flag or [ebx + TCP_SOCKET.t_flags], TF_DELACK ; Set delayed ack flag
jmp .drop jmp .drop
@ -415,7 +431,7 @@ TCP_input:
; Calculate receive window size ; Calculate receive window size
;;;; ;;;; TODO: 444
cmp [ebx + TCP_SOCKET.t_state], TCB_LISTEN cmp [ebx + TCP_SOCKET.t_state], TCB_LISTEN
je .LISTEN je .LISTEN
@ -540,7 +556,7 @@ align 4
TCP_rcvseqinit ebx TCP_rcvseqinit ebx
mov [ebx + TCP_SOCKET.t_flags], TF_ACKNOW or [ebx + TCP_SOCKET.t_flags], TF_ACKNOW
mov eax, [ebx + TCP_SOCKET.SND_UNA] mov eax, [ebx + TCP_SOCKET.SND_UNA]
cmp eax, [ebx + TCP_SOCKET.ISS] cmp eax, [ebx + TCP_SOCKET.ISS]
@ -608,7 +624,7 @@ align 4
; First, check if timestamp is present ; First, check if timestamp is present
;;;; TODO ;;;; TODO 602
; Then, check if at least some bytes of data are within window ; Then, check if at least some bytes of data are within window
@ -628,10 +644,12 @@ align 4
mov eax, [ebx + TCP_SOCKET.RCV_NXT] mov eax, [ebx + TCP_SOCKET.RCV_NXT]
sub eax, [edx + TCP_segment.SequenceNumber] sub eax, [edx + TCP_segment.SequenceNumber]
jz .no_duplicate jle .no_duplicate
DEBUGF 1,"Uh oh.. %x bytes of duplicate data!\n", eax
test [edx + TCP_segment.Flags], TH_SYN test [edx + TCP_segment.Flags], TH_SYN
jz .no_drop jz .no_dup_syn
; remove duplicate syn ; remove duplicate syn
@ -643,13 +661,13 @@ align 4
dec [edx + TCP_segment.UrgentPointer] dec [edx + TCP_segment.UrgentPointer]
jmp .no_drop jmp .no_dup_syn
@@: @@:
and [edx + TCP_segment.Flags], not (TH_URG) and [edx + TCP_segment.Flags], not (TH_URG)
dec eax dec eax
jz .no_duplicate jz .no_duplicate
.no_drop: .no_dup_syn:
DEBUGF 1,"Going to drop %u out of %u bytes\n", eax, ecx DEBUGF 1,"Going to drop %u out of %u bytes\n", eax, ecx
@ -828,14 +846,15 @@ align 4
jmp .drop jmp .drop
.rst_skip: .rst_skip:
;-------------------------------------- ;--------------------------------------
; handle SYN-full and ACK-less segments ; handle SYN-full and ACK-less segments
@ -857,7 +876,6 @@ align 4
;--------------- ;---------------
; ACK processing ; ACK processing
@ -876,39 +894,125 @@ align 4
cmp eax, [ebx + TCP_SOCKET.SND_UNA] cmp eax, [ebx + TCP_SOCKET.SND_UNA]
jg .not_dup_ack jg .not_dup_ack
DEBUGF 1,"Duplicate ACK\n"
test ecx, ecx test ecx, ecx
jnz .ack_processed jnz .reset_dupacks
mov eax, dword [edx + TCP_segment.Window] mov eax, dword [edx + TCP_segment.Window]
cmp eax, [ebx + TCP_SOCKET.SND_WND] cmp eax, [ebx + TCP_SOCKET.SND_WND]
jne .ack_processed jne .reset_dupacks
; Process the duplicate ACK DEBUGF 1,"Processing a duplicate ACK..\n"
;;;;; 833 - 878 cmp [ebx + TCP_SOCKET.timer_retransmission], 10000 ;;;;
jg @f
mov eax, [edx + TCP_segment.AckNumber]
cmp eax, [ebx + TCP_SOCKET.SND_UNA]
je .dup_ack
@@:
mov [ebx + TCP_SOCKET.t_dupacks], 0
jmp .not_dup_ack
.dup_ack:
inc [ebx + TCP_SOCKET.t_dupacks]
cmp [ebx + TCP_SOCKET.t_dupacks], TCP_re_xmit_thresh
jne .no_re_xmit
push [ebx + TCP_SOCKET.SND_NXT] ; >>>>
mov eax, [ebx + TCP_SOCKET.SND_WND]
cmp eax, [ebx + TCP_SOCKET.SND_CWND]
cmovg eax, [ebx + TCP_SOCKET.SND_CWND]
shr eax, 1
push edx
xor edx, edx
div [ebx + TCP_SOCKET.t_maxseg]
cmp eax, 2
jge @f
mov ax, 2
@@:
mul [ebx + TCP_SOCKET.t_maxseg]
pop edx
mov [ebx + TCP_SOCKET.SND_SSTHRESH], eax
mov [ebx + TCP_SOCKET.timer_retransmission], 0 ; turn off retransmission timer
mov [ebx + TCP_SOCKET.t_rtt], 0
mov eax, [edx + TCP_segment.AckNumber]
mov [ebx + TCP_SOCKET.SND_NXT], eax
mov eax, [ebx + TCP_SOCKET.t_maxseg]
mov [ebx + TCP_SOCKET.SND_CWND], eax
mov eax, ebx
call TCP_output ; retransmit missing segment
push edx
xor edx, edx
mov eax, [ebx + TCP_SOCKET.t_maxseg]
mul [ebx + TCP_SOCKET.t_dupacks]
pop edx
add eax, [ebx + TCP_SOCKET.SND_SSTHRESH]
mov [ebx + TCP_SOCKET.SND_CWND], eax
pop eax ; <<<<
cmp eax, [ebx + TCP_SOCKET.SND_NXT]
jl @f
mov [ebx + TCP_SOCKET.SND_NXT], eax
@@:
;;; call TCP_output
jmp .drop jmp .drop
.no_re_xmit:
jle .not_dup_ack
DEBUGF 1,"Increasing congestion window\n"
mov eax, [ebx + TCP_SOCKET.t_maxseg]
add [ebx + TCP_SOCKET.SND_CWND], eax
mov eax, ebx
call TCP_output
jmp .drop
.not_dup_ack: .not_dup_ack:
DEBUGF 1,"new ACK\n"
;------------------------------------------------- ;-------------------------------------------------
; If the congestion window was inflated to account ; If the congestion window was inflated to account
; for the other side's cached packets, retract it ; for the other side's cached packets, retract it
;;;; 888 - 902 mov eax, [ebx + TCP_SOCKET.SND_SSTHRESH]
cmp eax, [ebx + TCP_SOCKET.SND_CWND]
jg @f
cmp [ebx + TCP_SOCKET.t_dupacks], TCP_re_xmit_thresh
jle @f
mov [ebx + TCP_SOCKET.SND_CWND], eax
@@:
mov [ebx + TCP_SOCKET.t_dupacks], 0
mov eax, [edx + TCP_segment.AckNumber]
cmp eax, [ebx + TCP_SOCKET.SND_MAX]
jle @f
;;; TODO: update stats
jmp .drop_after_ack
@@:
mov edi, [edx + TCP_segment.AckNumber]
sub edi, [ebx + TCP_SOCKET.SND_UNA] ; now we got the number of acked bytes in esi
;;; TODO: update stats
DEBUGF 1,"We have an acceptable ACK of %x bytes\n", esi
@ -918,7 +1022,7 @@ align 4
;------------------------------------------ ;------------------------------------------
; RTT measurements and retransmission timer ; RTT measurements and retransmission timer
;;;;; 903 - 926 ;;;;; 912 - 926
mov [ebx + TCP_SOCKET.timer_retransmission], 0 mov [ebx + TCP_SOCKET.timer_retransmission], 0
@ -937,8 +1041,32 @@ align 4
;------------------------------------------- ;-------------------------------------------
; Open congestion window in response to ACKs ; Open congestion window in response to ACKs
;;;; mov esi, [ebx + TCP_SOCKET.SND_CWND]
mov eax, [ebx + TCP_SOCKET.t_maxseg]
cmp esi, [ebx + TCP_SOCKET.SND_SSTHRESH]
jle @f
push edx
push eax
mul eax
div esi
pop edx
shr edx, 3
add eax, edx
pop edx
@@:
add esi, eax
push ecx
mov cl, [ebx + TCP_SOCKET.SND_SCALE]
mov eax, TCP_max_win
shl eax, cl
pop ecx
cmp esi, eax
cmovg esi, eax
mov [ebx + TCP_SOCKET.SND_CWND], esi
@ -949,13 +1077,13 @@ align 4
;------------------------------------------ ;------------------------------------------
; Remove acknowledged data from send buffer ; Remove acknowledged data from send buffer
pusha push ecx edx ebx
mov ecx, [edx + TCP_segment.AckNumber] mov ecx, edi
sub ecx, [ebx + TCP_SOCKET.SND_UNA] ; ecx now holds number of bytes acked
lea eax, [ebx + STREAM_SOCKET.snd] lea eax, [ebx + STREAM_SOCKET.snd]
call SOCKET_ring_free call SOCKET_ring_free
popa pop ebx
sub [ebx + TCP_SOCKET.SND_WND], ecx
pop edx ecx
; Wake up process waiting on send buffer ; Wake up process waiting on send buffer
@ -977,6 +1105,7 @@ align 4
; General ACK handling complete ; General ACK handling complete
; Now do the state-specific ones ; Now do the state-specific ones
@ -1016,8 +1145,9 @@ align 4
.reset_dupacks: ; We got a new ACK, reset duplicate ACK counter
align 4 mov [ebx + TCP_SOCKET.t_dupacks], 0
.ack_processed: ; (step 6) .ack_processed: ; (step 6)

View File

@ -1,3 +1,21 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; Part of the tcp/ip network stack for KolibriOS ;;
;; ;;
;; Written by hidnplayr@kolibrios.org ;;
;; ;;
;; Based on the code of 4.4BSD ;;
;; ;;
;; GNU GENERAL PUBLIC LICENSE ;;
;; Version 2, June 1991 ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
;----------------------------------------------------------------- ;-----------------------------------------------------------------
; ;
; TCP_output ; TCP_output

View File

@ -1,5 +1,20 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; Part of the tcp/ip network stack for KolibriOS ;;
;; ;;
;; Written by hidnplayr@kolibrios.org ;;
;; ;;
;; Based on the code of 4.4BSD ;;
;; ;;
;; GNU GENERAL PUBLIC LICENSE ;;
;; Version 2, June 1991 ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
macro TCP_checksum IP1, IP2 { macro TCP_checksum IP1, IP2 {

View File

@ -1,3 +1,20 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; Part of the tcp/ip network stack for KolibriOS ;;
;; ;;
;; Written by hidnplayr@kolibrios.org ;;
;; ;;
;; Based on the code of 4.4BSD ;;
;; ;;
;; GNU GENERAL PUBLIC LICENSE ;;
;; Version 2, June 1991 ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
;---------------------- ;----------------------
; 160 ms timer ; 160 ms timer