[gPXE-devel] [PATCH 17/31] [ipv6] fix ipv6 routing to work for addresses off the local network

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


From: Matthew Iselin <matthew at theiselins.net>

Signed-off-by: Matthew Iselin <matthew at theiselins.net>
---
 src/net/ipv6.c |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/src/net/ipv6.c b/src/net/ipv6.c
index 5bfb413..489db44 100644
--- a/src/net/ipv6.c
+++ b/src/net/ipv6.c
@@ -192,7 +192,7 @@ static int ipv6_tx ( struct io_buffer *iobuf,
 		     struct net_device *netdev,
 		     uint16_t *trans_csum ) {
 	struct sockaddr_in6 *dest = ( struct sockaddr_in6* ) st_dest;
-	struct in6_addr next_hop;
+	struct in6_addr next_hop, gateway = ip6_none;
 	struct ipv6_miniroute *miniroute;
 	uint8_t ll_dest_buf[MAX_LL_ADDR_LEN], ip1, ip2;
 	const uint8_t *ll_dest = ll_dest_buf;
@@ -244,7 +244,7 @@ static int ipv6_tx ( struct io_buffer *iobuf,
 			rc = 0;
 			
 			/* Handle extra bits in the prefix. */
-			if ( ( miniroute->prefix_len % 2 ) ||
+			if ( ( miniroute->prefix_len % 8 ) ||
 			     ( miniroute->prefix_len < 8 ) ) {
 				DBG ( "ipv6: prefix is not aligned to a byte.\n" );
 			
@@ -267,22 +267,27 @@ static int ipv6_tx ( struct io_buffer *iobuf,
 		if( rc == 0 ) {
 			netdev = miniroute->netdev;
 			ip6hdr->src = miniroute->address;
-			if ( ! ( IS_UNSPECIFIED ( miniroute->gateway ) ) ) {
-				DBG ( "    (via %s)\n", inet6_ntoa ( miniroute->gateway ) );
-				next_hop = miniroute->gateway;
-			}
 			break;
 		}
+		
+		if ( ( ! ( IP6_EQUAL ( miniroute->gateway, ip6_none ) ) ) &&
+		     ( IP6_EQUAL ( gateway, ip6_none ) ) ) {
+			netdev = miniroute->netdev;
+			ip6hdr->src = miniroute->address;
+			gateway = miniroute->gateway;
+		}
 	}
 	/* No network interface identified */
-	if ( !netdev ) {
+	if ( ( ! netdev ) ) {
 		DBG ( "No route to host %s\n", inet6_ntoa ( ip6hdr->dest ) );
 		rc = -ENETUNREACH;
 		goto err;
+	} else if ( ! IP6_EQUAL ( gateway, ip6_none ) ) {
+		next_hop = gateway;
 	}
 	
 	/* Add the next hop to the packet. */
-	ip6hdr->dest = next_hop;
+	ip6hdr->dest = dest->sin6_addr;
 
 	/* Complete the transport layer checksum */
 	if ( trans_csum )
-- 
1.7.2.5



More information about the gPXE-devel mailing list