diff options
author | Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> | 2011-05-15 12:04:19 +0200 |
---|---|---|
committer | Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> | 2011-05-15 12:04:19 +0200 |
commit | bb4f6b818fe371b754abd61cffb97cb5145e8e1d (patch) | |
tree | 34fb558facd8bc4ca1f1cdda8cc62eb4fd929e6f /lib/data.c | |
parent | 774c80b578172aa7797ea60264e8a929302d5e83 (diff) |
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
Diffstat (limited to 'lib/data.c')
-rw-r--r-- | lib/data.c | 9 |
1 files changed, 9 insertions, 0 deletions
@@ -66,6 +66,7 @@ struct ipset_data { /* ADT/LIST/SAVE */ struct { union nf_inet_addr ip2; + union nf_inet_addr ip2_to; uint8_t cidr2; uint8_t proto; char ether[ETH_ALEN]; @@ -289,6 +290,11 @@ ipset_data_set(struct ipset_data *data, enum ipset_opt opt, const void *value) return -1; copy_addr(data->family, &data->adt.ip2, value); break; + case IPSET_OPT_IP2_TO: + if (!(data->family == AF_INET || data->family == AF_INET6)) + return -1; + copy_addr(data->family, &data->adt.ip2_to, value); + break; case IPSET_OPT_CIDR2: data->adt.cidr2 = *(const uint8_t *) value; break; @@ -401,6 +407,8 @@ ipset_data_get(const struct ipset_data *data, enum ipset_opt opt) return data->adt.nameref; case IPSET_OPT_IP2: return &data->adt.ip2; + case IPSET_OPT_IP2_TO: + return &data->adt.ip2_to; case IPSET_OPT_CIDR2: return &data->adt.cidr2; case IPSET_OPT_PROTO: @@ -436,6 +444,7 @@ ipset_data_sizeof(enum ipset_opt opt, uint8_t family) case IPSET_OPT_IP: case IPSET_OPT_IP_TO: case IPSET_OPT_IP2: + case IPSET_OPT_IP2_TO: return family == AF_INET ? sizeof(uint32_t) : sizeof(struct in6_addr); case IPSET_OPT_PORT: |