/* ebt_arpreply * * Authors: * Grzegorz Borowiak * Bart De Schuymer * * August, 2003 */ #include #include #include #include #include #include #include #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); }