]> git.proxmox.com Git - mirror_frr.git/commitdiff
lib: fix endianness bug in prefix.c
authorRenato Westphal <renatowestphal@gmail.com>
Fri, 23 Mar 2012 19:27:40 +0000 (16:27 -0300)
committerDavid Lamparter <equinox@diac24.net>
Fri, 23 Mar 2012 19:51:28 +0000 (20:51 +0100)
While defining two "maskbytes" arrays for the respective endiannesses,
the code was unconditionally using one that only worked on little endian
systems.

Use preprocessor macros to avoid the somewhat expensive
htonl/ntohl macros.

From: Renato Westphal <renatowestphal@gmail.com>
Signed-off-by: David Lamparter <equinox@diac24.net>
lib/prefix.c

index 5e8cff04b0c11973c2fc5c6887713c7a97835e94..fa2d2eb3b2fa854eb3bf27b9845cc94425a56913 100644 (file)
@@ -31,7 +31,7 @@
 /* Maskbit. */
 static const u_char maskbit[] = {0x00, 0x80, 0xc0, 0xe0, 0xf0,
                                 0xf8, 0xfc, 0xfe, 0xff};
-static const u_int32_t maskbytes_host[] =
+static const u_int32_t maskbytes_big_endian[] =
 {
   0x00000000, /* /0  0.0.0.0         */
   0x80000000, /* /1  128.0.0.0       */
@@ -67,7 +67,8 @@ static const u_int32_t maskbytes_host[] =
   0xfffffffe, /* /31 255.255.255.254 */
   0xffffffff  /* /32 255.255.255.255 */
 };
-static const u_int32_t maskbytes_network[] =
+
+static const u_int32_t maskbytes_little_endian[] =
 {
   0x00000000, /* /0  0.0.0.0         */
   0x00000080, /* /1  128.0.0.0       */
@@ -103,6 +104,7 @@ static const u_int32_t maskbytes_network[] =
   0xfeffffff, /* /31 255.255.255.254 */
   0xffffffff  /* /32 255.255.255.255 */
 };
+
 static const struct in6_addr maskbytes6[] =
 {
   /* /0   */ { { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } },
@@ -2599,7 +2601,11 @@ void
 masklen2ip (const int masklen, struct in_addr *netmask)
 {
   assert (masklen >= 0 && masklen <= IPV4_MAX_BITLEN);
-  netmask->s_addr = maskbytes_network[masklen];
+#if (BYTE_ORDER == LITTLE_ENDIAN)
+  netmask->s_addr = maskbytes_little_endian[masklen];
+#elif (BYTE_ORDER == BIG_ENDIAN)
+  netmask->s_addr = maskbytes_big_endian[masklen];
+#endif
 }
 
 /* Convert IP address's netmask into integer. We assume netmask is
@@ -2621,7 +2627,11 @@ void
 apply_mask_ipv4 (struct prefix_ipv4 *p)
 {
   assert (p->prefixlen >= 0 && p->prefixlen <= IPV4_MAX_BITLEN);
-  p->prefix.s_addr &= maskbytes_network[p->prefixlen];
+#if (BYTE_ORDER == LITTLE_ENDIAN)
+  p->prefix.s_addr &= maskbytes_little_endian[p->prefixlen];
+#elif (BYTE_ORDER == BIG_ENDIAN)
+  p->prefix.s_addr &= maskbytes_big_endian[p->prefixlen];
+#endif
 }
 
 /* If prefix is 0.0.0.0/0 then return 1 else return 0. */