net: sched: act: handle extack in tcf_generic_walker
authorAlexander Aring <aring@mojatatu.com>
Thu, 15 Feb 2018 15:54:59 +0000 (10:54 -0500)
committerDavid S. Miller <davem@davemloft.net>
Fri, 16 Feb 2018 21:05:50 +0000 (16:05 -0500)
This patch adds extack handling for a common used TC act function
"tcf_generic_walker()" to add an extack message on failures.
The tcf_generic_walker() function can fail if get a invalid command
different than DEL and GET. The naming "action" here is wrong, the
correct naming would be command.

Cc: David Ahern <dsahern@gmail.com>
Signed-off-by: Alexander Aring <aring@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
18 files changed:
include/net/act_api.h
net/sched/act_api.c
net/sched/act_bpf.c
net/sched/act_connmark.c
net/sched/act_csum.c
net/sched/act_gact.c
net/sched/act_ife.c
net/sched/act_ipt.c
net/sched/act_mirred.c
net/sched/act_nat.c
net/sched/act_pedit.c
net/sched/act_police.c
net/sched/act_sample.c
net/sched/act_simple.c
net/sched/act_skbedit.c
net/sched/act_skbmod.c
net/sched/act_tunnel_key.c
net/sched/act_vlan.c

index ab352925537748e54d35c5635e56b7e917ee1edc..9c2f22695025e612e42a1e0e650cf64943b87a2a 100644 (file)
@@ -140,7 +140,8 @@ static inline void tc_action_net_exit(struct list_head *net_list,
 
 int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb,
                       struct netlink_callback *cb, int type,
-                      const struct tc_action_ops *ops);
+                      const struct tc_action_ops *ops,
+                      struct netlink_ext_ack *extack);
 int tcf_idr_search(struct tc_action_net *tn, struct tc_action **a, u32 index);
 bool tcf_idr_check(struct tc_action_net *tn, u32 index, struct tc_action **a,
                    int bind);
index ab107997b2594adf09d377aa1ea7096ca4b0c482..1f65d6ada9ff04d19c589d2b238c0f143d2b30c8 100644 (file)
@@ -202,7 +202,8 @@ nla_put_failure:
 
 int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb,
                       struct netlink_callback *cb, int type,
-                      const struct tc_action_ops *ops)
+                      const struct tc_action_ops *ops,
+                      struct netlink_ext_ack *extack)
 {
        struct tcf_idrinfo *idrinfo = tn->idrinfo;
 
@@ -211,7 +212,8 @@ int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb,
        } else if (type == RTM_GETACTION) {
                return tcf_dump_walker(idrinfo, skb, cb);
        } else {
-               WARN(1, "tcf_generic_walker: unknown action %d\n", type);
+               WARN(1, "tcf_generic_walker: unknown command %d\n", type);
+               NL_SET_ERR_MSG(extack, "tcf_generic_walker: unknown command");
                return -EINVAL;
        }
 }
