xref: /aosp_15_r20/external/iptables/extensions/libebt_arpreply.c (revision a71a954618bbadd4a345637e5edcf36eec826889)
1*a71a9546SAutomerger Merge Worker /* ebt_arpreply
2*a71a9546SAutomerger Merge Worker  *
3*a71a9546SAutomerger Merge Worker  * Authors:
4*a71a9546SAutomerger Merge Worker  * Grzegorz Borowiak <[email protected]>
5*a71a9546SAutomerger Merge Worker  * Bart De Schuymer <[email protected]>
6*a71a9546SAutomerger Merge Worker  *
7*a71a9546SAutomerger Merge Worker  *  August, 2003
8*a71a9546SAutomerger Merge Worker  */
9*a71a9546SAutomerger Merge Worker 
10*a71a9546SAutomerger Merge Worker #include <stdio.h>
11*a71a9546SAutomerger Merge Worker #include <string.h>
12*a71a9546SAutomerger Merge Worker #include <stdlib.h>
13*a71a9546SAutomerger Merge Worker #include <getopt.h>
14*a71a9546SAutomerger Merge Worker #include <xtables.h>
15*a71a9546SAutomerger Merge Worker #include <netinet/ether.h>
16*a71a9546SAutomerger Merge Worker #include <linux/netfilter_bridge/ebt_arpreply.h>
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 OPT_REPLY_MAC     0x01
21*a71a9546SAutomerger Merge Worker #define OPT_REPLY_TARGET  0x02
22*a71a9546SAutomerger Merge Worker 
23*a71a9546SAutomerger Merge Worker #define REPLY_MAC '1'
24*a71a9546SAutomerger Merge Worker #define REPLY_TARGET '2'
25*a71a9546SAutomerger Merge Worker static const struct option brarpreply_opts[] = {
26*a71a9546SAutomerger Merge Worker 	{ "arpreply-mac" ,    required_argument, 0, REPLY_MAC    },
27*a71a9546SAutomerger Merge Worker 	{ "arpreply-target" , required_argument, 0, REPLY_TARGET },
28*a71a9546SAutomerger Merge Worker 	XT_GETOPT_TABLEEND,
29*a71a9546SAutomerger Merge Worker };
30*a71a9546SAutomerger Merge Worker 
brarpreply_print_help(void)31*a71a9546SAutomerger Merge Worker static void brarpreply_print_help(void)
32*a71a9546SAutomerger Merge Worker {
33*a71a9546SAutomerger Merge Worker 	printf(
34*a71a9546SAutomerger Merge Worker 	"arpreply target options:\n"
35*a71a9546SAutomerger Merge Worker 	" --arpreply-mac address           : source MAC of generated reply\n"
36*a71a9546SAutomerger Merge Worker 	" --arpreply-target target         : ACCEPT, DROP, RETURN or CONTINUE\n"
37*a71a9546SAutomerger Merge Worker 	"                                    (standard target is DROP)\n");
38*a71a9546SAutomerger Merge Worker }
39*a71a9546SAutomerger Merge Worker 
brarpreply_init(struct xt_entry_target * target)40*a71a9546SAutomerger Merge Worker static void brarpreply_init(struct xt_entry_target *target)
41*a71a9546SAutomerger Merge Worker {
42*a71a9546SAutomerger Merge Worker 	struct ebt_arpreply_info *replyinfo = (void *)target->data;
43*a71a9546SAutomerger Merge Worker 
44*a71a9546SAutomerger Merge Worker 	replyinfo->target = EBT_DROP;
45*a71a9546SAutomerger Merge Worker }
46*a71a9546SAutomerger Merge Worker 
47*a71a9546SAutomerger Merge Worker static int
brarpreply_parse(int c,char ** argv,int invert,unsigned int * flags,const void * entry,struct xt_entry_target ** tg)48*a71a9546SAutomerger Merge Worker brarpreply_parse(int c, char **argv, int invert, unsigned int *flags,
49*a71a9546SAutomerger Merge Worker 	    const void *entry, struct xt_entry_target **tg)
50*a71a9546SAutomerger Merge Worker 
51*a71a9546SAutomerger Merge Worker {
52*a71a9546SAutomerger Merge Worker 	struct ebt_arpreply_info *replyinfo = (void *)(*tg)->data;
53*a71a9546SAutomerger Merge Worker 	struct ether_addr *addr;
54*a71a9546SAutomerger Merge Worker 
55*a71a9546SAutomerger Merge Worker 	switch (c) {
56*a71a9546SAutomerger Merge Worker 	case REPLY_MAC:
57*a71a9546SAutomerger Merge Worker 		EBT_CHECK_OPTION(flags, OPT_REPLY_MAC);
58*a71a9546SAutomerger Merge Worker 		if (!(addr = ether_aton(optarg)))
59*a71a9546SAutomerger Merge Worker 			xtables_error(PARAMETER_PROBLEM, "Problem with specified --arpreply-mac mac");
60*a71a9546SAutomerger Merge Worker 		memcpy(replyinfo->mac, addr, ETH_ALEN);
61*a71a9546SAutomerger Merge Worker 		break;
62*a71a9546SAutomerger Merge Worker 	case REPLY_TARGET:
63*a71a9546SAutomerger Merge Worker 		EBT_CHECK_OPTION(flags, OPT_REPLY_TARGET);
64*a71a9546SAutomerger Merge Worker 		if (ebt_fill_target(optarg, (unsigned int *)&replyinfo->target))
65*a71a9546SAutomerger Merge Worker 			xtables_error(PARAMETER_PROBLEM, "Illegal --arpreply-target target");
66*a71a9546SAutomerger Merge Worker 		break;
67*a71a9546SAutomerger Merge Worker 
68*a71a9546SAutomerger Merge Worker 	default:
69*a71a9546SAutomerger Merge Worker 		return 0;
70*a71a9546SAutomerger Merge Worker 	}
71*a71a9546SAutomerger Merge Worker 	return 1;
72*a71a9546SAutomerger Merge Worker }
73*a71a9546SAutomerger Merge Worker 
brarpreply_print(const void * ip,const struct xt_entry_target * t,int numeric)74*a71a9546SAutomerger Merge Worker static void brarpreply_print(const void *ip, const struct xt_entry_target *t, int numeric)
75*a71a9546SAutomerger Merge Worker {
76*a71a9546SAutomerger Merge Worker 	struct ebt_arpreply_info *replyinfo = (void *)t->data;
77*a71a9546SAutomerger Merge Worker 
78*a71a9546SAutomerger Merge Worker 	printf("--arpreply-mac ");
79*a71a9546SAutomerger Merge Worker 	xtables_print_mac(replyinfo->mac);
80*a71a9546SAutomerger Merge Worker 	if (replyinfo->target == EBT_DROP)
81*a71a9546SAutomerger Merge Worker 		return;
82*a71a9546SAutomerger Merge Worker 	printf(" --arpreply-target %s", ebt_target_name(replyinfo->target));
83*a71a9546SAutomerger Merge Worker }
84*a71a9546SAutomerger Merge Worker 
85*a71a9546SAutomerger Merge Worker static struct xtables_target arpreply_target = {
86*a71a9546SAutomerger Merge Worker 	.name		= "arpreply",
87*a71a9546SAutomerger Merge Worker 	.version	= XTABLES_VERSION,
88*a71a9546SAutomerger Merge Worker 	.family		= NFPROTO_BRIDGE,
89*a71a9546SAutomerger Merge Worker 	.init		= brarpreply_init,
90*a71a9546SAutomerger Merge Worker 	.size		= XT_ALIGN(sizeof(struct ebt_arpreply_info)),
91*a71a9546SAutomerger Merge Worker 	.userspacesize	= XT_ALIGN(sizeof(struct ebt_arpreply_info)),
92*a71a9546SAutomerger Merge Worker 	.help		= brarpreply_print_help,
93*a71a9546SAutomerger Merge Worker 	.parse		= brarpreply_parse,
94*a71a9546SAutomerger Merge Worker 	.print		= brarpreply_print,
95*a71a9546SAutomerger Merge Worker 	.extra_opts	= brarpreply_opts,
96*a71a9546SAutomerger Merge Worker };
97*a71a9546SAutomerger Merge Worker 
_init(void)98*a71a9546SAutomerger Merge Worker void _init(void)
99*a71a9546SAutomerger Merge Worker {
100*a71a9546SAutomerger Merge Worker 	xtables_register_target(&arpreply_target);
101*a71a9546SAutomerger Merge Worker }
102