/kernel/trunk/network/socket.inc |
---|
98,9 → 98,9 |
;---------------------- |
; Transmit timing stuff |
t_idle dd ? |
t_rtt dd ? |
t_rtt dd ? ; round trip time |
t_rtseq dd ? |
t_srtt dd ? |
t_srtt dd ? ; smoothed round trip time |
t_rttvar dd ? |
t_rttmin dd ? |
max_sndwnd dd ? |
1974,14 → 1974,8 |
jnz .no_tcp |
mov ebx, eax |
cmp [ebx + STREAM_SOCKET.rcv.start_ptr], 0 |
je @f |
stdcall kernel_free, [ebx + STREAM_SOCKET.rcv.start_ptr] |
@@: |
cmp [ebx + STREAM_SOCKET.snd.start_ptr], 0 |
je @f |
stdcall kernel_free, [ebx + STREAM_SOCKET.snd.start_ptr] |
@@: |
mov eax, ebx |
.no_tcp: |
/kernel/trunk/network/tcp_input.inc |
---|
394,13 → 394,18 |
pop ecx |
cmp eax, TCP_PAWS_IDLE |
jle .drop_after_ack ; TODO: update stats |
jle .paws_drop |
push ecx |
mov [ebx + TCP_SOCKET.ts_recent], 0 ; timestamp was invalid, fix it. |
.no_paws: |
jmp .opt_loop |
.paws_drop: |
inc [TCPS_rcvduppack] ; update stats |
add [TCPS_rcvdupbyte], ecx |
inc [TCPS_pawsdrop] |
jmp .drop_after_ack |
.no_options: |
pop ecx |
630,6 → 635,8 |
or [ebx + TCP_SOCKET.t_flags], TF_ACKNOW |
mov eax, ecx |
inc [TCPS_rcvpartduppack] |
;;; TODO: update stats |
;----------------------------------------------- |
662,7 → 669,7 |
mov eax, ebx |
call TCP_close |
;;; TODO: update stats |
inc [TCPS_rcvafterclose] |
jmp .respond_seg_reset |
;---------------------------------------- |
985,17 → 992,14 |
mov eax, [edx + TCP_header.AckNumber] |
cmp eax, [ebx + TCP_SOCKET.SND_MAX] |
jbe @f |
;;; TODO: update stats |
inc [TCPS_rcvacktoomuch] |
jmp .drop_after_ack |
@@: |
mov edi, [edx + TCP_header.AckNumber] |
sub edi, [ebx + TCP_SOCKET.SND_UNA] ; now we got the number of acked bytes in edi |
;;; TODO: update stats |
inc [TCPS_rcvackpack] |
add [TCPS_rcvackbyte], edi |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: acceptable ACK for %u bytes\n", edi |
;------------------------------------------ |
1209,6 → 1213,8 |
test [edx + TCP_header.Flags], TH_SYN |
jz .drop |
inc [TCPS_accepts] ; update stats |
;;; TODO: check if it's a broadcast or multicast, and drop if so |
push dword [edi] ; Ipv4 source addres |
/kernel/trunk/network/tcp_output.inc |
---|
90,10 → 90,9 |
cmp ebx, [eax + STREAM_SOCKET.snd.size] |
jae @f |
and dl, not (TH_FIN) |
@@: |
@@: |
inc ecx |
jmp .no_force |
113,7 → 112,6 |
@@: |
sub esi, ebx |
;------------------------ |
; check for window shrink (107) |
146,7 → 144,6 |
cmp esi, [eax + TCP_SOCKET.t_maxseg] |
jbe @f |
mov esi, [eax + TCP_SOCKET.t_maxseg] |
or [temp_bits], TCP_BIT_SENDALOT |
@@: |
160,7 → 157,6 |
cmp edi, [eax + STREAM_SOCKET.snd.size] |
jae @f |
and dl, not (TH_FIN) |
@@: |
;------------------------------- |
403,6 → 399,50 |
or [temp_bits], TCP_BIT_SENDALOT |
.no_overflow: |
; Update stats |
test esi, esi |
jz .zero_data |
cmp [eax + TCP_SOCKET.t_force], 1 |
jne @f |
cmp esi, 1 |
jne @f |
inc [TCPS_sndprobe] |
jmp .eos |
@@: |
mov ebx, [eax + TCP_SOCKET.SND_NXT] |
cmp ebx, [eax + TCP_SOCKET.SND_MAX] |
jae @f |
inc [TCPS_sndrexmitpack] |
add [TCPS_sndrexmitbyte], esi |
jmp .eos |
@@: |
inc [TCPS_sndpack] |
add [TCPS_sndbyte], esi |
jmp .eos |
.zero_data: |
test [eax + TCP_SOCKET.t_flags], TF_ACKNOW |
jz @f |
inc [TCPS_sndacks] |
jmp .eos |
@@: |
test dl, TH_SYN + TH_FIN + TH_RST |
jz @f |
inc [TCPS_sndctrl] |
jmp .eos |
@@: |
mov ebx, [eax + TCP_SOCKET.SND_UP] |
cmp ebx, [eax + TCP_SOCKET.SND_UNA] |
jb @f |
inc [TCPS_sndurg] |
jmp .eos |
@@: |
inc [TCPS_sndwinup] |
.eos: |
;---------------------------------------------------- |
; Calculate the receive window. |
; Dont shrink window, but avoid silly window syndrome |
469,8 → 509,8 |
call IPv4_output |
jz .ip_error |
;----------------------------------------- |
; Move TCP header from stack to TCP packet |
;------------------------------------------ |
; Move TCP header from stack to TCP segment |
push ecx |
mov ecx, [esp + 4] |
504,7 → 544,7 |
test ecx, ecx |
jz .nodata |
mov edx, [eax + TCP_SOCKET.SND_NXT] |
add [eax + TCP_SOCKET.SND_NXT], ecx ; update sequence number <<< CHECKME |
add [eax + TCP_SOCKET.SND_NXT], ecx ; update sequence number |
sub edx, [eax + TCP_SOCKET.SND_UNA] ; offset |
add eax, STREAM_SOCKET.snd |
call SOCKET_ring_read |
536,7 → 576,7 |
je @f |
mov [eax + TCP_SOCKET.t_rtt], 1 ; nope, start transmission timer |
mov [eax + TCP_SOCKET.t_rtseq], edi |
;TODO: update stats |
inc [TCPS_segstimed] |
@@: |
; set retransmission timer if not already set, and not doing an ACK or keepalive probe |
584,6 → 624,7 |
call NET_ptr_to_num4 |
inc [TCP_segments_tx + edi] |
inc [TCPS_sndtotal] |
; update advertised receive window |
test ecx, ecx |
/kernel/trunk/network/tcp_timer.inc |
---|
54,6 → 54,8 |
; call TCP_output ;; |
pop ebx |
inc [TCPS_delack] ; update stats |
jmp .loop |
.exit: |
/kernel/trunk/network/tcp_usreq.inc |
---|
89,6 → 89,8 |
test [eax + SOCKET.state], SS_ISCONNECTED |
jnz .eisconn |
inc [TCPS_connattempt] ; update stats |
push eax edx |
lea ecx, [eax + SOCKET.mutex] |
call mutex_lock |