From: Petr Lautrbach Date: Mon, 14 Jun 2010 03:36:28 +0000 (+0000) Subject: iproute: fix tc generating ipv6 priority filter X-Git-Tag: v2.6.35~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0156412215abec067ff08d760f454adbccb9a13f;p=thirdparty%2Fiproute2.git 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: Petr Lautrbach --- diff --git a/tc/f_u32.c b/tc/f_u32.c index 4f5f74e41..31e13b52d 100644 --- a/tc/f_u32.c +++ b/tc/f_u32.c @@ -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);