From c0fe9dddf7a0192f01ae1977d4650ab86c09985b Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Wed, 5 Jun 2013 00:21:20 +0000 Subject: [PATCH] Improved loopback device, separate ARP tables for every interface, added arpstat functionality to netstat, preparing zeroconf to work on multiple interfaces, improved API (fn 76, fn 74), fixed some bugs. git-svn-id: svn://kolibrios.org@3601 a494cfbc-eb01-0410-851d-a64ba20cac60 --- data/eng/Makefile | 1 - data/eng/menu.dat | 1 - data/it/Makefile | 1 - data/it/menu.dat | 1 - data/rus/Makefile | 1 - data/rus/menu.dat | 3 +- data/sp/Makefile | 1 - data/sp/menu.dat | 1 - kernel/trunk/network/ARP.inc | 226 ++++++++++-------- kernel/trunk/network/IPv4.inc | 23 +- kernel/trunk/network/ethernet.inc | 37 +-- kernel/trunk/network/icmp.inc | 15 +- kernel/trunk/network/loopback.inc | 42 +++- kernel/trunk/network/socket.inc | 11 +- kernel/trunk/network/stack.inc | 113 +++++---- .../develop/libraries/network/network.asm | 2 +- programs/network/arpcfg/arpcfg.asm | 156 ------------ programs/network/netstat/netstat.asm | 177 ++++++++++---- programs/network/zeroconf/zeroconf.asm | 39 ++- 19 files changed, 420 insertions(+), 431 deletions(-) delete mode 100644 programs/network/arpcfg/arpcfg.asm diff --git a/data/eng/Makefile b/data/eng/Makefile index 805a82df8a..b2a4cad5f6 100644 --- a/data/eng/Makefile +++ b/data/eng/Makefile @@ -187,7 +187,6 @@ FASM_PROGRAMS:=\ media/midamp:MEDIA/MIDAMP:$(PROGS)/media/midamp/trunk/midamp.asm \ media/palitra:MEDIA/PALITRA:$(PROGS)/media/palitra/trunk/palitra.asm \ media/startmus:MEDIA/STARTMUS:$(PROGS)/media/startmus/trunk/STARTMUS.ASM \ - network/arpcfg:NETWORK/ARPCFG:$(PROGS)/network/arpcfg/arpcfg.asm \ network/ping:NETWORK/PING:$(PROGS)/network/icmp/ping.asm \ network/netcfg:NETWORK/NETCFG:$(PROGS)/network/netcfg/netcfg.asm \ network/netstat:NETWORK/NETSTAT:$(PROGS)/network/netstat/netstat.asm \ diff --git a/data/eng/menu.dat b/data/eng/menu.dat index 87db32bd72..b31ab3b50c 100644 --- a/data/eng/menu.dat +++ b/data/eng/menu.dat @@ -131,7 +131,6 @@ Clients > /@17 Zero-Config /sys/network/zeroconf Network Config /sys/network/netcfg Network status /sys/network/netstat -ARP status /sys/network/arpcfg #16 **** SERVERS **** FTP daemon /sys/network/ftpd #17 **** CLIENTS **** diff --git a/data/it/Makefile b/data/it/Makefile index eb6e9270ee..1fa23f8793 100644 --- a/data/it/Makefile +++ b/data/it/Makefile @@ -187,7 +187,6 @@ FASM_PROGRAMS:=\ media/midamp:MEDIA/MIDAMP:$(PROGS)/media/midamp/trunk/midamp.asm \ media/palitra:MEDIA/PALITRA:$(PROGS)/media/palitra/trunk/palitra.asm \ media/startmus:MEDIA/STARTMUS:$(PROGS)/media/startmus/trunk/STARTMUS.ASM \ - network/arpcfg:NETWORK/ARPCFG:$(PROGS)/network/arpcfg/arpcfg.asm \ network/ping:NETWORK/PING:$(PROGS)/network/icmp/ping.asm \ network/netcfg:NETWORK/NETCFG:$(PROGS)/network/netcfg/netcfg.asm \ network/netstat:NETWORK/NETSTAT:$(PROGS)/network/netstat/netstat.asm \ diff --git a/data/it/menu.dat b/data/it/menu.dat index bc50c9ba72..0a3cc346a9 100644 --- a/data/it/menu.dat +++ b/data/it/menu.dat @@ -130,7 +130,6 @@ Clients > /@17 Zero-Config /sys/network/zeroconf Network Config /sys/network/netcfg Network status /sys/network/netstat -ARP status /sys/network/arpcfg #16 **** SERVERS **** FTP daemon /sys/network/ftpd #17 **** CLIENTS **** diff --git a/data/rus/Makefile b/data/rus/Makefile index 1570db844a..560140a998 100644 --- a/data/rus/Makefile +++ b/data/rus/Makefile @@ -187,7 +187,6 @@ FASM_PROGRAMS:=\ media/midamp:MEDIA/MIDAMP:$(PROGS)/media/midamp/trunk/midamp.asm \ media/palitra:MEDIA/PALITRA:$(PROGS)/media/palitra/trunk/palitra.asm \ media/startmus:MEDIA/STARTMUS:$(PROGS)/media/startmus/trunk/STARTMUS.ASM \ - network/arpcfg:NETWORK/ARPCFG:$(PROGS)/network/arpcfg/arpcfg.asm \ network/ping:NETWORK/PING:$(PROGS)/network/icmp/ping.asm \ network/netcfg:NETWORK/NETCFG:$(PROGS)/network/netcfg/netcfg.asm \ network/netstat:NETWORK/NETSTAT:$(PROGS)/network/netstat/netstat.asm \ diff --git a/data/rus/menu.dat b/data/rus/menu.dat index 2ef437945d..9f0724a5f2 100644 --- a/data/rus/menu.dat +++ b/data/rus/menu.dat @@ -136,8 +136,7 @@ HEX-ред Zero-Config /sys/network/zeroconf Network Config /sys/network/netcfg Network status /sys/network/netstat -ARP status /sys/network/arpcfg -#16 **** SERVERS **** +#16 **** SERVERS **** FTP daemon /sys/network/ftpd #17 **** CLIENTS **** IRC client /sys/network/ircc diff --git a/data/sp/Makefile b/data/sp/Makefile index 6598cd0dd4..c9b25ddcbc 100644 --- a/data/sp/Makefile +++ b/data/sp/Makefile @@ -187,7 +187,6 @@ FASM_PROGRAMS:=\ media/midamp:MEDIA/MIDAMP:$(PROGS)/media/midamp/trunk/midamp.asm \ media/palitra:MEDIA/PALITRA:$(PROGS)/media/palitra/trunk/palitra.asm \ media/startmus:MEDIA/STARTMUS:$(PROGS)/media/startmus/trunk/STARTMUS.ASM \ - network/arpcfg:NETWORK/ARPCFG:$(PROGS)/network/arpcfg/arpcfg.asm \ network/ping:NETWORK/PING:$(PROGS)/network/icmp/ping.asm \ network/netcfg:NETWORK/NETCFG:$(PROGS)/network/netcfg/netcfg.asm \ network/netstat:NETWORK/NETSTAT:$(PROGS)/network/netstat/netstat.asm \ diff --git a/data/sp/menu.dat b/data/sp/menu.dat index 29c09729f5..772d50d4b6 100644 --- a/data/sp/menu.dat +++ b/data/sp/menu.dat @@ -131,7 +131,6 @@ Clientes > /@17 Zero-Config /sys/network/zeroconf Network Config /sys/network/netcfg Network status /sys/network/netstat -ARP status /sys/network/arpcfg #16 **** SERVIDORES **** FTP daemon /sys/network/ftpd #17 **** CLIENTES **** diff --git a/kernel/trunk/network/ARP.inc b/kernel/trunk/network/ARP.inc index c9644694f4..96cdc84a4f 100644 --- a/kernel/trunk/network/ARP.inc +++ b/kernel/trunk/network/ARP.inc @@ -32,36 +32,36 @@ ARP_REP_OPCODE = 0x0200 ; reply ARP_TABLE_SIZE = 20 ; Size of table -struct ARP_entry +struct ARP_entry - IP dd ? - MAC dp ? - Status dw ? - TTL dw ? + IP dd ? + MAC dp ? + Status dw ? + TTL dw ? ends -struct ARP_header +struct ARP_header - HardwareType dw ? - ProtocolType dw ? - HardwareSize db ? - ProtocolSize db ? - Opcode dw ? - SenderMAC dp ? - SenderIP dd ? - TargetMAC dp ? - TargetIP dd ? + HardwareType dw ? + ProtocolType dw ? + HardwareSize db ? + ProtocolSize db ? + Opcode dw ? + SenderMAC dp ? + SenderIP dd ? + TargetMAC dp ? + TargetIP dd ? ends align 4 uglobal - NumARP dd ? - ARP_table rb ARP_TABLE_SIZE * sizeof.ARP_entry ; TODO: separate ARP table and stats per interface + ARP_table rb NET_DEVICES_MAX*(ARP_TABLE_SIZE * sizeof.ARP_entry) + ARP_entries_num rd NET_DEVICES_MAX ARP_PACKETS_TX rd NET_DEVICES_MAX ARP_PACKETS_RX rd NET_DEVICES_MAX ARP_CONFLICTS rd NET_DEVICES_MAX @@ -81,10 +81,8 @@ endg macro ARP_init { xor eax, eax - mov [NumARP], eax - - mov edi, ARP_PACKETS_TX - mov ecx, 3*NET_DEVICES_MAX + mov edi, ARP_entries_num + mov ecx, 4*NET_DEVICES_MAX rep stosd } @@ -111,11 +109,15 @@ local .exit ; The last status value is provided to allow the network layer to delete ; a packet that is queued awaiting an ARP response - mov ecx, [NumARP] + xor edi, edi + .loop_outer: + mov ecx, [ARP_entries_num + 4*edi] test ecx, ecx jz .exit - mov esi, ARP_table + mov esi, (ARP_TABLE_SIZE * sizeof.ARP_entry) + imul esi, edi + add esi, ARP_table .loop: cmp [esi + ARP_entry.TTL], ARP_STATIC_ENTRY je .next @@ -133,9 +135,9 @@ local .exit cmp [esi + ARP_entry.Status], ARP_AWAITING_RESPONSE je .response_timeout - push esi ecx + push esi edi ecx call ARP_del_entry - pop ecx esi + pop ecx edi esi jmp .next @@ -146,6 +148,9 @@ local .exit jmp .next .exit: + inc edi + cmp edi, NET_DEVICES_MAX + jb .loop_outer } @@ -196,11 +201,13 @@ ARP_input: DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_input: It's a reply\n" - mov ecx, [NumARP] + mov ecx, [ARP_entries_num + 4*edi] test ecx, ecx jz .exit - mov esi, ARP_table + mov esi, (ARP_TABLE_SIZE * sizeof.ARP_entry) + imul esi, edi + add esi, ARP_table .loop: cmp [esi + ARP_entry.IP], eax je .gotit @@ -298,22 +305,19 @@ ARP_input: ; ; ARP_output_request ; -; IN: ip in eax -; device in edi +; IN: ebx = device ptr +; eax = IP ; OUT: / +; scratched: probably everything ; ;--------------------------------------------------------------------------- align 4 ARP_output_request: - push eax ; DestIP - pushd [IP_LIST + edi] ; SenderIP - inc [ARP_PACKETS_TX + edi] ; assume we will succeed + push eax - DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_output_request: ip=%u.%u.%u.%u\n",\ - [esp + 4]:1, [esp + 5]:1, [esp + 6]:1, [esp + 7]:1 - - mov ebx, [NET_DRV_LIST + edi] ; device ptr + DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_output_request: ip=%u.%u.%u.%u device=0x%x\n",\ + [esp]:1, [esp + 1]:1, [esp + 2]:1, [esp + 3]:1, ebx lea eax, [ebx + ETH_DEVICE.mac] ; local device mac mov edx, ETH_BROADCAST ; broadcast mac @@ -322,8 +326,6 @@ ARP_output_request: call ETH_output jz .exit - mov ecx, eax - mov [edi + ARP_header.HardwareType], 0x0100 ; Ethernet mov [edi + ARP_header.ProtocolType], 0x0008 ; IP mov [edi + ARP_header.HardwareSize], 6 ; MAC-addr length @@ -331,29 +333,29 @@ ARP_output_request: mov [edi + ARP_header.Opcode], ARP_REQ_OPCODE ; Request add edi, ARP_header.SenderMAC - lea esi, [ebx + ETH_DEVICE.mac] ; SenderMac movsw ; movsd ; - pop eax ; SenderIP - stosd ; - mov eax, -1 ; DestMac - stosd ; - stosw ; - pop eax ; DestIP - stosd ; +; mov esi, [ebx + NET_DEVICE.number] + xor esi, esi ;;;; FIXME + inc esi ;;;;;;;;; + inc [ARP_PACKETS_TX + 4*esi] ; assume we will succeed + lea esi, [IP_LIST + 4*esi] ; SenderIP + movsd - DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_output_request: device=%x\n", ebx + mov esi, ETH_BROADCAST ; DestMac + movsw ; + movsd ; + popd [edi] ; DestIP - push edx ecx + push edx eax call [ebx + NET_DEVICE.transmit] ret .exit: - add esp, 4 + 4 - DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_output_request: failed\n" - sub eax, eax + add esp, 4 + DEBUGF DEBUG_NETWORK_ERROR, "ARP_output_request: send failed\n" ret @@ -362,50 +364,65 @@ ARP_output_request: ; ARP_add_entry (or update) ; ; IN: esi = ptr to entry (can easily be made on the stack) +; edi = device num ; OUT: eax = entry #, -1 on error -; edi = ptr to newly created entry +; esi = ptr to newly created entry ; ;----------------------------------------------------------------- ; TODO: use a mutex align 4 ARP_add_entry: - DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_add_entry: " + DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_add_entry: device=%u\n", edi - mov ecx, [NumARP] + mov ecx, [ARP_entries_num + 4*edi] cmp ecx, ARP_TABLE_SIZE ; list full ? - jae .error + jae .full - xor eax, eax - mov edi, ARP_table - mov ecx, [esi + ARP_entry.IP] + +; From this point on, we can only fail if IP has a static entry, or if table is corrupt. + + inc [ARP_entries_num + 4*edi] ; assume we will succeed + + push edi + xor ecx, ecx + imul edi, ARP_TABLE_SIZE*sizeof.ARP_entry + add edi, ARP_table + mov eax, [edi + ARP_entry.IP] .loop: cmp [edi + ARP_entry.Status], ARP_NO_ENTRY ; is this slot empty? je .add - cmp [edi + ARP_entry.IP], ecx ; if not, check if it doesnt collide + cmp [edi + ARP_entry.IP], eax ; if not, check if it doesnt collide jne .maybe_next cmp [edi + ARP_entry.TTL], ARP_STATIC_ENTRY ; ok, its the same IP, update it if not static jne .add + DEBUGF DEBUG_NETWORK_ERROR, "ARP_add_entry: failed, IP already has a static entry\n" + jmp .error + .maybe_next: ; try the next slot add edi, sizeof.ARP_entry - inc eax - cmp eax, ARP_TABLE_SIZE - jae .error - jmp .loop + inc ecx + cmp ecx, ARP_TABLE_SIZE + jb .loop .add: + push ecx mov ecx, sizeof.ARP_entry/2 rep movsw - inc [NumARP] - sub edi, sizeof.ARP_entry - DEBUGF DEBUG_NETWORK_VERBOSE, "entry=%u\n", eax + pop ecx + lea esi, [edi - sizeof.ARP_entry] + pop edi + DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_add_entry: entry=%u\n", ecx ret .error: - DEBUGF DEBUG_NETWORK_VERBOSE, "failed\n" + pop edi + dec [ARP_entries_num + 4*edi] + DEBUGF DEBUG_NETWORK_ERROR, "ARP_add_entry_failed\n" + .full: mov eax, -1 ret @@ -414,30 +431,36 @@ ARP_add_entry: ; ; ARP_del_entry ; -; IN: esi = ptr to arp entry -; OUT: / +; IN: esi = ptr to arp entry +; edi = device number +; OUT: / ; ;----------------------------------------------------------------- align 4 ARP_del_entry: - DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: entry=%x entrys=%u\n", esi, [NumARP] + DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: entry=%x entrys=%u\n", esi, [ARP_entries_num + 4*edi] DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: IP=%u.%u.%u.%u\n", \ [esi + ARP_entry.IP]:1, [esi + ARP_entry.IP + 1]:1, [esi + ARP_entry.IP + 2]:1, [esi + ARP_entry.IP + 3]:1 - mov ecx, ARP_table + (ARP_TABLE_SIZE - 1) * sizeof.ARP_entry + push edi + imul edi, (ARP_TABLE_SIZE) * sizeof.ARP_entry + lea ecx, [ARP_table + (ARP_TABLE_SIZE - 1) * sizeof.ARP_entry + edi] sub ecx, esi shr ecx, 1 +; move all trailing entries, sizeof.ARP_entry bytes to left. mov edi, esi add esi, sizeof.ARP_entry rep movsw +; now add an empty entry to the end (erasing previous one) xor eax, eax mov ecx, sizeof.ARP_entry/2 rep stosw - dec [NumARP] + pop edi + dec [ARP_entries_num + 4*edi] DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: success\n" ret @@ -465,7 +488,7 @@ ARP_IP_to_MAC: DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_IP_to_MAC: %u.%u", al, ah rol eax, 16 - DEBUGF DEBUG_NETWORK_VERBOSE, ".%u.%u\n", al, ah + DEBUGF DEBUG_NETWORK_VERBOSE, ".%u.%u device: %u\n", al, ah, edi rol eax, 16 cmp eax, 0xffffffff @@ -474,7 +497,7 @@ ARP_IP_to_MAC: ;-------------------------------- ; Try to find the IP in ARP_table - mov ecx, [NumARP] + mov ecx, [ARP_entries_num + 4*edi] test ecx, ecx jz .not_in_list mov esi, ARP_table + ARP_entry.IP @@ -482,38 +505,41 @@ ARP_IP_to_MAC: cmp [esi], eax je .found_it add esi, sizeof.ARP_entry - loop .scan_loop + dec ecx + jnz .scan_loop .not_in_list: DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_IP_to_MAC: preparing for ARP request\n" -;-------------------- -; Send an ARP request - push eax edi ; save IP for ARP_output_request - -; Now create the ARP entry +; Now craft the ARP entry on the stack pushw ARP_REQUEST_TTL ; TTL pushw ARP_AWAITING_RESPONSE ; status pushd 0 ; mac pushw 0 pushd eax ; ip mov esi, esp + +; Add it to the list call ARP_add_entry + +; Delete the temporary entry add esp, sizeof.ARP_entry ; clear the entry from stack +; If we could not add it to the list, give up cmp eax, -1 ; did ARP_add_entry fail? je .full - mov esi, edi - pop edi eax ; IP in eax, device number in edi, for ARP_output_request - - push esi edi - call ARP_output_request ; And send a request - pop edi esi - ;----------------------------------------------- ; At this point, we got an ARP entry in the list + +; Now send a request packet on the network + pop edi eax ; IP in eax, device number in ebx, for ARP_output_request + + push esi edi + mov ebx, [NET_DRV_LIST + 4*edi] + call ARP_output_request + pop edi esi .found_it: cmp [esi + ARP_entry.Status], ARP_VALID_MAPPING ; Does it have a MAC assigned? je .valid @@ -522,10 +548,10 @@ if ARP_BLOCK cmp [esi + ARP_entry.Status], ARP_AWAITING_RESPONSE ; Are we waiting for reply from remote end? jne .give_up - push esi + push esi edi mov esi, 10 ; wait 10 ms call delay_ms - pop esi + pop edi esi jmp .found_it ; now check again else @@ -536,8 +562,8 @@ end if .valid: DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_IP_to_MAC: found MAC\n" - movzx eax, word[esi + ARP_entry.MAC] - mov ebx, dword[esi + ARP_entry.MAC + 2] + movzx eax, word[edi + ARP_entry.MAC] + mov ebx, dword[edi + ARP_entry.MAC + 2] ret .full: @@ -606,17 +632,19 @@ ARP_api: ret .entries: - mov eax, [NumARP] + mov eax, [ARP_entries_num + eax] ret .read: - cmp ecx, [NumARP] + cmp ecx, [ARP_entries_num + eax] jae .error + shr eax, 2 + imul eax, sizeof.ARP_entry*ARP_TABLE_SIZE + add eax, ARP_table ; edi = pointer to buffer ; ecx = # entry imul ecx, sizeof.ARP_entry - add ecx, ARP_table - mov esi, ecx + lea esi, [eax + ecx] mov ecx, sizeof.ARP_entry/2 rep movsw @@ -625,20 +653,24 @@ ARP_api: .write: ; esi = pointer to buffer + mov edi, eax + shr edi, 2 call ARP_add_entry ; out: eax = entry number, -1 on error ret .remove: ; ecx = # entry - cmp ecx, [NumARP] + cmp ecx, [ARP_entries_num + eax] jae .error imul ecx, sizeof.ARP_entry lea esi, [ARP_table + ecx] + mov edi, eax + shr edi, 2 call ARP_del_entry ret .send_announce: - mov edi, eax + mov ebx, [NET_DRV_LIST + eax] mov eax, [IP_LIST + eax] call ARP_output_request ; now send a gratuitous ARP ret diff --git a/kernel/trunk/network/IPv4.inc b/kernel/trunk/network/IPv4.inc index 6bfabfc90a..d192b98aec 100644 --- a/kernel/trunk/network/IPv4.inc +++ b/kernel/trunk/network/IPv4.inc @@ -568,7 +568,7 @@ IPv4_find_fragment_slot: align 4 IPv4_output: - DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_output: size=%u\n", ecx + DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_output: size=%u ip=0x%x\n", ecx, eax cmp ecx, 65500 ; Max IPv4 packet size ja .too_large @@ -585,9 +585,9 @@ IPv4_output: push ebx ; push the mac onto the stack push ax - inc [IP_packets_tx + edi] ; update stats + inc [IP_packets_tx + 4*edi] ; update stats - mov ebx, [NET_DRV_LIST + edi] + mov ebx, [NET_DRV_LIST + 4*edi] lea eax, [ebx + ETH_DEVICE.mac] mov edx, esp mov ecx, [esp + 10 + 6] @@ -675,8 +675,8 @@ IPv4_output_raw: push ebx ; push the mac push ax - inc [IP_packets_tx + edi] - mov ebx, [NET_DRV_LIST + edi] + inc [IP_packets_tx + 4*edi] + mov ebx, [NET_DRV_LIST + 4*edi] lea eax, [ebx + ETH_DEVICE.mac] mov edx, esp mov ecx, [esp + 6 + 4] @@ -855,7 +855,7 @@ IPv4_fragment: ; IPv4_route ; ; IN: eax = Destination IP -; OUT: edi = device id * 4 +; OUT: edi = device number ; eax = ip of gateway if nescessary, unchanged otherwise ; ;--------------------------------------------------------------------------- @@ -882,15 +882,17 @@ IPv4_route: jnz .loop .invalid: - xor edi, edi ; if none found, use device 0 as default - mov eax, [GATEWAY_LIST] + xor edi, edi ; if none found, use device 1 as default ;;; FIXME + inc di + mov eax, [GATEWAY_LIST+4] .found_it: DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_route: %u\n", edi ret .broadcast: - xor edi, edi + xor edi, edi ;;;; FIXME + inc di ret @@ -973,7 +975,8 @@ IPv4_api: or ebx, ecx mov [BROADCAST_LIST + eax], ebx - mov eax, ecx + mov ebx, [NET_DRV_LIST + eax] + mov eax, [IP_LIST + eax] call ARP_output_request ; now send a gratuitous ARP call NET_send_event diff --git a/kernel/trunk/network/ethernet.inc b/kernel/trunk/network/ethernet.inc index 1d051a254f..74047f2503 100644 --- a/kernel/trunk/network/ethernet.inc +++ b/kernel/trunk/network/ethernet.inc @@ -67,10 +67,10 @@ ETH_input: cmp ax, ETHER_PROTO_IPv4 je IPv4_input - cmp ax, ETHER_PROTO_IPv4 + cmp ax, ETHER_PROTO_ARP je ARP_input - cmp ax, ETHER_PROTO_IPv4 + cmp ax, ETHER_PROTO_IPv6 je IPv6_input cmp ax, ETHER_PROTO_PPP_DISCOVERY @@ -162,7 +162,7 @@ ETH_output: ; ; ETH_API ; -; This function is called by system function 75 +; This function is called by system function 76 ; ; IN: subfunction number in bl ; device number in bh @@ -187,39 +187,13 @@ ETH_api: jmp dword [.table + 4*ebx] .table: - dd .packets_tx ; 0 - dd .packets_rx ; 1 - dd .bytes_tx ; 2 - dd .bytes_rx ; 3 - dd .read_mac ; 4 - dd .state ; 5 + dd .read_mac ; 0 .number = ($ - .table) / 4 - 1 .error: or eax, -1 ret - .packets_tx: - mov eax, [eax + NET_DEVICE.packets_tx] - - ret - - .packets_rx: - mov eax, [eax + NET_DEVICE.packets_rx] - ret - - .bytes_tx: - mov ebx, dword [eax + NET_DEVICE.bytes_tx + 4] - mov eax, dword [eax + NET_DEVICE.bytes_tx] - mov [esp+20+4], ebx ; TODO: fix this ugly code - ret - - .bytes_rx: - mov ebx, dword [eax + NET_DEVICE.bytes_rx + 4] - mov eax, dword [eax + NET_DEVICE.bytes_rx] - mov [esp+20+4], ebx ; TODO: fix this ugly code - ret - .read_mac: movzx ebx, word [eax + ETH_DEVICE.mac] @@ -227,7 +201,4 @@ ETH_api: mov [esp+20+4], ebx ; TODO: fix this ugly code ret - .state: - mov eax, [eax + NET_DEVICE.link_state] - ret diff --git a/kernel/trunk/network/icmp.inc b/kernel/trunk/network/icmp.inc index 567b75bbd7..2e5e517fb7 100644 --- a/kernel/trunk/network/icmp.inc +++ b/kernel/trunk/network/icmp.inc @@ -16,7 +16,6 @@ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - $Revision: 2924 $ ; ICMP types & codes @@ -168,16 +167,18 @@ ICMP_input: mov esi, [esp] ; Start of buffer - cmp dword[edi + 4], 1 shl 24 + 127 - je .loopback - ; Update stats (and validate device ptr) call NET_ptr_to_num - cmp edi,-1 + cmp edi, -1 je .dump inc [ICMP_PACKETS_RX + 4*edi] inc [ICMP_PACKETS_TX + 4*edi] + cmp ebx, LOOPBACK_DEVICE + je .loopback + +; FIXME: dont assume device is an ethernet device! + ; exchange dest and source address in IP header ; exchange dest and source MAC in ETH header push dword [esi + ETH_header.DstMAC] @@ -188,10 +189,10 @@ ICMP_input: push word [esi + ETH_header.SrcMAC + 4] pop word [esi + ETH_header.DstMAC + 4] pop word [esi + ETH_header.SrcMAC + 4] - add esi, sizeof.ETH_header-2 + add esi, sizeof.ETH_header-4 .loopback: - add esi, 2 + add esi, 4 push [esi + IPv4_header.SourceAddress] push [esi + IPv4_header.DestinationAddress] pop [esi + IPv4_header.SourceAddress] diff --git a/kernel/trunk/network/loopback.inc b/kernel/trunk/network/loopback.inc index c955671e3b..a1696965c2 100644 --- a/kernel/trunk/network/loopback.inc +++ b/kernel/trunk/network/loopback.inc @@ -20,26 +20,46 @@ iglobal LOOPBACK_DEVICE: - .device_type dd NET_DEVICE_LOOPBACK - .mtu dd 4096 - .name dd .namestr + .device_type dd NET_DEVICE_LOOPBACK + .mtu dd 4096 + .name dd .namestr - .unload dd .dummy_fn - .reset dd .dummy_fn - .transmit dd LOOP_input + .unload dd .dummy_fn + .reset dd .dummy_fn + .transmit dd LOOP_input - .bytes_tx dq 0 - .bytes_rx dq 0 - .packets_tx dd 0 - .packets_rx dd 0 + .bytes_tx dq 0 + .bytes_rx dq 0 + .packets_tx dd 0 + .packets_rx dd 0 - .namestr db 'loopback', 0 + .link_state dd -1 + .hwacc dd 0 + + .namestr db 'loopback', 0 .dummy_fn: ret endg + +macro LOOP_init { +local .fail + + mov ebx, LOOPBACK_DEVICE + call NET_add_device + + cmp eax, -1 + je .fail + + mov [IP_LIST], 127 + 1 shl 24 + mov [SUBNET_LIST], 255 + mov [BROADCAST_LIST], 0xffffff00 + 127 + + .fail: +} + ;----------------------------------------------------------------- ; ; LOOP_input diff --git a/kernel/trunk/network/socket.inc b/kernel/trunk/network/socket.inc index 959b3f3a00..6a9c0ada73 100644 --- a/kernel/trunk/network/socket.inc +++ b/kernel/trunk/network/socket.inc @@ -433,11 +433,10 @@ SOCKET_bind: .tcp: .udp: - mov ebx, [edx + 4] ; First, fill in the IP + cmp ebx, [edx + 4] ; First, fill in the IP test ebx, ebx ; If IP is 0, use default jnz @f - mov ebx, [NET_DEFAULT] - mov ebx, [IP_LIST + 4*ebx] + mov ebx, [IP_LIST + 4] ;;;;; FIXME !i!i!i @@: mov [eax + IP_SOCKET.LocalIP], ebx @@ -484,7 +483,7 @@ SOCKET_connect: .af_inet4: cmp [eax + IP_SOCKET.LocalIP], 0 jne @f - push [IP_LIST] ; FIXME + push [IP_LIST + 4] ; FIXME !i!i!i! pop [eax + IP_SOCKET.LocalIP] @@: @@ -515,6 +514,8 @@ align 4 pushd [edx + 4] pop [eax + IP_SOCKET.RemoteIP] + DEBUGF 1, "Connecting to 0x%x\n", [eax + IP_SOCKET.RemoteIP] + cmp [eax + UDP_SOCKET.LocalPort], 0 jne @f call SOCKET_find_port @@ -633,7 +634,7 @@ SOCKET_listen: cmp [eax + IP_SOCKET.LocalIP], 0 jne @f - push [IP_LIST] + push [IP_LIST + 4] ;;; fixme!!!! pop [eax + IP_SOCKET.LocalIP] @@: diff --git a/kernel/trunk/network/stack.inc b/kernel/trunk/network/stack.inc index 1012a1283c..80552b53f8 100644 --- a/kernel/trunk/network/stack.inc +++ b/kernel/trunk/network/stack.inc @@ -217,7 +217,6 @@ align 4 uglobal NET_RUNNING dd ? - NET_DEFAULT dd ? NET_DRV_LIST rd NET_DEVICES_MAX endg @@ -254,6 +253,8 @@ stack_init: SOCKET_init + LOOP_init + mov [net_tmr_count], 0 ret @@ -312,7 +313,7 @@ stack_handler: align 4 NET_link_changed: - DEBUGF DEBUG_NETWORK_VERBOSE, "NET_link_changed device=0x%x status=0x%x\n", ebx, [ebx + NET_DEVICE.state] + DEBUGF DEBUG_NETWORK_VERBOSE, "NET_link_changed device=0x%x status=0x%x\n", ebx, [ebx + NET_DEVICE.link_state] align 4 NET_send_event: @@ -398,7 +399,7 @@ NET_add_device: ; ; NET_Remove_Device: ; -; This function is called by etwork drivers, +; This function is called by network drivers, ; to unregister network devices from the kernel ; ; IN: Pointer to device structure in ebx @@ -411,28 +412,12 @@ NET_remove_device: cmp [NET_RUNNING], 0 je .error - cmp [NET_DRV_LIST], ebx - jne @f - mov [NET_DRV_LIST], 0 - cmp [NET_RUNNING], 1 - je @f - ; there are still active devices, find one and make it default - xor eax, eax - mov ecx, NET_DEVICES_MAX - mov edi, NET_DRV_LIST - repe scasd - je @f - shr edi, 2 - dec edi - mov [NET_DEFAULT], edi - @@: - ;---------------------------- ; Find the driver in the list mov eax, ebx mov ecx, NET_DEVICES_MAX - mov edi, NET_DRV_LIST+4 + mov edi, NET_DRV_LIST repne scasd jnz .error @@ -442,10 +427,11 @@ NET_remove_device: xor eax, eax mov dword [edi-4], eax + dec [NET_RUNNING] call NET_send_event - dec [NET_RUNNING] + xor eax, eax ret .error: @@ -610,17 +596,18 @@ checksum_2: ;---------------------------------------------------------------- ; -; System function to work with network devices (75) +; System function to work with network devices (74) ; ;---------------------------------------------------------------- align 4 -sys_network: ; FIXME: make default device easily accessible +sys_network: cmp ebx, -1 jne @f mov eax, [NET_RUNNING] - jmp .return + mov [esp+32], eax + ret @@: cmp bh, NET_DEVICES_MAX ; Check if device number exists @@ -647,16 +634,20 @@ sys_network: ; FIXME: make default device easily accessible dd .stop ; 3 dd .get_ptr ; 4 dd .get_drv_name ; 5 + + dd .packets_tx ; 6 + dd .packets_rx ; 7 + dd .bytes_tx ; 8 + dd .bytes_rx ; 9 + dd .state ; 10 .number = ($ - .table) / 4 - 1 - .get_type: ; 0 = Get device type (ethernet/token ring/...) - + .get_type: mov eax, [eax + NET_DEVICE.device_type] - jmp .return - - - .get_dev_name: ; 1 = Get device name + mov [esp+32], eax + ret + .get_dev_name: mov esi, [eax + NET_DEVICE.name] mov edi, ecx @@ -664,38 +655,66 @@ sys_network: ; FIXME: make default device easily accessible rep movsd xor eax, eax - jmp .return - - .reset: ; 2 = Reset the device + mov [esp+32], eax + ret + .reset: call [eax + NET_DEVICE.reset] - jmp .return - - .stop: ; 3 = Stop driver for this device + mov [esp+32], eax + ret + .stop: call [eax + NET_DEVICE.unload] - jmp .return + mov [esp+32], eax + ret - .get_ptr: ; 4 = Get driver pointer - - jmp .return + .get_ptr: + mov [esp+32], eax + ret - .get_drv_name: ; 5 = Get driver name - + .get_drv_name: xor eax, eax - jmp .return + mov [esp+32], eax + ret + + .packets_tx: + mov eax, [eax + NET_DEVICE.packets_tx] + mov [esp+32], eax + ret + + .packets_rx: + mov eax, [eax + NET_DEVICE.packets_rx] + mov [esp+32], eax + ret + + .bytes_tx: + mov ebx, dword [eax + NET_DEVICE.bytes_tx + 4] + mov [esp+20], ebx + mov eax, dword [eax + NET_DEVICE.bytes_tx] + mov [esp+32], eax + ret + + .bytes_rx: + mov ebx, dword [eax + NET_DEVICE.bytes_rx + 4] + mov [esp+20], ebx + mov eax, dword [eax + NET_DEVICE.bytes_rx] + mov [esp+32], eax + ret + + .state: + mov eax, [eax + NET_DEVICE.link_state] + mov [esp+32], eax + ret .doesnt_exist: - mov eax, -1 - - .return: - mov [esp+32], eax + mov dword[esp+32], -1 ret + ;---------------------------------------------------------------- ; ; System function to work with protocols (76) diff --git a/programs/develop/libraries/network/network.asm b/programs/develop/libraries/network/network.asm index d54fb8076e..89bc902e8d 100644 --- a/programs/develop/libraries/network/network.asm +++ b/programs/develop/libraries/network/network.asm @@ -675,7 +675,7 @@ lock xadd [DNSrequestID], eax ; atomically increment ID, get old value mov eax, 0x01000100 stosd ; 7. Get DNS server address. - mcall 76, API_IPv4 + 4 ; protocol IP=0, device number=0, function=get DNS address + mcall 76, API_IPv4 + (1 shl 8) + 4 ; protocol IP=0, device number=0, function=get DNS address cmp eax, -1 je .ret.dnserr mov esi, eax ; put server address to esi diff --git a/programs/network/arpcfg/arpcfg.asm b/programs/network/arpcfg/arpcfg.asm deleted file mode 100644 index 766a514185..0000000000 --- a/programs/network/arpcfg/arpcfg.asm +++ /dev/null @@ -1,156 +0,0 @@ -; -; ARPmanager for KolibriOS -; -; hidnplayr@gmail.com -; - -format binary as "" - -use32 - - org 0x0 - - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; start of code - dd IM_END ; size of image - dd (I_END+0x100) ; memory for app - dd (I_END+0x100) ; esp - dd 0x0 , 0x0 ; I_Param , I_Icon - -include '../macros.inc' -purge mov, add, sub -include '../struct.inc' -include '../network.inc' - -START: - -redraw: - - mcall 12, 1 - mcall 0, 100 shl 16 + 520, 100 shl 16 + 240, 0x34bcbcbc, , str_name - mcall 4, 25 shl 16 + 31, 0x80000000, str_legend - mcall 12, 2 - -draw_stats: - - mov edx, 50 shl 16 + 50 - mov [last], 0 - - .loop: - mcall 76, API_ARP + 3, [last],,, arp_buf - cmp eax, -1 - je mainloop - - mcall 4, edx, 0x80000000, str_entry - mov edx, ebx - - mov eax, 47 - mov ebx, 0x00030000 - mov esi, 0x40000000 - mov edi, 0x00bcbcbc - xor ecx, ecx - - mov cl, byte[arp_buf.IP+0] - mcall - - mov cl, byte[arp_buf.IP+1] - add edx, 24 shl 16 - mcall - - mov cl, byte[arp_buf.IP+2] - add edx, 24 shl 16 - mcall - - mov cl, byte[arp_buf.IP+3] - add edx, 24 shl 16 - mcall - - - mov ebx, 0x00020100 - mov cl, byte[arp_buf.MAC+0] - add edx, 36 shl 16 - mcall - - mov cl, byte[arp_buf.MAC+1] - add edx, 18 shl 16 - mcall - - mov cl, byte[arp_buf.MAC+2] - add edx, 18 shl 16 - mcall - - mov cl, byte[arp_buf.MAC+3] - add edx, 18 shl 16 - mcall - - mov cl, byte[arp_buf.MAC+4] - add edx, 18 shl 16 - mcall - - mov cl, byte[arp_buf.MAC+5] - add edx, 18 shl 16 - mcall - - mov ebx, 0x00040000 - mov cx, [arp_buf.status] - add edx, 30 shl 16 - mcall - - mov cx, [arp_buf.TTL] - add edx, 60 shl 16 - mcall - - add dx, 20 - rol edx, 16 - mov dx, 50 - rol edx, 16 - inc [last] - - jmp .loop - - -mainloop: - - mcall 23,50 ; wait for event with timeout (0,5 s) - - cmp eax, 1 - je redraw - cmp eax, 2 - je key - cmp eax, 3 - je button - - jmp draw_stats - - -key: - mcall 2 - jmp mainloop - - -button: ; button - mcall 17 ; get id - cmp ah, 1 - je exit - jmp redraw - -exit: - mcall -1 - - - -; DATA AREA - -str_name db 'ARP manager', 0 -str_legend db '# IP-address MAC-address Status TTL', 0 -str_entry db ' . . . - - - - - s', 0 - -IM_END: - -last dd ? -arp_buf ARP_entry - -I_END: - - diff --git a/programs/network/netstat/netstat.asm b/programs/network/netstat/netstat.asm index 6fe4a29c1a..0d4da37a41 100644 --- a/programs/network/netstat/netstat.asm +++ b/programs/network/netstat/netstat.asm @@ -18,13 +18,13 @@ use32 org 0x0 - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; start of code - dd I_END ; size of image - dd (I_END+0x100) ; memory for app - dd (I_END+0x100) ; esp - dd I_PARAM , 0x0 ; I_Param , I_Icon + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd I_END ; size of image + dd (I_END+0x1000) ; memory for app + dd (I_END+0x1000) ; esp + dd 0, 0 ; I_Param , I_Path include '..\macros.inc' include '..\network.inc' @@ -38,17 +38,21 @@ redraw: call draw_interfaces + xor ebx, ebx + mov bh, [device] + mcall 74 + mov [device_type], eax + mov edx, 101 mov esi, 0x00aaaaff mov edi, 0x00aaffff cmp dl, [mode] cmove esi, edi - mcall 8, 25 shl 16 + 65, 25 shl 16 + 20 - + mcall 8, 5 shl 16 + 55, 5 shl 16 + 20 .morebuttons: inc edx - add ebx, 75 shl 16 + add ebx, 60 shl 16 mov esi, 0x00aaaaff cmp dl, [mode] @@ -58,12 +62,12 @@ redraw: cmp edx, 105 jle .morebuttons - mcall 4, 28 shl 16 + 31, 0x80000000, modes + mcall 4, 8 shl 16 + 11, 0x80000000, modes cmp [mode], 101 jne .no_eth - mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx + mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx add ebx, 18 mov edx, str_packets_rx mcall @@ -74,19 +78,23 @@ redraw: mov edx, str_bytes_rx mcall add ebx, 18 - mov edx, str_MAC - mcall - add ebx, 18 mov edx, str_link mcall - mov ebx, API_ETH + 4 + cmp [device_type], 1 + jne end_of_draw + + add ebx, 18 + mov edx, str_MAC + mcall + + mov ebx, API_ETH mov bh, [device] mcall 76 push eax push bx - mov edx, 135 shl 16 + 75 + 4*18 + mov edx, 135 shl 16 + 35 + 5*18 call draw_mac jmp end_of_draw @@ -95,7 +103,7 @@ redraw: cmp [mode], 102 jne .no_ip - mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx + mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx add ebx, 18 mov edx, str_packets_rx mcall @@ -133,7 +141,7 @@ redraw: mcall 76 push eax - mov edx, 135 shl 16 + 75 + 2*18 + mov edx, 135 shl 16 + 35 + 2*18 call draw_ip add edx, 18 @@ -152,7 +160,7 @@ redraw: cmp [mode], 103 jne .no_arp - mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx + mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx add ebx, 18 mov edx, str_packets_rx mcall @@ -163,11 +171,13 @@ redraw: mov edx, str_conflicts mcall + mcall 4, 8 shl 16 + 130, 0x80000000, str_ARP_legend + jmp end_of_draw .no_arp: - mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx + mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx add ebx, 18 mov edx, str_packets_rx @@ -196,26 +206,24 @@ draw_stats: mov ebx, API_ETH mov bh, [device] + mov bl, 6 @@: push ebx - mcall 76 + mcall 74 pop ebx push eax inc bl - cmp bl, 3 + cmp bl, 10 jbe @r - inc bl - mcall 76 - push eax mov ebx, 0x000a0000 pop ecx - mov edx, 135 shl 16 + 75 + 5*18 + mov edx, 135 shl 16 + 35 + 4*18 mov esi, 0x40000000 mov edi, 0x00bcbcbc mcall 47 - sub edx, 18*2 + sub edx, 18 pop ecx mcall @@ -255,7 +263,7 @@ not_101: mov ebx, 0x000a0000 pop ecx - mov edx, 135 shl 16 + 75 + 18 + mov edx, 135 shl 16 + 35 + 18 mov esi, 0x40000000 mov edi, 0x00bcbcbc mcall 47 @@ -299,7 +307,7 @@ not_102: mov ebx, 0x000a0000 pop ecx - mov edx, 135 shl 16 + 75 + 3*18 + mov edx, 135 shl 16 + 35 + 3*18 mov esi, 0x40000000 mov edi, 0x00bcbcbc mcall 47 @@ -316,7 +324,84 @@ not_102: pop ecx mcall - jmp mainloop + + + mov edx, 50 shl 16 + 150 + mov [last], 0 + + .arp_loop: + mov ebx, API_ARP + 3 + mov bh, [device] + mcall 76, , [last],,, arp_buf + cmp eax, -1 + je mainloop + + mcall 4, 20 shl 16 + 140, 0x80000000, str_ARP_entry + mov edx, ebx + + mov eax, 47 + mov ebx, 0x00030000 + mov esi, 0x40000000 + mov edi, 0x00bcbcbc + xor ecx, ecx + + mov cl, byte[arp_buf.IP+0] + mcall + + mov cl, byte[arp_buf.IP+1] + add edx, 24 shl 16 + mcall + + mov cl, byte[arp_buf.IP+2] + add edx, 24 shl 16 + mcall + + mov cl, byte[arp_buf.IP+3] + add edx, 24 shl 16 + mcall + + + mov ebx, 0x00020100 + mov cl, byte[arp_buf.MAC+0] + add edx, 36 shl 16 + mcall + + mov cl, byte[arp_buf.MAC+1] + add edx, 18 shl 16 + mcall + + mov cl, byte[arp_buf.MAC+2] + add edx, 18 shl 16 + mcall + + mov cl, byte[arp_buf.MAC+3] + add edx, 18 shl 16 + mcall + + mov cl, byte[arp_buf.MAC+4] + add edx, 18 shl 16 + mcall + + mov cl, byte[arp_buf.MAC+5] + add edx, 18 shl 16 + mcall + + mov ebx, 0x00040000 + mov cx, [arp_buf.status] + add edx, 30 shl 16 + mcall + + mov cx, [arp_buf.TTL] + add edx, 60 shl 16 + mcall + + add dx, 18 + rol edx, 16 + mov dx, 8 + rol edx, 16 + inc [last] + + jmp .arp_loop not_103: @@ -338,7 +423,7 @@ not_103: mov ebx, 0x000a0000 pop ecx - mov edx, 135 shl 16 + 75 + 18 + mov edx, 135 shl 16 + 35 + 18 mov esi, 0x40000000 mov edi, 0x00bcbcbc mcall 47 @@ -369,7 +454,7 @@ not_104: mov ebx, 0x000a0000 pop ecx - mov edx, 135 shl 16 + 75 + 18 + mov edx, 135 shl 16 + 35 + 18 mov esi, 0x40000000 mov edi, 0x00bcbcbc mcall 47 @@ -412,7 +497,7 @@ not_105: mov ebx, 0x000a0000 pop ecx - mov edx, 135 shl 16 + 75 + 18*3 + mov edx, 135 shl 16 + 35 + 18*3 mov esi, 0x40000000 mov edi, 0x00bcbcbc mcall 47 @@ -530,8 +615,8 @@ draw_ip: draw_interfaces: - mov [.btnpos], 8 shl 16 + 20 - mov [.txtpos], 490 shl 16 + 15 + mov [.btnpos], 5 shl 16 + 20 + mov [.txtpos], 455 shl 16 + 12 mcall 74, -1 ; get number of active network devices mov ecx, eax @@ -539,8 +624,8 @@ draw_interfaces: xor ebx, ebx ; get device type .loop: mcall 74 - cmp eax, 1 ; ethernet? - je .hit + cmp eax, 1 ; loopback or ethernet? + jbe .hit inc bh jb .loop ; tried all 256? ret @@ -553,17 +638,17 @@ draw_interfaces: mov esi, 0x00aaaaff cmp bh, [device] cmove esi, 0x00aaffff - mcall 8, 485 shl 16 + 100, [.btnpos] + mcall 8, 450 shl 16 + 135, [.btnpos] mov ebx, [esp] inc bl mov ecx, namebuf mov edx, namebuf - mcall 74 ; get device name + mcall 74 ; get device name cmp eax, -1 jne @f mov edx, str_unknown @@: - mcall 4, [.txtpos], 0x80000000 ; print the name + mcall 4, [.txtpos], 0x80000000 ; print the name pop ebx ecx inc bh @@ -587,7 +672,9 @@ draw_interfaces: name db 'Netstat', 0 mode db 101 device db 0 -modes db 'Ethernet IPv4 ARP ICMP UDP TCP', 0 +device_type dd 0 +last dd 0 +modes db 'Physical IPv4 ARP ICMP UDP TCP', 0 str_packets_tx db 'Packets sent:', 0 str_packets_rx db 'Packets received:', 0 @@ -605,9 +692,11 @@ str_missed db 'Packets missed:',0 str_dumped db 'Packets dumped:',0 str_link db 'Link state:',0 -namebuf rb 64 +str_ARP_legend db 'IP-address MAC-address Status TTL', 0 +str_ARP_entry db ' . . . - - - - - s', 0 -I_PARAM rb 1024 +namebuf rb 64 +arp_buf ARP_entry I_END: diff --git a/programs/network/zeroconf/zeroconf.asm b/programs/network/zeroconf/zeroconf.asm index 94c6c3a003..3754ef5711 100644 --- a/programs/network/zeroconf/zeroconf.asm +++ b/programs/network/zeroconf/zeroconf.asm @@ -141,7 +141,9 @@ START: DEBUGF 1,">Zero-config service loaded\n" .wait: - mcall 76, API_ETH + 4 ; get MAC of ethernet interface 0 + mov ebx, API_ETH + 0 + mov bh, [device] + mcall 76 ; get MAC of ethernet interface 1 cmp eax, -1 jne .start @@ -342,10 +344,15 @@ request: call dhcp_end - mcall 76, API_IPv4 + 3, [dhcp.ip] ; ip - mcall 76, API_IPv4 + 5, [dhcp.dns] ; dns - mcall 76, API_IPv4 + 7, [dhcp.subnet] ; subnet - mcall 76, API_IPv4 + 9, [dhcp.gateway] ; gateway + mov ebx, API_IPv4 + 3 + mov bh, [device] + mcall 76, , [dhcp.ip] ; ip + mov bl, 5 + mcall 76, , [dhcp.dns] ; dns + mov bl, 7 + mcall 76, , [dhcp.subnet] ; subnet + mov bl, 9 + mcall 76, , [dhcp.gateway] ; gateway jmp exit @@ -479,11 +486,16 @@ link_local: mov cx, ax shl ecx, 16 mov cx, 0xfea9 ; IP 169.254.0.0 link local net, see RFC3927 - mcall 76, API_IPv4 + 3, ecx ; mask is 255.255.0.0 + mov ebx, API_IPv4 + 3 + mov bh, [device] + mcall 76, , ecx ; mask is 255.255.0.0 DEBUGF 1,"Link Local IP assinged: 169.254.%u.%u\n", [generator+0]:1, [generator+1]:1 - mcall 76, API_IPv4 + 7, 0xffff - mcall 76, API_IPv4 + 9, 0x0 - mcall 76, API_IPv4 + 5, 0x0 + mov bl, 7 + mcall 76, , 0xffff + mov bl, 9 + mcall 76, , 0x0 + mov bl, 5 + mcall 76, , 0x0 mcall 5, PROBE_WAIT*100 @@ -506,7 +518,9 @@ link_local: mcall 5 DEBUGF 1,"Sending Probe\n" - mcall 76, API_ARP + 6 + mov ebx, API_ARP + 6 + mov bh, [device] + mcall 76 inc esi cmp esi, PROBE_NUM @@ -521,7 +535,9 @@ link_local: announce_loop: DEBUGF 1,"Sending Announce\n" - mcall 76, API_ARP + 6 + mov ebx, API_ARP + 6 + mov bh, [device] + mcall 76 inc esi cmp esi,ANNOUNCE_NUM @@ -594,6 +610,7 @@ path db '/sys/network.ini' IM_END: +device db 1 inibuf rb 16 dhcpMsgType db ?