summaryrefslogtreecommitdiff
path: root/net/sched
diff options
context:
space:
mode:
authorAlexander Aring <aring@mojatatu.com>2017-10-12 00:16:06 +0300
committerDavid S. Miller <davem@davemloft.net>2017-10-13 08:23:02 +0300
commit734534e9a8e537d33d3598fa03b98eb089819961 (patch)
tree4d29f24caa08e84ece3a34a9a2ac1e8a915a6311 /net/sched
parented7f26223bb65d421cf3932de0d94c1cec4e1543 (diff)
downloadlinux-734534e9a8e537d33d3598fa03b98eb089819961.tar.xz
sched: act: ife: move encode/decode check to init
This patch adds the check of the two possible ife handlings encode and decode to the init callback. The decode value is for usability aspect and used in userspace code only. The current code offers encode else decode only. This patch avoids any other option than this. Signed-off-by: Alexander Aring <aring@mojatatu.com> Acked-by: Jamal Hadi Salim <jhs@mojatatu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched')
-rw-r--r--net/sched/act_ife.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c
index e0bc228c1218..21c10f5d1247 100644
--- a/net/sched/act_ife.c
+++ b/net/sched/act_ife.c
@@ -464,6 +464,13 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla,
parm = nla_data(tb[TCA_IFE_PARMS]);
+ /* IFE_DECODE is 0 and indicates the opposite of IFE_ENCODE because
+ * they cannot run as the same time. Check on all other values which
+ * are not supported right now.
+ */
+ if (parm->flags & ~IFE_ENCODE)
+ return -EINVAL;
+
exists = tcf_idr_check(tn, parm->index, a, bind);
if (exists && bind)
return 0;
@@ -786,17 +793,7 @@ static int tcf_ife_act(struct sk_buff *skb, const struct tc_action *a,
if (ife->flags & IFE_ENCODE)
return tcf_ife_encode(skb, a, res);
- if (!(ife->flags & IFE_ENCODE))
- return tcf_ife_decode(skb, a, res);
-
- pr_info_ratelimited("unknown failure(policy neither de/encode\n");
- spin_lock(&ife->tcf_lock);
- bstats_update(&ife->tcf_bstats, skb);
- tcf_lastuse_update(&ife->tcf_tm);
- ife->tcf_qstats.drops++;
- spin_unlock(&ife->tcf_lock);
-
- return TC_ACT_SHOT;
+ return tcf_ife_decode(skb, a, res);
}
static int tcf_ife_walker(struct net *net, struct sk_buff *skb,