History

mlxsw: core_acl_flex_actions: Return error for conflicting actions

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.

Nir Dotan committed 8 years ago

Commit 3757b251 parent afb41bb1 file · +21 −21Browse files

Unified · Split

drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.c+21−21
@@ -626,8 +626,8 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block, · 625 unmodified lines
626 char *oneact;626 char *oneact;
627 char *actions;627 char *actions;
628 628
629 if (WARN_ON(block->finished))629 if (block->finished)
630 return NULL;630 return ERR_PTR(-EINVAL);
631 if (block->cur_act_index + action_size >631 if (block->cur_act_index + action_size >
632 block->afa->max_acts_per_set) {632 block->afa->max_acts_per_set) {
633 struct mlxsw_afa_set *set;633 struct mlxsw_afa_set *set;
@@ -637,7 +637,7 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block, · 3 unmodified lines
637 */637 */
638 set = mlxsw_afa_set_create(false);638 set = mlxsw_afa_set_create(false);
639 if (!set)639 if (!set)
640 return NULL;640 return ERR_PTR(-ENOBUFS);
641 set->prev = block->cur_set;641 set->prev = block->cur_set;
642 block->cur_act_index = 0;642 block->cur_act_index = 0;
643 block->cur_set->next = set;643 block->cur_set->next = set;
@@ -724,8 +724,8 @@ int mlxsw_afa_block_append_vlan_modify(struct mlxsw_afa_block *block, · 80 unmodified lines
724 MLXSW_AFA_VLAN_CODE,724 MLXSW_AFA_VLAN_CODE,
725 MLXSW_AFA_VLAN_SIZE);725 MLXSW_AFA_VLAN_SIZE);
726 726
727 if (!act)727 if (IS_ERR(act))
728 return -ENOBUFS;728 return PTR_ERR(act);
729 mlxsw_afa_vlan_pack(act, MLXSW_AFA_VLAN_VLAN_TAG_CMD_NOP,729 mlxsw_afa_vlan_pack(act, MLXSW_AFA_VLAN_VLAN_TAG_CMD_NOP,
730 MLXSW_AFA_VLAN_CMD_SET_OUTER, vid,730 MLXSW_AFA_VLAN_CMD_SET_OUTER, vid,
731 MLXSW_AFA_VLAN_CMD_SET_OUTER, pcp,731 MLXSW_AFA_VLAN_CMD_SET_OUTER, pcp,
@@ -806,8 +806,8 @@ int mlxsw_afa_block_append_drop(struct mlxsw_afa_block *block) · 74 unmodified lines
806 MLXSW_AFA_TRAPDISC_CODE,806 MLXSW_AFA_TRAPDISC_CODE,
807 MLXSW_AFA_TRAPDISC_SIZE);807 MLXSW_AFA_TRAPDISC_SIZE);
808 808
809 if (!act)809 if (IS_ERR(act))
810 return -ENOBUFS;810 return PTR_ERR(act);
811 mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,811 mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,
812 MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD, 0);812 MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD, 0);
813 return 0;813 return 0;
@@ -820,8 +820,8 @@ int mlxsw_afa_block_append_trap(struct mlxsw_afa_block *block, u16 trap_id) · 6 unmodified lines
820 MLXSW_AFA_TRAPDISC_CODE,820 MLXSW_AFA_TRAPDISC_CODE,
821 MLXSW_AFA_TRAPDISC_SIZE);821 MLXSW_AFA_TRAPDISC_SIZE);
822 822
823 if (!act)823 if (IS_ERR(act))
824 return -ENOBUFS;824 return PTR_ERR(act);
825 mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,825 mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,
826 MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD,826 MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD,
827 trap_id);827 trap_id);
@@ -836,8 +836,8 @@ int mlxsw_afa_block_append_trap_and_forward(struct mlxsw_afa_block *block, · 8 unmodified lines
836 MLXSW_AFA_TRAPDISC_CODE,836 MLXSW_AFA_TRAPDISC_CODE,
837 MLXSW_AFA_TRAPDISC_SIZE);837 MLXSW_AFA_TRAPDISC_SIZE);
838 838
839 if (!act)839 if (IS_ERR(act))
840 return -ENOBUFS;840 return PTR_ERR(act);
841 mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,841 mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,
842 MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD,842 MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD,
843 trap_id);843 trap_id);
@@ -908,8 +908,8 @@ mlxsw_afa_block_append_allocated_mirror(struct mlxsw_afa_block *block, · 64 unmodified lines
908 char *act = mlxsw_afa_block_append_action(block,908 char *act = mlxsw_afa_block_append_action(block,
909 MLXSW_AFA_TRAPDISC_CODE,909 MLXSW_AFA_TRAPDISC_CODE,
910 MLXSW_AFA_TRAPDISC_SIZE);910 MLXSW_AFA_TRAPDISC_SIZE);
911 if (!act)911 if (IS_ERR(act))
912 return -ENOBUFS;912 return PTR_ERR(act);
913 mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,913 mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,
914 MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD, 0);914 MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD, 0);
915 mlxsw_afa_trapdisc_mirror_pack(act, true, mirror_agent);915 mlxsw_afa_trapdisc_mirror_pack(act, true, mirror_agent);
@@ -996,8 +996,8 @@ int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block, · 80 unmodified lines
996 996
997 act = mlxsw_afa_block_append_action(block, MLXSW_AFA_FORWARD_CODE,997 act = mlxsw_afa_block_append_action(block, MLXSW_AFA_FORWARD_CODE,
998 MLXSW_AFA_FORWARD_SIZE);998 MLXSW_AFA_FORWARD_SIZE);
999 if (!act) {999 if (IS_ERR(act)) {
1000 err = -ENOBUFS;1000 err = PTR_ERR(act);
1001 goto err_append_action;1001 goto err_append_action;
1002 }1002 }
1003 mlxsw_afa_forward_pack(act, MLXSW_AFA_FORWARD_TYPE_PBS,1003 mlxsw_afa_forward_pack(act, MLXSW_AFA_FORWARD_TYPE_PBS,
@@ -1052,8 +1052,8 @@ int mlxsw_afa_block_append_allocated_counter(struct mlxsw_afa_block *block, · 48 unmodified lines
1052{1052{
1053 char *act = mlxsw_afa_block_append_action(block, MLXSW_AFA_POLCNT_CODE,1053 char *act = mlxsw_afa_block_append_action(block, MLXSW_AFA_POLCNT_CODE,
1054 MLXSW_AFA_POLCNT_SIZE);1054 MLXSW_AFA_POLCNT_SIZE);
1055 if (!act)1055 if (IS_ERR(act))
1056 return -ENOBUFS;1056 return PTR_ERR(act);
1057 mlxsw_afa_polcnt_pack(act, MLXSW_AFA_POLCNT_COUNTER_SET_TYPE_PACKETS_BYTES,1057 mlxsw_afa_polcnt_pack(act, MLXSW_AFA_POLCNT_COUNTER_SET_TYPE_PACKETS_BYTES,
1058 counter_index);1058 counter_index);
1059 return 0;1059 return 0;
@@ -1123,8 +1123,8 @@ int mlxsw_afa_block_append_fid_set(struct mlxsw_afa_block *block, u16 fid) · 63 unmodified lines
1123 char *act = mlxsw_afa_block_append_action(block,1123 char *act = mlxsw_afa_block_append_action(block,
1124 MLXSW_AFA_VIRFWD_CODE,1124 MLXSW_AFA_VIRFWD_CODE,
1125 MLXSW_AFA_VIRFWD_SIZE);1125 MLXSW_AFA_VIRFWD_SIZE);
1126 if (!act)1126 if (IS_ERR(act))
1127 return -ENOBUFS;1127 return PTR_ERR(act);
1128 mlxsw_afa_virfwd_pack(act, MLXSW_AFA_VIRFWD_FID_CMD_SET, fid);1128 mlxsw_afa_virfwd_pack(act, MLXSW_AFA_VIRFWD_FID_CMD_SET, fid);
1129 return 0;1129 return 0;
1130}1130}
@@ -1193,8 +1193,8 @@ int mlxsw_afa_block_append_mcrouter(struct mlxsw_afa_block *block, · 62 unmodified lines
1193 char *act = mlxsw_afa_block_append_action(block,1193 char *act = mlxsw_afa_block_append_action(block,
1194 MLXSW_AFA_MCROUTER_CODE,1194 MLXSW_AFA_MCROUTER_CODE,
1195 MLXSW_AFA_MCROUTER_SIZE);1195 MLXSW_AFA_MCROUTER_SIZE);
1196 if (!act)1196 if (IS_ERR(act))
1197 return -ENOBUFS;1197 return PTR_ERR(act);
1198 mlxsw_afa_mcrouter_pack(act, MLXSW_AFA_MCROUTER_RPF_ACTION_TRAP,1198 mlxsw_afa_mcrouter_pack(act, MLXSW_AFA_MCROUTER_RPF_ACTION_TRAP,
1199 expected_irif, min_mtu, rmid_valid, kvdl_index);1199 expected_irif, min_mtu, rmid_valid, kvdl_index);
1200 return 0;1200 return 0;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t