net/sched: simplify tcf_pedit_act
authorPedro Tammela <pctammela@mojatatu.com>
Tue, 31 Jan 2023 19:05:12 +0000 (16:05 -0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 21 Jun 2023 14:00:58 +0000 (16:00 +0200)
[ Upstream commit 95b069382351826c0ae37938070aa82dbeaf288d ]

Remove the check for a negative number of keys as
this cannot ever happen

Reviewed-by: Jamal Hadi Salim <jhs@mojatatu.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Pedro Tammela <pctammela@mojatatu.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Stable-dep-of: 6c02568fd1ae ("net/sched: act_pedit: Parse L3 Header for L4 offset")
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/sched/act_pedit.c

index 238759c..19f6b3f 100644 (file)
@@ -348,8 +348,12 @@ static int pedit_skb_hdr_offset(struct sk_buff *skb,
 static int tcf_pedit_act(struct sk_buff *skb, const struct tc_action *a,
                         struct tcf_result *res)
 {
+       enum pedit_header_type htype = TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK;
+       enum pedit_cmd cmd = TCA_PEDIT_KEY_EX_CMD_SET;
        struct tcf_pedit *p = to_pedit(a);
+       struct tcf_pedit_key_ex *tkey_ex;
        struct tcf_pedit_parms *parms;
+       struct tc_pedit_key *tkey;
        u32 max_offset;
        int i;
 
@@ -365,88 +369,81 @@ static int tcf_pedit_act(struct sk_buff *skb, const struct tc_action *a,
        tcf_lastuse_update(&p->tcf_tm);
        tcf_action_update_bstats(&p->common, skb);
 
-       if (parms->tcfp_nkeys > 0) {
-               struct tc_pedit_key *tkey = parms->tcfp_keys;
-               struct tcf_pedit_key_ex *tkey_ex = parms->tcfp_keys_ex;
-               enum pedit_header_type htype =
-                       TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK;
-               enum pedit_cmd cmd = TCA_PEDIT_KEY_EX_CMD_SET;
-
-               for (i = parms->tcfp_nkeys; i > 0; i--, tkey++) {
-                       u32 *ptr, hdata;
-                       int offset = tkey->off;
-                       int hoffset;
-                       u32 val;
-                       int rc;
-
-                       if (tkey_ex) {
-                               htype = tkey_ex->htype;
-                               cmd = tkey_ex->cmd;
-
-                               tkey_ex++;
-                       }
+       tkey = parms->tcfp_keys;
+       tkey_ex = parms->tcfp_keys_ex;
 
-                       rc = pedit_skb_hdr_offset(skb, htype, &hoffset);
-                       if (rc) {
-                               pr_info("tc action pedit bad header type specified (0x%x)\n",
-                                       htype);
-                               goto bad;
-                       }
+       for (i = parms->tcfp_nkeys; i > 0; i--, tkey++) {
+               int offset = tkey->off;
+               u32 *ptr, hdata;
+               int hoffset;
+               u32 val;
+               int rc;
 
-                       if (tkey->offmask) {
-                               u8 *d, _d;
-
-                               if (!offset_valid(skb, hoffset + tkey->at)) {
-                                       pr_info("tc action pedit 'at' offset %d out of bounds\n",
-                                               hoffset + tkey->at);
-                                       goto bad;
-                               }
-                               d = skb_header_pointer(skb, hoffset + tkey->at,
-                                                      sizeof(_d), &_d);
-                               if (!d)
-                                       goto bad;
-                               offset += (*d & tkey->offmask) >> tkey->shift;
-                       }
+               if (tkey_ex) {
+                       htype = tkey_ex->htype;
+                       cmd = tkey_ex->cmd;
 
-                       if (offset % 4) {
-                               pr_info("tc action pedit offset must be on 32 bit boundaries\n");
-                               goto bad;
-                       }
+                       tkey_ex++;
+               }
 
-                       if (!offset_valid(skb, hoffset + offset)) {
-                               pr_info("tc action pedit offset %d out of bounds\n",
-                                       hoffset + offset);
-                               goto bad;
-                       }
+               rc = pedit_skb_hdr_offset(skb, htype, &hoffset);
+               if (rc) {
+                       pr_info("tc action pedit bad header type specified (0x%x)\n",
+                               htype);
+                       goto bad;
+               }
 
-                       ptr = skb_header_pointer(skb, hoffset + offset,
-                                                sizeof(hdata), &hdata);
-                       if (!ptr)
-                               goto bad;
-                       /* just do it, baby */
-                       switch (cmd) {
-                       case TCA_PEDIT_KEY_EX_CMD_SET:
-                               val = tkey->val;
-                               break;
-                       case TCA_PEDIT_KEY_EX_CMD_ADD:
-                               val = (*ptr + tkey->val) & ~tkey->mask;
-                               break;
-                       default:
-                               pr_info("tc action pedit bad command (%d)\n",
-                                       cmd);
+               if (tkey->offmask) {
+                       u8 *d, _d;
+
+                       if (!offset_valid(skb, hoffset + tkey->at)) {
+                               pr_info("tc action pedit 'at' offset %d out of bounds\n",
+                                       hoffset + tkey->at);
                                goto bad;
                        }
+                       d = skb_header_pointer(skb, hoffset + tkey->at,
+                                              sizeof(_d), &_d);
+                       if (!d)
+                               goto bad;
+                       offset += (*d & tkey->offmask) >> tkey->shift;
+               }
 
-                       *ptr = ((*ptr & tkey->mask) ^ val);
-                       if (ptr == &hdata)
-                               skb_store_bits(skb, hoffset + offset, ptr, 4);
+               if (offset % 4) {
+                       pr_info("tc action pedit offset must be on 32 bit boundaries\n");
+                       goto bad;
                }
 
-               goto done;
-       } else {
-               WARN(1, "pedit BUG: index %d\n", p->tcf_index);
+               if (!offset_valid(skb, hoffset + offset)) {
+                       pr_info("tc action pedit offset %d out of bounds\n",
+                               hoffset + offset);
+                       goto bad;
+               }
+
+               ptr = skb_header_pointer(skb, hoffset + offset,
+                                        sizeof(hdata), &hdata);
+               if (!ptr)
+                       goto bad;
+               /* just do it, baby */
+               switch (cmd) {
+               case TCA_PEDIT_KEY_EX_CMD_SET:
+                       val = tkey->val;
+                       break;
+               case TCA_PEDIT_KEY_EX_CMD_ADD:
+                       val = (*ptr + tkey->val) & ~tkey->mask;
+                       break;
+               default:
+                       pr_info("tc action pedit bad command (%d)\n",
+                               cmd);
+                       goto bad;
+               }
+
+               *ptr = ((*ptr & tkey->mask) ^ val);
+               if (ptr == &hdata)
+                       skb_store_bits(skb, hoffset + offset, ptr, 4);
        }
 
+       goto done;
+
 bad:
        spin_lock(&p->tcf_lock);
        p->tcf_qstats.overlimits++;