翻译:rdma_cm - RDMA通信管理器。
概述:rdma_cm是用于建立RDMA传输上的通信的管理器。
说明:RDMA CM是一个用于建立可靠连接和不可靠数据报数据传输的通信管理器。它为建立连接提供了一个RDMA传输中立的接口。该API基于套接字,但为队列对(QP)的语义进行了调整:通信必须通过特定的RDMA设备进行,并且数据传输是基于消息的。
RDMA CM仅提供RDMA API的通信管理(连接建立/拆除)部分。它与libibverbs库定义的verbs API配合使用。libibverbs库提供了发送和接收数据所需的接口。
客户端操作:此部分提供了通信的主动端(或客户端)的基本操作概述。一般的连接流程如下:
-
rdma_create_event_channel:创建接收事件的通道。
-
rdma_create_id:分配一个rdma_cm_id,类似于socket。
-
rdma_resolve_addr:获取本地RDMA设备以到达远程地址。
-
rdma_get_cm_event:等待RDMA_CM_EVENT_ADDR_RESOLVED事件。
-
rdma_ack_cm_event:确认事件。
-
rdma_create_qp:为通信分配一个QP。
-
rdma_resolve_route:确定到达远程地址的路由。
-
rdma_get_cm_event:等待RDMA_CM_EVENT_ROUTE_RESOLVED事件。
-
rdma_ack_cm_event:确认事件。
-
rdma_connect:连接到远程服务器。
-
rdma_get_cm_event:等待RDMA_CM_EVENT_ESTABLISHED事件。
-
rdma_ack_cm_event:确认事件。
-
在连接上执行数据传输。
-
rdma_disconnect:撤销连接。
-
rdma_get_cm_event:等待RDMA_CM_EVENT_DISCONNECTED事件。
-
rdma_ack_cm_event:确认事件。
-
rdma_destroy_qp:销毁QP。
-
rdma_destroy_id:释放rdma_cm_id。
-
rdma_destroy_event_channel:释放事件通道。
用于在节点之间建立不可靠数据报(UD)通信的过程几乎相同。但是,QPs之间不会形成实际的连接,因此不需要断开连接。
虽然此示例显示客户端发起断开连接,但连接的任一方都可以发起断开连接。
服务器操作:此部分提供了通信的被动端(或服务器端)的基本操作概述。一般的连接流程如下:
-
rdma_create_event_channel:创建接收事件的通道。
-
rdma_create_id:分配一个rdma_cm_id,类似于socket。
-
rdma_bind_addr:将本地端口号设置为监听的端口号。
-
rdma_listen:开始监听连接请求。
-
rdma_get_cm_event:等待带有新的rdma_cm_id的RDMA_CM_EVENT_CONNECT_REQUEST事件。
-
rdma_create_qp:在新的rdma_cm_id上为通信分配一个QP。
-
rdma_accept:接受连接请求。
-
rdma_ack_cm_event:确认事件。
-
rdma_get_cm_event:等待RDMA_CM_EVENT_ESTABLISHED事件。
-
rdma_ack_cm_event:确认事件。
-
在连接上执行数据传输。
-
rdma_get_cm_event:等待RDMA_CM_EVENT_DISCONNECTED事件。
-
rdma_ack_cm_event:确认事件。
-
rdma_disconnect:撤销连接。
-
rdma_destroy_qp:销毁QP。
-
rdma_destroy_id:释放已连接的rdma_cm_id。
-
rdma_destroy_id:释放监听的rdma_cm_id。
-
rdma_destroy_event_channel:释放事件通道。
返回值:成功返回0,错误返回-1。如果函数以异步方式运行,则返回值为0表示成功启动操作。操作仍然可能以错误完成;用户应该检查相关事件的状态。如果返回值为-1,则errno将包含有关失败原因的其他信息。
先前版本的库对于与ENOMEM、ENODEV、ENODATA、EINVAL和EADDRNOTAVAIL代码有关的某些情况会返回-errno并且不设置errno。希望检查这些代码并与先前版本的库兼容的应用程序必须在返回代码小于-1时手动将errno设置为返回代码的负值。