]> granicus.if.org Git - ipset/blob - lib/ipset_bitmap_ipmac.c
Userspace revision handling is reworked
[ipset] / lib / ipset_bitmap_ipmac.c
1 /* Copyright 2007-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu)
2  *
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License version 2 as
5  * published by the Free Software Foundation.
6  */
7 #include <libipset/data.h>                      /* IPSET_OPT_* */
8 #include <libipset/parse.h>                     /* parser functions */
9 #include <libipset/print.h>                     /* printing functions */
10 #include <libipset/types.h>                     /* prototypes */
11
12 /* Initial release */
13 static struct ipset_type ipset_bitmap_ipmac0 = {
14         .name = "bitmap:ip,mac",
15         .alias = { "macipmap", NULL },
16         .revision = 0,
17         .family = NFPROTO_IPV4,
18         .dimension = IPSET_DIM_TWO,
19         .last_elem_optional = true,
20         .elem = {
21                 [IPSET_DIM_ONE - 1] = {
22                         .parse = ipset_parse_single_ip,
23                         .print = ipset_print_ip,
24                         .opt = IPSET_OPT_IP
25                 },
26                 [IPSET_DIM_TWO - 1] = {
27                         .parse = ipset_parse_ether,
28                         .print = ipset_print_ether,
29                         .opt = IPSET_OPT_ETHER
30                 },
31         },
32         .cmd = {
33                 [IPSET_CREATE] = {
34                         .args = {
35                                 IPSET_ARG_IPRANGE,
36                                 IPSET_ARG_TIMEOUT,
37                                 /* Backward compatibility */
38                                 IPSET_ARG_FROM_IP,
39                                 IPSET_ARG_TO_IP,
40                                 IPSET_ARG_NETWORK,
41                                 IPSET_ARG_NONE,
42                         },
43                         .need = IPSET_FLAG(IPSET_OPT_IP)
44                                 | IPSET_FLAG(IPSET_OPT_IP_TO),
45                         .full = IPSET_FLAG(IPSET_OPT_IP)
46                                 | IPSET_FLAG(IPSET_OPT_IP_TO),
47                         .help = "range IP/CIDR|FROM-TO",
48                 },
49                 [IPSET_ADD] = {
50                         .args = {
51                                 IPSET_ARG_TIMEOUT,
52                                 IPSET_ARG_NONE,
53                         },
54                         .need = IPSET_FLAG(IPSET_OPT_IP),
55                         .full = IPSET_FLAG(IPSET_OPT_IP)
56                                 | IPSET_FLAG(IPSET_OPT_ETHER),
57                         .help = "IP[,MAC]",
58                 },
59                 [IPSET_DEL] = {
60                         .args = {
61                                 IPSET_ARG_NONE,
62                         },
63                         .need = IPSET_FLAG(IPSET_OPT_IP),
64                         .full = IPSET_FLAG(IPSET_OPT_IP)
65                                 | IPSET_FLAG(IPSET_OPT_ETHER),
66                         .help = "IP[,MAC]",
67                 },
68                 [IPSET_TEST] = {
69                         .args = {
70                                 IPSET_ARG_NONE,
71                         },
72                         .need = IPSET_FLAG(IPSET_OPT_IP),
73                         .full = IPSET_FLAG(IPSET_OPT_IP)
74                                 | IPSET_FLAG(IPSET_OPT_ETHER),
75                         .help = "IP[,MAC]",
76                 },
77         },
78         .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n"
79                  "      CIDR is a valid IPv4 CIDR prefix.\n"
80                  "      MAC is a valid MAC address.",
81         .description = "Initial revision",
82 };
83
84 /* Counters support */
85 static struct ipset_type ipset_bitmap_ipmac1 = {
86         .name = "bitmap:ip,mac",
87         .alias = { "macipmap", NULL },
88         .revision = 1,
89         .family = NFPROTO_IPV4,
90         .dimension = IPSET_DIM_TWO,
91         .last_elem_optional = true,
92         .elem = {
93                 [IPSET_DIM_ONE - 1] = {
94                         .parse = ipset_parse_single_ip,
95                         .print = ipset_print_ip,
96                         .opt = IPSET_OPT_IP
97                 },
98                 [IPSET_DIM_TWO - 1] = {
99                         .parse = ipset_parse_ether,
100                         .print = ipset_print_ether,
101                         .opt = IPSET_OPT_ETHER
102                 },
103         },
104         .cmd = {
105                 [IPSET_CREATE] = {
106                         .args = {
107                                 IPSET_ARG_IPRANGE,
108                                 IPSET_ARG_TIMEOUT,
109                                 IPSET_ARG_COUNTERS,
110                                 /* Backward compatibility */
111                                 IPSET_ARG_FROM_IP,
112                                 IPSET_ARG_TO_IP,
113                                 IPSET_ARG_NETWORK,
114                                 IPSET_ARG_NONE,
115                         },
116                         .need = IPSET_FLAG(IPSET_OPT_IP)
117                                 | IPSET_FLAG(IPSET_OPT_IP_TO),
118                         .full = IPSET_FLAG(IPSET_OPT_IP)
119                                 | IPSET_FLAG(IPSET_OPT_IP_TO),
120                         .help = "range IP/CIDR|FROM-TO",
121                 },
122                 [IPSET_ADD] = {
123                         .args = {
124                                 IPSET_ARG_TIMEOUT,
125                                 IPSET_ARG_PACKETS,
126                                 IPSET_ARG_BYTES,
127                                 IPSET_ARG_NONE,
128                         },
129                         .need = IPSET_FLAG(IPSET_OPT_IP),
130                         .full = IPSET_FLAG(IPSET_OPT_IP)
131                                 | IPSET_FLAG(IPSET_OPT_ETHER),
132                         .help = "IP[,MAC]",
133                 },
134                 [IPSET_DEL] = {
135                         .args = {
136                                 IPSET_ARG_NONE,
137                         },
138                         .need = IPSET_FLAG(IPSET_OPT_IP),
139                         .full = IPSET_FLAG(IPSET_OPT_IP)
140                                 | IPSET_FLAG(IPSET_OPT_ETHER),
141                         .help = "IP[,MAC]",
142                 },
143                 [IPSET_TEST] = {
144                         .args = {
145                                 IPSET_ARG_NONE,
146                         },
147                         .need = IPSET_FLAG(IPSET_OPT_IP),
148                         .full = IPSET_FLAG(IPSET_OPT_IP)
149                                 | IPSET_FLAG(IPSET_OPT_ETHER),
150                         .help = "IP[,MAC]",
151                 },
152         },
153         .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n"
154                  "      CIDR is a valid IPv4 CIDR prefix.\n"
155                  "      MAC is a valid MAC address.",
156         .description = "counters support",
157 };
158
159 /* Comment support */
160 static struct ipset_type ipset_bitmap_ipmac2 = {
161         .name = "bitmap:ip,mac",
162         .alias = { "macipmap", NULL },
163         .revision = 2,
164         .family = NFPROTO_IPV4,
165         .dimension = IPSET_DIM_TWO,
166         .last_elem_optional = true,
167         .elem = {
168                 [IPSET_DIM_ONE - 1] = {
169                         .parse = ipset_parse_single_ip,
170                         .print = ipset_print_ip,
171                         .opt = IPSET_OPT_IP
172                 },
173                 [IPSET_DIM_TWO - 1] = {
174                         .parse = ipset_parse_ether,
175                         .print = ipset_print_ether,
176                         .opt = IPSET_OPT_ETHER
177                 },
178         },
179         .cmd = {
180                 [IPSET_CREATE] = {
181                         .args = {
182                                 IPSET_ARG_IPRANGE,
183                                 IPSET_ARG_TIMEOUT,
184                                 IPSET_ARG_COUNTERS,
185                                 IPSET_ARG_COMMENT,
186                                 /* Backward compatibility */
187                                 IPSET_ARG_FROM_IP,
188                                 IPSET_ARG_TO_IP,
189                                 IPSET_ARG_NETWORK,
190                                 IPSET_ARG_NONE,
191                         },
192                         .need = IPSET_FLAG(IPSET_OPT_IP)
193                                 | IPSET_FLAG(IPSET_OPT_IP_TO),
194                         .full = IPSET_FLAG(IPSET_OPT_IP)
195                                 | IPSET_FLAG(IPSET_OPT_IP_TO),
196                         .help = "range IP/CIDR|FROM-TO",
197                 },
198                 [IPSET_ADD] = {
199                         .args = {
200                                 IPSET_ARG_TIMEOUT,
201                                 IPSET_ARG_PACKETS,
202                                 IPSET_ARG_BYTES,
203                                 IPSET_ARG_ADT_COMMENT,
204                                 IPSET_ARG_NONE,
205                         },
206                         .need = IPSET_FLAG(IPSET_OPT_IP),
207                         .full = IPSET_FLAG(IPSET_OPT_IP)
208                                 | IPSET_FLAG(IPSET_OPT_ETHER),
209                         .help = "IP[,MAC]",
210                 },
211                 [IPSET_DEL] = {
212                         .args = {
213                                 IPSET_ARG_NONE,
214                         },
215                         .need = IPSET_FLAG(IPSET_OPT_IP),
216                         .full = IPSET_FLAG(IPSET_OPT_IP)
217                                 | IPSET_FLAG(IPSET_OPT_ETHER),
218                         .help = "IP[,MAC]",
219                 },
220                 [IPSET_TEST] = {
221                         .args = {
222                                 IPSET_ARG_NONE,
223                         },
224                         .need = IPSET_FLAG(IPSET_OPT_IP),
225                         .full = IPSET_FLAG(IPSET_OPT_IP)
226                                 | IPSET_FLAG(IPSET_OPT_ETHER),
227                         .help = "IP[,MAC]",
228                 },
229         },
230         .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n"
231                  "      CIDR is a valid IPv4 CIDR prefix.\n"
232                  "      MAC is a valid MAC address.",
233         .description = "comment support",
234 };
235
236 /* skbinfo support */
237 static struct ipset_type ipset_bitmap_ipmac3 = {
238         .name = "bitmap:ip,mac",
239         .alias = { "macipmap", NULL },
240         .revision = 3,
241         .family = NFPROTO_IPV4,
242         .dimension = IPSET_DIM_TWO,
243         .last_elem_optional = true,
244         .elem = {
245                 [IPSET_DIM_ONE - 1] = {
246                         .parse = ipset_parse_single_ip,
247                         .print = ipset_print_ip,
248                         .opt = IPSET_OPT_IP
249                 },
250                 [IPSET_DIM_TWO - 1] = {
251                         .parse = ipset_parse_ether,
252                         .print = ipset_print_ether,
253                         .opt = IPSET_OPT_ETHER
254                 },
255         },
256         .cmd = {
257                 [IPSET_CREATE] = {
258                         .args = {
259                                 IPSET_ARG_IPRANGE,
260                                 IPSET_ARG_TIMEOUT,
261                                 IPSET_ARG_COUNTERS,
262                                 IPSET_ARG_COMMENT,
263                                 IPSET_ARG_SKBINFO,
264                                 /* Backward compatibility */
265                                 IPSET_ARG_FROM_IP,
266                                 IPSET_ARG_TO_IP,
267                                 IPSET_ARG_NETWORK,
268                                 IPSET_ARG_NONE,
269                         },
270                         .need = IPSET_FLAG(IPSET_OPT_IP)
271                                 | IPSET_FLAG(IPSET_OPT_IP_TO),
272                         .full = IPSET_FLAG(IPSET_OPT_IP)
273                                 | IPSET_FLAG(IPSET_OPT_IP_TO),
274                         .help = "range IP/CIDR|FROM-TO",
275                 },
276                 [IPSET_ADD] = {
277                         .args = {
278                                 IPSET_ARG_TIMEOUT,
279                                 IPSET_ARG_PACKETS,
280                                 IPSET_ARG_BYTES,
281                                 IPSET_ARG_ADT_COMMENT,
282                                 IPSET_ARG_SKBMARK,
283                                 IPSET_ARG_SKBPRIO,
284                                 IPSET_ARG_SKBQUEUE,
285                                 IPSET_ARG_NONE,
286                         },
287                         .need = IPSET_FLAG(IPSET_OPT_IP),
288                         .full = IPSET_FLAG(IPSET_OPT_IP)
289                                 | IPSET_FLAG(IPSET_OPT_ETHER),
290                         .help = "IP[,MAC]",
291                 },
292                 [IPSET_DEL] = {
293                         .args = {
294                                 IPSET_ARG_NONE,
295                         },
296                         .need = IPSET_FLAG(IPSET_OPT_IP),
297                         .full = IPSET_FLAG(IPSET_OPT_IP)
298                                 | IPSET_FLAG(IPSET_OPT_ETHER),
299                         .help = "IP[,MAC]",
300                 },
301                 [IPSET_TEST] = {
302                         .args = {
303                                 IPSET_ARG_NONE,
304                         },
305                         .need = IPSET_FLAG(IPSET_OPT_IP),
306                         .full = IPSET_FLAG(IPSET_OPT_IP)
307                                 | IPSET_FLAG(IPSET_OPT_ETHER),
308                         .help = "IP[,MAC]",
309                 },
310         },
311         .usage = "where IP, FROM and TO are IPv4 addresses (or hostnames),\n"
312                  "      CIDR is a valid IPv4 CIDR prefix.\n"
313                  "      MAC is a valid MAC address.",
314         .description = "skbinfo support",
315 };
316
317 void _init(void);
318 void _init(void)
319 {
320         ipset_type_add(&ipset_bitmap_ipmac0);
321         ipset_type_add(&ipset_bitmap_ipmac1);
322         ipset_type_add(&ipset_bitmap_ipmac2);
323         ipset_type_add(&ipset_bitmap_ipmac3);
324 }