Some host/network byte order quirks
authorSven-Ola Tuecke <sven-ola@gmx.de>
Thu, 18 Mar 2010 07:37:36 +0000 (08:37 +0100)
committerSven-Ola Tuecke <sven-ola@gmx.de>
Thu, 18 Mar 2010 07:37:36 +0000 (08:37 +0100)
src/ipcalc.c
src/ipcalc.h

index 08c52f2..2330139 100644 (file)
@@ -68,6 +68,7 @@ const union olsr_ip_addr ipv6_def_multicast = {
     .v6.s6_addr = { 0xFF, 0x02, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0x6D }
 };
 
+/* Host-byte-order! */
 int
 prefix_to_netmask(uint8_t * a, int len, uint8_t prefixlen)
 {
@@ -206,14 +207,14 @@ olsr_string_to_prefix(int ipversion, struct olsr_ip_prefix *dst, const char *str
 }
 
 /* see if the ipaddr is in the net. That is equivalent to the fact that the net part
- * of both are equal. So we must compare the first <prefixlen> bits.
+ * of both are equal. So we must compare the first <prefixlen> bits. Network-byte-order!
  */
 int
 ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net)
 {
   int rv;
   if (olsr_cnf->ip_version == AF_INET) {
-    uint32_t netmask = prefix_to_netmask4(net->prefix_len);
+    uint32_t netmask = htonl(prefix_to_netmask4(net->prefix_len));
     rv = (ipaddr->v4.s_addr & netmask) == (net->prefix.v4.s_addr & netmask);
   } else {
     /* IPv6 */
@@ -230,7 +231,7 @@ ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net)
       n++;
     }
     /* And the remaining is the same as in the IPv4 case */
-    netmask = prefix_to_netmask4(prefix_len);
+    netmask = htonl(prefix_to_netmask4(prefix_len));
     rv = (*i & netmask) == (*n & netmask);
   }
   return rv;
index 3480cc5..79ae002 100644 (file)
@@ -161,12 +161,12 @@ sockaddr4_to_string(struct ipaddr_str *const buf, const struct sockaddr *const a
 
 /* 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 network-byte-order.
+ * The result is in host-byte-order.
  */
 static INLINE uint32_t
 prefix_to_netmask4(uint8_t prefixlen)
 {
-  return prefixlen == 0 ? 0 : (~0U >> (32 - prefixlen));
+  return prefixlen == 0 ? 0 : (~0U << (32 - prefixlen));
 }
 
 static INLINE bool