From: Matthew Iselin <matt...@theiselins.net>

Signed-off-by: Matthew Iselin <matt...@theiselins.net>
---
 src/include/gpxe/ip6.h |    2 ++
 src/net/ipv6.c         |   20 ++++++++++++++++++++
 src/net/ndp.c          |    9 +--------
 src/usr/ip6mgmt.c      |    9 +--------
 4 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/src/include/gpxe/ip6.h b/src/include/gpxe/ip6.h
index 53811ca..6204b03 100644
--- a/src/include/gpxe/ip6.h
+++ b/src/include/gpxe/ip6.h
@@ -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,
diff --git a/src/net/ipv6.c b/src/net/ipv6.c
index 78e1eb2..9d63ce8 100644
--- a/src/net/ipv6.c
+++ b/src/net/ipv6.c
@@ -46,6 +46,26 @@ struct ipv6_miniroute {
 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
  *
  * @v netdev           Network device
diff --git a/src/net/ndp.c b/src/net/ndp.c
index 75002d9..5205554 100644
--- a/src/net/ndp.c
+++ b/src/net/ndp.c
@@ -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 
);
diff --git a/src/usr/ip6mgmt.c b/src/usr/ip6mgmt.c
index 4f8cebb..9b8e9cb 100644
--- a/src/usr/ip6mgmt.c
+++ b/src/usr/ip6mgmt.c
@@ -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. */
-- 
1.7.2.5

_______________________________________________
gPXE-devel mailing list
gPXE-devel@etherboot.org
http://etherboot.org/mailman/listinfo/gpxe-devel

Reply via email to