You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.6 KiB
118 lines
2.6 KiB
/* ebt_mark_m |
|
* |
|
* Authors: |
|
* Bart De Schuymer <bdschuym@pandora.be> |
|
* |
|
* July, 2002 |
|
* |
|
* Adapted by Arturo Borrero Gonzalez <arturo@debian.org> |
|
* to use libxtables for ebtables-compat in 2015. |
|
*/ |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <getopt.h> |
|
#include <xtables.h> |
|
#include <linux/netfilter_bridge/ebt_mark_m.h> |
|
|
|
#define MARK '1' |
|
|
|
static struct option brmark_m_opts[] = { |
|
{ .name = "mark", .has_arg = true, .val = MARK }, |
|
XT_GETOPT_TABLEEND, |
|
}; |
|
|
|
static void brmark_m_print_help(void) |
|
{ |
|
printf( |
|
"mark option:\n" |
|
"--mark [!] [value][/mask]: Match nfmask value (see man page)\n"); |
|
} |
|
|
|
static void brmark_m_init(struct xt_entry_match *match) |
|
{ |
|
struct ebt_mark_m_info *info = (struct ebt_mark_m_info *)match->data; |
|
|
|
info->mark = 0; |
|
info->mask = 0; |
|
info->invert = 0; |
|
info->bitmask = 0; |
|
} |
|
|
|
#define OPT_MARK 0x01 |
|
static int |
|
brmark_m_parse(int c, char **argv, int invert, unsigned int *flags, |
|
const void *entry, struct xt_entry_match **match) |
|
{ |
|
struct ebt_mark_m_info *info = (struct ebt_mark_m_info *) |
|
(*match)->data; |
|
char *end; |
|
|
|
switch (c) { |
|
case MARK: |
|
if (invert) |
|
info->invert = 1; |
|
info->mark = strtoul(optarg, &end, 0); |
|
info->bitmask = EBT_MARK_AND; |
|
if (*end == '/') { |
|
if (end == optarg) |
|
info->bitmask = EBT_MARK_OR; |
|
info->mask = strtoul(end+1, &end, 0); |
|
} else { |
|
info->mask = 0xffffffff; |
|
} |
|
if (*end != '\0' || end == optarg) |
|
xtables_error(PARAMETER_PROBLEM, "Bad mark value '%s'", |
|
optarg); |
|
break; |
|
default: |
|
return 0; |
|
} |
|
|
|
*flags |= info->bitmask; |
|
return 1; |
|
} |
|
|
|
static void brmark_m_final_check(unsigned int flags) |
|
{ |
|
if (!flags) |
|
xtables_error(PARAMETER_PROBLEM, |
|
"You must specify proper arguments"); |
|
} |
|
|
|
static void brmark_m_print(const void *ip, const struct xt_entry_match *match, |
|
int numeric) |
|
{ |
|
struct ebt_mark_m_info *info = (struct ebt_mark_m_info *)match->data; |
|
|
|
printf("--mark "); |
|
if (info->invert) |
|
printf("! "); |
|
if (info->bitmask == EBT_MARK_OR) |
|
printf("/0x%lx ", info->mask); |
|
else if (info->mask != 0xffffffff) |
|
printf("0x%lx/0x%lx ", info->mark, info->mask); |
|
else |
|
printf("0x%lx ", info->mark); |
|
} |
|
|
|
static struct xtables_match brmark_m_match = { |
|
.name = "mark_m", |
|
.revision = 0, |
|
.version = XTABLES_VERSION, |
|
.family = NFPROTO_BRIDGE, |
|
.size = XT_ALIGN(sizeof(struct ebt_mark_m_info)), |
|
.userspacesize = XT_ALIGN(sizeof(struct ebt_mark_m_info)), |
|
.init = brmark_m_init, |
|
.help = brmark_m_print_help, |
|
.parse = brmark_m_parse, |
|
.final_check = brmark_m_final_check, |
|
.print = brmark_m_print, |
|
.extra_opts = brmark_m_opts, |
|
}; |
|
|
|
void _init(void) |
|
{ |
|
xtables_register_match(&brmark_m_match); |
|
}
|
|
|