1 /* Copyright 2007 Sven Wegener <sven.wegener@stealer.net>
3 * This program is free software; you can redistribute it and/or modify it
4 * under the terms of the GNU General Public License as published by the Free
5 * Software Foundation; either version 2 of the License, or (at your option)
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * You should have received a copy of the GNU General Public License along with
14 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
15 * Place, Suite 330, Boston, MA 02111-1307 USA
20 #include <sys/socket.h>
21 #include <netinet/in.h>
22 #include <arpa/inet.h>
24 #include <linux/netfilter_ipv4/ip_set_iptreemap.h>
28 #define OPT_CREATE_GC 0x1
31 create_init(void *data)
33 struct ip_set_req_iptreemap_create *mydata = (struct ip_set_req_iptreemap_create *) data;
35 mydata->gc_interval = 0;
39 create_parse(int c, char *argv[], void *data, unsigned int *flags)
41 struct ip_set_req_iptreemap_create *mydata = (struct ip_set_req_iptreemap_create *) data;
45 string_to_number(optarg, 0, UINT_MAX, &mydata->gc_interval);
47 *flags |= OPT_CREATE_GC;
58 create_final(void *data, unsigned int flags)
62 static struct option create_opts[] = {
68 adt_parser(unsigned int cmd, const char *optarg, void *data)
70 struct ip_set_req_iptreemap *mydata = (struct ip_set_req_iptreemap *) data;
73 char *saved = ipset_strdup(optarg);
74 char *ptr, *tmp = saved;
76 if (strchr(tmp, '/')) {
77 parse_ipandmask(tmp, &mydata->start, &mask);
78 mydata->end = mydata->start | ~mask;
80 ptr = strsep(&tmp, ":");
81 parse_ip(ptr, &mydata->start);
84 parse_ip(tmp, &mydata->end);
86 mydata->end = mydata->start;
94 initheader(struct set *set, const void *data)
96 struct ip_set_req_iptreemap_create *header = (struct ip_set_req_iptreemap_create *) data;
97 struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->settype->header;
99 map->gc_interval = header->gc_interval;
103 printheader(struct set *set, unsigned int options)
105 struct ip_set_iptreemap *mysetdata = (struct ip_set_iptreemap *) set->settype->header;
107 if (mysetdata->gc_interval)
108 printf(" gc: %u", mysetdata->gc_interval);
114 printips_sorted(struct set *set, void *data, size_t len, unsigned int options)
116 struct ip_set_req_iptreemap *req;
119 while (len >= offset + sizeof(struct ip_set_req_iptreemap)) {
120 req = (struct ip_set_req_iptreemap *) (data + offset);
122 printf("%s", ip_tostring(req->start, options));
123 if (req->start != req->end)
124 printf(":%s", ip_tostring(req->end, options));
127 offset += sizeof(struct ip_set_req_iptreemap);
132 saveheader(struct set *set, unsigned int options)
134 struct ip_set_iptreemap *mysetdata = (struct ip_set_iptreemap *) set->settype->header;
136 printf("-N %s %s", set->name, set->settype->typename);
138 if (mysetdata->gc_interval)
139 printf(" --gc %u", mysetdata->gc_interval);
145 saveips(struct set *set, void *data, size_t len, unsigned int options)
147 struct ip_set_req_iptreemap *req;
150 while (len >= offset + sizeof(struct ip_set_req_iptreemap)) {
151 req = (struct ip_set_req_iptreemap *) (data + offset);
153 printf("-A %s %s", set->name, ip_tostring(req->start, options));
155 if (req->start != req->end)
156 printf(":%s", ip_tostring(req->end, options));
160 offset += sizeof(struct ip_set_req_iptreemap);
168 "-N set iptreemap --gc interval\n"
175 static struct settype settype_iptreemap = {
176 .typename = SETTYPE_NAME,
177 .protocol_version = IP_SET_PROTOCOL_VERSION,
179 .create_size = sizeof(struct ip_set_req_iptreemap_create),
180 .create_init = &create_init,
181 .create_parse = &create_parse,
182 .create_final = &create_final,
183 .create_opts = create_opts,
185 .adt_size = sizeof(struct ip_set_req_iptreemap),
186 .adt_parser = &adt_parser,
188 .header_size = sizeof(struct ip_set_iptreemap),
189 .initheader = &initheader,
190 .printheader = &printheader,
191 .printips = &printips_sorted,
192 .printips_sorted = &printips_sorted,
193 .saveheader = &saveheader,
196 .bindip_tostring = &binding_ip_tostring,
197 .bindip_parse = &parse_ip,
205 settype_register(&settype_iptreemap);