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