aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Pirko <jiri@mellanox.com>2017-02-15 06:09:51 -0500
committerDavid S. Miller <davem@davemloft.net>2017-02-15 13:23:20 -0500
commit0c921a894c2f01850f39ad6ecb31dd92a9cc9839 (patch)
treedbcb647fe836f7ead7fd141ca55cb1867c46f14d
parent6a553b4894264eb880fe07c2ac6be54eea1d7abb (diff)
mlxsw: acl: Use PBS type for forward action
Current behaviour of "mirred redirect" action (forward) offload is a bit odd. For matched packets the action forwards them to the desired destination, but it also lets the packet duplicates to go the original way down (bridge, router, etc). That is more like "mirred mirror". Fix this by using PBS type which behaves exactly like "mirred redirect". Note that PBS does not support loopback mode. Fixes: 4cda7d8d7098 ("mlxsw: core: Introduce flexible actions support") Signed-off-by: Jiri Pirko <jiri@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.c b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.c
index 42bb18feb316..5f337715a4da 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.c
@@ -651,17 +651,16 @@ int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block,
651 u8 local_port, bool in_port) 651 u8 local_port, bool in_port)
652{ 652{
653 struct mlxsw_afa_fwd_entry_ref *fwd_entry_ref; 653 struct mlxsw_afa_fwd_entry_ref *fwd_entry_ref;
654 u32 kvdl_index = 0; 654 u32 kvdl_index;
655 char *act; 655 char *act;
656 int err; 656 int err;
657 657
658 if (!in_port) { 658 if (in_port)
659 fwd_entry_ref = mlxsw_afa_fwd_entry_ref_create(block, 659 return -EOPNOTSUPP;
660 local_port); 660 fwd_entry_ref = mlxsw_afa_fwd_entry_ref_create(block, local_port);
661 if (IS_ERR(fwd_entry_ref)) 661 if (IS_ERR(fwd_entry_ref))
662 return PTR_ERR(fwd_entry_ref); 662 return PTR_ERR(fwd_entry_ref);
663 kvdl_index = fwd_entry_ref->fwd_entry->kvdl_index; 663 kvdl_index = fwd_entry_ref->fwd_entry->kvdl_index;
664 }
665 664
666 act = mlxsw_afa_block_append_action(block, MLXSW_AFA_FORWARD_CODE, 665 act = mlxsw_afa_block_append_action(block, MLXSW_AFA_FORWARD_CODE,
667 MLXSW_AFA_FORWARD_SIZE); 666 MLXSW_AFA_FORWARD_SIZE);
@@ -669,13 +668,12 @@ int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block,
669 err = -ENOBUFS; 668 err = -ENOBUFS;
670 goto err_append_action; 669 goto err_append_action;
671 } 670 }
672 mlxsw_afa_forward_pack(act, MLXSW_AFA_FORWARD_TYPE_OUTPUT, 671 mlxsw_afa_forward_pack(act, MLXSW_AFA_FORWARD_TYPE_PBS,
673 kvdl_index, in_port); 672 kvdl_index, in_port);
674 return 0; 673 return 0;
675 674
676err_append_action: 675err_append_action:
677 if (!in_port) 676 mlxsw_afa_fwd_entry_ref_destroy(block, fwd_entry_ref);
678 mlxsw_afa_fwd_entry_ref_destroy(block, fwd_entry_ref);
679 return err; 677 return err;
680} 678}
681EXPORT_SYMBOL(mlxsw_afa_block_append_fwd); 679EXPORT_SYMBOL(mlxsw_afa_block_append_fwd);