|
@@ -103,8 +103,9 @@ static int cls_bpf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
|
}
|
|
}
|
|
|
|
|
|
if (prog->exts_integrated) {
|
|
if (prog->exts_integrated) {
|
|
- res->class = prog->res.class;
|
|
|
|
- res->classid = qdisc_skb_cb(skb)->tc_classid;
|
|
|
|
|
|
+ res->class = 0;
|
|
|
|
+ res->classid = TC_H_MAJ(prog->res.classid) |
|
|
|
|
+ qdisc_skb_cb(skb)->tc_classid;
|
|
|
|
|
|
ret = cls_bpf_exec_opcode(filter_res);
|
|
ret = cls_bpf_exec_opcode(filter_res);
|
|
if (ret == TC_ACT_UNSPEC)
|
|
if (ret == TC_ACT_UNSPEC)
|
|
@@ -114,10 +115,12 @@ static int cls_bpf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
|
|
|
|
|
if (filter_res == 0)
|
|
if (filter_res == 0)
|
|
continue;
|
|
continue;
|
|
-
|
|
|
|
- *res = prog->res;
|
|
|
|
- if (filter_res != -1)
|
|
|
|
|
|
+ if (filter_res != -1) {
|
|
|
|
+ res->class = 0;
|
|
res->classid = filter_res;
|
|
res->classid = filter_res;
|
|
|
|
+ } else {
|
|
|
|
+ *res = prog->res;
|
|
|
|
+ }
|
|
|
|
|
|
ret = tcf_exts_exec(skb, &prog->exts, res);
|
|
ret = tcf_exts_exec(skb, &prog->exts, res);
|
|
if (ret < 0)
|
|
if (ret < 0)
|