Skip to content

Commit b95089d

Browse files
ogerlitzdavem330
authored andcommitted
net/mlx4: Move the tunnel steering helper function to mlx4_core
Move the function which we use to set VXLAN DMFS (flow-steering) rules from mlx4_en to mlx4_core. This refactoring will allow the mlx4_ib driver to call the helper for the use case of user-space RAW Ethernet QPs, such that they can serve VXLAN traffic too. Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 362b37b commit b95089d

File tree

3 files changed

+43
-29
lines changed

3 files changed

+43
-29
lines changed

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -474,39 +474,12 @@ static int mlx4_en_tunnel_steer_add(struct mlx4_en_priv *priv, unsigned char *ad
474474
int qpn, u64 *reg_id)
475475
{
476476
int err;
477-
struct mlx4_spec_list spec_eth_outer = { {NULL} };
478-
struct mlx4_spec_list spec_vxlan = { {NULL} };
479-
struct mlx4_spec_list spec_eth_inner = { {NULL} };
480-
481-
struct mlx4_net_trans_rule rule = {
482-
.queue_mode = MLX4_NET_TRANS_Q_FIFO,
483-
.exclusive = 0,
484-
.allow_loopback = 1,
485-
.promisc_mode = MLX4_FS_REGULAR,
486-
.priority = MLX4_DOMAIN_NIC,
487-
};
488-
489-
__be64 mac_mask = cpu_to_be64(MLX4_MAC_MASK << 16);
490477

491478
if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
492479
return 0; /* do nothing */
493480

494-
rule.port = priv->port;
495-
rule.qpn = qpn;
496-
INIT_LIST_HEAD(&rule.list);
497-
498-
spec_eth_outer.id = MLX4_NET_TRANS_RULE_ID_ETH;
499-
memcpy(spec_eth_outer.eth.dst_mac, addr, ETH_ALEN);
500-
memcpy(spec_eth_outer.eth.dst_mac_msk, &mac_mask, ETH_ALEN);
501-
502-
spec_vxlan.id = MLX4_NET_TRANS_RULE_ID_VXLAN; /* any vxlan header */
503-
spec_eth_inner.id = MLX4_NET_TRANS_RULE_ID_ETH; /* any inner eth header */
504-
505-
list_add_tail(&spec_eth_outer.list, &rule.list);
506-
list_add_tail(&spec_vxlan.list, &rule.list);
507-
list_add_tail(&spec_eth_inner.list, &rule.list);
508-
509-
err = mlx4_flow_attach(priv->mdev->dev, &rule, reg_id);
481+
err = mlx4_tunnel_steer_add(priv->mdev->dev, addr, priv->port, qpn,
482+
MLX4_DOMAIN_NIC, reg_id);
510483
if (err) {
511484
en_err(priv, "failed to add vxlan steering rule, err %d\n", err);
512485
return err;

drivers/net/ethernet/mellanox/mlx4/mcg.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,44 @@ int mlx4_flow_detach(struct mlx4_dev *dev, u64 reg_id)
10201020
}
10211021
EXPORT_SYMBOL_GPL(mlx4_flow_detach);
10221022

1023+
int mlx4_tunnel_steer_add(struct mlx4_dev *dev, unsigned char *addr,
1024+
int port, int qpn, u16 prio, u64 *reg_id)
1025+
{
1026+
int err;
1027+
struct mlx4_spec_list spec_eth_outer = { {NULL} };
1028+
struct mlx4_spec_list spec_vxlan = { {NULL} };
1029+
struct mlx4_spec_list spec_eth_inner = { {NULL} };
1030+
1031+
struct mlx4_net_trans_rule rule = {
1032+
.queue_mode = MLX4_NET_TRANS_Q_FIFO,
1033+
.exclusive = 0,
1034+
.allow_loopback = 1,
1035+
.promisc_mode = MLX4_FS_REGULAR,
1036+
};
1037+
1038+
__be64 mac_mask = cpu_to_be64(MLX4_MAC_MASK << 16);
1039+
1040+
rule.port = port;
1041+
rule.qpn = qpn;
1042+
rule.priority = prio;
1043+
INIT_LIST_HEAD(&rule.list);
1044+
1045+
spec_eth_outer.id = MLX4_NET_TRANS_RULE_ID_ETH;
1046+
memcpy(spec_eth_outer.eth.dst_mac, addr, ETH_ALEN);
1047+
memcpy(spec_eth_outer.eth.dst_mac_msk, &mac_mask, ETH_ALEN);
1048+
1049+
spec_vxlan.id = MLX4_NET_TRANS_RULE_ID_VXLAN; /* any vxlan header */
1050+
spec_eth_inner.id = MLX4_NET_TRANS_RULE_ID_ETH; /* any inner eth header */
1051+
1052+
list_add_tail(&spec_eth_outer.list, &rule.list);
1053+
list_add_tail(&spec_vxlan.list, &rule.list);
1054+
list_add_tail(&spec_eth_inner.list, &rule.list);
1055+
1056+
err = mlx4_flow_attach(dev, &rule, reg_id);
1057+
return err;
1058+
}
1059+
EXPORT_SYMBOL(mlx4_tunnel_steer_add);
1060+
10231061
int mlx4_FLOW_STEERING_IB_UC_QP_RANGE(struct mlx4_dev *dev, u32 min_range_qpn,
10241062
u32 max_range_qpn)
10251063
{

include/linux/mlx4/device.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,9 @@ int mlx4_map_sw_to_hw_steering_id(struct mlx4_dev *dev,
11961196
enum mlx4_net_trans_rule_id id);
11971197
int mlx4_hw_rule_sz(struct mlx4_dev *dev, enum mlx4_net_trans_rule_id id);
11981198

1199+
int mlx4_tunnel_steer_add(struct mlx4_dev *dev, unsigned char *addr,
1200+
int port, int qpn, u16 prio, u64 *reg_id);
1201+
11991202
void mlx4_sync_pkey_table(struct mlx4_dev *dev, int slave, int port,
12001203
int i, int val);
12011204

0 commit comments

Comments
 (0)