1*a71a9546SAutomerger Merge Worker /* ebt_stp
2*a71a9546SAutomerger Merge Worker *
3*a71a9546SAutomerger Merge Worker * Authors:
4*a71a9546SAutomerger Merge Worker * Bart De Schuymer <[email protected]>
5*a71a9546SAutomerger Merge Worker *
6*a71a9546SAutomerger Merge Worker * July, 2003
7*a71a9546SAutomerger Merge Worker */
8*a71a9546SAutomerger Merge Worker
9*a71a9546SAutomerger Merge Worker #include <stdio.h>
10*a71a9546SAutomerger Merge Worker #include <string.h>
11*a71a9546SAutomerger Merge Worker #include <stdlib.h>
12*a71a9546SAutomerger Merge Worker #include <getopt.h>
13*a71a9546SAutomerger Merge Worker #include <netinet/ether.h>
14*a71a9546SAutomerger Merge Worker #include <linux/netfilter_bridge/ebt_stp.h>
15*a71a9546SAutomerger Merge Worker #include <xtables.h>
16*a71a9546SAutomerger Merge Worker
17*a71a9546SAutomerger Merge Worker #include "iptables/nft.h"
18*a71a9546SAutomerger Merge Worker #include "iptables/nft-bridge.h"
19*a71a9546SAutomerger Merge Worker
20*a71a9546SAutomerger Merge Worker #define STP_TYPE 'a'
21*a71a9546SAutomerger Merge Worker #define STP_FLAGS 'b'
22*a71a9546SAutomerger Merge Worker #define STP_ROOTPRIO 'c'
23*a71a9546SAutomerger Merge Worker #define STP_ROOTADDR 'd'
24*a71a9546SAutomerger Merge Worker #define STP_ROOTCOST 'e'
25*a71a9546SAutomerger Merge Worker #define STP_SENDERPRIO 'f'
26*a71a9546SAutomerger Merge Worker #define STP_SENDERADDR 'g'
27*a71a9546SAutomerger Merge Worker #define STP_PORT 'h'
28*a71a9546SAutomerger Merge Worker #define STP_MSGAGE 'i'
29*a71a9546SAutomerger Merge Worker #define STP_MAXAGE 'j'
30*a71a9546SAutomerger Merge Worker #define STP_HELLOTIME 'k'
31*a71a9546SAutomerger Merge Worker #define STP_FWDD 'l'
32*a71a9546SAutomerger Merge Worker #define STP_NUMOPS 12
33*a71a9546SAutomerger Merge Worker
34*a71a9546SAutomerger Merge Worker static const struct option brstp_opts[] =
35*a71a9546SAutomerger Merge Worker {
36*a71a9546SAutomerger Merge Worker { "stp-type" , required_argument, 0, STP_TYPE},
37*a71a9546SAutomerger Merge Worker { "stp-flags" , required_argument, 0, STP_FLAGS},
38*a71a9546SAutomerger Merge Worker { "stp-root-prio" , required_argument, 0, STP_ROOTPRIO},
39*a71a9546SAutomerger Merge Worker { "stp-root-addr" , required_argument, 0, STP_ROOTADDR},
40*a71a9546SAutomerger Merge Worker { "stp-root-cost" , required_argument, 0, STP_ROOTCOST},
41*a71a9546SAutomerger Merge Worker { "stp-sender-prio" , required_argument, 0, STP_SENDERPRIO},
42*a71a9546SAutomerger Merge Worker { "stp-sender-addr" , required_argument, 0, STP_SENDERADDR},
43*a71a9546SAutomerger Merge Worker { "stp-port" , required_argument, 0, STP_PORT},
44*a71a9546SAutomerger Merge Worker { "stp-msg-age" , required_argument, 0, STP_MSGAGE},
45*a71a9546SAutomerger Merge Worker { "stp-max-age" , required_argument, 0, STP_MAXAGE},
46*a71a9546SAutomerger Merge Worker { "stp-hello-time" , required_argument, 0, STP_HELLOTIME},
47*a71a9546SAutomerger Merge Worker { "stp-forward-delay", required_argument, 0, STP_FWDD},
48*a71a9546SAutomerger Merge Worker { 0 }
49*a71a9546SAutomerger Merge Worker };
50*a71a9546SAutomerger Merge Worker
51*a71a9546SAutomerger Merge Worker #define BPDU_TYPE_CONFIG 0
52*a71a9546SAutomerger Merge Worker #define BPDU_TYPE_TCN 0x80
53*a71a9546SAutomerger Merge Worker #define BPDU_TYPE_CONFIG_STRING "config"
54*a71a9546SAutomerger Merge Worker #define BPDU_TYPE_TCN_STRING "tcn"
55*a71a9546SAutomerger Merge Worker
56*a71a9546SAutomerger Merge Worker #define FLAG_TC 0x01
57*a71a9546SAutomerger Merge Worker #define FLAG_TC_ACK 0x80
58*a71a9546SAutomerger Merge Worker #define FLAG_TC_STRING "topology-change"
59*a71a9546SAutomerger Merge Worker #define FLAG_TC_ACK_STRING "topology-change-ack"
60*a71a9546SAutomerger Merge Worker
brstp_print_help(void)61*a71a9546SAutomerger Merge Worker static void brstp_print_help(void)
62*a71a9546SAutomerger Merge Worker {
63*a71a9546SAutomerger Merge Worker printf(
64*a71a9546SAutomerger Merge Worker "stp options:\n"
65*a71a9546SAutomerger Merge Worker "--stp-type type : BPDU type\n"
66*a71a9546SAutomerger Merge Worker "--stp-flags flag : control flag\n"
67*a71a9546SAutomerger Merge Worker "--stp-root-prio prio[:prio] : root priority (16-bit) range\n"
68*a71a9546SAutomerger Merge Worker "--stp-root-addr address[/mask] : MAC address of root\n"
69*a71a9546SAutomerger Merge Worker "--stp-root-cost cost[:cost] : root cost (32-bit) range\n"
70*a71a9546SAutomerger Merge Worker "--stp-sender-prio prio[:prio] : sender priority (16-bit) range\n"
71*a71a9546SAutomerger Merge Worker "--stp-sender-addr address[/mask] : MAC address of sender\n"
72*a71a9546SAutomerger Merge Worker "--stp-port port[:port] : port id (16-bit) range\n"
73*a71a9546SAutomerger Merge Worker "--stp-msg-age age[:age] : message age timer (16-bit) range\n"
74*a71a9546SAutomerger Merge Worker "--stp-max-age age[:age] : maximum age timer (16-bit) range\n"
75*a71a9546SAutomerger Merge Worker "--stp-hello-time time[:time] : hello time timer (16-bit) range\n"
76*a71a9546SAutomerger Merge Worker "--stp-forward-delay delay[:delay]: forward delay timer (16-bit) range\n"
77*a71a9546SAutomerger Merge Worker " Recognized BPDU type strings:\n"
78*a71a9546SAutomerger Merge Worker " \"config\": configuration BPDU (=0)\n"
79*a71a9546SAutomerger Merge Worker " \"tcn\" : topology change notification BPDU (=0x80)\n"
80*a71a9546SAutomerger Merge Worker " Recognized control flag strings:\n"
81*a71a9546SAutomerger Merge Worker " \"topology-change\" : topology change flag (0x01)\n"
82*a71a9546SAutomerger Merge Worker " \"topology-change-ack\": topology change acknowledgement flag (0x80)");
83*a71a9546SAutomerger Merge Worker }
84*a71a9546SAutomerger Merge Worker
parse_range(const char * portstring,void * lower,void * upper,int bits,uint32_t min,uint32_t max)85*a71a9546SAutomerger Merge Worker static int parse_range(const char *portstring, void *lower, void *upper,
86*a71a9546SAutomerger Merge Worker int bits, uint32_t min, uint32_t max)
87*a71a9546SAutomerger Merge Worker {
88*a71a9546SAutomerger Merge Worker char *buffer;
89*a71a9546SAutomerger Merge Worker char *cp, *end;
90*a71a9546SAutomerger Merge Worker uint32_t low_nr, upp_nr;
91*a71a9546SAutomerger Merge Worker int ret = 0;
92*a71a9546SAutomerger Merge Worker
93*a71a9546SAutomerger Merge Worker buffer = xtables_strdup(portstring);
94*a71a9546SAutomerger Merge Worker
95*a71a9546SAutomerger Merge Worker if ((cp = strchr(buffer, ':')) == NULL) {
96*a71a9546SAutomerger Merge Worker low_nr = strtoul(buffer, &end, 10);
97*a71a9546SAutomerger Merge Worker if (*end || low_nr < min || low_nr > max) {
98*a71a9546SAutomerger Merge Worker ret = -1;
99*a71a9546SAutomerger Merge Worker goto out;
100*a71a9546SAutomerger Merge Worker }
101*a71a9546SAutomerger Merge Worker if (bits == 2) {
102*a71a9546SAutomerger Merge Worker *(uint16_t *)lower = low_nr;
103*a71a9546SAutomerger Merge Worker *(uint16_t *)upper = low_nr;
104*a71a9546SAutomerger Merge Worker } else {
105*a71a9546SAutomerger Merge Worker *(uint32_t *)lower = low_nr;
106*a71a9546SAutomerger Merge Worker *(uint32_t *)upper = low_nr;
107*a71a9546SAutomerger Merge Worker }
108*a71a9546SAutomerger Merge Worker } else {
109*a71a9546SAutomerger Merge Worker *cp = '\0';
110*a71a9546SAutomerger Merge Worker cp++;
111*a71a9546SAutomerger Merge Worker if (!*buffer)
112*a71a9546SAutomerger Merge Worker low_nr = min;
113*a71a9546SAutomerger Merge Worker else {
114*a71a9546SAutomerger Merge Worker low_nr = strtoul(buffer, &end, 10);
115*a71a9546SAutomerger Merge Worker if (*end || low_nr < min) {
116*a71a9546SAutomerger Merge Worker ret = -1;
117*a71a9546SAutomerger Merge Worker goto out;
118*a71a9546SAutomerger Merge Worker }
119*a71a9546SAutomerger Merge Worker }
120*a71a9546SAutomerger Merge Worker if (!*cp)
121*a71a9546SAutomerger Merge Worker upp_nr = max;
122*a71a9546SAutomerger Merge Worker else {
123*a71a9546SAutomerger Merge Worker upp_nr = strtoul(cp, &end, 10);
124*a71a9546SAutomerger Merge Worker if (*end || upp_nr > max) {
125*a71a9546SAutomerger Merge Worker ret = -1;
126*a71a9546SAutomerger Merge Worker goto out;
127*a71a9546SAutomerger Merge Worker }
128*a71a9546SAutomerger Merge Worker }
129*a71a9546SAutomerger Merge Worker if (upp_nr < low_nr) {
130*a71a9546SAutomerger Merge Worker ret = -1;
131*a71a9546SAutomerger Merge Worker goto out;
132*a71a9546SAutomerger Merge Worker }
133*a71a9546SAutomerger Merge Worker if (bits == 2) {
134*a71a9546SAutomerger Merge Worker *(uint16_t *)lower = low_nr;
135*a71a9546SAutomerger Merge Worker *(uint16_t *)upper = upp_nr;
136*a71a9546SAutomerger Merge Worker } else {
137*a71a9546SAutomerger Merge Worker *(uint32_t *)lower = low_nr;
138*a71a9546SAutomerger Merge Worker *(uint32_t *)upper = upp_nr;
139*a71a9546SAutomerger Merge Worker }
140*a71a9546SAutomerger Merge Worker }
141*a71a9546SAutomerger Merge Worker out:
142*a71a9546SAutomerger Merge Worker free(buffer);
143*a71a9546SAutomerger Merge Worker return ret;
144*a71a9546SAutomerger Merge Worker }
145*a71a9546SAutomerger Merge Worker
print_range(unsigned int l,unsigned int u)146*a71a9546SAutomerger Merge Worker static void print_range(unsigned int l, unsigned int u)
147*a71a9546SAutomerger Merge Worker {
148*a71a9546SAutomerger Merge Worker if (l == u)
149*a71a9546SAutomerger Merge Worker printf("%u", l);
150*a71a9546SAutomerger Merge Worker else
151*a71a9546SAutomerger Merge Worker printf("%u:%u", l, u);
152*a71a9546SAutomerger Merge Worker }
153*a71a9546SAutomerger Merge Worker
154*a71a9546SAutomerger Merge Worker static int
brstp_parse(int c,char ** argv,int invert,unsigned int * flags,const void * entry,struct xt_entry_match ** match)155*a71a9546SAutomerger Merge Worker brstp_parse(int c, char **argv, int invert, unsigned int *flags,
156*a71a9546SAutomerger Merge Worker const void *entry, struct xt_entry_match **match)
157*a71a9546SAutomerger Merge Worker {
158*a71a9546SAutomerger Merge Worker struct ebt_stp_info *stpinfo = (struct ebt_stp_info *)(*match)->data;
159*a71a9546SAutomerger Merge Worker unsigned int flag;
160*a71a9546SAutomerger Merge Worker long int i;
161*a71a9546SAutomerger Merge Worker char *end = NULL;
162*a71a9546SAutomerger Merge Worker
163*a71a9546SAutomerger Merge Worker if (c < 'a' || c > ('a' + STP_NUMOPS - 1))
164*a71a9546SAutomerger Merge Worker return 0;
165*a71a9546SAutomerger Merge Worker flag = 1 << (c - 'a');
166*a71a9546SAutomerger Merge Worker EBT_CHECK_OPTION(flags, flag);
167*a71a9546SAutomerger Merge Worker if (invert)
168*a71a9546SAutomerger Merge Worker stpinfo->invflags |= flag;
169*a71a9546SAutomerger Merge Worker stpinfo->bitmask |= flag;
170*a71a9546SAutomerger Merge Worker switch (flag) {
171*a71a9546SAutomerger Merge Worker case EBT_STP_TYPE:
172*a71a9546SAutomerger Merge Worker i = strtol(optarg, &end, 0);
173*a71a9546SAutomerger Merge Worker if (i < 0 || i > 255 || *end != '\0') {
174*a71a9546SAutomerger Merge Worker if (!strcasecmp(optarg, BPDU_TYPE_CONFIG_STRING))
175*a71a9546SAutomerger Merge Worker stpinfo->type = BPDU_TYPE_CONFIG;
176*a71a9546SAutomerger Merge Worker else if (!strcasecmp(optarg, BPDU_TYPE_TCN_STRING))
177*a71a9546SAutomerger Merge Worker stpinfo->type = BPDU_TYPE_TCN;
178*a71a9546SAutomerger Merge Worker else
179*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-type argument");
180*a71a9546SAutomerger Merge Worker } else
181*a71a9546SAutomerger Merge Worker stpinfo->type = i;
182*a71a9546SAutomerger Merge Worker break;
183*a71a9546SAutomerger Merge Worker case EBT_STP_FLAGS:
184*a71a9546SAutomerger Merge Worker i = strtol(optarg, &end, 0);
185*a71a9546SAutomerger Merge Worker if (i < 0 || i > 255 || *end != '\0') {
186*a71a9546SAutomerger Merge Worker if (!strcasecmp(optarg, FLAG_TC_STRING))
187*a71a9546SAutomerger Merge Worker stpinfo->config.flags = FLAG_TC;
188*a71a9546SAutomerger Merge Worker else if (!strcasecmp(optarg, FLAG_TC_ACK_STRING))
189*a71a9546SAutomerger Merge Worker stpinfo->config.flags = FLAG_TC_ACK;
190*a71a9546SAutomerger Merge Worker else
191*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-flags argument");
192*a71a9546SAutomerger Merge Worker } else
193*a71a9546SAutomerger Merge Worker stpinfo->config.flags = i;
194*a71a9546SAutomerger Merge Worker break;
195*a71a9546SAutomerger Merge Worker case EBT_STP_ROOTPRIO:
196*a71a9546SAutomerger Merge Worker if (parse_range(argv[optind-1], &(stpinfo->config.root_priol),
197*a71a9546SAutomerger Merge Worker &(stpinfo->config.root_priou), 2, 0, 0xffff))
198*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-root-prio range");
199*a71a9546SAutomerger Merge Worker break;
200*a71a9546SAutomerger Merge Worker case EBT_STP_ROOTCOST:
201*a71a9546SAutomerger Merge Worker if (parse_range(argv[optind-1], &(stpinfo->config.root_costl),
202*a71a9546SAutomerger Merge Worker &(stpinfo->config.root_costu), 4, 0, 0xffffffff))
203*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-root-cost range");
204*a71a9546SAutomerger Merge Worker break;
205*a71a9546SAutomerger Merge Worker case EBT_STP_SENDERPRIO:
206*a71a9546SAutomerger Merge Worker if (parse_range(argv[optind-1], &(stpinfo->config.sender_priol),
207*a71a9546SAutomerger Merge Worker &(stpinfo->config.sender_priou), 2, 0, 0xffff))
208*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-sender-prio range");
209*a71a9546SAutomerger Merge Worker break;
210*a71a9546SAutomerger Merge Worker case EBT_STP_PORT:
211*a71a9546SAutomerger Merge Worker if (parse_range(argv[optind-1], &(stpinfo->config.portl),
212*a71a9546SAutomerger Merge Worker &(stpinfo->config.portu), 2, 0, 0xffff))
213*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-port-range");
214*a71a9546SAutomerger Merge Worker break;
215*a71a9546SAutomerger Merge Worker case EBT_STP_MSGAGE:
216*a71a9546SAutomerger Merge Worker if (parse_range(argv[optind-1], &(stpinfo->config.msg_agel),
217*a71a9546SAutomerger Merge Worker &(stpinfo->config.msg_ageu), 2, 0, 0xffff))
218*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-msg-age range");
219*a71a9546SAutomerger Merge Worker break;
220*a71a9546SAutomerger Merge Worker case EBT_STP_MAXAGE:
221*a71a9546SAutomerger Merge Worker if (parse_range(argv[optind-1], &(stpinfo->config.max_agel),
222*a71a9546SAutomerger Merge Worker &(stpinfo->config.max_ageu), 2, 0, 0xffff))
223*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-max-age range");
224*a71a9546SAutomerger Merge Worker break;
225*a71a9546SAutomerger Merge Worker case EBT_STP_HELLOTIME:
226*a71a9546SAutomerger Merge Worker if (parse_range(argv[optind-1], &(stpinfo->config.hello_timel),
227*a71a9546SAutomerger Merge Worker &(stpinfo->config.hello_timeu), 2, 0, 0xffff))
228*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-hello-time range");
229*a71a9546SAutomerger Merge Worker break;
230*a71a9546SAutomerger Merge Worker case EBT_STP_FWDD:
231*a71a9546SAutomerger Merge Worker if (parse_range(argv[optind-1], &(stpinfo->config.forward_delayl),
232*a71a9546SAutomerger Merge Worker &(stpinfo->config.forward_delayu), 2, 0, 0xffff))
233*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-forward-delay range");
234*a71a9546SAutomerger Merge Worker break;
235*a71a9546SAutomerger Merge Worker case EBT_STP_ROOTADDR:
236*a71a9546SAutomerger Merge Worker if (xtables_parse_mac_and_mask(argv[optind-1],
237*a71a9546SAutomerger Merge Worker stpinfo->config.root_addr,
238*a71a9546SAutomerger Merge Worker stpinfo->config.root_addrmsk))
239*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-root-addr address");
240*a71a9546SAutomerger Merge Worker break;
241*a71a9546SAutomerger Merge Worker case EBT_STP_SENDERADDR:
242*a71a9546SAutomerger Merge Worker if (xtables_parse_mac_and_mask(argv[optind-1],
243*a71a9546SAutomerger Merge Worker stpinfo->config.sender_addr,
244*a71a9546SAutomerger Merge Worker stpinfo->config.sender_addrmsk))
245*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Bad --stp-sender-addr address");
246*a71a9546SAutomerger Merge Worker break;
247*a71a9546SAutomerger Merge Worker default:
248*a71a9546SAutomerger Merge Worker xtables_error(PARAMETER_PROBLEM, "Unknown stp option");
249*a71a9546SAutomerger Merge Worker }
250*a71a9546SAutomerger Merge Worker return 1;
251*a71a9546SAutomerger Merge Worker }
252*a71a9546SAutomerger Merge Worker
brstp_print(const void * ip,const struct xt_entry_match * match,int numeric)253*a71a9546SAutomerger Merge Worker static void brstp_print(const void *ip, const struct xt_entry_match *match,
254*a71a9546SAutomerger Merge Worker int numeric)
255*a71a9546SAutomerger Merge Worker {
256*a71a9546SAutomerger Merge Worker const struct ebt_stp_info *stpinfo = (struct ebt_stp_info *)match->data;
257*a71a9546SAutomerger Merge Worker const struct ebt_stp_config_info *c = &(stpinfo->config);
258*a71a9546SAutomerger Merge Worker int i;
259*a71a9546SAutomerger Merge Worker
260*a71a9546SAutomerger Merge Worker for (i = 0; i < STP_NUMOPS; i++) {
261*a71a9546SAutomerger Merge Worker if (!(stpinfo->bitmask & (1 << i)))
262*a71a9546SAutomerger Merge Worker continue;
263*a71a9546SAutomerger Merge Worker printf("--%s %s", brstp_opts[i].name,
264*a71a9546SAutomerger Merge Worker (stpinfo->invflags & (1 << i)) ? "! " : "");
265*a71a9546SAutomerger Merge Worker if (EBT_STP_TYPE == (1 << i)) {
266*a71a9546SAutomerger Merge Worker if (stpinfo->type == BPDU_TYPE_CONFIG)
267*a71a9546SAutomerger Merge Worker printf("%s", BPDU_TYPE_CONFIG_STRING);
268*a71a9546SAutomerger Merge Worker else if (stpinfo->type == BPDU_TYPE_TCN)
269*a71a9546SAutomerger Merge Worker printf("%s", BPDU_TYPE_TCN_STRING);
270*a71a9546SAutomerger Merge Worker else
271*a71a9546SAutomerger Merge Worker printf("%d", stpinfo->type);
272*a71a9546SAutomerger Merge Worker } else if (EBT_STP_FLAGS == (1 << i)) {
273*a71a9546SAutomerger Merge Worker if (c->flags == FLAG_TC)
274*a71a9546SAutomerger Merge Worker printf("%s", FLAG_TC_STRING);
275*a71a9546SAutomerger Merge Worker else if (c->flags == FLAG_TC_ACK)
276*a71a9546SAutomerger Merge Worker printf("%s", FLAG_TC_ACK_STRING);
277*a71a9546SAutomerger Merge Worker else
278*a71a9546SAutomerger Merge Worker printf("%d", c->flags);
279*a71a9546SAutomerger Merge Worker } else if (EBT_STP_ROOTPRIO == (1 << i))
280*a71a9546SAutomerger Merge Worker print_range(c->root_priol, c->root_priou);
281*a71a9546SAutomerger Merge Worker else if (EBT_STP_ROOTADDR == (1 << i))
282*a71a9546SAutomerger Merge Worker xtables_print_mac_and_mask((unsigned char *)c->root_addr,
283*a71a9546SAutomerger Merge Worker (unsigned char*)c->root_addrmsk);
284*a71a9546SAutomerger Merge Worker else if (EBT_STP_ROOTCOST == (1 << i))
285*a71a9546SAutomerger Merge Worker print_range(c->root_costl, c->root_costu);
286*a71a9546SAutomerger Merge Worker else if (EBT_STP_SENDERPRIO == (1 << i))
287*a71a9546SAutomerger Merge Worker print_range(c->sender_priol, c->sender_priou);
288*a71a9546SAutomerger Merge Worker else if (EBT_STP_SENDERADDR == (1 << i))
289*a71a9546SAutomerger Merge Worker xtables_print_mac_and_mask((unsigned char *)c->sender_addr,
290*a71a9546SAutomerger Merge Worker (unsigned char *)c->sender_addrmsk);
291*a71a9546SAutomerger Merge Worker else if (EBT_STP_PORT == (1 << i))
292*a71a9546SAutomerger Merge Worker print_range(c->portl, c->portu);
293*a71a9546SAutomerger Merge Worker else if (EBT_STP_MSGAGE == (1 << i))
294*a71a9546SAutomerger Merge Worker print_range(c->msg_agel, c->msg_ageu);
295*a71a9546SAutomerger Merge Worker else if (EBT_STP_MAXAGE == (1 << i))
296*a71a9546SAutomerger Merge Worker print_range(c->max_agel, c->max_ageu);
297*a71a9546SAutomerger Merge Worker else if (EBT_STP_HELLOTIME == (1 << i))
298*a71a9546SAutomerger Merge Worker print_range(c->hello_timel, c->hello_timeu);
299*a71a9546SAutomerger Merge Worker else if (EBT_STP_FWDD == (1 << i))
300*a71a9546SAutomerger Merge Worker print_range(c->forward_delayl, c->forward_delayu);
301*a71a9546SAutomerger Merge Worker printf(" ");
302*a71a9546SAutomerger Merge Worker }
303*a71a9546SAutomerger Merge Worker }
304*a71a9546SAutomerger Merge Worker
305*a71a9546SAutomerger Merge Worker static struct xtables_match brstp_match = {
306*a71a9546SAutomerger Merge Worker .name = "stp",
307*a71a9546SAutomerger Merge Worker .version = XTABLES_VERSION,
308*a71a9546SAutomerger Merge Worker .family = NFPROTO_BRIDGE,
309*a71a9546SAutomerger Merge Worker .size = sizeof(struct ebt_stp_info),
310*a71a9546SAutomerger Merge Worker .help = brstp_print_help,
311*a71a9546SAutomerger Merge Worker .parse = brstp_parse,
312*a71a9546SAutomerger Merge Worker .print = brstp_print,
313*a71a9546SAutomerger Merge Worker .extra_opts = brstp_opts,
314*a71a9546SAutomerger Merge Worker };
315*a71a9546SAutomerger Merge Worker
_init(void)316*a71a9546SAutomerger Merge Worker void _init(void)
317*a71a9546SAutomerger Merge Worker {
318*a71a9546SAutomerger Merge Worker xtables_register_match(&brstp_match);
319*a71a9546SAutomerger Merge Worker }
320