]> git.puffer.fish Git - mirror/frr.git/commitdiff
Revert "lib: optimize apply_mask_ipv6()"
authorDenis Ovsienko <infrastation@yandex.ru>
Sun, 1 Jan 2012 12:33:12 +0000 (16:33 +0400)
committerDenis Ovsienko <infrastation@yandex.ru>
Sun, 1 Jan 2012 12:37:45 +0000 (16:37 +0400)
Experience with IPv4 counterpart of this function suggests, that
this way of type-punning is likely to cause errors.

lib/prefix.c

index c8fd0bd83d255f0abc6c1b1f93c70953d021baa0..1ddbbbe7e8df4dde578202bf23de9466c6e96efd 100644 (file)
@@ -660,13 +660,23 @@ masklen2ip6 (const int masklen, struct in6_addr *netmask)
 void
 apply_mask_ipv6 (struct prefix_ipv6 *p)
 {
-  assert (p->prefixlen >= 0 && p->prefixlen <= IPV6_MAX_BITLEN);
-  u_int32_t *addr_word = (u_int32_t *) &p->prefix;
-  u_int32_t *mask_word = (u_int32_t *) (maskbytes6 + p->prefixlen);
-  *addr_word++ &= *mask_word++;
-  *addr_word++ &= *mask_word++;
-  *addr_word++ &= *mask_word++;
-  *addr_word &= *mask_word;
+  u_char *pnt;
+  int index;
+  int offset;
+
+  index = p->prefixlen / 8;
+
+  if (index < 16)
+    {
+      pnt = (u_char *) &p->prefix;
+      offset = p->prefixlen % 8;
+
+      pnt[index] &= maskbit[offset];
+      index++;
+
+      while (index < 16)
+       pnt[index++] = 0;
+    }
 }
 
 void