Commit 01564122 authored by Petr Lautrbach's avatar Petr Lautrbach Committed by Stephen Hemminger

iproute: fix tc generating ipv6 priority filter

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: default avatarPetr Lautrbach <plautrba@redhat.com>
parent bf512683
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment