@@ -148,6 +148,7 @@ static int cls_bpf_offload_cmd(struct tcf_proto *tp, struct cls_bpf_prog *prog,
148
148
struct net_device * dev = tp -> q -> dev_queue -> dev ;
149
149
struct tc_cls_bpf_offload bpf_offload = {};
150
150
struct tc_to_netdev offload ;
151
+ int err ;
151
152
152
153
offload .type = TC_SETUP_CLSBPF ;
153
154
offload .cls_bpf = & bpf_offload ;
@@ -159,8 +160,13 @@ static int cls_bpf_offload_cmd(struct tcf_proto *tp, struct cls_bpf_prog *prog,
159
160
bpf_offload .exts_integrated = prog -> exts_integrated ;
160
161
bpf_offload .gen_flags = prog -> gen_flags ;
161
162
162
- return dev -> netdev_ops -> ndo_setup_tc (dev , tp -> q -> handle ,
163
- tp -> protocol , & offload );
163
+ err = dev -> netdev_ops -> ndo_setup_tc (dev , tp -> q -> handle ,
164
+ tp -> protocol , & offload );
165
+
166
+ if (!err && (cmd == TC_CLSBPF_ADD || cmd == TC_CLSBPF_REPLACE ))
167
+ prog -> gen_flags |= TCA_CLS_FLAGS_IN_HW ;
168
+
169
+ return err ;
164
170
}
165
171
166
172
static int cls_bpf_offload (struct tcf_proto * tp , struct cls_bpf_prog * prog ,
@@ -511,6 +517,9 @@ static int cls_bpf_change(struct net *net, struct sk_buff *in_skb,
511
517
return ret ;
512
518
}
513
519
520
+ if (!tc_in_hw (prog -> gen_flags ))
521
+ prog -> gen_flags |= TCA_CLS_FLAGS_NOT_IN_HW ;
522
+
514
523
if (oldprog ) {
515
524
list_replace_rcu (& oldprog -> link , & prog -> link );
516
525
tcf_unbind_filter (tp , & oldprog -> res );
0 commit comments