flower: Represent HW traffic classes as classid values
This patch was previously submitted as RFC. Submitting this as non-RFC now that the classid reservation scheme for hardware traffic classes and offloads to route packets to a hardware traffic class are accepted in net-next. HW traffic classes 0 through 15 are represented using the reserved classid values :ffe0 - :ffef. Example: Match Dst IPv4,Dst Port and route to TC1: # tc filter add dev eth0 protocol ip parent ffff:\ prio 1 flower dst_ip 192.168.1.1/32\ ip_proto udp dst_port 12000 skip_sw\ hw_tc 1 # tc filter show dev eth0 parent ffff: filter pref 1 flower chain 0 filter pref 1 flower chain 0 handle 0x1 hw_tc 1 eth_type ipv4 ip_proto udp dst_ip 192.168.1.1 dst_port 12000 skip_sw in_hw Signed-off-by: Amritha Nambiar <amritha.nambiar@intel.com>
This commit is contained in:
parent
ba914908eb
commit
0d575c4dac
|
|
@ -619,6 +619,25 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
addattr_l(n, MAX_MSG, TCA_FLOWER_CLASSID, &handle, 4);
|
addattr_l(n, MAX_MSG, TCA_FLOWER_CLASSID, &handle, 4);
|
||||||
|
} else if (matches(*argv, "hw_tc") == 0) {
|
||||||
|
unsigned int handle;
|
||||||
|
__u32 tc;
|
||||||
|
char *end;
|
||||||
|
|
||||||
|
NEXT_ARG();
|
||||||
|
tc = strtoul(*argv, &end, 0);
|
||||||
|
if (*end) {
|
||||||
|
fprintf(stderr, "Illegal TC index\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (tc >= TC_QOPT_MAX_QUEUE) {
|
||||||
|
fprintf(stderr, "TC index exceeds max range\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
handle = TC_H_MAKE(TC_H_MAJ(t->tcm_parent),
|
||||||
|
TC_H_MIN(tc + TC_H_MIN_PRIORITY));
|
||||||
|
addattr_l(n, MAX_MSG, TCA_FLOWER_CLASSID, &handle,
|
||||||
|
sizeof(handle));
|
||||||
} else if (matches(*argv, "ip_flags") == 0) {
|
} else if (matches(*argv, "ip_flags") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
ret = flower_parse_matching_flags(*argv,
|
ret = flower_parse_matching_flags(*argv,
|
||||||
|
|
@ -1273,10 +1292,16 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
|
||||||
fprintf(f, "handle 0x%x ", handle);
|
fprintf(f, "handle 0x%x ", handle);
|
||||||
|
|
||||||
if (tb[TCA_FLOWER_CLASSID]) {
|
if (tb[TCA_FLOWER_CLASSID]) {
|
||||||
SPRINT_BUF(b1);
|
__u32 h = rta_getattr_u32(tb[TCA_FLOWER_CLASSID]);
|
||||||
fprintf(f, "classid %s ",
|
|
||||||
sprint_tc_classid(rta_getattr_u32(tb[TCA_FLOWER_CLASSID]),
|
if (TC_H_MIN(h) < TC_H_MIN_PRIORITY ||
|
||||||
b1));
|
TC_H_MIN(h) > (TC_H_MIN_PRIORITY + TC_QOPT_MAX_QUEUE - 1)) {
|
||||||
|
SPRINT_BUF(b1);
|
||||||
|
fprintf(f, "classid %s ", sprint_tc_classid(h, b1));
|
||||||
|
} else {
|
||||||
|
fprintf(f, "hw_tc %u ",
|
||||||
|
TC_H_MIN(h) - TC_H_MIN_PRIORITY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tb[TCA_FLOWER_INDEV]) {
|
if (tb[TCA_FLOWER_INDEV]) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue