diff --git a/kernel/branches/net/applications/socketdbg/socket.inc b/kernel/branches/net/applications/socketdbg/socket.inc new file mode 100644 index 0000000000..c612467bf1 --- /dev/null +++ b/kernel/branches/net/applications/socketdbg/socket.inc @@ -0,0 +1,164 @@ +struct LHEAD + next dd ? ;next object in list + prev dd ? ;prev object in list +ends + +struct MUTEX + lhead LHEAD + count dd ? +ends + + +struct SOCKET + + NextPtr dd ? ; pointer to next socket in list + PrevPtr dd ? ; pointer to previous socket in list + Number dd ? ; socket number + + mutex MUTEX + + PID dd ? ; application process id + Domain dd ? ; INET/UNIX/.. + Type dd ? ; RAW/STREAM/DGRAP + Protocol dd ? ; ICMP/IPv4/ARP/TCP/UDP + errorcode dd ? + device dd ? + + options dd ? + state dd ? + backlog dw ? ; how many incomming connections that can be queued + + snd_proc dd ? + rcv_proc dd ? + +ends + +struct IP_SOCKET SOCKET + + LocalIP rd 4 ; network byte order + RemoteIP rd 4 ; network byte order + +ends + +struct TCP_SOCKET IP_SOCKET + + LocalPort dw ? ; network byte order + RemotePort dw ? ; network byte order + + t_state dd ? ; TCB state + t_rxtshift db ? + rb 3 ; align + t_rxtcur dd ? + t_dupacks dd ? + t_maxseg dd ? + t_force dd ? + t_flags dd ? + +;--------------- +; RFC783 page 21 + +; send sequence + SND_UNA dd ? ; sequence number of unack'ed sent Packets + SND_NXT dd ? ; next send sequence number to use + SND_UP dd ? ; urgent pointer + SND_WL1 dd ? ; window minus one + SND_WL2 dd ? ; + ISS dd ? ; initial send sequence number + SND_WND dd ? ; send window + +; receive sequence + RCV_WND dd ? ; receive window + RCV_NXT dd ? ; next receive sequence number to use + RCV_UP dd ? ; urgent pointer + IRS dd ? ; initial receive sequence number + +;--------------------- +; Additional variables + +; receive variables + RCV_ADV dd ? + +; retransmit variables + SND_MAX dd ? + +; congestion control + SND_CWND dd ? + SND_SSTHRESH dd ? + +;---------------------- +; Transmit timing stuff + t_idle dd ? + t_rtt dd ? + t_rtseq dd ? + t_srtt dd ? + t_rttvar dd ? + t_rttmin dd ? + max_sndwnd dd ? + +;----------------- +; Out-of-band data + t_oobflags dd ? + t_iobc dd ? + t_softerror dd ? + + +;--------- +; RFC 1323 ; the order of next 4 elements may not change + + SND_SCALE db ? + RCV_SCALE db ? + requested_s_scale db ? + request_r_scale db ? + + ts_recent dd ? ; a copy of the most-recent valid timestamp from the other end + ts_recent_age dd ? + last_ack_sent dd ? + + +;------- +; Timers + timer_retransmission dd ? ; rexmt + timer_persist dd ? + timer_keepalive dd ? ; keepalive/syn timeout + timer_timed_wait dd ? ; also used as 2msl timer + +; extra + + ts_ecr dd ? ; timestamp echo reply + ts_val dd ? + temp_bits db ? + +ends + +struct UDP_SOCKET IP_SOCKET + + LocalPort dw ? ; network byte order + RemotePort dw ? ; network byte order + firstpacket db ? + +ends + + +struct ICMP_SOCKET IP_SOCKET + + Identifier dw ? + +ends + + +struct RING_BUFFER + + start_ptr dd ? ; Pointer to start of buffer + end_ptr dd ? ; pointer to end of buffer + read_ptr dd ? ; Read pointer + write_ptr dd ? ; Write pointer + size dd ? ; Number of bytes buffered + +ends + +struct STREAM_SOCKET TCP_SOCKET + + rcv RING_BUFFER + snd RING_BUFFER + +ends \ No newline at end of file diff --git a/kernel/branches/net/applications/socketdbg/socketdbg.asm b/kernel/branches/net/applications/socketdbg/socketdbg.asm new file mode 100644 index 0000000000..7723d23787 --- /dev/null +++ b/kernel/branches/net/applications/socketdbg/socketdbg.asm @@ -0,0 +1,100 @@ +format binary as "" + +use32 +; standard header + db 'MENUET01' ; signature + dd 1 ; header version + dd start ; entry point + dd i_end ; initialized size + dd mem ; required memory + dd mem ; stack pointer + dd 0 ; parameters + dd 0 ; path + +; useful includes +include '../macros.inc' +purge mov,add,sub +include '../proc32.inc' +include '../dll.inc' + +include '../struct.inc' + +include 'socket.inc' + +; entry point +start: + mcall 40, 0 ; we dont want any events +; load libraries + stdcall dll.Load, @IMPORT + test eax, eax + jnz exit +; initialize console + push 1 + call [con_start] + push title + push -1 + push -1 + push -1 + push -1 + call [con_init] +; main loop +main: + mcall 75, 255, 0, socket_list ; get current socket list + + call [con_cls] + + mov esi, socket_list + .loop: + lodsd + test eax, eax + jz .done + + mov ecx, eax + mcall 75, 255, , socket_buf + + pushd [socket_buf + SOCKET.state] + pushd [socket_buf + SOCKET.PID] + pushd [socket_buf + SOCKET.Number] + push str_sock + call [con_printf] + add esp, 4 + + jmp .loop + + .done: + + mcall 23, 50 + + jmp main + + + push 0 + call [con_exit] +exit: + mcall -1 + +; data +title db 'Socket debugger', 0 + +str_sock db 'Socket=%d PID=%d state=%d', 10, 0 + +; import +align 4 +@IMPORT: + +library console, 'console.obj' + +import console, \ + con_start, 'START', \ + con_init, 'con_init', \ + con_cls, 'con_cls', \ + con_exit, 'con_exit', \ + con_printf, 'con_printf' +i_end: + +socket_list rd 4096 +socket_buf rd 4096 + +align 4 +rb 4096 ; stack +mem: diff --git a/kernel/branches/net/network/socket.inc b/kernel/branches/net/network/socket.inc index 209a11a4e7..3871e03812 100644 --- a/kernel/branches/net/network/socket.inc +++ b/kernel/branches/net/network/socket.inc @@ -1092,17 +1092,37 @@ SOCKET_debug: DEBUGF 1,"SOCKET_debug\n" + mov edi, edx + + test ecx, ecx + jz .returnall + call SOCKET_num_to_ptr jz s_error mov esi, eax - mov edi, edx mov ecx, SOCKETBUFFSIZE/4 rep movsd mov dword [esp+32], 0 ret + .returnall: + mov ebx, net_sockets + .next_socket: + mov ebx, [ebx + SOCKET.NextPtr] + test ebx, ebx + jz .done + mov eax, [ebx + SOCKET.Number] + stosd + jmp .next_socket + .done: + xor eax, eax + stosd + + mov dword [esp+32], 0 + ret + ;----------------------------------------------------------------- ; diff --git a/kernel/branches/net/network/stack.inc b/kernel/branches/net/network/stack.inc index 54578608bb..3fdc501a6d 100644 --- a/kernel/branches/net/network/stack.inc +++ b/kernel/branches/net/network/stack.inc @@ -595,7 +595,7 @@ checksum_2: ;---------------------------------------------------------------- ; -; System function to work with network devices (76) +; System function to work with network devices (75) ; ;---------------------------------------------------------------- align 4 diff --git a/kernel/branches/net/network/tcp.inc b/kernel/branches/net/network/tcp.inc index f0e14a329e..8d46dfe7d2 100644 --- a/kernel/branches/net/network/tcp.inc +++ b/kernel/branches/net/network/tcp.inc @@ -145,6 +145,7 @@ macro TCP_init { include 'tcp_timer.inc' include 'tcp_subr.inc' +include 'tcp_usreq.inc' include 'tcp_input.inc' include 'tcp_output.inc' diff --git a/kernel/branches/net/network/tcp_output.inc b/kernel/branches/net/network/tcp_output.inc index c63807d107..33c87f4f06 100644 --- a/kernel/branches/net/network/tcp_output.inc +++ b/kernel/branches/net/network/tcp_output.inc @@ -81,6 +81,8 @@ TCP_output: cmp [eax + TCP_SOCKET.t_force], 0 je .no_force + DEBUGF 1,"TCP_output: forcing data out\n" + test ecx, ecx jnz .no_zero_window diff --git a/kernel/branches/net/network/tcp_subr.inc b/kernel/branches/net/network/tcp_subr.inc index 9af2ecfb50..169e7d472a 100644 --- a/kernel/branches/net/network/tcp_subr.inc +++ b/kernel/branches/net/network/tcp_subr.inc @@ -195,87 +195,6 @@ TCP_close: -;------------------------- -; -; TCP_disconnect -; -; IN: eax = socket ptr -; OUT: eax = socket ptr -; -;------------------------- -align 4 -TCP_disconnect: - - DEBUGF 1,"TCP_disconnect: %x\n", eax - - cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED - jb TCP_close - - -; TODO: implement LINGER ? - - call SOCKET_is_disconnecting - call TCP_usrclosed - call TCP_output - - ret - - - -;------------------------- -; -; TCP_usrclose -; -; IN: eax = socket ptr -; -;------------------------- -align 4 -TCP_usrclosed: - - DEBUGF 1,"TCP_usrclosed: %x\n", eax - - push ebx - mov ebx, [eax + TCP_SOCKET.t_state] - mov ebx, dword [.switch + ebx*4] - jmp ebx - - .switch: - - dd .close ; TCPS_CLOSED - dd .close ; TCPS_LISTEN - dd .close ; TCPS_SYN_SENT - dd .wait1 ; TCPS_SYN_RECEIVED - dd .wait1 ; TCPS_ESTABLISHED - dd .last_ack ; TCPS_CLOSE_WAIT - dd .ret ; TCPS_FIN_WAIT_1 - dd .ret ; TCPS_CLOSING - dd .ret ; TCPS_LAST_ACK - dd .disc ; TCPS_FIN_WAIT_2 - dd .disc ; TCPS_TIMED_WAIT - - - .close: - pop ebx - mov [eax + TCP_SOCKET.t_state], TCPS_CLOSED - call TCP_close - ret - - .wait1: - pop ebx - mov [eax + TCP_SOCKET.t_state], TCPS_FIN_WAIT_1 - ret - - .last_ack: - pop ebx - mov [eax + TCP_SOCKET.t_state], TCPS_LAST_ACK - ret - - .disc: - call SOCKET_is_disconnected - .ret: - pop ebx - ret - ;------------------------- ; diff --git a/kernel/branches/net/network/tcp_usreq.inc b/kernel/branches/net/network/tcp_usreq.inc new file mode 100644 index 0000000000..24b2a5c09d --- /dev/null +++ b/kernel/branches/net/network/tcp_usreq.inc @@ -0,0 +1,100 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2004-2012. 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 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;------------------------- +; +; TCP_usrclose +; +; Move connection to next state, based on process close. +; +; IN: eax = socket ptr +; +;------------------------- +align 4 +TCP_usrclosed: + + DEBUGF 1,"TCP_usrclosed: %x\n", eax + + push ebx + mov ebx, [eax + TCP_SOCKET.t_state] + mov ebx, dword [.switch + ebx*4] + jmp ebx + + .switch: + + dd .close ; TCPS_CLOSED + dd .close ; TCPS_LISTEN + dd .close ; TCPS_SYN_SENT + dd .wait1 ; TCPS_SYN_RECEIVED + dd .wait1 ; TCPS_ESTABLISHED + dd .last_ack ; TCPS_CLOSE_WAIT + dd .ret ; TCPS_FIN_WAIT_1 + dd .ret ; TCPS_CLOSING + dd .ret ; TCPS_LAST_ACK + dd .disc ; TCPS_FIN_WAIT_2 + dd .disc ; TCPS_TIMED_WAIT + + + .close: + mov [eax + TCP_SOCKET.t_state], TCPS_CLOSED + call TCP_close + pop ebx + ret + + .wait1: + mov [eax + TCP_SOCKET.t_state], TCPS_FIN_WAIT_1 + pop ebx + ret + + .last_ack: + mov [eax + TCP_SOCKET.t_state], TCPS_LAST_ACK + pop ebx + ret + + .disc: + call SOCKET_is_disconnected + .ret: + pop ebx + ret + + + + +;------------------------- +; +; TCP_disconnect +; +; IN: eax = socket ptr +; OUT: eax = socket ptr +; +;------------------------- +align 4 +TCP_disconnect: + + DEBUGF 1,"TCP_disconnect: %x\n", eax + + cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED + jb TCP_close + + +; TODO: implement LINGER ? + + call SOCKET_is_disconnecting + call TCP_usrclosed + call TCP_output + + ret \ No newline at end of file