Commit c2a67de9 authored by Pedro Tammela's avatar Pedro Tammela Committed by Jakub Kicinski

net/sched: introduce ACT_P_BOUND return code

Bound actions always return '0' and as of today we rely on '0'
being returned in order to properly skip bound actions in
tcf_idr_insert_many. In order to further improve maintainability,
introduce the ACT_P_BOUND return code.

Actions are updated to return 'ACT_P_BOUND' instead of plain '0'.
tcf_idr_insert_many is then updated to check for 'ACT_P_BOUND'.
Signed-off-by: default avatarPedro Tammela <pctammela@mojatatu.com>
Acked-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
Link: https://lore.kernel.org/r/20231229132642.1489088-1-pctammela@mojatatu.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent d3d344a1
...@@ -137,6 +137,7 @@ struct tc_action_ops { ...@@ -137,6 +137,7 @@ struct tc_action_ops {
#ifdef CONFIG_NET_CLS_ACT #ifdef CONFIG_NET_CLS_ACT
#define ACT_P_BOUND 0
#define ACT_P_CREATED 1 #define ACT_P_CREATED 1
#define ACT_P_DELETED 1 #define ACT_P_DELETED 1
......
...@@ -1313,7 +1313,7 @@ void tcf_idr_insert_many(struct tc_action *actions[], int init_res[]) ...@@ -1313,7 +1313,7 @@ void tcf_idr_insert_many(struct tc_action *actions[], int init_res[])
tcf_act_for_each_action(i, a, actions) { tcf_act_for_each_action(i, a, actions) {
struct tcf_idrinfo *idrinfo; struct tcf_idrinfo *idrinfo;
if (init_res[i] == 0) /* Bound */ if (init_res[i] == ACT_P_BOUND)
continue; continue;
idrinfo = a->idrinfo; idrinfo = a->idrinfo;
......
...@@ -318,7 +318,7 @@ static int tcf_bpf_init(struct net *net, struct nlattr *nla, ...@@ -318,7 +318,7 @@ static int tcf_bpf_init(struct net *net, struct nlattr *nla,
} else if (ret > 0) { } else if (ret > 0) {
/* Don't override defaults. */ /* Don't override defaults. */
if (bind) if (bind)
return 0; return ACT_P_BOUND;
if (!(flags & TCA_ACT_FLAGS_REPLACE)) { if (!(flags & TCA_ACT_FLAGS_REPLACE)) {
tcf_idr_release(*act, bind); tcf_idr_release(*act, bind);
......
...@@ -146,7 +146,7 @@ static int tcf_connmark_init(struct net *net, struct nlattr *nla, ...@@ -146,7 +146,7 @@ static int tcf_connmark_init(struct net *net, struct nlattr *nla,
} else if (ret > 0) { } else if (ret > 0) {
ci = to_connmark(*a); ci = to_connmark(*a);
if (bind) { if (bind) {
err = 0; err = ACT_P_BOUND;
goto out_free; goto out_free;
} }
if (!(flags & TCA_ACT_FLAGS_REPLACE)) { if (!(flags & TCA_ACT_FLAGS_REPLACE)) {
......
...@@ -77,8 +77,8 @@ static int tcf_csum_init(struct net *net, struct nlattr *nla, ...@@ -77,8 +77,8 @@ static int tcf_csum_init(struct net *net, struct nlattr *nla,
} }
ret = ACT_P_CREATED; ret = ACT_P_CREATED;
} else if (err > 0) { } else if (err > 0) {
if (bind)/* dont override defaults */ if (bind) /* dont override defaults */
return 0; return ACT_P_BOUND;
if (!(flags & TCA_ACT_FLAGS_REPLACE)) { if (!(flags & TCA_ACT_FLAGS_REPLACE)) {
tcf_idr_release(*a, bind); tcf_idr_release(*a, bind);
return -EEXIST; return -EEXIST;
......
...@@ -1349,7 +1349,7 @@ static int tcf_ct_init(struct net *net, struct nlattr *nla, ...@@ -1349,7 +1349,7 @@ static int tcf_ct_init(struct net *net, struct nlattr *nla,
res = ACT_P_CREATED; res = ACT_P_CREATED;
} else { } else {
if (bind) if (bind)
return 0; return ACT_P_BOUND;
if (!(flags & TCA_ACT_FLAGS_REPLACE)) { if (!(flags & TCA_ACT_FLAGS_REPLACE)) {
tcf_idr_release(*a, bind); tcf_idr_release(*a, bind);
......
...@@ -221,7 +221,7 @@ static int tcf_ctinfo_init(struct net *net, struct nlattr *nla, ...@@ -221,7 +221,7 @@ static int tcf_ctinfo_init(struct net *net, struct nlattr *nla,
ret = ACT_P_CREATED; ret = ACT_P_CREATED;
} else if (err > 0) { } else if (err > 0) {
if (bind) /* don't override defaults */ if (bind) /* don't override defaults */
return 0; return ACT_P_BOUND;
if (!(flags & TCA_ACT_FLAGS_REPLACE)) { if (!(flags & TCA_ACT_FLAGS_REPLACE)) {
tcf_idr_release(*a, bind); tcf_idr_release(*a, bind);
return -EEXIST; return -EEXIST;
......
...@@ -108,7 +108,7 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla, ...@@ -108,7 +108,7 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla,
ret = ACT_P_CREATED; ret = ACT_P_CREATED;
} else if (err > 0) { } else if (err > 0) {
if (bind)/* dont override defaults */ if (bind)/* dont override defaults */
return 0; return ACT_P_BOUND;
if (!(flags & TCA_ACT_FLAGS_REPLACE)) { if (!(flags & TCA_ACT_FLAGS_REPLACE)) {
tcf_idr_release(*a, bind); tcf_idr_release(*a, bind);
return -EEXIST; return -EEXIST;
......
...@@ -356,7 +356,7 @@ static int tcf_gate_init(struct net *net, struct nlattr *nla, ...@@ -356,7 +356,7 @@ static int tcf_gate_init(struct net *net, struct nlattr *nla,
return err; return err;
if (err && bind) if (err && bind)
return 0; return ACT_P_BOUND;
if (!err) { if (!err) {
ret = tcf_idr_create_from_flags(tn, index, est, a, ret = tcf_idr_create_from_flags(tn, index, est, a,
......
...@@ -548,7 +548,7 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla, ...@@ -548,7 +548,7 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla,
exists = err; exists = err;
if (exists && bind) { if (exists && bind) {
kfree(p); kfree(p);
return 0; return ACT_P_BOUND;
} }
if (!exists) { if (!exists) {
......
...@@ -135,7 +135,7 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla, ...@@ -135,7 +135,7 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
return err; return err;
exists = err; exists = err;
if (exists && bind) if (exists && bind)
return 0; return ACT_P_BOUND;
if (tb[TCA_MIRRED_BLOCKID] && parm->ifindex) { if (tb[TCA_MIRRED_BLOCKID] && parm->ifindex) {
NL_SET_ERR_MSG_MOD(extack, NL_SET_ERR_MSG_MOD(extack,
......
...@@ -195,7 +195,7 @@ static int tcf_mpls_init(struct net *net, struct nlattr *nla, ...@@ -195,7 +195,7 @@ static int tcf_mpls_init(struct net *net, struct nlattr *nla,
return err; return err;
exists = err; exists = err;
if (exists && bind) if (exists && bind)
return 0; return ACT_P_BOUND;
if (!exists) { if (!exists) {
ret = tcf_idr_create(tn, index, est, a, &act_mpls_ops, bind, ret = tcf_idr_create(tn, index, est, a, &act_mpls_ops, bind,
......
...@@ -69,7 +69,7 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est, ...@@ -69,7 +69,7 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est,
ret = ACT_P_CREATED; ret = ACT_P_CREATED;
} else if (err > 0) { } else if (err > 0) {
if (bind) if (bind)
return 0; return ACT_P_BOUND;
if (!(flags & TCA_ACT_FLAGS_REPLACE)) { if (!(flags & TCA_ACT_FLAGS_REPLACE)) {
tcf_idr_release(*a, bind); tcf_idr_release(*a, bind);
return -EEXIST; return -EEXIST;
......
...@@ -202,7 +202,7 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla, ...@@ -202,7 +202,7 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla,
ret = ACT_P_CREATED; ret = ACT_P_CREATED;
} else if (err > 0) { } else if (err > 0) {
if (bind) if (bind)
return 0; return ACT_P_BOUND;
if (!(flags & TCA_ACT_FLAGS_REPLACE)) { if (!(flags & TCA_ACT_FLAGS_REPLACE)) {
ret = -EEXIST; ret = -EEXIST;
goto out_release; goto out_release;
......
...@@ -77,7 +77,7 @@ static int tcf_police_init(struct net *net, struct nlattr *nla, ...@@ -77,7 +77,7 @@ static int tcf_police_init(struct net *net, struct nlattr *nla,
return err; return err;
exists = err; exists = err;
if (exists && bind) if (exists && bind)
return 0; return ACT_P_BOUND;
if (!exists) { if (!exists) {
ret = tcf_idr_create(tn, index, NULL, a, ret = tcf_idr_create(tn, index, NULL, a,
......
...@@ -66,7 +66,7 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, ...@@ -66,7 +66,7 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla,
return err; return err;
exists = err; exists = err;
if (exists && bind) if (exists && bind)
return 0; return ACT_P_BOUND;
if (!exists) { if (!exists) {
ret = tcf_idr_create(tn, index, est, a, ret = tcf_idr_create(tn, index, est, a,
......
...@@ -118,7 +118,7 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, ...@@ -118,7 +118,7 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla,
return err; return err;
exists = err; exists = err;
if (exists && bind) if (exists && bind)
return 0; return ACT_P_BOUND;
if (tb[TCA_DEF_DATA] == NULL) { if (tb[TCA_DEF_DATA] == NULL) {
if (exists) if (exists)
......
...@@ -209,7 +209,7 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla, ...@@ -209,7 +209,7 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla,
return err; return err;
exists = err; exists = err;
if (exists && bind) if (exists && bind)
return 0; return ACT_P_BOUND;
if (!flags) { if (!flags) {
if (exists) if (exists)
......
...@@ -157,7 +157,7 @@ static int tcf_skbmod_init(struct net *net, struct nlattr *nla, ...@@ -157,7 +157,7 @@ static int tcf_skbmod_init(struct net *net, struct nlattr *nla,
return err; return err;
exists = err; exists = err;
if (exists && bind) if (exists && bind)
return 0; return ACT_P_BOUND;
if (!lflags) { if (!lflags) {
if (exists) if (exists)
......
...@@ -401,7 +401,7 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, ...@@ -401,7 +401,7 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla,
return err; return err;
exists = err; exists = err;
if (exists && bind) if (exists && bind)
return 0; return ACT_P_BOUND;
switch (parm->t_action) { switch (parm->t_action) {
case TCA_TUNNEL_KEY_ACT_RELEASE: case TCA_TUNNEL_KEY_ACT_RELEASE:
......
...@@ -151,7 +151,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, ...@@ -151,7 +151,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla,
return err; return err;
exists = err; exists = err;
if (exists && bind) if (exists && bind)
return 0; return ACT_P_BOUND;
switch (parm->v_action) { switch (parm->v_action) {
case TCA_VLAN_ACT_POP: case TCA_VLAN_ACT_POP:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment