diff options
author | Michael Brown <mcb30@ipxe.org> | 2013-11-08 15:52:07 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2013-11-14 12:35:43 +0000 |
commit | 95623e353bc09981c438ba53d863ffd572ddf85e (patch) | |
tree | 81fd99730bcd46236ae6574aa6fa50ad96229ffd | |
parent | 4484edd1c0bd4f62c75f0db517e2747039816e4c (diff) | |
download | ipxe-95623e353bc09981c438ba53d863ffd572ddf85e.zip ipxe-95623e353bc09981c438ba53d863ffd572ddf85e.tar.gz ipxe-95623e353bc09981c438ba53d863ffd572ddf85e.tar.bz2 |
[ipv6] Use given source address only if it is not the unspecified address
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/include/ipxe/in.h | 6 | ||||
-rw-r--r-- | src/net/ipv6.c | 2 |
2 files changed, 7 insertions, 1 deletions
diff --git a/src/include/ipxe/in.h b/src/include/ipxe/in.h index a37784e..0f19bbd 100644 --- a/src/include/ipxe/in.h +++ b/src/include/ipxe/in.h @@ -50,6 +50,12 @@ struct in6_addr { #define s6_addr32 in6_u.u6_addr32 }; +#define IN6_IS_ADDR_UNSPECIFIED( addr ) \ + ( ( ( ( ( const uint32_t * ) (addr) )[0] ) | \ + ( ( ( const uint32_t * ) (addr) )[1] ) | \ + ( ( ( const uint32_t * ) (addr) )[2] ) | \ + ( ( ( const uint32_t * ) (addr) )[3] ) ) == 0 ) + #define IN6_IS_ADDR_MULTICAST( addr ) \ ( *( ( const uint8_t * ) (addr) ) == 0xff ) diff --git a/src/net/ipv6.c b/src/net/ipv6.c index 8279f05..abe993d 100644 --- a/src/net/ipv6.c +++ b/src/net/ipv6.c @@ -399,7 +399,7 @@ static int ipv6_tx ( struct io_buffer *iobuf, rc = -ENETUNREACH; goto err; } - if ( sin6_src ) + if ( sin6_src && ! IN6_IS_ADDR_UNSPECIFIED ( &sin6_src->sin6_addr ) ) src = &sin6_src->sin6_addr; memcpy ( &iphdr->src, src, sizeof ( iphdr->src ) ); |