diff options
Diffstat (limited to 'extensions/libebt_802_3.c')
-rw-r--r-- | extensions/libebt_802_3.c | 93 |
1 files changed, 23 insertions, 70 deletions
diff --git a/extensions/libebt_802_3.c b/extensions/libebt_802_3.c index f05d02ea..489185e9 100644 --- a/extensions/libebt_802_3.c +++ b/extensions/libebt_802_3.c @@ -13,83 +13,40 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> -#include <getopt.h> #include <xtables.h> #include <linux/netfilter_bridge/ebt_802_3.h> -#define _802_3_SAP '1' -#define _802_3_TYPE '2' - -static const struct option br802_3_opts[] = { - { .name = "802_3-sap", .has_arg = true, .val = _802_3_SAP }, - { .name = "802_3-type", .has_arg = true, .val = _802_3_TYPE }, - XT_GETOPT_TABLEEND, +static const struct xt_option_entry br802_3_opts[] = +{ + { .name = "802_3-sap", .id = EBT_802_3_SAP, + .type = XTTYPE_UINT8, .base = 16, + .flags = XTOPT_INVERT | XTOPT_PUT, + XTOPT_POINTER(struct ebt_802_3_info, sap) }, + { .name = "802_3-type", .id = EBT_802_3_TYPE, + .type = XTTYPE_UINT16, .base = 16, + .flags = XTOPT_INVERT | XTOPT_PUT | XTOPT_NBO, + XTOPT_POINTER(struct ebt_802_3_info, type) }, + XTOPT_TABLEEND, }; static void br802_3_print_help(void) { printf( "802_3 options:\n" -"--802_3-sap [!] protocol : 802.3 DSAP/SSAP- 1 byte value (hex)\n" +"[!] --802_3-sap protocol : 802.3 DSAP/SSAP- 1 byte value (hex)\n" " DSAP and SSAP are always the same. One SAP applies to both fields\n" -"--802_3-type [!] protocol : 802.3 SNAP Type- 2 byte value (hex)\n" +"[!] --802_3-type protocol : 802.3 SNAP Type- 2 byte value (hex)\n" " Type implies SAP value 0xaa\n"); } -static void br802_3_init(struct xt_entry_match *match) -{ - struct ebt_802_3_info *info = (struct ebt_802_3_info *)match->data; - - info->invflags = 0; - info->bitmask = 0; -} - -static int -br802_3_parse(int c, char **argv, int invert, unsigned int *flags, - const void *entry, struct xt_entry_match **match) +static void br802_3_parse(struct xt_option_call *cb) { - struct ebt_802_3_info *info = (struct ebt_802_3_info *) (*match)->data; - unsigned int i; - char *end; - - switch (c) { - case _802_3_SAP: - if (invert) - info->invflags |= EBT_802_3_SAP; - i = strtoul(optarg, &end, 16); - if (i > 255 || *end != '\0') - xtables_error(PARAMETER_PROBLEM, - "Problem with specified " - "sap hex value, %x",i); - info->sap = i; /* one byte, so no byte order worries */ - info->bitmask |= EBT_802_3_SAP; - break; - case _802_3_TYPE: - if (invert) - info->invflags |= EBT_802_3_TYPE; - i = strtoul(optarg, &end, 16); - if (i > 65535 || *end != '\0') { - xtables_error(PARAMETER_PROBLEM, - "Problem with the specified " - "type hex value, %x",i); - } - info->type = htons(i); - info->bitmask |= EBT_802_3_TYPE; - break; - default: - return 0; - } + struct ebt_802_3_info *info = cb->data; - *flags |= info->bitmask; - return 1; -} - -static void -br802_3_final_check(unsigned int flags) -{ - if (!flags) - xtables_error(PARAMETER_PROBLEM, - "You must specify proper arguments"); + xtables_option_parse(cb); + info->bitmask |= cb->entry->id; + if (cb->invert) + info->invflags |= cb->entry->id; } static void br802_3_print(const void *ip, const struct xt_entry_match *match, @@ -98,16 +55,14 @@ static void br802_3_print(const void *ip, const struct xt_entry_match *match, struct ebt_802_3_info *info = (struct ebt_802_3_info *)match->data; if (info->bitmask & EBT_802_3_SAP) { - printf("--802_3-sap "); if (info->invflags & EBT_802_3_SAP) printf("! "); - printf("0x%.2x ", info->sap); + printf("--802_3-sap 0x%.2x ", info->sap); } if (info->bitmask & EBT_802_3_TYPE) { - printf("--802_3-type "); if (info->invflags & EBT_802_3_TYPE) printf("! "); - printf("0x%.4x ", ntohs(info->type)); + printf("--802_3-type 0x%.4x ", ntohs(info->type)); } } @@ -119,12 +74,10 @@ static struct xtables_match br802_3_match = .family = NFPROTO_BRIDGE, .size = XT_ALIGN(sizeof(struct ebt_802_3_info)), .userspacesize = XT_ALIGN(sizeof(struct ebt_802_3_info)), - .init = br802_3_init, .help = br802_3_print_help, - .parse = br802_3_parse, - .final_check = br802_3_final_check, + .x6_parse = br802_3_parse, .print = br802_3_print, - .extra_opts = br802_3_opts, + .x6_options = br802_3_opts, }; void _init(void) |