[ipv6] Implement EUI-64 generation as a function
authorMatthew Iselin <matthew@theiselins.net>
Wed, 8 Jun 2011 03:20:49 +0000 (13:20 +1000)
committerMarty Connor <mdc@etherboot.org>
Thu, 21 Jul 2011 01:53:51 +0000 (21:53 -0400)
Update NDP and ip6mgmt accordingly

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

index 53811ca..6204b03 100644 (file)
@@ -72,6 +72,8 @@ extern struct tcpip_net_protocol ipv6_tcpip_protocol;
 extern char * inet6_ntoa ( struct in6_addr in6 );
 extern int inet6_aton ( const char *cp, struct in6_addr *inp );
 
+void ipv6_generate_eui64 ( uint8_t *out, uint8_t *ll );
+
 extern int add_ipv6_address ( struct net_device *netdev,
                              struct in6_addr prefix, int prefix_len,
                              struct in6_addr address,
index 78e1eb2..9d63ce8 100644 (file)
@@ -45,6 +45,26 @@ struct ipv6_miniroute {
 /** List of IPv6 miniroutes */
 static LIST_HEAD ( miniroutes );
 
+/**
+ * Generate an EUI-64 from a given link-local address.
+ *
+ * @v out              pointer to buffer to receive the EUI-64
+ * @v ll               pointer to buffer containing the link-local address
+ */
+void ipv6_generate_eui64 ( uint8_t *out, uint8_t *ll ) {
+       assert ( out != 0 );
+       assert ( ll != 0 );
+       
+       /* Create an EUI-64 identifier. */
+       memcpy( out, ll, 3 );
+       memcpy( out + 5, ll + 3, 3 );
+       out[3] = 0xFF;
+       out[4] = 0xFE;
+       
+       /* Designate that this is in fact an EUI-64. */
+       out[0] |= 0x2;
+}
+
 /**
  * Add IPv6 minirouting table entry
  *
index d798ef9..6f98b3b 100644 (file)
@@ -191,14 +191,7 @@ int ndp_process_radvert ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src
                        if ( ll_size < 6 ) {
                                memcpy ( host_addr.s6_addr + (8 - ll_size), netdev->ll_addr, ll_size );
                        } else {
-                               /* Create an EUI-64 identifier. */
-                               memcpy( host_addr.s6_addr + 8, netdev->ll_addr, 3 );
-                               memcpy( host_addr.s6_addr + 8 + 5, netdev->ll_addr + 3, 3 );
-                               host_addr.s6_addr[11] = 0xFF;
-                               host_addr.s6_addr[12] = 0xFE;
-
-                               /* Designate that this is in fact an EUI-64. */
-                               host_addr.s6_addr[8] |= 0x2;
+                               ipv6_generate_eui64 ( host_addr.s6_addr + 8, netdev->ll_addr );
                        }
 
                        memcpy( &host_addr.s6_addr, opt->prefix, prefix_len / 8 );
index 4f8cebb..9b8e9cb 100644 (file)
@@ -57,14 +57,7 @@ int ip6_autoconf ( struct net_device *netdev ) {
        if ( ll_size < 6 ) {
                memcpy ( ip6addr.s6_addr + (8 - ll_size), netdev->ll_addr, ll_size );
        } else {
-               /* Create an EUI-64 identifier. */
-               memcpy( ip6addr.s6_addr + 8, netdev->ll_addr, 3 );
-               memcpy( ip6addr.s6_addr + 8 + 5, netdev->ll_addr + 3, 3 );
-               ip6addr.s6_addr[11] = 0xFF;
-               ip6addr.s6_addr[12] = 0xFE;
-               
-               /* Designate that this is in fact an EUI-64. */
-               ip6addr.s6_addr[8] |= 0x2;
+               ipv6_generate_eui64 ( ip6addr.s6_addr + 8, netdev->ll_addr );
        }
        
        /* Fill in the link-local prefix. */