]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
mlxsw: core_acl_flex_actions: Return error for conflicting actions
authorNir Dotan <nird@mellanox.com>
Fri, 3 Aug 2018 12:57:41 +0000 (15:57 +0300)
committerJuerg Haefliger <juergh@canonical.com>
Wed, 24 Jul 2019 01:42:23 +0000 (19:42 -0600)
BugLink: https://bugs.launchpad.net/bugs/1835845
[ Upstream commit 3757b255bf20ae3c941abae7624ff215bfd9ef05 ]

Spectrum switch ACL action set is built in groups of three actions
which may point to additional actions. A group holds a single record
which can be set as goto record for pointing at a following group
or can be set to mark the termination of the lookup. This is perfectly
adequate for handling a series of actions to be executed on a packet.
While the SW model allows configuration of conflicting actions
where it is clear that some actions will never execute, the mlxsw
driver must block such configurations as it creates a conflict
over the single terminate/goto record value.

For a conflicting actions configuration such as:

 # tc filter add dev swp49 parent ffff: \
   protocol ip pref 10 \
   flower skip_sw dst_ip 192.168.101.1 \
   action goto chain 100 \
   action mirred egress mirror dev swp4

Where it is clear that the last action will never execute, the
mlxsw driver was issuing a warning instead of returning an error.
Therefore replace that warning with an error for this specific
case.

Fixes: 4cda7d8d7098 ("mlxsw: core: Introduce flexible actions support")
Signed-off-by: Nir Dotan <nird@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.c

index 6a979a09ab72d562548ede70faccb49dbf8549bd..ee667b8ebc2549aa1b4a92f02f107fb3d2324c70 100644 (file)
@@ -545,8 +545,8 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block,
        char *oneact;
        char *actions;
 
-       if (WARN_ON(block->finished))
-               return NULL;
+       if (block->finished)
+               return ERR_PTR(-EINVAL);
        if (block->cur_act_index + action_size >
            block->afa->max_acts_per_set) {
                struct mlxsw_afa_set *set;
@@ -556,7 +556,7 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block,
                 */
                set = mlxsw_afa_set_create(false);
                if (!set)
-                       return NULL;
+                       return ERR_PTR(-ENOBUFS);
                set->prev = block->cur_set;
                block->cur_act_index = 0;
                block->cur_set->next = set;
@@ -643,8 +643,8 @@ int mlxsw_afa_block_append_vlan_modify(struct mlxsw_afa_block *block,
                                                  MLXSW_AFA_VLAN_CODE,
                                                  MLXSW_AFA_VLAN_SIZE);
 
-       if (!act)
-               return -ENOBUFS;
+       if (IS_ERR(act))
+               return PTR_ERR(act);
        mlxsw_afa_vlan_pack(act, MLXSW_AFA_VLAN_VLAN_TAG_CMD_NOP,
                            MLXSW_AFA_VLAN_CMD_SET_OUTER, vid,
                            MLXSW_AFA_VLAN_CMD_SET_OUTER, pcp,
@@ -707,8 +707,8 @@ int mlxsw_afa_block_append_drop(struct mlxsw_afa_block *block)
                                                  MLXSW_AFA_TRAPDISC_CODE,
                                                  MLXSW_AFA_TRAPDISC_SIZE);
 
-       if (!act)
-               return -ENOBUFS;
+       if (IS_ERR(act))
+               return PTR_ERR(act);
        mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,
                                MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD, 0);
        return 0;
@@ -721,8 +721,8 @@ int mlxsw_afa_block_append_trap(struct mlxsw_afa_block *block, u16 trap_id)
                                                  MLXSW_AFA_TRAPDISC_CODE,
                                                  MLXSW_AFA_TRAPDISC_SIZE);
 
-       if (!act)
-               return -ENOBUFS;
+       if (IS_ERR(act))
+               return PTR_ERR(act);
        mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,
                                MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD,
                                trap_id);
@@ -737,8 +737,8 @@ int mlxsw_afa_block_append_trap_and_forward(struct mlxsw_afa_block *block,
                                                  MLXSW_AFA_TRAPDISC_CODE,
                                                  MLXSW_AFA_TRAPDISC_SIZE);
 
-       if (!act)
-               return -ENOBUFS;
+       if (IS_ERR(act))
+               return PTR_ERR(act);
        mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,
                                MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD,
                                trap_id);
@@ -802,8 +802,8 @@ int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block,
 
        act = mlxsw_afa_block_append_action(block, MLXSW_AFA_FORWARD_CODE,
                                            MLXSW_AFA_FORWARD_SIZE);
-       if (!act) {
-               err = -ENOBUFS;
+       if (IS_ERR(act)) {
+               err = PTR_ERR(act);
                goto err_append_action;
        }
        mlxsw_afa_forward_pack(act, MLXSW_AFA_FORWARD_TYPE_PBS,
@@ -859,8 +859,8 @@ int mlxsw_afa_block_append_counter(struct mlxsw_afa_block *block,
        char *act = mlxsw_afa_block_append_action(block,
                                                  MLXSW_AFA_POLCNT_CODE,
                                                  MLXSW_AFA_POLCNT_SIZE);
-       if (!act)
-               return -ENOBUFS;
+       if (IS_ERR(act))
+               return PTR_ERR(act);
        mlxsw_afa_polcnt_pack(act, MLXSW_AFA_POLCNT_COUNTER_SET_TYPE_PACKETS_BYTES,
                              counter_index);
        return 0;
@@ -904,8 +904,8 @@ int mlxsw_afa_block_append_fid_set(struct mlxsw_afa_block *block, u16 fid)
        char *act = mlxsw_afa_block_append_action(block,
                                                  MLXSW_AFA_VIRFWD_CODE,
                                                  MLXSW_AFA_VIRFWD_SIZE);
-       if (!act)
-               return -ENOBUFS;
+       if (IS_ERR(act))
+               return PTR_ERR(act);
        mlxsw_afa_virfwd_pack(act, MLXSW_AFA_VIRFWD_FID_CMD_SET, fid);
        return 0;
 }
@@ -974,8 +974,8 @@ int mlxsw_afa_block_append_mcrouter(struct mlxsw_afa_block *block,
        char *act = mlxsw_afa_block_append_action(block,
                                                  MLXSW_AFA_MCROUTER_CODE,
                                                  MLXSW_AFA_MCROUTER_SIZE);
-       if (!act)
-               return -ENOBUFS;
+       if (IS_ERR(act))
+               return PTR_ERR(act);
        mlxsw_afa_mcrouter_pack(act, MLXSW_AFA_MCROUTER_RPF_ACTION_TRAP,
                                expected_irif, min_mtu, rmid_valid, kvdl_index);
        return 0;