net: sched: cls: add extack support for tcf_exts_validate
authorAlexander Aring <aring@mojatatu.com>
Thu, 18 Jan 2018 16:20:52 +0000 (11:20 -0500)
committerDavid S. Miller <davem@davemloft.net>
Fri, 19 Jan 2018 20:52:51 +0000 (15:52 -0500)
The tcf_exts_validate function calls the act api change callback. For
preparing extack support for act api, this patch adds the extack as
parameter for this function which is common used in cls implementations.

Furthermore the tcf_exts_validate will call action init callback which
prepares the TC action subsystem for extack support.

Cc: David Ahern <dsahern@gmail.com>
Signed-off-by: Alexander Aring <aring@mojatatu.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
13 files changed:
include/net/pkt_cls.h
net/sched/cls_api.c
net/sched/cls_basic.c
net/sched/cls_bpf.c
net/sched/cls_cgroup.c
net/sched/cls_flow.c
net/sched/cls_flower.c
net/sched/cls_fw.c
net/sched/cls_matchall.c
net/sched/cls_route.c
net/sched/cls_rsvp.h
net/sched/cls_tcindex.c
net/sched/cls_u32.c

index 789d818c4a6189fc4cccdb06faff9edaf77fd748..6dd009e10e5dc464da85c335aea87157b5b32af3 100644 (file)
@@ -376,7 +376,8 @@ tcf_exts_exec(struct sk_buff *skb, struct tcf_exts *exts,
 
 int tcf_exts_validate(struct net *net, struct tcf_proto *tp,
                      struct nlattr **tb, struct nlattr *rate_tlv,
-                     struct tcf_exts *exts, bool ovr);
+                     struct tcf_exts *exts, bool ovr,
+                     struct netlink_ext_ack *extack);
 void tcf_exts_destroy(struct tcf_exts *exts);
 void tcf_exts_change(struct tcf_exts *dst, struct tcf_exts *src);
 int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts);
index 06797c2e810255365329866b0eb171eb4d579f0e..f365970dc68c47c2a8b8e303fa835329cbdc1b62 100644 (file)
@@ -1423,7 +1423,8 @@ void tcf_exts_destroy(struct tcf_exts *exts)
 EXPORT_SYMBOL(tcf_exts_destroy);
 
 int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,
-                     struct nlattr *rate_tlv, struct tcf_exts *exts, bool ovr)
+                     struct nlattr *rate_tlv, struct tcf_exts *exts, bool ovr,
+                     struct netlink_ext_ack *extack)
 {
 #ifdef CONFIG_NET_CLS_ACT
        {
@@ -1456,8 +1457,10 @@ int tcf_exts_validate(struct net *net, struct tcf_proto *tp, struct nlattr **tb,
        }
 #else
        if ((exts->action && tb[exts->action]) ||
-           (exts->police && tb[exts->police]))
+           (exts->police && tb[exts->police])) {
+               NL_SET_ERR_MSG(extack, "Classifier actions are not supported per compile options (CONFIG_NET_CLS_ACT)");
                return -EOPNOTSUPP;
+       }
 #endif
 
        return 0;
index 2cc38cd719383ba461d2a6c86aad70fab8a902d8..b7bcf67641bf2c86975c8b0d6d3f0707cd7727af 100644 (file)
@@ -152,11 +152,12 @@ static const struct nla_policy basic_policy[TCA_BASIC_MAX + 1] = {
 static int basic_set_parms(struct net *net, struct tcf_proto *tp,
                           struct basic_filter *f, unsigned long base,
                           struct nlattr **tb,
-                          struct nlattr *est, bool ovr)
+                          struct nlattr *est, bool ovr,
+                          struct netlink_ext_ack *extack)
 {
        int err;
 
-       err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr);
+       err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, extack);
        if (err < 0)
                return err;
 
@@ -222,7 +223,8 @@ static int basic_change(struct net *net, struct sk_buff *in_skb,
                fnew->handle = idr_index;
        }
 
