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