xref: /aosp_15_r20/external/iptables/extensions/libebt_802_3.c (revision a71a954618bbadd4a345637e5edcf36eec826889)
1*a71a9546SAutomerger Merge Worker /* 802_3
2*a71a9546SAutomerger Merge Worker  *
3*a71a9546SAutomerger Merge Worker  * Author:
4*a71a9546SAutomerger Merge Worker  * Chris Vitale <[email protected]>
5*a71a9546SAutomerger Merge Worker  *
6*a71a9546SAutomerger Merge Worker  * May 2003
7*a71a9546SAutomerger Merge Worker  *
8*a71a9546SAutomerger Merge Worker  * Adapted by Arturo Borrero Gonzalez <[email protected]>
9*a71a9546SAutomerger Merge Worker  * to use libxtables for ebtables-compat
10*a71a9546SAutomerger Merge Worker  */
11*a71a9546SAutomerger Merge Worker 
12*a71a9546SAutomerger Merge Worker #include <stdbool.h>
13*a71a9546SAutomerger Merge Worker #include <stdio.h>
14*a71a9546SAutomerger Merge Worker #include <string.h>
15*a71a9546SAutomerger Merge Worker #include <stdlib.h>
16*a71a9546SAutomerger Merge Worker #include <getopt.h>
17*a71a9546SAutomerger Merge Worker #include <xtables.h>
18*a71a9546SAutomerger Merge Worker #include <linux/netfilter_bridge/ebt_802_3.h>
19*a71a9546SAutomerger Merge Worker 
20*a71a9546SAutomerger Merge Worker #define _802_3_SAP	'1'
21*a71a9546SAutomerger Merge Worker #define _802_3_TYPE	'2'
22*a71a9546SAutomerger Merge Worker 
23*a71a9546SAutomerger Merge Worker static const struct option br802_3_opts[] = {
24*a71a9546SAutomerger Merge Worker 	{ .name = "802_3-sap",	.has_arg = true, .val = _802_3_SAP },
25*a71a9546SAutomerger Merge Worker 	{ .name = "802_3-type",	.has_arg = true, .val = _802_3_TYPE },
26*a71a9546SAutomerger Merge Worker 	XT_GETOPT_TABLEEND,
27*a71a9546SAutomerger Merge Worker };
28*a71a9546SAutomerger Merge Worker 
br802_3_print_help(void)29*a71a9546SAutomerger Merge Worker static void br802_3_print_help(void)
30*a71a9546SAutomerger Merge Worker {
31*a71a9546SAutomerger Merge Worker 	printf(
32*a71a9546SAutomerger Merge Worker "802_3 options:\n"
33*a71a9546SAutomerger Merge Worker "--802_3-sap [!] protocol       : 802.3 DSAP/SSAP- 1 byte value (hex)\n"
34*a71a9546SAutomerger Merge Worker "  DSAP and SSAP are always the same.  One SAP applies to both fields\n"
35*a71a9546SAutomerger Merge Worker "--802_3-type [!] protocol      : 802.3 SNAP Type- 2 byte value (hex)\n"
36*a71a9546SAutomerger Merge Worker "  Type implies SAP value 0xaa\n");
37*a71a9546SAutomerger Merge Worker }
38*a71a9546SAutomerger Merge Worker 
br802_3_init(struct xt_entry_match * match)39*a71a9546SAutomerger Merge Worker static void br802_3_init(struct xt_entry_match *match)
40*a71a9546SAutomerger Merge Worker {
41*a71a9546SAutomerger Merge Worker 	struct ebt_802_3_info *info = (struct ebt_802_3_info *)match->data;
42*a71a9546SAutomerger Merge Worker 
43*a71a9546SAutomerger Merge Worker 	info->invflags = 0;
44*a71a9546SAutomerger Merge Worker 	info->bitmask = 0;
45*a71a9546SAutomerger Merge Worker }
46*a71a9546SAutomerger Merge Worker 
47*a71a9546SAutomerger Merge Worker static int
br802_3_parse(int c,char ** argv,int invert,unsigned int * flags,const void * entry,struct xt_entry_match ** match)48*a71a9546SAutomerger Merge Worker br802_3_parse(int c, char **argv, int invert, unsigned int *flags,
49*a71a9546SAutomerger Merge Worker 	      const void *entry, struct xt_entry_match **match)
50*a71a9546SAutomerger Merge Worker {
51*a71a9546SAutomerger Merge Worker 	struct ebt_802_3_info *info = (struct ebt_802_3_info *) (*match)->data;
52*a71a9546SAutomerger Merge Worker 	unsigned int i;
53*a71a9546SAutomerger Merge Worker 	char *end;
54*a71a9546SAutomerger Merge Worker 
55*a71a9546SAutomerger Merge Worker 	switch (c) {
56*a71a9546SAutomerger Merge Worker 	case _802_3_SAP:
57*a71a9546SAutomerger Merge Worker 		if (invert)
58*a71a9546SAutomerger Merge Worker 			info->invflags |= EBT_802_3_SAP;
59*a71a9546SAutomerger Merge Worker 		i = strtoul(optarg, &end, 16);
60*a71a9546SAutomerger Merge Worker 		if (i > 255 || *end != '\0')
61*a71a9546SAutomerger Merge Worker 			xtables_error(PARAMETER_PROBLEM,
62*a71a9546SAutomerger Merge Worker 				      "Problem with specified "
63*a71a9546SAutomerger Merge Worker 					"sap hex value, %x",i);
64*a71a9546SAutomerger Merge Worker 		info->sap = i; /* one byte, so no byte order worries */
65*a71a9546SAutomerger Merge Worker 		info->bitmask |= EBT_802_3_SAP;
66*a71a9546SAutomerger Merge Worker 		break;
67*a71a9546SAutomerger Merge Worker 	case _802_3_TYPE:
68*a71a9546SAutomerger Merge Worker 		if (invert)
69*a71a9546SAutomerger Merge Worker 			info->invflags |= EBT_802_3_TYPE;
70*a71a9546SAutomerger Merge Worker 		i = strtoul(optarg, &end, 16);
71*a71a9546SAutomerger Merge Worker 		if (i > 65535 || *end != '\0') {
72*a71a9546SAutomerger Merge Worker 			xtables_error(PARAMETER_PROBLEM,
73*a71a9546SAutomerger Merge Worker 				      "Problem with the specified "
74*a71a9546SAutomerger Merge Worker 					"type hex value, %x",i);
75*a71a9546SAutomerger Merge Worker 		}
76*a71a9546SAutomerger Merge Worker 		info->type = htons(i);
77*a71a9546SAutomerger Merge Worker 		info->bitmask |= EBT_802_3_TYPE;
78*a71a9546SAutomerger Merge Worker 		break;
79*a71a9546SAutomerger Merge Worker 	default:
80*a71a9546SAutomerger Merge Worker 		return 0;
81*a71a9546SAutomerger Merge Worker 	}
82*a71a9546SAutomerger Merge Worker 
83*a71a9546SAutomerger Merge Worker 	*flags |= info->bitmask;
84*a71a9546SAutomerger Merge Worker 	return 1;
85*a71a9546SAutomerger Merge Worker }
86*a71a9546SAutomerger Merge Worker 
87*a71a9546SAutomerger Merge Worker static void
br802_3_final_check(unsigned int flags)88*a71a9546SAutomerger Merge Worker br802_3_final_check(unsigned int flags)
89*a71a9546SAutomerger Merge Worker {
90*a71a9546SAutomerger Merge Worker 	if (!flags)
91*a71a9546SAutomerger Merge Worker 		xtables_error(PARAMETER_PROBLEM,
92*a71a9546SAutomerger Merge Worker 			      "You must specify proper arguments");
93*a71a9546SAutomerger Merge Worker }
94*a71a9546SAutomerger Merge Worker 
br802_3_print(const void * ip,const struct xt_entry_match * match,int numeric)95*a71a9546SAutomerger Merge Worker static void br802_3_print(const void *ip, const struct xt_entry_match *match,
96*a71a9546SAutomerger Merge Worker 			  int numeric)
97*a71a9546SAutomerger Merge Worker {
98*a71a9546SAutomerger Merge Worker 	struct ebt_802_3_info *info = (struct ebt_802_3_info *)match->data;
99*a71a9546SAutomerger Merge Worker 
100*a71a9546SAutomerger Merge Worker 	if (info->bitmask & EBT_802_3_SAP) {
101*a71a9546SAutomerger Merge Worker 		printf("--802_3-sap ");
102*a71a9546SAutomerger Merge Worker 		if (info->invflags & EBT_802_3_SAP)
103*a71a9546SAutomerger Merge Worker 			printf("! ");
104*a71a9546SAutomerger Merge Worker 		printf("0x%.2x ", info->sap);
105*a71a9546SAutomerger Merge Worker 	}
106*a71a9546SAutomerger Merge Worker 	if (info->bitmask & EBT_802_3_TYPE) {
107*a71a9546SAutomerger Merge Worker 		printf("--802_3-type ");
108*a71a9546SAutomerger Merge Worker 		if (info->invflags & EBT_802_3_TYPE)
109*a71a9546SAutomerger Merge Worker 			printf("! ");
110*a71a9546SAutomerger Merge Worker 		printf("0x%.4x ", ntohs(info->type));
111*a71a9546SAutomerger Merge Worker 	}
112*a71a9546SAutomerger Merge Worker }
113*a71a9546SAutomerger Merge Worker 
114*a71a9546SAutomerger Merge Worker static struct xtables_match br802_3_match =
115*a71a9546SAutomerger Merge Worker {
116*a71a9546SAutomerger Merge Worker 	.name		= "802_3",
117*a71a9546SAutomerger Merge Worker 	.revision	= 0,
118*a71a9546SAutomerger Merge Worker 	.version	= XTABLES_VERSION,
119*a71a9546SAutomerger Merge Worker 	.family		= NFPROTO_BRIDGE,
120*a71a9546SAutomerger Merge Worker 	.size		= XT_ALIGN(sizeof(struct ebt_802_3_info)),
121*a71a9546SAutomerger Merge Worker 	.userspacesize	= XT_ALIGN(sizeof(struct ebt_802_3_info)),
122*a71a9546SAutomerger Merge Worker 	.init		= br802_3_init,
123*a71a9546SAutomerger Merge Worker 	.help		= br802_3_print_help,
124*a71a9546SAutomerger Merge Worker 	.parse		= br802_3_parse,
125*a71a9546SAutomerger Merge Worker 	.final_check	= br802_3_final_check,
126*a71a9546SAutomerger Merge Worker 	.print		= br802_3_print,
127*a71a9546SAutomerger Merge Worker 	.extra_opts	= br802_3_opts,
128*a71a9546SAutomerger Merge Worker };
129*a71a9546SAutomerger Merge Worker 
_init(void)130*a71a9546SAutomerger Merge Worker void _init(void)
131*a71a9546SAutomerger Merge Worker {
132*a71a9546SAutomerger Merge Worker 	xtables_register_match(&br802_3_match);
133*a71a9546SAutomerger Merge Worker }
134