summaryrefslogtreecommitdiffstats
path: root/net/netfilter/ipset/pfxlen.c
diff options
context:
space:
mode:
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>2011-06-16 18:52:41 +0200
committerPatrick McHardy <kaber@trash.net>2011-06-16 18:52:41 +0200
commitd0d9e0a5a8db05b2179c2ffb25d1c2850cce3c8e (patch)
tree16be0164e378226c7603838ded9bcf3fd4041692 /net/netfilter/ipset/pfxlen.c
parentf1e00b39797944bf25addaf543839feeb25fbdc5 (diff)
downloadop-kernel-dev-d0d9e0a5a8db05b2179c2ffb25d1c2850cce3c8e.zip
op-kernel-dev-d0d9e0a5a8db05b2179c2ffb25d1c2850cce3c8e.tar.gz
netfilter: ipset: support range for IPv4 at adding/deleting elements for hash:*net* types
The range internally is converted to the network(s) equal to the range. Example: # ipset new test hash:net # ipset add test 10.2.0.0-10.2.1.12 # ipset list test Name: test Type: hash:net Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16888 References: 0 Members: 10.2.1.12 10.2.1.0/29 10.2.0.0/24 10.2.1.8/30 Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'net/netfilter/ipset/pfxlen.c')
-rw-r--r--net/netfilter/ipset/pfxlen.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/net/netfilter/ipset/pfxlen.c b/net/netfilter/ipset/pfxlen.c
index 23f8c81..b57a856 100644
--- a/net/netfilter/ipset/pfxlen.c
+++ b/net/netfilter/ipset/pfxlen.c
@@ -289,3 +289,24 @@ const union nf_inet_addr ip_set_hostmask_map[] = {
E(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF),
};
EXPORT_SYMBOL_GPL(ip_set_hostmask_map);
+
+/* Find the largest network which matches the range from left, in host order. */
+u32
+ip_set_range_to_cidr(u32 from, u32 to, u8 *cidr)
+{
+ u32 last;
+ u8 i;
+
+ for (i = 1; i < 32; i++) {
+ if ((from & ip_set_hostmask(i)) != from)
+ continue;
+ last = from | ~ip_set_hostmask(i);
+ if (!after(last, to)) {
+ *cidr = i;
+ return last;
+ }
+ }
+ *cidr = 32;
+ return from;
+}
+EXPORT_SYMBOL_GPL(ip_set_range_to_cidr);
OpenPOWER on IntegriCloud