[ipv6] Attempt DHCPv6 only in specific circumstances
authorMatthew Iselin <matthew@theiselins.net>
Sun, 17 Jul 2011 05:36:20 +0000 (15:36 +1000)
committerMarty Connor <mdc@etherboot.org>
Thu, 21 Jul 2011 11:12:08 +0000 (07:12 -0400)
We should try DHCPv6 only if a router advertisement is never received,
or if a received router advertisement suggests getting extra or all
information from a DHCPv6 server on the network.

Signed-off-by: Matthew Iselin <matthew@theiselins.net>
Signed-off-by: Marty Connor <mdc@etherboot.org>
src/usr/ip6mgmt.c

index 21d30d6..ce029e7 100644 (file)
@@ -40,6 +40,7 @@ int ip6_autoconf ( struct net_device *netdev ) {
        struct in6_addr ip6addr, ip6zero;
        size_t ll_size;
        int rc;
+       int use_dhcp = 0, onlyinfo = 0;
 
        /* Check we can open the interface first */
        if ( ( rc = ifopen ( netdev ) ) != 0 )
@@ -82,23 +83,27 @@ int ip6_autoconf ( struct net_device *netdev ) {
        
        if ( rc < 0 ) {
                DBG ( "ipv6: router solicitation failed\n" );
+               use_dhcp = 1;
+               onlyinfo = 0;
        } else {
                if ( rc & RSOLICIT_CODE_MANAGED ) {
                        DBG ( "ipv6: should use dhcp6 server\n" );
+                       use_dhcp = 1;
                } else if ( rc & RSOLICIT_CODE_OTHERCONF ) {
-                       DBG ( "ipv6: some more info is available via dhcp6\n" );
+                       DBG ( "ipv6: use dhcp6 server for DNS settings\n" );
+                       use_dhcp = 1;
+                       onlyinfo = 1;
                } else {
                        DBG ( "ipv6: autoconfiguration complete\n" );
                }
        }
        
-       DBG ( "ipv6: testing dhcp6 info-request\n" );
-       start_dhcp6 ( &monojob, netdev, 1 );
-       rc = monojob_wait ( "" );
-       
-       DBG ( "ipv6: testing dhcp6 full-request\n" );
-       start_dhcp6 ( &monojob, netdev, 0 );
-       rc = monojob_wait ( "" );
+       /* Attempt DHCPv6 now, for addresses (if we don't already have one) and
+        * DNS configuration. */
+       if ( use_dhcp ) {
+               start_dhcp6 ( &monojob, netdev, onlyinfo );
+               rc = monojob_wait ( "" );
+       }
        
        return rc;
 }