-       err = basic_set_parms(net, tp, fnew, base, tb, tca[TCA_RATE], ovr);
+       err = basic_set_parms(net, tp, fnew, base, tb, tca[TCA_RATE], ovr,
+                             extack);
        if (err < 0) {
                if (!fold)
                        idr_remove_ext(&head->handle_idr, fnew->handle);
index e51eb503a23a25f93a2d2eae343cb7738a052d54..c86072779b0a53b7a48572aa43926887ebaecebd 100644 (file)
@@ -403,7 +403,8 @@ static int cls_bpf_prog_from_efd(struct nlattr **tb, struct cls_bpf_prog *prog,
 
 static int cls_bpf_set_parms(struct net *net, struct tcf_proto *tp,
                             struct cls_bpf_prog *prog, unsigned long base,
-                            struct nlattr **tb, struct nlattr *est, bool ovr)
+                            struct nlattr **tb, struct nlattr *est, bool ovr,
+                            struct netlink_ext_ack *extack)
 {
        bool is_bpf, is_ebpf, have_exts = false;
        u32 gen_flags = 0;
@@ -414,7 +415,7 @@ static int cls_bpf_set_parms(struct net *net, struct tcf_proto *tp,
        if ((!is_bpf && !is_ebpf) || (is_bpf && is_ebpf))
                return -EINVAL;
 
-       ret = tcf_exts_validate(net, tp, tb, est, &prog->exts, ovr);
+       ret = tcf_exts_validate(net, tp, tb, est, &prog->exts, ovr, extack);
        if (ret < 0)
                return ret;
 
@@ -500,7 +501,8 @@ static int cls_bpf_change(struct net *net, struct sk_buff *in_skb,
                prog->handle = handle;
        }
 
-       ret = cls_bpf_set_parms(net, tp, prog, base, tb, tca[TCA_RATE], ovr);
+       ret = cls_bpf_set_parms(net, tp, prog, base, tb, tca[TCA_RATE], ovr,
+                               extack);
        if (ret < 0)
                goto errout_idr;
 
index b74af0b5582089851d7301a9404dd0c31ed10b05..aaafcf6965f7006350090f7b995e7b2d39f02074 100644 (file)
@@ -122,7 +122,8 @@ static int cls_cgroup_change(struct net *net, struct sk_buff *in_skb,
        if (err < 0)
                goto errout;
 
-       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &new->exts, ovr);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &new->exts, ovr,
+                               extack);
        if (err < 0)
                goto errout;
 
index faa0b6793a171c90b8a16ab5dd792db228ced5a0..07816133cbb9efaa0d948ea77fc7eec11aa786c2 100644 (file)
@@ -454,7 +454,8 @@ static int flow_change(struct net *net, struct sk_buff *in_skb,
        if (err < 0)
                goto err2;
 
-       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &fnew->exts, ovr);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &fnew->exts, ovr,
+                               extack);
        if (err < 0)
                goto err2;
 
index 7d92bbeeba545e523ecdc0caa851f2fdaf4f5a25..8235ed9143c4e28b0fafad8c1128ca1875ccc649 100644 (file)
@@ -827,11 +827,12 @@ static int fl_check_assign_mask(struct cls_fl_head *head,
 static int fl_set_parms(struct net *net, struct tcf_proto *tp,
                        struct cls_fl_filter *f, struct fl_flow_mask *mask,
                        unsigned long base, struct nlattr **tb,
-                       struct nlattr *est, bool ovr)
+                       struct nlattr *est, bool ovr,
+                       struct netlink_ext_ack *extack)
 {
        int err;
 
-       err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr);
+       err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, extack);
        if (err < 0)
                return err;
 
@@ -916,7 +917,8 @@ static int fl_change(struct net *net, struct sk_buff *in_skb,
                }
        }
 
