• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ebt_redirect
2  *
3  * Authors:
4  * Bart De Schuymer <bdschuym@pandora.be>
5  *
6  * April, 2002
7  */
8 
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <xtables.h>
13 #include <linux/netfilter_bridge/ebt_redirect.h>
14 #include "iptables/nft.h"
15 #include "iptables/nft-bridge.h"
16 
17 enum {
18 	O_TARGET,
19 };
20 
21 static const struct xt_option_entry brredir_opts[] =
22 {
23 	{ .name = "redirect-target", .id = O_TARGET, .type = XTTYPE_STRING },
24 	XTOPT_TABLEEND,
25 };
26 
brredir_print_help(void)27 static void brredir_print_help(void)
28 {
29 	printf(
30 	"redirect option:\n"
31 	" --redirect-target target   : ACCEPT, DROP, RETURN or CONTINUE\n");
32 }
33 
brredir_init(struct xt_entry_target * target)34 static void brredir_init(struct xt_entry_target *target)
35 {
36 	struct ebt_redirect_info *redirectinfo =
37 	   (struct ebt_redirect_info *)target->data;
38 
39 	redirectinfo->target = EBT_ACCEPT;
40 }
41 
brredir_parse(struct xt_option_call * cb)42 static void brredir_parse(struct xt_option_call *cb)
43 {
44 	struct ebt_redirect_info *redirectinfo = cb->data;
45 
46 	xtables_option_parse(cb);
47 	if (cb->entry->id == O_TARGET &&
48 	    ebt_fill_target(cb->arg, (unsigned int *)&redirectinfo->target))
49 		xtables_error(PARAMETER_PROBLEM,
50 			      "Illegal --redirect-target target");
51 }
52 
brredir_print(const void * ip,const struct xt_entry_target * target,int numeric)53 static void brredir_print(const void *ip, const struct xt_entry_target *target, int numeric)
54 {
55 	struct ebt_redirect_info *redirectinfo =
56 	   (struct ebt_redirect_info *)target->data;
57 
58 	if (redirectinfo->target == EBT_ACCEPT)
59 		return;
60 	printf("--redirect-target %s", ebt_target_name(redirectinfo->target));
61 }
62 
brredir_verdict(int verdict)63 static const char* brredir_verdict(int verdict)
64 {
65 	switch (verdict) {
66 	case EBT_ACCEPT: return "accept";
67 	case EBT_DROP: return "drop";
68 	case EBT_CONTINUE: return "continue";
69 	case EBT_RETURN: return "return";
70 	}
71 
72 	return "";
73 }
74 
brredir_xlate(struct xt_xlate * xl,const struct xt_xlate_tg_params * params)75 static int brredir_xlate(struct xt_xlate *xl,
76 			 const struct xt_xlate_tg_params *params)
77 {
78 	const struct ebt_redirect_info *red = (const void*)params->target->data;
79 
80 	xt_xlate_add(xl, "meta pkttype set host");
81 	if (red->target != EBT_CONTINUE)
82 		xt_xlate_add(xl, " %s ", brredir_verdict(red->target));
83 	return 1;
84 }
85 
86 static struct xtables_target brredirect_target = {
87 	.name		= "redirect",
88 	.version	= XTABLES_VERSION,
89 	.family		= NFPROTO_BRIDGE,
90 	.size		= XT_ALIGN(sizeof(struct ebt_redirect_info)),
91 	.userspacesize	= XT_ALIGN(sizeof(struct ebt_redirect_info)),
92 	.help		= brredir_print_help,
93 	.init		= brredir_init,
94 	.x6_parse	= brredir_parse,
95 	.print		= brredir_print,
96 	.xlate		= brredir_xlate,
97 	.x6_options	= brredir_opts,
98 };
99 
_init(void)100 void _init(void)
101 {
102 	xtables_register_target(&brredirect_target);
103 }
104