diff options
author | Harald Welte <laforge@gnumonks.org> | 2000-11-13 14:37:20 +0000 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2000-11-13 14:37:20 +0000 |
commit | d870b461bd54fdc090446cb4657fb92312619461 (patch) | |
tree | 72875a9269ead8b6dfa2bfa6df61ac190bc844a9 /extensions/libip6t_MARK.c | |
parent | de8e5fa11a81c203a14b13f57276730fe0e7ab7e (diff) |
shlib plugin foer ip6tables MARK added
Diffstat (limited to 'extensions/libip6t_MARK.c')
-rw-r--r-- | extensions/libip6t_MARK.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/extensions/libip6t_MARK.c b/extensions/libip6t_MARK.c new file mode 100644 index 00000000..efbb4ec0 --- /dev/null +++ b/extensions/libip6t_MARK.c @@ -0,0 +1,121 @@ +/* Shared library add-on to iptables to add MARK target support. */ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <getopt.h> + +#include <ip6tables.h> +#include <linux/netfilter_ipv6/ip6_tables.h> +#include <linux/netfilter_ipv6/ip6t_MARK.h> + +struct markinfo { + struct ip6t_entry_target t; + struct ip6t_mark_target_info mark; +}; + +/* Function which prints out usage message. */ +static void +help(void) +{ + printf( +"MARK target v%s options:\n" +" --set-mark value Set nfmark value\n" +"\n", +NETFILTER_VERSION); +} + +static struct option opts[] = { + { "set-mark", 1, 0, '1' }, + { 0 } +}; + +/* Initialize the target. */ +static void +init(struct ip6t_entry_target *t, unsigned int *nfcache) +{ +} + +/* Function which parses command options; returns true if it + ate an option */ +static int +parse(int c, char **argv, int invert, unsigned int *flags, + const struct ip6t_entry *entry, + struct ip6t_entry_target **target) +{ + struct ip6t_mark_target_info *markinfo + = (struct ip6t_mark_target_info *)(*target)->data; + + switch (c) { + char *end; + case '1': + markinfo->mark = strtoul(optarg, &end, 0); + if (*end != '\0' || end == optarg) + exit_error(PARAMETER_PROBLEM, "Bad MARK value `%s'", optarg); + if (*flags) + exit_error(PARAMETER_PROBLEM, + "MARK target: Can't specify --set-mark twice"); + *flags = 1; + break; + + default: + return 0; + } + + return 1; +} + +static void +final_check(unsigned int flags) +{ + if (!flags) + exit_error(PARAMETER_PROBLEM, + "MARK target: Parameter --set-mark is required"); +} + +static void +print_mark(unsigned long mark, int numeric) +{ + printf("0x%lx ", mark); +} + +/* Prints out the targinfo. */ +static void +print(const struct ip6t_ip6 *ip, + const struct ip6t_entry_target *target, + int numeric) +{ + const struct ip6t_mark_target_info *markinfo = + (const struct ip6t_mark_target_info *)target->data; + printf("MARK set "); + print_mark(markinfo->mark, numeric); +} + +/* Saves the union ipt_targinfo in parsable form to stdout. */ +static void +save(const struct ip6t_ip6 *ip, const struct ip6t_entry_target *target) +{ + const struct ip6t_mark_target_info *markinfo = + (const struct ip6t_mark_target_info *)target->data; + + printf("--set-mark 0x%lx ", markinfo->mark); +} + +struct ip6tables_target mark += { NULL, + "MARK", + NETFILTER_VERSION, + IP6T_ALIGN(sizeof(struct ip6t_mark_target_info)), + IP6T_ALIGN(sizeof(struct ip6t_mark_target_info)), + &help, + &init, + &parse, + &final_check, + &print, + &save, + opts +}; + +void _init(void) +{ + register_target6(&mark); +} |