102 lines
2.6 KiB
C
102 lines
2.6 KiB
C
/* 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 brarpreply_print(const void *ip, const struct xt_entry_target *t, int numeric)
|
|
{
|
|
struct ebt_arpreply_info *replyinfo = (void *)t->data;
|
|
|
|
printf("--arpreply-mac ");
|
|
xtables_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);
|
|
}
|