index 7e01e2c710c4aa14404e083511423a7bddb00b47..cb3c5d403c887dd360feac64bdb8232b3b22c5dc 100644 (file)
@@ -372,7 +372,7 @@ static int tcf_bpf_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, bpf_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_bpf_search(struct net *net, struct tc_action **a, u32 index,
index cb722da0bb15f7adac18d0131374685a34854f53..e4b880fa51fec90fa1a1d92c11f8a337637d3509 100644 (file)
@@ -182,7 +182,7 @@ static int tcf_connmark_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, connmark_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_connmark_search(struct net *net, struct tc_action **a, u32 index,
index 3e8efadb750fa58850ba35a217bac414446470a4..d5c2e528d150bf8e7d2f9007e34d01bc0347dad4 100644 (file)
@@ -636,7 +636,7 @@ static int tcf_csum_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, csum_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_csum_search(struct net *net, struct tc_action **a, u32 index,
index d96ebe4bb65a44b7bdc4951de68efa46503f74c2..f072bcf337604396344a1d29ad6cc262c6ae3352 100644 (file)
@@ -206,7 +206,7 @@ static int tcf_gact_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, gact_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_gact_search(struct net *net, struct tc_action **a, u32 index,
index b777e381e0dd781e9de7ee9f5440cd0d95f9c2fb..a5994cf0512bd731f55a1dfa798d85ff658e18ef 100644 (file)
@@ -829,7 +829,7 @@ static int tcf_ife_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, ife_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_ife_search(struct net *net, struct tc_action **a, u32 index,
index f33a8cc5dee6a303244959ecb91ecc14ffcde7bc..9784629090ad7cd3c886fc753a540fb46215709a 100644 (file)
@@ -308,7 +308,7 @@ static int tcf_ipt_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, ipt_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_ipt_search(struct net *net, struct tc_action **a, u32 index,
@@ -358,7 +358,7 @@ static int tcf_xt_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, xt_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_xt_search(struct net *net, struct tc_action **a, u32 index,
index 3dcd295ea6a7a65874b43e228203130514fd03fe..05c2ebe92ecab0025bd009afc7b910041a3d10ae 100644 (file)
@@ -270,7 +270,7 @@ static int tcf_mirred_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, mirred_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_mirred_search(struct net *net, struct tc_action **a, u32 index,
index 67243cdc05883e1271b0fa4c26cf8a025bb9099d..4b5848b6c25207ac74b0508259f9f3019020d3c9 100644 (file)
@@ -283,7 +283,7 @@ static int tcf_nat_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, nat_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_nat_search(struct net *net, struct tc_action **a, u32 index,
index 6d6481f6bffa6bf703b3f7cc81c118b27d7586d8..094303c27c5ea753376844e6130178dc2fd589b8 100644 (file)
@@ -424,7 +424,7 @@ static int tcf_pedit_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, pedit_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_pedit_search(struct net *net, struct tc_action **a, u32 index,
index ff803414a7362ee9f9a04dfa6f0b54c548754068..ff55bd6c7db002a39ee7107bd005db8434392451 100644 (file)
@@ -63,7 +63,7 @@ static int tcf_act_police_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, police_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static const struct nla_policy police_policy[TCA_POLICE_MAX + 1] = {
index 7a2b6a33f2397a9899dea76f8490bc6100f40262..9765145aaf4066775f4ecdc8b90b951992515183 100644 (file)
@@ -207,7 +207,7 @@ static int tcf_sample_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, sample_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_sample_search(struct net *net, struct tc_action **a, u32 index,
index 3f5474d20702a12e9aee60c06f359f345c6a156b..8244e221fe4f8b6ae9aa2b0f9b03e34a320e3e52 100644 (file)
@@ -175,7 +175,7 @@ static int tcf_simp_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, simp_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_simp_search(struct net *net, struct tc_action **a, u32 index,
index d99b6f1f5181415042ae7d6d6b67c572e3ff9dd8..ddf69fc01bdf8913260b63adb6de0bbbdcf90b25 100644 (file)
@@ -213,7 +213,7 @@ static int tcf_skbedit_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, skbedit_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_skbedit_search(struct net *net, struct tc_action **a, u32 index,
index 369ea85d0f02b38191c94ffaab49ec37e7fb08c5..a406f191cb846da7c2516c476785230101197a8b 100644 (file)
@@ -237,7 +237,7 @@ static int tcf_skbmod_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, skbmod_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_skbmod_search(struct net *net, struct tc_action **a, u32 index,
index bced6fd00d435792f165904fd3e9f7135be1a0b5..41ff9d0e5c62f20078eb6a1b61925001f6dbdf9e 100644 (file)
@@ -296,7 +296,7 @@ static int tunnel_key_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, tunnel_key_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tunnel_key_search(struct net *net, struct tc_action **a, u32 index,
index 7cf409443d02c31f373909430d673695c3cb8a85..71411a255f04e789b170a8ee9382ea3c4923b48f 100644 (file)
@@ -272,7 +272,7 @@ static int tcf_vlan_walker(struct net *net, struct sk_buff *skb,
 {
        struct tc_action_net *tn = net_generic(net, vlan_net_id);
 
-       return tcf_generic_walker(tn, skb, cb, type, ops);
+       return tcf_generic_walker(tn, skb, cb, type, ops, extack);
 }
 
 static int tcf_vlan_search(struct net *net, struct tc_action **a, u32 index,