From 343d6e80ca1e9b28f12a694e3d309b1d9863aa2c Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Sat, 12 Nov 2011 22:35:01 +0000 Subject: [PATCH] more small updates and fixes in net branch git-svn-id: svn://kolibrios.org@2311 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/branches/net/network/ARP.inc | 634 +++++++++++------------ kernel/branches/net/network/ethernet.inc | 221 ++++---- kernel/branches/net/network/icmp.inc | 14 +- kernel/branches/net/network/socket.inc | 5 +- kernel/branches/net/network/udp.inc | 13 +- 5 files changed, 439 insertions(+), 448 deletions(-) diff --git a/kernel/branches/net/network/ARP.inc b/kernel/branches/net/network/ARP.inc index 7c9b5ec3ac..30e47bb815 100644 --- a/kernel/branches/net/network/ARP.inc +++ b/kernel/branches/net/network/ARP.inc @@ -18,52 +18,52 @@ $Revision$ -ARP_NO_ENTRY equ 0 -ARP_VALID_MAPPING equ 1 -ARP_AWAITING_RESPONSE equ 2 -ARP_RESPONSE_TIMEOUT equ 3 +ARP_NO_ENTRY equ 0 +ARP_VALID_MAPPING equ 1 +ARP_AWAITING_RESPONSE equ 2 +ARP_RESPONSE_TIMEOUT equ 3 -ARP_REQUEST_TTL equ 31 ; 20 s -ARP_ENTRY_TTL equ 937 ; 600 s -ARP_STATIC_ENTRY equ -1 +ARP_REQUEST_TTL equ 31 ; 20 s +ARP_ENTRY_TTL equ 937 ; 600 s +ARP_STATIC_ENTRY equ -1 -ARP_REQ_OPCODE equ 0x0100 ; request -ARP_REP_OPCODE equ 0x0200 ; reply +ARP_REQ_OPCODE equ 0x0100 ; request +ARP_REP_OPCODE equ 0x0200 ; reply -ARP_TABLE_SIZE equ 20 ; Size of table +ARP_TABLE_SIZE equ 20 ; Size of table struct ARP_entry - IP dd ? - MAC dp ? - Status dw ? - TTL dw ? + IP dd ? + MAC dp ? + Status dw ? + TTL dw ? ends 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 ? + NumARP dd ? - ARP_table rb ARP_TABLE_SIZE * sizeof.ARP_entry + ARP_table rb ARP_TABLE_SIZE * sizeof.ARP_entry - ARP_PACKETS_TX rd MAX_NET_DEVICES - ARP_PACKETS_RX rd MAX_NET_DEVICES + ARP_PACKETS_TX rd MAX_NET_DEVICES + ARP_PACKETS_RX rd MAX_NET_DEVICES endg @@ -79,12 +79,12 @@ endg ;----------------------------------------------------------------- macro ARP_init { - xor eax, eax - mov [NumARP], eax + xor eax, eax + mov [NumARP], eax - mov edi, ARP_PACKETS_TX - mov ecx, 2*MAX_NET_DEVICES - rep stosd + mov edi, ARP_PACKETS_TX + mov ecx, 2*MAX_NET_DEVICES + rep stosd } @@ -96,8 +96,8 @@ macro ARP_init { macro ARP_decrease_entry_ttls { -local .loop -local .exit +local .loop +local .exit ; The TTL field is decremented every second, and is deleted when it reaches 0. ; It is refreshed every time a packet is received. @@ -110,39 +110,39 @@ 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] - test ecx, ecx - jz .exit + mov ecx, [NumARP] + test ecx, ecx + jz .exit - mov esi, ARP_table + mov esi, ARP_table .loop: - cmp [esi + ARP_entry.TTL], ARP_STATIC_ENTRY - je .next + cmp [esi + ARP_entry.TTL], ARP_STATIC_ENTRY + je .next - dec [esi + ARP_entry.TTL] - jz .time_out + dec [esi + ARP_entry.TTL] + jz .time_out .next: - add esi, sizeof.ARP_entry - dec ecx - jnz .loop - jmp .exit + add esi, sizeof.ARP_entry + dec ecx + jnz .loop + jmp .exit .time_out: - cmp [esi + ARP_entry.Status], ARP_AWAITING_RESPONSE - je .response_timeout + cmp [esi + ARP_entry.Status], ARP_AWAITING_RESPONSE + je .response_timeout - push esi ecx - call ARP_del_entry - pop ecx esi + push esi ecx + call ARP_del_entry + pop ecx esi - jmp .next + jmp .next .response_timeout: - mov [esi + ARP_entry.Status], ARP_RESPONSE_TIMEOUT - mov [esi + ARP_entry.TTL], 10 + mov [esi + ARP_entry.Status], ARP_RESPONSE_TIMEOUT + mov [esi + ARP_entry.TTL], 10 - jmp .next + jmp .next .exit: @@ -162,117 +162,117 @@ local .exit align 4 ARP_input: - DEBUGF 1,"ARP_Handler - start\n" - cmp ecx, sizeof.ARP_header - jb .exit + DEBUGF 1,"ARP_Handler - start\n" + cmp ecx, sizeof.ARP_header + jb .exit ;--------------------- ; Handle Reply packets - cmp [edx + ARP_header.Opcode], ARP_REP_OPCODE - jne .maybe_request + cmp [edx + ARP_header.Opcode], ARP_REP_OPCODE + jne .maybe_request - DEBUGF 1,"ARP_Handler - it's a reply packet from %u.%u.%u.%u\n",\ - [edx + ARP_header.SenderIP]:1, [edx + ARP_header.SenderIP+1]:1, [edx + ARP_header.SenderIP+2]:1, [edx + ARP_header.SenderIP+3]:1 + DEBUGF 1,"ARP_Handler - it's a reply packet from %u.%u.%u.%u\n",\ + [edx + ARP_header.SenderIP]:1, [edx + ARP_header.SenderIP+1]:1, [edx + ARP_header.SenderIP+2]:1, [edx + ARP_header.SenderIP+3]:1 - mov ecx, [NumARP] - test ecx, ecx - jz .exit + mov ecx, [NumARP] + test ecx, ecx + jz .exit - mov eax, [edx + ARP_header.SenderIP] - mov esi, ARP_table + mov eax, [edx + ARP_header.SenderIP] + mov esi, ARP_table .loop: - cmp [esi + ARP_entry.IP], eax - je .gotit - add esi, sizeof.ARP_entry - dec ecx - jnz .loop + cmp [esi + ARP_entry.IP], eax + je .gotit + add esi, sizeof.ARP_entry + dec ecx + jnz .loop - jmp .exit + jmp .exit .gotit: - DEBUGF 1,"ARP_Handler - found matching entry\n" + DEBUGF 1,"ARP_Handler - found matching entry\n" - cmp [esi + ARP_entry.TTL], ARP_STATIC_ENTRY ; if it is a static entry, dont touch it - je .exit + cmp [esi + ARP_entry.TTL], ARP_STATIC_ENTRY ; if it is a static entry, dont touch it + je .exit - DEBUGF 1,"ARP_Handler - updating entry\n" + DEBUGF 1,"ARP_Handler - updating entry\n" - mov [esi + ARP_entry.Status], ARP_VALID_MAPPING - mov [esi + ARP_entry.TTL], ARP_ENTRY_TTL + mov [esi + ARP_entry.Status], ARP_VALID_MAPPING + mov [esi + ARP_entry.TTL], ARP_ENTRY_TTL - mov eax, dword [edx + ARP_header.SenderMAC] - mov dword [esi+ARP_entry.MAC], eax - mov ax , word [edx + ARP_header.SenderMAC + 4] - mov word [esi+ARP_entry.MAC+4], ax + mov eax, dword [edx + ARP_header.SenderMAC] + mov dword [esi+ARP_entry.MAC], eax + mov ax , word [edx + ARP_header.SenderMAC + 4] + mov word [esi+ARP_entry.MAC+4], ax - jmp .exit + jmp .exit ;----------------------- ; Handle Request packets .maybe_request: - cmp [edx + ARP_header.Opcode], ARP_REQ_OPCODE - jne .exit + cmp [edx + ARP_header.Opcode], ARP_REQ_OPCODE + jne .exit - call NET_ptr_to_num - cmp edi, -1 - jz .exit - DEBUGF 1,"ARP Request packet through device: %u\n", edi - inc [ARP_PACKETS_RX+4*edi] + call NET_ptr_to_num + cmp edi, -1 + jz .exit + DEBUGF 1,"ARP Request packet through device: %u\n", edi + inc [ARP_PACKETS_RX+4*edi] - mov eax, [IP_LIST+4*edi] - cmp eax, [edx + ARP_header.TargetIP] ; Is it looking for my IP address? - jne .exit ; TODO: instead of quitting, update local entrys with matching IP's ? + mov eax, [IP_LIST+4*edi] + cmp eax, [edx + ARP_header.TargetIP] ; Is it looking for my IP address? + jne .exit ; TODO: instead of quitting, update local entrys with matching IP's ? - push eax - push edi + push eax + push edi ; OK, it is a request for one of our MAC addresses. ; Build the frame and send it. We can reuse the buffer. (faster then using ARP_create_packet) - lea esi, [edx + ARP_header.SenderMAC] - lea edi, [edx + ARP_header.TargetMAC] - movsd ; Move Sender Mac to Dest MAC - movsw ; - movsd ; Move sender IP to Dest IP + lea esi, [edx + ARP_header.SenderMAC] + lea edi, [edx + ARP_header.TargetMAC] + movsd ; Move Sender Mac to Dest MAC + movsw ; + movsd ; Move sender IP to Dest IP - pop esi - mov esi, [NET_DRV_LIST + 4*esi] - lea esi, [esi + ETH_DEVICE.mac] - lea edi, [edx + ARP_header.SenderMAC] - movsd ; Copy MAC address from in MAC_LIST - movsw ; - pop eax - stosd ; Write our IP + pop esi + mov esi, [NET_DRV_LIST + 4*esi] + lea esi, [esi + ETH_DEVICE.mac] + lea edi, [edx + ARP_header.SenderMAC] + movsd ; Copy MAC address from in MAC_LIST + movsw ; + pop eax + stosd ; Write our IP - mov [edx + ARP_header.Opcode], ARP_REP_OPCODE + mov [edx + ARP_header.Opcode], ARP_REP_OPCODE ; Now, Fill in ETHERNET header - mov edi, [esp] - lea esi, [edx + ARP_header.TargetMAC] - movsd - movsw - lea esi, [edx + ARP_header.SenderMAC] - movsd - movsw + mov edi, [esp] + lea esi, [edx + ARP_header.TargetMAC] + movsd + movsw + lea esi, [edx + ARP_header.SenderMAC] + movsd + movsw ; mov ax , ETHER_ARP ; stosw - DEBUGF 1,"ARP_Handler - Sending reply \n" + DEBUGF 1,"ARP_Handler - Sending reply \n" - call [ebx + NET_DEVICE.transmit] - ret + call [ebx + NET_DEVICE.transmit] + ret .exit: - call kernel_free - add esp, 4 ; pop (balance stack) + call kernel_free + add esp, 4 ; pop (balance stack) - DEBUGF 1,"ARP_Handler - exiting\n" - ret + DEBUGF 1,"ARP_Handler - exiting\n" + ret ;--------------------------------------------------------------------------- @@ -286,54 +286,54 @@ ARP_input: align 4 ARP_output_request: - DEBUGF 1,"Create ARP Packet\n" + DEBUGF 1,"Create ARP Packet\n" - call IPv4_dest_to_dev - push eax ; DestIP - pushd [IP_LIST+edi] ; SenderIP + call IPv4_dest_to_dev + push eax ; DestIP + pushd [IP_LIST+edi] ; SenderIP - mov ebx, [NET_DRV_LIST+edi] ; device ptr + mov ebx, [NET_DRV_LIST+edi] ; device ptr - lea eax, [ebx + ETH_DEVICE.mac] ; local device mac - mov edx, ETH_BROADCAST ; broadcast mac - mov ecx, sizeof.ARP_header - mov di, ETHER_ARP - call ETH_output - jz .exit + lea eax, [ebx + ETH_DEVICE.mac] ; local device mac + mov edx, ETH_BROADCAST ; broadcast mac + mov ecx, sizeof.ARP_header + mov di, ETHER_ARP + call ETH_output + jz .exit - mov ecx, eax + 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 - mov [edi + ARP_header.ProtocolSize], 4 ; IP-addr length - mov [edi + ARP_header.Opcode], ARP_REQ_OPCODE ; Request + mov [edi + ARP_header.HardwareType], 0x0100 ; Ethernet + mov [edi + ARP_header.ProtocolType], 0x0008 ; IP + mov [edi + ARP_header.HardwareSize], 6 ; MAC-addr length + mov [edi + ARP_header.ProtocolSize], 4 ; IP-addr length + mov [edi + ARP_header.Opcode], ARP_REQ_OPCODE ; Request - add edi, ARP_header.SenderMAC + add edi, ARP_header.SenderMAC - lea esi, [ebx + ETH_DEVICE.mac] ; SenderMac - movsw ; - movsd ; - pop eax ; SenderIP - stosd ; + lea esi, [ebx + ETH_DEVICE.mac] ; SenderMac + movsw ; + movsd ; + pop eax ; SenderIP + stosd ; - mov eax, -1 ; DestMac - stosd ; - stosw ; - pop eax ; DestIP - stosd ; + mov eax, -1 ; DestMac + stosd ; + stosw ; + pop eax ; DestIP + stosd ; - DEBUGF 1,"ARP Packet for device %x created successfully\n", ebx + DEBUGF 1,"ARP Packet for device %x created successfully\n", ebx - push edx ecx - call [ebx + NET_DEVICE.transmit] - ret + push edx ecx + call [ebx + NET_DEVICE.transmit] + ret .exit: - add esp, 4+4 - DEBUGF 1,"Create ARP Packet - failed\n" - sub eax, eax - ret + add esp, 4+4 + DEBUGF 1,"Create ARP Packet - failed\n" + sub eax, eax + ret ;----------------------------------------------------------------- @@ -347,59 +347,59 @@ ARP_output_request: align 4 ARP_add_entry: - DEBUGF 1,"ARP add entry: " + DEBUGF 1,"ARP add entry: " - mov ecx, [NumARP] - test ecx, ecx ; first entry? - jz .add - cmp ecx, ARP_TABLE_SIZE ; list full ? - jae .error + mov ecx, [NumARP] + test ecx, ecx ; first entry? + jz .add + cmp ecx, ARP_TABLE_SIZE ; list full ? + jae .error - mov eax, dword [esi + ARP_entry.MAC] - mov bx , word [esi + ARP_entry.MAC + 4] - mov edi, ARP_table + mov eax, dword [esi + ARP_entry.MAC] + mov bx , word [esi + ARP_entry.MAC + 4] + mov edi, ARP_table .loop: - cmp dword [edi + ARP_entry.MAC], eax ; Check for duplicate MAC's - jne .maybe_next ; - cmp word [edi + ARP_entry.MAC + 4], bx ; - jne .maybe_next ; + cmp dword [edi + ARP_entry.MAC], eax ; Check for duplicate MAC's + jne .maybe_next ; + cmp word [edi + ARP_entry.MAC + 4], bx ; + jne .maybe_next ; - cmp [edi + ARP_entry.TTL], ARP_STATIC_ENTRY - jne .notstatic - cmp [esi + ARP_entry.TTL], ARP_STATIC_ENTRY - jne .error + cmp [edi + ARP_entry.TTL], ARP_STATIC_ENTRY + jne .notstatic + cmp [esi + ARP_entry.TTL], ARP_STATIC_ENTRY + jne .error .notstatic: - neg ecx - add ecx, [NumARP] - jmp .add + neg ecx + add ecx, [NumARP] + jmp .add .maybe_next: - add esi, sizeof.ARP_entry - loop .loop + add esi, sizeof.ARP_entry + loop .loop - mov ecx, [NumARP] + mov ecx, [NumARP] .add: - push ecx - imul ecx, sizeof.ARP_entry - lea edi, [ecx + ARP_table] - mov ecx, sizeof.ARP_entry/2 - rep movsw + push ecx + imul ecx, sizeof.ARP_entry + lea edi, [ecx + ARP_table] + mov ecx, sizeof.ARP_entry/2 + rep movsw - lea esi, [edi - sizeof.ARP_entry] - inc [NumARP] - pop eax - DEBUGF 1,"New entry created: %u\n", eax + lea esi, [edi - sizeof.ARP_entry] + inc [NumARP] + pop eax + DEBUGF 1,"New entry created: %u\n", eax .exit: - DEBUGF 1,"Exiting\n" - ret + DEBUGF 1,"Exiting\n" + ret .error: - DEBUGF 1,"error! \n" - mov eax, -1 - ret + DEBUGF 1,"error! \n" + mov eax, -1 + ret ;----------------------------------------------------------------- @@ -413,20 +413,20 @@ ARP_add_entry: align 4 ARP_del_entry: - DEBUGF 1,"ARP del entry %x, total entrys: %u\n", esi, [NumARP] + DEBUGF 1,"ARP del entry %x, total entrys: %u\n", esi, [NumARP] - mov ecx, ARP_table + (ARP_TABLE_SIZE - 1) * sizeof.ARP_entry - sub ecx, esi - shr ecx, 1 + mov ecx, ARP_table + (ARP_TABLE_SIZE - 1) * sizeof.ARP_entry + sub ecx, esi + shr ecx, 1 - mov edi, esi - lea esi, [edi + sizeof.ARP_entry] - rep movsw + mov edi, esi + lea esi, [edi + sizeof.ARP_entry] + rep movsw - dec [NumARP] - DEBUGF 1,"ARP entry deleted\n" + dec [NumARP] + DEBUGF 1,"ARP entry deleted\n" - ret + ret @@ -447,110 +447,110 @@ ARP_del_entry: align 4 ARP_IP_to_MAC: - DEBUGF 1,"ARP_IP_to_MAC\n" + DEBUGF 1,"ARP_IP_to_MAC\n" - cmp eax, 0xffffffff - je .broadcast + cmp eax, 0xffffffff + je .broadcast ; if ((Remote IP & subnet_mask) == (local IP & subnet_mask )) ; destination is on same subnet ; else, destination is remote and must use a gateway - call IPv4_dest_to_dev - mov ebx, [IP_LIST + edi] - and ebx, [SUBNET_LIST + edi] + call IPv4_dest_to_dev + mov ebx, [IP_LIST + edi] + and ebx, [SUBNET_LIST + edi] - mov ecx, eax - and ecx, [SUBNET_LIST + edi] + mov ecx, eax + and ecx, [SUBNET_LIST + edi] - cmp ecx, ebx - je .local + cmp ecx, ebx + je .local - mov eax, [GATEWAY_LIST + edi] - DEBUGF 1,"requested IP is not on subnet, using default gateway\n" + mov eax, [GATEWAY_LIST + edi] + DEBUGF 1,"requested IP is not on subnet, using default gateway\n" ;-------------------------------- ; Try to find the IP in ARP_table .local: - mov ecx, [NumARP] - test ecx, ecx - jz .not_in_list - mov esi, ARP_table + ARP_entry.IP + mov ecx, [NumARP] + test ecx, ecx + jz .not_in_list + mov esi, ARP_table + ARP_entry.IP .scan_loop: - cmp [esi], eax - je .found_it - add esi, sizeof.ARP_entry - loop .scan_loop + cmp [esi], eax + je .found_it + add esi, sizeof.ARP_entry + loop .scan_loop .not_in_list: - DEBUGF 1,"IP not found on list, preparing for ARP request\n" + DEBUGF 1,"IP not found on list, preparing for ARP request\n" ;-------------------- ; Send an ARP request - push eax + push eax - pushw ARP_REQUEST_TTL - pushw ARP_AWAITING_RESPONSE - pushd 0 - pushw 0 - pushd eax - mov esi, esp - call ARP_add_entry - add esp, sizeof.ARP_entry + pushw ARP_REQUEST_TTL + pushw ARP_AWAITING_RESPONSE + pushd 0 + pushw 0 + pushd eax + mov esi, esp + call ARP_add_entry + add esp, sizeof.ARP_entry - cmp eax, -1 - je .full + cmp eax, -1 + je .full - mov ecx, eax - pop eax - push ecx - call ARP_output_request + mov ecx, eax + pop eax + push ecx + call ARP_output_request ;; TODO: check if driver could transmit packet - pop esi - imul esi, sizeof.ARP_entry - add esi, ARP_table + pop esi + imul esi, sizeof.ARP_entry + add esi, ARP_table - mov ecx, 25 + mov ecx, 25 .wait_loop: - cmp [esi + ARP_entry.Status], 1 - je .got_it - push esi - mov esi, 10 - call delay_ms - pop esi - loop .wait_loop + cmp [esi + ARP_entry.Status], 1 + je .got_it + push esi + mov esi, 10 + call delay_ms + pop esi + loop .wait_loop - mov eax, -2 ; request send - ret + mov eax, -2 ; request send + ret .found_it: - DEBUGF 1,"found IP in ARPTable\n" - cmp [esi + ARP_entry.Status], 1 - jne .invalid + DEBUGF 1,"found IP in ARPTable\n" + cmp [esi + ARP_entry.Status], 1 + jne .invalid .got_it: - movzx eax, word [esi + ARP_entry.MAC] - mov ebx, dword[esi + ARP_entry.MAC+2] - ret + movzx eax, word [esi + ARP_entry.MAC] + mov ebx, dword[esi + ARP_entry.MAC+2] + ret .invalid: - mov eax, -1 - ret + mov eax, -1 + ret .full: - DEBUGF 1,"ARP table is full!\n" - pop eax - mov eax, -1 - ret + DEBUGF 1,"ARP table is full!\n" + pop eax + mov eax, -1 + ret .broadcast: - mov eax, 0x0000ffff - mov ebx, 0xffffffff - ret + mov eax, 0x0000ffff + mov ebx, 0xffffffff + ret ;----------------------------------------------------------------- @@ -569,66 +569,66 @@ ARP_IP_to_MAC: align 4 ARP_API: - movzx eax, bh - shl eax, 2 + movzx eax, bh + shl eax, 2 - test bl, bl - jz .packets_tx ; 0 - dec bl - jz .packets_rx ; 1 - dec bl - jz .entries ; 2 - dec bl - jz .read ; 3 - dec bl - jz .write ; 4 - dec bl - jz .remove ; 5 - dec bl + test bl, bl + jz .packets_tx ; 0 + dec bl + jz .packets_rx ; 1 + dec bl + jz .entries ; 2 + dec bl + jz .read ; 3 + dec bl + jz .write ; 4 + dec bl + jz .remove ; 5 + dec bl .error: - mov eax, -1 - ret + mov eax, -1 + ret .packets_tx: - add eax, ARP_PACKETS_TX - mov eax, [eax] - ret + add eax, ARP_PACKETS_TX + mov eax, [eax] + ret .packets_rx: - add eax, ARP_PACKETS_RX - mov eax, [eax] - ret + add eax, ARP_PACKETS_RX + mov eax, [eax] + ret .entries: - mov eax, [NumARP] - ret + mov eax, [NumARP] + ret .read: - cmp ecx, [NumARP] - jae .error - ; edi = pointer to buffer - ; ecx = # entry - imul ecx, sizeof.ARP_entry - add ecx, ARP_table - mov esi, ecx - mov ecx, sizeof.ARP_entry/2 - rep movsw + cmp ecx, [NumARP] + jae .error + ; edi = pointer to buffer + ; ecx = # entry + imul ecx, sizeof.ARP_entry + add ecx, ARP_table + mov esi, ecx + mov ecx, sizeof.ARP_entry/2 + rep movsw - xor eax, eax - ret + xor eax, eax + ret .write: - ; esi = pointer to buffer - call ARP_add_entry ;out: eax = entry number, -1 on error - ret + ; esi = pointer to buffer + call ARP_add_entry ;out: eax = entry number, -1 on error + ret .remove: - ; ecx = # entry - cmp ecx, [NumARP] - jae .error - imul ecx, sizeof.ARP_entry - lea esi, [ARP_table + ecx] - call ARP_del_entry - ret + ; ecx = # entry + cmp ecx, [NumARP] + jae .error + imul ecx, sizeof.ARP_entry + lea esi, [ARP_table + ecx] + call ARP_del_entry + ret diff --git a/kernel/branches/net/network/ethernet.inc b/kernel/branches/net/network/ethernet.inc index f275349610..6501e788ba 100644 --- a/kernel/branches/net/network/ethernet.inc +++ b/kernel/branches/net/network/ethernet.inc @@ -16,33 +16,33 @@ $Revision$ -struct ETH_header +struct ETH_header - DstMAC dp ? ; destination MAC-address - SrcMAC dp ? ; source MAC-address - Type dw ? ; type of the upper-layer protocol + DstMAC dp ? ; destination MAC-address + SrcMAC dp ? ; source MAC-address + Type dw ? ; type of the upper-layer protocol ends -ETH_FRAME_MINIMUM equ 60 +ETH_FRAME_MINIMUM equ 60 -struct ETH_DEVICE NET_DEVICE +struct ETH_DEVICE NET_DEVICE - set_mode dd ? - get_mode dd ? + set_mode dd ? + get_mode dd ? - set_MAC dd ? - get_MAC dd ? + set_MAC dd ? + get_MAC dd ? - mode dd ? - mac dp ? + mode dd ? + mac dp ? ends align 4 iglobal - ETH_BROADCAST dp 0xffffffffffff + ETH_BROADCAST dp 0xffffffffffff endg ;----------------------------------------------------------------- @@ -60,33 +60,33 @@ endg ;----------------------------------------------------------------- align 4 ETH_input: - mov eax, [esp] - mov ecx, [esp+4] + mov eax, [esp] + mov ecx, [esp+4] - DEBUGF 1,"ETH_input - size: %u\n", ecx - cmp ecx, ETH_FRAME_MINIMUM - jb .dump - sub ecx, sizeof.ETH_header + DEBUGF 1,"ETH_input - size: %u\n", ecx + cmp ecx, ETH_FRAME_MINIMUM + jb .dump + sub ecx, sizeof.ETH_header - lea edx, [eax + sizeof.ETH_header] - mov ax , [eax + ETH_header.Type] + lea edx, [eax + sizeof.ETH_header] + mov ax , [eax + ETH_header.Type] - cmp ax, ETHER_IPv4 - je IPv4_input + cmp ax, ETHER_IPv4 + je IPv4_input - cmp ax, ETHER_ARP - je ARP_input + cmp ax, ETHER_ARP + je ARP_input ; cmp ax, ETHER_PPP_DISCOVERY ; je PPPOE_discovery - DEBUGF 2,"Unknown ethernet packet type %x\n", ax + DEBUGF 2,"Unknown ethernet packet type %x\n", ax .dump: - DEBUGF 2,"ETH_input - dumping\n" - call kernel_free - add esp, 4 - ret + DEBUGF 2,"ETH_input - dumping\n" + call kernel_free + add esp, 4 + ret ;----------------------------------------------------------------- ; @@ -108,60 +108,53 @@ ETH_input: align 4 ETH_output: - DEBUGF 1,"ETH_output: size=%u device:%x\n", ecx, ebx + DEBUGF 1,"ETH_output: size=%u device:%x\n", ecx, ebx - cmp ecx, [ebx + NET_DEVICE.mtu] - ja .exit + cmp ecx, [ebx + NET_DEVICE.mtu] + ja .exit - push ecx ; << 1 - push di eax edx ; << 2 - add ecx, sizeof.ETH_header + push ecx + push di eax edx - push ecx ; << 3 + add ecx, sizeof.ETH_header + stdcall kernel_alloc, ecx + test eax, eax + jz .out_of_ram + mov edi, eax - push ecx ; << 4 - call kernel_alloc ; >> 4 - test eax, eax - jz .out_of_ram - mov edi, eax + pop esi + movsd + movsw + pop esi + movsd + movsw + pop ax + stosw - pop ecx ; >> 3 + lea eax, [edi - sizeof.ETH_header] ; Set eax to buffer start + pop ecx + lea edx, [ecx + sizeof.ETH_header] ; Set edx to complete buffer size - pop esi ; >> 2 - movsd - movsw - pop esi ; >> 2 - movsd - movsw - pop ax ; >> 2 - stosw - - lea eax, [edi - sizeof.ETH_header] ; Set eax to buffer start - mov edx, ecx ; Set edx to complete buffer size - - pop ecx ; >> 1 - - cmp edx, ETH_FRAME_MINIMUM - jb .adjust_size - DEBUGF 1,"ETH_output: done: %x total size: %u\n", eax, edx - ret + cmp edx, ETH_FRAME_MINIMUM + jb .adjust_size + DEBUGF 1,"ETH_output: done: %x total size: %u\n", eax, edx + ret .adjust_size: - mov edx, ETH_FRAME_MINIMUM - test edx, edx ; clear zero flag - ret + mov edx, ETH_FRAME_MINIMUM + test edx, edx ; clear zero flag + ret .out_of_ram: - DEBUGF 2,"ETH_output: Out of ram space!!\n" - add esp, 3*4+2+4 - sub edi, edi - ret + DEBUGF 2,"ETH_output: Out of ram space!!\n" + add esp, 4+4+2+4 + sub edi, edi + ret .exit: - DEBUGF 2,"ETH_output: Packet too large!\n" - sub edi, edi -;;; dec edi - ret + DEBUGF 2,"ETH_output: Packet too large!\n" + sub edi, edi + ret @@ -181,64 +174,64 @@ ETH_output: align 4 ETH_API: - cmp bh, MAX_NET_DEVICES - ja .error - movzx eax, bh - shl eax, 2 + cmp bh, MAX_NET_DEVICES + ja .error + movzx eax, bh + shl eax, 2 - mov eax, dword [NET_DRV_LIST + eax] - cmp [eax + NET_DEVICE.type], NET_TYPE_ETH - jne .error + mov eax, dword [NET_DRV_LIST + eax] + cmp [eax + NET_DEVICE.type], NET_TYPE_ETH + jne .error - test bl, bl - jz .packets_tx ; 0 - dec bl - jz .packets_rx ; 1 - dec bl - jz .bytes_tx ; 2 - dec bl - jz .bytes_rx ; 3 - dec bl - jz .read_mac ; 4 - dec bl - jz .write_mac ; 5 + test bl, bl + jz .packets_tx ; 0 + dec bl + jz .packets_rx ; 1 + dec bl + jz .bytes_tx ; 2 + dec bl + jz .bytes_rx ; 3 + dec bl + jz .read_mac ; 4 + dec bl + jz .write_mac ; 5 .error: - DEBUGF 2,"Device is not ethernet type\n" - or eax, -1 - ret + DEBUGF 2,"Device is not ethernet type\n" + or eax, -1 + ret .packets_tx: - mov eax, [eax + NET_DEVICE.packets_tx] + mov eax, [eax + NET_DEVICE.packets_tx] - ret + ret .packets_rx: - mov eax, [eax + NET_DEVICE.packets_rx] - ret + 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 + 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 + 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] - mov eax, dword [eax + ETH_DEVICE.mac + 2] - mov [esp+20+4], ebx ; TODO: fix this ugly code - ret + movzx ebx, word [eax + ETH_DEVICE.mac] + mov eax, dword [eax + ETH_DEVICE.mac + 2] + mov [esp+20+4], ebx ; TODO: fix this ugly code + ret .write_mac: - push ecx - push dx - call [eax + ETH_DEVICE.set_MAC] - ret + push ecx + push dx + call [eax + ETH_DEVICE.set_MAC] + ret diff --git a/kernel/branches/net/network/icmp.inc b/kernel/branches/net/network/icmp.inc index 003d01c531..6bfdeadbd3 100644 --- a/kernel/branches/net/network/icmp.inc +++ b/kernel/branches/net/network/icmp.inc @@ -89,19 +89,19 @@ ICMP_PHOTURIS_DECRYPT_FAILED equ 3 ; decrypt failed struct ICMP_header - Type db ? - Code db ? - Checksum dw ? - Identifier dw ? - SequenceNumber dw ? + Type db ? + Code db ? + Checksum dw ? + Identifier dw ? + SequenceNumber dw ? ends align 4 uglobal - ICMP_PACKETS_TX rd MAX_IP - ICMP_PACKETS_RX rd MAX_IP + ICMP_PACKETS_TX rd MAX_IP + ICMP_PACKETS_RX rd MAX_IP endg diff --git a/kernel/branches/net/network/socket.inc b/kernel/branches/net/network/socket.inc index 1d85927035..6b266f038f 100644 --- a/kernel/branches/net/network/socket.inc +++ b/kernel/branches/net/network/socket.inc @@ -138,7 +138,7 @@ struct UDP_SOCKET IP_SOCKET ends -struct ICMP_SOCKET +struct ICMP_SOCKET IP_SOCKET Identifier dw ? @@ -146,11 +146,13 @@ ends struct RING_BUFFER + start_ptr dd ? ; Pointer to start of buffer end_ptr dd ? ; pointer to end of buffer read_ptr dd ? ; Read pointer write_ptr dd ? ; Write pointer size dd ? ; Number of bytes buffered + ends struct STREAM_SOCKET TCP_SOCKET @@ -320,7 +322,6 @@ align 4 mov [eax + SOCKET.snd_proc], SOCKET_send_tcp mov [eax + SOCKET.rcv_proc], SOCKET_receive_tcp - mov [eax + TCP_SOCKET.t_maxseg], 1480 ;;;;; FIXME ret diff --git a/kernel/branches/net/network/udp.inc b/kernel/branches/net/network/udp.inc index d9d3478f3a..ed7dc5ca22 100644 --- a/kernel/branches/net/network/udp.inc +++ b/kernel/branches/net/network/udp.inc @@ -172,7 +172,7 @@ UDP_input: @@: cmp [eax + UDP_SOCKET.firstpacket], 0 - jz .updateport + je .updateport cmp [eax + UDP_SOCKET.RemotePort], cx jne .dump @@ -197,9 +197,8 @@ UDP_input: call wait_mutex pop ebx - mov si, [edx + UDP_header.SourcePort] - DEBUGF 1,"Changing remote port to: %u\n", si - mov [eax + UDP_SOCKET.RemotePort], si + DEBUGF 1,"Changing remote port to: %u\n", cx + mov [eax + UDP_SOCKET.RemotePort], cx inc [eax + UDP_SOCKET.firstpacket] jmp .updatesock @@ -323,11 +322,9 @@ UDP_API: ret .packets_tx: - add eax, UDP_PACKETS_TX - mov eax, [eax] + mov eax, [UDP_PACKETS_TX + eax] ret .packets_rx: - add eax, UDP_PACKETS_RX - mov eax, [eax] + mov eax, [UDP_PACKETS_RX + eax] ret