-       err = fl_set_parms(net, tp, fnew, &mask, base, tb, tca[TCA_RATE], ovr);
+       err = fl_set_parms(net, tp, fnew, &mask, base, tb, tca[TCA_RATE], ovr,
+                          extack);
        if (err)
                goto errout_idr;
 
index 72784491ce20a99a3636b726b044e3d3b16a3fce..72a924a38753df3a3532b705189365e335245256 100644 (file)
@@ -218,13 +218,15 @@ static const struct nla_policy fw_policy[TCA_FW_MAX + 1] = {
 
 static int fw_set_parms(struct net *net, struct tcf_proto *tp,
                        struct fw_filter *f, struct nlattr **tb,
-                       struct nlattr **tca, unsigned long base, bool ovr)
+                       struct nlattr **tca, unsigned long base, bool ovr,
+                       struct netlink_ext_ack *extack)
 {
        struct fw_head *head = rtnl_dereference(tp->root);
        u32 mask;
        int err;
 
-       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &f->exts, ovr);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &f->exts, ovr,
+                               extack);
        if (err < 0)
                return err;
 
@@ -296,7 +298,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb,
                        return err;
                }
 
-               err = fw_set_parms(net, tp, fnew, tb, tca, base, ovr);
+               err = fw_set_parms(net, tp, fnew, tb, tca, base, ovr, extack);
                if (err < 0) {
                        tcf_exts_destroy(&fnew->exts);
                        kfree(fnew);
@@ -345,7 +347,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb,
        f->id = handle;
        f->tp = tp;
 
-       err = fw_set_parms(net, tp, f, tb, tca, base, ovr);
+       err = fw_set_parms(net, tp, f, tb, tca, base, ovr, extack);
        if (err < 0)
                goto errout;
 
index 689bd199aa142b9f2dce37574444b016bcac5280..9a0901ee6b741dc619a54ce456e3d61d92a91412 100644 (file)
@@ -142,11 +142,12 @@ static const struct nla_policy mall_policy[TCA_MATCHALL_MAX + 1] = {
 static int mall_set_parms(struct net *net, struct tcf_proto *tp,
                          struct cls_mall_head *head,
                          unsigned long base, struct nlattr **tb,
-                         struct nlattr *est, bool ovr)
+                         struct nlattr *est, bool ovr,
+                         struct netlink_ext_ack *extack)
 {
        int err;
 
-       err = tcf_exts_validate(net, tp, tb, est, &head->exts, ovr);
+       err = tcf_exts_validate(net, tp, tb, est, &head->exts, ovr, extack);
        if (err < 0)
                return err;
 
@@ -198,7 +199,8 @@ static int mall_change(struct net *net, struct sk_buff *in_skb,
        new->handle = handle;
        new->flags = flags;
 
-       err = mall_set_parms(net, tp, new, base, tb, tca[TCA_RATE], ovr);
+       err = mall_set_parms(net, tp, new, base, tb, tca[TCA_RATE], ovr,
+                            extack);
        if (err)
                goto err_set_parms;
 
index f436d4d894a920ddc4077ab44f1b04619b594ff5..92d683851cb08852d13673f3348f26e5b7c632e6 100644 (file)
@@ -389,7 +389,7 @@ static int route4_set_parms(struct net *net, struct tcf_proto *tp,
                            unsigned long base, struct route4_filter *f,
                            u32 handle, struct route4_head *head,
                            struct nlattr **tb, struct nlattr *est, int new,
-                           bool ovr)
+                           bool ovr, struct netlink_ext_ack *extack)
 {
        u32 id = 0, to = 0, nhandle = 0x8000;
        struct route4_filter *fp;
@@ -397,7 +397,7 @@ static int route4_set_parms(struct net *net, struct tcf_proto *tp,
        struct route4_bucket *b;
        int err;
 
-       err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr);
+       err = tcf_exts_validate(net, tp, tb, est, &f->exts, ovr, extack);
        if (err < 0)
                return err;
 
@@ -516,7 +516,7 @@ static int route4_change(struct net *net, struct sk_buff *in_skb,
        }
 
        err = route4_set_parms(net, tp, base, f, handle, head, tb,
-                              tca[TCA_RATE], new, ovr);
+                              tca[TCA_RATE], new, ovr, extack);
        if (err < 0)
                goto errout;
 
index d1f67529c01d63ee2dedc751d2063067380724fb..c27d23694002f21a6bb82008cc3152c50ff20283 100644 (file)
@@ -511,7 +511,7 @@ static int rsvp_change(struct net *net, struct sk_buff *in_skb,
        err = tcf_exts_init(&e, TCA_RSVP_ACT, TCA_RSVP_POLICE);
        if (err < 0)
                return err;
-       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, ovr);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, ovr, extack);
        if (err < 0)
                goto errout2;
 
index 0ec84cf2d6b77384443f2fc0f56ad27cce9fa091..9d6621caa92fb9da8ab2b7d370bfb2ea2dc71775 100644 (file)
@@ -322,7 +322,7 @@ static int
 tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
                  u32 handle, struct tcindex_data *p,
                  struct tcindex_filter_result *r, struct nlattr **tb,
-                 struct nlattr *est, bool ovr)
+                 struct nlattr *est, bool ovr, struct netlink_ext_ack *extack)
 {
        struct tcindex_filter_result new_filter_result, *old_r = r;
        struct tcindex_filter_result cr;
@@ -334,7 +334,7 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
        err = tcf_exts_init(&e, TCA_TCINDEX_ACT, TCA_TCINDEX_POLICE);
        if (err < 0)
                return err;
-       err = tcf_exts_validate(net, tp, tb, est, &e, ovr);
+       err = tcf_exts_validate(net, tp, tb, est, &e, ovr, extack);
        if (err < 0)
                goto errout;
 
@@ -541,7 +541,7 @@ tcindex_change(struct net *net, struct sk_buff *in_skb,
                return err;
 
        return tcindex_set_parms(net, tp, base, handle, p, r, tb,
-                                tca[TCA_RATE], ovr);
+                                tca[TCA_RATE], ovr, extack);
 }
 
 static void tcindex_walk(struct tcf_proto *tp, struct tcf_walker *walker)
