forked from KolibriOS/kolibrios
network code cleanup, fix some statistics
git-svn-id: svn://kolibrios.org@7678 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user