libmlx4: Add RoCEE support
PATCH v7 1/2 libmlx4: Add RoCEE support
Modify libmlx4 to support RoCEE. The change involves retrieving the MAC address of a port based on its GID through a new system call, ibv_cmd_get_mac(), and embedding the MAC in the address vector representation of mlx4.
Signed-off-by Eli Cohen <eli-VPRAkNaXOzVS1MOuV/[email protected]>
--- src/mlx4.h | 3 +++ src/qp.c | 2 ++ src/verbs.c | 29 +++++++++++++++++++++++++++++ src/wqe.h | 3 ++- 4 files changed, 36 insertions(+), 1 deletions(-)
src/mlx4.h +3 -0
@@ -236,11 +236,14 @@ struct mlx4_av {uint8_t hop_limit;uint32_t sl_tclass_flowlabel;uint8_t dgid[16 ]; +uint8_t mac[8 ]; };struct mlx4_ah {struct ibv_ah ibv_ah;struct mlx4_av av; +uint16_t vlan; +uint8_t mac[6 ]; };static inline unsigned long align (unsigned long val,unsigned long align)
src/qp.c +2 -0
@@ -143,6 +143,8 @@ static void set_datagram_seg(struct mlx4_wqe_datagram_seg *dseg,memcpy (dseg->av, &to_mah (wr->wr.ud.ah)->av,sizeof (struct mlx4_av )); dseg->dqpn =htonl (wr->wr.ud.remote_qpn); dseg->qkey =htonl (wr->wr.ud.remote_qkey); + dseg->vlan =htons (to_mah (wr->wr.ud.ah)->vlan); +memcpy (dseg->mac,to_mah (wr->wr.ud.ah)->mac,6 ); }static void __set_data_seg (struct mlx4_wqe_data_seg *dseg,struct ibv_sge *sg)
src/verbs.c +29 -0
@@ -614,9 +614,21 @@ int mlx4_destroy_qp(struct ibv_qp *ibqp)return 0 ; } +static int mcast_mac (uint8_t *mac) +{ +int i; +uint8_t val =0xff ; + +for (i =0 ; i <6 ; ++i) + val &= mac[i]; + +return val ==0xff ; +} +struct ibv_ah *mlx4_create_ah (struct ibv_pd *pd,struct ibv_ah_attr *attr) {struct mlx4_ah *ah; +struct ibv_port_attr port_attr; ah =malloc (sizeof *ah);if (!ah)
@@ -642,7 +654,24 @@ struct ibv_ah *mlx4_create_ah(struct ibv_pd *pd, struct ibv_ah_attr *attr)memcpy (ah->av.dgid, attr->grh.dgid.raw,16 ); } +if (ibv_query_port (pd->context, attr->port_num, &port_attr)) + goto err; + +if (port_attr.link_layer ==IBV_LINK_LAYER_ETHERNET ) { +if (ibv_cmd_get_mac (pd, attr->port_num, ah->av.dgid, ah->mac)) + goto err; + + ah->vlan =0 ; +if (mcast_mac (ah->mac)) + ah->av.dlid =htons (0xc000 ); + + } + +return &ah->ibv_ah; +err: +free (ah); +return NULL ; }int mlx4_destroy_ah (struct ibv_ah *ah)
src/wqe.h +2 -1
@@ -78,7 +78,8 @@ struct mlx4_wqe_datagram_seg {uint32_t av[8 ];uint32_t dqpn;uint32_t qkey; -uint32_t reserved[2 ]; +uint16_t vlan; +uint8_t mac[6 ]; };struct mlx4_wqe_data_seg {
Signature · 6 lines
1.6.6 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html