From d870b461bd54fdc090446cb4657fb92312619461 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 13 Nov 2000 14:37:20 +0000 Subject: shlib plugin foer ip6tables MARK added --- extensions/libip6t_MARK.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 extensions/libip6t_MARK.c (limited to 'extensions/libip6t_MARK.c') 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 +#include +#include +#include + +#include +#include +#include + +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); +} -- cgit v1.2.3