@@ -82,6 +82,7 @@ static int bpf_parse_opt(struct filter_util *qu, char *handle,
unsigned int bpf_flags = 0;
struct bpf_cfg_in cfg = {};
bool seen_run = false;
+ bool skip_sw = false;
struct rtattr *tail;
int ret = 0;
@@ -110,8 +111,11 @@ static int bpf_parse_opt(struct filter_util *qu, char *handle,
cfg.argc = argc;
cfg.argv = argv;
- if (bpf_parse_and_load_common(&cfg, &bpf_cb_ops, n))
+ if (bpf_parse_common(&cfg, &bpf_cb_ops) < 0) {
+ fprintf(stderr,
+ "Unable to parse bpf command line\n");
return -1;
+ }
argc = cfg.argc;
argv = cfg.argv;
@@ -135,6 +139,7 @@ static int bpf_parse_opt(struct filter_util *qu, char *handle,
bpf_gen_flags |= TCA_CLS_FLAGS_SKIP_HW;
} else if (matches(*argv, "skip_sw") == 0) {
bpf_gen_flags |= TCA_CLS_FLAGS_SKIP_SW;
+ skip_sw = true;
} else if (matches(*argv, "action") == 0) {
NEXT_ARG();
if (parse_action(&argc, &argv, TCA_BPF_ACT, n)) {
@@ -164,6 +169,13 @@ static int bpf_parse_opt(struct filter_util *qu, char *handle,
NEXT_ARG_FWD();
}
+ if (skip_sw)
+ cfg.ifindex = t->tcm_ifindex;
+ if (bpf_load_common(&cfg, &bpf_cb_ops, n) < 0) {
+ fprintf(stderr, "Unable to load program\n");
+ return -1;
+ }
+
if (bpf_gen_flags)
addattr32(n, MAX_MSG, TCA_BPF_FLAGS_GEN, bpf_gen_flags);
if (bpf_flags)