Commit 5ac55dfc authored by Mark Zhang's avatar Mark Zhang Committed by Jason Gunthorpe
Browse files

RDMA/mlx5: Set UDP source port based on the grh.flow_label

Calculate UDP source port based on the grh.flow_label. If grh.flow_label
is not valid, we will use minimal supported UDP source port.

Link: https://lore.kernel.org/r/20200504051935.269708-6-leon@kernel.org


Signed-off-by: default avatarMark Zhang <markz@mellanox.com>
Reviewed-by: default avatarMaor Gottlieb <maorg@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent f6653405
Loading
Loading
Loading
Loading
+19 −2
Original line number Diff line number Diff line
@@ -32,6 +32,24 @@

#include "mlx5_ib.h"

static __be16 mlx5_ah_get_udp_sport(const struct mlx5_ib_dev *dev,
				  const struct rdma_ah_attr *ah_attr)
{
	enum ib_gid_type gid_type = ah_attr->grh.sgid_attr->gid_type;
	__be16 sport;

	if ((gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) &&
	    (rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH) &&
	    (ah_attr->grh.flow_label & IB_GRH_FLOWLABEL_MASK))
		sport = cpu_to_be16(
			rdma_flow_label_to_udp_sport(ah_attr->grh.flow_label));
	else
		sport = mlx5_get_roce_udp_sport_min(dev,
						    ah_attr->grh.sgid_attr);

	return sport;
}

static void create_ib_ah(struct mlx5_ib_dev *dev, struct mlx5_ib_ah *ah,
			 struct rdma_ah_init_attr *init_attr)
{
@@ -60,8 +78,7 @@ static void create_ib_ah(struct mlx5_ib_dev *dev, struct mlx5_ib_ah *ah,

		memcpy(ah->av.rmac, ah_attr->roce.dmac,
		       sizeof(ah_attr->roce.dmac));
		ah->av.udp_sport =
			mlx5_get_roce_udp_sport(dev, ah_attr->grh.sgid_attr);
		ah->av.udp_sport = mlx5_ah_get_udp_sport(dev, ah_attr);
		ah->av.stat_rate_sl |= (rdma_ah_get_sl(ah_attr) & 0x7) << 1;
		if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
#define MLX5_ECN_ENABLED BIT(1)
+2 −2
Original line number Diff line number Diff line
@@ -629,7 +629,7 @@ static int mlx5_ib_del_gid(const struct ib_gid_attr *attr,
			     attr->index, NULL, NULL);
}

__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev,
__be16 mlx5_get_roce_udp_sport_min(const struct mlx5_ib_dev *dev,
				   const struct ib_gid_attr *attr)
{
	if (attr->gid_type != IB_GID_TYPE_ROCE_UDP_ENCAP)
+2 −2
Original line number Diff line number Diff line
@@ -1356,7 +1356,7 @@ int mlx5_ib_get_vf_guid(struct ib_device *device, int vf, u8 port,
int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u8 port,
			u64 guid, int type);

__be16 mlx5_get_roce_udp_sport(struct mlx5_ib_dev *dev,
__be16 mlx5_get_roce_udp_sport_min(const struct mlx5_ib_dev *dev,
				   const struct ib_gid_attr *attr);

void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);