[gPXE-devel] [PATCH 24/31] [ipv6] implement EUI-64 generation as a function and update NDP and ip6mgmt accordingly

matthew at theiselins.net matthew at theiselins.net
Fri Jul 8 10:28:33 EDT 2011


From: Matthew Iselin <matthew at theiselins.net>

Signed-off-by: Matthew Iselin <matthew at 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



More information about the gPXE-devel mailing list