forked from KolibriOS/kolibrios
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:
parent
6af42a9b8e
commit
db55961834
@ -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
|
||||||
|
@ -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:
|
||||||
|
|
||||||
|
@ -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 ?
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user