[NETFILTER]: Move ip6_masked_addrcmp to include/net/ipv6.h
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>
This commit is contained in:
committed by
David S. Miller
parent
c498673474
commit
f2ffd9eeda
@@ -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));
|
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)
|
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));
|
memcpy((void *) a1, (const void *) a2, sizeof(struct in6_addr));
|
||||||
|
@@ -94,19 +94,6 @@ do { \
|
|||||||
#define up(x) do { printk("UP:%u:" #x "\n", __LINE__); up(x); } while(0)
|
#define up(x) do { printk("UP:%u:" #x "\n", __LINE__); up(x); } while(0)
|
||||||
#endif
|
#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 */
|
/* Check for an extension */
|
||||||
int
|
int
|
||||||
ip6t_ext_hdr(u8 nexthdr)
|
ip6t_ext_hdr(u8 nexthdr)
|
||||||
@@ -135,9 +122,9 @@ ip6_packet_match(const struct sk_buff *skb,
|
|||||||
|
|
||||||
#define FWINV(bool,invflg) ((bool) ^ !!(ip6info->invflags & invflg))
|
#define FWINV(bool,invflg) ((bool) ^ !!(ip6info->invflags & invflg))
|
||||||
|
|
||||||
if (FWINV(ip6_masked_addrcmp(&ipv6->saddr, &ip6info->smsk,
|
if (FWINV(ipv6_masked_addr_cmp(&ipv6->saddr, &ip6info->smsk,
|
||||||
&ip6info->src), IP6T_INV_SRCIP)
|
&ip6info->src), IP6T_INV_SRCIP)
|
||||||
|| FWINV(ip6_masked_addrcmp(&ipv6->daddr, &ip6info->dmsk,
|
|| FWINV(ipv6_masked_addr_cmp(&ipv6->daddr, &ip6info->dmsk,
|
||||||
&ip6info->dst), IP6T_INV_DSTIP)) {
|
&ip6info->dst), IP6T_INV_DSTIP)) {
|
||||||
dprintf("Source or dest mismatch.\n");
|
dprintf("Source or dest mismatch.\n");
|
||||||
/*
|
/*
|
||||||
@@ -1526,7 +1513,6 @@ EXPORT_SYMBOL(ip6t_unregister_table);
|
|||||||
EXPORT_SYMBOL(ip6t_do_table);
|
EXPORT_SYMBOL(ip6t_do_table);
|
||||||
EXPORT_SYMBOL(ip6t_ext_hdr);
|
EXPORT_SYMBOL(ip6t_ext_hdr);
|
||||||
EXPORT_SYMBOL(ipv6_find_hdr);
|
EXPORT_SYMBOL(ipv6_find_hdr);
|
||||||
EXPORT_SYMBOL(ip6_masked_addrcmp);
|
|
||||||
|
|
||||||
module_init(init);
|
module_init(init);
|
||||||
module_exit(fini);
|
module_exit(fini);
|
||||||
|
@@ -27,7 +27,8 @@ static inline int
|
|||||||
match_xfrm_state(struct xfrm_state *x, const struct ip6t_policy_elem *e)
|
match_xfrm_state(struct xfrm_state *x, const struct ip6t_policy_elem *e)
|
||||||
{
|
{
|
||||||
#define MATCH_ADDR(x,y,z) (!e->match.x || \
|
#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))
|
^ e->invert.x))
|
||||||
#define MATCH(x,y) (!e->match.x || ((e->x == (y)) ^ e->invert.x))
|
#define MATCH(x,y) (!e->match.x || ((e->x == (y)) ^ e->invert.x))
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user