summaryrefslogtreecommitdiffstats
path: root/extensions/libip6t_mark.c
diff options
context:
space:
mode:
authorgandalf <gandalf>2004-05-26 21:56:26 +0000
committergandalf <gandalf>2004-05-26 21:56:26 +0000
commit37ad1679aa18e4c3170d645f543fe4455bcdead5 (patch)
tree198938989ba4ca43c19bc02c100af0aca8d06e15 /extensions/libip6t_mark.c
parentc5a2851e96afd3e06785551ab90eb1157407e6cb (diff)
With a 64bit kernel only the high 32bits of nfmark was used regardless of
32/64bit userspace. This makes it quite hard to interoperate with 'tc'. Sync ipv6 versions with ipv4 versions. Tested on x86 and sparc64 with both 32bit and 64bit userspace.
Diffstat (limited to 'extensions/libip6t_mark.c')
-rw-r--r--extensions/libip6t_mark.c46
1 files changed, 35 insertions, 11 deletions
diff --git a/extensions/libip6t_mark.c b/extensions/libip6t_mark.c
index 4aa606e..5f335eb 100644
--- a/extensions/libip6t_mark.c
+++ b/extensions/libip6t_mark.c
@@ -6,7 +6,8 @@
#include <getopt.h>
#include <ip6tables.h>
-#include <linux/netfilter_ipv6/ip6t_mark.h>
+/* For 64bit kernel / 32bit userspace */
+#include "../include/linux/netfilter_ipv6/ip6t_mark.h"
/* Function which prints out usage message. */
static void
@@ -46,11 +47,19 @@ parse(int c, char **argv, int invert, unsigned int *flags,
char *end;
case '1':
check_inverse(optarg, &invert, &optind, 0);
+#ifdef KERNEL_64_USERSPACE_32
+ markinfo->mark = strtoull(optarg, &end, 0);
+ if (*end == '/') {
+ markinfo->mask = strtoull(end+1, &end, 0);
+ } else
+ markinfo->mask = 0xffffffffffffffffULL;
+#else
markinfo->mark = strtoul(optarg, &end, 0);
if (*end == '/') {
markinfo->mask = strtoul(end+1, &end, 0);
} else
markinfo->mask = 0xffffffff;
+#endif
if (*end != '\0' || end == optarg)
exit_error(PARAMETER_PROBLEM, "Bad MARK value `%s'", optarg);
if (invert)
@@ -64,17 +73,25 @@ parse(int c, char **argv, int invert, unsigned int *flags,
return 1;
}
+#ifdef KERNEL_64_USERSPACE_32
static void
-print_mark(unsigned long mark, unsigned long mask, int invert, int numeric)
+print_mark(unsigned long long mark, unsigned long long mask, int numeric)
+{
+ if(mask != 0xffffffffffffffffULL)
+ printf("0x%llx/0x%llx ", mark, mask);
+ else
+ printf("0x%llx ", mark);
+}
+#else
+static void
+print_mark(unsigned long mark, unsigned long mask, int numeric)
{
- if (invert)
- fputc('!', stdout);
-
if(mask != 0xffffffff)
printf("0x%lx/0x%lx ", mark, mask);
else
printf("0x%lx ", mark);
}
+#endif
/* Final check; must have specified --mark. */
static void
@@ -91,20 +108,27 @@ print(const struct ip6t_ip6 *ip,
const struct ip6t_entry_match *match,
int numeric)
{
+ struct ip6t_mark_info *info = (struct ip6t_mark_info *)match->data;
+
printf("MARK match ");
- print_mark(((struct ip6t_mark_info *)match->data)->mark,
- ((struct ip6t_mark_info *)match->data)->mask,
- ((struct ip6t_mark_info *)match->data)->invert, numeric);
+
+ if (info->invert)
+ printf("!");
+
+ print_mark(info->mark, info->mask, numeric);
}
/* Saves the union ip6t_matchinfo in parsable form to stdout. */
static void
save(const struct ip6t_ip6 *ip, const struct ip6t_entry_match *match)
{
+ struct ip6t_mark_info *info = (struct ip6t_mark_info *)match->data;
+
+ if (info->invert)
+ printf("! ");
+
printf("--mark ");
- print_mark(((struct ip6t_mark_info *)match->data)->mark,
- ((struct ip6t_mark_info *)match->data)->mask,
- ((struct ip6t_mark_info *)match->data)->invert, 0);
+ print_mark(info->mark, info->mask, 0);
}
static