summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Ovsienko <infrastation@yandex.ru>2011-10-18 22:02:52 +0400
committerDenis Ovsienko <infrastation@yandex.ru>2011-12-13 19:30:49 +0400
commit32ca97392057d279eeddd1aef36c1836880e8b89 (patch)
tree64aaa4d3554429a613cf02a84412e2007f793819
parentcaff7905e2d28e4d5e25c0a4ffacbb22e28a7121 (diff)
lib: optimize apply_mask_ipv6()
-rw-r--r--lib/prefix.c24
1 files changed, 7 insertions, 17 deletions
diff --git a/lib/prefix.c b/lib/prefix.c
index 1ddbbbe7..c8fd0bd8 100644
--- a/lib/prefix.c
+++ b/lib/prefix.c
@@ -660,23 +660,13 @@ masklen2ip6 (const int masklen, struct in6_addr *netmask)
void
apply_mask_ipv6 (struct prefix_ipv6 *p)
{
- 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;
- }
+ 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;
}
void