index d9cadebc7eaa77e3506042355d8d71e6e44564ff..933058bbd0a9e9ab5a66bde452eea7bd7cd46f2c 100644 (file)
@@ -765,11 +765,12 @@ static const struct nla_policy u32_policy[TCA_U32_MAX + 1] = {
 static int u32_set_parms(struct net *net, struct tcf_proto *tp,
                         unsigned long base, struct tc_u_hnode *ht,
                         struct tc_u_knode *n, struct nlattr **tb,
-                        struct nlattr *est, bool ovr)
+                        struct nlattr *est, bool ovr,
+                        struct netlink_ext_ack *extack)
 {
        int err;
 
-       err = tcf_exts_validate(net, tp, tb, est, &n->exts, ovr);
+       err = tcf_exts_validate(net, tp, tb, est, &n->exts, ovr, extack);
        if (err < 0)
                return err;
 
@@ -937,7 +938,7 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
 
                err = u32_set_parms(net, tp, base,
                                    rtnl_dereference(n->ht_up), new, tb,
-                                   tca[TCA_RATE], ovr);
+                                   tca[TCA_RATE], ovr, extack);
 
                if (err) {
                        u32_destroy_key(tp, new, false);
@@ -1084,7 +1085,8 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
        }
 #endif
 
-       err = u32_set_parms(net, tp, base, ht, n, tb, tca[TCA_RATE], ovr);
+       err = u32_set_parms(net, tp, base, ht, n, tb, tca[TCA_RATE], ovr,
+                           extack);
        if (err == 0) {
                struct tc_u_knode __rcu **ins;
                struct tc_u_knode *pins;