forked from KolibriOS/kolibrios
Renamed some variables and constants in network code, removed NET_set_default function, improved TCP timers
git-svn-id: svn://kolibrios.org@3600 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
1267799afd
commit
c2bc66096c
@ -62,9 +62,9 @@ uglobal
|
|||||||
|
|
||||||
ARP_table rb ARP_TABLE_SIZE * sizeof.ARP_entry ; TODO: separate ARP table and stats per interface
|
ARP_table rb ARP_TABLE_SIZE * sizeof.ARP_entry ; TODO: separate ARP table and stats per interface
|
||||||
|
|
||||||
ARP_PACKETS_TX rd MAX_NET_DEVICES
|
ARP_PACKETS_TX rd NET_DEVICES_MAX
|
||||||
ARP_PACKETS_RX rd MAX_NET_DEVICES
|
ARP_PACKETS_RX rd NET_DEVICES_MAX
|
||||||
ARP_CONFLICTS rd MAX_NET_DEVICES
|
ARP_CONFLICTS rd NET_DEVICES_MAX
|
||||||
|
|
||||||
|
|
||||||
endg
|
endg
|
||||||
@ -84,7 +84,7 @@ macro ARP_init {
|
|||||||
mov [NumARP], eax
|
mov [NumARP], eax
|
||||||
|
|
||||||
mov edi, ARP_PACKETS_TX
|
mov edi, ARP_PACKETS_TX
|
||||||
mov ecx, 3*MAX_NET_DEVICES
|
mov ecx, 3*NET_DEVICES_MAX
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -318,7 +318,7 @@ ARP_output_request:
|
|||||||
lea eax, [ebx + ETH_DEVICE.mac] ; local device mac
|
lea eax, [ebx + ETH_DEVICE.mac] ; local device mac
|
||||||
mov edx, ETH_BROADCAST ; broadcast mac
|
mov edx, ETH_BROADCAST ; broadcast mac
|
||||||
mov ecx, sizeof.ARP_header
|
mov ecx, sizeof.ARP_header
|
||||||
mov di, ETHER_ARP
|
mov di, ETHER_PROTO_ARP
|
||||||
call ETH_output
|
call ETH_output
|
||||||
jz .exit
|
jz .exit
|
||||||
|
|
||||||
|
@ -58,17 +58,17 @@ ends
|
|||||||
align 4
|
align 4
|
||||||
uglobal
|
uglobal
|
||||||
|
|
||||||
IP_LIST rd MAX_NET_DEVICES
|
IP_LIST rd NET_DEVICES_MAX
|
||||||
SUBNET_LIST rd MAX_NET_DEVICES
|
SUBNET_LIST rd NET_DEVICES_MAX
|
||||||
DNS_LIST rd MAX_NET_DEVICES
|
DNS_LIST rd NET_DEVICES_MAX
|
||||||
GATEWAY_LIST rd MAX_NET_DEVICES
|
GATEWAY_LIST rd NET_DEVICES_MAX
|
||||||
BROADCAST_LIST rd MAX_NET_DEVICES
|
BROADCAST_LIST rd NET_DEVICES_MAX
|
||||||
|
|
||||||
IP_packets_tx rd MAX_NET_DEVICES
|
IP_packets_tx rd NET_DEVICES_MAX
|
||||||
IP_packets_rx rd MAX_NET_DEVICES
|
IP_packets_rx rd NET_DEVICES_MAX
|
||||||
IP_packets_dumped rd MAX_NET_DEVICES
|
IP_packets_dumped rd NET_DEVICES_MAX
|
||||||
|
|
||||||
FRAGMENT_LIST rb MAX_FRAGMENTS * sizeof.FRAGMENT_slot
|
FRAGMENT_LIST rb MAX_FRAGMENTS * sizeof.FRAGMENT_slot
|
||||||
endg
|
endg
|
||||||
|
|
||||||
|
|
||||||
@ -83,7 +83,7 @@ macro IPv4_init {
|
|||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov edi, IP_LIST
|
mov edi, IP_LIST
|
||||||
mov ecx, 7*MAX_NET_DEVICES + (sizeof.FRAGMENT_slot*MAX_FRAGMENTS)/4
|
mov ecx, 7*NET_DEVICES_MAX + (sizeof.FRAGMENT_slot*MAX_FRAGMENTS)/4
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -592,7 +592,7 @@ IPv4_output:
|
|||||||
mov edx, esp
|
mov edx, esp
|
||||||
mov ecx, [esp + 10 + 6]
|
mov ecx, [esp + 10 + 6]
|
||||||
add ecx, sizeof.IPv4_header
|
add ecx, sizeof.IPv4_header
|
||||||
mov di, ETHER_IPv4
|
mov di, ETHER_PROTO_IPv4
|
||||||
call ETH_output
|
call ETH_output
|
||||||
jz .eth_error
|
jz .eth_error
|
||||||
add esp, 6 ; pop the mac out of the stack
|
add esp, 6 ; pop the mac out of the stack
|
||||||
@ -637,7 +637,7 @@ IPv4_output:
|
|||||||
.loopback:
|
.loopback:
|
||||||
mov dword [esp + 2], eax
|
mov dword [esp + 2], eax
|
||||||
add ecx, sizeof.IPv4_header
|
add ecx, sizeof.IPv4_header
|
||||||
mov di, ETHER_IPv4
|
mov edi, AF_INET4
|
||||||
call LOOP_output
|
call LOOP_output
|
||||||
jmp .continue
|
jmp .continue
|
||||||
|
|
||||||
@ -681,7 +681,7 @@ IPv4_output_raw:
|
|||||||
mov edx, esp
|
mov edx, esp
|
||||||
mov ecx, [esp + 6 + 4]
|
mov ecx, [esp + 6 + 4]
|
||||||
add ecx, sizeof.IPv4_header
|
add ecx, sizeof.IPv4_header
|
||||||
mov di, ETHER_IPv4
|
mov di, ETHER_PROTO_IPv4
|
||||||
call ETH_output
|
call ETH_output
|
||||||
jz .error
|
jz .error
|
||||||
|
|
||||||
@ -775,7 +775,7 @@ IPv4_fragment:
|
|||||||
|
|
||||||
mov eax, [esp + 3*4]
|
mov eax, [esp + 3*4]
|
||||||
lea ebx, [esp + 4*4]
|
lea ebx, [esp + 4*4]
|
||||||
mov di , ETHER_IPv4
|
mov di , ETHER_PROTO_IPv4
|
||||||
call ETH_output
|
call ETH_output
|
||||||
|
|
||||||
cmp edi, -1
|
cmp edi, -1
|
||||||
@ -866,7 +866,7 @@ IPv4_route:
|
|||||||
je .broadcast
|
je .broadcast
|
||||||
|
|
||||||
xor edi, edi
|
xor edi, edi
|
||||||
mov ecx, MAX_NET_DEVICES
|
mov ecx, NET_DEVICES_MAX
|
||||||
.loop:
|
.loop:
|
||||||
mov ebx, [IP_LIST+edi]
|
mov ebx, [IP_LIST+edi]
|
||||||
and ebx, [SUBNET_LIST+edi]
|
and ebx, [SUBNET_LIST+edi]
|
||||||
|
@ -34,13 +34,13 @@ align 4
|
|||||||
uglobal
|
uglobal
|
||||||
|
|
||||||
IPv6:
|
IPv6:
|
||||||
.addresses rd 4*MAX_NET_DEVICES
|
.addresses rd 4*NET_DEVICES_MAX
|
||||||
.subnet rd 4*MAX_NET_DEVICES
|
.subnet rd 4*NET_DEVICES_MAX
|
||||||
.dns rd 4*MAX_NET_DEVICES
|
.dns rd 4*NET_DEVICES_MAX
|
||||||
.gateway rd 4*MAX_NET_DEVICES
|
.gateway rd 4*NET_DEVICES_MAX
|
||||||
|
|
||||||
.packets_tx rd MAX_NET_DEVICES
|
.packets_tx rd NET_DEVICES_MAX
|
||||||
.packets_rx rd MAX_NET_DEVICES
|
.packets_rx rd NET_DEVICES_MAX
|
||||||
|
|
||||||
endg
|
endg
|
||||||
|
|
||||||
|
@ -113,14 +113,14 @@ PPPoE_discovery_output:
|
|||||||
; Check that device exists and is ethernet device
|
; Check that device exists and is ethernet device
|
||||||
mov ebx, [eax + SOCKET.device]
|
mov ebx, [eax + SOCKET.device]
|
||||||
|
|
||||||
cmp ebx, MAX_NET_DEVICES
|
cmp ebx, NET_DEVICES_MAX
|
||||||
ja .bad
|
ja .bad
|
||||||
|
|
||||||
mov ebx, [NET_DRV_LIST + 4*ebx]
|
mov ebx, [NET_DRV_LIST + 4*ebx]
|
||||||
test ebx, ebx
|
test ebx, ebx
|
||||||
jz .bad
|
jz .bad
|
||||||
|
|
||||||
cmp [ebx + NET_DEVICE.type], NET_TYPE_ETH
|
cmp [ebx + NET_DEVICE.device_type], NET_DEVICE_ETH
|
||||||
jne .bad
|
jne .bad
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_output: device=%x\n", ebx
|
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_output: device=%x\n", ebx
|
||||||
@ -148,9 +148,9 @@ PPPoE_discovery_output:
|
|||||||
lea esi, [ebx + ETH_DEVICE.mac]
|
lea esi, [ebx + ETH_DEVICE.mac]
|
||||||
movsd
|
movsd
|
||||||
movsw
|
movsw
|
||||||
cmp word[edi], ETHER_PPP_SESSION ; Allow only PPP_discovery, or LCP
|
cmp word[edi], ETHER_PROTO_PPP_SESSION ; Allow only PPP_discovery, or LCP
|
||||||
je @f
|
je @f
|
||||||
mov ax, ETHER_PPP_DISCOVERY
|
mov ax, ETHER_PROTO_PPP_DISCOVERY
|
||||||
stosw
|
stosw
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
@ -200,10 +200,10 @@ PPPoE_session_input:
|
|||||||
mov ax, word [edx + PPPoE_frame.Payload]
|
mov ax, word [edx + PPPoE_frame.Payload]
|
||||||
add edx, PPPoE_frame.Payload + 2
|
add edx, PPPoE_frame.Payload + 2
|
||||||
|
|
||||||
cmp ax, PPP_IPv4
|
cmp ax, PPP_PROTO_IPv4
|
||||||
je IPv4_input
|
je IPv4_input
|
||||||
|
|
||||||
; cmp ax, PPP_IPv6
|
; cmp ax, PPP_PROTO_IPv6
|
||||||
; je IPv6_input
|
; je IPv6_input
|
||||||
|
|
||||||
jmp PPPoE_discovery_input ; Send LCP,CHAP,CBCP,... packets to the PPP dialer
|
jmp PPPoE_discovery_input ; Send LCP,CHAP,CBCP,... packets to the PPP dialer
|
||||||
@ -246,7 +246,7 @@ PPPoE_output:
|
|||||||
lea eax, [ebx + ETH_DEVICE.mac]
|
lea eax, [ebx + ETH_DEVICE.mac]
|
||||||
lea edx, [PPPoE_MAC]
|
lea edx, [PPPoE_MAC]
|
||||||
add ecx, PPPoE_frame.Payload + 2
|
add ecx, PPPoE_frame.Payload + 2
|
||||||
mov di, ETHER_PPP_SESSION
|
mov di, ETHER_PROTO_PPP_SESSION
|
||||||
call ETH_output
|
call ETH_output
|
||||||
jz .eth_error
|
jz .eth_error
|
||||||
|
|
||||||
|
@ -64,19 +64,19 @@ ETH_input:
|
|||||||
lea edx, [eax + sizeof.ETH_header]
|
lea edx, [eax + sizeof.ETH_header]
|
||||||
mov ax, [eax + ETH_header.Type]
|
mov ax, [eax + ETH_header.Type]
|
||||||
|
|
||||||
cmp ax, ETHER_IPv4
|
cmp ax, ETHER_PROTO_IPv4
|
||||||
je IPv4_input
|
je IPv4_input
|
||||||
|
|
||||||
cmp ax, ETHER_ARP
|
cmp ax, ETHER_PROTO_IPv4
|
||||||
je ARP_input
|
je ARP_input
|
||||||
|
|
||||||
cmp ax, ETHER_IPv6
|
cmp ax, ETHER_PROTO_IPv4
|
||||||
je IPv6_input
|
je IPv6_input
|
||||||
|
|
||||||
cmp ax, ETHER_PPP_DISCOVERY
|
cmp ax, ETHER_PROTO_PPP_DISCOVERY
|
||||||
je PPPoE_discovery_input
|
je PPPoE_discovery_input
|
||||||
|
|
||||||
cmp ax, ETHER_PPP_SESSION
|
cmp ax, ETHER_PROTO_PPP_SESSION
|
||||||
je PPPoE_session_input
|
je PPPoE_session_input
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_ERROR, "ETH_input: Unknown packet type=%x\n", ax
|
DEBUGF DEBUG_NETWORK_ERROR, "ETH_input: Unknown packet type=%x\n", ax
|
||||||
@ -174,11 +174,11 @@ ETH_output:
|
|||||||
align 4
|
align 4
|
||||||
ETH_api:
|
ETH_api:
|
||||||
|
|
||||||
cmp bh, MAX_NET_DEVICES
|
cmp bh, NET_DEVICES_MAX
|
||||||
ja .error
|
ja .error
|
||||||
movzx eax, bh
|
movzx eax, bh
|
||||||
mov eax, dword [NET_DRV_LIST + 4*eax]
|
mov eax, dword [NET_DRV_LIST + 4*eax]
|
||||||
cmp [eax + NET_DEVICE.type], NET_TYPE_ETH
|
cmp [eax + NET_DEVICE.device_type], NET_DEVICE_ETH
|
||||||
jne .error
|
jne .error
|
||||||
|
|
||||||
and ebx, 0xff
|
and ebx, 0xff
|
||||||
@ -228,6 +228,6 @@ ETH_api:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
.state:
|
.state:
|
||||||
mov eax, [eax + NET_DEVICE.state]
|
mov eax, [eax + NET_DEVICE.link_state]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -100,8 +100,8 @@ ends
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
uglobal
|
uglobal
|
||||||
ICMP_PACKETS_TX rd MAX_NET_DEVICES
|
ICMP_PACKETS_TX rd NET_DEVICES_MAX
|
||||||
ICMP_PACKETS_RX rd MAX_NET_DEVICES
|
ICMP_PACKETS_RX rd NET_DEVICES_MAX
|
||||||
endg
|
endg
|
||||||
|
|
||||||
|
|
||||||
@ -116,7 +116,7 @@ macro ICMP_init {
|
|||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov edi, ICMP_PACKETS_TX
|
mov edi, ICMP_PACKETS_TX
|
||||||
mov ecx, 2*MAX_NET_DEVICES
|
mov ecx, 2*NET_DEVICES_MAX
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,8 @@ $Revision: 2891 $
|
|||||||
iglobal
|
iglobal
|
||||||
|
|
||||||
LOOPBACK_DEVICE:
|
LOOPBACK_DEVICE:
|
||||||
.type dd NET_TYPE_LOOPBACK
|
|
||||||
|
.device_type dd NET_DEVICE_LOOPBACK
|
||||||
.mtu dd 4096
|
.mtu dd 4096
|
||||||
.name dd .namestr
|
.name dd .namestr
|
||||||
|
|
||||||
@ -43,7 +44,7 @@ endg
|
|||||||
;
|
;
|
||||||
; LOOP_input
|
; LOOP_input
|
||||||
;
|
;
|
||||||
; IN: [esp+4] = Pointer to buffer
|
; IN: [esp+4] = Pointer to buffer
|
||||||
; [esp+8] = size of buffer
|
; [esp+8] = size of buffer
|
||||||
;
|
;
|
||||||
; OUT: /
|
; OUT: /
|
||||||
@ -60,11 +61,11 @@ LOOP_input:
|
|||||||
push eax
|
push eax
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_input: size=%u\n", ecx
|
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_input: size=%u\n", ecx
|
||||||
lea edx, [eax + 2]
|
lea edx, [eax + 4]
|
||||||
mov ax, word[eax]
|
mov eax, dword[eax]
|
||||||
mov ebx, LOOPBACK_DEVICE
|
mov ebx, LOOPBACK_DEVICE
|
||||||
|
|
||||||
cmp ax, ETHER_IPv4
|
cmp eax, AF_INET4
|
||||||
je IPv4_input
|
je IPv4_input
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_input: Unknown packet type=%x\n", ax
|
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_input: Unknown packet type=%x\n", ax
|
||||||
@ -96,21 +97,21 @@ LOOP_output:
|
|||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_output\n"
|
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_output\n"
|
||||||
|
|
||||||
push ecx
|
push ecx
|
||||||
push di
|
push edi
|
||||||
|
|
||||||
add ecx, 2
|
add ecx, 4
|
||||||
cmp ecx, [LOOPBACK_DEVICE.mtu]
|
cmp ecx, [LOOPBACK_DEVICE.mtu]
|
||||||
ja .out_of_ram
|
ja .out_of_ram
|
||||||
stdcall kernel_alloc, ecx
|
stdcall kernel_alloc, ecx
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .out_of_ram
|
jz .out_of_ram
|
||||||
mov edi, eax
|
mov edi, eax
|
||||||
pop ax
|
pop eax
|
||||||
stosw
|
stosd
|
||||||
|
|
||||||
lea eax, [edi - 2] ; Set eax to buffer start
|
lea eax, [edi - 4] ; Set eax to buffer start
|
||||||
pop ecx
|
pop ecx
|
||||||
lea edx, [ecx + 2] ; Set edx to complete buffer size
|
lea edx, [ecx + 4] ; Set edx to complete buffer size
|
||||||
mov ebx, LOOPBACK_DEVICE
|
mov ebx, LOOPBACK_DEVICE
|
||||||
|
|
||||||
.done:
|
.done:
|
||||||
@ -119,8 +120,8 @@ LOOP_output:
|
|||||||
|
|
||||||
.out_of_ram:
|
.out_of_ram:
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_output: failed\n"
|
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_output: failed\n"
|
||||||
add esp, 2+4
|
add esp, 4+4
|
||||||
sub edi, edi
|
xor edi, edi
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
@ -127,6 +127,7 @@ struct TCP_SOCKET IP_SOCKET
|
|||||||
|
|
||||||
;-------
|
;-------
|
||||||
; Timers
|
; Timers
|
||||||
|
timer_flags dd ?
|
||||||
timer_retransmission dd ? ; rexmt
|
timer_retransmission dd ? ; rexmt
|
||||||
timer_persist dd ?
|
timer_persist dd ?
|
||||||
timer_keepalive dd ? ; keepalive/syn timeout
|
timer_keepalive dd ? ; keepalive/syn timeout
|
||||||
@ -215,18 +216,18 @@ macro SOCKET_init {
|
|||||||
|
|
||||||
@@:
|
@@:
|
||||||
pseudo_random eax
|
pseudo_random eax
|
||||||
cmp ax, MIN_EPHEMERAL_PORT
|
cmp ax, EPHEMERAL_PORT_MIN
|
||||||
jb @r
|
jb @r
|
||||||
cmp ax, MAX_EPHEMERAL_PORT
|
cmp ax, EPHEMERAL_PORT_MAX
|
||||||
ja @r
|
ja @r
|
||||||
xchg al, ah
|
xchg al, ah
|
||||||
mov [last_UDP_port], ax
|
mov [last_UDP_port], ax
|
||||||
|
|
||||||
@@:
|
@@:
|
||||||
pseudo_random eax
|
pseudo_random eax
|
||||||
cmp ax, MIN_EPHEMERAL_PORT
|
cmp ax, EPHEMERAL_PORT_MIN
|
||||||
jb @r
|
jb @r
|
||||||
cmp ax, MAX_EPHEMERAL_PORT
|
cmp ax, EPHEMERAL_PORT_MAX
|
||||||
ja @r
|
ja @r
|
||||||
xchg al, ah
|
xchg al, ah
|
||||||
mov [last_TCP_port], ax
|
mov [last_TCP_port], ax
|
||||||
@ -1121,7 +1122,7 @@ SOCKET_set_opt:
|
|||||||
je .unbind
|
je .unbind
|
||||||
|
|
||||||
movzx edx, byte [edx + 9]
|
movzx edx, byte [edx + 9]
|
||||||
cmp edx, MAX_NET_DEVICES
|
cmp edx, NET_DEVICES_MAX
|
||||||
ja s_error
|
ja s_error
|
||||||
|
|
||||||
mov edx, [NET_DRV_LIST + 4*edx]
|
mov edx, [NET_DRV_LIST + 4*edx]
|
||||||
|
@ -31,31 +31,20 @@ endg
|
|||||||
DEBUG_NETWORK_ERROR = 1
|
DEBUG_NETWORK_ERROR = 1
|
||||||
DEBUG_NETWORK_VERBOSE = 0
|
DEBUG_NETWORK_VERBOSE = 0
|
||||||
|
|
||||||
MAX_NET_DEVICES = 16
|
NET_DEVICES_MAX = 16
|
||||||
ARP_BLOCK = 1 ; true or false
|
ARP_BLOCK = 1 ; true or false
|
||||||
|
|
||||||
MIN_EPHEMERAL_PORT = 49152
|
EPHEMERAL_PORT_MIN = 49152
|
||||||
|
EPHEMERAL_PORT_MAX = 61000
|
||||||
MIN_EPHEMERAL_PORT_N = 0x00C0 ; same in Network byte order (FIXME)
|
MIN_EPHEMERAL_PORT_N = 0x00C0 ; same in Network byte order (FIXME)
|
||||||
MAX_EPHEMERAL_PORT = 61000
|
|
||||||
MAX_EPHEMERAL_PORT_N = 0x48EE ; same in Network byte order (FIXME)
|
MAX_EPHEMERAL_PORT_N = 0x48EE ; same in Network byte order (FIXME)
|
||||||
|
|
||||||
; Ethernet protocol numbers
|
; Ethernet protocol numbers
|
||||||
ETHER_ARP = 0x0608
|
ETHER_PROTO_ARP = 0x0608
|
||||||
ETHER_IPv4 = 0x0008
|
ETHER_PROTO_IPv4 = 0x0008
|
||||||
ETHER_IPv6 = 0xDD86
|
ETHER_PROTO_IPv6 = 0xDD86
|
||||||
ETHER_PPP_DISCOVERY = 0x6388
|
ETHER_PROTO_PPP_DISCOVERY = 0x6388
|
||||||
ETHER_PPP_SESSION = 0x6488
|
ETHER_PROTO_PPP_SESSION = 0x6488
|
||||||
|
|
||||||
; PPP protocol numbers
|
|
||||||
PPP_IPv4 = 0x2100
|
|
||||||
PPP_IPV6 = 0x5780
|
|
||||||
|
|
||||||
;Protocol family
|
|
||||||
AF_UNSPEC = 0
|
|
||||||
AF_LOCAL = 1
|
|
||||||
AF_INET4 = 2
|
|
||||||
AF_INET6 = 10
|
|
||||||
AF_PPP = 777
|
|
||||||
|
|
||||||
; Internet protocol numbers
|
; Internet protocol numbers
|
||||||
IP_PROTO_IP = 0
|
IP_PROTO_IP = 0
|
||||||
@ -63,8 +52,17 @@ IP_PROTO_ICMP = 1
|
|||||||
IP_PROTO_TCP = 6
|
IP_PROTO_TCP = 6
|
||||||
IP_PROTO_UDP = 17
|
IP_PROTO_UDP = 17
|
||||||
|
|
||||||
; PPP protocol number
|
; PPP protocol numbers
|
||||||
PPP_PROTO_ETHERNET = 666
|
PPP_PROTO_IPv4 = 0x2100
|
||||||
|
PPP_PROTO_IPV6 = 0x5780
|
||||||
|
PPP_PROTO_ETHERNET = 666 ; FIXME
|
||||||
|
|
||||||
|
;Protocol family
|
||||||
|
AF_UNSPEC = 0
|
||||||
|
AF_LOCAL = 1
|
||||||
|
AF_INET4 = 2
|
||||||
|
AF_INET6 = 10
|
||||||
|
AF_PPP = 777 ; FIXME
|
||||||
|
|
||||||
; Socket types
|
; Socket types
|
||||||
SOCK_STREAM = 1
|
SOCK_STREAM = 1
|
||||||
@ -83,7 +81,7 @@ SO_REUSEPORT = 1 shl 7
|
|||||||
SO_USELOOPBACK = 1 shl 8
|
SO_USELOOPBACK = 1 shl 8
|
||||||
SO_BINDTODEVICE = 1 shl 9
|
SO_BINDTODEVICE = 1 shl 9
|
||||||
|
|
||||||
SO_BLOCK = 1 shl 10 ; TO BE REMOVED
|
SO_BLOCK = 1 shl 10 ; TO BE REMOVED
|
||||||
SO_NONBLOCK = 1 shl 31
|
SO_NONBLOCK = 1 shl 31
|
||||||
|
|
||||||
; Socket flags for user calls
|
; Socket flags for user calls
|
||||||
@ -95,32 +93,26 @@ SOL_SOCKET = 0
|
|||||||
|
|
||||||
|
|
||||||
; Socket States
|
; Socket States
|
||||||
SS_NOFDREF = 0x0001 ; no file table ref any more
|
SS_NOFDREF = 0x0001 ; no file table ref any more
|
||||||
SS_ISCONNECTED = 0x0002 ; socket connected to a peer
|
SS_ISCONNECTED = 0x0002 ; socket connected to a peer
|
||||||
SS_ISCONNECTING = 0x0004 ; in process of connecting to peer
|
SS_ISCONNECTING = 0x0004 ; in process of connecting to peer
|
||||||
SS_ISDISCONNECTING = 0x0008 ; in process of disconnecting
|
SS_ISDISCONNECTING = 0x0008 ; in process of disconnecting
|
||||||
SS_CANTSENDMORE = 0x0010 ; can't send more data to peer
|
SS_CANTSENDMORE = 0x0010 ; can't send more data to peer
|
||||||
SS_CANTRCVMORE = 0x0020 ; can't receive more data from peer
|
SS_CANTRCVMORE = 0x0020 ; can't receive more data from peer
|
||||||
SS_RCVATMARK = 0x0040 ; at mark on input
|
SS_RCVATMARK = 0x0040 ; at mark on input
|
||||||
SS_ISABORTING = 0x0080 ; aborting fd references - close()
|
SS_ISABORTING = 0x0080 ; aborting fd references - close()
|
||||||
SS_RESTARTSYS = 0x0100 ; restart blocked system calls
|
SS_RESTARTSYS = 0x0100 ; restart blocked system calls
|
||||||
SS_ISDISCONNECTED = 0x0800 ; socket disconnected from peer
|
SS_ISDISCONNECTED = 0x0800 ; socket disconnected from peer
|
||||||
|
|
||||||
SS_ASYNC = 0x0100 ; async i/o notify
|
SS_ASYNC = 0x0100 ; async i/o notify
|
||||||
SS_ISCONFIRMING = 0x0200 ; deciding to accept connection req
|
SS_ISCONFIRMING = 0x0200 ; deciding to accept connection req
|
||||||
SS_MORETOCOME = 0x0400
|
SS_MORETOCOME = 0x0400
|
||||||
|
|
||||||
SS_BLOCKED = 0x8000
|
SS_BLOCKED = 0x8000
|
||||||
|
|
||||||
|
|
||||||
SOCKET_MAXDATA = 4096*32 ; must be 4096*(power of 2) where 'power of 2' is at least 8
|
SOCKET_MAXDATA = 4096*32 ; must be 4096*(power of 2) where 'power of 2' is at least 8
|
||||||
|
MAX_backlog = 20 ; maximum backlog for stream sockets
|
||||||
; Network driver types
|
|
||||||
NET_TYPE_LOOPBACK = 0
|
|
||||||
NET_TYPE_ETH = 1
|
|
||||||
NET_TYPE_SLIP = 2
|
|
||||||
|
|
||||||
MAX_backlog = 20 ; maximum backlog for stream sockets
|
|
||||||
|
|
||||||
; Error Codes
|
; Error Codes
|
||||||
ENOBUFS = 55
|
ENOBUFS = 55
|
||||||
@ -139,11 +131,23 @@ API_ARP = 5
|
|||||||
API_PPPOE = 6
|
API_PPPOE = 6
|
||||||
API_IPv6 = 7
|
API_IPv6 = 7
|
||||||
|
|
||||||
|
; Network device types
|
||||||
|
NET_DEVICE_LOOPBACK = 0
|
||||||
|
NET_DEVICE_ETH = 1
|
||||||
|
NET_DEVICE_SLIP = 2
|
||||||
|
|
||||||
|
; Network link types (link protocols)
|
||||||
|
NET_LINK_LOOPBACK = 0 ;;; Really a link type?
|
||||||
|
NET_LINK_MAC = 1 ; Media access control (ethernet, isdn, ...)
|
||||||
|
NET_LINK_PPP = 2 ; Point to Point Protocol (PPPoE, ...)
|
||||||
|
NET_LINK_IEEE802.11 = 3 ; IEEE 802.11 (WiFi)
|
||||||
|
|
||||||
|
; Hardware acceleration bits
|
||||||
HWACC_TCP_IPv4 = 1 shl 0
|
HWACC_TCP_IPv4 = 1 shl 0
|
||||||
|
|
||||||
struct NET_DEVICE
|
struct NET_DEVICE
|
||||||
|
|
||||||
type dd ? ; Type field
|
device_type dd ? ; Type field
|
||||||
mtu dd ? ; Maximal Transmission Unit
|
mtu dd ? ; Maximal Transmission Unit
|
||||||
name dd ? ; Ptr to 0 terminated string
|
name dd ? ; Ptr to 0 terminated string
|
||||||
|
|
||||||
@ -156,7 +160,7 @@ struct NET_DEVICE
|
|||||||
packets_tx dd ? ;
|
packets_tx dd ? ;
|
||||||
packets_rx dd ? ;
|
packets_rx dd ? ;
|
||||||
|
|
||||||
state dd ? ; link state (0 = no link)
|
link_state dd ? ; link state (0 = no link)
|
||||||
hwacc dd ? ; bitmask stating enabled HW accelerations (offload engines)
|
hwacc dd ? ; bitmask stating enabled HW accelerations (offload engines)
|
||||||
|
|
||||||
ends
|
ends
|
||||||
@ -214,7 +218,7 @@ uglobal
|
|||||||
|
|
||||||
NET_RUNNING dd ?
|
NET_RUNNING dd ?
|
||||||
NET_DEFAULT dd ?
|
NET_DEFAULT dd ?
|
||||||
NET_DRV_LIST rd MAX_NET_DEVICES
|
NET_DRV_LIST rd NET_DEVICES_MAX
|
||||||
|
|
||||||
endg
|
endg
|
||||||
|
|
||||||
@ -235,7 +239,7 @@ stack_init:
|
|||||||
; Init the network drivers list
|
; Init the network drivers list
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov edi, NET_RUNNING
|
mov edi, NET_RUNNING
|
||||||
mov ecx, (MAX_NET_DEVICES + 2)
|
mov ecx, (NET_DEVICES_MAX + 2)
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
PPPoE_init
|
PPPoE_init
|
||||||
@ -345,13 +349,13 @@ NET_add_device:
|
|||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_Add_Device: %x\n", ebx ;;; TODO: use mutex to lock net device list
|
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_Add_Device: %x\n", ebx ;;; TODO: use mutex to lock net device list
|
||||||
|
|
||||||
cmp [NET_RUNNING], MAX_NET_DEVICES
|
cmp [NET_RUNNING], NET_DEVICES_MAX
|
||||||
jae .error
|
jae .error
|
||||||
|
|
||||||
;----------------------------------
|
;----------------------------------
|
||||||
; Check if device is already listed
|
; Check if device is already listed
|
||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
mov ecx, MAX_NET_DEVICES ; We need to check whole list because a device may be removed without re-organizing list
|
mov ecx, NET_DEVICES_MAX ; We need to check whole list because a device may be removed without re-organizing list
|
||||||
mov edi, NET_DRV_LIST
|
mov edi, NET_DRV_LIST
|
||||||
|
|
||||||
repne scasd ; See if device is already in the list
|
repne scasd ; See if device is already in the list
|
||||||
@ -360,7 +364,7 @@ NET_add_device:
|
|||||||
;----------------------------
|
;----------------------------
|
||||||
; Find empty slot in the list
|
; Find empty slot in the list
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov ecx, MAX_NET_DEVICES
|
mov ecx, NET_DEVICES_MAX
|
||||||
mov edi, NET_DRV_LIST
|
mov edi, NET_DRV_LIST
|
||||||
|
|
||||||
repne scasd
|
repne scasd
|
||||||
@ -378,13 +382,6 @@ NET_add_device:
|
|||||||
|
|
||||||
inc [NET_RUNNING] ; Indicate that one more network device is up and running
|
inc [NET_RUNNING] ; Indicate that one more network device is up and running
|
||||||
|
|
||||||
cmp eax, 1 ; If it's the first network device, try to set it as default
|
|
||||||
jne @f
|
|
||||||
push eax
|
|
||||||
call NET_set_default
|
|
||||||
pop eax
|
|
||||||
@@:
|
|
||||||
|
|
||||||
call NET_send_event
|
call NET_send_event
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "Device number: %u\n", eax
|
DEBUGF DEBUG_NETWORK_VERBOSE, "Device number: %u\n", eax
|
||||||
@ -397,38 +394,6 @@ NET_add_device:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------
|
|
||||||
;
|
|
||||||
; NET_set_default
|
|
||||||
;
|
|
||||||
; API to set the default interface
|
|
||||||
;
|
|
||||||
; IN: Device num in eax
|
|
||||||
; OUT: Device num in eax, -1 on error
|
|
||||||
;
|
|
||||||
;-----------------------------------------------------------------
|
|
||||||
align 4
|
|
||||||
NET_set_default:
|
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_set_default: device=%x\n", eax
|
|
||||||
|
|
||||||
cmp eax, MAX_NET_DEVICES
|
|
||||||
jae .error
|
|
||||||
|
|
||||||
cmp [NET_DRV_LIST+eax*4], 0
|
|
||||||
je .error
|
|
||||||
|
|
||||||
mov [NET_DEFAULT], eax
|
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_set_default: succes\n"
|
|
||||||
ret
|
|
||||||
|
|
||||||
.error:
|
|
||||||
or eax, -1
|
|
||||||
DEBUGF DEBUG_NETWORK_ERROR, "NET_set_default: failed\n"
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------
|
;-----------------------------------------------------------------
|
||||||
;
|
;
|
||||||
; NET_Remove_Device:
|
; NET_Remove_Device:
|
||||||
@ -453,7 +418,7 @@ NET_remove_device:
|
|||||||
je @f
|
je @f
|
||||||
; there are still active devices, find one and make it default
|
; there are still active devices, find one and make it default
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov ecx, MAX_NET_DEVICES
|
mov ecx, NET_DEVICES_MAX
|
||||||
mov edi, NET_DRV_LIST
|
mov edi, NET_DRV_LIST
|
||||||
repe scasd
|
repe scasd
|
||||||
je @f
|
je @f
|
||||||
@ -466,7 +431,7 @@ NET_remove_device:
|
|||||||
; Find the driver in the list
|
; Find the driver in the list
|
||||||
|
|
||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
mov ecx, MAX_NET_DEVICES
|
mov ecx, NET_DEVICES_MAX
|
||||||
mov edi, NET_DRV_LIST+4
|
mov edi, NET_DRV_LIST+4
|
||||||
|
|
||||||
repne scasd
|
repne scasd
|
||||||
@ -501,7 +466,7 @@ align 4
|
|||||||
NET_ptr_to_num:
|
NET_ptr_to_num:
|
||||||
push ecx
|
push ecx
|
||||||
|
|
||||||
mov ecx, MAX_NET_DEVICES
|
mov ecx, NET_DEVICES_MAX
|
||||||
mov edi, NET_DRV_LIST
|
mov edi, NET_DRV_LIST
|
||||||
|
|
||||||
.loop:
|
.loop:
|
||||||
@ -658,7 +623,7 @@ sys_network: ; FIXME: make default device easily accessible
|
|||||||
jmp .return
|
jmp .return
|
||||||
|
|
||||||
@@:
|
@@:
|
||||||
cmp bh, MAX_NET_DEVICES ; Check if device number exists
|
cmp bh, NET_DEVICES_MAX ; Check if device number exists
|
||||||
jae .doesnt_exist
|
jae .doesnt_exist
|
||||||
|
|
||||||
mov esi, ebx
|
mov esi, ebx
|
||||||
@ -682,12 +647,11 @@ sys_network: ; FIXME: make default device easily accessible
|
|||||||
dd .stop ; 3
|
dd .stop ; 3
|
||||||
dd .get_ptr ; 4
|
dd .get_ptr ; 4
|
||||||
dd .get_drv_name ; 5
|
dd .get_drv_name ; 5
|
||||||
dd .set_default ; 6
|
|
||||||
.number = ($ - .table) / 4 - 1
|
.number = ($ - .table) / 4 - 1
|
||||||
|
|
||||||
.get_type: ; 0 = Get device type (ethernet/token ring/...)
|
.get_type: ; 0 = Get device type (ethernet/token ring/...)
|
||||||
|
|
||||||
mov eax, [eax + NET_DEVICE.type]
|
mov eax, [eax + NET_DEVICE.device_type]
|
||||||
jmp .return
|
jmp .return
|
||||||
|
|
||||||
|
|
||||||
@ -724,11 +688,6 @@ sys_network: ; FIXME: make default device easily accessible
|
|||||||
jmp .return
|
jmp .return
|
||||||
|
|
||||||
|
|
||||||
.set_default: ; 6 = Set default device
|
|
||||||
|
|
||||||
call NET_set_default
|
|
||||||
jmp .return
|
|
||||||
|
|
||||||
.doesnt_exist:
|
.doesnt_exist:
|
||||||
mov eax, -1
|
mov eax, -1
|
||||||
|
|
||||||
@ -744,7 +703,7 @@ sys_network: ; FIXME: make default device easily accessible
|
|||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
align 4
|
align 4
|
||||||
sys_protocols:
|
sys_protocols:
|
||||||
cmp bh, MAX_NET_DEVICES ; Check if device number exists
|
cmp bh, NET_DEVICES_MAX ; Check if device number exists
|
||||||
jae .doesnt_exist
|
jae .doesnt_exist
|
||||||
|
|
||||||
mov esi, ebx
|
mov esi, ebx
|
||||||
|
@ -129,12 +129,12 @@ ends
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
uglobal
|
uglobal
|
||||||
TCP_segments_tx rd MAX_NET_DEVICES
|
TCP_segments_tx rd NET_DEVICES_MAX
|
||||||
TCP_segments_rx rd MAX_NET_DEVICES
|
TCP_segments_rx rd NET_DEVICES_MAX
|
||||||
TCP_segments_missed rd MAX_NET_DEVICES
|
TCP_segments_missed rd NET_DEVICES_MAX
|
||||||
TCP_segments_dumped rd MAX_NET_DEVICES
|
TCP_segments_dumped rd NET_DEVICES_MAX
|
||||||
; TCP_bytes_rx rq MAX_NET_DEVICES
|
; TCP_bytes_rx rq NET_DEVICES_MAX
|
||||||
; TCP_bytes_tx rq MAX_NET_DEVICES
|
; TCP_bytes_tx rq NET_DEVICES_MAX
|
||||||
TCP_sequence_num dd ?
|
TCP_sequence_num dd ?
|
||||||
TCP_queue rd TCP_QUEUE_SIZE*sizeof.TCP_queue_entry/4
|
TCP_queue rd TCP_QUEUE_SIZE*sizeof.TCP_queue_entry/4
|
||||||
TCP_input_event dd ?
|
TCP_input_event dd ?
|
||||||
@ -152,7 +152,7 @@ macro TCP_init {
|
|||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov edi, TCP_segments_tx
|
mov edi, TCP_segments_tx
|
||||||
mov ecx, (6*MAX_NET_DEVICES)
|
mov ecx, (6*NET_DEVICES_MAX)
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
pseudo_random eax
|
pseudo_random eax
|
||||||
|
@ -253,6 +253,7 @@ TCP_process_input:
|
|||||||
|
|
||||||
mov [ebx + TCP_SOCKET.t_idle], 0
|
mov [ebx + TCP_SOCKET.t_idle], 0
|
||||||
mov [ebx + TCP_SOCKET.timer_keepalive], TCP_time_keep_idle
|
mov [ebx + TCP_SOCKET.timer_keepalive], TCP_time_keep_idle
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_keepalive
|
||||||
|
|
||||||
;--------------------
|
;--------------------
|
||||||
; Process TCP options
|
; Process TCP options
|
||||||
@ -488,7 +489,7 @@ TCP_process_input:
|
|||||||
mov [ebx + TCP_SOCKET.SND_UNA], eax
|
mov [ebx + TCP_SOCKET.SND_UNA], eax
|
||||||
|
|
||||||
; Stop retransmit timer
|
; Stop retransmit timer
|
||||||
mov [ebx + TCP_SOCKET.timer_retransmission], 0
|
and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission
|
||||||
|
|
||||||
; Unlock the socket
|
; Unlock the socket
|
||||||
pusha
|
pusha
|
||||||
@ -852,8 +853,8 @@ TCP_process_input:
|
|||||||
; (window info didnt change) The ACK is the biggest we've seen and we've seen exactly our rexmt threshold of them,
|
; (window info didnt change) The ACK is the biggest we've seen and we've seen exactly our rexmt threshold of them,
|
||||||
; assume a packet has been dropped and retransmit it. Kludge snd_nxt & the congestion window so we send only this one packet.
|
; assume a packet has been dropped and retransmit it. Kludge snd_nxt & the congestion window so we send only this one packet.
|
||||||
|
|
||||||
cmp [ebx + TCP_SOCKET.timer_retransmission], 0 ;;;; FIXME
|
test [ebx + TCP_SOCKET.timer_flags], timer_flag_retransmission
|
||||||
jg @f
|
jz @f
|
||||||
|
|
||||||
mov eax, [edx + TCP_header.AckNumber]
|
mov eax, [edx + TCP_header.AckNumber]
|
||||||
cmp eax, [ebx + TCP_SOCKET.SND_UNA]
|
cmp eax, [ebx + TCP_SOCKET.SND_UNA]
|
||||||
@ -886,7 +887,7 @@ TCP_process_input:
|
|||||||
pop edx
|
pop edx
|
||||||
mov [ebx + TCP_SOCKET.SND_SSTHRESH], eax
|
mov [ebx + TCP_SOCKET.SND_SSTHRESH], eax
|
||||||
|
|
||||||
mov [ebx + TCP_SOCKET.timer_retransmission], 0 ; turn off retransmission timer
|
and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission ; turn off retransmission timer
|
||||||
mov [ebx + TCP_SOCKET.t_rtt], 0
|
mov [ebx + TCP_SOCKET.t_rtt], 0
|
||||||
mov eax, [edx + TCP_header.AckNumber]
|
mov eax, [edx + TCP_header.AckNumber]
|
||||||
mov [ebx + TCP_SOCKET.SND_NXT], eax
|
mov [ebx + TCP_SOCKET.SND_NXT], eax
|
||||||
@ -1017,16 +1018,16 @@ TCP_process_input:
|
|||||||
mov eax, [ebx + TCP_SOCKET.SND_MAX]
|
mov eax, [ebx + TCP_SOCKET.SND_MAX]
|
||||||
cmp eax, [edx + TCP_header.AckNumber]
|
cmp eax, [edx + TCP_header.AckNumber]
|
||||||
jne .more_data
|
jne .more_data
|
||||||
mov [ebx + TCP_SOCKET.timer_retransmission], 0
|
and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission
|
||||||
or [ebx + TCP_SOCKET.temp_bits], TCP_BIT_NEEDOUTPUT
|
or [ebx + TCP_SOCKET.temp_bits], TCP_BIT_NEEDOUTPUT
|
||||||
jmp .no_restart
|
jmp .no_restart
|
||||||
.more_data:
|
.more_data:
|
||||||
cmp [ebx + TCP_SOCKET.timer_persist], 0
|
test [ebx + TCP_SOCKET.timer_flags], timer_flag_persist
|
||||||
jne .no_restart
|
jnz .no_restart
|
||||||
|
|
||||||
mov eax, [ebx + TCP_SOCKET.t_rxtcur]
|
mov eax, [ebx + TCP_SOCKET.t_rxtcur]
|
||||||
mov [ebx + TCP_SOCKET.timer_retransmission], eax
|
mov [ebx + TCP_SOCKET.timer_retransmission], eax
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_retransmission
|
||||||
.no_restart:
|
.no_restart:
|
||||||
|
|
||||||
|
|
||||||
@ -1140,6 +1141,7 @@ TCP_process_input:
|
|||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call SOCKET_is_disconnected
|
call SOCKET_is_disconnected
|
||||||
mov [ebx + TCP_SOCKET.timer_timed_wait], TCP_time_max_idle
|
mov [ebx + TCP_SOCKET.timer_timed_wait], TCP_time_max_idle
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait
|
||||||
@@:
|
@@:
|
||||||
mov [ebx + TCP_SOCKET.t_state], TCPS_FIN_WAIT_2
|
mov [ebx + TCP_SOCKET.t_state], TCPS_FIN_WAIT_2
|
||||||
jmp .ack_processed
|
jmp .ack_processed
|
||||||
@ -1151,6 +1153,7 @@ TCP_process_input:
|
|||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call TCP_cancel_timers
|
call TCP_cancel_timers
|
||||||
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL
|
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait
|
||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call SOCKET_is_disconnected
|
call SOCKET_is_disconnected
|
||||||
jmp .ack_processed
|
jmp .ack_processed
|
||||||
@ -1164,6 +1167,7 @@ TCP_process_input:
|
|||||||
|
|
||||||
.ack_tw:
|
.ack_tw:
|
||||||
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL
|
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait
|
||||||
jmp .drop_after_ack
|
jmp .drop_after_ack
|
||||||
|
|
||||||
.reset_dupacks: ; We got a new ACK, reset duplicate ACK counter
|
.reset_dupacks: ; We got a new ACK, reset duplicate ACK counter
|
||||||
@ -1209,6 +1213,7 @@ align 4
|
|||||||
mov [ebx + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED
|
mov [ebx + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED
|
||||||
mov [ebx + TCP_SOCKET.t_flags], TF_ACKNOW
|
mov [ebx + TCP_SOCKET.t_flags], TF_ACKNOW
|
||||||
mov [ebx + TCP_SOCKET.timer_keepalive], TCP_time_keep_interval ;;;; macro
|
mov [ebx + TCP_SOCKET.timer_keepalive], TCP_time_keep_interval ;;;; macro
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_keepalive
|
||||||
|
|
||||||
lea eax, [ebx + STREAM_SOCKET.snd]
|
lea eax, [ebx + STREAM_SOCKET.snd]
|
||||||
call SOCKET_ring_create
|
call SOCKET_ring_create
|
||||||
@ -1272,7 +1277,7 @@ align 4
|
|||||||
@@:
|
@@:
|
||||||
|
|
||||||
.no_syn_ack:
|
.no_syn_ack:
|
||||||
mov [ebx + TCP_SOCKET.timer_retransmission], 0 ; disable retransmission
|
and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission ; disable retransmission timer
|
||||||
|
|
||||||
push [edx + TCP_header.SequenceNumber]
|
push [edx + TCP_header.SequenceNumber]
|
||||||
pop [ebx + TCP_SOCKET.IRS]
|
pop [ebx + TCP_SOCKET.IRS]
|
||||||
@ -1525,11 +1530,13 @@ align 4
|
|||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call TCP_cancel_timers
|
call TCP_cancel_timers
|
||||||
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL
|
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait
|
||||||
call SOCKET_is_disconnected
|
call SOCKET_is_disconnected
|
||||||
jmp .final_processing
|
jmp .final_processing
|
||||||
|
|
||||||
.fin_timed:
|
.fin_timed:
|
||||||
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL
|
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait
|
||||||
jmp .final_processing
|
jmp .final_processing
|
||||||
|
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ TCP_output:
|
|||||||
jmp .no_force
|
jmp .no_force
|
||||||
|
|
||||||
.no_zero_window:
|
.no_zero_window:
|
||||||
mov [eax + TCP_SOCKET.timer_persist], 0
|
and [ebx + TCP_SOCKET.timer_flags], not timer_flag_persist
|
||||||
mov [eax + TCP_SOCKET.t_rxtshift], 0
|
mov [eax + TCP_SOCKET.t_rxtshift], 0
|
||||||
|
|
||||||
.no_force:
|
.no_force:
|
||||||
@ -125,7 +125,7 @@ TCP_output:
|
|||||||
jnz @f
|
jnz @f
|
||||||
|
|
||||||
; cancel pending retransmit
|
; cancel pending retransmit
|
||||||
mov [eax + TCP_SOCKET.timer_retransmission], 0
|
and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission
|
||||||
|
|
||||||
; pull SND_NXT back to (closed) window, We will enter persist state below.
|
; pull SND_NXT back to (closed) window, We will enter persist state below.
|
||||||
push [eax + TCP_SOCKET.SND_UNA]
|
push [eax + TCP_SOCKET.SND_UNA]
|
||||||
@ -266,13 +266,14 @@ TCP_output:
|
|||||||
|
|
||||||
.enter_persist:
|
.enter_persist:
|
||||||
|
|
||||||
cmp [eax + STREAM_SOCKET.snd.size], 0 ; Data ready to send?
|
cmp [eax + STREAM_SOCKET.snd.size], 0 ; Data ready to send?
|
||||||
jne @f
|
jne @f
|
||||||
cmp [eax + TCP_SOCKET.timer_retransmission], 0
|
and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission
|
||||||
jne @f
|
|
||||||
cmp [eax + TCP_SOCKET.timer_persist], 0 ; Persist timer already expired?
|
|
||||||
jne @f
|
jne @f
|
||||||
|
|
||||||
|
test [ebx + TCP_SOCKET.timer_flags], timer_flag_persist ; Persist timer already expired?
|
||||||
|
jnz @f
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_output: Entering persist state\n"
|
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_output: Entering persist state\n"
|
||||||
|
|
||||||
mov [eax + TCP_SOCKET.t_rxtshift], 0
|
mov [eax + TCP_SOCKET.t_rxtshift], 0
|
||||||
@ -512,19 +513,19 @@ TCP_send:
|
|||||||
@@:
|
@@:
|
||||||
|
|
||||||
; set retransmission timer if not already set, and not doing an ACK or keepalive probe
|
; set retransmission timer if not already set, and not doing an ACK or keepalive probe
|
||||||
|
test [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission
|
||||||
cmp [eax + TCP_SOCKET.timer_retransmission], 0 ;;;; FIXME
|
jnz .retransmit_set
|
||||||
ja .retransmit_set
|
|
||||||
|
|
||||||
cmp edx, [eax + TCP_SOCKET.SND_UNA] ; edx is still [eax + TCP_SOCKET.SND_NXT]
|
cmp edx, [eax + TCP_SOCKET.SND_UNA] ; edx is still [eax + TCP_SOCKET.SND_NXT]
|
||||||
je .retransmit_set
|
je .retransmit_set
|
||||||
|
|
||||||
mov edx, [eax + TCP_SOCKET.t_rxtcur]
|
mov edx, [eax + TCP_SOCKET.t_rxtcur]
|
||||||
mov [eax + TCP_SOCKET.timer_retransmission], edx
|
mov [eax + TCP_SOCKET.timer_retransmission], edx
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_retransmission
|
||||||
|
|
||||||
cmp [eax + TCP_SOCKET.timer_persist], 0
|
test [eax + TCP_SOCKET.timer_flags], timer_flag_persist
|
||||||
jne .retransmit_set
|
jz .retransmit_set
|
||||||
mov [eax + TCP_SOCKET.timer_persist], 0
|
and [ebx + TCP_SOCKET.timer_flags], not timer_flag_persist
|
||||||
mov [eax + TCP_SOCKET.t_rxtshift], 0
|
mov [eax + TCP_SOCKET.t_rxtshift], 0
|
||||||
|
|
||||||
.retransmit_set:
|
.retransmit_set:
|
||||||
@ -593,6 +594,7 @@ TCP_send:
|
|||||||
pop eax
|
pop eax
|
||||||
|
|
||||||
mov [eax + TCP_SOCKET.timer_retransmission], TCP_time_re_min
|
mov [eax + TCP_SOCKET.timer_retransmission], TCP_time_re_min
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_retransmission
|
||||||
|
|
||||||
lea ecx, [eax + SOCKET.mutex]
|
lea ecx, [eax + SOCKET.mutex]
|
||||||
call mutex_unlock
|
call mutex_unlock
|
||||||
|
@ -420,8 +420,8 @@ TCP_set_persist:
|
|||||||
|
|
||||||
; First, check if retransmit timer is not set, retransmit and persist are mutually exclusive
|
; First, check if retransmit timer is not set, retransmit and persist are mutually exclusive
|
||||||
|
|
||||||
cmp [eax + TCP_SOCKET.timer_retransmission], 0
|
test [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission
|
||||||
ja @f
|
jnz .exit
|
||||||
|
|
||||||
; calculate RTO
|
; calculate RTO
|
||||||
push ebx
|
push ebx
|
||||||
@ -436,13 +436,14 @@ TCP_set_persist:
|
|||||||
; Start/restart persistance timer.
|
; Start/restart persistance timer.
|
||||||
|
|
||||||
TCPT_RANGESET [eax + TCP_SOCKET.timer_persist], ebx, TCP_time_pers_min, TCP_time_pers_max
|
TCPT_RANGESET [eax + TCP_SOCKET.timer_persist], ebx, TCP_time_pers_min, TCP_time_pers_max
|
||||||
|
or [ebx + TCP_SOCKET.timer_flags], timer_flag_persist
|
||||||
pop ebx
|
pop ebx
|
||||||
|
|
||||||
cmp [eax + TCP_SOCKET.t_rxtshift], TCP_max_rxtshift
|
cmp [eax + TCP_SOCKET.t_rxtshift], TCP_max_rxtshift
|
||||||
jae @f
|
jae @f
|
||||||
inc [eax + TCP_SOCKET.t_rxtshift]
|
inc [eax + TCP_SOCKET.t_rxtshift]
|
||||||
@@:
|
@@:
|
||||||
|
.exit:
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Part of the TCP/IP network stack for KolibriOS ;;
|
;; Part of the TCP/IP network stack for KolibriOS ;;
|
||||||
@ -16,6 +16,13 @@
|
|||||||
|
|
||||||
$Revision: 3143 $
|
$Revision: 3143 $
|
||||||
|
|
||||||
|
timer_flag_retransmission = 1 shl 0
|
||||||
|
timer_flag_keepalive = 1 shl 1
|
||||||
|
timer_flag_2msl = 1 shl 2
|
||||||
|
timer_flag_persist = 1 shl 3
|
||||||
|
timer_flag_wait = 1 shl 4
|
||||||
|
|
||||||
|
|
||||||
;----------------------
|
;----------------------
|
||||||
; 160 ms timer
|
; 160 ms timer
|
||||||
;----------------------
|
;----------------------
|
||||||
@ -27,17 +34,16 @@ local .exit
|
|||||||
mov ebx, net_sockets
|
mov ebx, net_sockets
|
||||||
.loop:
|
.loop:
|
||||||
mov ebx, [ebx + SOCKET.NextPtr]
|
mov ebx, [ebx + SOCKET.NextPtr]
|
||||||
or ebx, ebx
|
test ebx, ebx
|
||||||
jz .exit
|
jz .exit
|
||||||
|
|
||||||
cmp [ebx + SOCKET.Domain], AF_INET4
|
cmp [ebx + SOCKET.Domain], AF_INET4
|
||||||
jne .loop
|
jne .loop
|
||||||
|
|
||||||
cmp [ebx + SOCKET.Protocol], IP_PROTO_TCP
|
cmp [ebx + SOCKET.Protocol], IP_PROTO_TCP
|
||||||
jne .loop
|
jne .loop
|
||||||
|
|
||||||
test [ebx + TCP_SOCKET.t_flags], TF_DELACK
|
test [ebx + TCP_SOCKET.t_flags], TF_DELACK
|
||||||
jz .loop
|
jz .loop
|
||||||
|
|
||||||
and [ebx + TCP_SOCKET.t_flags], not (TF_DELACK)
|
and [ebx + TCP_SOCKET.t_flags], not (TF_DELACK)
|
||||||
|
|
||||||
push ebx
|
push ebx
|
||||||
@ -58,7 +64,7 @@ local .exit
|
|||||||
;----------------------
|
;----------------------
|
||||||
; 640 ms timer
|
; 640 ms timer
|
||||||
;----------------------
|
;----------------------
|
||||||
macro TCP_timer_640ms {
|
macro TCP_timer_640ms { ; TODO: implement timed wait timer!
|
||||||
|
|
||||||
local .loop
|
local .loop
|
||||||
local .exit
|
local .exit
|
||||||
@ -68,7 +74,7 @@ local .exit
|
|||||||
add [TCP_sequence_num], 64000
|
add [TCP_sequence_num], 64000
|
||||||
|
|
||||||
; scan through all the active TCP sockets, decrementing ALL timers
|
; scan through all the active TCP sockets, decrementing ALL timers
|
||||||
; timers do not have the chance to wrap because the keepalive timer will kill the socket when it expires
|
; When a timer reaches zero, we'll check wheter it was active or not
|
||||||
|
|
||||||
mov eax, net_sockets
|
mov eax, net_sockets
|
||||||
.loop:
|
.loop:
|
||||||
@ -84,8 +90,11 @@ local .exit
|
|||||||
jne .loop
|
jne .loop
|
||||||
|
|
||||||
inc [eax + TCP_SOCKET.t_idle]
|
inc [eax + TCP_SOCKET.t_idle]
|
||||||
|
|
||||||
dec [eax + TCP_SOCKET.timer_retransmission]
|
dec [eax + TCP_SOCKET.timer_retransmission]
|
||||||
jnz .check_more2
|
jnz .check_more2
|
||||||
|
test [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission
|
||||||
|
jz .check_more2
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: Retransmission timer expired\n", eax
|
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: Retransmission timer expired\n", eax
|
||||||
|
|
||||||
@ -96,6 +105,8 @@ local .exit
|
|||||||
.check_more2:
|
.check_more2:
|
||||||
dec [eax + TCP_SOCKET.timer_keepalive]
|
dec [eax + TCP_SOCKET.timer_keepalive]
|
||||||
jnz .check_more3
|
jnz .check_more3
|
||||||
|
test [eax + TCP_SOCKET.timer_flags], timer_flag_keepalive
|
||||||
|
jz .check_more3
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: Keepalive expired\n", eax
|
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: Keepalive expired\n", eax
|
||||||
|
|
||||||
@ -125,12 +136,16 @@ local .exit
|
|||||||
.check_more3:
|
.check_more3:
|
||||||
dec [eax + TCP_SOCKET.timer_timed_wait]
|
dec [eax + TCP_SOCKET.timer_timed_wait]
|
||||||
jnz .check_more5
|
jnz .check_more5
|
||||||
|
test [eax + TCP_SOCKET.timer_flags], timer_flag_2msl
|
||||||
|
jz .check_more5
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: 2MSL timer expired\n", eax
|
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: 2MSL timer expired\n", eax
|
||||||
|
|
||||||
.check_more5:
|
.check_more5:
|
||||||
dec [eax + TCP_SOCKET.timer_persist]
|
dec [eax + TCP_SOCKET.timer_persist]
|
||||||
jnz .loop
|
jnz .loop
|
||||||
|
test [eax + TCP_SOCKET.timer_flags], timer_flag_persist
|
||||||
|
jz .loop
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: persist timer expired\n", eax
|
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: persist timer expired\n", eax
|
||||||
|
|
||||||
@ -152,17 +167,6 @@ local .exit
|
|||||||
|
|
||||||
TCP_cancel_timers:
|
TCP_cancel_timers:
|
||||||
|
|
||||||
push eax edi
|
mov [eax + TCP_SOCKET.timer_flags], 0
|
||||||
|
|
||||||
lea edi, [eax + TCP_SOCKET.timer_retransmission]
|
|
||||||
xor eax, eax
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
|
|
||||||
pop edi eax
|
|
||||||
|
|
||||||
|
|
||||||
ret
|
ret
|
@ -29,8 +29,8 @@ ends
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
uglobal
|
uglobal
|
||||||
UDP_PACKETS_TX rd MAX_NET_DEVICES
|
UDP_PACKETS_TX rd NET_DEVICES_MAX
|
||||||
UDP_PACKETS_RX rd MAX_NET_DEVICES
|
UDP_PACKETS_RX rd NET_DEVICES_MAX
|
||||||
endg
|
endg
|
||||||
|
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ macro UDP_init {
|
|||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov edi, UDP_PACKETS_TX
|
mov edi, UDP_PACKETS_TX
|
||||||
mov ecx, 2*MAX_NET_DEVICES
|
mov ecx, 2*NET_DEVICES_MAX
|
||||||
rep stosd
|
rep stosd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user