diff --git a/kernel/trunk/network/ARP.inc b/kernel/trunk/network/ARP.inc index bd5679b260..c9644694f4 100644 --- a/kernel/trunk/network/ARP.inc +++ b/kernel/trunk/network/ARP.inc @@ -62,9 +62,9 @@ uglobal 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_RX rd MAX_NET_DEVICES - ARP_CONFLICTS rd MAX_NET_DEVICES + ARP_PACKETS_TX rd NET_DEVICES_MAX + ARP_PACKETS_RX rd NET_DEVICES_MAX + ARP_CONFLICTS rd NET_DEVICES_MAX endg @@ -84,7 +84,7 @@ macro ARP_init { mov [NumARP], eax mov edi, ARP_PACKETS_TX - mov ecx, 3*MAX_NET_DEVICES + mov ecx, 3*NET_DEVICES_MAX rep stosd } @@ -318,7 +318,7 @@ ARP_output_request: lea eax, [ebx + ETH_DEVICE.mac] ; local device mac mov edx, ETH_BROADCAST ; broadcast mac mov ecx, sizeof.ARP_header - mov di, ETHER_ARP + mov di, ETHER_PROTO_ARP call ETH_output jz .exit diff --git a/kernel/trunk/network/IPv4.inc b/kernel/trunk/network/IPv4.inc index 352fc10bfe..6bfabfc90a 100644 --- a/kernel/trunk/network/IPv4.inc +++ b/kernel/trunk/network/IPv4.inc @@ -58,17 +58,17 @@ ends align 4 uglobal - IP_LIST rd MAX_NET_DEVICES - SUBNET_LIST rd MAX_NET_DEVICES - DNS_LIST rd MAX_NET_DEVICES - GATEWAY_LIST rd MAX_NET_DEVICES - BROADCAST_LIST rd MAX_NET_DEVICES + IP_LIST rd NET_DEVICES_MAX + SUBNET_LIST rd NET_DEVICES_MAX + DNS_LIST rd NET_DEVICES_MAX + GATEWAY_LIST rd NET_DEVICES_MAX + BROADCAST_LIST rd NET_DEVICES_MAX - IP_packets_tx rd MAX_NET_DEVICES - IP_packets_rx rd MAX_NET_DEVICES - IP_packets_dumped rd MAX_NET_DEVICES + IP_packets_tx rd NET_DEVICES_MAX + IP_packets_rx rd NET_DEVICES_MAX + IP_packets_dumped rd NET_DEVICES_MAX - FRAGMENT_LIST rb MAX_FRAGMENTS * sizeof.FRAGMENT_slot + FRAGMENT_LIST rb MAX_FRAGMENTS * sizeof.FRAGMENT_slot endg @@ -83,7 +83,7 @@ macro IPv4_init { xor eax, eax 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 } @@ -592,7 +592,7 @@ IPv4_output: mov edx, esp mov ecx, [esp + 10 + 6] add ecx, sizeof.IPv4_header - mov di, ETHER_IPv4 + mov di, ETHER_PROTO_IPv4 call ETH_output jz .eth_error add esp, 6 ; pop the mac out of the stack @@ -637,7 +637,7 @@ IPv4_output: .loopback: mov dword [esp + 2], eax add ecx, sizeof.IPv4_header - mov di, ETHER_IPv4 + mov edi, AF_INET4 call LOOP_output jmp .continue @@ -681,7 +681,7 @@ IPv4_output_raw: mov edx, esp mov ecx, [esp + 6 + 4] add ecx, sizeof.IPv4_header - mov di, ETHER_IPv4 + mov di, ETHER_PROTO_IPv4 call ETH_output jz .error @@ -775,7 +775,7 @@ IPv4_fragment: mov eax, [esp + 3*4] lea ebx, [esp + 4*4] - mov di , ETHER_IPv4 + mov di , ETHER_PROTO_IPv4 call ETH_output cmp edi, -1 @@ -866,7 +866,7 @@ IPv4_route: je .broadcast xor edi, edi - mov ecx, MAX_NET_DEVICES + mov ecx, NET_DEVICES_MAX .loop: mov ebx, [IP_LIST+edi] and ebx, [SUBNET_LIST+edi] diff --git a/kernel/trunk/network/IPv6.inc b/kernel/trunk/network/IPv6.inc index ce152f7a9e..0766eea424 100644 --- a/kernel/trunk/network/IPv6.inc +++ b/kernel/trunk/network/IPv6.inc @@ -34,13 +34,13 @@ align 4 uglobal IPv6: - .addresses rd 4*MAX_NET_DEVICES - .subnet rd 4*MAX_NET_DEVICES - .dns rd 4*MAX_NET_DEVICES - .gateway rd 4*MAX_NET_DEVICES + .addresses rd 4*NET_DEVICES_MAX + .subnet rd 4*NET_DEVICES_MAX + .dns rd 4*NET_DEVICES_MAX + .gateway rd 4*NET_DEVICES_MAX - .packets_tx rd MAX_NET_DEVICES - .packets_rx rd MAX_NET_DEVICES + .packets_tx rd NET_DEVICES_MAX + .packets_rx rd NET_DEVICES_MAX endg diff --git a/kernel/trunk/network/PPPoE.inc b/kernel/trunk/network/PPPoE.inc index ad9995bd8e..8d9afd2bb2 100644 --- a/kernel/trunk/network/PPPoE.inc +++ b/kernel/trunk/network/PPPoE.inc @@ -113,14 +113,14 @@ PPPoE_discovery_output: ; Check that device exists and is ethernet device mov ebx, [eax + SOCKET.device] - cmp ebx, MAX_NET_DEVICES + cmp ebx, NET_DEVICES_MAX ja .bad mov ebx, [NET_DRV_LIST + 4*ebx] test ebx, ebx jz .bad - cmp [ebx + NET_DEVICE.type], NET_TYPE_ETH + cmp [ebx + NET_DEVICE.device_type], NET_DEVICE_ETH jne .bad DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_output: device=%x\n", ebx @@ -148,9 +148,9 @@ PPPoE_discovery_output: lea esi, [ebx + ETH_DEVICE.mac] movsd 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 - mov ax, ETHER_PPP_DISCOVERY + mov ax, ETHER_PROTO_PPP_DISCOVERY stosw @@: @@ -200,10 +200,10 @@ PPPoE_session_input: mov ax, word [edx + PPPoE_frame.Payload] add edx, PPPoE_frame.Payload + 2 - cmp ax, PPP_IPv4 + cmp ax, PPP_PROTO_IPv4 je IPv4_input -; cmp ax, PPP_IPv6 +; cmp ax, PPP_PROTO_IPv6 ; je IPv6_input 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 edx, [PPPoE_MAC] add ecx, PPPoE_frame.Payload + 2 - mov di, ETHER_PPP_SESSION + mov di, ETHER_PROTO_PPP_SESSION call ETH_output jz .eth_error diff --git a/kernel/trunk/network/ethernet.inc b/kernel/trunk/network/ethernet.inc index 955bd708ee..1d051a254f 100644 --- a/kernel/trunk/network/ethernet.inc +++ b/kernel/trunk/network/ethernet.inc @@ -64,19 +64,19 @@ ETH_input: lea edx, [eax + sizeof.ETH_header] mov ax, [eax + ETH_header.Type] - cmp ax, ETHER_IPv4 + cmp ax, ETHER_PROTO_IPv4 je IPv4_input - cmp ax, ETHER_ARP + cmp ax, ETHER_PROTO_IPv4 je ARP_input - cmp ax, ETHER_IPv6 + cmp ax, ETHER_PROTO_IPv4 je IPv6_input - cmp ax, ETHER_PPP_DISCOVERY + cmp ax, ETHER_PROTO_PPP_DISCOVERY je PPPoE_discovery_input - cmp ax, ETHER_PPP_SESSION + cmp ax, ETHER_PROTO_PPP_SESSION je PPPoE_session_input DEBUGF DEBUG_NETWORK_ERROR, "ETH_input: Unknown packet type=%x\n", ax @@ -174,11 +174,11 @@ ETH_output: align 4 ETH_api: - cmp bh, MAX_NET_DEVICES + cmp bh, NET_DEVICES_MAX ja .error movzx eax, bh 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 and ebx, 0xff @@ -228,6 +228,6 @@ ETH_api: ret .state: - mov eax, [eax + NET_DEVICE.state] + mov eax, [eax + NET_DEVICE.link_state] ret diff --git a/kernel/trunk/network/icmp.inc b/kernel/trunk/network/icmp.inc index 218cf96d72..567b75bbd7 100644 --- a/kernel/trunk/network/icmp.inc +++ b/kernel/trunk/network/icmp.inc @@ -100,8 +100,8 @@ ends align 4 uglobal - ICMP_PACKETS_TX rd MAX_NET_DEVICES - ICMP_PACKETS_RX rd MAX_NET_DEVICES + ICMP_PACKETS_TX rd NET_DEVICES_MAX + ICMP_PACKETS_RX rd NET_DEVICES_MAX endg @@ -116,7 +116,7 @@ macro ICMP_init { xor eax, eax mov edi, ICMP_PACKETS_TX - mov ecx, 2*MAX_NET_DEVICES + mov ecx, 2*NET_DEVICES_MAX rep stosd } diff --git a/kernel/trunk/network/loopback.inc b/kernel/trunk/network/loopback.inc index eb3b619e48..c955671e3b 100644 --- a/kernel/trunk/network/loopback.inc +++ b/kernel/trunk/network/loopback.inc @@ -19,7 +19,8 @@ $Revision: 2891 $ iglobal LOOPBACK_DEVICE: - .type dd NET_TYPE_LOOPBACK + + .device_type dd NET_DEVICE_LOOPBACK .mtu dd 4096 .name dd .namestr @@ -43,7 +44,7 @@ endg ; ; LOOP_input ; -; IN: [esp+4] = Pointer to buffer +; IN: [esp+4] = Pointer to buffer ; [esp+8] = size of buffer ; ; OUT: / @@ -60,11 +61,11 @@ LOOP_input: push eax DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_input: size=%u\n", ecx - lea edx, [eax + 2] - mov ax, word[eax] + lea edx, [eax + 4] + mov eax, dword[eax] mov ebx, LOOPBACK_DEVICE - cmp ax, ETHER_IPv4 + cmp eax, AF_INET4 je IPv4_input 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" push ecx - push di + push edi - add ecx, 2 + add ecx, 4 cmp ecx, [LOOPBACK_DEVICE.mtu] ja .out_of_ram stdcall kernel_alloc, ecx test eax, eax jz .out_of_ram mov edi, eax - pop ax - stosw + pop eax + stosd - lea eax, [edi - 2] ; Set eax to buffer start + lea eax, [edi - 4] ; Set eax to buffer start 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 .done: @@ -119,8 +120,8 @@ LOOP_output: .out_of_ram: DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_output: failed\n" - add esp, 2+4 - sub edi, edi + add esp, 4+4 + xor edi, edi ret diff --git a/kernel/trunk/network/socket.inc b/kernel/trunk/network/socket.inc index aba251016f..959b3f3a00 100644 --- a/kernel/trunk/network/socket.inc +++ b/kernel/trunk/network/socket.inc @@ -127,6 +127,7 @@ struct TCP_SOCKET IP_SOCKET ;------- ; Timers + timer_flags dd ? timer_retransmission dd ? ; rexmt timer_persist dd ? timer_keepalive dd ? ; keepalive/syn timeout @@ -215,18 +216,18 @@ macro SOCKET_init { @@: pseudo_random eax - cmp ax, MIN_EPHEMERAL_PORT + cmp ax, EPHEMERAL_PORT_MIN jb @r - cmp ax, MAX_EPHEMERAL_PORT + cmp ax, EPHEMERAL_PORT_MAX ja @r xchg al, ah mov [last_UDP_port], ax @@: pseudo_random eax - cmp ax, MIN_EPHEMERAL_PORT + cmp ax, EPHEMERAL_PORT_MIN jb @r - cmp ax, MAX_EPHEMERAL_PORT + cmp ax, EPHEMERAL_PORT_MAX ja @r xchg al, ah mov [last_TCP_port], ax @@ -1121,7 +1122,7 @@ SOCKET_set_opt: je .unbind movzx edx, byte [edx + 9] - cmp edx, MAX_NET_DEVICES + cmp edx, NET_DEVICES_MAX ja s_error mov edx, [NET_DRV_LIST + 4*edx] diff --git a/kernel/trunk/network/stack.inc b/kernel/trunk/network/stack.inc index 4c7f465e43..1012a1283c 100644 --- a/kernel/trunk/network/stack.inc +++ b/kernel/trunk/network/stack.inc @@ -31,31 +31,20 @@ endg DEBUG_NETWORK_ERROR = 1 DEBUG_NETWORK_VERBOSE = 0 -MAX_NET_DEVICES = 16 +NET_DEVICES_MAX = 16 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) -MAX_EPHEMERAL_PORT = 61000 MAX_EPHEMERAL_PORT_N = 0x48EE ; same in Network byte order (FIXME) ; Ethernet protocol numbers -ETHER_ARP = 0x0608 -ETHER_IPv4 = 0x0008 -ETHER_IPv6 = 0xDD86 -ETHER_PPP_DISCOVERY = 0x6388 -ETHER_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 +ETHER_PROTO_ARP = 0x0608 +ETHER_PROTO_IPv4 = 0x0008 +ETHER_PROTO_IPv6 = 0xDD86 +ETHER_PROTO_PPP_DISCOVERY = 0x6388 +ETHER_PROTO_PPP_SESSION = 0x6488 ; Internet protocol numbers IP_PROTO_IP = 0 @@ -63,8 +52,17 @@ IP_PROTO_ICMP = 1 IP_PROTO_TCP = 6 IP_PROTO_UDP = 17 -; PPP protocol number -PPP_PROTO_ETHERNET = 666 +; PPP protocol numbers +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 SOCK_STREAM = 1 @@ -83,7 +81,7 @@ SO_REUSEPORT = 1 shl 7 SO_USELOOPBACK = 1 shl 8 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 ; Socket flags for user calls @@ -95,32 +93,26 @@ SOL_SOCKET = 0 ; Socket States -SS_NOFDREF = 0x0001 ; no file table ref any more -SS_ISCONNECTED = 0x0002 ; socket connected to a peer -SS_ISCONNECTING = 0x0004 ; in process of connecting to peer -SS_ISDISCONNECTING = 0x0008 ; in process of disconnecting -SS_CANTSENDMORE = 0x0010 ; can't send more data to peer -SS_CANTRCVMORE = 0x0020 ; can't receive more data from peer -SS_RCVATMARK = 0x0040 ; at mark on input -SS_ISABORTING = 0x0080 ; aborting fd references - close() -SS_RESTARTSYS = 0x0100 ; restart blocked system calls -SS_ISDISCONNECTED = 0x0800 ; socket disconnected from peer +SS_NOFDREF = 0x0001 ; no file table ref any more +SS_ISCONNECTED = 0x0002 ; socket connected to a peer +SS_ISCONNECTING = 0x0004 ; in process of connecting to peer +SS_ISDISCONNECTING = 0x0008 ; in process of disconnecting +SS_CANTSENDMORE = 0x0010 ; can't send more data to peer +SS_CANTRCVMORE = 0x0020 ; can't receive more data from peer +SS_RCVATMARK = 0x0040 ; at mark on input +SS_ISABORTING = 0x0080 ; aborting fd references - close() +SS_RESTARTSYS = 0x0100 ; restart blocked system calls +SS_ISDISCONNECTED = 0x0800 ; socket disconnected from peer -SS_ASYNC = 0x0100 ; async i/o notify -SS_ISCONFIRMING = 0x0200 ; deciding to accept connection req +SS_ASYNC = 0x0100 ; async i/o notify +SS_ISCONFIRMING = 0x0200 ; deciding to accept connection req SS_MORETOCOME = 0x0400 SS_BLOCKED = 0x8000 -SOCKET_MAXDATA = 4096*32 ; must be 4096*(power of 2) where 'power of 2' is at least 8 - -; Network driver types -NET_TYPE_LOOPBACK = 0 -NET_TYPE_ETH = 1 -NET_TYPE_SLIP = 2 - -MAX_backlog = 20 ; maximum backlog for stream sockets +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 ; Error Codes ENOBUFS = 55 @@ -139,11 +131,23 @@ API_ARP = 5 API_PPPOE = 6 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 struct NET_DEVICE - type dd ? ; Type field + device_type dd ? ; Type field mtu dd ? ; Maximal Transmission Unit name dd ? ; Ptr to 0 terminated string @@ -156,7 +160,7 @@ struct NET_DEVICE packets_tx 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) ends @@ -214,7 +218,7 @@ uglobal NET_RUNNING dd ? NET_DEFAULT dd ? - NET_DRV_LIST rd MAX_NET_DEVICES + NET_DRV_LIST rd NET_DEVICES_MAX endg @@ -235,7 +239,7 @@ stack_init: ; Init the network drivers list xor eax, eax mov edi, NET_RUNNING - mov ecx, (MAX_NET_DEVICES + 2) + mov ecx, (NET_DEVICES_MAX + 2) rep stosd 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 - cmp [NET_RUNNING], MAX_NET_DEVICES + cmp [NET_RUNNING], NET_DEVICES_MAX jae .error ;---------------------------------- ; Check if device is already listed 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 repne scasd ; See if device is already in the list @@ -360,7 +364,7 @@ NET_add_device: ;---------------------------- ; Find empty slot in the list xor eax, eax - mov ecx, MAX_NET_DEVICES + mov ecx, NET_DEVICES_MAX mov edi, NET_DRV_LIST repne scasd @@ -378,13 +382,6 @@ NET_add_device: 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 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: @@ -453,7 +418,7 @@ NET_remove_device: je @f ; there are still active devices, find one and make it default xor eax, eax - mov ecx, MAX_NET_DEVICES + mov ecx, NET_DEVICES_MAX mov edi, NET_DRV_LIST repe scasd je @f @@ -466,7 +431,7 @@ NET_remove_device: ; Find the driver in the list mov eax, ebx - mov ecx, MAX_NET_DEVICES + mov ecx, NET_DEVICES_MAX mov edi, NET_DRV_LIST+4 repne scasd @@ -501,7 +466,7 @@ align 4 NET_ptr_to_num: push ecx - mov ecx, MAX_NET_DEVICES + mov ecx, NET_DEVICES_MAX mov edi, NET_DRV_LIST .loop: @@ -658,7 +623,7 @@ sys_network: ; FIXME: make default device easily accessible 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 mov esi, ebx @@ -682,12 +647,11 @@ sys_network: ; FIXME: make default device easily accessible dd .stop ; 3 dd .get_ptr ; 4 dd .get_drv_name ; 5 - dd .set_default ; 6 .number = ($ - .table) / 4 - 1 .get_type: ; 0 = Get device type (ethernet/token ring/...) - mov eax, [eax + NET_DEVICE.type] + mov eax, [eax + NET_DEVICE.device_type] jmp .return @@ -724,11 +688,6 @@ sys_network: ; FIXME: make default device easily accessible jmp .return - .set_default: ; 6 = Set default device - - call NET_set_default - jmp .return - .doesnt_exist: mov eax, -1 @@ -744,7 +703,7 @@ sys_network: ; FIXME: make default device easily accessible ;---------------------------------------------------------------- align 4 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 mov esi, ebx diff --git a/kernel/trunk/network/tcp.inc b/kernel/trunk/network/tcp.inc index 2f4df68930..c999070ef3 100644 --- a/kernel/trunk/network/tcp.inc +++ b/kernel/trunk/network/tcp.inc @@ -129,12 +129,12 @@ ends align 4 uglobal - TCP_segments_tx rd MAX_NET_DEVICES - TCP_segments_rx rd MAX_NET_DEVICES - TCP_segments_missed rd MAX_NET_DEVICES - TCP_segments_dumped rd MAX_NET_DEVICES -; TCP_bytes_rx rq MAX_NET_DEVICES -; TCP_bytes_tx rq MAX_NET_DEVICES + TCP_segments_tx rd NET_DEVICES_MAX + TCP_segments_rx rd NET_DEVICES_MAX + TCP_segments_missed rd NET_DEVICES_MAX + TCP_segments_dumped rd NET_DEVICES_MAX +; TCP_bytes_rx rq NET_DEVICES_MAX +; TCP_bytes_tx rq NET_DEVICES_MAX TCP_sequence_num dd ? TCP_queue rd TCP_QUEUE_SIZE*sizeof.TCP_queue_entry/4 TCP_input_event dd ? @@ -152,7 +152,7 @@ macro TCP_init { xor eax, eax mov edi, TCP_segments_tx - mov ecx, (6*MAX_NET_DEVICES) + mov ecx, (6*NET_DEVICES_MAX) rep stosd pseudo_random eax diff --git a/kernel/trunk/network/tcp_input.inc b/kernel/trunk/network/tcp_input.inc index c1fb8ef9ee..8434a42ab0 100644 --- a/kernel/trunk/network/tcp_input.inc +++ b/kernel/trunk/network/tcp_input.inc @@ -253,6 +253,7 @@ TCP_process_input: mov [ebx + TCP_SOCKET.t_idle], 0 mov [ebx + TCP_SOCKET.timer_keepalive], TCP_time_keep_idle + or [ebx + TCP_SOCKET.timer_flags], timer_flag_keepalive ;-------------------- ; Process TCP options @@ -488,7 +489,7 @@ TCP_process_input: mov [ebx + TCP_SOCKET.SND_UNA], eax ; Stop retransmit timer - mov [ebx + TCP_SOCKET.timer_retransmission], 0 + and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission ; Unlock the socket 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, ; 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 - jg @f + test [ebx + TCP_SOCKET.timer_flags], timer_flag_retransmission + jz @f mov eax, [edx + TCP_header.AckNumber] cmp eax, [ebx + TCP_SOCKET.SND_UNA] @@ -886,7 +887,7 @@ TCP_process_input: pop edx 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 eax, [edx + TCP_header.AckNumber] mov [ebx + TCP_SOCKET.SND_NXT], eax @@ -1017,16 +1018,16 @@ TCP_process_input: mov eax, [ebx + TCP_SOCKET.SND_MAX] cmp eax, [edx + TCP_header.AckNumber] 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 jmp .no_restart .more_data: - cmp [ebx + TCP_SOCKET.timer_persist], 0 - jne .no_restart + test [ebx + TCP_SOCKET.timer_flags], timer_flag_persist + jnz .no_restart mov eax, [ebx + TCP_SOCKET.t_rxtcur] mov [ebx + TCP_SOCKET.timer_retransmission], eax - + or [ebx + TCP_SOCKET.timer_flags], timer_flag_retransmission .no_restart: @@ -1140,6 +1141,7 @@ TCP_process_input: mov eax, ebx call SOCKET_is_disconnected 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 jmp .ack_processed @@ -1151,6 +1153,7 @@ TCP_process_input: mov eax, ebx call TCP_cancel_timers mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL + or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait mov eax, ebx call SOCKET_is_disconnected jmp .ack_processed @@ -1164,6 +1167,7 @@ TCP_process_input: .ack_tw: mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL + or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait jmp .drop_after_ack .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_flags], TF_ACKNOW 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] call SOCKET_ring_create @@ -1272,7 +1277,7 @@ align 4 @@: .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] pop [ebx + TCP_SOCKET.IRS] @@ -1525,11 +1530,13 @@ align 4 mov eax, ebx call TCP_cancel_timers mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL + or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait call SOCKET_is_disconnected jmp .final_processing .fin_timed: mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL + or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait jmp .final_processing diff --git a/kernel/trunk/network/tcp_output.inc b/kernel/trunk/network/tcp_output.inc index a7859e4ce5..6c7140ce16 100644 --- a/kernel/trunk/network/tcp_output.inc +++ b/kernel/trunk/network/tcp_output.inc @@ -93,7 +93,7 @@ TCP_output: jmp .no_force .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 .no_force: @@ -125,7 +125,7 @@ TCP_output: jnz @f ; 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. push [eax + TCP_SOCKET.SND_UNA] @@ -266,13 +266,14 @@ TCP_output: .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 - cmp [eax + TCP_SOCKET.timer_retransmission], 0 - jne @f - cmp [eax + TCP_SOCKET.timer_persist], 0 ; Persist timer already expired? + and [ebx + TCP_SOCKET.timer_flags], not timer_flag_retransmission 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" 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 - - cmp [eax + TCP_SOCKET.timer_retransmission], 0 ;;;; FIXME - ja .retransmit_set + test [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission + jnz .retransmit_set cmp edx, [eax + TCP_SOCKET.SND_UNA] ; edx is still [eax + TCP_SOCKET.SND_NXT] je .retransmit_set mov edx, [eax + TCP_SOCKET.t_rxtcur] mov [eax + TCP_SOCKET.timer_retransmission], edx + or [ebx + TCP_SOCKET.timer_flags], timer_flag_retransmission - cmp [eax + TCP_SOCKET.timer_persist], 0 - jne .retransmit_set - mov [eax + TCP_SOCKET.timer_persist], 0 + test [eax + TCP_SOCKET.timer_flags], timer_flag_persist + jz .retransmit_set + and [ebx + TCP_SOCKET.timer_flags], not timer_flag_persist mov [eax + TCP_SOCKET.t_rxtshift], 0 .retransmit_set: @@ -593,6 +594,7 @@ TCP_send: pop eax mov [eax + TCP_SOCKET.timer_retransmission], TCP_time_re_min + or [ebx + TCP_SOCKET.timer_flags], timer_flag_retransmission lea ecx, [eax + SOCKET.mutex] call mutex_unlock diff --git a/kernel/trunk/network/tcp_subr.inc b/kernel/trunk/network/tcp_subr.inc index 40afd5746a..261415e79a 100644 --- a/kernel/trunk/network/tcp_subr.inc +++ b/kernel/trunk/network/tcp_subr.inc @@ -420,8 +420,8 @@ TCP_set_persist: ; First, check if retransmit timer is not set, retransmit and persist are mutually exclusive - cmp [eax + TCP_SOCKET.timer_retransmission], 0 - ja @f + test [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission + jnz .exit ; calculate RTO push ebx @@ -436,13 +436,14 @@ TCP_set_persist: ; Start/restart persistance timer. 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 cmp [eax + TCP_SOCKET.t_rxtshift], TCP_max_rxtshift jae @f inc [eax + TCP_SOCKET.t_rxtshift] @@: + .exit: ret diff --git a/kernel/trunk/network/tcp_timer.inc b/kernel/trunk/network/tcp_timer.inc index 02e780394b..ee2af77e95 100644 --- a/kernel/trunk/network/tcp_timer.inc +++ b/kernel/trunk/network/tcp_timer.inc @@ -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 ;; ;; ;; ;; Part of the TCP/IP network stack for KolibriOS ;; @@ -16,6 +16,13 @@ $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 ;---------------------- @@ -27,17 +34,16 @@ local .exit mov ebx, net_sockets .loop: mov ebx, [ebx + SOCKET.NextPtr] - or ebx, ebx + test ebx, ebx jz .exit cmp [ebx + SOCKET.Domain], AF_INET4 jne .loop - cmp [ebx + SOCKET.Protocol], IP_PROTO_TCP jne .loop - test [ebx + TCP_SOCKET.t_flags], TF_DELACK jz .loop + and [ebx + TCP_SOCKET.t_flags], not (TF_DELACK) push ebx @@ -58,7 +64,7 @@ local .exit ;---------------------- ; 640 ms timer ;---------------------- -macro TCP_timer_640ms { +macro TCP_timer_640ms { ; TODO: implement timed wait timer! local .loop local .exit @@ -68,7 +74,7 @@ local .exit add [TCP_sequence_num], 64000 ; 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 .loop: @@ -84,8 +90,11 @@ local .exit jne .loop inc [eax + TCP_SOCKET.t_idle] + dec [eax + TCP_SOCKET.timer_retransmission] 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 @@ -96,6 +105,8 @@ local .exit .check_more2: dec [eax + TCP_SOCKET.timer_keepalive] 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 @@ -125,12 +136,16 @@ local .exit .check_more3: dec [eax + TCP_SOCKET.timer_timed_wait] 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 .check_more5: dec [eax + TCP_SOCKET.timer_persist] jnz .loop + test [eax + TCP_SOCKET.timer_flags], timer_flag_persist + jz .loop DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: persist timer expired\n", eax @@ -152,17 +167,6 @@ local .exit TCP_cancel_timers: - push eax edi - - lea edi, [eax + TCP_SOCKET.timer_retransmission] - xor eax, eax - stosd - stosd - stosd - stosd - stosd - - pop edi eax - + mov [eax + TCP_SOCKET.timer_flags], 0 ret \ No newline at end of file diff --git a/kernel/trunk/network/udp.inc b/kernel/trunk/network/udp.inc index 96f17cd1f4..3b5f608803 100644 --- a/kernel/trunk/network/udp.inc +++ b/kernel/trunk/network/udp.inc @@ -29,8 +29,8 @@ ends align 4 uglobal - UDP_PACKETS_TX rd MAX_NET_DEVICES - UDP_PACKETS_RX rd MAX_NET_DEVICES + UDP_PACKETS_TX rd NET_DEVICES_MAX + UDP_PACKETS_RX rd NET_DEVICES_MAX endg @@ -45,7 +45,7 @@ macro UDP_init { xor eax, eax mov edi, UDP_PACKETS_TX - mov ecx, 2*MAX_NET_DEVICES + mov ecx, 2*NET_DEVICES_MAX rep stosd }