forked from KolibriOS/kolibrios
Added some experimental IPv6 code to net branch.
git-svn-id: svn://kolibrios.org@3185 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
81ba3134e6
commit
382dde4fed
@ -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
|
||||
|
||||
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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user