Blame bootstrap_ver/extensions/libebt_arpreply.c

Packit Service dd8e2b
/* ebt_arpreply
Packit Service dd8e2b
 *
Packit Service dd8e2b
 * Authors:
Packit Service dd8e2b
 * Grzegorz Borowiak <grzes@gnu.univ.gda.pl>
Packit Service dd8e2b
 * Bart De Schuymer <bdschuym@pandora.be>
Packit Service dd8e2b
 *
Packit Service dd8e2b
 *  August, 2003
Packit Service dd8e2b
 */
Packit Service dd8e2b
Packit Service dd8e2b
#include <stdio.h>
Packit Service dd8e2b
#include <string.h>
Packit Service dd8e2b
#include <stdlib.h>
Packit Service dd8e2b
#include <getopt.h>
Packit Service dd8e2b
#include <xtables.h>
Packit Service dd8e2b
#include <netinet/ether.h>
Packit Service dd8e2b
#include <linux/netfilter_bridge/ebt_arpreply.h>
Packit Service dd8e2b
#include "iptables/nft.h"
Packit Service dd8e2b
#include "iptables/nft-bridge.h"
Packit Service dd8e2b
Packit Service dd8e2b
#define OPT_REPLY_MAC     0x01
Packit Service dd8e2b
#define OPT_REPLY_TARGET  0x02
Packit Service dd8e2b
Packit Service dd8e2b
#define REPLY_MAC '1'
Packit Service dd8e2b
#define REPLY_TARGET '2'
Packit Service dd8e2b
static const struct option brarpreply_opts[] = {
Packit Service dd8e2b
	{ "arpreply-mac" ,    required_argument, 0, REPLY_MAC    },
Packit Service dd8e2b
	{ "arpreply-target" , required_argument, 0, REPLY_TARGET },
Packit Service dd8e2b
	XT_GETOPT_TABLEEND,
Packit Service dd8e2b
};
Packit Service dd8e2b
Packit Service dd8e2b
static void brarpreply_print_help(void)
Packit Service dd8e2b
{
Packit Service dd8e2b
	printf(
Packit Service dd8e2b
	"arpreply target options:\n"
Packit Service dd8e2b
	" --arpreply-mac address           : source MAC of generated reply\n"
Packit Service dd8e2b
	" --arpreply-target target         : ACCEPT, DROP, RETURN or CONTINUE\n"
Packit Service dd8e2b
	"                                    (standard target is DROP)\n");
Packit Service dd8e2b
}
Packit Service dd8e2b
Packit Service dd8e2b
static void brarpreply_init(struct xt_entry_target *target)
Packit Service dd8e2b
{
Packit Service dd8e2b
	struct ebt_arpreply_info *replyinfo = (void *)target->data;
Packit Service dd8e2b
Packit Service dd8e2b
	replyinfo->target = EBT_DROP;
Packit Service dd8e2b
}
Packit Service dd8e2b
Packit Service dd8e2b
static int
Packit Service dd8e2b
brarpreply_parse(int c, char **argv, int invert, unsigned int *flags,
Packit Service dd8e2b
	    const void *entry, struct xt_entry_target **tg)
Packit Service dd8e2b
Packit Service dd8e2b
{
Packit Service dd8e2b
	struct ebt_arpreply_info *replyinfo = (void *)(*tg)->data;
Packit Service dd8e2b
	struct ether_addr *addr;
Packit Service dd8e2b
Packit Service dd8e2b
	switch (c) {
Packit Service dd8e2b
	case REPLY_MAC:
Packit Service dd8e2b
		EBT_CHECK_OPTION(flags, OPT_REPLY_MAC);
Packit Service dd8e2b
		if (!(addr = ether_aton(optarg)))
Packit Service dd8e2b
			xtables_error(PARAMETER_PROBLEM, "Problem with specified --arpreply-mac mac");
Packit Service dd8e2b
		memcpy(replyinfo->mac, addr, ETH_ALEN);
Packit Service dd8e2b
		break;
Packit Service dd8e2b
	case REPLY_TARGET:
Packit Service dd8e2b
		EBT_CHECK_OPTION(flags, OPT_REPLY_TARGET);
Packit Service dd8e2b
		if (ebt_fill_target(optarg, (unsigned int *)&replyinfo->target))
Packit Service dd8e2b
			xtables_error(PARAMETER_PROBLEM, "Illegal --arpreply-target target");
Packit Service dd8e2b
		break;
Packit Service dd8e2b
Packit Service dd8e2b
	default:
Packit Service dd8e2b
		return 0;
Packit Service dd8e2b
	}
Packit Service dd8e2b
	return 1;
Packit Service dd8e2b
}
Packit Service dd8e2b
Packit Service dd8e2b
static void brarpreply_print(const void *ip, const struct xt_entry_target *t, int numeric)
Packit Service dd8e2b
{
Packit Service dd8e2b
	struct ebt_arpreply_info *replyinfo = (void *)t->data;
Packit Service dd8e2b
Packit Service dd8e2b
	printf("--arpreply-mac ");
Packit Service dd8e2b
	xtables_print_mac(replyinfo->mac);
Packit Service dd8e2b
	if (replyinfo->target == EBT_DROP)
Packit Service dd8e2b
		return;
Packit Service dd8e2b
	printf(" --arpreply-target %s", ebt_target_name(replyinfo->target));
Packit Service dd8e2b
}
Packit Service dd8e2b
Packit Service dd8e2b
static struct xtables_target arpreply_target = {
Packit Service dd8e2b
	.name		= "arpreply",
Packit Service dd8e2b
	.version	= XTABLES_VERSION,
Packit Service dd8e2b
	.family		= NFPROTO_BRIDGE,
Packit Service dd8e2b
	.init		= brarpreply_init,
Packit Service dd8e2b
	.size		= XT_ALIGN(sizeof(struct ebt_arpreply_info)),
Packit Service dd8e2b
	.userspacesize	= XT_ALIGN(sizeof(struct ebt_arpreply_info)),
Packit Service dd8e2b
	.help		= brarpreply_print_help,
Packit Service dd8e2b
	.parse		= brarpreply_parse,
Packit Service dd8e2b
	.print		= brarpreply_print,
Packit Service dd8e2b
	.extra_opts	= brarpreply_opts,
Packit Service dd8e2b
};
Packit Service dd8e2b
Packit Service dd8e2b
void _init(void)
Packit Service dd8e2b
{
Packit Service dd8e2b
	xtables_register_target(&arpreply_target);
Packit Service dd8e2b
}