]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[ipv6] Fix definition of IN6_IS_ADDR_LINKLOCAL()
authorMichael Brown <mcb30@ipxe.org>
Wed, 21 May 2014 16:51:31 +0000 (17:51 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 21 May 2014 16:53:02 +0000 (17:53 +0100)
Fix an erroneous htonl() in the definition of IN6_IS_ADDR_LINKLOCAL(),
and add self-tests for the IN6_IS_ADDR_xxx() family of macros.

Reported-by: Marin Hannache <git@mareo.fr>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/in.h
src/tests/ipv6_test.c

index 36032470c7680ec3c1c40adc934e3b74d393e33a..de96ca22a3cb565168a3b30107813b11da819254 100644 (file)
@@ -61,7 +61,7 @@ struct in6_addr {
 
 #define IN6_IS_ADDR_LINKLOCAL( addr )                                  \
        ( ( *( ( const uint16_t * ) (addr) ) & htons ( 0xffc0 ) ) ==    \
-         htonl ( 0xfe80 ) )
+         htons ( 0xfe80 ) )
 
 /**
  * IPv4 socket address
index 4de310ab00e2bced6113b7af19369c01d9b0f34d..e16fc7c3df2ab85a2b1c57ba02da58c5f3d87ef2 100644 (file)
@@ -37,6 +37,30 @@ FILE_LICENCE ( GPL2_OR_LATER );
 /** Define inline IPv6 address */
 #define IPV6(...) { __VA_ARGS__ }
 
+/** The unspecified IPv6 address */
+static const struct in6_addr sample_unspecified = {
+       .s6_addr = IPV6 ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ),
+};
+
+/** A sample link-local IPv6 address */
+static const struct in6_addr sample_link_local = {
+       .s6_addr = IPV6 ( 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                         0x00, 0x00, 0x69, 0xff, 0xfe, 0x50, 0x58, 0x45 ),
+};
+
+/** A sample global IPv6 address */
+static const struct in6_addr sample_global = {
+       .s6_addr = IPV6 ( 0x20, 0x01, 0x0b, 0xa8, 0x00, 0x00, 0x01, 0xd4,
+                         0x00, 0x00, 0x00, 0x00, 0x69, 0x50, 0x58, 0x45 ),
+};
+
+/** A sample multicast IPv6 address */
+static const struct in6_addr sample_multicast = {
+       .s6_addr = IPV6 ( 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 ),
+};
+
 /**
  * Report an inet6_ntoa() test result
  *
@@ -97,6 +121,20 @@ FILE_LICENCE ( GPL2_OR_LATER );
  */
 static void ipv6_test_exec ( void ) {
 
+       /* Address testing macros */
+       ok (   IN6_IS_ADDR_UNSPECIFIED ( &sample_unspecified ) );
+       ok ( ! IN6_IS_ADDR_UNSPECIFIED ( &sample_link_local ) );
+       ok ( ! IN6_IS_ADDR_UNSPECIFIED ( &sample_global ) );
+       ok ( ! IN6_IS_ADDR_UNSPECIFIED ( &sample_multicast ) );
+       ok ( ! IN6_IS_ADDR_MULTICAST ( &sample_unspecified ) );
+       ok ( ! IN6_IS_ADDR_MULTICAST ( &sample_link_local ) );
+       ok ( ! IN6_IS_ADDR_MULTICAST ( &sample_global ) );
+       ok (   IN6_IS_ADDR_MULTICAST ( &sample_multicast ) );
+       ok ( ! IN6_IS_ADDR_LINKLOCAL ( &sample_unspecified ) );
+       ok (   IN6_IS_ADDR_LINKLOCAL ( &sample_link_local ) );
+       ok ( ! IN6_IS_ADDR_LINKLOCAL ( &sample_global ) );
+       ok ( ! IN6_IS_ADDR_LINKLOCAL ( &sample_multicast ) );
+
        /* inet6_ntoa() tests */
        inet6_ntoa_ok ( IPV6 ( 0x20, 0x01, 0x0b, 0xa8, 0x00, 0x00, 0x01, 0xd4,
                               0x00, 0x00, 0x00, 0x00, 0x69, 0x50, 0x58, 0x45 ),