From 382dde4fed531c55903c861565e61dedbd3f9338 Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Fri, 18 Jan 2013 14:32:05 +0000 Subject: [PATCH] Added some experimental IPv6 code to net branch. git-svn-id: svn://kolibrios.org@3185 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/branches/net/network/IPv6.inc | 253 ++++++++++++++++++++--- kernel/branches/net/network/ethernet.inc | 6 +- kernel/branches/net/network/stack.inc | 6 +- 3 files changed, 229 insertions(+), 36 deletions(-) diff --git a/kernel/branches/net/network/IPv6.inc b/kernel/branches/net/network/IPv6.inc index 743ba998f..1781d0375 100644 --- a/kernel/branches/net/network/IPv6.inc +++ b/kernel/branches/net/network/IPv6.inc @@ -1,6 +1,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; -;; Copyright (C) KolibriOS team 2012. All rights reserved. ;; +;; Copyright (C) KolibriOS team 2012-2013. All rights reserved. ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; ;; IPv6.INC ;; @@ -25,10 +25,41 @@ struct IPv6_header HopLimit db ? ; Decremented by every node, packet is discarded when it reaches 0 SourceAddress rd 4 ; 128-bit addresses DestinationAddress rd 4 ; + Payload rb 0 ends +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 + + .packets_tx rd MAX_NET_DEVICES + .packets_rx rd MAX_NET_DEVICES + +endg + + +;----------------------------------------------------------------- +; +; IPv6_init +; +; This function resets all IP variables +; +;----------------------------------------------------------------- +macro IPv6_init { + + xor eax, eax + mov edi, IPv6 + mov ecx, (4*4*4+2*4)MAX_IP + rep stosd + +} @@ -52,43 +83,56 @@ ends align 4 IPv6_input: - DEBUGF 1,"IPv6_input\nfrom: %x:%x:%x:%x:%x:%x:%x:%x\n",\ - [edx + IPv6_header.SourceAddress + 0]:4,[edx + IPv6_header.SourceAddress + 2]:4,\ - [edx + IPv6_header.SourceAddress + 4]:4,[edx + IPv6_header.SourceAddress + 6]:4,\ - [edx + IPv6_header.SourceAddress + 8]:4,[edx + IPv6_header.SourceAddress + 10]:4,\ - [edx + IPv6_header.SourceAddress + 12]:4,[edx + IPv6_header.SourceAddress + 14]:4 - DEBUGF 1,"to: %x:%x:%x:%x:%x:%x:%x:%x\n",\ - [edx + IPv6_header.DestinationAddress + 0]:4,[edx + IPv6_header.DestinationAddress + 2]:4,\ - [edx + IPv6_header.DestinationAddress + 4]:4,[edx + IPv6_header.DestinationAddress + 6]:4,\ - [edx + IPv6_header.DestinationAddress + 8]:4,[edx + IPv6_header.DestinationAddress + 10]:4,\ - [edx + IPv6_header.DestinationAddress + 12]:4,[edx + IPv6_header.DestinationAddress + 14]:4 + DEBUGF 1,"IPv6_input from: %x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x\n",\ + [edx + IPv6_header.SourceAddress + 0]:2,[edx + IPv6_header.SourceAddress + 1]:2,\ + [edx + IPv6_header.SourceAddress + 2]:2,[edx + IPv6_header.SourceAddress + 3]:2,\ + [edx + IPv6_header.SourceAddress + 4]:2,[edx + IPv6_header.SourceAddress + 5]:2,\ + [edx + IPv6_header.SourceAddress + 6]:2,[edx + IPv6_header.SourceAddress + 7]:2,\ + [edx + IPv6_header.SourceAddress + 8]:2,[edx + IPv6_header.SourceAddress + 9]:2,\ + [edx + IPv6_header.SourceAddress + 10]:2,[edx + IPv6_header.SourceAddress + 11]:2,\ + [edx + IPv6_header.SourceAddress + 12]:2,[edx + IPv6_header.SourceAddress + 13]:2,\ + [edx + IPv6_header.SourceAddress + 14]:2,[edx + IPv6_header.SourceAddress + 15]:2 + + DEBUGF 1,"IPv6_input to: %x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x\n",\ + [edx + IPv6_header.DestinationAddress + 0]:2,[edx + IPv6_header.DestinationAddress + 1]:2,\ + [edx + IPv6_header.DestinationAddress + 2]:2,[edx + IPv6_header.DestinationAddress + 3]:2,\ + [edx + IPv6_header.DestinationAddress + 4]:2,[edx + IPv6_header.DestinationAddress + 5]:2,\ + [edx + IPv6_header.DestinationAddress + 6]:2,[edx + IPv6_header.DestinationAddress + 7]:2,\ + [edx + IPv6_header.DestinationAddress + 8]:2,[edx + IPv6_header.DestinationAddress + 9]:2,\ + [edx + IPv6_header.DestinationAddress + 10]:2,[edx + IPv6_header.DestinationAddress + 11]:2,\ + [edx + IPv6_header.DestinationAddress + 12]:2,[edx + IPv6_header.DestinationAddress + 13]:2,\ + [edx + IPv6_header.DestinationAddress + 14]:2,[edx + IPv6_header.DestinationAddress + 15]:2 sub ecx, sizeof.IPv6_header jb .dump - movzx eax, [edx + IPv6.PayloadLength] - xchg al, ah - cmp eax, ecx + cmp cx, [edx + IPv6_header.PayloadLength] jb .dump - - ;------------------------------------------------------------------- ; No, it's just a regular IP packet, pass it to the higher protocols .handle_it: - - movzx esi, [edx + IPv6_header.VersionAndIHL] ; Calculate Header length by using IHL field - and esi, 0x0000000f ; - shl esi, 2 ; - - movzx ecx, [edx + IPv6_header.TotalLength] ; Calculate length of encapsulated Packet - xchg cl, ch ; - sub ecx, esi ; - + movzx ecx, [edx + IPv6_header.PayloadLength] lea edi, [edx + IPv6_header.SourceAddress] ; make edi ptr to source and dest IPv6 address - mov al, [edx + IPv6_header.Protocol] - add esi, edx ; make esi ptr to data + lea esi, [edx + IPv6_header.Payload] ; make esi ptr to data + mov al, [edx + IPv6_header.NextHeader] + + .scan: + cmp al, 59 ; no next + je .dump + + cmp al, 0 + je .hop_by_hop + + cmp al, 43 + je .routing + + cmp al, 44 + je .fragment + + cmp al, 60 + je .dest_opts ; cmp al, IP_PROTO_TCP ; je TCP_input @@ -96,14 +140,159 @@ IPv6_input: ; cmp al, IP_PROTO_UDP ; je UDP_input -; cmp al, IP_PROTO_ICMP -; je ICMP_input +; cmp al, 58 +; je ICMP6_input DEBUGF 2,"IPv6_input - unknown protocol: %u\n", al .dump: DEBUGF 2,"IPv6_input - dumping\n" - + call kernel_free add esp, 4 - call KernelFree - ret \ No newline at end of file + + ret + + .dump_options: + add esp, 2+4+4 + jmp .dump + + .nextheader: + pop esi + pop ecx + pop ax + jmp .scan + +;------------------------- +; Hop-by-Hop + + .hop_by_hop: + DEBUGF 2,"IPv6_input - hop by hop\n" + pushw [esi] ; 8 bit identifier for option type + movzx eax, byte[esi + 1] ; Hdr Ext Len + inc eax ; first 8 octets not counted + shl eax, 3 ; * 8 + sub ecx, eax + push ecx + add eax, esi + push eax + inc esi + inc esi + + mov al, [esi] + + cmp al, 0 + je .pad_1 + + cmp al, 1 + je .pad_n + + ; TODO: check with other known options + +; unknown option.. discard packet or not? +; check highest two bits + test al, 0xc0 ; discard packet + jnz .dump_options + + .pad_n: + movzx eax, byte[esi + 1] + DEBUGF 2,"IPv6_input - pad %u\n", eax + inc esi + inc esi + add esi, eax + sub ecx, eax + jmp .hop_by_hop + + .pad_1: + DEBUGF 2,"IPv6_input - pad 1\n" + inc esi + dec ecx + jmp .hop_by_hop + + + + .dest_opts: + DEBUGF 2,"IPv6_input - dest opts\n" + jmp .nextheader + + .routing: + DEBUGF 2,"IPv6_input - routing\n" + pushw [esi] ; 8 bit identifier for option type + movzx eax, byte[esi + 1] ; Hdr Ext Len + inc eax ; first 8 octets not counted + shl eax, 3 ; * 8 + sub ecx, eax + push ecx + add eax, esi + push eax + inc esi + inc esi + + cmp al, 0 + je .pad_1 + + cmp al, 1 + je .pad_n + + mov al, [esi] ; routing type + + jmp .nextheader + + .fragment: + DEBUGF 2,"IPv6_input - fragment\n" + + jmp .nextheader + + + + + + +;--------------------------------------------------------------------------- +; +; IPv6_API +; +; This function is called by system function 75 +; +; IN: subfunction number in bl +; device number in bh +; ecx, edx, .. depends on subfunction +; +; OUT: +; +;--------------------------------------------------------------------------- +align 4 +IPv6_api: + + movzx eax, bh + shl eax, 2 + + and ebx, 0x000000ff + cmp ebx, .number + ja .error + jmp dword [.table + 4*ebx] + + .table: + dd .packets_tx ; 0 + dd .packets_rx ; 1 +; dd .read_ip ; 2 +; dd .write_ip ; 3 +; dd .read_dns ; 4 +; dd .write_dns ; 5 +; dd .read_subnet ; 6 +; dd .write_subnet ; 7 +; dd .read_gateway ; 8 +; dd .write_gateway ; 9 + .number = ($ - .table) / 4 - 1 + + .error: + mov eax, -1 + ret + + .packets_tx: + mov eax, [IPv6.packets_tx + eax] + ret + + .packets_rx: + mov eax, [IPv6.packets_rx + eax] + ret + diff --git a/kernel/branches/net/network/ethernet.inc b/kernel/branches/net/network/ethernet.inc index 6eab9b55e..9e5ffa4e5 100644 --- a/kernel/branches/net/network/ethernet.inc +++ b/kernel/branches/net/network/ethernet.inc @@ -1,6 +1,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; -;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; +;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; ;; ETHERNET.INC ;; @@ -77,8 +77,8 @@ ETH_input: cmp ax, ETHER_ARP je ARP_input -; cmp ax, ETHER_IPv6 -; je IPv6_input + cmp ax, ETHER_IPv6 + je IPv6_input cmp ax, ETHER_PPP_DISCOVERY je PPPoE_discovery_input diff --git a/kernel/branches/net/network/stack.inc b/kernel/branches/net/network/stack.inc index 3fdc501a6..8f3a2276c 100644 --- a/kernel/branches/net/network/stack.inc +++ b/kernel/branches/net/network/stack.inc @@ -129,6 +129,7 @@ API_UDP = 3 API_TCP = 4 API_ARP = 5 API_PPPOE = 6 +API_IPv6 = 7 HWACC_TCP_IPv4 = 1 shl 0 @@ -187,7 +188,7 @@ include "PPPoE.inc" include "ARP.inc" include "IPv4.inc" -;include "IPv6.inc" +include "IPv6.inc" include "icmp.inc" include "udp.inc" @@ -729,6 +730,9 @@ sys_protocols: cmp ax, API_PPPOE je PPPoE_api + cmp ax, API_IPv6 + je IPv6_api + add esp, 4 ; if we reached here, no function was called, so we need to balance stack .doesnt_exist: