[NETFILTER]: Move ip6_masked_addrcmp to include/net/ipv6.h
authorPatrick McHardy <kaber@trash.net>
Tue, 21 Mar 2006 02:03:16 +0000 (18:03 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 21 Mar 2006 02:03:16 +0000 (18:03 -0800)
Replace netfilter's ip6_masked_addrcmp by a more efficient version
in include/net/ipv6.h to make it usable without module dependencies.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ipv6.h
net/ipv6/netfilter/ip6_tables.c
net/ipv6/netfilter/ip6t_policy.c

index 3b1d963d396caacb46c5be018aac0a89ea82d4a2..c893a1ce4b3941fcfb302b0753cf91bcccb8d9d7 100644 (file)
@@ -282,6 +282,18 @@ static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr
        return memcmp((const void *) a1, (const void *) a2, sizeof(struct in6_addr));
 }
 
+static inline int
+ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m,
+                    const struct in6_addr *a2)
+{
+       unsigned int i;
+
+       for (i = 0; i < 4; i++)
+               if ((a1->s6_addr32[i] ^ a2->s6_addr32[i]) & m->s6_addr32[i])
+                       return 1;
+       return 0;
+}
+
 static inline void ipv6_addr_copy(struct in6_addr *a1, const struct in6_addr *a2)
 {
        memcpy((void *) a1, (const void *) a2, sizeof(struct in6_addr));
index b75f8fdc3afe5c245b2f608614ff07e091ab0252..d74ec335743e1f328a3addd7c004cba9c2c1c989 100644 (file)
@@ -94,19 +94,6 @@ do {                                                         \
 #define up(x) do { printk("UP:%u:" #x "\n", __LINE__); up(x); } while(0)
 #endif
 
-int
-ip6_masked_addrcmp(const struct in6_addr *addr1, const struct in6_addr *mask,
-                   const struct in6_addr *addr2)
-{
-       int i;
-       for( i = 0; i < 16; i++){
-               if((addr1->s6_addr[i] & mask->s6_addr[i]) != 
-                  (addr2->s6_addr[i] & mask->s6_addr[i]))
-                       return 1;
-       }
-       return 0;
-}
-
 /* Check for an extension */
 int 
 ip6t_ext_hdr(u8 nexthdr)
@@ -135,10 +122,10 @@ ip6_packet_match(const struct sk_buff *skb,
 
 #define FWINV(bool,invflg) ((bool) ^ !!(ip6info->invflags & invflg))
 
-       if (FWINV(ip6_masked_addrcmp(&ipv6->saddr, &ip6info->smsk,
-                                    &ip6info->src), IP6T_INV_SRCIP)
-           || FWINV(ip6_masked_addrcmp(&ipv6->daddr, &ip6info->dmsk,
-                                       &ip6info->dst), IP6T_INV_DSTIP)) {
+       if (FWINV(ipv6_masked_addr_cmp(&ipv6->saddr, &ip6info->smsk,
+                                      &ip6info->src), IP6T_INV_SRCIP)
+           || FWINV(ipv6_masked_addr_cmp(&ipv6->daddr, &ip6info->dmsk,
+                                         &ip6info->dst), IP6T_INV_DSTIP)) {
                dprintf("Source or dest mismatch.\n");
 /*
                dprintf("SRC: %u. Mask: %u. Target: %u.%s\n", ip->saddr,
@@ -1526,7 +1513,6 @@ EXPORT_SYMBOL(ip6t_unregister_table);
 EXPORT_SYMBOL(ip6t_do_table);
 EXPORT_SYMBOL(ip6t_ext_hdr);
 EXPORT_SYMBOL(ipv6_find_hdr);
-EXPORT_SYMBOL(ip6_masked_addrcmp);
 
 module_init(init);
 module_exit(fini);
index b2f30072ca6e5cf23b9793eea011c221e8e7ef7f..f2a59970e0076241e249d9e52f6c82ded5102ec1 100644 (file)
@@ -27,7 +27,8 @@ static inline int
 match_xfrm_state(struct xfrm_state *x, const struct ip6t_policy_elem *e)
 {
 #define MATCH_ADDR(x,y,z)      (!e->match.x ||                                \
-                                ((!ip6_masked_addrcmp(&e->x.a6, &e->y.a6, z)) \
+                                ((!ipv6_masked_addr_cmp(&e->x.a6, &e->y.a6,   \
+                                                        z))                   \
                                  ^ e->invert.x))
 #define MATCH(x,y)             (!e->match.x || ((e->x == (y)) ^ e->invert.x))