diff --git a/tc/f_bpf.c b/tc/f_bpf.c index f598784e..5906f8bb 100644 --- a/tc/f_bpf.c +++ b/tc/f_bpf.c @@ -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 @@ opt_bpf: 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 @@ opt_bpf: 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 @@ opt_bpf: 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)