From b23bd6c7e35f7dfb0def34761a3bad3c50211e10 Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Sat, 21 Feb 2015 15:07:30 +0000 Subject: [PATCH] Collect some more TCP statistics. git-svn-id: svn://kolibrios.org@5442 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/network/socket.inc | 10 +---- kernel/trunk/network/tcp_input.inc | 24 +++++++----- kernel/trunk/network/tcp_output.inc | 59 ++++++++++++++++++++++++----- kernel/trunk/network/tcp_timer.inc | 2 + kernel/trunk/network/tcp_usreq.inc | 2 + 5 files changed, 71 insertions(+), 26 deletions(-) diff --git a/kernel/trunk/network/socket.inc b/kernel/trunk/network/socket.inc index cb232b1aa5..374534b27c 100644 --- a/kernel/trunk/network/socket.inc +++ b/kernel/trunk/network/socket.inc @@ -98,9 +98,9 @@ struct TCP_SOCKET IP_SOCKET ;---------------------- ; 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 @@ SOCKET_free: 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: diff --git a/kernel/trunk/network/tcp_input.inc b/kernel/trunk/network/tcp_input.inc index 0474b42da0..5bfc0de242 100644 --- a/kernel/trunk/network/tcp_input.inc +++ b/kernel/trunk/network/tcp_input.inc @@ -394,13 +394,18 @@ endl 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 @@ endl or [ebx + TCP_SOCKET.t_flags], TF_ACKNOW mov eax, ecx + inc [TCPS_rcvpartduppack] + ;;; TODO: update stats ;----------------------------------------------- @@ -662,7 +669,7 @@ endl mov eax, ebx call TCP_close -;;; TODO: update stats + inc [TCPS_rcvafterclose] jmp .respond_seg_reset ;---------------------------------------- @@ -985,17 +992,14 @@ endl 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 @@ align 4 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 diff --git a/kernel/trunk/network/tcp_output.inc b/kernel/trunk/network/tcp_output.inc index 4a0c056c6c..c24f708014 100644 --- a/kernel/trunk/network/tcp_output.inc +++ b/kernel/trunk/network/tcp_output.inc @@ -90,10 +90,9 @@ endl cmp ebx, [eax + STREAM_SOCKET.snd.size] jae @f - and dl, not (TH_FIN) - @@: + inc ecx jmp .no_force @@ -113,7 +112,6 @@ endl @@: sub esi, ebx - ;------------------------ ; check for window shrink (107) @@ -146,7 +144,6 @@ endl 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 @@ endl cmp edi, [eax + STREAM_SOCKET.snd.size] jae @f and dl, not (TH_FIN) - @@: ;------------------------------- @@ -403,6 +399,50 @@ endl 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 @@ endl 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 @@ endl 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 @@ endl 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 @@ endl call NET_ptr_to_num4 inc [TCP_segments_tx + edi] + inc [TCPS_sndtotal] ; update advertised receive window test ecx, ecx diff --git a/kernel/trunk/network/tcp_timer.inc b/kernel/trunk/network/tcp_timer.inc index 341a582dc3..a46fac9871 100644 --- a/kernel/trunk/network/tcp_timer.inc +++ b/kernel/trunk/network/tcp_timer.inc @@ -54,6 +54,8 @@ local .exit ; call TCP_output ;; pop ebx + inc [TCPS_delack] ; update stats + jmp .loop .exit: diff --git a/kernel/trunk/network/tcp_usreq.inc b/kernel/trunk/network/tcp_usreq.inc index 1a167c61f2..bdcae9142f 100644 --- a/kernel/trunk/network/tcp_usreq.inc +++ b/kernel/trunk/network/tcp_usreq.inc @@ -89,6 +89,8 @@ TCP_connect: test [eax + SOCKET.state], SS_ISCONNECTED jnz .eisconn + inc [TCPS_connattempt] ; update stats + push eax edx lea ecx, [eax + SOCKET.mutex] call mutex_lock