[OpenBIOS] r534 - ofw/inetv6

svn at openbios.org svn at openbios.org
Tue Aug 14 18:05:09 CEST 2007


Author: lwalter
Date: 2007-08-14 18:05:09 +0200 (Tue, 14 Aug 2007)
New Revision: 534

Modified:
   ofw/inetv6/arp.fth
   ofw/inetv6/dhcp.fth
   ofw/inetv6/dns.fth
   ofw/inetv6/dnsv6.fth
   ofw/inetv6/ethernet.fth
   ofw/inetv6/ip.fth
   ofw/inetv6/ipv6.fth
   ofw/inetv6/neighdis.fth
   ofw/inetv6/netload.fth
Log:
Use IPv4 DNS server to get IPv6 address; Use gateway when his-ip-addr is not local

Modified: ofw/inetv6/arp.fth
===================================================================
--- ofw/inetv6/arp.fth	2007-08-10 10:36:53 UTC (rev 533)
+++ ofw/inetv6/arp.fth	2007-08-14 16:05:09 UTC (rev 534)
@@ -158,7 +158,11 @@
          broadcast-en-addr his-en-addr copy-en-addr  ( ip-type )
       else                                           ( ip-type 'ip-adr )
          his-ip-addr copy-ip-addr                    ( ip-type )
-         his-en-addr broadcast-en-addr en=  if  do-arp  then  ( ip-type )
+         his-ip-addr my-ip-addr ip-prefix=?  if
+            his-en-addr broadcast-en-addr en=  if  do-arp  then  ( ip-type )
+         else
+            router-en-addr his-en-addr copy-en-addr  \ Not local, go through the gateway
+         then
       then
       his-en-addr  swap exit
    then                                              ( 'dest-adr type )

Modified: ofw/inetv6/dhcp.fth
===================================================================
--- ofw/inetv6/dhcp.fth	2007-08-10 10:36:53 UTC (rev 533)
+++ ofw/inetv6/dhcp.fth	2007-08-14 16:05:09 UTC (rev 534)
@@ -249,6 +249,7 @@
    0 file-name-buf c!
    unknown-ip-addr name-server-ip copy-ip-addr
    unknown-ip-addr dhcp-server-ip copy-ip-addr
+   unknown-ip-addr name-server-ip-slave copy-ip-addr
 ;
 
 also forth definitions
@@ -483,7 +484,9 @@
       then
    then
 
-   d#  6 find-option  if  drop name-server-ip    copy-ip-addr  then
+   d#  6 find-option  if  over name-server-ip copy-ip-addr  
+                          4 >  if  4 + name-server-ip-slave copy-ip-addr  else  drop  then
+                      then
    d# 28 find-option  if  drop broadcast-ip-addr copy-ip-addr  then
    d# 15 find-option  if  'domain-name    place-cstr drop  then
    d# 12 find-option  if  'client-name    place-cstr drop  then
@@ -493,8 +496,11 @@
    bootnet-debug  if
       indent ." Received DHCP ACK" cr
       name-server-ip known?  if
-         indent indent ." Name server: " name-server-ip .ipaddr cr
+         indent indent ." Master name server: " name-server-ip .ipaddr cr
       then
+      name-server-ip-slave known?  if
+         indent indent ." Slave name server:  " name-server-ip-slave .ipaddr cr
+      then
       broadcast-ip-addr   if
          indent indent ." IP broadcast: " broadcast-ip-addr (.ipaddr) cr
       then

Modified: ofw/inetv6/dns.fth
===================================================================
--- ofw/inetv6/dns.fth	2007-08-10 10:36:53 UTC (rev 533)
+++ ofw/inetv6/dns.fth	2007-08-14 16:05:09 UTC (rev 534)
@@ -13,10 +13,20 @@
 
 \ DNS question format:  QNAME-variable_length, QTYPE(/w), QCLASS(/w)
 \ QTYPE value for "A" (host name) is 1
+\ QTYPE value for "AAAA" (IPv6 hostname) is h# 1c
 \ QCLASS value for "IN" (Internet) is 1
 
-d# 1022 value fw-port#
+\ d# 1022 value fw-port#                   \ It's been assigned by IANA.
+h# 800a constant fw-port#                  \ It's unassigned as of 8/13/2007.
 
+d# 2000 constant dns-timeout
+
+2 value #retries-a
+2 value #retries-aaaa
+
+0 value    qtype
+1 constant qclass
+
 \ Encode/decode various DNS data types
 : +dnsw  ( w -- )  wbsplit +xb +xb  ;
 : -dnsw  ( -- w )  -xb -xb swap bwjoin  ;
@@ -109,7 +119,7 @@
    \        ID       flags    #questions  #answers  #namesrvrs  #additional
    dns-xid +dnsw  h# 100 +dnsw  1 +dnsw     0 +dnsw   0 +dnsw     0 +dnsw
    +dns-host
-   1 +dnsw  1 +dnsw
+   qtype +dnsw  qclass +dnsw
    x$  fw-port# dns-port# send-udp-packet
    r> /dns-query free-udp
 ;
@@ -164,7 +174,7 @@
 
    -dnsw  -dnsw  wljoin       ( class.type )
    -dnsl drop                 ( class.type )   \ Discard TTL
-   h# 1.0001 =  if            ( )
+   qtype qclass wljoin =  if  ( )
       -dnsw drop	\ Discard RDLENGTH (it better be 4!)
       x$ drop true            ( 'ip true )
    else                       ( )
@@ -192,21 +202,25 @@
 \ The host name can be either a simple name (e.g. "pi") or a
 \ fully-qualified domain name (e.g. "pi.firmworks.com").
 : try-resolve  ( hostname$ -- 'ip )
-   name-server-ip set-dest-ip                    ( hostname$ )
-   d# 2000 set-timeout                           ( hostname$ )
-   send-dns-query                                ( )
-   dns-xid dns-port# fw-port# receive-dns-reply  ( error? )
-   1 and throw                                   ( )
-   get-host-addr                                 ( answer-ip )
+   dns-timeout set-timeout                          ( hostname$ )
+   send-dns-query                                   ( )
+   dns-xid dns-port# fw-port# receive-dns-reply     ( error? )
+   1 and throw                                      ( )
+   get-host-addr                                    ( answer-ip )
 ;
-: (resolve)  ( hostname$ -- )
-   bootnet-debug  if                             ( hostname$ )
-      ." Using DNS to find the IP address of "   ( hostname$ )
-      2dup type cr                               ( hostname$ )
-   then                                          ( hostname$ )
+: resolve-a  ( hostname$ -- 'ip )
+   bootnet-debug  if                                ( hostname$ )
+      ." Using DNS to find the IP address of "      ( hostname$ )
+      2dup type cr                                  ( hostname$ )
+   then                                             ( hostname$ )
 
-   d# 20 0  do		\ Try 20 times at 2 seconds per try
-      2dup ['] try-resolve catch  ?dup  if       ( hostname$ x x err )
+   1 to qtype
+   #retries-a 0  do		\ Try 20 times at 2 seconds per try
+      name-server-ip set-dest-ip
+      i 1 and  if
+         name-server-ip-slave known?  if  name-server-ip-slave set-dest-ip  then
+      then
+      2dup ['] try-resolve catch  ?dup  if          ( hostname$ x x err )
          nip nip                                    ( hostname$ err )
          1 <>  if                                   ( hostname$ )
             bootnet-debug  if                       ( hostname$ )
@@ -214,21 +228,66 @@
             then                                    ( hostname$ )
             true abort" Unknown hostname"
          then                                       ( hostname$ )
-      else                                       ( hostname$ 'ip )
-         bootnet-debug  if                       ( hostname$ 'ip )
-            ." Got IP address "  dup .ipaddr cr  ( hostname$ 'ip )
-         then                                    ( hostname$ 'ip )
+      else                                          ( hostname$ 'ip )
+         bootnet-debug  if                          ( hostname$ 'ip )
+            indent ." Got IP address "  dup .ipaddr cr     ( hostname$ 'ip )
+         then                                       ( hostname$ 'ip )
 
-         nip nip                                 ( 'ip )
+         nip nip                                    ( 'ip )
          unloop exit
-      then                                       ( hostname$ )
-   loop                                          ( hostname$ )
+      then                                          ( hostname$ )
+   loop                                             ( hostname$ )
 
-   bootnet-debug  if  ." No answer to DNS request" cr  then    ( hostname$ )
+   bootnet-debug  if  ." No answer to DNS A request" cr  then    ( hostname$ )
    true abort" DNS: No answer"
 ;
-\ : resolve  ( 'ip hostname$ -- )  (resolve) swap copy-ip-addr  ;
 
+[ifdef] include-ipv6
+: resolve-aaaa  ( hostname$ -- )
+   bootnet-debug  if                                   ( hostname$ )
+      ." Using DNS AAAA to find the IPv6 address of "  ( hostname$ )
+      2dup type cr                                     ( hostname$ )
+   then
+
+   h# 1c to qtype
+   #retries-aaaa 0  do		\ Try 20 times at 2 seconds per try
+      name-server-ip set-dest-ip
+      i 1 and  if
+         name-server-ip-slave known?  if  name-server-ip-slave set-dest-ip  then
+      then
+      2dup ['] try-resolve catch  ?dup  if          ( hostname$ x x err )
+         nip nip                                    ( hostname$ err )
+         1 <>  if                                   ( hostname$ )
+            bootnet-debug  if                       ( hostname$ )
+               indent ." Unknown IPv6 hostname: " 2dup type cr  ( hostname )
+            then                                    ( hostname$ )
+            true abort" Unknown IPv6 hostname"
+         then                                       ( hostname$ )
+      else                                          ( hostname$ 'ip )
+         bootnet-debug  if                          ( hostname$ 'ip )
+            indent ." Got IPv6 address "  dup .ipv6 cr     ( hostname$ 'ip )
+         then                                       ( hostname$ 'ip )
+
+         set-dest-ipv6 2drop                        ( )
+         unloop exit
+      then                                          ( hostname$ )
+   loop                                             ( hostname$ )
+
+   bootnet-debug  if  indent ." No answer to DNS AAAA request" cr  then    ( hostname$ )
+   true abort" DNS AAAA: No answer"
+;
+[else]
+: resolve-aaaa  ( hostname$ -- )  abort" IPv4 AAAA DNS not supported"  ;
+[then]
+
+false value resolve-flag
+: resolvev4  ( hostname$ -- )
+   false to resolve-flag
+   2dup ['] resolve-a    catch  if  2drop  else  true to resolve-flag set-dest-ip  then
+        ['] resolve-aaaa catch  if  2drop  else  true to resolve-flag  then
+   resolve-flag not  abort" DNS: No answer"
+;
+
 headerless
 : ?bad-ip  ( flag -- )  abort" Bad host name or address"  ;
 4 buffer: ip-buf
@@ -245,8 +304,7 @@
 headers
 : $set-host  ( hostname$ -- )
    dup 0= ?bad-ip
-   over c@  [char] 0 [char] 9 between  if  $>ip  else  (resolve)  then
-   set-dest-ip
+   over c@  [char] 0 [char] 9 between  if  $>ip set-dest-ip  else  resolvev4  then
 ;
 \ LICENSE_BEGIN
 \ Copyright (c) 2006 FirmWorks

Modified: ofw/inetv6/dnsv6.fth
===================================================================
--- ofw/inetv6/dnsv6.fth	2007-08-10 10:36:53 UTC (rev 533)
+++ ofw/inetv6/dnsv6.fth	2007-08-14 16:05:09 UTC (rev 534)
@@ -7,26 +7,46 @@
 
 [ifndef] include-ipv4
 : $>ip  ( hostname$ -- 'ip )  .ipv4-not-supported  ;
-: (resolve)  ( hostname$ -- 'ip )  .ipv4-not-supported  ;
+: resolvev4  ( hostname$ -- )  .ipv4-not-supported  ;
 : set-dest-ip  ( buf -- )  .ipv4-not-supported  ;
 : ?bad-ip  ( flag -- )  abort" Bad host name or address"  ;
 [then]
 
+: resolvev6  ( hostname$ -- )
+   true to use-ipv6?
+   unknown-ipv6-addr his-ipv6-addr copy-ipv6-addr
+   abort" IPv6 DNS not supported yet"  
+;
+
 headers
-: (resolvev6)  ( hostname$ -- 'ip )  ;
 
 \ XXX Try (resolve) or (resolve6) first.  If fail, try the other one.
-: (resolve)  ( hostname$ -- 'ip )
-   use-ipv6?  if  (resolvev6) true  else  (resolve) false  then
-   dup to use-ipv6?
-   if  set-dest-ipv6  else  set-dest-ip  then
+: (resolve)  ( hostname$ -- )
+   2dup ['] resolvev6  catch  if
+      2drop
+      false to use-ipv6?
+      resolvev4
+   else
+      2drop
+   then
+   use-ipv6-ok? dup  to use-ipv6?  if     \ Make sure all the addresses are set properly
+      his-ipv6-addr (set-dest-ipv6)
+      bootnet-debug  if  ." Use IPv6 protocol" cr  then
+   else
+      his-ip-addr (set-dest-ip)
+      bootnet-debug  if  ." Use IP protocol" cr  then
+   then
 ;
 
 : $set-host  ( hostname$ -- )
    dup 0= ?bad-ip
    2dup ['] $>ip catch  if  2drop  else  false to use-ipv6? set-dest-ip 2drop exit  then
-   2dup ipv6-buf ['] $ipv6# catch nip nip not  if  true to use-ipv6? ipv6-buf set-dest-ipv6 exit  then
-   (resolve)
+   2dup ipv6-buf ['] $ipv6# catch  if
+      3drop (resolve)
+   else
+      2drop
+      true to use-ipv6? ipv6-buf set-dest-ipv6
+   then
 ;
 
 \ LICENSE_BEGIN

Modified: ofw/inetv6/ethernet.fth
===================================================================
--- ofw/inetv6/ethernet.fth	2007-08-10 10:36:53 UTC (rev 533)
+++ ofw/inetv6/ethernet.fth	2007-08-14 16:05:09 UTC (rev 534)
@@ -39,11 +39,13 @@
 
 /e buffer: my-en-addr
 /e buffer: his-en-addr
-/e buffer: routerv6-en-addr
+/e buffer: router-en-addr                 \ IPv4 gateway/router
+/e buffer: routerv6-en-addr               \ IPv6 router
 /e buffer: mc-en-addr
 
-: .my-link-addr   ( -- )  ." My MAC: " my-en-addr .enaddr  ;
-: .his-link-addr  ( -- )  ." His MAC: " his-en-addr  .enaddr  ;
+: .my-link-addr      ( -- )  ." My MAC: " my-en-addr .enaddr  ;
+: .his-link-addr     ( -- )  ." His MAC: " his-en-addr .enaddr  ;
+: .router-en-addr    ( -- )  ." Gateway MAC: " router-en-addr .enaddr  ;
 : .routerv6-en-addr  ( -- )  ." IPv6 router MAC: " routerv6-en-addr .enaddr  ;
 
 create mc-en-addr-all-nodes  h# 33 c, h# 33 c, h# 00 c, 0 c, 0 c, 1 c,

Modified: ofw/inetv6/ip.fth
===================================================================
--- ofw/inetv6/ip.fth	2007-08-10 10:36:53 UTC (rev 533)
+++ ofw/inetv6/ip.fth	2007-08-14 16:05:09 UTC (rev 534)
@@ -42,6 +42,7 @@
 headers
 /i buffer: his-ip-addr
 /i buffer: name-server-ip
+/i buffer: name-server-ip-slave
 ' 'domain-name     " domain-name"    chosen-string
 
 headerless
@@ -125,13 +126,12 @@
 0 instance value last-ip-packet
 
 headers
+: (set-dest-ip)  ( buf -- )
+   his-ip-addr copy-ip-addr
+   unlock-link-addr
+;
 : set-dest-ip  ( buf -- )
-   dup his-ip-addr ip=  if
-      drop
-   else
-      his-ip-addr copy-ip-addr
-      unlock-link-addr
-   then
+   dup his-ip-addr ip=  if  drop  else  (set-dest-ip)  then
 ;
 
 : lock-ip-address  ( -- )

Modified: ofw/inetv6/ipv6.fth
===================================================================
--- ofw/inetv6/ipv6.fth	2007-08-10 10:36:53 UTC (rev 533)
+++ ofw/inetv6/ipv6.fth	2007-08-14 16:05:09 UTC (rev 534)
@@ -135,6 +135,10 @@
 : ipv6-addr-local?  ( adr-buf -- flag )  c@ h# e0 and h# 20 <>  ;
 
 : use-routerv6?  ( -- flag )  routerv6-en-addr unknown-en-addr? not  ;
+: use-ipv6-ok?  ( -- flag )
+   his-ipv6-addr knownv6?
+   his-ipv6-addr ipv6-addr-local? not  if  use-routerv6? and  then
+;
 
 /ipv6 buffer: server-ipv6-addr
 : use-serverv6?  ( -- flag )  server-ipv6-addr knownv6?  ;
@@ -174,22 +178,21 @@
 [then]
 
 headers
-: set-dest-ipv6  ( buf -- )
-   dup his-ipv6-addr ipv6=  if
-      drop
+: (set-dest-ipv6)  ( buf -- )
+   his-ipv6-addr copy-ipv6-addr
+   set-his-ipv6-addr-mc
+   his-ipv6-addr ipv6-addr-local?  if
+      unlock-link-addr
+      my-ipv6-addr-link-local
    else
-      his-ipv6-addr copy-ipv6-addr
-      set-his-ipv6-addr-mc
-      his-ipv6-addr ipv6-addr-local?  if
-         unlock-link-addr
-         my-ipv6-addr-link-local
-      else
-         use-routerv6?  if  routerv6-en-addr his-en-addr copy-en-addr  then
-         my-ipv6-addr-global
-      then
-      my-ipv6-addr copy-ipv6-addr
+      use-routerv6?  if  routerv6-en-addr his-en-addr copy-en-addr  then
+      my-ipv6-addr-global
    then
+   my-ipv6-addr copy-ipv6-addr
 ;
+: set-dest-ipv6  ( buf -- )
+   dup his-ipv6-addr ipv6=  if  drop  else  (set-dest-ipv6)  then
+;
 
 : lock-ipv6-address  ( -- )
    the-struct >r  last-ip-packet set-struct

Modified: ofw/inetv6/neighdis.fth
===================================================================
--- ofw/inetv6/neighdis.fth	2007-08-10 10:36:53 UTC (rev 533)
+++ ofw/inetv6/neighdis.fth	2007-08-14 16:05:09 UTC (rev 534)
@@ -27,8 +27,8 @@
 /ipv6 buffer: his-ipv6-addr-temp
 : do-neighbor-discovery  ( -- )
    bootnet-debug  if
-      ." ICMPv6 ND protocol: Getting MAC address for IP address: "
-      his-ipv6-addr .ipv6 cr
+      ." ICMPv6 ND protocol: Getting MAC address for IPv6 address: " cr
+      indent his-ipv6-addr .ipv6 cr
    then
 
    his-ipv6-addr his-ipv6-addr-temp copy-ipv6-addr
@@ -56,7 +56,11 @@
          broadcast-en-addr his-en-addr copy-en-addr  ( ip-type )
       else                                           ( ip-type 'ip-adr )
          his-ip-addr copy-ip-addr                    ( ip-type )
-         his-en-addr broadcast-en-addr en=  if  do-arp  then  ( ip-type )
+         his-ip-addr my-ip-addr ip-prefix=?  if
+            his-en-addr broadcast-en-addr en=  if  do-arp  then  ( ip-type )
+         else
+            router-en-addr his-en-addr copy-en-addr
+         then
       then
       his-en-addr  swap
 [then]
@@ -76,7 +80,7 @@
    bootnet-debug  if
       ." My IPv6 configuration (stateless autoconfiguration): " cr
       indent .my-ipv6-addr-link-local  cr
-      my-ipv6-addr-global unknown-ipv6-addr? not  if
+      my-ipv6-addr-global knownv6?  if
          indent .my-ipv6-addr-global   cr
          indent .my-prefix             cr
       then

Modified: ofw/inetv6/netload.fth
===================================================================
--- ofw/inetv6/netload.fth	2007-08-10 10:36:53 UTC (rev 533)
+++ ofw/inetv6/netload.fth	2007-08-14 16:05:09 UTC (rev 534)
@@ -26,7 +26,9 @@
 ;
 
 : show-router-addr  ( -- )
-   bootnet-debug  if  ." Router IP: = " router-ip-addr .ipaddr  cr  then 
+   bootnet-debug  if
+      .router-en-addr  ."  Router IP: = " router-ip-addr .ipaddr  cr 
+   then 
 ; 
 
 : show-all-en-ip-address  (  --  ) 
@@ -102,6 +104,7 @@
             indent ." Boot server: " server-ip-addr .ipaddr cr
          then
          use-router?  if
+            indent .router-en-addr cr
             indent ." Router: " router-ip-addr .ipaddr cr
          then
       then
@@ -400,6 +403,12 @@
    2drop false
 ;
 
+: resolve-router-en-addr  ( -- )
+   router-ip-addr his-ip-addr copy-ip-addr
+   do-arp
+   his-en-addr router-en-addr copy-en-addr
+;
+
 defer configured  ' noop to configured
 : configure  ( -- )
    use-last?  if  configured exit  then
@@ -430,6 +439,7 @@
          server-ip-addr set-dest-ip
       then
    then
+   use-router?  if  resolve-router-en-addr  then    \ Find router's MAC address
    show-all-en-ip-address
    configured
 ;




More information about the OpenBIOS mailing list