network code cleanup, fix some statistics

git-svn-id: svn://kolibrios.org@7678 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr
2019-08-25 18:21:44 +00:00
parent 60a2ed9972
commit 338b57422f
10 changed files with 152 additions and 145 deletions

View File

@@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
;; Copyright (C) KolibriOS team 2004-2019. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; IPv4.INC ;;
@@ -61,33 +61,32 @@ struct IPv4_FRAGMENT_entry ; This structure will replace the ethern
; Ip header begins here (we will need the IP header to re-construct the complete packet)
ends
struct IPv4_ROUTE
Destination dd ?
Gateway dd ?
Flags dd ?
Use dd ?
Interface dd ?
ends
;struct IPv4_ROUTE
;
; Destination dd ?
; Gateway dd ?
; Flags dd ?
; Use dd ?
; Interface dd ?
;
;ends
uglobal
align 4
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
IPv4_address rd NET_DEVICES_MAX
IPv4_subnet rd NET_DEVICES_MAX
IPv4_nameserver rd NET_DEVICES_MAX
IPv4_gateway rd NET_DEVICES_MAX
IPv4_broadcast rd NET_DEVICES_MAX
IPv4_packets_tx rd NET_DEVICES_MAX
IPv4_packets_rx rd NET_DEVICES_MAX
IPv4_packets_dumped rd NET_DEVICES_MAX
IPv4_FRAGMENT_LIST rb IPv4_MAX_FRAGMENTS * sizeof.IPv4_FRAGMENT_slot
IPv4_fragments rb IPv4_MAX_FRAGMENTS * sizeof.IPv4_FRAGMENT_slot
IPv4_ROUTES rd IPv4_MAX_ROUTES * sizeof.IPv4_ROUTE
; IPv4_routes rd IPv4_MAX_ROUTES * sizeof.IPv4_ROUTE
endg
@@ -100,7 +99,7 @@ endg
macro ipv4_init {
xor eax, eax
mov edi, IP_LIST
mov edi, IPv4_address
mov ecx, 7*NET_DEVICES_MAX + (sizeof.IPv4_FRAGMENT_slot*IPv4_MAX_FRAGMENTS)/4
rep stosd
@@ -116,7 +115,7 @@ macro ipv4_decrease_fragment_ttls {
local .loop, .next
mov esi, IPv4_FRAGMENT_LIST
mov esi, IPv4_fragments
mov ecx, IPv4_MAX_FRAGMENTS
.loop:
cmp [esi + IPv4_FRAGMENT_slot.ttl], 0
@@ -244,11 +243,11 @@ ipv4_input:
; local ip (Using RFC1122 strong end system model)
mov eax, [edx + IPv4_header.DestinationAddress]
cmp eax, [IP_LIST + edi]
cmp eax, [IPv4_address + edi]
je .ip_ok
; network layer broadcast
cmp eax, [BROADCAST_LIST + edi]
cmp eax, [IPv4_broadcast + edi]
je .ip_ok
; physical layer broadcast (255.255.255.255)
@@ -261,7 +260,7 @@ ipv4_input:
je .ip_ok
; maybe we just dont have an IP yet and should accept everything on the IP level
cmp [IP_LIST + edi], 0
cmp [IPv4_address + edi], 0
je .ip_ok
; or it's just not meant for us.. :(
@@ -419,7 +418,7 @@ ipv4_input:
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_input: First fragment packet received!\n"
; try to locate a free slot..
mov ecx, IPv4_MAX_FRAGMENTS
mov esi, IPv4_FRAGMENT_LIST
mov esi, IPv4_fragments
.find_free_slot:
cmp word [esi + IPv4_FRAGMENT_slot.ttl], 0
je .found_free_slot
@@ -584,7 +583,7 @@ ipv4_find_fragment_slot:
push eax ebx ecx edx
mov ax, [edx + IPv4_header.Identification]
mov ecx, IPv4_MAX_FRAGMENTS
mov esi, IPv4_FRAGMENT_LIST
mov esi, IPv4_fragments
mov ebx, [edx + IPv4_header.SourceAddress]
mov edx, [edx + IPv4_header.DestinationAddress]
.find_slot:
@@ -649,7 +648,7 @@ ipv4_output:
inc [IPv4_packets_tx + edi] ; update stats
mov ax, ETHER_PROTO_IPv4
mov ebx, [NET_DRV_LIST + edi]
mov ebx, [net_drv_list + edi]
mov ecx, [esp + 6 + 8 + 2]
add ecx, sizeof.IPv4_header
mov edx, esp
@@ -706,6 +705,8 @@ ipv4_output:
ret
.loopback:
inc [IPv4_packets_tx + edi] ; update stats
mov dword [esp], eax ; set source IP to dest IP
mov ecx, [esp + 10]
add ecx, sizeof.IPv4_header
@@ -746,7 +747,7 @@ ipv4_output_raw:
inc [IPv4_packets_tx + 4*edi]
mov ax, ETHER_PROTO_IPv4
mov ebx, [NET_DRV_LIST + 4*edi]
mov ebx, [net_drv_list + 4*edi]
mov ecx, [esp + 6 + 4]
add ecx, sizeof.IPv4_header
mov edx, esp
@@ -945,11 +946,11 @@ ipv4_route:
xor edi, edi
.loop:
mov ebx, [IP_LIST + edi]
and ebx, [SUBNET_LIST + edi]
mov ebx, [IPv4_address + edi]
and ebx, [IPv4_subnet + edi]
jz .next
mov ecx, eax
and ecx, [SUBNET_LIST + edi]
and ecx, [IPv4_subnet + edi]
cmp ebx, ecx
je .got_it
.next:
@@ -957,14 +958,14 @@ ipv4_route:
cmp edi, 4*NET_DEVICES_MAX
jb .loop
mov eax, [GATEWAY_LIST + 4] ; TODO: let user (or a user space daemon) configure default route
mov eax, [IPv4_gateway + 4] ; TODO: let user (or a user space daemon) configure default route
.broadcast:
mov edi, 4 ; TODO: same as above
.got_it:
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_route: %u\n", edi
test edx, edx
jnz @f
mov edx, [IP_LIST + edi]
mov edx, [IPv4_address + edi]
@@:
ret
@@ -975,20 +976,20 @@ ipv4_route:
cmp edi, -1
je .fail
mov edx, [IP_LIST + edi] ; Source IP
mov edx, [IPv4_address + edi] ; Source IP
; Broadcast does not need gateway
cmp eax, 0xffffffff
je @f
; Check if we should route to gateway or not
mov ebx, [IP_LIST + edi]
and ebx, [SUBNET_LIST + edi]
mov ebx, [IPv4_address + edi]
and ebx, [IPv4_subnet + edi]
mov ecx, eax
and ecx, [SUBNET_LIST + edi]
and ecx, [IPv4_subnet + edi]
cmp ecx, ebx
je @f
mov eax, [GATEWAY_LIST + edi]
mov eax, [IPv4_gateway + edi]
@@:
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_route: %u\n", edi
ret
@@ -1038,7 +1039,7 @@ ipv4_connect:
; Fill in local IP
cmp [eax + IP_SOCKET.LocalIP], 0
jne @f
push [IP_LIST + 4] ; FIXME: use correct local IP
push [IPv4_address + 4] ; FIXME: use correct local IP
pop [eax + IP_SOCKET.LocalIP]
; Fill in remote IP
@@ -1100,21 +1101,21 @@ ipv4_api:
ret
.read_ip:
mov eax, [IP_LIST + eax]
mov eax, [IPv4_address + eax]
ret
.write_ip:
mov [IP_LIST + eax], ecx
mov [IPv4_address + eax], ecx
mov edi, eax ; device number, we'll need it for ARP
; pre-calculate the local broadcast address
mov ebx, [SUBNET_LIST + eax]
mov ebx, [IPv4_subnet + eax]
not ebx
or ebx, ecx
mov [BROADCAST_LIST + eax], ebx
mov [IPv4_broadcast + eax], ebx
mov ebx, [NET_DRV_LIST + eax]
mov eax, [IP_LIST + eax]
mov ebx, [net_drv_list + eax]
mov eax, [IPv4_address + eax]
call arp_output_request ; now send a gratuitous ARP
call net_send_event
@@ -1122,38 +1123,38 @@ ipv4_api:
ret
.read_dns:
mov eax, [DNS_LIST + eax]
mov eax, [IPv4_nameserver + eax]
ret
.write_dns:
mov [DNS_LIST + eax], ecx
mov [IPv4_nameserver + eax], ecx
call net_send_event
xor eax, eax
ret
.read_subnet:
mov eax, [SUBNET_LIST + eax]
mov eax, [IPv4_subnet + eax]
ret
.write_subnet:
mov [SUBNET_LIST + eax], ecx
mov [IPv4_subnet + eax], ecx
; pre-calculate the local broadcast address
mov ebx, [IP_LIST + eax]
mov ebx, [IPv4_address + eax]
not ecx
or ecx, ebx
mov [BROADCAST_LIST + eax], ecx
mov [IPv4_broadcast + eax], ecx
call net_send_event
xor eax, eax
ret
.read_gateway:
mov eax, [GATEWAY_LIST + eax]
mov eax, [IPv4_gateway + eax]
ret
.write_gateway:
mov [GATEWAY_LIST + eax], ecx
mov [IPv4_gateway + eax], ecx
call net_send_event
xor eax, eax