forked from KolibriOS/kolibrios
Update in TCP code for net branch.
git-svn-id: svn://kolibrios.org@1719 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
585e2cd30a
commit
b70514e695
@ -150,7 +150,9 @@ local .loop
|
|||||||
include "queue.inc"
|
include "queue.inc"
|
||||||
|
|
||||||
include "ethernet.inc"
|
include "ethernet.inc"
|
||||||
|
|
||||||
;include "slip.inc"
|
;include "slip.inc"
|
||||||
|
;include "pppoe.inc"
|
||||||
|
|
||||||
include "ARP.inc"
|
include "ARP.inc"
|
||||||
include "IPv4.inc"
|
include "IPv4.inc"
|
||||||
|
@ -572,7 +572,8 @@ TCP_input:
|
|||||||
mov eax, [edx + TCP_segment.SequenceNumber]
|
mov eax, [edx + TCP_segment.SequenceNumber]
|
||||||
cmp eax, [ebx + TCP_SOCKET.RCV_NXT]
|
cmp eax, [ebx + TCP_SOCKET.RCV_NXT]
|
||||||
jne .not_uni_xfer
|
jne .not_uni_xfer
|
||||||
|
DEBUGF 1,"TCP_segment.window=%u\n", [edx + TCP_segment.Window]:4
|
||||||
|
DEBUGF 1,"TCP_SOCKET.SND_WND=%u\n", [ebx + TCP_SOCKET.SND_WND]:4
|
||||||
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 .not_uni_xfer
|
jne .not_uni_xfer
|
||||||
@ -613,9 +614,11 @@ TCP_input:
|
|||||||
; Update RTT estimators
|
; Update RTT estimators
|
||||||
|
|
||||||
; Delete acknowledged bytes from send buffer
|
; Delete acknowledged bytes from send buffer
|
||||||
|
pusha
|
||||||
mov ecx, eax
|
mov ecx, eax
|
||||||
lea eax, [ebx + STREAM_SOCKET.snd]
|
lea eax, [ebx + STREAM_SOCKET.snd]
|
||||||
call SOCKET_ring_free
|
call SOCKET_ring_free
|
||||||
|
popa
|
||||||
|
|
||||||
; update window pointers
|
; update window pointers
|
||||||
mov eax, [edx + TCP_segment.AckNumber]
|
mov eax, [edx + TCP_segment.AckNumber]
|
||||||
@ -629,12 +632,12 @@ TCP_input:
|
|||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call SOCKET_notify_owner
|
call SOCKET_notify_owner
|
||||||
|
|
||||||
;; Generate more output
|
;; Generate more output FIXME
|
||||||
;; mov eax, ebx
|
;; mov eax, ebx
|
||||||
;; call TCP_output
|
;; call TCP_output
|
||||||
;;
|
;;
|
||||||
;; jmp .drop
|
;; jmp .drop
|
||||||
jmp .step6
|
jmp .ack_processed
|
||||||
|
|
||||||
;-------------------------------------------------
|
;-------------------------------------------------
|
||||||
; maybe we are the receiver in the uni-xfer then..
|
; maybe we are the receiver in the uni-xfer then..
|
||||||
@ -647,7 +650,9 @@ TCP_input:
|
|||||||
cmp eax, [ebx + TCP_SOCKET.SND_UNA]
|
cmp eax, [ebx + TCP_SOCKET.SND_UNA]
|
||||||
jne .not_uni_xfer
|
jne .not_uni_xfer
|
||||||
|
|
||||||
; - The reassembly list of out-of-order segments for the connection is empty (seg_next equals tp). ;;;;;;;
|
; - The reassembly list of out-of-order segments for the connection is empty (seg_next equals tp).
|
||||||
|
|
||||||
|
;;;;;;; TODO
|
||||||
|
|
||||||
jnz .not_uni_xfer
|
jnz .not_uni_xfer
|
||||||
|
|
||||||
@ -656,12 +661,14 @@ 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 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
|
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
|
||||||
@ -767,8 +774,6 @@ align 4
|
|||||||
mov eax, [edx + TCP_segment.AckNumber]
|
mov eax, [edx + TCP_segment.AckNumber]
|
||||||
cmp eax, [ebx + TCP_SOCKET.ISS]
|
cmp eax, [ebx + TCP_SOCKET.ISS]
|
||||||
jle .drop_with_reset
|
jle .drop_with_reset
|
||||||
|
|
||||||
; mov eax, [edx + TCP_segment.AckNumber]
|
|
||||||
cmp eax, [ebx + TCP_SOCKET.SND_MAX]
|
cmp eax, [ebx + TCP_SOCKET.SND_MAX]
|
||||||
jg .drop_with_reset
|
jg .drop_with_reset
|
||||||
@@:
|
@@:
|
||||||
@ -779,6 +784,7 @@ align 4
|
|||||||
test [edx + TCP_segment.Flags], TH_ACK
|
test [edx + TCP_segment.Flags], TH_ACK
|
||||||
jz .drop
|
jz .drop
|
||||||
|
|
||||||
|
mov eax, ebx
|
||||||
mov ebx, ECONNREFUSED
|
mov ebx, ECONNREFUSED
|
||||||
call TCP_drop
|
call TCP_drop
|
||||||
|
|
||||||
@ -855,7 +861,7 @@ align 4
|
|||||||
; TODO...
|
; TODO...
|
||||||
@@:
|
@@:
|
||||||
;;;;;
|
;;;;;
|
||||||
jmp .step6
|
jmp .ack_processed
|
||||||
|
|
||||||
|
|
||||||
.trim_then_step6:
|
.trim_then_step6:
|
||||||
@ -867,8 +873,6 @@ 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]
|
||||||
|
|
||||||
test eax, eax
|
|
||||||
jz .no_duplicate
|
jz .no_duplicate
|
||||||
|
|
||||||
test [edx + TCP_segment.Flags], TH_SYN
|
test [edx + TCP_segment.Flags], TH_SYN
|
||||||
@ -1064,6 +1068,7 @@ align 4
|
|||||||
test [edx + TCP_segment.Flags], TH_SYN
|
test [edx + TCP_segment.Flags], TH_SYN
|
||||||
jz @f
|
jz @f
|
||||||
|
|
||||||
|
mov eax, ebx
|
||||||
mov ebx, ECONNRESET
|
mov ebx, ECONNRESET
|
||||||
call TCP_drop
|
call TCP_drop
|
||||||
|
|
||||||
@ -1072,30 +1077,49 @@ align 4
|
|||||||
test [edx + TCP_segment.Flags], TH_ACK
|
test [edx + TCP_segment.Flags], TH_ACK
|
||||||
jz .drop
|
jz .drop
|
||||||
@@:
|
@@:
|
||||||
;----------------
|
|
||||||
; Process the ACK
|
;---------------
|
||||||
|
; ACK processing
|
||||||
|
|
||||||
cmp [ebx + TCP_SOCKET.t_state], TCB_SYN_RECEIVED
|
cmp [ebx + TCP_SOCKET.t_state], TCB_SYN_RECEIVED
|
||||||
jg .ack_dup
|
jnz .no_syn_rcv
|
||||||
jl .ack_nodup
|
|
||||||
|
|
||||||
DEBUGF 1,"TCP state = syn received\n"
|
DEBUGF 1,"TCP state = syn received\n"
|
||||||
|
|
||||||
;;;;;
|
;;;;; 801-815
|
||||||
|
|
||||||
.ack_nodup:
|
.no_syn_rcv:
|
||||||
|
|
||||||
DEBUGF 1,"New ACK\n"
|
; check for duplicate ACK
|
||||||
|
|
||||||
|
mov eax, [edx + TCP_segment.AckNumber]
|
||||||
|
cmp eax, [ebx + TCP_SOCKET.SND_UNA]
|
||||||
|
jg .not_dup_ack
|
||||||
|
|
||||||
|
DEBUGF 1,"Duplicate ACK\n"
|
||||||
|
|
||||||
.ack_dup:
|
test ecx, ecx
|
||||||
|
jnz .ack_processed
|
||||||
|
|
||||||
|
mov eax, dword [edx + TCP_segment.Window]
|
||||||
|
cmp eax, [ebx + TCP_SOCKET.SND_WND]
|
||||||
|
jne .ack_processed
|
||||||
|
|
||||||
|
; Process the duplicate ACK
|
||||||
|
|
||||||
|
;;;;; 833 - 878
|
||||||
|
|
||||||
|
;;; call TCP_output
|
||||||
|
jmp .drop
|
||||||
|
|
||||||
|
.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, retrace it
|
; for the other side's cached packets, retract it
|
||||||
|
|
||||||
;;;; 888 - 902
|
;;;; 888 - 902
|
||||||
|
|
||||||
@ -1123,17 +1147,20 @@ align 4
|
|||||||
; Remove acknowledged data from send buffer
|
; Remove acknowledged data from send buffer
|
||||||
|
|
||||||
pusha
|
pusha
|
||||||
; Delete acknowledged bytes from send buffer
|
|
||||||
mov ecx, [edx + TCP_segment.AckNumber]
|
mov ecx, [edx + TCP_segment.AckNumber]
|
||||||
sub ecx, [ebx + TCP_SOCKET.SND_UNA]
|
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
|
popa
|
||||||
|
|
||||||
|
;---------------------------------------
|
||||||
|
; Wake up process waiting on send buffer
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; code missing (943?)
|
mov eax, ebx
|
||||||
|
call SOCKET_notify_owner
|
||||||
|
|
||||||
|
; Update TCB
|
||||||
|
|
||||||
mov eax, [edx + TCP_segment.AckNumber]
|
mov eax, [edx + TCP_segment.AckNumber]
|
||||||
mov [ebx + TCP_SOCKET.SND_UNA], eax
|
mov [ebx + TCP_SOCKET.SND_UNA], eax
|
||||||
@ -1143,54 +1170,55 @@ align 4
|
|||||||
mov [ebx + TCP_SOCKET.SND_NXT], eax
|
mov [ebx + TCP_SOCKET.SND_NXT], eax
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
|
; General ACK handling complete
|
||||||
;---------------------------------------
|
; Now do the state-specific ones
|
||||||
; Wake up process waiting on send buffer
|
|
||||||
|
|
||||||
mov eax, ebx
|
|
||||||
call SOCKET_notify_owner
|
|
||||||
|
|
||||||
mov eax, [ebx + TCP_SOCKET.t_state]
|
mov eax, [ebx + TCP_SOCKET.t_state]
|
||||||
shl eax, 2
|
jmp dword [eax*4 + .ACK_sw_list]
|
||||||
jmp dword [eax + .ACK_sw_list]
|
|
||||||
|
|
||||||
.ACK_sw_list:
|
.ACK_sw_list:
|
||||||
dd .step6 ;TCB_CLOSED
|
dd .ack_processed ;TCB_CLOSED
|
||||||
dd .step6 ;TCB_LISTEN
|
dd .ack_processed ;TCB_LISTEN
|
||||||
dd .step6 ;TCB_SYN_SENT
|
dd .ack_processed ;TCB_SYN_SENT
|
||||||
dd .step6 ;TCB_SYN_RECEIVED
|
dd .ack_processed ;TCB_SYN_RECEIVED
|
||||||
dd .step6 ;TCB_ESTABLISHED
|
dd .ack_processed ;TCB_ESTABLISHED
|
||||||
dd .step6 ;TCB_CLOSE_WAIT
|
dd .ack_processed ;TCB_CLOSE_WAIT
|
||||||
dd ._963 ;TCB_FIN_WAIT_1
|
dd .ack_fw1 ;TCB_FIN_WAIT_1
|
||||||
dd ._958 ;TCB_CLOSING
|
dd .ack_c ;TCB_CLOSING
|
||||||
dd ._999 ;TCB_LAST_ACK
|
dd .ack_la ;TCB_LAST_ACK
|
||||||
dd .step6 ;TCB_FIN_WAIT_2
|
dd .ack_processed ;TCB_FIN_WAIT_2
|
||||||
dd ._1010 ;TCB_TIMED_WAIT
|
dd .ack_tw ;TCB_TIMED_WAIT
|
||||||
|
|
||||||
|
|
||||||
._963:
|
.ack_fw1:
|
||||||
|
|
||||||
|
;;; TODO: 963
|
||||||
|
|
||||||
|
jmp .ack_processed
|
||||||
|
|
||||||
|
.ack_c:
|
||||||
|
|
||||||
|
;;; TODO: 958
|
||||||
|
|
||||||
|
jmp .ack_processed
|
||||||
|
|
||||||
|
.ack_la:
|
||||||
|
|
||||||
|
;;; TODO: 999
|
||||||
|
|
||||||
|
jmp .ack_processed
|
||||||
|
|
||||||
|
|
||||||
jmp .step6
|
.ack_tw:
|
||||||
|
|
||||||
|
;;; TODO: 1010
|
||||||
|
|
||||||
|
jmp .ack_processed
|
||||||
|
|
||||||
|
|
||||||
._958:
|
.ack_processed:
|
||||||
|
|
||||||
jmp .step6
|
DEBUGF 1,"ack processed\n"
|
||||||
|
|
||||||
._999:
|
|
||||||
|
|
||||||
jmp .step6
|
|
||||||
|
|
||||||
|
|
||||||
._1010:
|
|
||||||
|
|
||||||
jmp .step6
|
|
||||||
|
|
||||||
|
|
||||||
.step6:
|
|
||||||
|
|
||||||
DEBUGF 1,"step 6\n"
|
|
||||||
|
|
||||||
;----------------------------------------------
|
;----------------------------------------------
|
||||||
; check if we need to update window information
|
; check if we need to update window information
|
||||||
@ -1383,17 +1411,11 @@ align 4
|
|||||||
|
|
||||||
;;; if debug enabled, output packet
|
;;; if debug enabled, output packet
|
||||||
|
|
||||||
;test ;;;needoutput = 1
|
;test needoutput, needoutput
|
||||||
;jnz .outputnow
|
;jz .dumpit
|
||||||
|
|
||||||
test [ebx + TCP_SOCKET.t_flags], TF_ACKNOW
|
test [ebx + TCP_SOCKET.t_flags], TF_ACKNOW
|
||||||
jnz .ack_now
|
jz .dumpit
|
||||||
|
|
||||||
call kernel_free
|
|
||||||
add esp, 4
|
|
||||||
ret
|
|
||||||
|
|
||||||
.ack_now:
|
|
||||||
|
|
||||||
DEBUGF 1,"ACK now!\n"
|
DEBUGF 1,"ACK now!\n"
|
||||||
|
|
||||||
@ -1402,6 +1424,8 @@ align 4
|
|||||||
call TCP_output
|
call TCP_output
|
||||||
pop ebx
|
pop ebx
|
||||||
|
|
||||||
|
.dumpit:
|
||||||
|
|
||||||
call kernel_free
|
call kernel_free
|
||||||
add esp, 4
|
add esp, 4
|
||||||
ret
|
ret
|
||||||
@ -2010,10 +2034,16 @@ TCP_drop:
|
|||||||
align 4
|
align 4
|
||||||
TCP_close:
|
TCP_close:
|
||||||
|
|
||||||
|
DEBUGF 1,"TCP_close\n"
|
||||||
|
|
||||||
;;; TODO: update RTT and mean deviation
|
;;; TODO: update RTT and mean deviation
|
||||||
;;; TODO: update slow start threshold
|
;;; TODO: update slow start threshold
|
||||||
;;; TODO: release connection resources
|
;;; TODO: release connection resources
|
||||||
|
|
||||||
|
; Now, mark the socket as being disconnected
|
||||||
|
|
||||||
|
mov [eax + SOCKET.state], 0 ;;; FIXME
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user