[OpenBIOS] r579 - ofw/inetv6
svn at openbios.org
svn at openbios.org
Tue Aug 28 00:44:27 CEST 2007
Author: lwalter
Date: 2007-08-28 00:44:27 +0200 (Tue, 28 Aug 2007)
New Revision: 579
Modified:
ofw/inetv6/dhcpv6.fth
ofw/inetv6/ipv6.fth
ofw/inetv6/udpv6.fth
Log:
Get DNS ipv6 address from stateless DHCPv6 server if the router does not provide the info
Modified: ofw/inetv6/dhcpv6.fth
===================================================================
--- ofw/inetv6/dhcpv6.fth 2007-08-24 00:08:52 UTC (rev 578)
+++ ofw/inetv6/dhcpv6.fth 2007-08-27 22:44:27 UTC (rev 579)
@@ -36,7 +36,7 @@
0 sfield do6-data \ Option data
constant /do6-hdr
-d# 1024 constant /dhcpv6-packet
+d# 1024 constant max-dhcpv6-packet
\ do6-code values
\ 1 client ID
@@ -55,14 +55,22 @@
d# 256 buffer: 'root-path
d# 256 buffer: 'client-name
d# 256 buffer: 'vendor-options
+
headers
' 'client-name " client-name" chosen-string
' 'vendor-options " vendor-options" chosen-string
' 'root-path " root-path" chosen-string
: domain-name ( -- adr len ) 'domain-name cscount ;
+
+headerless
+instance variable xid
[then]
-0 instance value dhcpv6-packet
+headers
+
+0 instance value dhcp-pref \ DHCPv6 server preference
+0 instance value dhcpv6-packet \ DHCPv6 packet to send
+0 instance value dhcpv6-reply \ DHCPv6 packet received
0 instance value dhcpv6-len \ Actual length of received DHCPv6 packet
0 instance value dhcpv6-option \ Pointer to option field in dhcpv6-packet
@@ -75,15 +83,13 @@
: op$! ( $ -- ) tuck dhcpv6-option swap move +dhcpv6-option ;
: allocate-dhcpv6 ( size -- )
- allocate-udp dup is dhcpv6-packet set-struct
+ allocate-udpv6 dup is dhcpv6-packet set-struct
set-dhcpv6-option
- get-msecs start-time !
-
\ Set "random" transaction ID and random number generator seed
my-en-addr 2 + xl@ get-msecs xor dup xid ! rn !
;
-: free-dhcpv6 ( size -- ) dhcpv6-packet swap free-udp ;
+: free-dhcpv6 ( size -- ) dhcpv6-packet swap free-udpv6 ;
: init-dhcpv6 ( -- )
[ifndef] include-ipv4
@@ -101,23 +107,53 @@
;
previous definitions
-: send-dhcpv6-packet ( size op -- )
- dh6-op c!
- xid dh6-xid!
- dhcpv6-packet swap client-port dhcpv6-port send-udpv6-packet
+: .dhcpv6-err ( status -- )
+ ?dup 0= if exit then
+ ." DHCPv6: "
+ case
+ 1 of ." unspecified failure" endof
+ 2 of ." no address available" endof
+ 3 of ." no binding" endof
+ 4 of ." not on-link" endof
+ 5 of ." use multicast" endof
+ ( otherwise ) ." unknown error: " dup u.
+ endcase
+ cr
;
-: detect-dhcpv6-packet ( op -- timeout? )
+: process-dhcpv6-options ( adr len -- error? )
+ begin dup 0> while
+ over be-w@ case \ Option code
+ 7 of over 4 + c@ to dhcp-pref endof \ Preference
+ d# 13 of over 4 + be-w@ dup .dhcpv6-err \ Reply status
+ if 2drop true exit then endof
+ d# 25 of over 4 + name-server-ipv6 copy-ipv6-addr endof \ RDNSS
+ endcase
+ over 2 + be-w@ 4 + /string \ Advance to next option
+ repeat 2drop false
+;
+
+: receive-dhcpv6-packet ( op -- timeout? )
>r
dhcpv6-timeout set-timeout
begin client-port receive-udp-packet 0= while ( adr,len src-port )
- drop to dhcpv6-len set-struct
-the-struct dhcpv6-len dump cr
- dh6-xid@ xid @ h# ff.ffff = dh6-op c@ r@ = and if r> drop false exit then
+ drop to dhcpv6-len dup set-struct to dhcpv6-reply
+ dh6-xid@ xid @ h# ff.ffff and = dh6-op c@ r@ = and if r> drop false exit then
repeat
r> drop true
;
+: detect-dhcpv6-packet ( op -- error? )
+ receive-dhcpv6-packet ?dup if exit then
+ dh6-options dhcpv6-len /dhcpv6-hdr - process-dhcpv6-options
+;
+
+: send-dhcpv6-packet ( size op -- )
+ dh6-op c!
+ xid @ dh6-xid!
+ dhcpv6-packet swap client-port dhcpv6-port send-udpv6-packet
+;
+
: option-client-id ( -- )
1 opw! \ Client ID option
/e 4 + opw! \ Option len
@@ -151,16 +187,14 @@
;
: do-dhcpv6-stateless ( -- )
- ." DHCPv6 stateless auto configuration not supported yet" cr exit
-
bootnet-debug if
- ." DHCPv6 protocol: Getting network information" cr
+ ." DHCPv6 protocol: Information Request" cr
then
- /dhcpv6-packet allocate-dhcpv6
+ max-dhcpv6-packet allocate-dhcpv6
- ['] dhcpv6-req-info catch drop
+ ['] dhcpv6-req-info catch if indent ." Timeout waiting for requested info" cr then
- /dhcpv6-packet free-dhcpv6
+ max-dhcpv6-packet free-dhcpv6
;
: do-dhcpv6-stateful ( -- )
Modified: ofw/inetv6/ipv6.fth
===================================================================
--- ofw/inetv6/ipv6.fth 2007-08-24 00:08:52 UTC (rev 578)
+++ ofw/inetv6/ipv6.fth 2007-08-27 22:44:27 UTC (rev 579)
@@ -78,7 +78,6 @@
/ipv6 buffer: my-ipv6-addr-global
/ipv6 buffer: router-ipv6-addr
/ipv6 buffer: name-server-ipv6
-/ipv6 buffer: dhcp-ipv6-addr
headerless
@@ -107,6 +106,7 @@
>r
r@ his-ipv6-addr-mc-sol-node ipv6= \ His solicited node address?
r@ ipv6-addr-mc-all-nodes ipv6= or \ Multicast all-nodes?
+ r@ ipv6-addr-mc-all-dhcp ipv6= or \ Multicast all-dhcp?
r> ipv6-addr-mc-all-routers ipv6= or \ Multicast all-routers?
;
: my-ipv6-addr-mc? ( adr-buf -- flag )
Modified: ofw/inetv6/udpv6.fth
===================================================================
--- ofw/inetv6/udpv6.fth 2007-08-24 00:08:52 UTC (rev 578)
+++ ofw/inetv6/udpv6.fth 2007-08-27 22:44:27 UTC (rev 579)
@@ -29,18 +29,18 @@
/udpv6-pseudo-hdr instance buffer: udpv6-pseudo-hdr
\ Assumes the-struct is the UDP packet.
-: fill-udpv6-pseudo-hdr ( -- )
+: fill-udpv6-pseudo-hdr ( his-ipv6 my-ipv6 -- )
/ipv6-header negate +struct
udpv6-pseudo-hdr ( udp-pseudo-addr )
- my-ipv6-addr over udpv6-src-addr copy-ipv6-addr ( udp-pseudo-addr )
- his-ipv6-addr over udpv6-dst-addr copy-ipv6-addr ( udp-pseudo-addr )
+ tuck ( my-ipv6-addr ) udpv6-src-addr copy-ipv6-addr ( udp-pseudo-addr )
+ tuck ( his-ipv6-addr ) udpv6-dst-addr copy-ipv6-addr ( udp-pseudo-addr )
IP_HDR_UDP over udpv6-protocol-id xl! ( udp-pseudo-addr )
/ipv6-header +struct ( udp-pseudo-addr )
udp-length xw@ swap udpv6-len-copy xl! ( )
;
\ Assumes the-struct is the UDP packet.
-: calc-udpv6-checksum ( -- checksum )
+: calc-udpv6-checksum ( his-ipv6 my-ipv6 -- checksum )
fill-udpv6-pseudo-hdr
0 udpv6-pseudo-hdr /udpv6-pseudo-hdr (oc-checksum) ( cksum )
0 udp-checksum xw!
@@ -54,7 +54,8 @@
/udp-header + dup udp-length xw! ( udp-len )
0 udp-checksum xw! ( udp-len )
- calc-udpv6-checksum udp-checksum xw! ( udp-len )
+ his-ipv6-addr my-ipv6-addr calc-udpv6-checksum udp-checksum xw!
+ ( udp-len )
the-struct swap IP_HDR_UDP send-ipv6-packet ( )
;
@@ -76,10 +77,15 @@
;
headerless
+\ XXX Assume no extra IPv6 headers
: bad-udpv6-checksum? ( -- bad? )
- udp-checksum xw@ dup if ( checksum )
- calc-udpv6-checksum <> ( bad? )
- then ( bad? )
+ udp-checksum xw@ dup if ( checksum )
+ the-struct dup >r ( checksum ) ( R: udp )
+ /ipv6-header - set-struct ( checksum ) ( R: udp )
+ ipv6-source-addr ipv6-dest-addr ( checksum his-ipv6 my-ipv6 ) ( R: udp )
+ r> set-struct ( checksum his-ipv6 my-ipv6 )
+ calc-udpv6-checksum <> ( bad? )
+ then ( bad? )
;
: lock-udpv6-address ( -- ) lock-ipv6-address ;
More information about the OpenBIOS
mailing list