]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
ebtables-nft: add arpreply target
authorFlorian Westphal <fw@strlen.de>
Tue, 9 Oct 2018 15:21:37 +0000 (17:21 +0200)
committerFlorian Westphal <fw@strlen.de>
Sat, 3 Nov 2018 19:35:22 +0000 (20:35 +0100)
Unfortunately no nft translation available so far.

Signed-off-by: Florian Westphal <fw@strlen.de>
extensions/libebt_arpreply.c [new file with mode: 0644]
extensions/libebt_arpreply.t [new file with mode: 0644]
iptables/xtables-eb.c

diff --git a/extensions/libebt_arpreply.c b/extensions/libebt_arpreply.c
new file mode 100644 (file)
index 0000000..998dece
--- /dev/null
@@ -0,0 +1,106 @@
+/* ebt_arpreply
+ *
+ * Authors:
+ * Grzegorz Borowiak <grzes@gnu.univ.gda.pl>
+ * Bart De Schuymer <bdschuym@pandora.be>
+ *
+ *  August, 2003
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <xtables.h>
+#include <netinet/ether.h>
+#include <linux/netfilter_bridge/ebt_arpreply.h>
+#include "iptables/nft.h"
+#include "iptables/nft-bridge.h"
+
+#define OPT_REPLY_MAC     0x01
+#define OPT_REPLY_TARGET  0x02
+
+#define REPLY_MAC '1'
+#define REPLY_TARGET '2'
+static const struct option brarpreply_opts[] = {
+       { "arpreply-mac" ,    required_argument, 0, REPLY_MAC    },
+       { "arpreply-target" , required_argument, 0, REPLY_TARGET },
+       XT_GETOPT_TABLEEND,
+};
+
+static void brarpreply_print_help(void)
+{
+       printf(
+       "arpreply target options:\n"
+       " --arpreply-mac address           : source MAC of generated reply\n"
+       " --arpreply-target target         : ACCEPT, DROP, RETURN or CONTINUE\n"
+       "                                    (standard target is DROP)\n");
+}
+
+static void brarpreply_init(struct xt_entry_target *target)
+{
+       struct ebt_arpreply_info *replyinfo = (void *)target->data;
+
+       replyinfo->target = EBT_DROP;
+}
+
+static int
+brarpreply_parse(int c, char **argv, int invert, unsigned int *flags,
+           const void *entry, struct xt_entry_target **tg)
+
+{
+       struct ebt_arpreply_info *replyinfo = (void *)(*tg)->data;
+       struct ether_addr *addr;
+
+       switch (c) {
+       case REPLY_MAC:
+               EBT_CHECK_OPTION(flags, OPT_REPLY_MAC);
+               if (!(addr = ether_aton(optarg)))
+                       xtables_error(PARAMETER_PROBLEM, "Problem with specified --arpreply-mac mac");
+               memcpy(replyinfo->mac, addr, ETH_ALEN);
+               break;
+       case REPLY_TARGET:
+               EBT_CHECK_OPTION(flags, OPT_REPLY_TARGET);
+               if (ebt_fill_target(optarg, (unsigned int *)&replyinfo->target))
+                       xtables_error(PARAMETER_PROBLEM, "Illegal --arpreply-target target");
+               break;
+
+       default:
+               return 0;
+       }
+       return 1;
+}
+
+static void ebt_print_mac(const unsigned char *mac)
+{
+       printf("%s", ether_ntoa((struct ether_addr *) mac));
+}
+
+static void brarpreply_print(const void *ip, const struct xt_entry_target *t, int numeric)
+{
+       struct ebt_arpreply_info *replyinfo = (void *)t->data;
+
+       printf("--arpreply-mac ");
+       ebt_print_mac(replyinfo->mac);
+       if (replyinfo->target == EBT_DROP)
+               return;
+       printf(" --arpreply-target %s", ebt_target_name(replyinfo->target));
+}
+
+static struct xtables_target arpreply_target = {
+       .name           = "arpreply",
+       .version        = XTABLES_VERSION,
+       .family         = NFPROTO_BRIDGE,
+       .init           = brarpreply_init,
+       .size           = XT_ALIGN(sizeof(struct ebt_arpreply_info)),
+       .userspacesize  = XT_ALIGN(sizeof(struct ebt_arpreply_info)),
+       .help           = brarpreply_print_help,
+       .parse          = brarpreply_parse,
+       .print          = brarpreply_print,
+       .extra_opts     = brarpreply_opts,
+};
+
+void _init(void)
+{
+       xtables_register_target(&arpreply_target);
+}
diff --git a/extensions/libebt_arpreply.t b/extensions/libebt_arpreply.t
new file mode 100644 (file)
index 0000000..f7bc85f
--- /dev/null
@@ -0,0 +1,4 @@
+:PREROUTING
+*nat
+-p ARP -i foo -j arpreply --arpreply-mac de:ad:0:be:ee:ff --arpreply-target ACCEPT;=;OK
+-p ARP -i foo -j arpreply --arpreply-mac de:ad:0:be:ee:ff;=;OK
index c36c12e682227b804c05264e3a48fa8c7a91e6c1..871891442e4318989075b6afdfa638c8b81f1a96 100644 (file)
@@ -655,6 +655,7 @@ void ebt_load_match_extensions(void)
        ebt_load_target("mark");
        ebt_load_target("dnat");
        ebt_load_target("snat");
+       ebt_load_target("arpreply");
        ebt_load_target("redirect");
        ebt_load_target("standard");
 }