Re-added and corrected bernds fix - it does not need ntohl in ipc
authorSven-Ola Tuecke <sven-ola@gmx.de>
Mon, 1 Dec 2008 23:21:14 +0000 (00:21 +0100)
committerSven-Ola Tuecke <sven-ola@gmx.de>
Mon, 1 Dec 2008 23:21:14 +0000 (00:21 +0100)
lib/quagga/test/quagga.try1.c
src/ipcalc.c
src/ipcalc.h

index a617742..094e456 100644 (file)
@@ -543,7 +543,7 @@ static uint32_t
 prefixlentomask(uint8_t prefix)
 {
   uint32_t mask;
-  mask = 0xffffffff << (32 - prefix);
+  mask = prefix_to_netmask4(prefix);
   mask = ntohl(mask);
   return mask;
 }
index 4a0e19a..4def93a 100644 (file)
@@ -157,7 +157,7 @@ ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net)
 {
   int rv;
   if (olsr_cnf->ip_version == AF_INET) {
-    olsr_u32_t netmask = ~0 << (32 - net->prefix_len);
+    olsr_u32_t netmask = prefix_to_netmask4(net->prefix_len);
     rv = (ipaddr->v4.s_addr & netmask) == (net->prefix.v4.s_addr & netmask);
   } else {
     /* IPv6 */
@@ -165,6 +165,7 @@ ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net)
     const olsr_u32_t *i = (const olsr_u32_t *)&ipaddr->v6;
     const olsr_u32_t *n = (const olsr_u32_t *)&net->prefix.v6;
     unsigned int prefix_len;
+    /* First we compare whole unsigned int's */
     for (prefix_len = net->prefix_len; prefix_len > 32; prefix_len -= 32) {
       if (*i != *n) {
         return OLSR_FALSE;
@@ -172,7 +173,8 @@ ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net)
       i++;
       n++;
     }
-    netmask = ~0 << (32 - prefix_len);
+    /* And the remaining is the same as in the IPv4 case */
+    netmask = prefix_to_netmask4(prefix_len);
     rv = (*i & netmask) == (*n & netmask);
   }
   return rv;
index 315750d..55134d7 100644 (file)
@@ -155,6 +155,15 @@ sockaddr4_to_string(struct ipaddr_str *const buf, const struct sockaddr *const a
   return ip4_to_string(buf, addr4->sin_addr);
 }
 
+/* we need to handle one value specifically since shifting 32 bits of a 32 bit integer is the same as shifting 0 bits.
+ * The result is in host-byte-order.
+ */
+static INLINE olsr_u32_t
+prefix_to_netmask4(olsr_u8_t prefixlen)
+{
+  return prefixlen == 0 ? 0 : (~0U << (32 - prefixlen));
+}
+
 #endif
 
 /*