[ipv6] Modify "ipv6" command to set an IPv6 address on an interface
authorMatthew Iselin <matthew@theiselins.net>
Thu, 26 May 2011 08:44:54 +0000 (18:44 +1000)
committerMarty Connor <mdc@etherboot.org>
Tue, 19 Jul 2011 00:45:09 +0000 (20:45 -0400)
Signed-off-by: Matthew Iselin <matthew@theiselins.net>
Signed-off-by: Marty Connor <mdc@etherboot.org>
src/net/ipv6.c
src/usr/ip6mgmt.c

index 5ce4e1a..9925435 100644 (file)
@@ -49,7 +49,7 @@ static LIST_HEAD ( miniroutes );
  * Add IPv6 minirouting table entry
  *
  * @v netdev           Network device
- * @v prefix           Destination prefix
+ * @v prefix           Destination prefix (in bits)
  * @v address          Address of the interface
  * @v gateway          Gateway address (or ::0 for no gateway)
  * @ret miniroute      Routing table entry, or NULL
@@ -60,7 +60,7 @@ add_ipv6_miniroute ( struct net_device *netdev, struct in6_addr prefix,
                     struct in6_addr gateway ) {
        struct ipv6_miniroute *miniroute;
        
-       DBG("ipv6 add: %s/%d ", inet6_ntoa(address), prefix_len * 8);
+       DBG("ipv6 add: %s/%d ", inet6_ntoa(address), prefix_len);
        DBG("gw %s\n", inet6_ntoa(gateway));
 
        miniroute = malloc ( sizeof ( *miniroute ) );
@@ -91,7 +91,7 @@ add_ipv6_miniroute ( struct net_device *netdev, struct in6_addr prefix,
 static void del_ipv6_miniroute ( struct ipv6_miniroute *miniroute ) {
        
        DBG("ipv6 del: %s/%d\n", inet6_ntoa(miniroute->address),
-                                miniroute->prefix_len * 8);
+                                miniroute->prefix_len);
        
        netdev_put ( miniroute->netdev );
        list_del ( &miniroute->list );
index 0809c7b..f0b69d4 100644 (file)
@@ -34,8 +34,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
 /* Maximum length of the link-layer address we'll insert as an EUI-64. */
 #define AUTOCONF_LL_MAX        6
 
-int ip6_autoconf ( struct net_device *netdev __unused ) {
-       struct in6_addr ip6addr;
+int ip6_autoconf ( struct net_device *netdev ) {
+       struct in6_addr ip6addr, ip6zero;
        size_t ll_size;
        int rc;
 
@@ -50,6 +50,7 @@ int ip6_autoconf ( struct net_device *netdev __unused ) {
        /* Create the host ID part of the IPv6 address from the Link-Layer
         * address on the netdevice. */
        memset ( &ip6addr, 0, sizeof (struct in6_addr) );
+       memset ( &ip6zero, 0, sizeof (struct in6_addr) );
        
        ll_size = netdev->ll_protocol->ll_addr_len;
        if ( ll_size < 6 ) {
@@ -69,7 +70,13 @@ int ip6_autoconf ( struct net_device *netdev __unused ) {
        ip6addr.s6_addr[0] = 0xFE;
        ip6addr.s6_addr[1] = 0x80;
        
-       DBG( "ip6 autoconfig address is %s\n", inet6_ntoa(ip6addr) );
+       /* TODO: send a few neighbour solicits on this address before we take
+        * it (once NDP is implemented). */
+       
+       DBG( "ipv6 autoconfig address is %s\n", inet6_ntoa(ip6addr) );
+       
+       /* Add as a route. */
+       add_ipv6_address ( netdev, ip6addr, 10, ip6addr, ip6zero );
        
        return 0;
 }