forked from KolibriOS/kolibrios
Added simple socket debugging tool.
Moved some TCP code to tcp_usreq.inc. git-svn-id: svn://kolibrios.org@3146 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
9e043be92f
commit
2033224063
164
kernel/branches/net/applications/socketdbg/socket.inc
Normal file
164
kernel/branches/net/applications/socketdbg/socket.inc
Normal file
@ -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
|
100
kernel/branches/net/applications/socketdbg/socketdbg.asm
Normal file
100
kernel/branches/net/applications/socketdbg/socketdbg.asm
Normal file
@ -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:
|
@ -1092,17 +1092,37 @@ SOCKET_debug:
|
|||||||
|
|
||||||
DEBUGF 1,"SOCKET_debug\n"
|
DEBUGF 1,"SOCKET_debug\n"
|
||||||
|
|
||||||
|
mov edi, edx
|
||||||
|
|
||||||
|
test ecx, ecx
|
||||||
|
jz .returnall
|
||||||
|
|
||||||
call SOCKET_num_to_ptr
|
call SOCKET_num_to_ptr
|
||||||
jz s_error
|
jz s_error
|
||||||
|
|
||||||
mov esi, eax
|
mov esi, eax
|
||||||
mov edi, edx
|
|
||||||
mov ecx, SOCKETBUFFSIZE/4
|
mov ecx, SOCKETBUFFSIZE/4
|
||||||
rep movsd
|
rep movsd
|
||||||
|
|
||||||
mov dword [esp+32], 0
|
mov dword [esp+32], 0
|
||||||
ret
|
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
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------
|
;-----------------------------------------------------------------
|
||||||
;
|
;
|
||||||
|
@ -595,7 +595,7 @@ checksum_2:
|
|||||||
|
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
;
|
;
|
||||||
; System function to work with network devices (76)
|
; System function to work with network devices (75)
|
||||||
;
|
;
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
align 4
|
align 4
|
||||||
|
@ -145,6 +145,7 @@ macro TCP_init {
|
|||||||
|
|
||||||
include 'tcp_timer.inc'
|
include 'tcp_timer.inc'
|
||||||
include 'tcp_subr.inc'
|
include 'tcp_subr.inc'
|
||||||
|
include 'tcp_usreq.inc'
|
||||||
include 'tcp_input.inc'
|
include 'tcp_input.inc'
|
||||||
include 'tcp_output.inc'
|
include 'tcp_output.inc'
|
||||||
|
|
||||||
|
@ -81,6 +81,8 @@ TCP_output:
|
|||||||
cmp [eax + TCP_SOCKET.t_force], 0
|
cmp [eax + TCP_SOCKET.t_force], 0
|
||||||
je .no_force
|
je .no_force
|
||||||
|
|
||||||
|
DEBUGF 1,"TCP_output: forcing data out\n"
|
||||||
|
|
||||||
test ecx, ecx
|
test ecx, ecx
|
||||||
jnz .no_zero_window
|
jnz .no_zero_window
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
|
|
||||||
|
|
||||||
;-------------------------
|
;-------------------------
|
||||||
;
|
;
|
||||||
|
100
kernel/branches/net/network/tcp_usreq.inc
Normal file
100
kernel/branches/net/network/tcp_usreq.inc
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user