Author: lwalter Date: 2007-08-22 18:31:41 +0200 (Wed, 22 Aug 2007) New Revision: 573
Modified: ofw/inetv6/dhcpv6.fth ofw/inetv6/dnsv6.fth ofw/inetv6/ipv6.fth ofw/inetv6/neighdis.fth Log: Obtain DNS IPv6 address from router advertisement
Modified: ofw/inetv6/dhcpv6.fth =================================================================== --- ofw/inetv6/dhcpv6.fth 2007-08-22 01:05:10 UTC (rev 572) +++ ofw/inetv6/dhcpv6.fth 2007-08-22 16:31:41 UTC (rev 573) @@ -1,6 +1,56 @@ \ See license at end of file purpose: Dynamic Host Configuration Protocol for IPv6 (DHCPv6) (RFC 3315)
+d# 1000 constant dhcpv6-timeout \ 1 second timeout + +d# 546 constant client-port +d# 547 constant dhcpv6-port + +struct ( dhcpv6 packet ) + 1 sfield dh6-op \ DHCPv6 message type + 3 sfield dh6-xid \ Transaction ID + 0 sfield dh6-options \ DHCPv6 options +constant /dhcpv6-hdr + +: dh6-xid@ ( -- xid ) dh6-xid 2 + c@ dh6-xid 1+ c@ dh6-xid c@ 0 bljoin ; +: dh6-xid! ( xid -- ) lbsplit drop dh6-xid c! dh6-xid 1+ c! dh6-xid 2 + c! ; + +\ dh6-op values +\ 1 SOLICIT Used by clients to locate DHCP servers +\ 2 ADVERTISE Used by servers as response to SOLICIT +\ 3 REQUEST Used by clients to get info from servers +\ 4 CONFIRM Used by clients to verify validity of params +\ 5 RENEW Used by clients to extend lifetime +\ 6 REBIND Used by clients to extend lifetime if no reply to RENEW +\ 7 REPLY Used by servers to respond +\ 8 RELEASE Used by clients to release their IPv6 addresses +\ 9 DECLINE Used by clients to decline assigned addresses +\ 10 RECONFIGURE Used by DHCP servers to inform clients of new cfg +\ 11 INFO_REQUEST Used by clients to request additional cfg params +\ 12 RELAY_FORWARD Used by DHCP relays to forward client msgs to servers +\ 13 RELAY_REPLY Used by DHCP servers to send msgs to clients via a relay + +struct ( dhcpv6 option ) + 2 sfield do6-code \ Option code + 2 sfield do6-len \ Option len + 0 sfield do6-data \ Option data +constant /do6-hdr + +d# 1024 constant /dhcpv6-packet + +\ do6-code values +\ 1 client ID +\ 2 server ID +\ 3 ID association for nontemporary address (IA_NA) +\ 4 ID association for temporary address (IA_TA) +\ 5 IA address +\ 6 option request +\ 7 preference +\ 8 elapse time +\ 9 relay message +\ 11 authentication +\ 12 server unicast + [ifndef] include-ipv4 d# 256 buffer: 'root-path d# 256 buffer: 'client-name @@ -12,9 +62,29 @@ : domain-name ( -- adr len ) 'domain-name cscount ; [then]
-\ tubes.laptop.org -create default-name-server-ipv6 h# 20 c, 1 c, h# 48 c, h# 30 c, h# 24 c, h# 46 c, h# ff c, 0 c, 0 l, 0 w, 0 c, 1 c, +0 instance value dhcpv6-packet +0 instance value dhcpv6-len \ Actual length of received DHCPv6 packet +0 instance value dhcpv6-option \ Pointer to option field in dhcpv6-packet
+: /dhcpv6-packet ( -- len ) dhcpv6-option dhcpv6-packet - ; +: set-dhcpv6-option ( -- ) dh6-options to dhcpv6-option ; +: +dhcpv6-option ( n -- ) dhcpv6-option + to dhcpv6-option ; +: opc! ( c -- ) dhcpv6-option c! 1 +dhcpv6-option ; +: opw! ( w -- ) dhcpv6-option be-w! 2 +dhcpv6-option ; +: opl! ( l -- ) dhcpv6-option be-l! 4 +dhcpv6-option ; +: op$! ( $ -- ) tuck dhcpv6-option swap move +dhcpv6-option ; + +: allocate-dhcpv6 ( size -- ) + allocate-udp 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 ; + : init-dhcpv6 ( -- ) [ifndef] include-ipv4 0 'domain-name c! @@ -23,7 +93,6 @@ 0 'vendor-options c! \ 0 file-name-buf c! [then] - default-name-server-ipv6 name-server-ipv6 copy-ipv6-addr ;
also forth definitions @@ -32,9 +101,72 @@ ; previous definitions
-: do-dhcp ( -- ) +: send-dhcpv6-packet ( size op -- ) + dh6-op c! + xid dh6-xid! + dhcpv6-packet swap client-port dhcpv6-port send-udpv6-packet ;
+: detect-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 + repeat + r> drop true +; + +: option-client-id ( -- ) + 1 opw! \ Client ID option + /e 4 + opw! \ Option len + 3 opw! \ DUID type: link-layer address + 1 opw! \ Hardware type: ethernet + my-en-addr /e op$! \ My mac address +; + +: option-req-option ( -- ) + 6 opw! \ Option request option + 2 opw! \ Option len + d# 23 opw! \ OPTION_DNS_SERVERS +; + +: dhcpv6-solicit ( -- ) + ipv6-addr-mc-all-dhcp his-ipv6-addr copy-ipv6-addr + set-his-en-addr-mc + option-client-id + \ option-ia to which server will assign addresses + option-req-option + /dhcpv6-packet d# 11 send-dhcpv6-packet + 2 detect-dhcpv6-packet abort" Timeout soliciting DHCPv6 server" +; +: dhcpv6-req-info ( -- ) + ipv6-addr-mc-all-dhcp his-ipv6-addr copy-ipv6-addr + set-his-en-addr-mc + option-client-id + option-req-option + /dhcpv6-packet d# 11 send-dhcpv6-packet + 7 detect-dhcpv6-packet abort" Timeout waiting for requested info" +; + +: do-dhcpv6-stateless ( -- ) + ." DHCPv6 stateless auto configuration not supported yet" cr exit + + bootnet-debug if + ." DHCPv6 protocol: Getting network information" cr + then + /dhcpv6-packet allocate-dhcpv6 + + ['] dhcpv6-req-info catch drop + + /dhcpv6-packet free-dhcpv6 +; + +: do-dhcpv6-stateful ( -- ) + true abort" Stateful autoconfiguration not supported yet" +; + \ LICENSE_BEGIN \ Copyright (c) 2007 FirmWorks \
Modified: ofw/inetv6/dnsv6.fth =================================================================== --- ofw/inetv6/dnsv6.fth 2007-08-22 01:05:10 UTC (rev 572) +++ ofw/inetv6/dnsv6.fth 2007-08-22 16:31:41 UTC (rev 573) @@ -224,6 +224,8 @@ [then]
: resolvev6 ( hostname$ -- ) + name-server-ipv6 unknown-ipv6-addr? if true abort" Unknown DNS server IPv6 address" then + bootnet-debug if ( hostname$ ) ." Using IPv6 DNS to find the IPv6 address of " ( hostname$ ) 2dup type cr ( hostname$ )
Modified: ofw/inetv6/ipv6.fth =================================================================== --- ofw/inetv6/ipv6.fth 2007-08-22 01:05:10 UTC (rev 572) +++ ofw/inetv6/ipv6.fth 2007-08-22 16:31:41 UTC (rev 573) @@ -78,6 +78,7 @@ /ipv6 buffer: my-ipv6-addr-global /ipv6 buffer: router-ipv6-addr /ipv6 buffer: name-server-ipv6 +/ipv6 buffer: dhcp-ipv6-addr
headerless
@@ -86,6 +87,7 @@ create default-ipv6-addr h# fe c, h# 80 c, 0 w, 0 l, 0 w, 0 c, h# ff c, h# fe c, 0 c, 0 w, create ipv6-addr-mc-all-nodes h# ff c, 2 c, 0 w, 0 l, 0 l, 0 w, 0 c, 1 c, create ipv6-addr-mc-all-routers h# ff c, 2 c, 0 w, 0 l, 0 l, 0 w, 0 c, 2 c, +create ipv6-addr-mc-all-dhcp h# ff c, 2 c, 0 w, 0 l, 0 l, 0 c, 1 c, 0 c, 2 c, create my-ipv6-addr-mc-sol-node h# ff c, 2 c, 0 w, 0 l, 0 w, 0 c, 1 c, h# ff c, 0 c, 0 w, create his-ipv6-addr-mc-sol-node h# ff c, 2 c, 0 w, 0 l, 0 w, 0 c, 1 c, h# ff c, 0 c, 0 w,
@@ -168,10 +170,11 @@ : .my-ipv6-addr-global ( -- ) ." My IPv6 (global): " my-ipv6-addr-global .ipv6 ; -: .his-ipv6-addr ( -- ) ." His IP: " his-ipv6-addr .ipv6 ; +: .his-ipv6-addr ( -- ) ." His IPv6: " his-ipv6-addr .ipv6 ; : .my-prefix ( -- ) ." My prefix (global): " my-prefix .ipv6 ." /" /prefix .d ; +: .name-server-ipv6 ( -- ) ." DNS IPv6: " name-server-ipv6 .ipv6 ;
[ifndef] include-ipv4 0 instance value last-ip-packet
Modified: ofw/inetv6/neighdis.fth =================================================================== --- ofw/inetv6/neighdis.fth 2007-08-22 01:05:10 UTC (rev 572) +++ ofw/inetv6/neighdis.fth 2007-08-22 16:31:41 UTC (rev 573) @@ -86,6 +86,7 @@ then indent .my-link-addr cr use-routerv6? if indent .routerv6-en-addr cr then + name-server-ipv6 knownv6? if indent .name-server-ipv6 cr then then ;
@@ -98,6 +99,7 @@ ; : set-my-ipv6-addr-link-local ( -- ) \ Duplicate Address Discovery + d# 64 to /prefix unknown-ipv6-addr my-ipv6-addr copy-ipv6-addr
default-ipv6-addr my-ipv6-addr-link-local copy-ipv6-addr @@ -114,17 +116,33 @@
my-ipv6-addr-link-local my-ipv6-addr copy-ipv6-addr ; +: discover-me ( -- ) + ipv6-address " stateless" $= if + set-my-ipv6-addr-link-local + else + do-dhcpv6-stateful + then +;
+: ?discover-dns ( -- ) + ipv6-address " stateless" $= if + name-server-ipv6 unknown-ipv6-addr? if + do-dhcpv6-stateless + then + then +; + : process-rd-options ( adr len -- ) begin dup 0> while over c@ case - 1 of over 2 + routerv6-en-addr copy-en-addr endof \ Source link-layer address option - 3 of over 2 + c@ to /prefix \ Prefix option + 1 of over 2 + routerv6-en-addr copy-en-addr endof \ Source link-layer address option + 3 of over 2 + c@ to /prefix \ Prefix option over 3 + c@ to prefix-flag - over 8 + be-l@ to prefix-lifetime \ XXX lifetime - over d# 16 + my-prefix copy-ipv6-addr \ Prefix + over 8 + be-l@ to prefix-lifetime \ XXX lifetime + over d# 16 + my-prefix copy-ipv6-addr \ Prefix endof - 5 of over 4 + be-l@ to (link-mtu) endof \ MTU option + 5 of over 4 + be-l@ to (link-mtu) endof \ MTU option + d# 25 of over 8 + name-server-ipv6 copy-ipv6-addr endof \ RDNSS option endcase over 1+ c@ 8 * /string repeat 2drop @@ -173,11 +191,12 @@
['] 4drop to icmpv6-err-callback-xt ['] 2drop to icmpv6-info-callback-xt + unknown-ipv6-addr name-server-ipv6 copy-ipv6-addr
- d# 64 to /prefix - set-my-ipv6-addr-link-local - + discover-me discover-router + ?discover-dns + to use-ipv6? \ Restore IPv6 flag ;