tc: Reflect HW offload status

Currently there is no way of querying whether a filter is
offloaded to HW or not when using "both" policy (where none
of skip_sw or skip_hw flags are set by user-space).

Add two new flags, "in hw" and "not in hw" such that user
space can determine if a filter is actually offloaded to
hw or not. The "in hw" UAPI semantics was chosen so it's
similar to the "skip hw" flag logic.

If none of these two flags are set, this signals running
over older kernel.

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
This commit is contained in:
Or Gerlitz 2017-05-04 16:15:15 +03:00 committed by Stephen Hemminger
parent 76557951f5
commit e57285b81a
4 changed files with 20 additions and 0 deletions

View File

@ -210,6 +210,11 @@ static int bpf_print_opt(struct filter_util *qu, FILE *f,
fprintf(f, "skip_hw ");
if (flags & TCA_CLS_FLAGS_SKIP_SW)
fprintf(f, "skip_sw ");
if (flags & TCA_CLS_FLAGS_IN_HW)
fprintf(f, "in_hw ");
else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
fprintf(f, "not_in_hw ");
}
if (tb[TCA_BPF_OPS] && tb[TCA_BPF_OPS_LEN])

View File

@ -1171,6 +1171,11 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
fprintf(f, "\n skip_hw");
if (flags & TCA_CLS_FLAGS_SKIP_SW)
fprintf(f, "\n skip_sw");
if (flags & TCA_CLS_FLAGS_IN_HW)
fprintf(f, "\n in_hw");
else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
fprintf(f, "\n not_in_hw");
}
if (tb[TCA_FLOWER_ACT])

View File

@ -137,6 +137,11 @@ static int matchall_print_opt(struct filter_util *qu, FILE *f,
fprintf(f, "\n skip_hw");
if (flags & TCA_CLS_FLAGS_SKIP_SW)
fprintf(f, "\n skip_sw");
if (flags & TCA_CLS_FLAGS_IN_HW)
fprintf(f, "\n in_hw");
else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
fprintf(f, "\n not_in_hw");
}
if (tb[TCA_MATCHALL_ACT])

View File

@ -1264,6 +1264,11 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
fprintf(f, "skip_hw ");
if (flags & TCA_CLS_FLAGS_SKIP_SW)
fprintf(f, "skip_sw ");
if (flags & TCA_CLS_FLAGS_IN_HW)
fprintf(f, "in_hw ");
else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
fprintf(f, "not_in_hw ");
}
if (tb[TCA_U32_PCNT]) {