aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched
diff options
context:
space:
mode:
Diffstat (limited to 'net/sched')
-rw-r--r--net/sched/cls_api.c7
-rw-r--r--net/sched/cls_basic.c8
-rw-r--r--net/sched/cls_bpf.c8
-rw-r--r--net/sched/cls_cgroup.c3
-rw-r--r--net/sched/cls_flow.c3
-rw-r--r--net/sched/cls_flower.c8
-rw-r--r--net/sched/cls_fw.c10
-rw-r--r--net/sched/cls_matchall.c8
-rw-r--r--net/sched/cls_route.c6
-rw-r--r--net/sched/cls_rsvp.h2
-rw-r--r--net/sched/cls_tcindex.c6
-rw-r--r--net/sched/cls_u32.c10
12 files changed, 48 insertions, 31 deletions
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index 06797c2e8102..f365970dc68c 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -1423,7 +1423,8 @@ void tcf_exts_destroy(struct tcf_exts *exts)
1423EXPORT_SYMBOL(tcf_exts_destroy); 1423EXPORT_SYMBOL(tcf_exts_destroy);
1424 1424
1425int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb, 1425int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,
1426 struct nlattr *rate_tlv, struct tcf_exts *exts, bool ovr) 1426 struct nlattr *rate_tlv, struct tcf_exts *exts, bool ovr,
1427 struct netlink_ext_ack *extack)
1427{ 1428{
1428#ifdef CONFIG_NET_CLS_ACT 1429#ifdef CONFIG_NET_CLS_ACT
1429 { 1430 {
@@ -1456,8 +1457,10 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,
1456 } 1457 }
1457#else 1458#else
1458 if ((exts->action && tb[exts->action]) || 1459 if ((exts->action && tb[exts->action]) ||
1459 (exts->police && tb[exts->police])) 1460 (exts->police && tb[exts->police])) {
1461 NL_SET_ERR_MSG(extack, "Classifier actions are not supported per compile options (CONFIG_NET_CLS_ACT)");
1460 return -EOPNOTSUPP; 1462 return -EOPNOTSUPP;
1463 }
1461#endif 1464#endif
1462 1465
1463 return 0; 1466 return 0;
diff --git a/net/sched/cls_basic.c b/net/sched/cls_basic.c
index 2cc38cd71938..b7bcf67641bf 100644
--- a/net/sched/cls_basic.c
+++ b/net/sched/cls_basic.c
@@ -152,11 +152,12 @@ static const struct nla_policy basic_policy[TCA_BASIC_MAX + 1] = {
152static int basic_set_parms(struct net *net, struct tcf_proto *tp, 152static int basic_set_parms(struct net *net, struct tcf_proto *tp,
153 struct basic_filter *f, unsigned long base, 153 struct basic_filter *f, unsigned long base,
154 struct nlattr **tb, 154 struct nlattr **tb,
155 struct nlattr *est, bool ovr) 155 struct nlattr *est, bool ovr,
156 struct netlink_ext_ack *extack)
156{ 157{
157 int err; 158 int err;
158 159
159 err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr); 160 err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, extack);
160 if (err < 0) 161 if (err < 0)
161 return err; 162 return err;
162 163
@@ -222,7 +223,8 @@ static int basic_change(struct net *net, struct sk_buff *in_skb,
222 fnew->handle = idr_index; 223 fnew->handle = idr_index;
223 } 224 }
224 225
225 err = basic_set_parms(net, tp, fnew, base, tb, tca[TCA_RATE], ovr); 226 err = basic_set_parms(net, tp, fnew, base, tb, tca[TCA_RATE], ovr,
227 extack);
226 if (err < 0) { 228 if (err < 0) {
227 if (!fold) 229 if (!fold)
228 idr_remove_ext(&head->handle_idr, fnew->handle); 230 idr_remove_ext(&head->handle_idr, fnew->handle);
diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c
index e51eb503a23a..c86072779b0a 100644
--- a/net/sched/cls_bpf.c
+++ b/net/sched/cls_bpf.c
@@ -403,7 +403,8 @@ static int cls_bpf_prog_from_efd(struct nlattr **tb, struct cls_bpf_prog *prog,
403 403
404static int cls_bpf_set_parms(struct net *net, struct tcf_proto *tp, 404static int cls_bpf_set_parms(struct net *net, struct tcf_proto *tp,
405 struct cls_bpf_prog *prog, unsigned long base, 405 struct cls_bpf_prog *prog, unsigned long base,
406 struct nlattr **tb, struct nlattr *est, bool ovr) 406 struct nlattr **tb, struct nlattr *est, bool ovr,
407 struct netlink_ext_ack *extack)
407{ 408{
408 bool is_bpf, is_ebpf, have_exts = false; 409 bool is_bpf, is_ebpf, have_exts = false;
409 u32 gen_flags = 0; 410 u32 gen_flags = 0;
@@ -414,7 +415,7 @@ static int cls_bpf_set_parms(struct net *net, struct tcf_proto *tp,
414 if ((!is_bpf && !is_ebpf) || (is_bpf && is_ebpf)) 415 if ((!is_bpf && !is_ebpf) || (is_bpf && is_ebpf))
415 return -EINVAL; 416 return -EINVAL;
416 417
417 ret = tcf_exts_validate(net, tp, tb, est, &prog->exts, ovr); 418 ret = tcf_exts_validate(net, tp, tb, est, &prog->exts, ovr, extack);
418 if (ret < 0) 419 if (ret < 0)
419 return ret; 420 return ret;
420 421
@@ -500,7 +501,8 @@ static int cls_bpf_change(struct net *net, struct sk_buff *in_skb,
500 prog->handle = handle; 501 prog->handle = handle;
501 } 502 }
502 503
503 ret = cls_bpf_set_parms(net, tp, prog, base, tb, tca[TCA_RATE], ovr); 504 ret = cls_bpf_set_parms(net, tp, prog, base, tb, tca[TCA_RATE], ovr,
505 extack);
504 if (ret < 0) 506 if (ret < 0)
505 goto errout_idr; 507 goto errout_idr;
506 508
diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c
index b74af0b55820..aaafcf6965f7 100644
--- a/net/sched/cls_cgroup.c
+++ b/net/sched/cls_cgroup.c
@@ -122,7 +122,8 @@ static int cls_cgroup_change(struct net *net, struct sk_buff *in_skb,
122 if (err < 0) 122 if (err < 0)
123 goto errout; 123 goto errout;
124 124
125 err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &new->exts, ovr); 125 err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &new->exts, ovr,
126 extack);
126 if (err < 0) 127 if (err < 0)
127 goto errout; 128 goto errout;
128 129
diff --git a/net/sched/cls_flow.c b/net/sched/cls_flow.c
index faa0b6793a17..07816133cbb9 100644
--- a/net/sched/cls_flow.c
+++ b/net/sched/cls_flow.c
@@ -454,7 +454,8 @@ static int flow_change(struct net *net, struct sk_buff *in_skb,
454 if (err < 0) 454 if (err < 0)
455 goto err2; 455 goto err2;
456 456
457 err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &fnew->exts, ovr); 457 err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &fnew->exts, ovr,
458 extack);
458 if (err < 0) 459 if (err < 0)
459 goto err2; 460 goto err2;
460 461
diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c
index 7d92bbeeba54..8235ed9143c4 100644
--- a/net/sched/cls_flower.c
+++ b/net/sched/cls_flower.c
@@ -827,11 +827,12 @@ static int fl_check_assign_mask(struct cls_fl_head *head,
827static int fl_set_parms(struct net *net, struct tcf_proto *tp, 827static int fl_set_parms(struct net *net, struct tcf_proto *tp,
828 struct cls_fl_filter *f, struct fl_flow_mask *mask, 828 struct cls_fl_filter *f, struct fl_flow_mask *mask,
829 unsigned long base, struct nlattr **tb, 829 unsigned long base, struct nlattr **tb,
830 struct nlattr *est, bool ovr) 830 struct nlattr *est, bool ovr,
831 struct netlink_ext_ack *extack)
831{ 832{
832 int err; 833 int err;
833 834
834 err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr); 835 err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, extack);
835 if (err < 0) 836 if (err < 0)
836 return err; 837 return err;
837 838
@@ -916,7 +917,8 @@ static int fl_change(struct net *net, struct sk_buff *in_skb,
916 } 917 }
917 } 918 }
918 919
919 err = fl_set_parms(net, tp, fnew, &mask, base, tb, tca[TCA_RATE], ovr); 920 err = fl_set_parms(net, tp, fnew, &mask, base, tb, tca[TCA_RATE], ovr,
921 extack);
920 if (err) 922 if (err)
921 goto errout_idr; 923 goto errout_idr;
922 924
diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c
index 72784491ce20..72a924a38753 100644
--- a/net/sched/cls_fw.c
+++ b/net/sched/cls_fw.c
@@ -218,13 +218,15 @@ static const struct nla_policy fw_policy[TCA_FW_MAX + 1] = {
218 218
219static int fw_set_parms(struct net *net, struct tcf_proto *tp, 219static int fw_set_parms(struct net *net, struct tcf_proto *tp,
220 struct fw_filter *f, struct nlattr **tb, 220 struct fw_filter *f, struct nlattr **tb,
221 struct nlattr **tca, unsigned long base, bool ovr) 221 struct nlattr **tca, unsigned long base, bool ovr,
222 struct netlink_ext_ack *extack)
222{ 223{
223 struct fw_head *head = rtnl_dereference(tp->root); 224 struct fw_head *head = rtnl_dereference(tp->root);
224 u32 mask; 225 u32 mask;
225 int err; 226 int err;
226 227
227 err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &f->exts, ovr); 228 err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &f->exts, ovr,
229 extack);
228 if (err < 0) 230 if (err < 0)
229 return err; 231 return err;
230 232
@@ -296,7 +298,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb,
296 return err; 298 return err;
297 } 299 }
298 300
299 err = fw_set_parms(net, tp, fnew, tb, tca, base, ovr); 301 err = fw_set_parms(net, tp, fnew, tb, tca, base, ovr, extack);
300 if (err < 0) { 302 if (err < 0) {
301 tcf_exts_destroy(&fnew->exts); 303 tcf_exts_destroy(&fnew->exts);
302 kfree(fnew); 304 kfree(fnew);
@@ -345,7 +347,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb,
345 f->id = handle; 347 f->id = handle;
346 f->tp = tp; 348 f->tp = tp;
347 349
348 err = fw_set_parms(net, tp, f, tb, tca, base, ovr); 350 err = fw_set_parms(net, tp, f, tb, tca, base, ovr, extack);
349 if (err < 0) 351 if (err < 0)
350 goto errout; 352 goto errout;
351 353
diff --git a/net/sched/cls_matchall.c b/net/sched/cls_matchall.c
index 689bd199aa14..9a0901ee6b74 100644
--- a/net/sched/cls_matchall.c
+++ b/net/sched/cls_matchall.c
@@ -142,11 +142,12 @@ static const struct nla_policy mall_policy[TCA_MATCHALL_MAX + 1] = {
142static int mall_set_parms(struct net *net, struct tcf_proto *tp, 142static int mall_set_parms(struct net *net, struct tcf_proto *tp,
143 struct cls_mall_head *head, 143 struct cls_mall_head *head,
144 unsigned long base, struct nlattr **tb, 144 unsigned long base, struct nlattr **tb,
145 struct nlattr *est, bool ovr) 145 struct nlattr *est, bool ovr,
146 struct netlink_ext_ack *extack)
146{ 147{
147 int err; 148 int err;
148 149
149 err = tcf_exts_validate(net, tp, tb, est, &head->exts, ovr); 150 err = tcf_exts_validate(net, tp, tb, est, &head->exts, ovr, extack);
150 if (err < 0) 151 if (err < 0)
151 return err; 152 return err;
152 153
@@ -198,7 +199,8 @@ static int mall_change(struct net *net, struct sk_buff *in_skb,
198 new->handle = handle; 199 new->handle = handle;
199 new->flags = flags; 200 new->flags = flags;
200 201
201 err = mall_set_parms(net, tp, new, base, tb, tca[TCA_RATE], ovr); 202 err = mall_set_parms(net, tp, new, base, tb, tca[TCA_RATE], ovr,
203 extack);
202 if (err) 204 if (err)
203 goto err_set_parms; 205 goto err_set_parms;
204 206
diff --git a/net/sched/cls_route.c b/net/sched/cls_route.c
index f436d4d894a9..92d683851cb0 100644
--- a/net/sched/cls_route.c
+++ b/net/sched/cls_route.c
@@ -389,7 +389,7 @@ static int route4_set_parms(struct net *net, struct tcf_proto *tp,
389 unsigned long base, struct route4_filter *f, 389 unsigned long base, struct route4_filter *f,
390 u32 handle, struct route4_head *head, 390 u32 handle, struct route4_head *head,
391 struct nlattr **tb, struct nlattr *est, int new, 391 struct nlattr **tb, struct nlattr *est, int new,
392 bool ovr) 392 bool ovr, struct netlink_ext_ack *extack)
393{ 393{
394 u32 id = 0, to = 0, nhandle = 0x8000; 394 u32 id = 0, to = 0, nhandle = 0x8000;
395 struct route4_filter *fp; 395 struct route4_filter *fp;
@@ -397,7 +397,7 @@ static int route4_set_parms(struct net *net, struct tcf_proto *tp,
397 struct route4_bucket *b; 397 struct route4_bucket *b;
398 int err; 398 int err;
399 399
400 err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr); 400 err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, extack);
401 if (err < 0) 401 if (err < 0)
402 return err; 402 return err;
403 403
@@ -516,7 +516,7 @@ static int route4_change(struct net *net, struct sk_buff *in_skb,
516 } 516 }
517 517
518 err = route4_set_parms(net, tp, base, f, handle, head, tb, 518 err = route4_set_parms(net, tp, base, f, handle, head, tb,
519 tca[TCA_RATE], new, ovr); 519 tca[TCA_RATE], new, ovr, extack);
520 if (err < 0) 520 if (err < 0)
521 goto errout; 521 goto errout;
522 522
diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h
index d1f67529c01d..c27d23694002 100644
--- a/net/sched/cls_rsvp.h
+++ b/net/sched/cls_rsvp.h
@@ -511,7 +511,7 @@ static int rsvp_change(struct net *net, struct sk_buff *in_skb,
511 err = tcf_exts_init(&e, TCA_RSVP_ACT, TCA_RSVP_POLICE); 511 err = tcf_exts_init(&e, TCA_RSVP_ACT, TCA_RSVP_POLICE);
512 if (err < 0) 512 if (err < 0)
513 return err; 513 return err;
514 err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, ovr); 514 err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, ovr, extack);
515 if (err < 0) 515 if (err < 0)
516 goto errout2; 516 goto errout2;
517 517
diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c
index 0ec84cf2d6b7..9d6621caa92f 100644
--- a/net/sched/cls_tcindex.c
+++ b/net/sched/cls_tcindex.c
@@ -322,7 +322,7 @@ static int
322tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base, 322tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
323 u32 handle, struct tcindex_data *p, 323 u32 handle, struct tcindex_data *p,
324 struct tcindex_filter_result *r, struct nlattr **tb, 324 struct tcindex_filter_result *r, struct nlattr **tb,
325 struct nlattr *est, bool ovr) 325 struct nlattr *est, bool ovr, struct netlink_ext_ack *extack)
326{ 326{
327 struct tcindex_filter_result new_filter_result, *old_r = r; 327 struct tcindex_filter_result new_filter_result, *old_r = r;
328 struct tcindex_filter_result cr; 328 struct tcindex_filter_result cr;
@@ -334,7 +334,7 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
334 err = tcf_exts_init(&e, TCA_TCINDEX_ACT, TCA_TCINDEX_POLICE); 334 err = tcf_exts_init(&e, TCA_TCINDEX_ACT, TCA_TCINDEX_POLICE);
335 if (err < 0) 335 if (err < 0)
336 return err; 336 return err;
337 err = tcf_exts_validate(net, tp, tb, est, &e, ovr); 337 err = tcf_exts_validate(net, tp, tb, est, &e, ovr, extack);
338 if (err < 0) 338 if (err < 0)
339 goto errout; 339 goto errout;
340 340
@@ -541,7 +541,7 @@ tcindex_change(struct net *net, struct sk_buff *in_skb,
541 return err; 541 return err;
542 542
543 return tcindex_set_parms(net, tp, base, handle, p, r, tb, 543 return tcindex_set_parms(net, tp, base, handle, p, r, tb,
544 tca[TCA_RATE], ovr); 544 tca[TCA_RATE], ovr, extack);
545} 545}
546 546
547static void tcindex_walk(struct tcf_proto *tp, struct tcf_walker *walker) 547static void tcindex_walk(struct tcf_proto *tp, struct tcf_walker *walker)
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index d9cadebc7eaa..933058bbd0a9 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -765,11 +765,12 @@ static const struct nla_policy u32_policy[TCA_U32_MAX + 1] = {
765static int u32_set_parms(struct net *net, struct tcf_proto *tp, 765static int u32_set_parms(struct net *net, struct tcf_proto *tp,
766 unsigned long base, struct tc_u_hnode *ht, 766 unsigned long base, struct tc_u_hnode *ht,
767 struct tc_u_knode *n, struct nlattr **tb, 767 struct tc_u_knode *n, struct nlattr **tb,
768 struct nlattr *est, bool ovr) 768 struct nlattr *est, bool ovr,
769 struct netlink_ext_ack *extack)
769{ 770{
770 int err; 771 int err;
771 772
772 err = tcf_exts_validate(net, tp, tb, est, &n->exts, ovr); 773 err = tcf_exts_validate(net, tp, tb, est, &n->exts, ovr, extack);
773 if (err < 0) 774 if (err < 0)
774 return err; 775 return err;
775 776
@@ -937,7 +938,7 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
937 938
938 err = u32_set_parms(net, tp, base, 939 err = u32_set_parms(net, tp, base,
939 rtnl_dereference(n->ht_up), new, tb, 940 rtnl_dereference(n->ht_up), new, tb,
940 tca[TCA_RATE], ovr); 941 tca[TCA_RATE], ovr, extack);
941 942
942 if (err) { 943 if (err) {
943 u32_destroy_key(tp, new, false); 944 u32_destroy_key(tp, new, false);
@@ -1084,7 +1085,8 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
1084 } 1085 }
1085#endif 1086#endif
1086 1087
1087 err = u32_set_parms(net, tp, base, ht, n, tb, tca[TCA_RATE], ovr); 1088 err = u32_set_parms(net, tp, base, ht, n, tb, tca[TCA_RATE], ovr,
1089 extack);
1088 if (err == 0) { 1090 if (err == 0) {
1089 struct tc_u_knode __rcu **ins; 1091 struct tc_u_knode __rcu **ins;
1090 struct tc_u_knode *pins; 1092 struct tc_u_knode *pins;