[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