[gPXE-devel] [PATCH 26/31] [ipv6] handle unaligned prefixes in router advertisements
matthew at theiselins.net
matthew at theiselins.net
Fri Jul 8 10:28:35 EDT 2011
From: Matthew Iselin <matthew at theiselins.net>
Signed-off-by: Matthew Iselin <matthew at theiselins.net>
---
src/net/ndp.c | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/net/ndp.c b/src/net/ndp.c
index 5205554..be1fa94 100644
--- a/src/net/ndp.c
+++ b/src/net/ndp.c
@@ -177,8 +177,8 @@ int ndp_process_radvert ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src
prefix_len = opt->prefix_len;
if ( prefix_len % 8 ) {
- /* FIXME: non-aligned prefixes unhandled */
- DBG ( "ndp: prefix length is unaligned, connectivity may suffer.\n" );
+ /* Copy one extra prefix byte. */
+ prefix_len += 8;
}
if ( prefix_len > 64 ) {
@@ -186,6 +186,9 @@ int ndp_process_radvert ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src
DBG ( "ndp: prefix length is quite long, connectivity may suffer.\n" );
}
+ /* Copy the prefix first and then add the EUI-64 */
+ memcpy( &host_addr.s6_addr, opt->prefix, prefix_len / 8 );
+
/* Create an IPv6 address for this station based on the prefix. */
ll_size = netdev->ll_protocol->ll_addr_len;
if ( ll_size < 6 ) {
@@ -194,8 +197,6 @@ int ndp_process_radvert ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src
ipv6_generate_eui64 ( host_addr.s6_addr + 8, netdev->ll_addr );
}
- memcpy( &host_addr.s6_addr, opt->prefix, prefix_len / 8 );
-
rc = 0;
}
break;
--
1.7.2.5
More information about the gPXE-devel
mailing list