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: Mark Zhang <markz@mellanox.com> Reviewed-by: Maor Gottlieb <maorg@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:

committed by
Jason Gunthorpe

parent
f665340519
commit
5ac55dfc6d
@@ -32,6 +32,24 @@
|
|||||||
|
|
||||||
#include "mlx5_ib.h"
|
#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,
|
static void create_ib_ah(struct mlx5_ib_dev *dev, struct mlx5_ib_ah *ah,
|
||||||
struct rdma_ah_init_attr *init_attr)
|
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,
|
memcpy(ah->av.rmac, ah_attr->roce.dmac,
|
||||||
sizeof(ah_attr->roce.dmac));
|
sizeof(ah_attr->roce.dmac));
|
||||||
ah->av.udp_sport =
|
ah->av.udp_sport = mlx5_ah_get_udp_sport(dev, ah_attr);
|
||||||
mlx5_get_roce_udp_sport(dev, ah_attr->grh.sgid_attr);
|
|
||||||
ah->av.stat_rate_sl |= (rdma_ah_get_sl(ah_attr) & 0x7) << 1;
|
ah->av.stat_rate_sl |= (rdma_ah_get_sl(ah_attr) & 0x7) << 1;
|
||||||
if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
|
if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
|
||||||
#define MLX5_ECN_ENABLED BIT(1)
|
#define MLX5_ECN_ENABLED BIT(1)
|
||||||
|
@@ -629,7 +629,7 @@ static int mlx5_ib_del_gid(const struct ib_gid_attr *attr,
|
|||||||
attr->index, NULL, NULL);
|
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)
|
const struct ib_gid_attr *attr)
|
||||||
{
|
{
|
||||||
if (attr->gid_type != IB_GID_TYPE_ROCE_UDP_ENCAP)
|
if (attr->gid_type != IB_GID_TYPE_ROCE_UDP_ENCAP)
|
||||||
|
@@ -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,
|
int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u8 port,
|
||||||
u64 guid, int type);
|
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);
|
const struct ib_gid_attr *attr);
|
||||||
|
|
||||||
void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
|
void mlx5_ib_cleanup_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
|
||||||
|
Reference in New Issue
Block a user