]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
iproute: fix tc generating ipv6 priority filter
authorPetr Lautrbach <plautrba@redhat.com>
Mon, 14 Jun 2010 03:36:28 +0000 (03:36 +0000)
committerStephen Hemminger <stephen.hemminger@vyatta.com>
Fri, 23 Jul 2010 19:29:35 +0000 (12:29 -0700)
This patch adds ipv6 filter priority/traffic class function
static int parse_ip6_class(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
shifting filter value to 5th bit and ignoring "at" as header position
is exactly given.

Signed-off-by: Petr Lautrbach <plautrba@redhat.com>
tc/f_u32.c

index 4f5f74e41f0937d9d2a1b0933a80d0783980ed40..31e13b52d63e246786744ceb114b06d2dc4e555b 100644 (file)
@@ -403,6 +403,43 @@ static int parse_ip6_addr(int *argc_p, char ***argv_p,
        return res;
 }
 
+static int parse_ip6_class(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
+{
+       int res = -1;
+       int argc = *argc_p;
+       char **argv = *argv_p;
+       __u32 key;
+       __u32 mask;
+       int off = 0;
+       int offmask = 0;
+
+       if (argc < 2)
+               return -1;
+
+       if (get_u32(&key, *argv, 0))
+               return -1;
+       argc--; argv++;
+
+       if (get_u32(&mask, *argv, 16))
+               return -1;
+       argc--; argv++;
+
+       if (key > 0xFF || mask > 0xFF)
+               return -1;
+
+       key <<= 20;
+       mask <<= 20;
+       key = htonl(key);
+       mask = htonl(mask);
+
+       if (res = pack_key(sel, key, mask, off, offmask) < 0)
+               return -1;
+
+       *argc_p = argc;
+       *argv_p = argv;
+       return 0;
+}
+
 static int parse_ether_addr(int *argc_p, char ***argv_p,
                            struct tc_u32_sel *sel, int off)
 {
@@ -522,7 +559,7 @@ static int parse_ip6(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
                res = parse_ip6_addr(&argc, &argv, sel, 24);
        } else if (strcmp(*argv, "priority") == 0) {
                NEXT_ARG();
-               res = parse_u8(&argc, &argv, sel, 4, 0);
+               res = parse_ip6_class(&argc, &argv, sel);
        } else if (strcmp(*argv, "protocol") == 0) {
                NEXT_ARG();
                res = parse_u8(&argc, &argv, sel, 6, 0);