1*a71a9546SAutomerger Merge Worker #include <stdio.h>
2*a71a9546SAutomerger Merge Worker #include <string.h>
3*a71a9546SAutomerger Merge Worker #include <stdlib.h>
4*a71a9546SAutomerger Merge Worker #include <errno.h>
5*a71a9546SAutomerger Merge Worker #if defined(__GLIBC__) && __GLIBC__ == 2
6*a71a9546SAutomerger Merge Worker #include <net/ethernet.h>
7*a71a9546SAutomerger Merge Worker #else
8*a71a9546SAutomerger Merge Worker #include <linux/if_ether.h>
9*a71a9546SAutomerger Merge Worker #endif
10*a71a9546SAutomerger Merge Worker #include <xtables.h>
11*a71a9546SAutomerger Merge Worker #include <linux/netfilter_ipv4/ipt_realm.h>
12*a71a9546SAutomerger Merge Worker
13*a71a9546SAutomerger Merge Worker enum {
14*a71a9546SAutomerger Merge Worker O_REALM = 0,
15*a71a9546SAutomerger Merge Worker };
16*a71a9546SAutomerger Merge Worker
realm_help(void)17*a71a9546SAutomerger Merge Worker static void realm_help(void)
18*a71a9546SAutomerger Merge Worker {
19*a71a9546SAutomerger Merge Worker printf(
20*a71a9546SAutomerger Merge Worker "realm match options:\n"
21*a71a9546SAutomerger Merge Worker "[!] --realm value[/mask]\n"
22*a71a9546SAutomerger Merge Worker " Match realm\n");
23*a71a9546SAutomerger Merge Worker }
24*a71a9546SAutomerger Merge Worker
25*a71a9546SAutomerger Merge Worker static const struct xt_option_entry realm_opts[] = {
26*a71a9546SAutomerger Merge Worker {.name = "realm", .id = O_REALM, .type = XTTYPE_STRING,
27*a71a9546SAutomerger Merge Worker .flags = XTOPT_MAND | XTOPT_INVERT},
28*a71a9546SAutomerger Merge Worker XTOPT_TABLEEND,
29*a71a9546SAutomerger Merge Worker };
30*a71a9546SAutomerger Merge Worker
31*a71a9546SAutomerger Merge Worker static const char f_realms[] = "/etc/iproute2/rt_realms";
32*a71a9546SAutomerger Merge Worker /* array of realms from f_realms[] */
33*a71a9546SAutomerger Merge Worker static struct xtables_lmap *realms;
34*a71a9546SAutomerger Merge Worker
realm_parse(struct xt_option_call * cb)35*a71a9546SAutomerger Merge Worker static void realm_parse(struct xt_option_call *cb)
36*a71a9546SAutomerger Merge Worker {
37*a71a9546SAutomerger Merge Worker struct xt_realm_info *ri = cb->data;
38*a71a9546SAutomerger Merge Worker unsigned int id, mask;
39*a71a9546SAutomerger Merge Worker
40*a71a9546SAutomerger Merge Worker xtables_option_parse(cb);
41*a71a9546SAutomerger Merge Worker xtables_parse_val_mask(cb, &id, &mask, realms);
42*a71a9546SAutomerger Merge Worker
43*a71a9546SAutomerger Merge Worker ri->id = id;
44*a71a9546SAutomerger Merge Worker ri->mask = mask;
45*a71a9546SAutomerger Merge Worker
46*a71a9546SAutomerger Merge Worker if (cb->invert)
47*a71a9546SAutomerger Merge Worker ri->invert = 1;
48*a71a9546SAutomerger Merge Worker }
49*a71a9546SAutomerger Merge Worker
realm_print(const void * ip,const struct xt_entry_match * match,int numeric)50*a71a9546SAutomerger Merge Worker static void realm_print(const void *ip, const struct xt_entry_match *match,
51*a71a9546SAutomerger Merge Worker int numeric)
52*a71a9546SAutomerger Merge Worker {
53*a71a9546SAutomerger Merge Worker const struct xt_realm_info *ri = (const void *)match->data;
54*a71a9546SAutomerger Merge Worker
55*a71a9546SAutomerger Merge Worker if (ri->invert)
56*a71a9546SAutomerger Merge Worker printf(" !");
57*a71a9546SAutomerger Merge Worker
58*a71a9546SAutomerger Merge Worker printf(" realm");
59*a71a9546SAutomerger Merge Worker xtables_print_val_mask(ri->id, ri->mask, numeric ? NULL : realms);
60*a71a9546SAutomerger Merge Worker }
61*a71a9546SAutomerger Merge Worker
realm_save(const void * ip,const struct xt_entry_match * match)62*a71a9546SAutomerger Merge Worker static void realm_save(const void *ip, const struct xt_entry_match *match)
63*a71a9546SAutomerger Merge Worker {
64*a71a9546SAutomerger Merge Worker const struct xt_realm_info *ri = (const void *)match->data;
65*a71a9546SAutomerger Merge Worker
66*a71a9546SAutomerger Merge Worker if (ri->invert)
67*a71a9546SAutomerger Merge Worker printf(" !");
68*a71a9546SAutomerger Merge Worker
69*a71a9546SAutomerger Merge Worker printf(" --realm");
70*a71a9546SAutomerger Merge Worker xtables_print_val_mask(ri->id, ri->mask, realms);
71*a71a9546SAutomerger Merge Worker }
72*a71a9546SAutomerger Merge Worker
73*a71a9546SAutomerger Merge Worker static void
print_realm_xlate(unsigned long id,unsigned long mask,int numeric,struct xt_xlate * xl,uint32_t op)74*a71a9546SAutomerger Merge Worker print_realm_xlate(unsigned long id, unsigned long mask,
75*a71a9546SAutomerger Merge Worker int numeric, struct xt_xlate *xl, uint32_t op)
76*a71a9546SAutomerger Merge Worker {
77*a71a9546SAutomerger Merge Worker const char *name = NULL;
78*a71a9546SAutomerger Merge Worker
79*a71a9546SAutomerger Merge Worker if (mask != 0xffffffff)
80*a71a9546SAutomerger Merge Worker xt_xlate_add(xl, " and 0x%lx %s 0x%lx", mask,
81*a71a9546SAutomerger Merge Worker op == XT_OP_EQ ? "==" : "!=", id);
82*a71a9546SAutomerger Merge Worker else {
83*a71a9546SAutomerger Merge Worker if (numeric == 0)
84*a71a9546SAutomerger Merge Worker name = xtables_lmap_id2name(realms, id);
85*a71a9546SAutomerger Merge Worker if (name)
86*a71a9546SAutomerger Merge Worker xt_xlate_add(xl, " %s%s",
87*a71a9546SAutomerger Merge Worker op == XT_OP_EQ ? "" : "!= ", name);
88*a71a9546SAutomerger Merge Worker else
89*a71a9546SAutomerger Merge Worker xt_xlate_add(xl, " %s0x%lx",
90*a71a9546SAutomerger Merge Worker op == XT_OP_EQ ? "" : "!= ", id);
91*a71a9546SAutomerger Merge Worker }
92*a71a9546SAutomerger Merge Worker }
93*a71a9546SAutomerger Merge Worker
realm_xlate(struct xt_xlate * xl,const struct xt_xlate_mt_params * params)94*a71a9546SAutomerger Merge Worker static int realm_xlate(struct xt_xlate *xl,
95*a71a9546SAutomerger Merge Worker const struct xt_xlate_mt_params *params)
96*a71a9546SAutomerger Merge Worker {
97*a71a9546SAutomerger Merge Worker const struct xt_realm_info *ri = (const void *)params->match->data;
98*a71a9546SAutomerger Merge Worker enum xt_op op = XT_OP_EQ;
99*a71a9546SAutomerger Merge Worker
100*a71a9546SAutomerger Merge Worker if (ri->invert)
101*a71a9546SAutomerger Merge Worker op = XT_OP_NEQ;
102*a71a9546SAutomerger Merge Worker
103*a71a9546SAutomerger Merge Worker xt_xlate_add(xl, "rtclassid");
104*a71a9546SAutomerger Merge Worker print_realm_xlate(ri->id, ri->mask, 0, xl, op);
105*a71a9546SAutomerger Merge Worker
106*a71a9546SAutomerger Merge Worker return 1;
107*a71a9546SAutomerger Merge Worker }
108*a71a9546SAutomerger Merge Worker
109*a71a9546SAutomerger Merge Worker static struct xtables_match realm_mt_reg = {
110*a71a9546SAutomerger Merge Worker .name = "realm",
111*a71a9546SAutomerger Merge Worker .version = XTABLES_VERSION,
112*a71a9546SAutomerger Merge Worker .family = NFPROTO_IPV4,
113*a71a9546SAutomerger Merge Worker .size = XT_ALIGN(sizeof(struct xt_realm_info)),
114*a71a9546SAutomerger Merge Worker .userspacesize = XT_ALIGN(sizeof(struct xt_realm_info)),
115*a71a9546SAutomerger Merge Worker .help = realm_help,
116*a71a9546SAutomerger Merge Worker .print = realm_print,
117*a71a9546SAutomerger Merge Worker .save = realm_save,
118*a71a9546SAutomerger Merge Worker .x6_parse = realm_parse,
119*a71a9546SAutomerger Merge Worker .x6_options = realm_opts,
120*a71a9546SAutomerger Merge Worker .xlate = realm_xlate,
121*a71a9546SAutomerger Merge Worker };
122*a71a9546SAutomerger Merge Worker
_init(void)123*a71a9546SAutomerger Merge Worker void _init(void)
124*a71a9546SAutomerger Merge Worker {
125*a71a9546SAutomerger Merge Worker realms = xtables_lmap_init(f_realms);
126*a71a9546SAutomerger Merge Worker if (realms == NULL && errno != ENOENT)
127*a71a9546SAutomerger Merge Worker fprintf(stderr, "Warning: %s: %s\n", f_realms,
128*a71a9546SAutomerger Merge Worker strerror(errno));
129*a71a9546SAutomerger Merge Worker
130*a71a9546SAutomerger Merge Worker xtables_register_match(&realm_mt_reg);
131*a71a9546SAutomerger Merge Worker }
132