[gPXE-devel] [PATCH 20/31] [ipv6] implement router solicitations and integrate with the "ipv6" command

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


From: Matthew Iselin <matthew at theiselins.net>

Signed-off-by: Matthew Iselin <matthew at theiselins.net>
---
 src/include/gpxe/icmp6.h |    2 ++
 src/include/gpxe/ndp.h   |    3 ++-
 src/net/icmpv6.c         |   44 +++++++++++++++++++++++++++++++++++++++++++-
 src/usr/ip6mgmt.c        |    4 ++++
 4 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/src/include/gpxe/icmp6.h b/src/include/gpxe/icmp6.h
index 6040258..23b7b56 100644
--- a/src/include/gpxe/icmp6.h
+++ b/src/include/gpxe/icmp6.h
@@ -65,6 +65,8 @@ int icmp6_rx ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
 
 int icmp6_send_solicit ( struct net_device *netdev, struct in6_addr *src, struct in6_addr *dest );
 
+int icmp6_send_rsolicit ( struct net_device *netdev );
+
 int icmp6_send_advert ( struct net_device *netdev, struct in6_addr *src, struct in6_addr *dest );
 
 #endif /* _GPXE_ICMP6_H */
diff --git a/src/include/gpxe/ndp.h b/src/include/gpxe/ndp.h
index 6830362..be387ce 100644
--- a/src/include/gpxe/ndp.h
+++ b/src/include/gpxe/ndp.h
@@ -4,13 +4,14 @@
 #include <stdint.h>
 #include <byteswap.h>
 #include <string.h>
-#include <gpxe/icmp6.h>
 #include <gpxe/ip6.h>
 #include <gpxe/in.h>
 #include <gpxe/netdevice.h>
 #include <gpxe/iobuf.h>
 #include <gpxe/tcpip.h>
 
+struct icmp6_net_protocol;
+
 #define NDP_STATE_INVALID 0
 #define NDP_STATE_INCOMPLETE 1
 #define NDP_STATE_REACHABLE 2
diff --git a/src/net/icmpv6.c b/src/net/icmpv6.c
index fb4d9ea..dcc5851 100644
--- a/src/net/icmpv6.c
+++ b/src/net/icmpv6.c
@@ -64,7 +64,49 @@ int icmp6_send_solicit ( struct net_device *netdev, struct in6_addr *src __unuse
 
 	/* Send packet over IP6 */
 	return tcpip_tx ( iobuf, &icmp6_protocol, NULL, &st_dest.st,
-			  NULL, &nsolicit->csum );
+			  netdev, &nsolicit->csum );
+}
+
+/**
+ * Send router solicitation packet
+ *
+ * @v netdev	Network device
+ * @v src	Source address
+ * @v dest	Destination address
+ *
+ * This function prepares a neighbour solicitation packet and sends it to the
+ * network layer.
+ */
+int icmp6_send_rsolicit ( struct net_device *netdev ) {
+	union {
+		struct sockaddr_in6 sin6;
+		struct sockaddr_tcpip st;
+	} st_dest;
+	struct router_solicit *solicit;
+	struct io_buffer *iobuf = alloc_iob ( sizeof ( *solicit ) + MIN_IOB_LEN );
+	
+	iob_reserve ( iobuf, MAX_HDR_LEN );
+	solicit = iob_put ( iobuf, sizeof ( *solicit ) );
+
+	/* Fill up the headers */
+	memset ( solicit, 0, sizeof ( *solicit ) );
+	solicit->type = ICMP6_ROUTER_SOLICIT;
+	solicit->code = 0;
+	
+	/* Partial checksum */
+	solicit->csum = 0;
+	solicit->csum = tcpip_chksum ( solicit, sizeof ( *solicit ) );
+
+	/* Solicited multicast address - FF02::2 (all routers on local network) */
+	memset(&st_dest.sin6, 0, sizeof(st_dest.sin6));
+	st_dest.sin6.sin_family = AF_INET6;
+	st_dest.sin6.sin6_addr.in6_u.u6_addr8[0] = 0xff;
+	st_dest.sin6.sin6_addr.in6_u.u6_addr8[1] = 0x2;
+	st_dest.sin6.sin6_addr.in6_u.u6_addr8[15] = 0x2;
+
+	/* Send packet over IP6 */
+	return tcpip_tx ( iobuf, &icmp6_protocol, NULL, &st_dest.st,
+			  netdev, &solicit->csum );
 }
 
 /**
diff --git a/src/usr/ip6mgmt.c b/src/usr/ip6mgmt.c
index f0b69d4..4f8cebb 100644
--- a/src/usr/ip6mgmt.c
+++ b/src/usr/ip6mgmt.c
@@ -24,6 +24,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <gpxe/netdevice.h>
 #include <gpxe/in.h>
 #include <gpxe/ip6.h>
+#include <gpxe/icmp6.h>
 #include <gpxe/monojob.h>
 #include <gpxe/process.h>
 #include <usr/ifmgmt.h>
@@ -78,6 +79,9 @@ int ip6_autoconf ( struct net_device *netdev ) {
 	/* Add as a route. */
 	add_ipv6_address ( netdev, ip6addr, 10, ip6addr, ip6zero );
 	
+	/* Solicit routers on the network. */
+	icmp6_send_rsolicit ( netdev );
+	
 	return 0;
 }
 
-- 
1.7.2.5



More information about the gPXE-devel mailing list