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:
hidnplayr 2013-06-04 14:12:37 +00:00
parent 1267799afd
commit c2bc66096c
15 changed files with 189 additions and 214 deletions

View File

@ -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

View File

@ -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]

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
} }

View File

@ -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

View File

@ -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]

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
} }