Update in TCP code for net branch.

git-svn-id: svn://kolibrios.org@1719 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2010-12-17 23:04:18 +00:00
parent 585e2cd30a
commit b70514e695
2 changed files with 101 additions and 69 deletions

View File

@ -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"

View File

@ -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