LCOV - code coverage report
Current view: top level - legacy/ascend910/platform/common/adapter - adapter_hccp.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 38.9 % 1915 745
Test Date: 2026-08-04 10:52:23 Functions: 44.7 % 150 67

            Line data    Source code
       1              : /**
       2              :  * Copyright (c) 2025 Huawei Technologies Co., Ltd.
       3              :  * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
       4              :  * CANN Open Software License Agreement Version 2.0 (the "License").
       5              :  * Please refer to the License for details. You may not use this file except in compliance with the License.
       6              :  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
       7              :  * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
       8              :  * See LICENSE in the root of the software repository for the full text of the License.
       9              :  */
      10              : #include <adapter_hccp.h>
      11              : #include <securec.h>
      12              : #include <unordered_map>
      13              : #include <sys/socket.h>
      14              : #include <netdb.h>
      15              : #include <arpa/inet.h>
      16              : #include <sys/types.h>
      17              : #include <ifaddrs.h>
      18              : #include <adapter_rts.h>
      19              : #include <mutex>
      20              : #include <memory>
      21              : #include <unordered_set>
      22              : 
      23              : #include "network/hccp_common.h"
      24              : #include "externalinput.h"
      25              : #include "dlra_function.h"
      26              : #include "log.h"
      27              : #include "../host/transport_ibverbs_pub.h"
      28              : #include "config_plf_log.h"
      29              : 
      30              : using namespace hccl;
      31              : using namespace std;
      32              : 
      33              : /* 检查函数返回值是否为ROCE_ENOMEM_RET, 记录指定日志, 并返回HCCL_E_OOM, 内存大小取决于qp深度配置 */
      34              : #define CHK_OOM_RET(ret, qpInfo)                                                                                    \
      35              :     do {                                                                                                            \
      36              :         if ((ret) == ROCE_ENOMEM_RET) {                                                                                     \
      37              :             RPT_ENV_ERR(true, "EI0011",                                                                             \
      38              :                 std::vector<std::string>({"memory_size"}),                                                          \
      39              :                 std::vector<std::string>({"262144~3145728"}));            \
      40              :             HCCL_ERROR("[%s] ra qp create fail, reason: out of memory. qpInfo:[%s], return: ret[%d]",               \
      41              :                 __func__, (qpInfo), (ret));                                                                         \
      42              :             return HCCL_E_OOM;                                                                                      \
      43              :         }                                                                                                           \
      44              :     } while (0)
      45              : 
      46              : constexpr u32 MAX_NUM_OF_BATCH_CONN = 16;
      47              : constexpr u32 MAX_CQ_DEPTH = 65535;
      48              : constexpr u32 MAX_INLINE_DATA = 128;
      49              : constexpr u32 MAX_WR_NUM = 1024;
      50              : constexpr u32 MAX_RECV_SGE_NUM = 1;
      51              : constexpr u32 REPEAT_RAINIT_ERROR_CODE = 328002;
      52              : constexpr u32 REPEAT_LISTEN_ERROR_CODE = 128205;
      53              : 
      54              : // network 获取版本信息参数
      55              : constexpr u32 SOCKET_BATCH_CLOSE_INTERFACE = 1;
      56              : constexpr u32 SOCKET_BATCH_CLOSE_SUP_VER = 2;
      57              : constexpr u32 QP_ATTR_QOS_INTERFACE = 29;  // RA_RS_SET_QP_ATTR_QOS 的 opcode为29
      58              : constexpr u32 QP_ATTR_TIMEOUT_INTERFACE = 30;  // RA_RS_SET_QP_ATTR_TIMEOUT 的 opcode为30
      59              : constexpr u32 QP_ATTR_RETRY_CNT_INTERFACE = 31;  // RA_RS_SET_QP_ATTR_RETRY_CNT 的 opcode为31
      60              : constexpr u32 QP_ATTR_QOS_SUP_VER = 1; // 当前支持的版本号为1
      61              : 
      62              : constexpr u32 IFNUM_INTERFACE = 33; // RA_RS_GET_IFNUM的opcode为33
      63              : constexpr u32 IFNUM_INTERFACE_VERSION = 1; // 支持的RA_RS_GET_IFNUM_VERSION为1
      64              : 
      65              : constexpr u32 IFADDRS_V2_INTERFACE = 38; // RA_RS_GET_IFADDRS_V2的opcode为38
      66              : constexpr u32 IFADDRS_V2_INTERFACE_VERSTOIN = 3; // 支持获取chip上所有ip addr的IFADDRS_V2_INTERFACE_VERSTOIN为3
      67              : 
      68              : constexpr u32 RDEV_INIT_WITH_BACKUP = 81; // RA_RS_RDEV_INIT_WITH_BACKUP的opcode为81
      69              : constexpr u32 RDEV_INIT_WITH_BACKUP_SUP_VER = 1; // 当前支持的版本号为1
      70              : 
      71              : constexpr u32 ALL_NIC_NUM_910_93 = 2; // 910_93 上最大网卡数量
      72              : constexpr u32 ALL_NIC_NUM_910_A2 = 1; // 910 A2 上最大网卡数量
      73              : constexpr u32 MAX_ALL_NIC_NUM = ALL_NIC_NUM_910_93; // 最大可能的网卡数量
      74              : 
      75              : constexpr u32 QP_ATTR_TIMEOUT_SUPPORT_VER = 1;   // 当前支持配置RDMA TimeOut的版本号为1
      76              : constexpr u32 QP_ATTR_RETRY_CNT_SUPPORT_VER = 1;  // 当前支持配置RDMA RetryCnt的版本号为1
      77              : 
      78              : constexpr u32 CQE_ERR_INFO_INTERFACE = 32;  // RA_RS_GET_CQE_ERR_INFO 的 opcode为32
      79              : constexpr u32 CQE_ERR_INFO_LIST_INTERFACE = 80;  // RA_RS_GET_CQE_ERR_INFO_LIST 的 opcode为80
      80              : constexpr u32 CQE_ERR_INFO_SUP_VER = 1; // 当前支持的版本号为1
      81              : 
      82              : constexpr u32 QP_CREATE_WITH_ATTRS_INTERFACE = 39;  // RA_RS_QP_CREATE_WITH_ATTRS 的 opcode为39
      83              : constexpr u32 QP_CREATE_WITH_ATTRS_SUP_VER = 1; // 当前支持的版本号为1
      84              : 
      85              : constexpr u32 SOCKET_VNIC_IP_INFOS_INTERFACE = 55;  // RA_RS_GET_VNIC_IP_INFOS  的 opcode为55
      86              : constexpr u32 SOCKET_VNIC_IP_INFOS_SUP_VER = 1; // 当前支持的版本号为1
      87              : 
      88              : constexpr u32 GET_NOTIFY_BA = 14;   // RA_RS_GET_NOTIFY_BA 的 opcode为14
      89              : constexpr u32 GET_NOTIFY_BA_VERSION = 2;    // 当前支持的版本号为2
      90              : 
      91              : constexpr u32 SEND_NORMAL_WRLIST = 83 ;
      92              : constexpr u32 SEND_NORMAL_WRLIST_VERSION = 1 ;
      93              : 
      94              : constexpr u32 TLV_INIT = 87;
      95              : constexpr u32 TLV_DEINIT = 88;
      96              : constexpr u32 TLV_REQUEST = 89;
      97              : constexpr u32 TLV_VERSION = 1 ;
      98              : 
      99              : constexpr u32 GET_TLS_ENABLE = 95;
     100              : constexpr u32 TLS_ENABLE_VERSION = 1;
     101              : // handle ref
     102              : constexpr u32 FIRST_HANDLE_REF = 1;
     103              : 
     104              : constexpr s32 HCCL_SEND_CQ_DEPTH_DEFAULT = (8 * 1024); // HCCL 默认的scq深度
     105              : 
     106              : constexpr u32 TYPICAL_QP_MODIFY = 46; // opcode: RA_RS_TYPICAL_QP_MODIFY
     107              : constexpr u32 TYPICAL_QP_MODIFY_VERSION = 2; // 支持QP解耦socket建链版本号
     108              : 
     109              : constexpr u32 SOCKET_ABORT = 97; // opcode: RA_RS_SOCKET_ABORT 
     110              : constexpr u32 SOCKET_ABORT_VERSION = 1; // 支持socket abort的版本号
     111              : 
     112              : constexpr u32 RS_INIT = 15; // opcode: RA_RS_INIT
     113              : constexpr u32 RS_INIT_SUPPORT_ASYNC_VERSION = 2; // 支持socket async的版本号
     114              : 
     115              : constexpr u32 ROCE_ENOMEM_RET = 328100; // 创建qp时由于内存不足的错误返回值
     116              : 
     117              : template <typename T>
     118              : struct HandleInfo {
     119              :     std::mutex handleMutex;
     120              :     std::unordered_map<u32, T> handleMap;
     121              :     std::unordered_map<T, u32> handleRef;
     122              : };
     123              : 
     124              : HandleInfo<SocketHandle> g_socketHandleInfo;
     125              : HandleInfo<RdmaHandle> g_rdmaHandleInfo;
     126              : 
     127              : #if T_DESC("RDMA异步", true)
     128            0 : HcclResult HrtRaQpCreate(RdmaHandle rdmaHandle, int flag, int qpMode, QpHandle &qpHandle)
     129              : {
     130            0 :     string qpInfo = string("rdmaHandle:") + to_string(reinterpret_cast<intptr_t>(rdmaHandle)) + string("qpHandle:") +
     131            0 :         to_string(reinterpret_cast<intptr_t>(&qpHandle)) + string("flag:") + to_string(flag) + string("qpMode:") +
     132            0 :         to_string(qpMode);
     133              : 
     134            0 :     s32 ret = DlRaFunction::GetInstance().dlRaQpCreate(rdmaHandle, flag, qpMode, &qpHandle);
     135              : 
     136            0 :     CHK_OOM_RET(ret, qpInfo.c_str());
     137              : 
     138            0 :     CHK_PRT_RET(ret != 0 || (qpHandle == nullptr),
     139              :         HCCL_ERROR("[Create][RaQp]errNo[0x%016llx] ra qp create fail. qpInfo:[%s], return: ret[%d]",
     140              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), qpInfo.c_str(), ret),
     141              :         HCCL_E_NETWORK);
     142              : 
     143            0 :     struct QpAttr attr{};
     144            0 :     CHK_RET(hrtRaGetQpAttr(qpHandle, &attr));
     145            0 :     s32 deviceId = 0;
     146            0 :     if (hrtGetDevice(&deviceId) != HCCL_SUCCESS) {
     147            0 :         deviceId = -1;
     148              :     }
     149            0 :     PLF_CONFIG_DEBUG(PLF_RES, "Create Qp para: deviceId[%d] qpn[%u] qpInfo[%s]", deviceId, attr.qpn, qpInfo.c_str());
     150            0 :     return HCCL_SUCCESS;
     151            0 : }
     152              : 
     153            0 : HcclResult hrtRaTypicalQpCreate(RdmaHandle rdmaHandle, int flag,
     154              :     int qpMode, struct TypicalQp* qpInfo, QpHandle &qpHandle)
     155              : {
     156            0 :     std::string qpInfoStr = std::string("rdmaHandle:") + std::to_string(reinterpret_cast<intptr_t>(rdmaHandle)) + \
     157            0 :     std::string("flag:") + std::to_string(flag) + std::string("qpMode:") + std::to_string(qpMode) + \
     158            0 :     std::to_string(reinterpret_cast<intptr_t>(&qpHandle));
     159              : 
     160            0 :     s32 ret = DlRaFunction::GetInstance().dlRaTypicalQpCreate(rdmaHandle, flag, qpMode, qpInfo, &qpHandle);
     161              : 
     162            0 :     CHK_OOM_RET(ret, qpInfoStr.c_str());
     163              : 
     164            0 :     RPT_ENV_ERR(ret != 0 || (qpHandle == nullptr), "EI0007",
     165              :         std::vector<std::string>({"resource_type", "resource_info"}), std::vector<std::string>({"qp", "CreateQp"}));
     166              : 
     167            0 :     CHK_PRT_RET(ret != 0 || (qpHandle == nullptr), HCCL_ERROR("[%s][%s]errNo[0x%016llx] ra qp create fail. "\
     168              :         "params: flag[%d], qpMode[%d]. return: ret[%d]", LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RESOURCE.c_str(), 
     169              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), flag, qpMode, ret), HCCL_E_NETWORK);
     170              : 
     171            0 :     s32 deviceId = 0;
     172            0 :     if (hrtGetDevice(&deviceId) != HCCL_SUCCESS) {
     173            0 :         deviceId = -1;
     174              :     }
     175            0 :     PLF_CONFIG_DEBUG(PLF_RES, "Create Qp para: deviceId[%d] qpn[%u] qpInfo[%s]", deviceId, qpInfo->qpn, qpInfoStr.c_str());
     176            0 :     return HCCL_SUCCESS;
     177            0 : }
     178              : 
     179            0 : HcclResult CreateTypicalCq(RdmaHandle rdmaHandle, u32 cqDepth, u32 &cqn, void **cqHandle)
     180              : {
     181            0 :     HCCL_DEBUG("CreateTypicalCq cqDepth[%u]", cqDepth);
     182              : 
     183            0 :     s32 ret = DlRaFunction::GetInstance().dlRaTypicalCqCreate(rdmaHandle, cqDepth, &cqn, cqHandle);
     184            0 :     CHK_PRT_RET(ret != 0 || (*cqHandle == NULL),
     185              :         HCCL_ERROR("[CreateTypicalCq]create typical cq failed. ret[%d]", ret), HCCL_E_NETWORK);
     186            0 :     return HCCL_SUCCESS;
     187              : }
     188              : 
     189            0 : HcclResult DestroyTypicalCq(RdmaHandle rdmaHandle, u32 cqn, void *cqHandle)
     190              : {
     191            0 :     HCCL_DEBUG("DestroyTypicalCq cqn[%u]", cqn);
     192              : 
     193            0 :     s32 ret = DlRaFunction::GetInstance().dlRaTypicalCqDestroy(rdmaHandle, cqn, cqHandle);
     194            0 :     CHK_PRT_RET(ret != 0,
     195              :         HCCL_ERROR("[DestroyTypicalCq]destroy typical cq failed. ret[%d]", ret), HCCL_E_NETWORK);
     196            0 :     return HCCL_SUCCESS;
     197              : }
     198              : 
     199            0 : HcclResult HrtRaQpDestroyWithoutCQ(QpHandle handle)
     200              : {
     201            0 :     s32 ret = DlRaFunction::GetInstance().dlRaQpDestroyWithoutCQ(handle);
     202            0 :     CHK_PRT_RET(ret != 0,
     203              :         HCCL_ERROR("[HrtRaQpDestroyWithoutCQ]destroy qp without cq failed. ret[%d]", ret), HCCL_E_NETWORK);
     204            0 :     return HCCL_SUCCESS;
     205              : }
     206              : 
     207           30 : HcclResult hrtRaTypicalQpModify(QpHandle qpHandle, struct TypicalQp* localQpInfo, struct TypicalQp* remoteQpInfo)
     208              : {
     209          120 :     std::string qpInfo = std::string("qpHandle:") + std::to_string(reinterpret_cast<intptr_t>(qpHandle)) + \
     210          180 :     std::string("localQpInfo:") + std::to_string(reinterpret_cast<intptr_t>(&localQpInfo)) + \
     211          150 :     std::string("remoteQpInfo:") + std::to_string(reinterpret_cast<intptr_t>(&remoteQpInfo));
     212              : 
     213           30 :     s32 ret = DlRaFunction::GetInstance().dlRaTypicalQpModify(qpHandle, localQpInfo, remoteQpInfo);
     214           30 :     RPT_ENV_ERR(ret != 0, "EI0007",
     215              :         std::vector<std::string>({"resource_type", "resource_info"}), std::vector<std::string>({"qp", "ModifyQp"}));
     216              : 
     217           30 :     CHK_PRT_RET(ret == ROCE_EOPENSRC , HCCL_RUN_WARNING("[%s][%s]ra qp modify need retry.",
     218              :         LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RESOURCE.c_str()), HCCL_E_AGAIN);
     219           30 :     CHK_PRT_RET(ret != 0 , HCCL_ERROR("[%s][%s]errNo[0x%016llx] ra qp modify fail. return: ret[%d]", \
     220              :         LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RESOURCE.c_str(), HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
     221           30 :     return HCCL_SUCCESS;
     222           30 : }
     223              : 
     224            0 : HcclResult hrtRaTypicalSendWr(QpHandle handle, struct SendWr *wr, struct SendWrRsp *opRsp)
     225              : {
     226            0 :     s32 ret = 0;
     227            0 :     auto startTime = std::chrono::steady_clock::now();
     228            0 :     auto timeout = std::chrono::seconds(GetExternalInputHcclLinkTimeOut());
     229              : 
     230            0 :     HCCL_DEBUG("ra send wr");
     231              :     while (true) {
     232            0 :         ret = DlRaFunction::GetInstance().dlRaTypicalSendWr(handle, wr, opRsp);
     233            0 :         if (!ret) {
     234            0 :             break;  // 成功跳出
     235            0 :         } else if ((ret == SOCK_ENOENT) || (ret == SOCK_EAGAIN) ||
     236            0 :             (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE && ret == ROCE_ENOMEM)) {
     237            0 :             bool bTimeout = ((std::chrono::steady_clock::now() - startTime) >= timeout);
     238            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Send][RaWr]errNo[0x%016llx] ra get send async timeout[%d s]. "\
     239              :                 "return[%d], params: send_wrAddr[%p], opRspAddr[%p]",
     240              :                 HCCL_ERROR_CODE(HCCL_E_ROCE_TRANSFER), timeout,  ret, wr, opRsp), HCCL_E_ROCE_TRANSFER);
     241            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     242              :         } else {
     243            0 :             HCCL_ERROR("[Send][RaWr]ra send async fail. return[%d], para: send_wrAddr[%p], "\
     244              :                 "opRspAddr[%p].", ret, wr, opRsp);
     245            0 :             return HCCL_E_ROCE_TRANSFER; // 非-2/-11场景错误,不轮询,直接退出
     246              :         }
     247            0 :     }
     248            0 :     return HCCL_SUCCESS;
     249              : }
     250              : 
     251            6 : HcclResult HrtRaQpDestroy(QpHandle handle)
     252              : {
     253            6 :     struct QpAttr attr{};
     254            6 :     CHK_RET(hrtRaGetQpAttr(handle, &attr));
     255            6 :     s32 deviceId = 0;
     256            6 :     if (hrtGetDevice(&deviceId) != HCCL_SUCCESS) {
     257            0 :         deviceId = -1;
     258              :     }
     259            6 :     PLF_CONFIG_DEBUG(PLF_RES, "Destroy Qp para: deviceId[%d] qpn[%u]", deviceId, attr.qpn);
     260              : 
     261            6 :     s32 ret = 0;
     262            6 :     auto startTime = chrono::steady_clock::now();
     263            6 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
     264              :     while (true) {
     265            6 :         ret = DlRaFunction::GetInstance().dlRaQpDestroy(handle);
     266            6 :         if (!ret) {
     267            0 :             break;  // 成功跳出
     268            6 :         } else if (ret == ROCE_EAGAIN) {
     269            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
     270            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Destroy][RaQp]errNo[0x%016llx] ra qp destroy timeout[%d s]. "\
     271              :                 "return[%d].", HCCL_ERROR_CODE(HCCL_E_NETWORK), timeout, ret), HCCL_E_NETWORK);
     272            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     273              :         } else {
     274            6 :             HCCL_ERROR("[Destroy][RaQp]errNo[0x%016llx] ra qp destroy fail. return[%d].", \
     275              :                 HCCL_ERROR_CODE(HCCL_E_NETWORK), ret);
     276            6 :             return HCCL_E_NETWORK;  // 非ra限速场景错误,不轮询,直接退出
     277              :         }
     278            0 :     }
     279            0 :     return HCCL_SUCCESS;
     280              : }
     281              : 
     282            0 : HcclResult HrtRaGetQpDepth(RdmaHandle rdmaHandle, unsigned int *tempDepth, unsigned int *qpNum)
     283              : {
     284            0 :     CHK_PTR_NULL(rdmaHandle);
     285              : 
     286            0 :     s32 ret = DlRaFunction::GetInstance().dlRaGetQpDepth(rdmaHandle, tempDepth, qpNum);
     287            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[HrtRaGetQpDepth]errNo[0x%016llx] ra get qp depth fail. return[%d]",
     288              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
     289            0 :     return HCCL_SUCCESS;
     290              : }
     291              : 
     292            0 : HcclResult HrtRaSetQpDepth(RdmaHandle rdmaHandle, unsigned int tempDepth, unsigned int *qpNum)
     293              : {
     294            0 :     CHK_PTR_NULL(rdmaHandle);
     295              : 
     296            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSetQpDepth(rdmaHandle, tempDepth, qpNum);
     297            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[dlRaSetQpDepth]errNo[0x%016llx] ra set qp depth fail. return[%d]",
     298              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
     299            0 :     return HCCL_SUCCESS;
     300              : }
     301              : 
     302            0 : HcclResult HrtRaQpNonBlockConnectAsync(QpHandle handle, const SocketHandle sockHandle)
     303              : {
     304            0 :     s32 ret = DlRaFunction::GetInstance().dlRaQpConnectAsync(handle, sockHandle);
     305            0 :     if (ret == 0) {
     306            0 :         return HCCL_SUCCESS;
     307            0 :     } else if (ret == ROCE_EAGAIN) {
     308            0 :         return HCCL_E_AGAIN;
     309              :     } else {
     310            0 :         HCCL_ERROR("[HrtRaQpNonBlockConnectAsync]errNo[0x%016llx] ra qp connect async fail. return[%d].",\
     311              :             HCCL_ERROR_CODE(HCCL_E_NETWORK), ret);
     312            0 :         return HCCL_E_NETWORK;
     313              :     }
     314              : 
     315              :     return HCCL_SUCCESS;
     316              : }
     317              : 
     318            0 : HcclResult HrtRaQpConnectAsync(QpHandle handle, const SocketHandle sockHandle, std::function<bool()> needStop, u32 timeout)
     319              : {
     320            0 :     s32 ret = 0;
     321            0 :     auto startTime = chrono::steady_clock::now();
     322              :     const chrono::seconds timeoutSec = chrono::seconds(
     323            0 :         timeout > 0 ? timeout : GetExternalInputHcclLinkTimeOut());
     324              :     while (true) {
     325            0 :         CHK_PRT_RET(needStop(), HCCL_ERROR("Terminating operation due to external request"), HCCL_E_INTERNAL);
     326              : 
     327            0 :         ret = DlRaFunction::GetInstance().dlRaQpConnectAsync(handle, sockHandle);
     328            0 :         if (!ret) {
     329            0 :             break;  // 成功跳出
     330            0 :         } else if (ret == SOCK_EAGAIN) {
     331            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeoutSec);
     332            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[ConnectAsync][RaQp]errNo[0x%016llx] ra qp connect async "\
     333              :                 "timeout[%lld s]. return[%d].", HCCL_ERROR_CODE(HCCL_E_NETWORK), timeoutSec, ret), HCCL_E_NETWORK);
     334            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     335              :         } else {
     336            0 :             HCCL_ERROR("[ConnectAsync][RaQp]errNo[0x%016llx] ra qp connect async fail. return[%d]",\
     337              :                 HCCL_ERROR_CODE(HCCL_E_NETWORK), ret);
     338            0 :             return HCCL_E_NETWORK;  // 非ra限速场景错误,不轮询,直接退出
     339              :         }
     340            0 :     }
     341            0 :     return HCCL_SUCCESS;
     342              : }
     343              : 
     344            0 : s32 hrtGetRaQpStatus(QpHandle handle, int *status)
     345              : {
     346            0 :     return DlRaFunction::GetInstance().dlRaGetQpStatus(handle, status);
     347              : }
     348              : 
     349            0 : HcclResult HrtRaMrReg(QpHandle handle, struct MrInfoT *mrInfo)
     350              : {
     351            0 :     CHK_PTR_NULL(mrInfo);
     352            0 :     HCCL_DEBUG("ra mr reg: addr[%p], size[%llu], access[%d].", mrInfo->addr, mrInfo->size, mrInfo->access);
     353            0 :     s32 ret = DlRaFunction::GetInstance().dlRaMrReg(handle, mrInfo);
     354            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Reg][RaMr]errNo[0x%016llx] ra mr reg fail. return[%d], params: "\
     355              :         "addr[%p], size[%llu], access[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret, mrInfo->addr, mrInfo->size,
     356              :         mrInfo->access), HCCL_E_NETWORK);
     357            0 :     return HCCL_SUCCESS;
     358              : }
     359              : 
     360            0 : HcclResult HrtRaMrDereg(QpHandle handle, struct MrInfoT *mrInfo)
     361              : {
     362            0 :     CHK_PTR_NULL(mrInfo);
     363            0 :     HCCL_INFO("ra mr dereg: qphandle[%p], addr[%p], size[%llu Byte], access[%d].",
     364              :         handle, mrInfo->addr, mrInfo->size, mrInfo->access);
     365            0 :     s32 ret = DlRaFunction::GetInstance().dlRaMrDereg(handle, mrInfo);
     366            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Dereg][RaMr]errNo[0x%016llx] ra mr dereg fail. return[%d], params: "\
     367              :         "addr[%p], size[%llu Byte], access[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret, mrInfo->addr,
     368              :         mrInfo->size, mrInfo->access), HCCL_E_NETWORK);
     369            0 :     return HCCL_SUCCESS;
     370              : }
     371              : 
     372           92 : HcclResult hrtRaRegGlobalMr(const RdmaHandle rdmaHandle, struct MrInfoT &mrInfo, MrHandle &mrHandle)
     373              : {
     374           92 :     CHK_PTR_NULL(rdmaHandle);
     375           92 :     CHK_PTR_NULL(mrInfo.addr);
     376           92 :     CHK_PRT_RET((mrInfo.size <= 0), HCCL_ERROR("[hrtRaRegGlobalMr]memory size[%llu Byte] should be greater than 0.",
     377              :         mrInfo.size), HCCL_E_PARA);
     378              : 
     379           92 :     s32 ret = DlRaFunction::GetInstance().dlRaRegGlobalMr(rdmaHandle, &mrInfo, &mrHandle);
     380           92 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[hrtRaRegGlobalMr]errNo[0x%016llx] ra reg global mr fail. return[%d], params: "
     381              :         "addr[%p], size[%llu Byte], access[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK),
     382              :         ret, mrInfo.addr, mrInfo.size, mrInfo.access), HCCL_E_NETWORK);
     383           92 :     HCCL_DEBUG("[hrtRaRegGlobalMr]ra reg global mr: addr[%p], size[%llu Byte], access[%d]",\
     384              :         mrInfo.addr, mrInfo.size, mrInfo.access);
     385           92 :     return HCCL_SUCCESS;
     386              : }
     387              : 
     388           92 : HcclResult hrtRaDeRegGlobalMr(const RdmaHandle rdmaHandle, MrHandle mrHandle)
     389              : {
     390           92 :     CHK_PTR_NULL(rdmaHandle);
     391           92 :     CHK_PTR_NULL(mrHandle);
     392              : 
     393           92 :     HCCL_DEBUG("[hrtRaDeRegGlobalMr]ra dereg global.");
     394           92 :     s32 ret = DlRaFunction::GetInstance().dlRaDeRegGlobalMr(rdmaHandle, mrHandle);
     395           92 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[hrtRaDeRegGlobalMr]errNo[0x%016llx] ra dereg global mr fail. return[%d]",\
     396              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
     397              : 
     398           92 :     return HCCL_SUCCESS;
     399              : }
     400              : 
     401            0 : HcclResult HrtRaSendWr(QpHandle handle, struct SendWr *wr, struct SendWrRsp *opRsp)
     402              : {
     403            0 :     s32 ret = 0;
     404            0 :     auto startTime = chrono::steady_clock::now();
     405            0 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
     406              : 
     407            0 :     HCCL_DEBUG("ra send wr.");
     408              :     while (true) {
     409            0 :         ret = DlRaFunction::GetInstance().dlRaSendWr(handle, wr, opRsp);
     410            0 :         if (!ret) {
     411            0 :             break;  // 成功跳出
     412            0 :         } else if ((ret == SOCK_ENOENT) || (ret == ROCE_EAGAIN) ||
     413            0 :             (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE && ret == ROCE_ENOMEM)) {
     414            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
     415            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Send][RaWr]errNo[0x%016llx] ra get send async timeout[%d s]. "\
     416              :                 "return[%d], params: send_wrAddr[%p], opRspAddr[%p]",
     417              :                 HCCL_ERROR_CODE(HCCL_E_ROCE_TRANSFER), timeout,  ret, wr, opRsp), HCCL_E_ROCE_TRANSFER);
     418            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     419              :         } else {
     420            0 :             HCCL_ERROR("[Send][RaWr]ra send async fail. return[%d], para: send_wrAddr[%p], "\
     421              :                 "opRspAddr[%p].", ret, wr, opRsp);
     422            0 :             return HCCL_E_ROCE_TRANSFER; // 非-2/-11场景错误,不轮询,直接退出
     423              :         }
     424            0 :     }
     425              : 
     426            0 :     return HCCL_SUCCESS;
     427              : }
     428              : 
     429           77 : HcclResult HrtRaSendWrV2(QpHandle handle, struct SendWrV2 *wr, struct SendWrRsp *opRsp, HcclWorkflowMode workflowMode)
     430              : {
     431           77 :     s32 ret = 0;
     432           77 :     auto startTime = std::chrono::steady_clock::now();
     433           77 :     auto timeout = std::chrono::seconds(GetExternalInputHcclLinkTimeOut());
     434              : 
     435           77 :     HCCL_DEBUG("ra send wr.");
     436              :     while (true) {
     437           77 :         ret = DlRaFunction::GetInstance().dlRaSendWrV2(handle, wr, opRsp);
     438           77 :         if (!ret) {
     439           77 :             break;  // 成功跳出
     440            0 :         } else if ((ret == SOCK_ENOENT) || (ret == ROCE_EAGAIN) ||
     441            0 :             (workflowMode == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE && ret == ROCE_ENOMEM)) {
     442            0 :             HCCL_WARNING("after 1ms sendwr, ret=%d", ret);
     443            0 :             bool bTimeout = ((std::chrono::steady_clock::now() - startTime) >= timeout);
     444            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Send][RaWr]errNo[0x%016llx] ra get send async timeout[%d s]. "\
     445              :                 "return[%d], params: send_wrAddr[%p], opRspAddr[%p]",
     446              :                 HCCL_ERROR_CODE(HCCL_E_ROCE_TRANSFER), timeout,  ret, wr, opRsp), HCCL_E_ROCE_TRANSFER);
     447            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     448            0 :         } else {
     449            0 :             HCCL_ERROR("[Send][RaWr]ra send async fail. return[%d], para: send_wrAddr[%p], "\
     450              :                 "opRspAddr[%p].", ret, wr, opRsp);
     451            0 :             return HCCL_E_ROCE_TRANSFER; // 非-2/-11场景错误,不轮询,直接退出
     452              :         }
     453            0 :     }
     454              : 
     455           77 :     return HCCL_SUCCESS;
     456              : }
     457              : 
     458            0 : HcclResult HrtRaSendWrVerbs(QpHandle handle, struct SendWrVerbs *wr, struct SendWrRsp *opRsp)
     459              : {
     460            0 :     s32 ret = 0;
     461            0 :     auto startTime = std::chrono::steady_clock::now();
     462            0 :     auto timeout = std::chrono::seconds(GetExternalInputHcclLinkTimeOut());
     463              : 
     464            0 :     HCCL_DEBUG("ra send wr verbs.");
     465              :     while (true) {
     466            0 :         ret = DlRaFunction::GetInstance().dlRaSendWrVerbs(handle, wr, opRsp);
     467            0 :         if (!ret) {
     468            0 :             break;
     469            0 :         } else if ((ret == SOCK_ENOENT) || (ret == ROCE_EAGAIN) ||
     470            0 :             (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE && ret == ROCE_ENOMEM)) {
     471            0 :             bool bTimeOut = ((std::chrono::steady_clock::now() - startTime) >= timeout);
     472            0 :             CHK_PRT_RET(bTimeOut, HCCL_ERROR("[HrtRaSendWrVerbs][RaWr]errNo[0x%016llx] ra get send async timeout[%d s]. "\
     473              :                 "return[%d], params: send_wrAddr[%p], opRspAddr[%p]",
     474              :                 HCCL_ERROR_CODE(HCCL_E_ROCE_TRANSFER), timeout,  ret, wr, opRsp), HCCL_E_ROCE_TRANSFER);
     475            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     476              :         } else {
     477            0 :             HCCL_ERROR("[HrtRaSendWrVerbs][RaWr]ra send async fail. return[%d], para: send_wrAddr[%p], "\
     478              :                 "opRspAddr[%p].", ret, wr, opRsp);
     479            0 :             return HCCL_E_ROCE_TRANSFER;
     480              :         }
     481            0 :     }
     482              : 
     483            0 :     return HCCL_SUCCESS;
     484              : }
     485              : 
     486            0 : HcclResult HrtRaRecvWrVerbs(QpHandle handle, struct RecvWrVerbs *wr)
     487              : {
     488            0 :     s32 ret = 0;
     489            0 :     auto startTime = std::chrono::steady_clock::now();
     490            0 :     auto timeout = std::chrono::seconds(GetExternalInputHcclLinkTimeOut());
     491              : 
     492            0 :     HCCL_DEBUG("ra recv wr verbs.");
     493              :     while (true) {
     494            0 :         ret = DlRaFunction::GetInstance().dlRaRecvWrVerbs(handle, wr);
     495            0 :         if (!ret) {
     496            0 :             break;
     497            0 :         } else if ((ret == SOCK_ENOENT) || (ret == ROCE_EAGAIN) ||
     498            0 :             (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE && ret == ROCE_ENOMEM)) {
     499            0 :             bool bTimeout = ((std::chrono::steady_clock::now() - startTime) >= timeout);
     500            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Recv][RaWr]errNo[0x%016llx] ra get recv async timeout[%d s]. "\
     501              :                 "return[%d], params: recv_wrAddr[%p]",
     502              :                 HCCL_ERROR_CODE(HCCL_E_ROCE_TRANSFER), timeout, ret, wr), HCCL_E_ROCE_TRANSFER);
     503            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     504              :         } else {
     505            0 :             HCCL_ERROR("[Recv][RaWr]ra recv async fail. return[%d], para: recv_wrAddr[%p].",
     506              :                 ret, wr);
     507            0 :             return HCCL_E_ROCE_TRANSFER;
     508              :         }
     509            0 :     }
     510              : 
     511            0 :     return HCCL_SUCCESS;
     512              : }
     513              : 
     514            0 : s32 hrtRaPollCq(QpHandle handle, bool is_send_cq, unsigned int num, void *wc)
     515              : {
     516            0 :     CHK_PTR_NULL(handle);
     517            0 :     CHK_PTR_NULL(wc);
     518              : 
     519            0 :     u32 ret = DlRaFunction::GetInstance().dlRaPollCq(handle, is_send_cq, num, wc);
     520            0 :     CHK_PRT_RET(static_cast<u32>(ret) > num, HCCL_ERROR("[hrtRaPollCq] PollCq fail. return[%d]", ret), ret);
     521            0 :     return ret;
     522              : }
     523              : 
     524            0 : s32 HrtRaPollTypicalCq(void* cqHandle, u32 num, void *wc)
     525              : {
     526            0 :     CHK_PTR_NULL(cqHandle);
     527            0 :     CHK_PTR_NULL(wc);
     528            0 :     u32 ret = DlRaFunction::GetInstance().dlRaPollTypicalCq(cqHandle, num, wc);
     529            0 :     CHK_PRT_RET(static_cast<u32>(ret) > num, HCCL_ERROR("[HrtRaPollTypicalCq] PollCq fail. return[%d]", ret), ret);
     530            0 :     return ret;
     531              : }
     532              : 
     533            0 : HcclResult hrtRaQpBatchModify(RdmaHandle rdmaHandle, QpHandle qpHandle[], unsigned int num, int expectStatus)
     534              : {
     535            0 :     if (DlRaFunction::GetInstance().dlRaQpBatchModify == nullptr) {
     536            0 :         HCCL_ERROR("[Send][RaQpBatchModify]driver package does not support ra_qp_batch_modify interface, "\
     537              :             "please change new one");
     538            0 :         return HCCL_E_NOT_SUPPORT;
     539              :     }
     540            0 :     s32 ret = DlRaFunction::GetInstance().dlRaQpBatchModify(rdmaHandle, &qpHandle[0], num, expectStatus);
     541            0 :     CHK_PRT_RET(ret != 0 || (qpHandle[0] == nullptr),
     542              :         HCCL_ERROR("[BatchModify][RaQp]errNo[0x%016llx] ra qp batch modify fail. "\
     543              :         "params: num[%u], expectStatus[%d]. return: ret[%d]", \
     544              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), num, expectStatus), HCCL_E_NETWORK);
     545            0 :     return HCCL_SUCCESS;
     546              : }
     547              : 
     548            0 : HcclResult HrtRaSendWrlist(QpHandle handle, struct SendWrlistData wr[], struct SendWrRsp opRsp[],
     549              :                            unsigned int sendNum, unsigned int *completeNum)
     550              : {
     551            0 :     if (DlRaFunction::GetInstance().dlRaSendWrlist == nullptr) {
     552            0 :         HCCL_ERROR("[Send][RaWrlist]driver package does not support hrtRaSendWrlist interface, "\
     553              :             "please change new one");
     554            0 :         return HCCL_E_NOT_SUPPORT;
     555              :     }
     556            0 :     s32 ret = 0;
     557            0 :     auto startTime = chrono::steady_clock::now();
     558            0 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
     559            0 :     u32 remainNum = sendNum;
     560            0 :     unsigned int completeNumLocal = 0;
     561            0 :     *completeNum = 0;
     562              :     while (true) {
     563            0 :         if (remainNum > sendNum) {
     564            0 :             HCCL_ERROR("[Send][RaWr]ra wr list send async fail. return[%d], remainNum[%u], "\
     565              :                 "sendNum[%u].", HCCL_E_ROCE_TRANSFER, remainNum, sendNum);
     566            0 :             return HCCL_E_ROCE_TRANSFER; // 非-2/-11场景错误,不轮询,直接退出
     567              :         }
     568            0 :         if (remainNum == 0) {
     569            0 :             break;
     570              :         }
     571            0 :         ret = DlRaFunction::GetInstance().dlRaSendWrlist(
     572            0 :             handle, wr + (sendNum - remainNum), opRsp + (sendNum - remainNum), remainNum, &completeNumLocal);
     573            0 :         *completeNum += completeNumLocal;
     574            0 :         if (!ret) {
     575            0 :             break;  // 成功跳出
     576            0 :         } else if ((ret == SOCK_ENOENT) || (ret == ROCE_EAGAIN) ||
     577            0 :             (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE && ret == ROCE_ENOMEM)) {
     578            0 :             remainNum -= completeNumLocal;
     579            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
     580            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Send][RaWrList]errNo[0x%016llx] ra send wrlsit async timeout[%d s]. "\
     581              :                 "return[%d], params: send_wrAddr[%p], opRspAddr[%p]",
     582              :                 HCCL_ERROR_CODE(HCCL_E_ROCE_TRANSFER), timeout,  ret, wr, opRsp), HCCL_E_ROCE_TRANSFER);
     583            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     584              :         } else {
     585            0 :             HCCL_ERROR("[Send][RaWr]ra wr list send async fail. return[%d], para: send_wrAddr[%p], dst_addr[%p],"\
     586              :                 " bufAddr[%p], bufLen[%u], opRspAddr[%p].", ret, wr, wr->dstAddr, wr->memList.addr, wr->memList.len, opRsp);
     587            0 :             return HCCL_E_ROCE_TRANSFER; // 非-2/-11场景错误,不轮询,直接退出
     588              :         }
     589            0 :     }
     590              : 
     591            0 :     return HCCL_SUCCESS;
     592              : }
     593              : 
     594            0 : HcclResult HrtRaSendWrlistExt(QpHandle handle, struct SendWrlistDataExt wr[], struct SendWrRsp opRsp[],
     595              :                               unsigned int sendNum, unsigned int *completeNum)
     596              : {
     597              :     DevType deviceType;
     598            0 :     CHK_RET(hrtGetDeviceType(deviceType));
     599            0 :     if (deviceType != DevType::DEV_TYPE_910B && deviceType != DevType::DEV_TYPE_910_93) {
     600            0 :         vector<SendWrlistData> wqeList(sendNum);
     601            0 :         struct SendWrlistData* data = wqeList.data();
     602            0 :         for (unsigned int i = 0; i < sendNum; i++) {
     603            0 :             s32 sret = memcpy_s(&data[i], sizeof(SendWrlistData), &wr[i], sizeof(SendWrlistData));
     604            0 :             CHK_PRT_RET(sret != EOK, HCCL_ERROR("[WqeList][Add]add wqe list, memcpy wqe failed. errorno[%d]", sret),
     605              :                 HCCL_E_MEMORY);
     606              :         }
     607            0 :         CHK_RET(HrtRaSendWrlist(handle, data, opRsp, sendNum, completeNum));
     608            0 :     } else {
     609              :         static bool flag = false;
     610            0 :         if (UNLIKELY(flag == false)) {
     611            0 :             if (UNLIKELY(DlRaFunction::GetInstance().dlRaSendWrlistExt == nullptr)) {
     612            0 :                 HCCL_ERROR("[Send][RaWrlistExt]driver package does not support hrtRaSendWrlist interface, "\
     613              :                     "please change new one");
     614            0 :                 return HCCL_E_NOT_SUPPORT;
     615              :             }
     616            0 :             flag = true;
     617              :         }
     618              : 
     619            0 :         s32 ret = 0;
     620            0 :         auto startTime = chrono::steady_clock::now();
     621            0 :         auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
     622            0 :         u32 remainNum = sendNum;
     623            0 :         unsigned int completeNumLocal = 0;
     624            0 :         *completeNum = 0;
     625              :         while (true) {
     626            0 :             if (remainNum > sendNum) {
     627            0 :                 HCCL_ERROR("[Send][RaWr]ra wr list send async fail. return[%d], remainNum[%u], "\
     628              :                     "sendNum[%u].", HCCL_E_ROCE_TRANSFER, remainNum, sendNum);
     629            0 :                 return HCCL_E_ROCE_TRANSFER;
     630              :             }
     631            0 :             if (remainNum == 0) {
     632            0 :                 break;
     633              :             }
     634            0 :             ret = DlRaFunction::GetInstance().dlRaSendWrlistExt(
     635            0 :                 handle, wr + (sendNum - remainNum), opRsp + (sendNum - remainNum), remainNum, &completeNumLocal);
     636            0 :             *completeNum += completeNumLocal;
     637            0 :             if (!ret) {
     638            0 :                 break;  // 成功跳出
     639            0 :             } else if ((ret == SOCK_ENOENT) || (ret == ROCE_EAGAIN) ||
     640            0 :                 (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE && ret == ROCE_ENOMEM)) {
     641            0 :                 remainNum -= completeNumLocal;
     642            0 :                 bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
     643            0 :                 CHK_PRT_RET(bTimeout, HCCL_ERROR("[Send][RaWr]errNo[0x%016llx] ra wrlist send async timeout[%d s]. "\
     644              :                     "return[%d], params: send_wrAddr[%p], opRspAddr[%p]",
     645              :                     HCCL_ERROR_CODE(HCCL_E_ROCE_TRANSFER), timeout,  ret, wr, opRsp), HCCL_E_ROCE_TRANSFER);
     646            0 :                 SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     647              :             } else {
     648            0 :                 HCCL_ERROR("[Send][RaWr]ra wrlist send async fail. return[%d], para: send_wrAddr[%p], "\
     649              :                     "opRspAddr[%p].", ret, wr, opRsp);
     650            0 :                 return HCCL_E_ROCE_TRANSFER; // 非-2/-11场景错误,不轮询,直接退出
     651              :             }
     652            0 :         }
     653              :     }
     654              : 
     655            0 :     return HCCL_SUCCESS;
     656              : }
     657              : 
     658            0 : HcclResult HrtRaSendNormalWrlist(QpHandle handle, struct WrInfo wr[], struct SendWrRsp opRsp[],
     659              :                            unsigned int sendNum, unsigned int *completeNum)
     660              : {
     661            0 :     if (UNLIKELY(DlRaFunction::GetInstance().dlRaSendWrlist == nullptr)) {
     662            0 :         HCCL_ERROR("[Send][RaWrlist]driver package does not support hrtRaSendWrlist interface, "\
     663              :             "please change new one");
     664            0 :         return HCCL_E_NOT_SUPPORT;
     665              :     }
     666            0 :     s32 ret = 0;
     667            0 :     auto startTime = chrono::steady_clock::now();
     668            0 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
     669            0 :     u32 remainNum = sendNum;
     670            0 :     unsigned int completeNumLocal = 0;
     671            0 :     *completeNum = 0;
     672              :     while (true) {
     673            0 :         if (UNLIKELY(remainNum > sendNum)) {
     674            0 :             HCCL_ERROR("[Send][RaWr]ra wr list send async fail. return[%d], remainNum[%u], "\
     675              :                 "sendNum[%u].", HCCL_E_ROCE_TRANSFER, remainNum, sendNum);
     676            0 :             return HCCL_E_ROCE_TRANSFER; // 非-2/-11场景错误,不轮询,直接退出
     677              :         }
     678            0 :         if (remainNum == 0) {
     679            0 :             break;
     680              :         }
     681            0 :         ret = DlRaFunction::GetInstance().dlRaSendNormalWrlist(
     682            0 :             handle, wr + (sendNum - remainNum), opRsp + (sendNum - remainNum), remainNum, &completeNumLocal);
     683            0 :         *completeNum += completeNumLocal;
     684            0 :         if (!ret) {
     685            0 :             break;  // 成功跳出
     686              :         } 
     687            0 :         if ((ret == ROCE_ENOENT) || (ret == ROCE_EAGAIN) || ret == ROCE_ENOMEM) {
     688            0 :             remainNum -= completeNumLocal;
     689            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);  
     690            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Send][HrtRaSendNormalWrlist]errNo[0x%016llx] ra send wrlsit async timeout[%d s]. "\
     691              :                 "return[%d], params: send_wrAddr[%p], opRspAddr[%p]",
     692              :                 HCCL_ERROR_CODE(HCCL_E_ROCE_TRANSFER), timeout,  ret, wr, opRsp), HCCL_E_ROCE_TRANSFER);
     693            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     694            0 :         } else {
     695            0 :             HCCL_ERROR("[Send][RaWr]ra wr list send async fail. return[%d], para: send_wrAddr[%p], dst_addr[%p],"\
     696              :                 " bufAddr[%p], bufLen[%u], opRspAddr[%p].", ret, wr, wr->dstAddr, wr->memList.addr, wr->memList.len, opRsp);
     697            0 :             return HCCL_E_ROCE_TRANSFER; // 非-2/-11场景错误,不轮询,直接退出
     698              :         }
     699            0 :     }
     700              :  
     701            0 :     return HCCL_SUCCESS;
     702              : }
     703              :  
     704              : 
     705            0 : HcclResult HrtRaGetNotifyBaseAddr(RdmaHandle handle, u64 *va, u64 *size, std::function<bool()> needStop)
     706              : {
     707            0 :     s32 ret = 0;
     708            0 :     auto startTime = chrono::steady_clock::now();
     709            0 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
     710              :     while (true) {
     711            0 :         CHK_PRT_RET(needStop(), HCCL_ERROR("Terminating operation due to external request"), HCCL_E_INTERNAL);
     712              : 
     713            0 :         ret = DlRaFunction::GetInstance().dlRaGetNotifyBaseAddr(handle, va, size);
     714            0 :         if (!ret) {
     715            0 :             break;  // 成功跳出
     716            0 :         } else if (ret == ROCE_EAGAIN) {
     717            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
     718            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Get][RaNotifyBaseAddr]errNo[0x%016llx] ra get notify base addr "\
     719              :                 "timeout[%d s]. return[%d], params: va[0x%llx], size[%llu Byte]",
     720              :                 HCCL_ERROR_CODE(HCCL_E_NETWORK), timeout, ret, *va, *size), HCCL_E_NETWORK);
     721            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     722              :         } else {
     723            0 :             HCCL_ERROR("[Get][RaNotifyBaseAddr]errNo[0x%016llx] ra get notify base addr fail. return[%d], params: "\
     724              :                 "va[0x%llx], size[%llu]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret, *va, *size);
     725            0 :             return HCCL_E_NETWORK;  // 非ra限速场景错误,不轮询,直接退出
     726              :         }
     727            0 :     }
     728            0 :     return HCCL_SUCCESS;
     729              : }
     730              : 
     731            0 : HcclResult HrtRaGetNotifyMrInfo(u32 phyId, RdmaHandle handle, struct MrInfoT *mrInfo)
     732              : {
     733            0 :     s32 ret = 0;
     734            0 :     u32 getNotifyBaVersion = 0;
     735            0 :     HcclResult vRet = hrtRaGetInterfaceVersion(phyId, GET_NOTIFY_BA, &getNotifyBaVersion);
     736            0 :     if (vRet != HCCL_SUCCESS || getNotifyBaVersion < GET_NOTIFY_BA_VERSION) {
     737            0 :         HCCL_ERROR("this package does not support HrtRaGetNotifyMrInfo for device, please change new package");
     738            0 :         return HCCL_E_NOT_SUPPORT;
     739              :     }
     740            0 :     auto startTime = chrono::steady_clock::now();
     741            0 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
     742              :     while (true) {
     743            0 :         ret = DlRaFunction::GetInstance().dlRaGetNotifyMrInfo(handle, mrInfo);
     744            0 :         if (!ret) {
     745            0 :             break;  // 成功跳出
     746            0 :         } else if (ret == ROCE_EAGAIN) {
     747            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
     748            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Get][RaGetNotifyMrInfo]errNo[0x%016llx] ra get notify mr info "\
     749              :                 "timeout[%d s]. return[%d]",
     750              :                 HCCL_ERROR_CODE(HCCL_E_NETWORK), timeout, ret),
     751              :                 HCCL_E_NETWORK);
     752            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     753              :         } else {
     754            0 :             HCCL_ERROR("[Get][RaGetNotifyMrInfo]errNo[0x%016llx] ra get notify mr info fail. return[%d]",
     755              :                 HCCL_ERROR_CODE(HCCL_E_NETWORK), ret);
     756            0 :             return HCCL_E_NETWORK;
     757              :         }
     758            0 :     }
     759            0 :     return HCCL_SUCCESS;
     760              : }
     761              : 
     762          228 : HcclResult HrtRaInit(struct RaInitConfig *config)
     763              : {
     764          228 :     CHK_RET(DlRaFunction::GetInstance().DlRaFunctionInit());
     765          228 :     s32 ret = 0;
     766          228 :     auto startTime = chrono::steady_clock::now();
     767          228 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
     768              :     while (true) {
     769          228 :         ret = DlRaFunction::GetInstance().dlRaInit(config);
     770          228 :         if (!ret) {
     771          228 :             break;  // 成功跳出
     772            0 :         } else if (ret == HCCP_EAGAIN) {
     773            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
     774            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Init][Ra]errNo[0x%016llx] ra init timeout[%lld s]. return[%d], "\
     775              :                 "phyId[%u], nicPosition[%u], hdcType[%d]", HCCL_ERROR_CODE(HCCL_E_TIMEOUT), timeout, ret,\
     776              :                 config->phyId, config->nicPosition, config->hdcType), HCCL_E_TIMEOUT);
     777            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     778              :         } else {
     779            0 :             if (ret == REPEAT_RAINIT_ERROR_CODE) {
     780            0 :                 HCCL_RUN_WARNING("ra init repeatedly, return. phyId[%u] nicPosition[%u] hdcType[%d]",
     781              :                     config->phyId, config->nicPosition, config->hdcType);
     782            0 :                 return HCCL_E_PARA;
     783              :             }
     784            0 :             HCCL_ERROR("[Init][Ra]errNo[0x%016llx] ra init fail ret[%d] phyId[%u] nicPosition[%u] hdcType[%d]", \
     785              :                 HCCL_ERROR_CODE(HCCL_E_NETWORK), ret, config->phyId, config->nicPosition, config->hdcType);
     786            0 :             return HCCL_E_NETWORK;  // 非ra限速场景错误,不轮询。直接退出
     787              :         }
     788            0 :     }
     789          228 :     HCCL_INFO("init ra success.");
     790          228 :     return HCCL_SUCCESS;
     791              : }
     792              : 
     793            0 : HcclResult HrtRaRdmaInit(int mode, u32 notifyType, struct rdev rdevInfo, RdmaHandle &rdmaHandle)
     794              : {
     795            0 :     s32 ret = DlRaFunction::GetInstance().dlRaRdmaInit(mode, notifyType, rdevInfo, &rdmaHandle);
     796            0 :     RPT_INPUT_ERR(ret == HCCP_ELINKDOWN,
     797              :         "EI0009",
     798              :         vector<string>({"device_id", "reason"}),
     799              :         vector<string>({std::to_string(rdevInfo.phyId), "The network port is down"})
     800              :     );
     801              : #ifndef HCCD
     802            0 :     vector<HcclIpAddress> deviceIp;
     803            0 :     CHK_RET(hrtRaGetDeviceIP(rdevInfo.phyId, deviceIp));
     804            0 :     CHK_PRT_RET(deviceIp.size() < 1,
     805              :         HCCL_ERROR("Get ip address failed, phyId[%u]", rdevInfo.phyId), HCCL_E_INTERNAL);
     806            0 :     RPT_INPUT_ERR(ret == HCCP_EINVALIDIPS,
     807              :         "EI0014",
     808              :         vector<string>({ "value", "variable" ,"expect" }),
     809              :         vector<string>({ string(HcclIpAddress(rdevInfo.localIp.addr.s_addr).GetReadableIP()),
     810              :         "IP", string(deviceIp[0].GetReadableIP()) })
     811              :     );
     812              : #endif
     813            0 :     CHK_PRT_CONT(ret == HCCP_EINVALIDIPS, 
     814              :         HCCL_ERROR("[%s][%s]the IP address in the ranktable is inconsistent with the IP address of the network adapter.",
     815              :         LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RANKTABLE_CHECK.c_str()));
     816              : 
     817            0 :     CHK_PRT_RET(ret == HCCP_ELINKDOWN , HCCL_RUN_WARNING("ra rdma init need retry."), HCCL_E_AGAIN);
     818            0 :     CHK_PRT_RET(ret != 0 || (rdmaHandle == nullptr), HCCL_ERROR("[Init][RaRdma]errNo[0x%016llx] rdma init fail. "\
     819              :         "params: mode[%d]. notifyType[%u] phyId[%u] family[%d] s_addr[%u] ret[%d]", HCCL_ERROR_CODE(HCCL_E_INTERNAL),\
     820              :         mode, notifyType, rdevInfo.phyId, rdevInfo.family, rdevInfo.localIp.addr.s_addr, ret), HCCL_E_INTERNAL);
     821            0 :     return HCCL_SUCCESS;
     822            0 : }
     823              : 
     824           34 : HcclResult HrtRaRdmaInitWithAttr(struct RdevInitInfo &init_info, const struct rdev &rdevInfo, RdmaHandle &rdmaHandle)
     825              : {
     826           34 :     HCCL_INFO("mode:[%d], NotifyTypeT:[%u], enabled910aLite:[%d], disabledLiteThread:[%d], enabled2mbLite:[%d]",
     827              :         init_info.mode, init_info.notifyType, init_info.enabled910aLite, init_info.disabledLiteThread,
     828              :         init_info.enabled2mbLite);
     829              : 
     830           34 :     s32 ret = DlRaFunction::GetInstance().dlRaRdmaInitWithAttr(init_info, rdevInfo, &rdmaHandle);
     831           34 :     RPT_INPUT_ERR(ret == HCCP_ELINKDOWN,
     832              :         "EI0009",
     833              :         vector<string>({"device_id", "reason"}),
     834              :         vector<string>({std::to_string(rdevInfo.phyId), "The network port is down"})
     835              :     );
     836           34 :     CHK_PRT_CONT(ret == HCCP_ELINKDOWN, 
     837              :         HCCL_ERROR("[%s][%s]rdma init failed because RoCE link status is down, please check the network adapter configuration.",
     838              :         LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RESOURCE.c_str()));
     839              : #ifndef HCCD
     840           34 :     if (init_info.mode != NETWORK_PEER_ONLINE) {
     841           34 :         vector<HcclIpAddress> deviceIp;
     842           34 :         CHK_RET(hrtRaGetDeviceIP(rdevInfo.phyId, deviceIp));
     843           34 :         CHK_PRT_RET(deviceIp.size() < 1,
     844              :             HCCL_ERROR("Get ip address failed, phyId[%u]", rdevInfo.phyId), HCCL_E_INTERNAL);
     845           34 :         RPT_INPUT_ERR(ret == HCCP_EINVALIDIPS,
     846              :             "EI0014",
     847              :             vector<string>({ "value", "variable" ,"expect" }),
     848              :             vector<string>({ string(HcclIpAddress(rdevInfo.localIp.addr.s_addr).GetReadableIP()), "IP", string(deviceIp[0].GetReadableIP()) })
     849              :         );
     850           34 :     }
     851              : #endif
     852           34 :     CHK_PRT_CONT(ret == HCCP_EINVALIDIPS, 
     853              :         HCCL_ERROR("[%s][%s]the IP address in the ranktable is inconsistent with the IP address of the network adapter.",
     854              :         LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RANKTABLE_CHECK.c_str()));
     855              : 
     856           34 :     CHK_PRT_RET(ret != 0 || (rdmaHandle == nullptr), HCCL_ERROR("[Init][RaRdma]errNo[0x%016llx] rdma init fail. "\
     857              :         "return: ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
     858           34 :     return HCCL_SUCCESS;
     859            0 : }
     860              : 
     861            1 : HcclResult HrtRdmaInitWithBackupAttr(struct RdevInitInfo &init_info, struct rdev &rdevInfo,
     862              :     struct rdev &backupRdevInfo, RdmaHandle &rdmaHandle)
     863              : {
     864            1 :     HCCL_INFO("[%s]mode:[%d], NotifyTypeT:[%u], enabled910aLite:[%d], disabledLiteThread:[%d], "
     865              :         "enabled2mbLite:[%d]", __func__, init_info.mode, init_info.notifyType, init_info.enabled910aLite,
     866              :         init_info.disabledLiteThread, init_info.enabled2mbLite);
     867              : 
     868              :     // 获取版本号查看是否兼容
     869            1 :     u32 rdmainitBackupVersion = 0;
     870            1 :     HcclResult vRet = hrtRaGetInterfaceVersion(rdevInfo.phyId, RDEV_INIT_WITH_BACKUP, &rdmainitBackupVersion);
     871            1 :     if (vRet != HCCL_SUCCESS || rdmainitBackupVersion < RDEV_INIT_WITH_BACKUP_SUP_VER) {
     872            1 :         HCCL_WARNING("this package does not support HrtRdmaInitWithBackupAttr, please change new package.");
     873            1 :         return HCCL_E_NOT_SUPPORT;
     874              :     }
     875              : 
     876            0 :     s32 ret = DlRaFunction::GetInstance().dlRaRdmaInitWithBackupAttr(&init_info, &rdevInfo, &backupRdevInfo, &rdmaHandle);
     877            0 :     RPT_INPUT_ERR(ret == HCCP_ELINKDOWN,
     878              :         "EI0009",
     879              :         vector<string>({"device_id", "reason"}),
     880              :         vector<string>({std::to_string(rdevInfo.phyId), "The network port is down"})
     881              :     );
     882            0 :     CHK_PRT_CONT(ret == HCCP_ELINKDOWN, 
     883              :         HCCL_ERROR("[%s][%s]rdma init failed because RoCE link status is down, please check the network adapter configuration.",
     884              :         LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RESOURCE.c_str()));
     885              : #ifndef HCCD
     886            0 :     vector<HcclIpAddress> deviceIp;
     887            0 :     CHK_RET(hrtRaGetDeviceIP(rdevInfo.phyId, deviceIp));
     888            0 :     CHK_PRT_RET(deviceIp.size() < 1,
     889              :         HCCL_ERROR("Get ip address failed, phyId[%u]", rdevInfo.phyId), HCCL_E_INTERNAL);
     890            0 :     RPT_INPUT_ERR(ret == HCCP_EINVALIDIPS,
     891              :         "EI0014",
     892              :         vector<string>({ "value", "variable" ,"expect" }),
     893              :         vector<string>({ string(HcclIpAddress(rdevInfo.localIp.addr.s_addr).GetReadableIP()), "IP", string(deviceIp[0].GetReadableIP()) })
     894              :     );
     895              : #endif
     896            0 :     CHK_PRT_CONT(ret == HCCP_EINVALIDIPS, 
     897              :         HCCL_ERROR("[%s][%s]the IP address in the ranktable is inconsistent with the IP address of the network adapter.",
     898              :         LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RANKTABLE_CHECK.c_str()));
     899              : 
     900            0 :     CHK_PRT_RET(ret != 0 || (rdmaHandle == nullptr), HCCL_ERROR("[Init][RaRdma]errNo[0x%016llx] rdma init fail. "\
     901              :         "return: ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
     902            0 :     return HCCL_SUCCESS;
     903            0 : }
     904              : 
     905            0 : HcclResult HrtRaRdmaInitRef(int mode, u32 notifyType, const struct rdev &rdevInfo, RdmaHandle &rdmaHandle)
     906              : {
     907            0 :     lock_guard<mutex> lock(g_rdmaHandleInfo.handleMutex);
     908            0 :     if (g_rdmaHandleInfo.handleMap.find(rdevInfo.localIp.addr.s_addr) !=
     909            0 :         g_rdmaHandleInfo.handleMap.end()) {
     910            0 :         HCCL_DEBUG("The rdmaHandle[%p] corresponding to the ipAddr[%u] has been initialized.",
     911              :             rdmaHandle, rdevInfo.localIp.addr.s_addr);
     912              : 
     913            0 :         rdmaHandle = g_rdmaHandleInfo.handleMap[rdevInfo.localIp.addr.s_addr];
     914            0 :         g_rdmaHandleInfo.handleRef[rdmaHandle]++;
     915            0 :         return HCCL_SUCCESS;
     916              :     }
     917              : 
     918            0 :     CHK_RET(HrtRaRdmaInit(mode, notifyType, rdevInfo, rdmaHandle));
     919            0 :     g_rdmaHandleInfo.handleMap[rdevInfo.localIp.addr.s_addr] = rdmaHandle;
     920            0 :     g_rdmaHandleInfo.handleRef[rdmaHandle] = FIRST_HANDLE_REF;
     921            0 :     return HCCL_SUCCESS;
     922            0 : }
     923              : 
     924            0 : HcclResult HrtRaRdmaGetHandle(unsigned int phyId, RdmaHandle &rdmaHandle)
     925              : {
     926            0 :     CHK_SMART_PTR_NULL(DlRaFunction::GetInstance().dlRaRdmaGetHandle);
     927            0 :     s32 ret = DlRaFunction::GetInstance().dlRaRdmaGetHandle(phyId, &rdmaHandle);
     928              : 
     929            0 :     CHK_PRT_RET(ret != 0 || (rdmaHandle == nullptr), HCCL_ERROR("[Get][RdmaHandle]errNo[0x%016llx] "\
     930              :         "get rdma handle fail. return: ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
     931              : 
     932            0 :     HCCL_DEBUG("get rdma handle success.");
     933            0 :     return HCCL_SUCCESS;
     934              : }
     935              : 
     936           35 : HcclResult HrtGetRdmaLiteStatus(RdmaHandle rdmaHandle, int *supportLite)
     937              : {
     938           35 :     if (rdmaHandle == nullptr) {
     939            0 :         HCCL_ERROR("[Get][RdmaLiteStatus]rdmaHandle is nullptr, please input the correct rdmaHandle");
     940            0 :         return HCCL_E_PTR;
     941              :     }
     942           35 :     s32 ret = DlRaFunction::GetInstance().dlRaGetRdmaLiteStatus(rdmaHandle, supportLite);
     943           35 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Get][RdmaLiteStatus]errNo[0x%016llx] get rdma lite status fail. "\
     944              :         "return: ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
     945              : 
     946           35 :     return HCCL_SUCCESS;
     947              : }
     948              : 
     949          231 : HcclResult HrtRaDeInit(struct RaInitConfig *config)
     950              : {
     951          231 :     s32 ret = 0;
     952          231 :     auto startTime = chrono::steady_clock::now();
     953          231 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
     954              :     while (true) {
     955          231 :         ret = DlRaFunction::GetInstance().dlRaDeInit(config);
     956          231 :         if (!ret) {
     957          231 :             break;  // 成功跳出
     958            0 :         } else if (ret == HCCP_EAGAIN) {
     959            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
     960            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[DeInit][Ra]errNo[0x%016llx] ra deinit timeout[%lld s]. return[%d], "\
     961              :                 "phyId[%u] nicPosition[%u] hdcType[%d]", HCCL_ERROR_CODE(HCCL_E_TIMEOUT), timeout, ret,\
     962              :                 config->phyId, config->nicPosition, config->hdcType), HCCL_E_TIMEOUT);
     963            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     964              :         } else {
     965            0 :             HCCL_ERROR("[DeInit][Ra]errNo[0x%016llx] ra deinit fail. ret[%d] phyId[%u] nicPosition[%u] hdcType[%d]", \
     966              :                 HCCL_ERROR_CODE(HCCL_E_NETWORK), ret, config->phyId, config->nicPosition, config->hdcType);
     967            0 :             return HCCL_E_NETWORK;  // 非ra限速场景错误,不轮询。直接退出
     968              :         }
     969            0 :     }
     970          231 :     return HCCL_SUCCESS;
     971              : }
     972              : 
     973           36 : HcclResult HrtRaRdmaDeInit(RdmaHandle &rdmaHandle, u32 notifyType)
     974              : {
     975           36 :     CHK_PTR_NULL(rdmaHandle);
     976           36 :     s32 ret = DlRaFunction::GetInstance().dlRaRdmaDeInit(rdmaHandle, notifyType);
     977           36 :     if (ret != HCCL_SUCCESS) {
     978            2 :         HCCL_ERROR("[DeInit][RaRdma] rdmaHandle[%p]", rdmaHandle);
     979            2 :         rdmaHandle = nullptr;
     980              :     }
     981           36 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[DeInit][RaRdma]errNo[0x%016llx] rt rdev deinit fail. return[%d]."\
     982              :         "notifyType[%u]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret, notifyType), HCCL_E_NETWORK);
     983           34 :     return HCCL_SUCCESS;
     984              : }
     985              : 
     986            0 : HcclResult HrtRaRdmaDeInitRef(RdmaHandle &rdmaHandle, u32 notifyType)
     987              : {
     988            0 :     lock_guard<mutex> lock(g_rdmaHandleInfo.handleMutex);
     989            0 :     g_rdmaHandleInfo.handleRef[rdmaHandle]--;
     990            0 :     if (g_rdmaHandleInfo.handleRef[rdmaHandle] == 0) {
     991            0 :         HCCL_DEBUG("This rdmaHandle[%p] is about to be deinitialized.", rdmaHandle);
     992            0 :         CHK_RET(HrtRaRdmaDeInit(rdmaHandle, notifyType));
     993            0 :         auto it = g_rdmaHandleInfo.handleMap.begin();
     994            0 :         while (it != g_rdmaHandleInfo.handleMap.end()) {
     995            0 :             if (it->second == rdmaHandle) {
     996            0 :                 it = g_rdmaHandleInfo.handleMap.erase(it);
     997              :             } else {
     998            0 :                 ++it;
     999              :             }
    1000              :         }
    1001              : 
    1002            0 :         g_rdmaHandleInfo.handleRef.erase(rdmaHandle);
    1003              :     }
    1004              : 
    1005            0 :     return HCCL_SUCCESS;
    1006            0 : }
    1007              : 
    1008           51 : HcclResult hrtRaSocketInit(int mode, struct rdev rdevInfo, SocketHandle &socketHandle)
    1009              : {
    1010           51 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketInit(mode, rdevInfo, &socketHandle);
    1011              : 
    1012           51 :     CHK_PRT_RET(ret != 0 || (socketHandle == nullptr), HCCL_ERROR("[Init][RaSock]errNo[0x%016llx] "\
    1013              :         "ra socket init fail. params: mode[%d]. return: ret[%d] phyId[%u] family[%d] s_addr[%u]",
    1014              :         HCCL_ERROR_CODE(HCCL_E_INTERNAL), mode, ret, rdevInfo.phyId, rdevInfo.family, rdevInfo.localIp.addr.s_addr),
    1015              :         HCCL_E_INTERNAL);
    1016              : 
    1017           51 :     HCCL_INFO("socket init success, ip[%u] device id[%u], socketHandle[%p]",
    1018              :         rdevInfo.localIp.addr.s_addr, rdevInfo.phyId, socketHandle);
    1019           51 :     return HCCL_SUCCESS;
    1020              : }
    1021              : 
    1022           22 : HcclResult hrtRaSocketInitV1(int mode, struct SocketInitInfoT socket_init, SocketHandle &socketHandle)
    1023              : {
    1024           22 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketInitV1(mode, socket_init, &socketHandle);
    1025              : 
    1026           22 :     CHK_PRT_RET(ret != 0 || (socketHandle == nullptr),
    1027              :         HCCL_ERROR("[Init][RaSockV1]errNo[0x%016llx] ra socket v1 init fail. params: mode[%d]. return: ret[%d]",
    1028              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), mode, ret),
    1029              :         HCCL_E_NETWORK);
    1030           22 :     HCCL_INFO("socket init v1 success, socketHandle[%p]", socketHandle);
    1031           22 :     return HCCL_SUCCESS;
    1032              : }
    1033              : 
    1034            0 : HcclResult hrtRaSocketInitRef(int mode, const struct rdev &rdevInfo, SocketHandle &socketHandle)
    1035              : {
    1036            0 :     lock_guard<mutex> lock(g_socketHandleInfo.handleMutex);
    1037            0 :     if (g_socketHandleInfo.handleMap.find(rdevInfo.localIp.addr.s_addr) !=
    1038            0 :         g_socketHandleInfo.handleMap.end()) {
    1039            0 :         HCCL_DEBUG("The socketHandle[%p] corresponding to the ipAddr[%u] has been initialized.",
    1040              :             socketHandle, rdevInfo.localIp.addr.s_addr);
    1041              : 
    1042            0 :         socketHandle = g_socketHandleInfo.handleMap[rdevInfo.localIp.addr.s_addr];
    1043            0 :         g_socketHandleInfo.handleRef[socketHandle]++;
    1044            0 :         return HCCL_SUCCESS;
    1045              :     }
    1046              : 
    1047            0 :     CHK_RET(hrtRaSocketInit(mode, rdevInfo, socketHandle));
    1048            0 :     g_socketHandleInfo.handleMap[rdevInfo.localIp.addr.s_addr] = socketHandle;
    1049            0 :     g_socketHandleInfo.handleRef[socketHandle] = FIRST_HANDLE_REF;
    1050            0 :     return HCCL_SUCCESS;
    1051            0 : }
    1052              : 
    1053           71 : HcclResult hrtRaSocketDeInit(SocketHandle &socketHandle)
    1054              : {
    1055           71 :     CHK_PTR_NULL(socketHandle);
    1056           71 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketDeInit(socketHandle);
    1057           71 :     if (ret != HCCL_SUCCESS) {
    1058            0 :         HCCL_ERROR("[DeInit][RaSocket] socketHandle[%p]", socketHandle);
    1059            0 :         socketHandle = nullptr;
    1060              :     }
    1061           71 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[DeInit][RaSocket]errNo[0x%016llx] rt socket deinit fail. return[%d]",\
    1062              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
    1063           71 :     return HCCL_SUCCESS;
    1064              : }
    1065              : 
    1066            0 : HcclResult hrtRaSocketDeInitRef(SocketHandle &socketHandle)
    1067              : {
    1068            0 :     lock_guard<mutex> lock(g_socketHandleInfo.handleMutex);
    1069            0 :     g_socketHandleInfo.handleRef[socketHandle]--;
    1070            0 :     if (g_socketHandleInfo.handleRef[socketHandle] == 0) {
    1071            0 :         HCCL_DEBUG("This socketHandle[%p] is about to be deinitialized.", socketHandle);
    1072            0 :         CHK_RET(hrtRaSocketDeInit(socketHandle));
    1073            0 :         auto it = g_socketHandleInfo.handleMap.begin();
    1074            0 :         while (it != g_socketHandleInfo.handleMap.end()) {
    1075            0 :             if (it->second == socketHandle) {
    1076            0 :                 it = g_socketHandleInfo.handleMap.erase(it);
    1077              :             } else {
    1078            0 :                 ++it;
    1079              :             }
    1080              :         }
    1081              : 
    1082            0 :         g_socketHandleInfo.handleRef.erase(socketHandle);
    1083              :     }
    1084              : 
    1085            0 :     return HCCL_SUCCESS;
    1086            0 : }
    1087              : 
    1088           41 : HcclResult hrtRaSocketNonBlockListenStart(struct SocketListenInfoT conn[], u32 num)
    1089              : {
    1090           41 :     CheckConnPort(conn, num);
    1091           41 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketListenStart(conn, num);
    1092           41 :     if (ret == SOCK_EAGAIN) {
    1093            0 :         return HCCL_E_AGAIN;
    1094           41 :     } else if (ret == SOCK_EADDRINUSE) {
    1095            0 :         HCCL_INFO("ra socket listen could not start, due to the port[%u] has already been bound. "
    1096              :             "please try another port or check the port status", (num > 0 ? conn[0].port : HCCL_INVALID_PORT));
    1097            0 :         return HCCL_E_UNAVAIL;
    1098           41 :     } else if (ret != HCCL_SUCCESS) {
    1099            0 :         HCCL_ERROR("errNo[0x%016llx] ra socket listen start fail. return[%d], num[%u]",
    1100              :             HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret, num);
    1101            0 :         for (u32 idx = 0; idx < num; idx++) {
    1102            0 :             HCCL_ERROR("cur idx[%u] port[%u] phase[%u] err[%u]",
    1103              :                 idx, conn[idx].port, conn[idx].phase, conn[idx].err);
    1104              :         }
    1105            0 :         return HCCL_E_TCP_CONNECT;
    1106              :     }
    1107              : 
    1108           41 :     return HCCL_SUCCESS;
    1109              : }
    1110              : 
    1111            0 : HcclResult hrtRaSocketAcceptCreditAdd(struct SocketListenInfoT conn[], u32 num, u32 creditLimit)
    1112              : {
    1113            0 :     s32 ret = 0;
    1114            0 :     ret = DlRaFunction::GetInstance().dlRaSocketAcceptCreditAdd(conn, num, creditLimit);
    1115            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("socket accept credit add failed, ret[%d], port[%u], creditLimit[%d]",
    1116              :         ret, conn[0].port, creditLimit), HCCL_E_TCP_CONNECT);
    1117            0 :     return HCCL_SUCCESS;
    1118              : }
    1119              : 
    1120           41 : HcclResult hrtRaSocketListenStart(struct SocketListenInfoT conn[], u32 num)
    1121              : {
    1122           41 :     s32 ret = 0;
    1123           41 :     auto startTime = chrono::steady_clock::now();
    1124           41 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
    1125           41 :     CHK_PRT_RET(num == 0, HCCL_ERROR("[ListenStart][RaSocket] num is zero"), HCCL_E_PARA);
    1126              :     while (true) {
    1127           41 :         ret = hrtRaSocketNonBlockListenStart(conn, num);
    1128           41 :         if (ret == 0) {
    1129           41 :             break;  // 成功跳出
    1130            0 :         } else if (ret == HCCL_E_AGAIN) {
    1131            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
    1132            0 :             RPT_CALL_ERR(bTimeout, "ra socket listen failed. timeout[%d s], return[%d], num[%u]",
    1133              :                 GetExternalInputHcclLinkTimeOut(), ret, num);
    1134              : 
    1135            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[ListenStart][RaSocket]errNo[0x%016llx]  ra socket listen start "
    1136              :                 "timeout[%d s]. return[%d]", HCCL_ERROR_CODE(HCCL_E_TIMEOUT),
    1137              :                 GetExternalInputHcclLinkTimeOut(), ret), HCCL_E_TIMEOUT);
    1138            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
    1139            0 :         } else if (ret == HCCL_E_UNAVAIL) {
    1140            0 :             return HCCL_E_UNAVAIL;
    1141              :         } else {
    1142            0 :             HCCL_ERROR("[hrtRaSocketListenStart]ra socket listen start fail, ret[%d]", ret);
    1143            0 :             return HCCL_E_TCP_CONNECT;
    1144              :         }
    1145            0 :     }
    1146           41 :     return HCCL_SUCCESS;
    1147              : }
    1148              : 
    1149           39 : HcclResult hrtRaSocketListenStop(struct SocketListenInfoT conn[], u32 num)
    1150              : {
    1151           39 :     s32 ret = 0;
    1152           39 :     auto startTime = chrono::steady_clock::now();
    1153           39 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
    1154           39 :     CheckConnPort(conn, num);
    1155              :     while (true) {
    1156           39 :         ret = DlRaFunction::GetInstance().dlRaSocketListenStop(conn, num);
    1157           39 :         if (!ret || ret == SOCK_ENODEV) {
    1158              :             break;  // 成功跳出
    1159            0 :         } else if (ret == SOCK_EAGAIN) {
    1160            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
    1161            0 :             if (!bTimeout) {
    1162            0 :                 SaluSleep(ONE_MILLISECOND_OF_USLEEP);
    1163            0 :                 continue;
    1164              :             }
    1165            0 :             HCCL_ERROR("[ListenStop][RaSocket]errNo[0x%016llx] ra socket listen stop fail timeout[%d]s, ret[%d], num[%u]",
    1166              :                 HCCL_ERROR_CODE(HCCL_E_TIMEOUT), timeout, ret, num);
    1167            0 :             for (u32 idx = 0; idx < num; idx++) {
    1168            0 :                 HCCL_ERROR("cur idx[%u] port[%u] phase[%u] err[%u]", idx, conn[idx].port, conn[idx].phase, conn[idx].err);
    1169              :             }
    1170            0 :             return HCCL_E_TIMEOUT;
    1171              :         } else {
    1172            0 :             HCCL_ERROR("[ListenStop][RaSocket]errNo[0x%016llx] ra socket listen stop fail. return[%d], num[%u]",\
    1173              :                 HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret, num);
    1174            0 :             for (u32 idx = 0; idx < num; idx++) {
    1175            0 :                 HCCL_ERROR("cur idx[%u] port[%u] phase[%u] err[%u]",
    1176              :                     idx, conn[idx].port, conn[idx].phase, conn[idx].err);
    1177              :             }
    1178            0 :             return HCCL_E_TCP_CONNECT;  // 非ra限速场景错误,不轮询,直接退出
    1179              :         }
    1180            0 :     }
    1181           39 :     return HCCL_SUCCESS;
    1182              : }
    1183              : 
    1184            1 : HcclResult hrtRaSocketNonBlockBatchAbort(SocketConnectInfoT  conn[], u32 num)
    1185              : {
    1186            1 :     CheckConnPort(conn, num);
    1187            1 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketBatchAbort(conn, num);
    1188            1 :     if (ret == 0) {
    1189            1 :         return HCCL_SUCCESS;
    1190            0 :     } else if (ret == SOCK_EAGAIN) {
    1191            0 :         return HCCL_E_AGAIN;
    1192              :     } else {
    1193            0 :         HCCL_ERROR("[hrtRaSocketNonBlockBatchAbort]errNo[0x%016llx] ra socket batch abort fail. "\
    1194              :             "return[%d], num[%u]", HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret, num);
    1195            0 :         for (u32 idx = 0; idx < num; idx++) {
    1196            0 :             HCCL_ERROR("cur idx[%u] remoteIp[%u] port[%u] tag[%s]",
    1197              :                 idx, conn[idx].remoteIp.addr.s_addr, conn[idx].port, conn[idx].tag);
    1198              :         }
    1199            0 :         return HCCL_E_TCP_CONNECT;
    1200              :     }
    1201              : 
    1202              :     return HCCL_SUCCESS;
    1203              : }
    1204              : 
    1205            1 : HcclResult IsSupportRaSocketAbort(bool& isSupportRaSocketAbort)
    1206              : {
    1207            1 :     isSupportRaSocketAbort = false;
    1208            1 :     s32 deviceLogicID = -1;
    1209            1 :     u32 devicePhyId = 0;
    1210            1 :     CHK_RET(hrtGetDevice(&deviceLogicID));
    1211            1 :     CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(deviceLogicID), devicePhyId));
    1212            1 :     u32 configVersion = 0;
    1213              :  
    1214              :     // 获取版本号查看是否兼容
    1215            1 :     HcclResult ret = hrtRaGetInterfaceVersion(devicePhyId, SOCKET_ABORT, &configVersion);
    1216            1 :     CHK_PRT_RET(ret == HCCL_E_NETWORK, HCCL_ERROR("[IsSupportRaSendNormalWrlist]hrtRaGetInterfaceVersion "\
    1217              :         "failed, interface[%u]", SOCKET_ABORT), ret);
    1218            1 :     if (ret == HCCL_E_NOT_SUPPORT) {
    1219            0 :         HCCL_WARNING("this package does not support hrtRaGetInterfaceVersion, please change new package");
    1220            0 :         return HCCL_SUCCESS;
    1221              :     }
    1222              :  
    1223            1 :     if (configVersion >= SOCKET_ABORT_VERSION) {
    1224            1 :         isSupportRaSocketAbort = true;
    1225              :     }
    1226            1 :     HCCL_INFO("isSupportRaSocketAbort support:%d, configVersion:%d", isSupportRaSocketAbort, configVersion);
    1227            1 :     return HCCL_SUCCESS;
    1228              : }
    1229              : 
    1230            0 : HcclResult hrtRaSocketNonBlockBatchConnect(SocketConnectInfoT conn[], u32 num)
    1231              : {
    1232            0 :     CheckConnPort(conn, num);
    1233            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketBatchConnect(conn, num);
    1234            0 :     if (ret == 0) {
    1235            0 :         return HCCL_SUCCESS;
    1236            0 :     } else if (ret == SOCK_EAGAIN) {
    1237            0 :         return HCCL_E_AGAIN;
    1238              :     } else {
    1239            0 :         HCCL_ERROR("[HrtRaQpNonBlockConnectAsync]errNo[0x%016llx] ra socket batch connect fail. "\
    1240              :             "return[%d], num[%u]", HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret, num);
    1241            0 :         for (u32 idx = 0; idx < num; idx++) {
    1242            0 :             HCCL_ERROR("cur idx[%u] remoteIp[%u] port[%u] tag[%s]",
    1243              :                 idx, conn[idx].remoteIp.addr.s_addr, conn[idx].port, conn[idx].tag);
    1244              :         }
    1245            0 :         return HCCL_E_TCP_CONNECT;
    1246              :     }
    1247              : 
    1248              :     return HCCL_SUCCESS;
    1249              : }
    1250              : 
    1251            7 : HcclResult SocketBatchConnect(SocketConnectInfoT conn[], u32 num, std::function<bool()> needStop)
    1252              : {
    1253            7 :     s32 ret = 0;
    1254            7 :     auto startTime = chrono::steady_clock::now();
    1255            7 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
    1256            7 :     CheckConnPort(conn, num);
    1257              :     while (true) {
    1258            7 :         CHK_PRT_RET(needStop(), HCCL_ERROR("Terminating operation due to external request"), HCCL_E_INTERNAL);
    1259              : 
    1260            7 :         ret = DlRaFunction::GetInstance().dlRaSocketBatchConnect(conn, num);
    1261            7 :         if (!ret) {
    1262            7 :             break;  // 成功跳出
    1263            0 :         } else if (ret == SOCK_EAGAIN) {
    1264            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
    1265            0 :             RPT_CALL_ERR(bTimeout, "ra socket batch connect failed. timeout[%d s], return[%d]",
    1266              :                 GetExternalInputHcclLinkTimeOut(), ret);
    1267            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[BatchConnect][RaSocket]errNo[0x%016llx] ra socket batch connect "\
    1268              :                 "timeout[%lld s]. return[%d]", HCCL_ERROR_CODE(HCCL_E_TIMEOUT),\
    1269              :                 GetExternalInputHcclLinkTimeOut(), ret), HCCL_E_TIMEOUT);
    1270            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
    1271              :         } else {
    1272            0 :             RPT_CALL_ERR_PRT("ra socket batch connect failed. return[%d]", ret);
    1273            0 :             HCCL_ERROR("[BatchConnect][RaSocket]errNo[0x%016llx] ra socket batch connect fail. return[%d], params: ",\
    1274              :                 HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret);
    1275            0 :             return HCCL_E_TCP_CONNECT;  // 非ra限速场景错误,不轮询,直接退出
    1276              :         }
    1277            0 :     }
    1278            7 :     return HCCL_SUCCESS;
    1279              : }
    1280              : 
    1281            7 : HcclResult hrtRaSocketBatchConnect(struct SocketConnectInfoT conn[], u32 num, u32 maxLen, std::function<bool()> needStop)
    1282              : {
    1283            7 :     CHK_PTR_NULL(conn);
    1284            7 :     CHK_PRT_RET((num > maxLen) || (num == 0), HCCL_ERROR("[hrtRaSocketBatchConnect][RaSocket]ra socket batch connect "\
    1285              :         "para error, num[%u], maxLen[%u]",  num, maxLen), HCCL_E_PARA);
    1286              : 
    1287            7 :     HCCL_INFO("batch connect, port[%u], remoteip[%x]", conn[0].port, conn[0].remoteIp);
    1288              :     // batchConnect函数指针。底层接口一次最多建链16条,超过16条调用多次batch connect
    1289            7 :     u32 exeNum = 0;
    1290            7 :     SocketConnectInfoT *connBase = conn;
    1291           14 :     while (num > 0) {
    1292            7 :         exeNum = num > MAX_NUM_OF_BATCH_CONN ? MAX_NUM_OF_BATCH_CONN : num;
    1293            7 :         CHK_RET(SocketBatchConnect(connBase, exeNum, needStop));
    1294            7 :         connBase += exeNum;
    1295            7 :         num -= exeNum;
    1296              :     }
    1297              : 
    1298            7 :     return HCCL_SUCCESS;
    1299              : }
    1300              : 
    1301           11 : HcclResult hrtRaSocketBatchClose(struct SocketCloseInfoT conn[], u32 num, u32 maxLen)
    1302              : {
    1303           11 :     CHK_PTR_NULL(conn);
    1304           11 :     HCCL_INFO("ra socket batch close fdhandle[%p]", conn->fdHandle);
    1305           11 :     CHK_PRT_RET((num > maxLen) || (num == 0), HCCL_ERROR("[BatchClose][RaSocket]ra socket batch connect para error "\
    1306              :         "num[%u], maxLen[%u]", num, maxLen), HCCL_E_PARA);
    1307           11 :     s32 ret = 0;
    1308           11 :     auto startTime = chrono::steady_clock::now();
    1309           11 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
    1310              :     while (true) {
    1311           11 :         ret = DlRaFunction::GetInstance().dlRaSocketBatchClose(conn, num);
    1312           11 :         if (!ret) {
    1313           11 :             break;  // 成功跳出
    1314            0 :         } else if (ret == SOCK_EAGAIN) {
    1315            0 :             bool bTimeout = ((chrono::steady_clock::now() - startTime) >= timeout);
    1316            0 :             if (!bTimeout) {
    1317            0 :                 SaluSleep(ONE_MILLISECOND_OF_USLEEP);
    1318            0 :                 continue;
    1319              :             }
    1320            0 :             HCCL_ERROR("[BatchClose][RaSocket]errNo[0x%016llx] ra socket batch close timeout[%d s], ret[%d], num[%u]",
    1321              :                 HCCL_ERROR_CODE(HCCL_E_TIMEOUT), timeout, ret, num);
    1322            0 :             for (u32 idx = 0; idx < num; idx++) {
    1323            0 :                 HCCL_ERROR("cur idx[%u] disuseLinger[%d]", idx, conn[idx].disuseLinger);
    1324              :             }
    1325            0 :             return HCCL_E_TIMEOUT;
    1326              :         } else {
    1327            0 :             HCCL_ERROR("[BatchClose][RaSocket]errNo[0x%016llx] ra socket batch close fail. return[%d], num[%u]",\
    1328              :                 HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret, num);
    1329            0 :             for (u32 idx = 0; idx < num; idx++) {
    1330            0 :                 HCCL_ERROR("cur idx[%u] disuseLinger[%d]", idx, conn[idx].disuseLinger);
    1331              :             }
    1332            0 :             return HCCL_E_TCP_CONNECT;  // 非ra限速场景错误,不轮询,直接退出
    1333              :         }
    1334            0 :     }
    1335           11 :     HCCL_INFO("ra socket batch close success,take time [%lld]us",
    1336              :         std::chrono::duration_cast<std::chrono::microseconds>(chrono::steady_clock::now() - startTime));
    1337           11 :     return HCCL_SUCCESS;
    1338              : }
    1339              : 
    1340           41 : s32 hrtRaGetSockets(u32 role, struct SocketInfoT conn[], u32 num, u32 *connectedNum)
    1341              : {
    1342           41 :     return DlRaFunction::GetInstance().dlRaGetSockets(role, conn, num, connectedNum);
    1343              : }
    1344              : 
    1345            0 : HcclResult hrtRaNonBlockGetSockets(u32 role, struct SocketInfoT conn[], u32 num, u32 *connectedNum)
    1346              : {
    1347            0 :     CHK_PTR_NULL(conn);
    1348            0 :     CHK_PRT_RET(num == 0, HCCL_ERROR("[hrtRaBlockGetSockets]ra get rasocket para error, num[%d]", num), HCCL_E_PARA);
    1349            0 :     s32 ret = DlRaFunction::GetInstance().dlRaGetSockets(role, conn, num, connectedNum);
    1350            0 :     if (ret == 0) {
    1351            0 :         return HCCL_SUCCESS;
    1352            0 :     } else if (ret == SOCK_EAGAIN) {
    1353            0 :         return HCCL_E_AGAIN;
    1354              :     } else {
    1355            0 :         HCCL_ERROR("[hrtRaNonBlockGetSockets]get ra socket error. role[%u], num[%u], ret[%d], connected num[%u]", \
    1356              :             role, num, ret, *connectedNum);
    1357            0 :         for (u32 idx = 0; idx < num; idx++) {
    1358            0 :             HCCL_ERROR("cur idx[%u] socketHandle[%u] s_addr[%u] tag[%s]", idx, conn[idx].socketHandle, 
    1359              :                 conn[idx].remoteIp.addr.s_addr, conn[idx].tag);
    1360              :         }
    1361            0 :         return HCCL_E_TCP_CONNECT;
    1362              :     }
    1363              : 
    1364              :     return HCCL_SUCCESS;
    1365              : }
    1366              : 
    1367            0 : HcclResult hrtRaBlockGetSockets(u32 role, struct SocketInfoT conn[], u32 num)
    1368              : {
    1369            0 :     CHK_PTR_NULL(conn);
    1370            0 :     CHK_PRT_RET(num == 0, HCCL_ERROR("[hrtRaBlockGetSockets]ra get rasocket para error"), HCCL_E_PARA);
    1371              :     s32 sockRet;
    1372            0 :     u32 gotSocketsCnt = 0;
    1373            0 :     auto startTime = chrono::steady_clock::now();
    1374            0 :     auto timeout = chrono::seconds(GetExternalInputHcclLinkTimeOut());
    1375              :     while (true) {
    1376            0 :         if ((chrono::steady_clock::now() - startTime) >= timeout) {
    1377            0 :             HCCL_ERROR("[hrtRaBlockGetSockets] get rasocket timeout role[%u], num[%u], goten[%u], "\
    1378              :                 "timeout[%lld s], the HCCL_CONNECT_TIMEOUT may be insufficient.", role, num, gotSocketsCnt, timeout);
    1379            0 :             return HCCL_E_TIMEOUT;
    1380              :         }
    1381            0 :         u32 connectedNum = 0;
    1382            0 :         sockRet = hrtRaGetSockets(role, conn, num, &connectedNum);
    1383            0 :         if ((connectedNum == 0 && sockRet == 0) || (sockRet == SOCK_EAGAIN)) {
    1384            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
    1385            0 :         } else if (sockRet != 0) {
    1386            0 :             HCCL_ERROR("[Get][RaSocket]get rasocket error. role[%u], num[%u], sockRet[%d], connectednum[%u]", \
    1387              :                        role, num, sockRet, connectedNum);
    1388            0 :             return HCCL_E_TCP_CONNECT;
    1389              :         } else {
    1390            0 :             gotSocketsCnt += connectedNum;
    1391            0 :             if (gotSocketsCnt == num) {
    1392            0 :                 HCCL_INFO("block get sockets success, socket num[%u]", gotSocketsCnt);
    1393            0 :                 break;
    1394            0 :             } else if (gotSocketsCnt > num) {
    1395            0 :                 HCCL_ERROR("[Get][RaSocket]total Sockets[%u], more than needed num[%u]!", gotSocketsCnt, num);
    1396            0 :                 return HCCL_E_TCP_CONNECT;
    1397              :             } else {
    1398            0 :                 SaluSleep(ONE_MILLISECOND_OF_USLEEP);
    1399              :             }
    1400              :         }
    1401            0 :     }
    1402            0 :     return HCCL_SUCCESS;
    1403              : }
    1404              : 
    1405              : 
    1406            0 : HcclResult hrtRaSocketNonBlockSendHeterog(const FdHandle fdHandle, const void *data, u64 size, u64 *sentSize)
    1407              : {
    1408            0 :     if (size > SOCKET_SEND_MAX_SIZE) {
    1409            0 :         HCCL_ERROR("[hrtRaSocketNonBlockSend]errNo[0x%016llx] ra socket send size is too large, " \
    1410              :             "data[%p], size[%llu Byte]", HCCL_ERROR_CODE(HCCL_E_NETWORK), data, size);
    1411            0 :         return HCCL_E_PARA;
    1412              :     }
    1413            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketSend(fdHandle, data, size, sentSize);
    1414            0 :     if (ret == 0) {
    1415            0 :         return HCCL_SUCCESS;
    1416            0 :     } else if (ret == SOCK_EAGAIN) {
    1417            0 :         return HCCL_E_AGAIN;
    1418              :     } else {
    1419            0 :         HCCL_RUN_INFO("[hrtRaSocketNonBlockSend]ra socket send failed, data[%p], size[%llu Byte], "\
    1420              :             "sent[%llu Byte], ret[%d]", data, size, *sentSize, ret);
    1421            0 :         return HCCL_E_NETWORK;
    1422              :     }
    1423              :  
    1424              :     return HCCL_SUCCESS;
    1425              : }
    1426              : 
    1427            0 : s32 hrtRaSocketNonBlockSend(const FdHandle fdHandle, const void *data, u64 size, u64 *sentSize)
    1428              : {
    1429            0 :     return DlRaFunction::GetInstance().dlRaSocketSend(fdHandle, data, size, sentSize);
    1430              : }
    1431              : 
    1432            0 : HcclResult hrtRaSocketNonBlockSendHeart(const FdHandle fdHandle, const void *data, u64 size, u64 *sentSize)
    1433              : {
    1434            0 :     if (size > SOCKET_SEND_MAX_SIZE) {
    1435            0 :         HCCL_ERROR("[hrtRaSocketNonBlockSend]errNo[0x%016llx] ra socket send size is too large, " \
    1436              :             "data[%p], size[%llu]", HCCL_ERROR_CODE(HCCL_E_NETWORK), data, size);
    1437            0 :         return HCCL_E_PARA;
    1438              :     }
    1439            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketSend(fdHandle, data, size, sentSize);
    1440            0 :     if (ret == 0) {
    1441            0 :         return HCCL_SUCCESS;
    1442            0 :     } else if (ret == SOCK_EAGAIN) {
    1443            0 :         return HCCL_E_AGAIN;
    1444            0 :     } else if (ret == SOCK_CLOSE) {
    1445            0 :         return HCCL_E_INTERNAL; // 暂时用这个错误表示hccp进程异常退出
    1446              :     } else {
    1447            0 :         HCCL_WARNING("[hrtRaSocketNonBlockSend]ra socket send failed, fdHandle[%p], data[%p], size[%llu], "\
    1448              :             "sent[%llu], ret[%d], errno[%d][%s]", fdHandle, data, size, *sentSize, ret, errno, strerror(errno));
    1449            0 :         return HCCL_E_NETWORK;
    1450              :     }
    1451              : 
    1452              :     return HCCL_SUCCESS;
    1453              : }
    1454              : 
    1455           10 : HcclResult hrtRaSocketBlockSend(const FdHandle fdHandle, const void *data, u64 sendSize, std::function<bool()> needStop)
    1456              : {
    1457           10 :     CHK_PTR_NULL(data);
    1458           10 :     if (sendSize > SOCKET_SEND_MAX_SIZE) {
    1459            0 :         HCCL_ERROR("[Send][RaSocket]errNo[0x%016llx] ra socket send size is too large, " \
    1460              :             "data[%p], size[%llu Byte]", HCCL_ERROR_CODE(HCCL_E_NETWORK), data, sendSize);
    1461            0 :         return HCCL_E_PARA;
    1462              :     }
    1463           10 :     s64 ret = 0;
    1464           10 :     void *sendData = const_cast<void *>(data);
    1465              :     const chrono::seconds timeout = chrono::seconds(
    1466           10 :         GetExternalInputHcclLinkTimeOut());
    1467           10 :     const auto start = chrono::steady_clock::now();
    1468           10 :     u64 totalSentSize = 0;
    1469           10 :     u64 sentSize = 0;
    1470              : 
    1471           10 :     HCCL_DEBUG("before ra socket send, para: data[%p], size[%llu Byte]", sendData, sendSize);
    1472              : 
    1473              :     while (true) {
    1474           10 :         CHK_PRT_RET(needStop(), HCCL_ERROR("Terminating operation due to external request"), HCCL_E_INTERNAL);
    1475              : 
    1476              :         // 底层ra_socket_send host网卡无限制,device网卡由于HDC通道限制的限制有大小限制(目前大小为64KB)
    1477           10 :         ret = DlRaFunction::GetInstance().dlRaSocketSend(fdHandle,
    1478           10 :             reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(sendData) + totalSentSize),
    1479              :             sendSize - totalSentSize, &sentSize);
    1480           10 :         HCCL_DEBUG("ra socket send, data[%p], size[%llu Byte] send size[%llu Byte]", sendData, sendSize, totalSentSize);
    1481           10 :         if (ret == 0) {
    1482           10 :             totalSentSize += sentSize;
    1483           10 :             if (totalSentSize == sendSize) { // 只有完全发送完才返回成功
    1484           10 :                 break;
    1485              :             }
    1486              : 
    1487            0 :             CHK_PRT_RET((totalSentSize > sendSize),
    1488              :                 HCCL_ERROR("[Send][RaSocket]errNo[0x%016llx] ra socket send failed, " \
    1489              :                 "data[%p], size[%llu Byte], retSize[%llu Byte]", HCCL_ERROR_CODE(HCCL_E_NETWORK),
    1490              :                     data, sendSize, sentSize), HCCL_E_NETWORK);
    1491            0 :             SaluSleep(ONE_HUNDRED_MICROSECOND_OF_USLEEP);
    1492            0 :         } else if (ret == SOCK_EAGAIN) {
    1493              :             /* ra速率限制 retry */
    1494            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
    1495              :         } else {
    1496            0 :             HCCL_ERROR("[Send][RaSocket]errNo[0x%016llx] ra socket send failed, data[%p], size[%llu], "\
    1497              :                 "sent[%llu Byte], ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), data, sendSize, sentSize, ret);
    1498            0 :             return HCCL_E_NETWORK;
    1499              :         }
    1500              : 
    1501              :         /* 获取当前时间,如果耗时超过timeout,则返回错误 */
    1502              :         const auto elapsed =
    1503            0 :             chrono::duration_cast<chrono::seconds>(chrono::steady_clock::now() - start);
    1504            0 :         if (elapsed > timeout) {
    1505            0 :             HCCL_ERROR("[Send][RaSocket]errNo[0x%016llx] Wait timeout for sockets send, data[%p], "\
    1506              :                 "size[%llu Byte], sentsize[%llu Byte]", HCCL_ERROR_CODE(HCCL_E_NETWORK), data, sendSize, sentSize);
    1507            0 :             return HCCL_E_TIMEOUT;
    1508              :         }
    1509            0 :     }
    1510           10 :     HCCL_DEBUG("ra socket send finished.");
    1511           10 :     return HCCL_SUCCESS;
    1512              : }
    1513              : 
    1514            0 : s32 hrtRaSocketRecv(const FdHandle fdHandle, void *data, u64 size, u64 *recvSize)
    1515              : {
    1516            0 :     return DlRaFunction::GetInstance().dlRaSocketRecv(fdHandle, data, size, recvSize);
    1517              : }
    1518              : 
    1519            0 : HcclResult hrtRaSocketNonBlockRecvHeterog(const FdHandle fdHandle, void *data, u64 size, u64 *recvSize)
    1520              : {
    1521            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketRecv(fdHandle, data, size, recvSize);
    1522            0 :     if (ret == 0) {
    1523            0 :         return HCCL_SUCCESS;
    1524            0 :     } else if (ret == SOCK_EAGAIN) {
    1525            0 :         return HCCL_E_AGAIN;
    1526              :     } else {
    1527            0 :          HCCL_RUN_INFO("[hrtRaSocketNonBlockRecv]ra socket recv failed, data[%p], size[%llu Byte], "\
    1528              :              "recv[%llu Byte], ret[%d], errno[%d][%s]", data, size, recvSize, ret, errno, strerror(errno));
    1529            0 :         return HCCL_E_TCP_TRANSFER;
    1530              :     }
    1531              :  
    1532              :     return HCCL_SUCCESS;
    1533              : }
    1534              : 
    1535            0 : s32 hrtRaSocketNonBlockRecv(const FdHandle fdHandle, void *data, u64 size, u64 *recvSize)
    1536              : {
    1537            0 :     return DlRaFunction::GetInstance().dlRaSocketRecv(fdHandle, data, size, recvSize);;
    1538              : }
    1539              : 
    1540            0 : HcclResult hrtRaSocketNonBlockRecvHeart(const FdHandle fdHandle, void *data, u64 size, u64 *recvSize)
    1541              : {
    1542            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketRecv(fdHandle, data, size, recvSize);
    1543            0 :     if (ret == 0) {
    1544            0 :         return HCCL_SUCCESS;
    1545            0 :     } else if (ret == SOCK_EAGAIN) {
    1546            0 :         return HCCL_E_AGAIN;
    1547            0 :     } else if (ret == SOCK_CLOSE) {
    1548            0 :         return HCCL_E_INTERNAL; //暂时用这个错误码表示hccp进程异常退出
    1549              :     } else {
    1550            0 :         HCCL_WARNING("[hrtRaSocketNonBlockRecvHeart]ra socket recv failed, data[%p], size[%llu], "\
    1551              :             "recv[%llu], ret[%d], errno[%d][%s]", data, size, recvSize, ret, errno, strerror(errno));
    1552            0 :         return HCCL_E_TCP_TRANSFER;
    1553              :     }
    1554              :     return HCCL_SUCCESS;
    1555              : }
    1556              : 
    1557            9 : HcclResult hrtRaSocketBlockRecv(const FdHandle fdHandle, void *data, u64 size, std::function<bool()> needStop, u32 timeout)
    1558              : {
    1559            9 :     auto startTime = chrono::steady_clock::now();
    1560            9 :     void *recvData = const_cast<void *>(data);
    1561            9 :     u64 recvSize = 0;
    1562            9 :     s32 rtRet = 0;
    1563            9 :     u64 getedLen = 0;
    1564              :     const chrono::seconds timeoutSec = chrono::seconds(
    1565            9 :         timeout > 0 ? timeout : GetExternalInputHcclLinkTimeOut());
    1566              : 
    1567            9 :     HCCL_DEBUG("before ra socket recv, para: data[%p], size[%llu]", recvData, size);
    1568              :     while (true) {
    1569            9 :         CHK_PRT_RET(needStop(), HCCL_ERROR("Terminating operation due to external request"), HCCL_E_INTERNAL);
    1570              : 
    1571            9 :         if ((chrono::steady_clock::now() - startTime) >= timeoutSec) {
    1572            0 :             HCCL_ERROR("[Recv][RaSocket]errNo[0x%016llx] Wait timeout for sockets recv, data[%p], "\
    1573              :                 "size[%llu Byte], recvSize[%llu Byte] timeout[%lld s]. Peerrank did not send the data in time. " \
    1574              :                 "Check whether the peerrank is abnormal.", \
    1575              :                 HCCL_ERROR_CODE(HCCL_E_NETWORK), data, size, recvSize, timeoutSec);
    1576            0 :             return HCCL_E_TIMEOUT;
    1577              :         }
    1578            9 :         rtRet = DlRaFunction::GetInstance().dlRaSocketRecv(fdHandle,
    1579            9 :             reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(recvData) + getedLen), size - getedLen, &recvSize);
    1580            9 :         if ((rtRet == 0) && (recvSize > 0)) {  // 接收完成,也有可能要多次接收
    1581            9 :             getedLen += recvSize;
    1582            9 :             CHK_PRT_RET(getedLen > size, HCCL_ERROR("[Recv][RaSocket]errNo[0x%016llx] socket receive "\
    1583              :                 "rtSize[%llu Byte] bigger size[%zu Byte]", HCCL_ERROR_CODE(HCCL_E_TCP_TRANSFER), getedLen, size),
    1584              :                 HCCL_E_TCP_TRANSFER);
    1585            9 :             if (getedLen == size) {
    1586            9 :                 break;
    1587              :             }
    1588            0 :         } else if ((rtRet == 0) && (recvSize == 0)) {
    1589            0 :             HCCL_ERROR("[Recv][RaSocket]recv fail, bufLen[%llu], recLen[%llu]", size, recvSize);
    1590            0 :             return HCCL_E_TCP_TRANSFER;
    1591            0 :         } else if (rtRet == SOCK_EAGAIN) {
    1592              :             /* 尚未接收到数据,延时1ms */
    1593            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
    1594            0 :             continue;
    1595            0 :         } else if (rtRet != 0) { // 等于0为连接关闭,小于0的其他场景为出错
    1596            0 :             HCCL_ERROR("[Recv][RaSocket]errNo[0x%016llx] recv fail, data[%p], size[%llu], rtRet[%d]",
    1597              :                 HCCL_ERROR_CODE(HCCL_E_TCP_TRANSFER), data, size, rtRet);
    1598            0 :             return HCCL_E_TCP_TRANSFER;
    1599              :         }
    1600              :     }
    1601            9 :     HCCL_DEBUG("ra socket receive finished");
    1602            9 :     return HCCL_SUCCESS;
    1603              : }
    1604              : 
    1605            0 : HcclResult IsSupportHdcAsync(bool &isSupportHdcAsync)
    1606              : {
    1607            0 :     isSupportHdcAsync = false;
    1608            0 :     s32 deviceLogicID = -1;
    1609            0 :     u32 devicePhyId = 0;
    1610            0 :     CHK_RET(hrtGetDevice(&deviceLogicID));
    1611            0 :     CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(deviceLogicID), devicePhyId));
    1612            0 :     u32 version = 0;
    1613              :  
    1614              :     // 获取版本号查看是否兼容
    1615            0 :     HcclResult ret = hrtRaGetInterfaceVersion(devicePhyId, RS_INIT, &version);
    1616            0 :     CHK_PRT_RET(ret == HCCL_E_NETWORK, HCCL_ERROR("[IsSupportHdcAsync]hrtRaGetInterfaceVersion "\
    1617              :         "failed, interface[%u]", RS_INIT), ret);
    1618            0 :     if (ret == HCCL_E_NOT_SUPPORT) {
    1619            0 :         HCCL_WARNING("this package does not support hrtRaGetInterfaceVersion, please change new package");
    1620            0 :         return HCCL_SUCCESS;
    1621              :     }
    1622              :  
    1623            0 :     if (version >= RS_INIT_SUPPORT_ASYNC_VERSION) {
    1624            0 :         isSupportHdcAsync = true;
    1625              :     }
    1626              : 
    1627            0 :     HCCL_INFO("[IsSupportHdcAsync] isSupportHdcAsync[%d], version[%d]", isSupportHdcAsync, version);
    1628            0 :     return HCCL_SUCCESS;
    1629              : }
    1630              : 
    1631            3 : s32 hrtRaSocketSendAsync(const FdHandle fdHandle, const void *data, u64 size, u64 *sentSize, void **reqHandle)
    1632              : {
    1633            3 :     if (DlRaFunction::GetInstance().dlRaSocketSendAsync == nullptr) {
    1634            1 :         HCCL_WARNING("this package does not support hrtRaSocketSendAsync, please change new package");
    1635            1 :         return OTHERS_ENOTSUPP;
    1636              :     }
    1637            2 :     return DlRaFunction::GetInstance().dlRaSocketSendAsync(fdHandle, data, size, sentSize, reqHandle);
    1638              : }
    1639              : 
    1640            3 : s32 hrtRaSocketRecvAsync(const FdHandle fdHandle, void *data, u64 size, u64 *receivedSize, void **reqHandle)
    1641              : {
    1642            3 :     if (DlRaFunction::GetInstance().dlRaSocketRecvAsync == nullptr) {
    1643            1 :         HCCL_WARNING("this package does not support hrtRaSocketRecvAsync, please change new package");
    1644            1 :         return OTHERS_ENOTSUPP;
    1645              :     }
    1646            2 :     return DlRaFunction::GetInstance().dlRaSocketRecvAsync(fdHandle, data, size, receivedSize, reqHandle);
    1647              : }
    1648              : 
    1649            5 : s32 hrtRaSocketGetAsyncReqResult(void *reqHandle, s32 *reqResult)
    1650              : {
    1651            5 :     if (DlRaFunction::GetInstance().dlRaGetAsyncReqResult == nullptr) {
    1652            1 :         HCCL_WARNING("this package does not support hrtRaSocketGetAsyncReqResult, please change new package");
    1653            1 :         return OTHERS_ENOTSUPP;
    1654              :     }
    1655            4 :     return DlRaFunction::GetInstance().dlRaGetAsyncReqResult(reqHandle, reqResult);
    1656              : }
    1657              : 
    1658           14 : HcclResult hrtGetHostIf(vector<pair<string, HcclIpAddress>> &hostIfs, u32 devPhyId)
    1659              : {
    1660           14 :     struct RaGetIfattr config = {0};
    1661           14 :     config.phyId = devPhyId;
    1662           14 :     config.nicPosition = static_cast<u32>(NICDeployment::NIC_DEPLOYMENT_HOST);
    1663           14 :     config.isAll = false;
    1664              : 
    1665           14 :     u32 ifAddrNum = 0;
    1666           14 :     CHK_RET(hrtGetIfNum(config, ifAddrNum));
    1667           14 :     HCCL_RUN_INFO("[Get][HostIf]hrtGetIfNum success. ifAddrNum[%u].", ifAddrNum);
    1668           14 :     if (ifAddrNum == 0) {
    1669            0 :         HCCL_WARNING("[Get][HostIf]there is no valid host interface, ifAddrNum[%u].", ifAddrNum);
    1670            0 :         return HCCL_SUCCESS;
    1671              :     }
    1672              : 
    1673              :     struct InterfaceInfo *ifAddrInfos;
    1674           14 :     NEW_NOTHROW(ifAddrInfos, struct InterfaceInfo[ifAddrNum], return HCCL_E_MEMORY);
    1675           14 :     shared_ptr<struct InterfaceInfo> ifAddrInfoPtrs(ifAddrInfos, default_delete<struct InterfaceInfo[]>());
    1676              : 
    1677           14 :     s32 sRet = memset_s(ifAddrInfos, ifAddrNum * sizeof(InterfaceInfo), 0, ifAddrNum * sizeof(InterfaceInfo));
    1678           14 :     if (sRet != EOK) {
    1679            0 :         HCCL_ERROR("[Get][HostIf]errNo[0x%016llx] memoryset ifAddrInfos to 0 failed. params: "\
    1680              :             "dest[%p], dest_size[%zu Byte], count[%zu]", HCCL_ERROR_CODE(HCCL_E_SYSCALL), ifAddrInfos,
    1681              :             ifAddrNum * sizeof(InterfaceInfo), ifAddrNum * sizeof(InterfaceInfo));
    1682            0 :         return HCCL_E_SYSCALL;
    1683              :     }
    1684           14 :     CHK_RET(hrtGetIfAddress(config, ifAddrInfos, ifAddrNum));
    1685              : 
    1686           70 :     for (u32 i = 0; i < ifAddrNum; i++) {
    1687              :         HcclInAddr temp;
    1688           56 :         temp.addr = ifAddrInfos[i].ifaddr.ip.addr;
    1689           56 :         temp.addr6 = ifAddrInfos[i].ifaddr.ip.addr6;
    1690           56 :         HcclIpAddress ipInfo(ifAddrInfos[i].family, temp);
    1691           56 :         CHK_PRT_RET(ipInfo.IsInvalid(), HCCL_ERROR("ip is invalid."), HCCL_E_PARA);
    1692          112 :         CHK_RET(ipInfo.SetIfName(ifAddrInfos[i].ifname));
    1693           56 :         CHK_RET(ipInfo.SetScopeID(ifAddrInfos[i].scopeId));
    1694           56 :         hostIfs.push_back({ifAddrInfos[i].ifname, ipInfo});
    1695           56 :         HCCL_INFO("[Get][HostIf]hrtGetIfAddress: idx[%u] ifname[%s] ip[%s]",
    1696              :             i, ifAddrInfos[i].ifname, ipInfo.GetReadableAddress());
    1697           56 :     }
    1698              : 
    1699           14 :     return HCCL_SUCCESS;
    1700           14 : }
    1701              : 
    1702            0 : HcclResult hrtEpollCtlAdd(const FdHandle fdHandle, RaEpollEvent event)
    1703              : {
    1704            0 :     s32 ret = DlRaFunction::GetInstance().dlRaEpollCtlAdd(fdHandle, event);
    1705            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Add][EpollCtl] failed"), HCCL_E_NETWORK);
    1706            0 :     return HCCL_SUCCESS;
    1707              : }
    1708              : 
    1709            0 : HcclResult hrtEpollCtlMod(const FdHandle fdHandle, RaEpollEvent event)
    1710              : {
    1711            0 :     s32 ret = DlRaFunction::GetInstance().dlRaEpollCtlMod(fdHandle, event);
    1712            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Mod][EpollCtl] failed"), HCCL_E_NETWORK);
    1713            0 :     return HCCL_SUCCESS;
    1714              : }
    1715              : 
    1716            0 : HcclResult hrtEpollCtlDel(const FdHandle fdHandle)
    1717              : {
    1718            0 :     s32 ret = DlRaFunction::GetInstance().dlRaEpollCtlDel(fdHandle);
    1719            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Del][EpollCtl] failed"), HCCL_E_NETWORK);
    1720            0 :     return HCCL_SUCCESS;
    1721              : }
    1722              : 
    1723            0 : HcclResult hrtSetRecvDataCallback(const SocketHandle socketHandle, const void *callback)
    1724              : {
    1725            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSetRecvDataCallback(socketHandle, callback);
    1726            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Set][RecvDataCallback] failed"), HCCL_E_NETWORK);
    1727            0 :     return HCCL_SUCCESS;
    1728              : }
    1729              : #endif
    1730              : 
    1731              : #if T_DESC("WhiteList", true)
    1732              : 
    1733           18 : HcclResult hrtRaSocketSetWhiteListStatus(u32 enable)
    1734              : {
    1735           18 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketSetWhiteListStatus(enable);
    1736           18 :     CHK_PRT_RET(ret != 0,
    1737              :         HCCL_ERROR("[Set][WhiteListStatus]errNo[0x%016llx] ra socket set white list fail, return[%d]." \
    1738              :             " para: enable[%u]", HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret, enable), HCCL_E_TCP_CONNECT);
    1739           18 :     HCCL_INFO("set host socket whitelist status[%u] success.", enable);
    1740           18 :     return HCCL_SUCCESS;
    1741              : }
    1742              : 
    1743            0 : HcclResult hrtRaSocketGetWhiteListStatus(u32 &enable)
    1744              : {
    1745            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSocketGetWhiteListStatus(&enable);
    1746            0 :     CHK_PRT_RET(ret != 0,
    1747              :         HCCL_ERROR("[Get][WhiteListStatus]errNo[0x%016llx] ra socket get white list fail, return[%d].",
    1748              :             HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret), HCCL_E_TCP_CONNECT);
    1749            0 :     return HCCL_SUCCESS;
    1750              : }
    1751              : 
    1752            3 : HcclResult hrtRaSocketWhiteListAdd(SocketHandle socketHandle, struct SocketWlistInfoT whiteList[], u32 num)
    1753              : {
    1754            3 :     HCCL_INFO("add white list: num[%u].", num);
    1755            6 :     for (u32 i = 0; i < num; i++) {
    1756            3 :         HCCL_DEBUG("add white list: idx[%u], remoteIp[%u], tag[%s].", i, whiteList[i].remoteIp.addr.s_addr,
    1757              :             whiteList[i].tag);
    1758            3 :         s32 ret = DlRaFunction::GetInstance().dlRaSocketWhiteListAdd(socketHandle, whiteList + i, 1);
    1759            3 :         CHK_PRT_RET(ret != 0,
    1760              :             HCCL_ERROR("[Add][RaSocketWhiteList]errNo[0x%016llx] ra white list add fail, return[%d].",\
    1761              :                 HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret), HCCL_E_TCP_CONNECT);
    1762              :     }
    1763              : 
    1764            3 :     return HCCL_SUCCESS;
    1765              : }
    1766              : 
    1767            1 : HcclResult hrtRaSocketWhiteListDel(SocketHandle socketHandle, struct SocketWlistInfoT whiteList[], u32 num)
    1768              : {
    1769            1 :     HCCL_DEBUG("delete white list: num[%u].", num);
    1770            2 :     for (u32 i = 0; i < num; i++) {
    1771            1 :         HCCL_DEBUG("del white list: idx[%u], remoteIp[%u], tag[%s].", i, whiteList[i].remoteIp.addr.s_addr,
    1772              :             whiteList[i].tag);
    1773            1 :         s32 ret = DlRaFunction::GetInstance().dlRaSocketWhiteListDel(socketHandle, whiteList + i, 1);
    1774            1 :         CHK_PRT_RET(ret != 0,
    1775              :             HCCL_ERROR("[Del][RaSocketWhiteList]errNo[0x%016llx] ra white list del fail, return[%d].",\
    1776              :                 HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret), HCCL_E_TCP_CONNECT);
    1777              :     }
    1778              : 
    1779            1 :     return HCCL_SUCCESS;
    1780              : }
    1781              : 
    1782              : #endif
    1783              : 
    1784           80 : HcclResult hrtGetIfNum(struct RaGetIfattr &config, u32 &num)
    1785              : {
    1786              : #ifndef HCCD
    1787           80 :     if (DlRaFunction::GetInstance().dlRaGetIfNum == nullptr) {
    1788            0 :         HCCL_WARNING("this package does not support hrtGetIfNum, please change new package");
    1789            0 :         return HCCL_SUCCESS;
    1790              :     }
    1791              : 
    1792           80 :     s32 ret = DlRaFunction::GetInstance().dlRaGetIfNum(&config, &num);
    1793           80 :     constexpr s32 MAX_SUPPORT_IFNUM = 65536;
    1794           80 :     CHK_PRT_RET((ret != 0 || num > MAX_SUPPORT_IFNUM), HCCL_ERROR("[Get][IfNum]errNo[0x%016llx] ra get if num fail."
    1795              :         " ret[%d], num[%u] should be less than [%u]", \
    1796              :         HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret, num, MAX_SUPPORT_IFNUM), HCCL_E_TCP_CONNECT);
    1797           80 :     return HCCL_SUCCESS;
    1798              : #else
    1799              :     HCCL_ERROR("[hrtGetIfNum]Does not support this interface.");
    1800              :     return HCCL_E_NOT_SUPPORT;
    1801              : #endif
    1802              : }
    1803              : 
    1804           80 : HcclResult hrtGetIfAddress(struct RaGetIfattr &config, struct InterfaceInfo ifaddrInfos[], u32 &num)
    1805              : {
    1806              : #ifndef HCCD
    1807           80 :     CHK_PRT_RET(num == 0, HCCL_ERROR("[Get][IfAddress]errNo[0x%016llx] ra get if address fail. input param num[%u] "\
    1808              :         "is invalid.", HCCL_ERROR_CODE(HCCL_E_INTERNAL), num), HCCL_E_INTERNAL);
    1809           80 :     s32 ret = DlRaFunction::GetInstance().dlRaGetIfAddress(&config, ifaddrInfos, &num);
    1810           80 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Get][IfAddress]errNo[0x%016llx] ra get if address fail. ret[%d], num[%u]", \
    1811              :         HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret, num), HCCL_E_TCP_CONNECT);
    1812           80 :     return HCCL_SUCCESS;
    1813              : #else
    1814              :     HCCL_ERROR("[hrtGetIfAddress]Does not support this interface.");
    1815              :     return HCCL_E_NOT_SUPPORT;
    1816              : #endif
    1817              : }
    1818              : 
    1819           66 : HcclResult hrtRaGetDeviceIP(u32 devicePhyId, vector<HcclIpAddress> &ipAddr)
    1820              : {
    1821           66 :     struct RaGetIfattr config = {0};
    1822           66 :     config.phyId = devicePhyId;
    1823           66 :     config.nicPosition = static_cast<u32>(NICDeployment::NIC_DEPLOYMENT_DEVICE);
    1824           66 :     config.isAll = false;
    1825              : 
    1826           66 :     u32 ifAddrNum = HCCL_DEVICE_NIC_NUM;
    1827           66 :     CHK_RET(hrtGetIfNum(config, ifAddrNum));
    1828           66 :     ifAddrNum = ifAddrNum > HCCL_DEVICE_NIC_NUM ? HCCL_DEVICE_NIC_NUM : ifAddrNum;
    1829           66 :     HCCL_RUN_INFO("[Get][DeviceIP]hrtGetIfNum success. ifAddrNum[%u].", ifAddrNum);
    1830              : 
    1831           66 :     if (ifAddrNum == 0) {
    1832            0 :         HCCL_WARNING("[Get][DeviceIP]device has no ip information, phyId[%u]", devicePhyId);
    1833            0 :         return HCCL_SUCCESS;
    1834              :     }
    1835              : 
    1836              :     struct InterfaceInfo ifAddrInfos[HCCL_DEVICE_NIC_NUM];
    1837           66 :     s32 sRet = memset_s(ifAddrInfos, sizeof(InterfaceInfo) * HCCL_DEVICE_NIC_NUM, 0, \
    1838              :         sizeof(InterfaceInfo) * HCCL_DEVICE_NIC_NUM);
    1839           66 :     CHK_PRT_RET(sRet != EOK, HCCL_ERROR("[Get][DeviceIP]errNo[0x%016llx] memoryset ifAddrInfos to 0 failed. params: "\
    1840              :         "dest[%p], dest_size[%zu Byte], count[%zu]", HCCL_ERROR_CODE(HCCL_E_SYSCALL), ifAddrInfos,
    1841              :         sizeof(InterfaceInfo) * HCCL_DEVICE_NIC_NUM, sizeof(InterfaceInfo) * HCCL_DEVICE_NIC_NUM), HCCL_E_SYSCALL);
    1842              : 
    1843           66 :     CHK_RET(hrtGetIfAddress(config, ifAddrInfos, ifAddrNum));
    1844              : 
    1845           66 :     CHK_PRT_RET(ifAddrNum > HCCL_DEVICE_NIC_NUM,
    1846              :         HCCL_ERROR("[Get][DeviceIP]hrtGetIfAddress fail. ifAddrNum[%u] should be below %u", ifAddrNum,
    1847              :             HCCL_DEVICE_NIC_NUM), HCCL_E_TCP_CONNECT);
    1848              : 
    1849          198 :     for (u32 i = 0; i < ifAddrNum; i++) {
    1850              :         HcclInAddr temp;
    1851          132 :         temp.addr = ifAddrInfos[i].ifaddr.ip.addr;
    1852          132 :         temp.addr6 = ifAddrInfos[i].ifaddr.ip.addr6;
    1853          132 :         HcclIpAddress ipInfo(ifAddrInfos[i].family, temp);
    1854          132 :         CHK_PRT_RET(ipInfo.IsInvalid(), HCCL_ERROR("ip is invalid."), HCCL_E_PARA);
    1855          264 :         CHK_RET(ipInfo.SetIfName(ifAddrInfos[i].ifname));
    1856          132 :         CHK_RET(ipInfo.SetScopeID(ifAddrInfos[i].scopeId));
    1857          132 :         ipAddr.push_back(ipInfo);
    1858          132 :         HCCL_RUN_INFO("[Get][DeviceIP]hrtGetIfAddress: idx[%u] ifname[%s] ip[%s]",
    1859              :             i, ifAddrInfos[i].ifname, ipInfo.GetReadableAddress());
    1860          132 :     }
    1861              : 
    1862           66 :     return HCCL_SUCCESS;
    1863              : }
    1864              : 
    1865              : 
    1866            1 : HcclResult hrtRaGetDeviceAllNicIP(vector<vector<HcclIpAddress>> &ipAddr)
    1867              : {
    1868            1 :     s32 deviceLogicID = -1;
    1869            1 :     u32 devicePhyId = 0;
    1870            1 :     CHK_RET(hrtGetDevice(&deviceLogicID));
    1871            1 :     CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(deviceLogicID), devicePhyId));
    1872              :     // 获取版本号查看是否兼容
    1873            1 :     u32 ifnumVersion = 0;
    1874            1 :     HcclResult vRet = hrtRaGetInterfaceVersion(devicePhyId, IFADDRS_V2_INTERFACE, &ifnumVersion);
    1875            1 :     if (vRet != HCCL_SUCCESS || ifnumVersion < IFADDRS_V2_INTERFACE_VERSTOIN) {
    1876            0 :         HCCL_WARNING("this package does not support hrtRaGetDeviceAllNicIP, please change new package.");
    1877            0 :         return HCCL_SUCCESS;
    1878              :     }
    1879            1 :     DevType deviceType = DevType::DEV_TYPE_COUNT;
    1880            1 :     CHK_RET(hrtGetDeviceType(deviceType));
    1881            1 :     CHK_PRT_RET(deviceType != DevType::DEV_TYPE_910_93 && deviceType != DevType::DEV_TYPE_910B,
    1882              :         HCCL_ERROR("[Get][DeviceAllNicIP] is not supported on device type[%d]. Please check device type.", deviceType),
    1883              :         HCCL_E_NOT_SUPPORT);
    1884              : 
    1885            1 :     struct RaGetIfattr config = {0};
    1886            1 :     config.phyId = devicePhyId;
    1887            1 :     config.nicPosition = static_cast<u32>(NICDeployment::NIC_DEPLOYMENT_DEVICE);
    1888            1 :     config.isAll = true;
    1889              : 
    1890            1 :     u32 nicNum = deviceType == DevType::DEV_TYPE_910_93 ? ALL_NIC_NUM_910_93 : ALL_NIC_NUM_910_A2;
    1891            1 :     u32 maxNicIpNum = HCCL_DEVICE_NIC_NUM * nicNum;
    1892              : 
    1893            1 :     u32 ifAddrNum = maxNicIpNum;
    1894            1 :     CHK_RET(hrtGetIfNum(config, ifAddrNum));
    1895            1 :     ifAddrNum = ifAddrNum > maxNicIpNum ? maxNicIpNum : ifAddrNum;
    1896            1 :     HCCL_RUN_INFO("[Get][DeviceAllNicIP]hrtGetIfNum success. ifAddrNum[%u].", ifAddrNum);
    1897              : 
    1898            1 :     if (ifAddrNum == 0) {
    1899            0 :         HCCL_WARNING("[Get][DeviceAllNicIP]device has no ip information, phyId[%u]", devicePhyId);
    1900            0 :         return HCCL_SUCCESS;
    1901              :     }
    1902              : 
    1903            1 :     struct InterfaceInfo ifAddrInfos[HCCL_DEVICE_NIC_NUM * MAX_ALL_NIC_NUM] = {0};
    1904            1 :     CHK_RET(hrtGetIfAddress(config, ifAddrInfos, ifAddrNum));
    1905            1 :     CHK_PRT_RET(ifAddrNum > maxNicIpNum,
    1906              :         HCCL_ERROR("[Get][DeviceAllNicIP]hrtGetIfAddress fail. ifAddrNum[%u] should be below %u", ifAddrNum,
    1907              :             maxNicIpNum), HCCL_E_TCP_CONNECT);
    1908              : 
    1909            1 :     unordered_map<string, size_t> ifname2Index;
    1910            2 :     for (u32 i = 0; i < ifAddrNum; i++) {
    1911              :         HcclInAddr temp;
    1912            1 :         temp.addr = ifAddrInfos[i].ifaddr.ip.addr;
    1913            1 :         temp.addr6 = ifAddrInfos[i].ifaddr.ip.addr6;
    1914            1 :         HcclIpAddress ipInfo(ifAddrInfos[i].family, temp);
    1915            1 :         CHK_PRT_RET(ipInfo.IsInvalid(), HCCL_ERROR("ip is invalid."), HCCL_E_PARA);
    1916            2 :         CHK_RET(ipInfo.SetIfName(ifAddrInfos[i].ifname));
    1917            1 :         CHK_RET(ipInfo.SetScopeID(ifAddrInfos[i].scopeId));
    1918            3 :         if (ifname2Index.find(ifAddrInfos[i].ifname) == ifname2Index.end()) {
    1919            1 :             ifname2Index.emplace(ifAddrInfos[i].ifname, ipAddr.size());
    1920            1 :             ipAddr.emplace_back(vector<HcclIpAddress>());
    1921              :         }
    1922            1 :         ipAddr[ifname2Index[ifAddrInfos[i].ifname]].push_back(ipInfo);
    1923            1 :         HCCL_RUN_INFO("[Get][DeviceAllNicIP]hrtGetIfAddress: idx[%u] ifname[%s] ip[%s]",
    1924              :             i, ifAddrInfos[i].ifname, ipInfo.GetReadableAddress());
    1925            1 :     }
    1926              : 
    1927            1 :     return HCCL_SUCCESS;
    1928            1 : }
    1929              : 
    1930          326 : HcclResult hrtRaGetInterfaceVersion(unsigned int phyId, unsigned int interfaceOpcode, unsigned int* interfaceVersion)
    1931              : {
    1932          326 :     HCCL_DEBUG("hrtRaGetInterfaceVersion phyId[%u], opCode[%u]", phyId, interfaceOpcode);
    1933          326 :     if (DlRaFunction::GetInstance().dlRaGetInterfaceVersion == nullptr) {
    1934          201 :         HCCL_WARNING("driver package does not support hrtRaGetInterfaceVersion, please change new package");
    1935          201 :         return HCCL_E_NOT_SUPPORT;
    1936              :     }
    1937          125 :     s32 ret = DlRaFunction::GetInstance().dlRaGetInterfaceVersion(phyId, interfaceOpcode, interfaceVersion);
    1938          125 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Get][InterfaceVersion]errNo[0x%016llx] ra get interface version fail. ret[%d]",
    1939              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
    1940          125 :     HCCL_INFO("hrtRaGetInterfaceVersion phyId[%u], opCode[%u], version[%u]",
    1941              :               phyId, interfaceOpcode, *interfaceVersion);
    1942          125 :     return HCCL_SUCCESS;
    1943              : }
    1944              : 
    1945            0 : HcclResult GetIsSupSockBatchCloseImmed(u32 phyId, bool& isSupportBatchClose)
    1946              : {
    1947            0 :     u32 batchCloseVersion = 0;
    1948            0 :     isSupportBatchClose = false;
    1949              :     // 获取版本号看是否兼容
    1950            0 :     HcclResult ret = hrtRaGetInterfaceVersion(phyId, SOCKET_BATCH_CLOSE_INTERFACE, &batchCloseVersion);
    1951            0 :     CHK_PRT_RET(ret == HCCL_E_NETWORK, HCCL_ERROR("[Get][IsSupSockBatchCloseImmed]comm base hrtRaGetInterfaceVersion "\
    1952              :         "failed, interface[%u]", SOCKET_BATCH_CLOSE_INTERFACE), ret);
    1953            0 :     if (ret == HCCL_E_NOT_SUPPORT) {
    1954            0 :         HCCL_WARNING("this package does not support hrtRaGetInterfaceVersion, please change new package");
    1955            0 :         return HCCL_SUCCESS;
    1956              :     }
    1957            0 :     if (batchCloseVersion >= SOCKET_BATCH_CLOSE_SUP_VER) {
    1958            0 :         isSupportBatchClose = true;
    1959              :     }
    1960            0 :     return HCCL_SUCCESS;
    1961              : }
    1962              : 
    1963            2 : HcclResult hrtRaCreateCq(RdmaHandle handle, struct CqAttr* attr)
    1964              : {
    1965            2 :     CHK_PTR_NULL(handle);
    1966            2 :     CHK_PTR_NULL(attr);
    1967            2 :     CHK_PTR_NULL(attr->ibSendCq);
    1968            2 :     CHK_PTR_NULL(attr->ibRecvCq);
    1969            2 :     CHK_PTR_NULL(attr->qpContext);
    1970            2 :     HCCL_DEBUG("ra create cq: sendCqDepth[%d], recvCqDepth[%d], sendCqEventId[%d], recvCqEventId[%d]",
    1971              :                attr->sendCqDepth, attr->recvCqDepth, attr->sendCqEventId, attr->recvCqEventId);
    1972            2 :     s32 ret = DlRaFunction::GetInstance().dlRaCreateCq(handle, attr);
    1973            2 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Create][RaCq]errNo[0x%016llx] ra create cq fail. return[%d] "\
    1974              :         "sendCqDepth[%d], recvCqDepth[%d], sendCqEventId[%d], recvCqEventId[%d]",\
    1975              :         HCCL_ERROR_CODE(HCCL_E_INTERNAL), ret, attr->sendCqDepth, attr->recvCqDepth, attr->sendCqEventId,\
    1976              :         attr->recvCqEventId), HCCL_E_INTERNAL);
    1977            2 :     return HCCL_SUCCESS;
    1978              : }
    1979              : 
    1980              : map<string, vector<CqInfo>> g_qpRecords;
    1981              : mutex g_qpRecordsMutex;
    1982            2 : HcclResult CreateCq(RdmaHandle rdmaHandle, CqInfo& cq)
    1983              : {
    1984            2 :     struct CqAttr attr = {};
    1985            2 :     attr.qpContext = &cq.context;
    1986            2 :     attr.ibSendCq = &cq.sq;
    1987            2 :     attr.ibRecvCq = &cq.rq;
    1988            2 :     attr.sendCqDepth = cq.depth;
    1989            2 :     attr.recvCqDepth = cq.depth;
    1990              : 
    1991            2 :     attr.sendCqEventId = cq.sqEvent;
    1992            2 :     attr.recvCqEventId = cq.rqEvent;
    1993            2 :     attr.sendChannel = cq.sendChannel;
    1994            2 :     attr.recvChannel = cq.recvChannel;
    1995            2 :     attr.srqContext = cq.srqContext;
    1996            2 :     CHK_RET(hrtRaCreateCq(rdmaHandle, &attr));
    1997            2 :     return HCCL_SUCCESS;
    1998              : }
    1999              : 
    2000            0 : HcclResult hrtRaDestroyCq(RdmaHandle handle, struct CqAttr* attr)
    2001              : {
    2002            0 :     CHK_PTR_NULL(handle);
    2003            0 :     CHK_PTR_NULL(attr);
    2004            0 :     s32 ret = DlRaFunction::GetInstance().dlRaDestroyCq(handle, attr);
    2005            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Destroy][RaCq]errNo[0x%016llx] ra destroy cq fail. ret[%d]",\
    2006              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
    2007            0 :     return HCCL_SUCCESS;
    2008              : }
    2009              : 
    2010            0 : HcclResult hrtRaNormalQpCreate(RdmaHandle handle, struct ibv_qp_init_attr* initAttr, QpHandle &qpHandle,
    2011              :     struct ibv_qp* &qp)
    2012              : {
    2013            0 :     CHK_PTR_NULL(handle);
    2014            0 :     CHK_PTR_NULL(initAttr);
    2015            0 :     HCCL_DEBUG("ra normal qp create: initAttr[%p]", initAttr);
    2016            0 :     s32 ret = DlRaFunction::GetInstance().dlRaNormalQpCreate(handle, initAttr, &qpHandle,
    2017              :         reinterpret_cast<void **>(&qp));
    2018              : 
    2019            0 :     std::string qpInfo = std::string("qp_type[") + std::to_string(initAttr->qp_type) + std::string("] ") +
    2020            0 :         std::string("max_inline_data[") + std::to_string(initAttr->cap.max_inline_data) + std::string("] ") +
    2021            0 :         std::string("max_send_wr[") + std::to_string(initAttr->cap.max_send_wr) + std::string("] ") +
    2022            0 :         std::string("max_send_sge[") + std::to_string(initAttr->cap.max_send_sge) + std::string("] ") +
    2023            0 :         std::string("max_recv_wr[") + std::to_string(initAttr->cap.max_recv_wr) + std::string("] ") +
    2024            0 :         std::string("max_recv_sge[") + std::to_string(initAttr->cap.max_recv_sge) + std::string("]");
    2025              : 
    2026            0 :     CHK_OOM_RET(ret, qpInfo.c_str());
    2027              : 
    2028            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Create][NormalQp]errNo[0x%016llx] ra create normal qp fail.ret[%d]"
    2029              :         "qp_type[%u] max_inline_data[%u] max_send_wr[%u] max_send_sge[%u] max_recv_wr[%u] max_recv_sge[%u]",\
    2030              :         HCCL_ERROR_CODE(HCCL_E_INTERNAL), ret, initAttr->qp_type, initAttr->cap.max_inline_data, initAttr->cap.max_send_wr,
    2031              :         initAttr->cap.max_send_sge, initAttr->cap.max_recv_wr, initAttr->cap.max_recv_sge), HCCL_E_INTERNAL);
    2032              : 
    2033            0 :     struct QpAttr attr{};
    2034            0 :     CHK_RET(hrtRaGetQpAttr(qpHandle, &attr));
    2035            0 :     s32 deviceId = 0;
    2036            0 :     if (hrtGetDevice(&deviceId) != HCCL_SUCCESS) {
    2037            0 :         deviceId = -1;
    2038              :     }
    2039            0 :     PLF_CONFIG_DEBUG(PLF_RES,
    2040              :         "Create Qp para: deviceId[%d] qpn[%u] qp_type[%u] max_inline_data[%u] max_send_wr[%u] max_send_sge[%u] "\
    2041              :         "max_recv_wr[%u] max_recv_sge[%u]", deviceId, attr.qpn, initAttr->qp_type, initAttr->cap.max_inline_data,
    2042              :         initAttr->cap.max_send_wr, initAttr->cap.max_send_sge, initAttr->cap.max_recv_wr, initAttr->cap.max_recv_sge);
    2043            0 :     return HCCL_SUCCESS;
    2044            0 : }
    2045              : 
    2046            0 : HcclResult hrtRaNormalQpDestroy(QpHandle qpHandle)
    2047              : {
    2048            0 :     struct QpAttr attr{};
    2049            0 :     CHK_RET(hrtRaGetQpAttr(qpHandle, &attr));
    2050            0 :     s32 deviceId = 0;
    2051            0 :     if (hrtGetDevice(&deviceId) != HCCL_SUCCESS) {
    2052            0 :         deviceId = -1;
    2053              :     }
    2054            0 :     PLF_CONFIG_DEBUG(PLF_RES, "Destroy Qp para: deviceId[%d] qpn[%u]", deviceId, attr.qpn);
    2055              : 
    2056            0 :     CHK_PTR_NULL(qpHandle);
    2057            0 :     s32 ret = DlRaFunction::GetInstance().dlRaNormalQpDestroy(qpHandle);
    2058            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Destroy][NormalQp]errNo[0x%016llx] ra destroy normal qp fail. ret[%d] qpHandle[%p]",\
    2059              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), ret, qpHandle), HCCL_E_NETWORK);
    2060            0 :     return HCCL_SUCCESS;
    2061              : }
    2062              : 
    2063            2 : HcclResult DestroyCq(RdmaHandle rdmaHandle, CqInfo& cq)
    2064              : {
    2065              :     struct CqAttr attr;
    2066            2 :     attr.qpContext = &cq.context;
    2067            2 :     attr.ibSendCq = &cq.sq;
    2068            2 :     attr.ibRecvCq = &cq.rq;
    2069            2 :     CHK_RET(hrtRaDestroyCq(rdmaHandle, &attr));
    2070            2 :     return HCCL_SUCCESS;
    2071              : }
    2072              : 
    2073            4 : HcclResult ConstructQpAttrs(s32 qpMode, struct QpExtAttrs &attrs, const QueueDepthAttr& qpDepth, bool isWorkFlowLib)
    2074              : {
    2075            4 :     HCCL_INFO("[ConstructQpAttrs][qpDepth]sendCqDepth[%u], recvCqDepth[%u], sqDepth[%u], rqDepth[%u]", qpDepth.sendCqDepth, qpDepth.recvCqDepth,
    2076              :         qpDepth.sqDepth, qpDepth.rqDepth);
    2077            4 :     CHK_PRT_RET(CheckQpDepth(qpDepth.sendCqDepth) != HCCL_SUCCESS,
    2078              :         HCCL_ERROR("[CheckQpDepth]sendCqDepth[%u] is invalid, sendCqDepth should be power of 2 and in [%u, %u]",
    2079              :         qpDepth.sendCqDepth, QP_DEPTH_MIN, QP_DEPTH_MAX);, HCCL_E_PARA);
    2080            4 :     CHK_PRT_RET(CheckQpDepth(qpDepth.recvCqDepth) != HCCL_SUCCESS,
    2081              :         HCCL_ERROR("[CheckQpDepth]recvCqDepth[%u] is invalid, recvCqDepth should be power of 2 and in [%u, %u]",
    2082              :         qpDepth.recvCqDepth, QP_DEPTH_MIN, QP_DEPTH_MAX);, HCCL_E_PARA);
    2083            4 :     CHK_PRT_RET(CheckQpDepth(qpDepth.sqDepth) != HCCL_SUCCESS,
    2084              :         HCCL_ERROR("[CheckQpDepth]sqDepth[%u] is invalid, sqDepth should be power of 2 and in [%u, %u]",
    2085              :         qpDepth.sqDepth, QP_DEPTH_MIN, QP_DEPTH_MAX);, HCCL_E_PARA);
    2086            4 :     CHK_PRT_RET(CheckQpDepth(qpDepth.rqDepth) != HCCL_SUCCESS,
    2087              :         HCCL_ERROR("[CheckQpDepth]rqDepth[%u] is invalid, rqDepth should be power of 2 and in [%u, %u]",
    2088              :         qpDepth.rqDepth, QP_DEPTH_MIN, QP_DEPTH_MAX);, HCCL_E_PARA);
    2089              : 
    2090            4 :     attrs.qpMode = qpMode;
    2091            4 :     attrs.version = QP_CREATE_WITH_ATTR_VERSION;
    2092            4 :     attrs.cqAttr.recvCqDepth = (qpDepth.recvCqDepth == INVALID_UINT) ? DEFAULT_MAX_RECV_CQ_DEPTH : qpDepth.recvCqDepth;
    2093            4 :     attrs.qpAttr.cap.max_inline_data = DEFAULT_MAX_INLINE_DATA;
    2094            4 :     attrs.qpAttr.cap.max_send_sge = DEFAULT_MAX_SEND_SGE;
    2095            4 :     attrs.qpAttr.cap.max_recv_wr = (qpDepth.rqDepth == INVALID_UINT) ? DEFAULT_MAX_RECV_WR : qpDepth.rqDepth;
    2096            4 :     attrs.qpAttr.cap.max_recv_sge = DEFAULT_MAX_RECV_SGE;
    2097            4 :     attrs.qpAttr.qp_type = IBV_QPT_RC;
    2098              : 
    2099            4 :     if (qpDepth.sqDepth == INVALID_UINT) {
    2100            4 :         if (qpMode == OFFLINE_QP_MODE_EXT || isWorkFlowLib) {
    2101            0 :             attrs.qpAttr.cap.max_send_wr = DEFAULT_OFFLINE_MAX_SEND_WR;
    2102              :         } else {
    2103            4 :             attrs.qpAttr.cap.max_send_wr = DEFAULT_OPBASE_MAX_SEND_WR;
    2104              :         }
    2105              :     } else {
    2106            0 :         attrs.qpAttr.cap.max_send_wr = qpDepth.sqDepth;
    2107              :     }
    2108            4 :     if (qpDepth.sendCqDepth == INVALID_UINT) {
    2109            4 :         attrs.cqAttr.sendCqDepth = DEFAULT_MAX_SEND_CQ_DEPTH;
    2110            4 :         if (qpMode == OFFLINE_QP_MODE_EXT || qpMode == OFFLINE_QP_MODE || isWorkFlowLib) {
    2111            0 :             attrs.cqAttr.sendCqDepth = HCCL_SEND_CQ_DEPTH_DEFAULT;
    2112              :         }
    2113              :     } else {
    2114            0 :         attrs.cqAttr.sendCqDepth = qpDepth.sendCqDepth;
    2115              :     }
    2116            4 :     HCCL_INFO("[ConstructQpAttrs][attr]sendCqDepth[%d], recvCqDepth[%d], max_send_wr[%u], max_recv_wr[%u]", attrs.cqAttr.sendCqDepth,
    2117              :         attrs.cqAttr.recvCqDepth, attrs.qpAttr.cap.max_send_wr, attrs.qpAttr.cap.max_recv_wr);
    2118            4 :     return HCCL_SUCCESS;
    2119              : }
    2120              : 
    2121            3 : HcclResult CreateQp(RdmaHandle rdmaHandle, int& flag, s32& qpMode, QpInfo& qp, bool isESMode)
    2122              : {
    2123            3 :     HCCL_INFO("CreateQp  qpMode[%d], isESMode[%d].", qpMode, isESMode);
    2124            3 :     if (isESMode && (qpMode == OFFLINE_QP_MODE_EXT || qpMode == OPBASE_QP_MODE_EXT)) {
    2125            0 :         struct QpExtAttrs attrs{};
    2126            0 :         QueueDepthAttr qpDepth{};
    2127            0 :         CHK_RET(ConstructQpAttrs(qpMode, attrs, qpDepth));
    2128            0 :         attrs.udpSport = 0x0;
    2129            0 :         attrs.qpAttr.cap.max_send_wr = HETEROG_OFFLINE_EXT_MAX_SEND_WR;
    2130            0 :         attrs.cqAttr.sendCqDepth = DEFAULT_MAX_ONE_SIDED_SEND_CQ_DEPTH;
    2131            0 :         CHK_RET(hrtRaQpCreateWithAttrs(rdmaHandle, &attrs, qp.qpHandle));
    2132            0 :     } else {
    2133            3 :         CHK_RET(HrtRaQpCreate(rdmaHandle, flag, qpMode, qp.qpHandle));
    2134              :     }
    2135              : 
    2136              :     // Hdc模式下HCCP不支持hrtRaGetQpContext接口
    2137            3 :     HcclResult ret = SetQpAttrQos(qp.qpHandle, qp.trafficClass, qp.serviceLevel);
    2138            3 :     if (ret != HCCL_SUCCESS) {
    2139            1 :         HCCL_ERROR("[CreateQp] SetQpAttrQos fail, ret[%d], destroy QP", ret);
    2140            1 :         HrtRaQpDestroy(qp.qpHandle);
    2141            1 :         return ret;
    2142              :     }
    2143              :     // 配置RDMA Timeout时间
    2144            2 :     ret = SetQpAttrTimeOut(qp.qpHandle);
    2145            2 :     if (ret != HCCL_SUCCESS) {
    2146            1 :         HCCL_ERROR("[CreateQp] SetQpAttrTimeOut fail, ret[%d], destroy QP", ret);
    2147            1 :         HrtRaQpDestroy(qp.qpHandle);
    2148            1 :         return ret;
    2149              :     }
    2150              :     // 配置RDMA Retry Cnt重传次数
    2151            1 :     ret = SetQpAttrRetryCnt(qp.qpHandle);
    2152            1 :     if (ret != HCCL_SUCCESS) {
    2153            1 :         HCCL_ERROR("[CreateQp] SetQpAttrRetryCnt fail, ret[%d], destroy QP", ret);
    2154            1 :         HrtRaQpDestroy(qp.qpHandle);
    2155            1 :         return ret;
    2156              :     }
    2157              : 
    2158            0 :     return HCCL_SUCCESS;
    2159              : }
    2160              : 
    2161            4 : HcclResult CreateNormalQp(RdmaHandle rdmaHandle, QpInfo& qp)
    2162              : {
    2163              :     struct ibv_qp_init_attr ibQpAttr;
    2164            4 :     CHK_SAFETY_FUNC_RET(memset_s(&ibQpAttr, sizeof(ibv_qp_init_attr), 0, sizeof(ibv_qp_init_attr)));
    2165            4 :     ibQpAttr.qp_context= qp.context;
    2166            4 :     ibQpAttr.send_cq = qp.sendCq;
    2167            4 :     ibQpAttr.recv_cq = qp.recvCq;
    2168            4 :     ibQpAttr.srq = qp.srq;
    2169            4 :     ibQpAttr.qp_type = IBV_QPT_RC;
    2170            4 :     ibQpAttr.cap.max_inline_data = MAX_INLINE_DATA;
    2171            4 :     ibQpAttr.cap.max_send_wr = qp.attr.maxWr;
    2172            4 :     ibQpAttr.cap.max_send_sge = qp.attr.maxSendSge;
    2173            4 :     ibQpAttr.cap.max_recv_wr = (qp.srq == nullptr ? qp.attr.maxWr : 0);
    2174            4 :     ibQpAttr.cap.max_recv_sge = (qp.srq == nullptr ? qp.attr.maxRecvSge : 0);
    2175            4 :     CHK_RET(hrtRaNormalQpCreate(rdmaHandle, &ibQpAttr, qp.qpHandle, qp.qp));
    2176            2 :     HcclResult ret = SetQpAttrQos(qp.qpHandle, qp.trafficClass, qp.serviceLevel);
    2177            2 :     if (ret != HCCL_SUCCESS) {
    2178            0 :         HCCL_ERROR("[CreateNormalQp] SetQpAttrQos fail, ret[%d], destroy QP", ret);
    2179            0 :         HrtRaQpDestroy(qp.qpHandle);
    2180            0 :         return ret;
    2181              :     }
    2182              :     // 配置RDMA Timeout时间
    2183            2 :     ret = SetQpAttrTimeOut(qp.qpHandle);
    2184            2 :     if (ret != HCCL_SUCCESS) {
    2185            1 :         HCCL_ERROR("[CreateNormalQp] SetQpAttrTimeOut fail, ret[%d], destroy QP", ret);
    2186            1 :         HrtRaQpDestroy(qp.qpHandle);
    2187            1 :         return ret;
    2188              :     }
    2189              :     // 配置RDMA Retry Cnt重传次数
    2190            1 :     ret = SetQpAttrRetryCnt(qp.qpHandle);
    2191            1 :     if (ret != HCCL_SUCCESS) {
    2192            1 :         HCCL_ERROR("[CreateNormalQp] SetQpAttrRetryCnt fail, ret[%d], destroy QP", ret);
    2193            1 :         HrtRaQpDestroy(qp.qpHandle);
    2194            1 :         return ret;
    2195              :     }
    2196              : 
    2197            0 :     return HCCL_SUCCESS;
    2198              : }
    2199              : 
    2200            1 : HcclResult CreateCqAndQp(RdmaHandle &rdmaHandle, string &label, QpConfig &config, QpInfo &info)
    2201              : {
    2202            1 :     unique_lock<mutex> lock(g_qpRecordsMutex);
    2203            1 :     bool createCq = false;
    2204            1 :     if (g_qpRecords[label].empty()) {
    2205            1 :         HCCL_INFO("create cq: label[%s] is empty, need create cq.", label.c_str());
    2206            1 :         createCq = true;
    2207            0 :     } else if ((g_qpRecords[label].back().depth - g_qpRecords[label].back().used) < config.maxWr) {
    2208            0 :         HCCL_INFO("create cq: label[%s] has %u qp, last cq used %u, need create cq.",
    2209              :             label.c_str(), g_qpRecords[label].size(), g_qpRecords[label].back().used);
    2210            0 :         createCq = true;
    2211              :     } else {
    2212            0 :         HCCL_INFO("create cq: label[%s] has %u qp, last cq used %u, not need create cq.",
    2213              :             label.c_str(), g_qpRecords[label].size(), g_qpRecords[label].back().used);
    2214              :     }
    2215              : 
    2216            1 :     if (createCq) {
    2217            1 :         CqInfo cq(nullptr, info.srqCq, nullptr, MAX_CQ_DEPTH, config.sqEvent, config.rqEvent, info.srqContext);
    2218            1 :         CHK_RET(CreateCq(rdmaHandle, cq));
    2219              :         QpInfo qp(config, rdmaHandle, nullptr, nullptr, cq.context, cq.sq, cq.rq, info.srq,
    2220            1 :             info.srqCq, info.srqContext);
    2221            1 :         HcclResult ret = CreateNormalQp(rdmaHandle, qp);
    2222            1 :         if (ret != HCCL_SUCCESS) {
    2223            1 :             HCCL_ERROR("[CreateCqAndQp] CreateNormalQp fail, ret[%d], destroy CQ", ret);
    2224            1 :             DestroyCq(rdmaHandle, cq);
    2225            1 :             return ret;
    2226              :         }
    2227              : 
    2228            0 :         cq.used += qp.attr.maxWr;
    2229            0 :         cq.qps.push_back(qp);
    2230            0 :         g_qpRecords[label].push_back(cq);
    2231            0 :         info = qp;
    2232            2 :     } else {
    2233            0 :         QpInfo qp(config, rdmaHandle, nullptr, nullptr, g_qpRecords[label].back().context,
    2234            0 :             g_qpRecords[label].back().sq, g_qpRecords[label].back().rq, info.srq, info.srqCq, info.srqContext);
    2235            0 :         CHK_RET(CreateNormalQp(rdmaHandle, qp));
    2236              : 
    2237            0 :         g_qpRecords[label].back().used += config.maxWr;
    2238            0 :         g_qpRecords[label].back().qps.push_back(qp);
    2239            0 :         info = qp;
    2240            0 :     }
    2241            0 :     return HCCL_SUCCESS;
    2242            1 : }
    2243              : 
    2244            0 : HcclResult CreateQpWithSharedCq(RdmaHandle rdmaHandle, HcclIpAddress &selfIp, HcclIpAddress &peerIp, s32 sqEvent,
    2245              :     s32 rqEvent, QpInfo &info, s32 qpAppend, u32 maxSegNum)
    2246              : {
    2247            0 :     QpConfig config(selfIp, peerIp, MAX_WR_NUM, maxSegNum, MAX_RECV_SGE_NUM, sqEvent, rqEvent);
    2248              : 
    2249            0 :     string label = string(selfIp.GetReadableIP()) + "_" + string(peerIp.GetReadableIP()) + "_" +
    2250            0 :         to_string(config.sqEvent) + "_" + to_string(config.rqEvent) + "_" + to_string(qpAppend);
    2251              : 
    2252            0 :     HCCL_RUN_INFO("CreateQpWithSharedCq selfIp[%s] peerIp[%s] maxWr[%u] maxSendSge[%u] maxRecvSge[%u]"
    2253              :         "sqEvent[%d] rqEvent[%d]", selfIp.GetReadableIP(), peerIp.GetReadableIP(),
    2254              :         config.maxWr, config.maxSendSge, config.maxRecvSge, config.sqEvent, config.rqEvent);
    2255            0 :     CHK_RET(CreateCqAndQp(rdmaHandle, label, config, info));
    2256            0 :     return HCCL_SUCCESS;
    2257            0 : }
    2258              : 
    2259            0 : HcclResult DestroyQpWithSharedCq(const QpInfo &info, s32 qpAppend)
    2260              : {
    2261            0 :     if (info.qpHandle == nullptr) {
    2262            0 :         return HCCL_SUCCESS;
    2263              :     }
    2264              : 
    2265            0 :     string label = string(info.attr.selfIp.GetReadableIP()) + "_" + string(info.attr.peerIp.GetReadableIP()) + "_" +
    2266            0 :         to_string(info.attr.sqEvent) + "_" + to_string(info.attr.rqEvent) + "_" + to_string(qpAppend);
    2267              : 
    2268            0 :     unique_lock<mutex> lock(g_qpRecordsMutex);
    2269            0 :     if (g_qpRecords[label].empty()) {
    2270            0 :         HCCL_ERROR("qp label[%s] no exist.", label.c_str());
    2271            0 :         return HCCL_E_PARA;
    2272              :     } else {
    2273            0 :         for (auto itCq = g_qpRecords[label].begin(); itCq != g_qpRecords[label].end(); itCq++) {
    2274            0 :             if ((*itCq).context == info.context) {
    2275            0 :                 for (auto itQp = (*itCq).qps.begin(); itQp != (*itCq).qps.end(); itQp++) {
    2276            0 :                     if ((*itQp).qpHandle == info.qpHandle) {
    2277            0 :                         HCCL_INFO("destroy qpHandle");
    2278            0 :                         CHK_RET(hrtRaNormalQpDestroy(info.qpHandle));
    2279            0 :                         (*itCq).qps.erase(itQp);
    2280            0 :                         if ((*itCq).used > info.attr.maxWr) {
    2281            0 :                             (*itCq).used -= info.attr.maxWr;
    2282            0 :                         } else if ((*itCq).used == info.attr.maxWr) {
    2283            0 :                             HCCL_INFO("destroy cq:%p", (*itCq).context);
    2284            0 :                             CHK_RET(DestroyCq(info.rdmaHandle, *itCq));
    2285            0 :                             g_qpRecords[label].erase(itCq);
    2286              :                         } else {
    2287            0 :                             HCCL_ERROR("DestroyQp: cq used[%u] should be greater than the qp maxwr[%u]", (*itCq).used,
    2288              :                                 info.attr.maxWr);
    2289            0 :                             return HCCL_E_PARA;
    2290              :                         }
    2291            0 :                         return HCCL_SUCCESS;
    2292              :                     }
    2293              :                 }
    2294            0 :                 HCCL_ERROR("DestroyQp: the qp is no exist");
    2295            0 :                 return HCCL_E_PARA;
    2296              :             }
    2297              :         }
    2298            0 :         HCCL_ERROR("DestroyQp: the cq is no exist");
    2299            0 :         return HCCL_E_PARA;
    2300              :     }
    2301            0 : }
    2302              : 
    2303            1 : HcclResult CreateQpWithCq(RdmaHandle rdmaHandle, s32 sqEvent, s32 rqEvent,
    2304              :     void *sendChannel, void *recvChannel, QpInfo &info, bool isHdcMode, bool isESMode)
    2305              : {
    2306            1 :     struct ibv_comp_channel *sChannel = reinterpret_cast<struct ibv_comp_channel *>(sendChannel);
    2307            1 :     struct ibv_comp_channel *rChannel = reinterpret_cast<struct ibv_comp_channel *>(recvChannel);
    2308              : 
    2309            1 :     QpConfig config(MAX_WR_NUM, MAX_SEND_SGE_NUM, MAX_RECV_SGE_NUM, sqEvent, rqEvent);
    2310              :     CqInfo cq(nullptr, nullptr, nullptr, MAX_CQ_DEPTH, config.sqEvent, config.rqEvent, info.srqContext,
    2311            1 :         sChannel, rChannel);
    2312            1 :     if (!isHdcMode) {
    2313              :         // hdc模式下hccp没有对外提供创建CQ的接口
    2314            1 :         CHK_RET(CreateCq(rdmaHandle, cq));
    2315              :     }
    2316              :     QpInfo qp(config, rdmaHandle, nullptr, nullptr, cq.context, cq.sq, cq.rq, info.srq, info.srqCq, info.srqContext,
    2317            1 :         sChannel, rChannel, info.trafficClass, info.serviceLevel);
    2318              : 
    2319            1 :     if (isHdcMode) {
    2320            0 :         CHK_RET(CreateQp(rdmaHandle, info.flag, info.qpMode, qp, isESMode));
    2321            0 :         info.qpHandle = qp.qpHandle;
    2322            0 :         info.qp = qp.qp;
    2323            0 :         info.sendCq = qp.sendCq;
    2324            0 :         info.recvCq = qp.recvCq;
    2325              :     } else {
    2326            1 :         HcclResult ret = CreateNormalQp(rdmaHandle, qp);
    2327            1 :         if (ret != HCCL_SUCCESS) {
    2328            1 :             HCCL_ERROR("[CreateQpWithCq] CreateNormalQp fail, ret[%d], destroy CQ", ret);
    2329            1 :             DestroyCq(rdmaHandle, cq);
    2330            1 :             return ret;
    2331              :         }
    2332            0 :         info = qp;
    2333              :     }
    2334            0 :     return HCCL_SUCCESS;
    2335            1 : }
    2336              : 
    2337            0 : HcclResult DestroyQpWithCq(const QpInfo& info, bool isHdcMode)
    2338              : {
    2339            0 :     if (info.qpHandle == nullptr) {
    2340            0 :         return HCCL_SUCCESS;
    2341              :     }
    2342              : 
    2343            0 :     if (isHdcMode) {
    2344            0 :         CHK_RET(HrtRaQpDestroy(info.qpHandle));
    2345              :     } else {
    2346            0 :         CHK_RET(hrtRaNormalQpDestroy(info.qpHandle));
    2347              :     }
    2348              : 
    2349            0 :     CqInfo cq;
    2350            0 :     cq.context = info.context;
    2351            0 :     cq.rq = info.recvCq;
    2352            0 :     cq.sq = info.sendCq;
    2353            0 :     if (!isHdcMode) {
    2354            0 :         CHK_RET(DestroyCq(info.rdmaHandle, cq));
    2355              :     }
    2356              : 
    2357            0 :     return HCCL_SUCCESS;
    2358            0 : }
    2359              : 
    2360            4 : HcclResult CreateAiQp(RdmaHandle rdmaHandle, struct AiQpInfo &aiQpInfo, QpInfo &info, u32 devicePhyId)
    2361              : {
    2362            4 :     struct QpExtAttrs attrs{};
    2363            4 :     QueueDepthAttr qpDepth{};
    2364            4 :     CHK_RET(ConstructQpAttrs(info.qpMode, attrs, qpDepth, false));
    2365            4 :     attrs.qpAttr.cap.max_send_wr = HETEROG_OFFLINE_EXT_MAX_SEND_WR;
    2366            4 :     attrs.cqAttr.sendCqDepth = DEFAULT_MAX_ONE_SIDED_SEND_CQ_DEPTH;
    2367            4 :     attrs.udpSport = 0;
    2368              : 
    2369            4 :     CHK_RET(hrtRaAiQpCreate(devicePhyId, rdmaHandle, &attrs, &aiQpInfo, info.qpHandle));
    2370              : 
    2371            4 :     HcclResult ret = SetQpAttrQos(info.qpHandle, info.trafficClass, info.serviceLevel);
    2372            4 :     if (ret != HCCL_SUCCESS) {
    2373            1 :         HCCL_ERROR("[CreateAiQp] SetQpAttrQos fail, ret[%d], destroy qpHandle", ret);
    2374            1 :         HrtRaQpDestroy(info.qpHandle);
    2375            1 :         return ret;
    2376              :     }
    2377            3 :     ret = SetQpAttrTimeOut(info.qpHandle);
    2378            3 :     if (ret != HCCL_SUCCESS) {
    2379            1 :         HCCL_ERROR("[CreateAiQp] SetQpAttrTimeOut fail, ret[%d], destroy qpHandle", ret);
    2380            1 :         HrtRaQpDestroy(info.qpHandle);
    2381            1 :         return ret;
    2382              :     }
    2383            2 :     ret = SetQpAttrRetryCnt(info.qpHandle);
    2384            2 :     if (ret != HCCL_SUCCESS) {
    2385            1 :         HCCL_ERROR("[CreateAiQp] SetQpAttrRetryCnt fail, ret[%d], destroy qpHandle", ret);
    2386            1 :         HrtRaQpDestroy(info.qpHandle);
    2387            1 :         return ret;
    2388              :     }
    2389              : 
    2390            1 :     info.qp = reinterpret_cast<struct ibv_qp *>(aiQpInfo.aiQpAddr);
    2391            1 :     if (info.qp == nullptr) {
    2392            1 :         HCCL_ERROR("info.qp is nullptr.");
    2393            1 :         HrtRaQpDestroy(info.qpHandle);
    2394            1 :         return HCCL_E_PARA;
    2395              :     }
    2396              : 
    2397            0 :     info.sendCq = reinterpret_cast<struct ibv_cq *>(aiQpInfo.aiScqAddr);
    2398            0 :     info.recvCq = reinterpret_cast<struct ibv_cq *>(aiQpInfo.aiRcqAddr);
    2399              : 
    2400            0 :     return HCCL_SUCCESS;
    2401              : }
    2402              : 
    2403            0 : HcclResult DestroyAiQp(const QpInfo &info)
    2404              : {
    2405            0 :     if (info.qpHandle == nullptr) {
    2406            0 :         return HCCL_SUCCESS;
    2407              :     }
    2408              : 
    2409            0 :     CHK_RET(HrtRaQpDestroy(info.qpHandle));
    2410              : 
    2411            0 :     return HCCL_SUCCESS;
    2412              : }
    2413              : 
    2414            0 : HcclResult hrtRaSetQpAttrQos(QpHandle qpHandle, struct QosAttr &attr)
    2415              : {
    2416            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSetQpAttrQos(qpHandle, &attr);
    2417            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Set][SqAttr]set qp attr qos failed tc[%u] sl[%u] ret[%d]",\
    2418              :         attr.tc, attr.sl, ret), HCCL_E_NETWORK);
    2419            0 :     return HCCL_SUCCESS;
    2420              : }
    2421              : 
    2422            0 : HcclResult hrtRaSetQpAttrTimeOut(QpHandle qpHandle, u32 &timeOut)
    2423              : {
    2424            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSetQpAttrTimeOut(qpHandle, &timeOut);
    2425            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Set][SqAttr]set qp attr timeout[%u s] failed ret[%d]",\
    2426              :         timeOut, ret), HCCL_E_NETWORK);
    2427            0 :     return HCCL_SUCCESS;
    2428              : }
    2429              : 
    2430            0 : HcclResult hrtRaSetQpAttrRetryCnt(QpHandle qpHandle, u32 &retryCnt)
    2431              : {
    2432            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSetQpAttrRetryCnt(qpHandle, &retryCnt);
    2433            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Set][SqAttr]set qp attr retrycnt[%u] failed ret[%d]",
    2434              :         retryCnt, ret), HCCL_E_NETWORK);
    2435            0 :     return HCCL_SUCCESS;
    2436              : }
    2437              : 
    2438            9 : HcclResult SetQpAttrQos(QpHandle qpHandle, u32 tc, u32 sl)
    2439              : {
    2440            9 :     struct QosAttr qosAttr = {0};
    2441            9 :     if (tc == HCCL_COMM_TRAFFIC_CLASS_CONFIG_NOT_SET && sl == HCCL_COMM_SERVICE_LEVEL_CONFIG_NOT_SET) {
    2442            0 :         qosAttr.tc = GetExternalInputRdmaTrafficClass();
    2443            0 :         qosAttr.sl = GetExternalInputRdmaServerLevel();
    2444            0 :         HCCL_INFO("[%s]set qp qos success by environment variable or default value, TC[%u] SL[%u]",
    2445              :             __func__, qosAttr.tc, qosAttr.sl);
    2446              :     } else {
    2447            9 :         qosAttr.tc = tc;
    2448            9 :         qosAttr.sl = sl;
    2449            9 :         HCCL_INFO("[%s]set qp qos success by config, TC[%u] SL[%u]", __func__, qosAttr.tc, qosAttr.sl);
    2450              :     }
    2451              : 
    2452            9 :     CHK_RET(hrtRaSetQpAttrQos(qpHandle, qosAttr));
    2453            7 :     HCCL_INFO("[%s]rdmaTrafficClass[%u], rdmaServerLevel[%u].", __func__, qosAttr.tc, qosAttr.sl);
    2454              : 
    2455            7 :     return HCCL_SUCCESS;
    2456              : }
    2457              : 
    2458            7 : HcclResult SetQpAttrTimeOut(QpHandle qpHandle)
    2459              : {
    2460            7 :     u32 rdmaTimeOut = GetExternalInputRdmaTimeOut();
    2461            7 :     CHK_RET(hrtRaSetQpAttrTimeOut(qpHandle, rdmaTimeOut));
    2462            4 :     HCCL_INFO("[SetQpAttrTimeOut]rdmaTimeOut[%u].", rdmaTimeOut);
    2463              : 
    2464            4 :     return HCCL_SUCCESS;
    2465              : }
    2466              : 
    2467            4 : HcclResult SetQpAttrRetryCnt(QpHandle qpHandle)
    2468              : {
    2469            4 :     u32 rdmaRetryCnt = GetExternalInputRdmaRetryCnt();
    2470            4 :     CHK_RET(hrtRaSetQpAttrRetryCnt(qpHandle, rdmaRetryCnt));
    2471            1 :     HCCL_INFO("[SetQpAttrRetryCnt]rdmaRetryCnt[%u].", rdmaRetryCnt);
    2472              : 
    2473            1 :     return HCCL_SUCCESS;
    2474              : }
    2475              : 
    2476            0 : HcclResult hrtRaCreateCompChannel(RdmaHandle rdmaHandle, void **compChannel)
    2477              : {
    2478            0 :     s32 ret = DlRaFunction::GetInstance().dlRaCreateCompChannel(rdmaHandle, compChannel);
    2479            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Create][CompChannel]errNo[0x%016llx] ra create comp channel fail. "
    2480              :         "return[%d], params: rdmaHandle[%p], compChannel[%p]", HCCL_ERROR_CODE(HCCL_E_NETWORK),
    2481              :         ret, rdmaHandle, compChannel), HCCL_E_NETWORK);
    2482              : 
    2483            0 :     return HCCL_SUCCESS;
    2484              : }
    2485              : 
    2486            0 : HcclResult hrtRaDestroyCompChannel(RdmaHandle rdmaHandle, void *compChannel)
    2487              : {
    2488            0 :     s32 ret = DlRaFunction::GetInstance().dlRaDestroyCompChannel(rdmaHandle, compChannel);
    2489            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Destroy][CompChannel]errNo[0x%016llx] ra destroy normal qp fail. "
    2490              :         "return[%d], params: rdmaHandle[%p], compChannel[%p]", HCCL_ERROR_CODE(HCCL_E_NETWORK),
    2491              :         ret, rdmaHandle, compChannel), HCCL_E_NETWORK);
    2492              : 
    2493            0 :     return HCCL_SUCCESS;
    2494              : }
    2495              : 
    2496            0 : HcclResult hrtRaGetCqeErrInfo(unsigned int phyId, struct CqeErrInfo *info)
    2497              : {
    2498            0 :     s32 ret = DlRaFunction::GetInstance().dlRaGetCqeErrInfo(phyId, info);
    2499            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[hrtRaGetCqeErrInfo]Get Cqe err info failed"), HCCL_E_NETWORK);
    2500            0 :     return HCCL_SUCCESS;
    2501              : }
    2502            0 : HcclResult hrtRaGetCqeErrInfoList(RdmaHandle rdmaHandle, struct CqeErrInfo *infolist, u32 *num)
    2503              : {
    2504            0 :     CHK_PTR_NULL(rdmaHandle);
    2505            0 :     CHK_PTR_NULL(DlRaFunction::GetInstance().dlRaGetCqeErrInfoList);
    2506            0 :     s32 ret = DlRaFunction::GetInstance().dlRaGetCqeErrInfoList(rdmaHandle, infolist, num);
    2507            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[dlRaGetCqeErrInfoList]Get Cqe err info list failed"), HCCL_E_NETWORK);
    2508            0 :     return HCCL_SUCCESS;
    2509              : }
    2510              : 
    2511            0 : HcclResult IsSuppCqeErrInfoListConfig(bool& supCqeErrInfoListConfig)
    2512              : {
    2513            0 :     u32 phyId = 0;  // phyId无实际意义,这里直接传入0
    2514            0 :     u32 configVersion = 0;
    2515            0 :     supCqeErrInfoListConfig = false;
    2516              : 
    2517              :     // 获取版本号查看是否兼容
    2518            0 :     HcclResult ret = hrtRaGetInterfaceVersion(phyId, CQE_ERR_INFO_LIST_INTERFACE, &configVersion);
    2519            0 :     CHK_PRT_RET(ret == HCCL_E_NETWORK, HCCL_ERROR("[IsSuppportCqeErrInfoListConfig]hrtRaGetInterfaceVersion "\
    2520              :         "failed, interface[%u]", CQE_ERR_INFO_INTERFACE), ret);
    2521            0 :     if (ret == HCCL_E_NOT_SUPPORT) {
    2522            0 :         HCCL_WARNING("this package does not support hrtRaGetInterfaceVersion, please change new package");
    2523            0 :         return HCCL_SUCCESS;
    2524              :     }
    2525              : 
    2526            0 :     if (configVersion >= CQE_ERR_INFO_SUP_VER) {
    2527            0 :         supCqeErrInfoListConfig = true;
    2528              :     }
    2529            0 :     HCCL_INFO("IsSuppportCqeErrInfoListConfig support:%d", supCqeErrInfoListConfig);
    2530            0 :     return HCCL_SUCCESS;
    2531              : }
    2532              : 
    2533            0 : HcclResult IsSupportRaSendNormalWrlist(bool& isSupportRaSendNormalWrlist)
    2534              : {
    2535            0 :     s32 deviceLogicID = -1;
    2536            0 :     u32 devicePhyId = 0;
    2537            0 :     CHK_RET(hrtGetDevice(&deviceLogicID));
    2538            0 :     CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(deviceLogicID), devicePhyId));
    2539            0 :     u32 configVersion = 0;
    2540            0 :     isSupportRaSendNormalWrlist = false;
    2541              :  
    2542              :     // 获取版本号查看是否兼容
    2543            0 :     HcclResult ret = hrtRaGetInterfaceVersion(devicePhyId, SEND_NORMAL_WRLIST, &configVersion);
    2544            0 :     CHK_PRT_RET(ret == HCCL_E_NETWORK, HCCL_ERROR("[IsSupportRaSendNormalWrlist]hrtRaGetInterfaceVersion "\
    2545              :         "failed, interface[%u]", CQE_ERR_INFO_INTERFACE), ret);
    2546            0 :     if (ret == HCCL_E_NOT_SUPPORT) {
    2547            0 :         HCCL_WARNING("this package does not support hrtRaGetInterfaceVersion, please change new package");
    2548            0 :         return HCCL_SUCCESS;
    2549              :     }
    2550              :  
    2551            0 :     if (configVersion >= SEND_NORMAL_WRLIST_VERSION) {
    2552            0 :         isSupportRaSendNormalWrlist = true;
    2553              :     }
    2554            0 :     HCCL_INFO("IsSupportRaSendNormalWrlist support:%d", isSupportRaSendNormalWrlist);
    2555            0 :     return HCCL_SUCCESS;
    2556              : }
    2557              :  
    2558              : 
    2559            6 : HcclResult hrtRaGetQpAttr(QpHandle qpHandle, struct QpAttr *attr)
    2560              : {
    2561            6 :     s32 ret = DlRaFunction::GetInstance().dlRaGetQpAttr(qpHandle, attr);
    2562            6 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Get qpn info failed"), HCCL_E_NETWORK);
    2563            6 :     return HCCL_SUCCESS;
    2564              : }
    2565              : 
    2566            0 : HcclResult hrtRaCreateSrq(RdmaHandle rdmaHandle, SrqInfo &srqInfo)
    2567              : {
    2568            0 :     struct SrqAttr attr = {nullptr};
    2569            0 :     attr.ibSrq = &srqInfo.srq;
    2570            0 :     attr.ibRecvCq = &srqInfo.srqCq;
    2571            0 :     attr.maxSge = MAX_RECV_SGE_NUM;
    2572            0 :     attr.context = &srqInfo.context;
    2573            0 :     attr.srqEventId = srqInfo.srqEvent;
    2574            0 :     attr.srqDepth = srqInfo.srqDepth;
    2575            0 :     attr.cqDepth = MAX_CQ_DEPTH;
    2576            0 :     s32 ret = DlRaFunction::GetInstance().dlRaCreateSrq(rdmaHandle, &attr);
    2577            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Create][Srq]errNo[0x%016llx] ra create srq fail. "
    2578              :         "return[%d], params: rdmaHandle[%p]", HCCL_ERROR_CODE(HCCL_E_NETWORK),
    2579              :         ret, rdmaHandle), HCCL_E_NETWORK);
    2580              : 
    2581            0 :     return HCCL_SUCCESS;
    2582              : }
    2583              : 
    2584            0 : HcclResult hrtRaDestroySrq(RdmaHandle rdmaHandle, SrqInfo &srqInfo)
    2585              : {
    2586            0 :     struct SrqAttr attr = {nullptr};
    2587            0 :     attr.context = &srqInfo.context;
    2588            0 :     attr.ibSrq = &srqInfo.srq;
    2589            0 :     s32 ret = DlRaFunction::GetInstance().dlRaDestroyeSrq(rdmaHandle, &attr);
    2590            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[Destroy][Srq]errNo[0x%016llx] ra destroy normal qp fail. "
    2591              :         "return[%d], params: rdmaHandle[%p]", HCCL_ERROR_CODE(HCCL_E_NETWORK),
    2592              :         ret, rdmaHandle), HCCL_E_NETWORK);
    2593            0 :     return HCCL_SUCCESS;
    2594              : }
    2595              : 
    2596           13 : HcclResult hrtRaCreateEventHandle(s32 &eventHandle)
    2597              : {
    2598           13 :     if (DlRaFunction::GetInstance().dlRaCreateEventHandle == nullptr) {
    2599            0 :         HCCL_ERROR("driver package does not support hrtRaCreateEventHandle, please change new package");
    2600            0 :         return HCCL_E_NOT_SUPPORT;
    2601              :     }
    2602           13 :     s32 ret = DlRaFunction::GetInstance().dlRaCreateEventHandle(&eventHandle);
    2603           13 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Create event handle failed, ret is [%d]", ret), HCCL_E_NETWORK);
    2604           13 :     return HCCL_SUCCESS;
    2605              : }
    2606              : 
    2607            0 : HcclResult hrtRaCtlEventHandle(s32 eventHandle, const FdHandle fdHandle, int opCode, HcclEpollEvent event)
    2608              : {
    2609            0 :     if (DlRaFunction::GetInstance().dlRaCtlEventHandle == nullptr) {
    2610            0 :         HCCL_ERROR("driver package does not support hrtRaCtlEventHandle, please change new package");
    2611            0 :         return HCCL_E_NOT_SUPPORT;
    2612              :     }
    2613            0 :     RaEpollEvent epollEvent = static_cast<RaEpollEvent>(event);
    2614            0 :     CHK_PRT_RET((epollEvent < RA_EPOLLIN) && (epollEvent >= RA_EPOLLINVALD),
    2615              :         HCCL_ERROR("epoll event[%d] is invalid", epollEvent), HCCL_E_NETWORK);
    2616            0 :     s32 ret = DlRaFunction::GetInstance().dlRaCtlEventHandle(eventHandle, fdHandle, opCode, epollEvent);
    2617            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Control event handle failed, ret is [%d]", ret), HCCL_E_NETWORK);
    2618            0 :     return HCCL_SUCCESS;
    2619              : }
    2620              : 
    2621            0 : HcclResult hrtRaWaitEventHandle(s32 eventHandle, std::vector<SocketEventInfo> &eventInfos, s32 timeOut,
    2622              :     u32 maxEvents, u32 &eventsNum)
    2623              : {
    2624            0 :     if (DlRaFunction::GetInstance().dlRaWaitEventHandle == nullptr) {
    2625            0 :         HCCL_ERROR("driver package does not support hrtRaWaitEventHandle, please change new package");
    2626            0 :         return HCCL_E_NOT_SUPPORT;
    2627              :     }
    2628            0 :     std::vector<struct SocketEventInfoT> raEventInfos(maxEvents);
    2629            0 :     s32 ret = DlRaFunction::GetInstance().dlRaWaitEventHandle(eventHandle, raEventInfos.data(), timeOut, maxEvents,
    2630              :         &eventsNum);
    2631            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Wait event handle failed, ret is [%d]", ret), HCCL_E_NETWORK);
    2632            0 :     for (u32 i = 0; i < eventsNum; i++) {
    2633            0 :         eventInfos[i].fdHandle = raEventInfos[i].fdHandle;
    2634              :     }
    2635            0 :     return HCCL_SUCCESS;
    2636            0 : }
    2637              : 
    2638           13 : HcclResult hrtRaDestroyEventHandle(s32 &eventHandle)
    2639              : {
    2640           13 :     if (DlRaFunction::GetInstance().dlRaDestroyEventHandle == nullptr) {
    2641            0 :         HCCL_ERROR("driver package does not support hrtRaDestroyEventHandle, please change new package");
    2642            0 :         return HCCL_E_NOT_SUPPORT;
    2643              :     }
    2644           13 :     s32 ret = DlRaFunction::GetInstance().dlRaDestroyEventHandle(&eventHandle);
    2645           13 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Destroy event handle failed, ret is [%d]", ret), HCCL_E_NETWORK);
    2646           13 :     return HCCL_SUCCESS;
    2647              : }
    2648              : 
    2649            0 : HcclResult hrtRaQpCreateWithAttrs(RdmaHandle rdmaHandle, struct QpExtAttrs *attrs, QpHandle &qpHandle)
    2650              : {
    2651            0 :     string qpInfo = string("rdmaHandle:[") + to_string(reinterpret_cast<intptr_t>(rdmaHandle)) + string("],qpHandle:[") +
    2652            0 :         to_string(reinterpret_cast<intptr_t>(&qpHandle)) + string("]; qp attr:[qpMode:") + to_string(attrs->qpMode) +
    2653            0 :         string(",udpSport:") + to_string(attrs->udpSport) + string(",version:") + to_string(attrs->version) +
    2654            0 :         string(",memAlign:") + to_string(attrs->memAlign) + string("]; cq attr: [sendCqDepth:") +
    2655            0 :         to_string(attrs->cqAttr.sendCqDepth) + string(",recvCqDepth:") + to_string(attrs->cqAttr.recvCqDepth) +
    2656            0 :         string(",sendCqCompVector:") + to_string(attrs->cqAttr.sendCqCompVector) +
    2657            0 :         string(",recvCqCompVector:") + to_string(attrs->cqAttr.recvCqCompVector) + string(",cap.max_send_wr:") +
    2658            0 :         to_string(attrs->qpAttr.cap.max_send_wr) + string(",cap.max_recv_wr:") +
    2659            0 :         to_string(attrs->qpAttr.cap.max_recv_wr) + "]";
    2660              : 
    2661            0 :     s32 ret = DlRaFunction::GetInstance().dlRaQpCreateWithAttrs(rdmaHandle, attrs, &qpHandle);
    2662            0 :     if (ret == ROCE_ENOMEM_RET && GetExternalInputRdmaFastPost()) {
    2663            0 :         HCCL_ERROR("[%s]create qp failed because of memory error, you can try to unset HCCL_RDMA_PCIE_DIRECT_POST_NOSTRICT and execute again",
    2664              :             __func__);
    2665              :     }
    2666              : 
    2667            0 :     CHK_OOM_RET(ret, qpInfo.c_str());
    2668              : 
    2669            0 :     CHK_PRT_RET(ret != 0 || (qpHandle == nullptr),
    2670              :         HCCL_ERROR("[Create][RaQp]errNo[0x%016llx] ra qp create with attrs fail. qpInfo:[%s], return: ret[%d]",
    2671              :         HCCL_ERROR_CODE(HCCL_E_NETWORK), qpInfo.c_str(), ret),
    2672              :         HCCL_E_NETWORK);
    2673              :     
    2674            0 :     struct QpAttr attr{};
    2675            0 :     CHK_RET(hrtRaGetQpAttr(qpHandle, &attr));
    2676            0 :     s32 deviceId = 0;
    2677            0 :     if (hrtGetDevice(&deviceId) != HCCL_SUCCESS) {
    2678            0 :         deviceId = -1;
    2679              :     }
    2680            0 :     PLF_CONFIG_DEBUG(PLF_RES, "Create Qp para: deviceId[%d] qpn[%u] qpInfo[%s]", deviceId, attr.qpn, qpInfo.c_str());
    2681            0 :     return HCCL_SUCCESS;
    2682            0 : }
    2683              : 
    2684            0 : HcclResult hrtRaQpCreateWithCQWithAttrs(RdmaHandle rdmaHandle, struct QpExtAttrs *attrs,
    2685              :     unsigned int sendCqn, unsigned int recvCqn, QpHandle &qpHandle)
    2686              : {
    2687            0 :     s32 ret = DlRaFunction::GetInstance().dlRaQpCreateWithCQWithAttrs(rdmaHandle, attrs, sendCqn, recvCqn, &qpHandle);
    2688            0 :     if (ret != 0 || qpHandle == nullptr) {
    2689            0 :         HCCL_ERROR("[Create][RaQpWithCQ] ra qp create with cq with attrs fail. ret[%d]", ret);
    2690            0 :         return HCCL_E_NETWORK;
    2691              :     }
    2692              : 
    2693            0 :     struct QpAttr attr{};
    2694            0 :     CHK_RET(hrtRaGetQpAttr(qpHandle, &attr));
    2695            0 :     s32 deviceId = 0;
    2696            0 :     if (hrtGetDevice(&deviceId) != HCCL_SUCCESS) {
    2697            0 :         deviceId = -1;
    2698              :     }
    2699            0 :     PLF_CONFIG_DEBUG(PLF_RES, "Create QpWithCQ para: deviceId[%d] qpn[%u]", deviceId, attr.qpn);
    2700            0 :     return HCCL_SUCCESS;
    2701              : }
    2702              : 
    2703            0 : HcclResult hrtRaAiQpCreate(u32 phyId, RdmaHandle rdmaHandle, struct QpExtAttrs *attrs,
    2704              :     struct AiQpInfo *info, QpHandle &qpHandle)
    2705              : {
    2706            0 :     u32 aiQpCreateVersion = 0;
    2707            0 :     HcclResult vRet = hrtRaGetInterfaceVersion(phyId, AI_QP_CREATE, &aiQpCreateVersion);
    2708            0 :     if (vRet != HCCL_SUCCESS || aiQpCreateVersion < AI_QP_CREATE_VERSION) {
    2709            0 :         HCCL_ERROR("this package does not support hrtRaAiQpCreate for device, please change new package");
    2710            0 :         return HCCL_E_NOT_SUPPORT;
    2711              :     }
    2712            0 :     s32 ret = DlRaFunction::GetInstance().dlRaAiQpCreate(rdmaHandle, attrs, info, &qpHandle);
    2713              : 
    2714            0 :     string qpInfo = string("qp attr:[qpMode:") + to_string(attrs->qpMode) +
    2715            0 :         string(",udpSport:") + to_string(attrs->udpSport) + string(",version:") + to_string(attrs->version) +
    2716            0 :         string(",memAlign:") + to_string(attrs->memAlign) + string("]; cq attr: [sendCqDepth:") +
    2717            0 :         to_string(attrs->cqAttr.sendCqDepth) + string(",recvCqDepth:") + to_string(attrs->cqAttr.recvCqDepth) +
    2718            0 :         string(",sendCqCompVector:") + to_string(attrs->cqAttr.sendCqCompVector) +
    2719            0 :         string(",recvCqCompVector:") + to_string(attrs->cqAttr.recvCqCompVector) + string(",cap.max_send_wr:") +
    2720            0 :         to_string(attrs->qpAttr.cap.max_send_wr) + string(",cap.max_recv_wr:") +
    2721            0 :         to_string(attrs->qpAttr.cap.max_recv_wr) + "]";
    2722              : 
    2723            0 :     CHK_OOM_RET(ret, qpInfo.c_str());
    2724              : 
    2725            0 :     CHK_PRT_RET(ret != 0 || (qpHandle == nullptr),
    2726              :         HCCL_ERROR("[Create][RaAiQp]errNo[0x%016llx] ra ai qp create fail. "
    2727              :                    "return: ret[%d]",
    2728              :             HCCL_ERROR_CODE(HCCL_E_NETWORK),
    2729              :             ret),
    2730              :         HCCL_E_NETWORK);
    2731              : 
    2732            0 :     struct QpAttr attr{};
    2733            0 :     CHK_RET(hrtRaGetQpAttr(qpHandle, &attr));
    2734            0 :     s32 deviceId = 0;
    2735            0 :     if (hrtGetDevice(&deviceId) != HCCL_SUCCESS) {
    2736            0 :         deviceId = -1;
    2737              :     }
    2738            0 :     PLF_CONFIG_DEBUG(PLF_RES,
    2739              :         "Create Qp para: deviceId[%d] qpn[%u] sq_depth[%u] rq_depth[%u] scq_depth[%u] rcq_depth[%u]",
    2740              :         deviceId, attr.qpn, attrs->qpAttr.cap.max_send_wr, attrs->qpAttr.cap.max_recv_wr,
    2741              :         attrs->cqAttr.sendCqDepth, attrs->cqAttr.recvCqDepth);
    2742            0 :     return HCCL_SUCCESS;
    2743            0 : }
    2744              : 
    2745            0 : HcclResult hrtRaRecvWrlist(QpHandle handle, struct RecvWrlistData *wr, unsigned int recvNum,
    2746              :     unsigned int *completeNum)
    2747              : {
    2748            0 :     if (DlRaFunction::GetInstance().dlRaRecvWrlist == nullptr) {
    2749            0 :         HCCL_ERROR("[Recv][RaWrlist]driver package does not support hrtRaRecvWrlist interface, "\
    2750              :             "please change new one");
    2751            0 :         return HCCL_E_NOT_SUPPORT;
    2752              :     }
    2753            0 :     s32 ret = 0;
    2754            0 :     auto startTime = std::chrono::steady_clock::now();
    2755            0 :     auto timeout = std::chrono::seconds(GetExternalInputHcclLinkTimeOut());
    2756            0 :     u32 remainNum = 0;
    2757            0 :     unsigned int completeNumLocal = 0;
    2758            0 :     *completeNum = 0;
    2759              :     while (true) {
    2760            0 :         if (remainNum == recvNum) {
    2761            0 :             break;
    2762              :         }
    2763              : 
    2764            0 :         ret = DlRaFunction::GetInstance().dlRaRecvWrlist(handle, wr + remainNum, recvNum, &completeNumLocal);
    2765            0 :         *completeNum += completeNumLocal;
    2766              : 
    2767            0 :         if (!ret) {
    2768            0 :             break;  // 成功跳出
    2769            0 :         } else if ((ret == SOCK_ENOENT) || (ret == SOCK_EAGAIN) ||
    2770            0 :             (GetWorkflowMode() == HcclWorkflowMode::HCCL_WORKFLOW_MODE_OP_BASE && ret == ROCE_ENOMEM)) {
    2771            0 :             remainNum += completeNumLocal;
    2772            0 :             bool bTimeout = ((std::chrono::steady_clock::now() - startTime) >= timeout);
    2773            0 :             CHK_PRT_RET(bTimeout, HCCL_ERROR("[Recv][RaWrList]errNo[0x%016llx] ra Recv wrlsit async timeout[%d s]. "\
    2774              :                 "return[%d], params: send_wrAddr[%p]",
    2775              :                 HCCL_ERROR_CODE(HCCL_E_ROCE_TRANSFER), timeout,  ret, wr), HCCL_E_ROCE_TRANSFER);
    2776            0 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
    2777              :         } else {
    2778            0 :             HCCL_ERROR("[Recv][RaWr]ra wr list Recv async fail. return[%d], para: Recv_wrAddr[%p]", ret, wr);
    2779            0 :             return HCCL_E_ROCE_TRANSFER; // 非-2/-11场景错误,不轮询,直接退出
    2780              :         }
    2781            0 :     }
    2782            0 :     return HCCL_SUCCESS;
    2783              : }
    2784              : 
    2785              : std::mutex g_deviceVnicIpMutex;
    2786              : map<u32, HcclIpAddress> g_deviceIdVnicInfoMap;   // 记录deviceid和vnic ip的关系,用于非超节点模式server内查询,避免重复查询
    2787              : map<u32, HcclIpAddress> g_sdidVnicInfoMap;       // 记录sdid和vnic ip的关系,用于超节点模式,避免重复查询
    2788          962 : HcclResult IsSuppportRaGetSocketVnicIps(bool& supportGetSocketVnicIp)
    2789              : {
    2790          962 :     u32 phyId = 0;  // phyId无实际意义,这里直接传入0
    2791          962 :     u32 supportGetSocketVnicIpVersion = 0;
    2792          962 :     supportGetSocketVnicIp = false;
    2793              :     // 获取版本号查看是否兼容
    2794          962 :     HcclResult ret = hrtRaGetInterfaceVersion(phyId, SOCKET_VNIC_IP_INFOS_INTERFACE, &supportGetSocketVnicIpVersion);
    2795          960 :     CHK_PRT_RET(ret == HCCL_E_NETWORK, HCCL_ERROR("[IsSuppportRaGetSocketVnicIps]hrtRaGetInterfaceVersion "\
    2796              :         "failed, interface[%u]", SOCKET_VNIC_IP_INFOS_INTERFACE), ret);
    2797          960 :     if (ret == HCCL_E_NOT_SUPPORT) {
    2798            2 :         HCCL_WARNING("this package does not support hrtRaGetInterfaceVersion, please change new package");
    2799            2 :         return HCCL_SUCCESS;
    2800              :     }
    2801              : 
    2802          958 :     if (supportGetSocketVnicIpVersion >= SOCKET_VNIC_IP_INFOS_SUP_VER) {
    2803          812 :         supportGetSocketVnicIp = true;
    2804              :     }
    2805              : 
    2806          958 :     return HCCL_SUCCESS;
    2807              : }
    2808              : 
    2809          807 : HcclResult hrtRaGetSocketVnicIpInfos(u32 phyId, enum IdType type, vector<u32> deviceIds,
    2810              :     vector<HcclIpAddress> &vnicIPs)
    2811              : {
    2812          807 :     u32 vnicIpNum = deviceIds.size();
    2813          809 :     CHK_PRT_RET(vnicIpNum == 0, HCCL_ERROR("[hrtRaGetSocketVnicIpInfos]ra get VnicIp para error, num[%u]", vnicIpNum),
    2814              :         HCCL_E_PARA);
    2815          809 :     unique_lock<mutex> lock(g_deviceVnicIpMutex);
    2816          814 :     std::map<u32, HcclIpAddress> &vnicInfoMap = (type == PHY_ID_VNIC_IP) ? g_deviceIdVnicInfoMap : g_sdidVnicInfoMap;
    2817         1628 :     for (u32 i = 0; i < vnicIpNum; i++) {
    2818          814 :         HcclIpAddress vnicIP;
    2819          814 :         auto iter = vnicInfoMap.find(deviceIds[i]);
    2820              :         // 缓存查找到,直接从缓存获取
    2821          814 :         if (iter != vnicInfoMap.end()) {
    2822          806 :             vnicIP = iter->second;
    2823          806 :             HCCL_INFO("[hrtRaGetSocketVnicIpInfos] vnicInfoMap deviceIds[%u] found, Ip[%s]",
    2824              :                 deviceIds[i], vnicIP.GetReadableAddress());
    2825              :         } else {
    2826            8 :             struct IpInfo vnicIpInfo = {};
    2827            8 :             s32 sRet = memset_s(&vnicIpInfo, sizeof(IpInfo), 0, sizeof(IpInfo));
    2828            8 :             CHK_PRT_RET(sRet != EOK,
    2829              :                 HCCL_ERROR("[hrtRaGetSocketVnicIpInfos]errNo[0x%016llx] memset vnicIpInfo to 0 failed."
    2830              :                 "params: dest[%p], dest_size[%zu], count[%zu]",
    2831              :                 HCCL_ERROR_CODE(HCCL_E_SYSCALL), &vnicIpInfo, sizeof(IpInfo), sizeof(IpInfo)),
    2832              :                 HCCL_E_SYSCALL);
    2833            8 :             s32 ret = DlRaFunction::GetInstance().dlRaGetSocketVnicIpInfos(phyId, type, &deviceIds[i], 1, &vnicIpInfo);
    2834            8 :             CHK_PRT_RET(ret != 0,
    2835              :                 HCCL_ERROR("[hrtRaGetSocketVnicIpInfo]errNo[0x%016llx] ra get VnicIpfail. ret[%d]",
    2836              :                 HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret),
    2837              :                 HCCL_E_TCP_CONNECT);
    2838              : 
    2839              :             HcclInAddr temp;
    2840            8 :             temp.addr = vnicIpInfo.ip.addr;
    2841            8 :             temp.addr6 = vnicIpInfo.ip.addr6;
    2842            8 :             HcclIpAddress ipInfo(vnicIpInfo.family, temp);
    2843            8 :             CHK_PRT_RET(ipInfo.IsInvalid(), HCCL_ERROR("ip is invalid."), HCCL_E_PARA);
    2844            8 :             vnicInfoMap.insert({ deviceIds[i], ipInfo });
    2845            8 :             vnicIP = ipInfo;
    2846            8 :             HCCL_INFO("[hrtRaGetSocketVnicIpInfos] add vnicInfoMap, deviceIds[%u], Ip[%s]",
    2847              :                 deviceIds[i], vnicIP.GetReadableAddress());
    2848            8 :         }
    2849          814 :         vnicIPs.push_back(vnicIP);
    2850          814 :     }
    2851          814 :     return HCCL_SUCCESS;
    2852          814 : }
    2853              : 
    2854          213 : HcclResult H2DTlvInit(struct TlvInitInfo *init_info, uint32_t *buffer_size, void **tlv_handle)
    2855              : {
    2856          213 :     u32 tlvVersion = 0;
    2857          213 :     u32 phyId = 0;  // phyId无实际意义,这里直接传入0
    2858          213 :     HcclResult vRet = hrtRaGetInterfaceVersion(phyId, TLV_INIT, &tlvVersion);
    2859          213 :     if (vRet != HCCL_SUCCESS || tlvVersion < TLV_VERSION) {
    2860          212 :         HCCL_WARNING("this package does not support H2DTlvInit for device, please change new package");
    2861          212 :         return HCCL_E_NOT_SUPPORT;
    2862              :     }
    2863              :  
    2864            1 :     s32 ret = DlRaFunction::GetInstance().dlH2DTlvInit(init_info, buffer_size, tlv_handle);
    2865            1 :     CHK_PRT_RET(ret != 0, HCCL_WARNING("[H2DTlvInit]errNo[0x%016llx] dlH2DTlvInit fail. "
    2866              :             "return: ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
    2867            1 :     return HCCL_SUCCESS;
    2868              : }
    2869              :  
    2870            0 : HcclResult H2DTlvRequest(void *tlv_handle, unsigned int module_type, struct TlvMsg *send_msg, struct TlvMsg *recv_msg)
    2871              : {
    2872            0 :     u32 tlvVersion = 0;
    2873            0 :     u32 phyId = 0;  // phyId无实际意义,这里直接传入0
    2874            0 :     HcclResult vRet = hrtRaGetInterfaceVersion(phyId, TLV_REQUEST, &tlvVersion);
    2875            0 :     if (vRet != HCCL_SUCCESS || tlvVersion < TLV_VERSION) {
    2876            0 :         HCCL_WARNING("this package does not support H2DTlvRequest for device, please change new package");
    2877            0 :         return HCCL_E_NOT_SUPPORT;
    2878              :     }
    2879              : 
    2880            0 :     if (DlRaFunction::GetInstance().dlH2DTlvRequest == nullptr) {
    2881            0 :         HCCL_WARNING("driver package does not support H2DTlvRequest, please change new package");
    2882            0 :         return HCCL_E_NOT_SUPPORT;
    2883              :     }
    2884              :  
    2885            0 :     s32 ret = DlRaFunction::GetInstance().dlH2DTlvRequest(tlv_handle, module_type, send_msg, recv_msg);
    2886            0 :     CHK_PRT_RET(ret != 0, HCCL_WARNING("[H2DTlvRequest]errNo[0x%016llx] dlH2DTlvRequest fail. module_type[%u]"
    2887              :             "return: ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), module_type, ret), HCCL_E_NETWORK);
    2888            0 :     return HCCL_SUCCESS;
    2889              : }
    2890              :  
    2891            0 : HcclResult H2DTlvDeinit(void *tlv_handle)
    2892              : {
    2893            0 :     u32 tlvVersion = 0;
    2894            0 :     u32 phyId = 0;  // phyId无实际意义,这里直接传入0
    2895            0 :     HcclResult vRet = hrtRaGetInterfaceVersion(phyId, TLV_DEINIT, &tlvVersion);
    2896            0 :     if (vRet != HCCL_SUCCESS || tlvVersion < TLV_VERSION) {
    2897            0 :         HCCL_WARNING("this package does not support H2DTlvDeinit for device, please change new package");
    2898            0 :         return HCCL_E_NOT_SUPPORT;
    2899              :     }
    2900              :  
    2901            0 :     s32 ret = DlRaFunction::GetInstance().dlH2DTlvDeinit(tlv_handle);
    2902            0 :     CHK_PRT_RET(ret != 0, HCCL_WARNING("[H2DTlvDeinit]errNo[0x%016llx] ra tlv deinit fail. "
    2903              :             "return: ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
    2904            0 :     return HCCL_SUCCESS;
    2905              : }
    2906              : 
    2907          962 : HcclResult hrtRaGetSingleSocketVnicIpInfo(u32 phyId, DeviceIdType deviceIdType, u32 deviceId,
    2908              :     HcclIpAddress &vnicIP)
    2909              : {
    2910          962 :     bool supportGetSocketVnicIp = false;
    2911          962 :     IsSuppportRaGetSocketVnicIps(supportGetSocketVnicIp);
    2912          959 :     if (!supportGetSocketVnicIp) {
    2913              :         // 非超节点场景,如果不支持查询vnicip,返回成功,继续使用phyid作为vnicip; 超节点如不支持,返错退出
    2914          148 :         return (deviceIdType == DeviceIdType::DEVICE_ID_TYPE_PHY_ID) ? (HCCL_SUCCESS) : (HCCL_E_NOT_SUPPORT);
    2915              :     }
    2916          811 :     std::vector<u32> deviceIds;
    2917          812 :     vector<HcclIpAddress> vnicIPs;
    2918          812 :     IdType idType = static_cast<IdType>(deviceIdType);
    2919          812 :     deviceIds.push_back(deviceId);
    2920          808 :     CHK_RET(hrtRaGetSocketVnicIpInfos(phyId, idType, deviceIds, vnicIPs));
    2921          814 :     vnicIP = vnicIPs[0];
    2922          814 :     HCCL_INFO("Get available Vnic info success, phyId[%u], deviceIdType[%d], deviceId[0x%x], Vnic ip[%s]", phyId, idType, deviceId,
    2923              :         vnicIP.GetReadableAddress());
    2924          814 :     return HCCL_SUCCESS;
    2925          814 : }
    2926              : 
    2927            2 : HcclResult hrtRaPingInit(struct PingInitAttr *initAttr, struct PingInitInfo *initInfo, void **pingHandle)
    2928              : {
    2929            2 :     if (DlRaFunction::GetInstance().dlRaPingInit == nullptr) {
    2930            1 :         HCCL_ERROR("driver package does not support hrtRaPingInit, please change new package");
    2931            1 :         return HCCL_E_NOT_SUPPORT;
    2932              :     }
    2933            1 :     s32 ret = DlRaFunction::GetInstance().dlRaPingInit(initAttr, initInfo, pingHandle);
    2934            1 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Rping init failed, ret is [%d]", ret), HCCL_E_NOT_SUPPORT);
    2935            1 :     return HCCL_SUCCESS;
    2936              : }
    2937              : 
    2938            2 : HcclResult hrtRaPingDeinit(void *pingHandle)
    2939              : {
    2940            2 :     if (DlRaFunction::GetInstance().dlRaPingDeinit == nullptr) {
    2941            1 :         HCCL_ERROR("driver package does not support hrtRaPingDeinit, please change new package");
    2942            1 :         return HCCL_E_NOT_SUPPORT;
    2943              :     }
    2944            1 :     s32 ret = DlRaFunction::GetInstance().dlRaPingDeinit(pingHandle);
    2945            1 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Rping deinit failed, ret is [%d]", ret), HCCL_E_NOT_SUPPORT);
    2946            1 :     return HCCL_SUCCESS;
    2947              : }
    2948              : 
    2949            2 : HcclResult hrtRaPingTargetAdd(void *pingHandle, struct PingTargetInfo target[], uint32_t num)
    2950              : {
    2951            2 :     if (DlRaFunction::GetInstance().dlRaPingTargetAdd == nullptr) {
    2952            1 :         HCCL_ERROR("driver package does not support hrtRaPingTargetAdd, please change new package");
    2953            1 :         return HCCL_E_NOT_SUPPORT;
    2954              :     }
    2955            1 :     s32 ret = DlRaFunction::GetInstance().dlRaPingTargetAdd(pingHandle, target, num);
    2956            1 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Rping add target failed, ret is [%d], num[%u]", ret, num), HCCL_E_NOT_SUPPORT);
    2957            1 :     return HCCL_SUCCESS;
    2958              : }
    2959              : 
    2960            2 : HcclResult hrtRaPingTargetDel(void *pingHandle, struct PingTargetCommInfo target[], uint32_t num)
    2961              : {
    2962            2 :     if (DlRaFunction::GetInstance().dlRaPingTargetDel == nullptr) {
    2963            1 :         HCCL_ERROR("driver package does not support hrtRaPingTargetDel, please change new package");
    2964            1 :         return HCCL_E_NOT_SUPPORT;
    2965              :     }
    2966            1 :     s32 ret = DlRaFunction::GetInstance().dlRaPingTargetDel(pingHandle, target, num);
    2967            1 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Rping delete target failed, ret is [%d], num[%u]", ret, num), HCCL_E_NOT_SUPPORT);
    2968            1 :     return HCCL_SUCCESS;
    2969              : }
    2970              : 
    2971            2 : HcclResult hrtRaPingTaskStart(void *pingHandle, struct PingTaskAttr *attr)
    2972              : {
    2973            2 :     if (DlRaFunction::GetInstance().dlRaPingTaskStart == nullptr) {
    2974            1 :         HCCL_ERROR("driver package does not support hrtRaPingTaskStart, please change new package");
    2975            1 :         return HCCL_E_NOT_SUPPORT;
    2976              :     }
    2977            1 :     s32 ret = DlRaFunction::GetInstance().dlRaPingTaskStart(pingHandle, attr);
    2978            1 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Rping start task failed, ret is [%d]", ret), HCCL_E_NOT_SUPPORT);
    2979            1 :     return HCCL_SUCCESS;
    2980              : }
    2981              : 
    2982            2 : HcclResult hrtRaPingTaskStop(void *pingHandle)
    2983              : {
    2984            2 :     if (DlRaFunction::GetInstance().dlRaPingTaskStop == nullptr) {
    2985            1 :         HCCL_ERROR("driver package does not support hrtRaPingTaskStop, please change new package");
    2986            1 :         return HCCL_E_NOT_SUPPORT;
    2987              :     }
    2988            1 :     s32 ret = DlRaFunction::GetInstance().dlRaPingTaskStop(pingHandle);
    2989            1 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Rping stop task failed, ret is [%d]", ret), HCCL_E_NOT_SUPPORT);
    2990            1 :     return HCCL_SUCCESS;
    2991              : }
    2992              : 
    2993            2 : HcclResult hrtRaPingGetResults(void *pingHandle, struct PingTargetResult target[], uint32_t *num)
    2994              : {
    2995            2 :     if (DlRaFunction::GetInstance().dlRaPingGetResults == nullptr) {
    2996            1 :         HCCL_ERROR("driver package does not support hrtRaPingGetResults, please change new package");
    2997            1 :         return HCCL_E_NOT_SUPPORT;
    2998              :     }
    2999            1 :     s32 ret = DlRaFunction::GetInstance().dlRaPingGetResults(pingHandle, target, num);
    3000            1 :     CHK_PRT_RET(ret == ROCE_EAGAIN, HCCL_WARNING("Rping get results busy, try again", ret), HCCL_E_AGAIN);
    3001            1 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("Rping get results failed, ret is [%d]", ret), HCCL_E_NOT_SUPPORT);
    3002            1 :     return HCCL_SUCCESS;
    3003              : }
    3004              : 
    3005            1 : HcclResult hrtRaIsFirstUsed(s32 insId, bool &used)
    3006              : {
    3007            1 :     CHK_SMART_PTR_NULL(DlRaFunction::GetInstance().dlRaIsFirstUsed);
    3008            1 :     s32 ret = DlRaFunction::GetInstance().dlRaIsFirstUsed(insId);
    3009              : 
    3010            1 :     CHK_PRT_RET(ret != 0 && (ret != static_cast<s32>(true)), HCCL_ERROR("[hrtRaIsFirstUsed]errNo[0x%016llx] "
    3011              :         "failed ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
    3012              : 
    3013            1 :     used = ret == 0 ? false : true;
    3014              : 
    3015            1 :     HCCL_DEBUG("hrtRaIsFirstUsed insId[%d] success.", insId);
    3016            1 :     return HCCL_SUCCESS;
    3017              : }
    3018              : 
    3019            0 : HcclResult hrtRaIsLastUsed(s32 insId, bool &used)
    3020              : {
    3021            0 :     CHK_SMART_PTR_NULL(DlRaFunction::GetInstance().dlRaIsLastUsed);
    3022            0 :     s32 ret = DlRaFunction::GetInstance().dlRaIsLastUsed(insId);
    3023              : 
    3024            0 :     CHK_PRT_RET(ret != 0 && (ret != static_cast<s32>(true)), HCCL_ERROR("[hrtRaIsLastUsed]errNo[0x%016llx] "
    3025              :         "failed ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
    3026              : 
    3027            0 :     used = ret == 0 ? false : true;
    3028              : 
    3029            0 :     HCCL_DEBUG("hrtRaIsLastUsed insId[%d] success.", insId);
    3030            0 :     return HCCL_SUCCESS;
    3031              : }
    3032              : 
    3033            0 : HcclResult hrtRaRdevGetPortStatus(RdmaHandle rdmaHandle, enum PortStatus *status)
    3034              : {
    3035            0 :     CHK_PTR_NULL(rdmaHandle);
    3036            0 :     CHK_SMART_PTR_NULL(DlRaFunction::GetInstance().dlRaRdevGetPortStatus);
    3037            0 :     s32 ret = DlRaFunction::GetInstance().dlRaRdevGetPortStatus(rdmaHandle, status);
    3038              : 
    3039            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[hrtRaRdevGetPortStatus]errNo[0x%016llx] "
    3040              :         "failed ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
    3041            0 :     return HCCL_SUCCESS;
    3042              : }
    3043              : 
    3044            0 : HcclResult HrtRaRemapMr(RdmaHandle rdmaHandle, struct MemRemapInfo info[], unsigned int num)
    3045              : {
    3046            0 :     CHK_PTR_NULL(rdmaHandle);
    3047            0 :     if (UNLIKELY(DlRaFunction::GetInstance().dlRaRemapMr == nullptr)) {
    3048            0 :         HCCL_ERROR("driver package does not support HrtRaRemapMr, please change new package");
    3049            0 :         return HCCL_E_NETWORK;
    3050              :     };
    3051            0 :     s32 ret = DlRaFunction::GetInstance().dlRaRemapMr(rdmaHandle, info, num);
    3052              : 
    3053            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[HrtRaRemapMr]errNo[0x%016llx] "
    3054              :         "failed ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
    3055            0 :     return HCCL_SUCCESS;
    3056              : }
    3057              : 
    3058           11 : HcclResult CreateQpWithDepthConfig(RdmaHandle rdmaHandle, s32 qpMode, const QpConfigInfo& qpConfig, QpHandle &qpHandle, struct TypicalQp& qpInfo)
    3059              : {
    3060           11 :     HCCL_DEBUG("CreateQp qpMode[%d], sq_depth[%u], rq_depth[%u], scq_depth[%u], rcq_depth[%u], TC[%u], SL[%u], rdmaRetryCnt[%u], rdmaTimeOut[%u]",
    3061              :         qpMode, qpConfig.sq_depth, qpConfig.rq_depth, qpConfig.scq_depth, qpConfig.rcq_depth, qpInfo.tc, qpInfo.sl, qpInfo.retryCnt,
    3062              :         qpInfo.retryTime);
    3063              :     
    3064           11 :     struct QpExtAttrs ext_attrs{};
    3065           11 :     ext_attrs.qpMode = qpMode;
    3066           11 :     ext_attrs.cqAttr.sendCqDepth = qpConfig.scq_depth;
    3067           11 :     ext_attrs.cqAttr.recvCqDepth = qpConfig.rcq_depth;
    3068           11 :     ext_attrs.qpAttr.cap.max_send_wr = qpConfig.sq_depth;
    3069           11 :     ext_attrs.qpAttr.cap.max_recv_wr = qpConfig.rq_depth;
    3070           11 :     ext_attrs.version = QP_CREATE_WITH_ATTR_VERSION;
    3071           11 :     ext_attrs.qpAttr.cap.max_inline_data = DEFAULT_MAX_INLINE_DATA;
    3072           11 :     ext_attrs.qpAttr.cap.max_send_sge = DEFAULT_MAX_SEND_SGE;
    3073           11 :     ext_attrs.qpAttr.cap.max_recv_sge = DEFAULT_MAX_RECV_SGE;
    3074           11 :     ext_attrs.qpAttr.qp_type = IBV_QPT_RC;
    3075           11 :     ext_attrs.udpSport = 0x0;
    3076           11 :     ext_attrs.cstmFlag.bs.useResvMem = qpConfig.use_resv_mem;
    3077           11 :     ext_attrs.resvMemPoolId = qpConfig.resv_mem_pool_id;
    3078           11 :     s32 deviceLogicID = -1;
    3079           11 :     u32 devicePhyId = 0;
    3080           11 :     CHK_RET(hrtGetDevice(&deviceLogicID));
    3081           11 :     u32 typicalQpModifyVersion = 0;
    3082           11 :     CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(deviceLogicID), devicePhyId));
    3083              :     // ra_qp_create_with_attrs创建的QP, 后续要使用ra_typical_qp_modify 需要判断ra_typical_qp_modify对应opcode:RA_RS_TYPICAL_QP_MODIFY是否支持支持QP解耦socket建链
    3084           11 :     HcclResult vRet = hrtRaGetInterfaceVersion(devicePhyId, TYPICAL_QP_MODIFY, &typicalQpModifyVersion);
    3085           11 :     if (vRet != HCCL_SUCCESS || typicalQpModifyVersion < TYPICAL_QP_MODIFY_VERSION) {
    3086            2 :         HCCL_ERROR("this package does not support CreateQpWithDepthConfig for device, please change new package");
    3087            2 :         return HCCL_E_NOT_SUPPORT;
    3088              :     }
    3089              : 
    3090            9 :     CHK_RET(hrtRaQpCreateWithAttrs(rdmaHandle, &ext_attrs, qpHandle));
    3091              : 
    3092            9 :     struct QpAttr attr{};
    3093            9 :     HcclResult ret = hrtRaGetQpAttr(qpHandle, &attr);
    3094            9 :     if (ret != HCCL_SUCCESS) {
    3095            0 :         HCCL_ERROR("[CreateQpWithDepthConfig] hrtRaGetQpAttr failed, ret[%d].", ret);
    3096            0 :         HrtRaQpDestroy(qpHandle);
    3097            0 :         return ret;
    3098              :     }
    3099            9 :     qpInfo.qpn = attr.qpn;
    3100            9 :     qpInfo.gidIdx = attr.gidIdx;
    3101          153 :     for (uint32_t i = 0; i < HCCP_GID_RAW_LEN; i++) {
    3102          144 :         qpInfo.gid[i] = attr.gid[i];
    3103              :     }
    3104            9 :     qpInfo.psn = attr.psn;
    3105            9 :     HCCL_DEBUG("CreateQpWithDepthConfig qpn[%u], gidIdx[%u], psn[%u]", qpInfo.qpn, qpInfo.gidIdx, qpInfo.psn);
    3106            9 :     return HCCL_SUCCESS;
    3107              : }
    3108              : 
    3109            0 : HcclResult CreateQpWithCQConfig(RdmaHandle rdmaHandle, s32 qpMode, const QpConfigWithCQInfo& qpConfig,
    3110              :     QpHandle &qpHandle, struct TypicalQp& qpInfo)
    3111              : {
    3112            0 :     HCCL_INFO("CreateQpWithCQ qpMode[%d], sq_depth[%u], rq_depth[%u], scq_depth[%u], rcq_depth[%u], "
    3113              :         "sendCqn[%u], recvCqn[%u], use_resv_mem[%u], resv_mem_pool_id[%u], "
    3114              :         "sq_sig_all[%d], max_send_sge[%u], max_recv_sge[%u], max_inline_data[%u]",
    3115              :         qpMode, qpConfig.sq_depth, qpConfig.rq_depth, qpConfig.scq_depth, qpConfig.rcq_depth,
    3116              :         qpConfig.sendCqn, qpConfig.recvCqn, qpConfig.use_resv_mem, qpConfig.resv_mem_pool_id,
    3117              :         qpConfig.sq_sig_all, qpConfig.max_send_sge, qpConfig.max_recv_sge, qpConfig.max_inline_data);
    3118              : 
    3119            0 :     struct QpExtAttrs ext_attrs{};
    3120            0 :     ext_attrs.qpMode = qpMode;
    3121            0 :     ext_attrs.cqAttr.sendCqDepth = qpConfig.scq_depth;
    3122            0 :     ext_attrs.cqAttr.recvCqDepth = qpConfig.rcq_depth;
    3123            0 :     ext_attrs.qpAttr.cap.max_send_wr = qpConfig.sq_depth;
    3124            0 :     ext_attrs.qpAttr.cap.max_recv_wr = qpConfig.rq_depth;
    3125            0 :     ext_attrs.version = QP_CREATE_WITH_ATTR_VERSION;
    3126            0 :     ext_attrs.qpAttr.cap.max_inline_data = qpConfig.max_inline_data;
    3127            0 :     ext_attrs.qpAttr.cap.max_send_sge = qpConfig.max_send_sge;
    3128            0 :     ext_attrs.qpAttr.cap.max_recv_sge = qpConfig.max_recv_sge;
    3129            0 :     ext_attrs.qpAttr.qp_type = IBV_QPT_RC;
    3130            0 :     ext_attrs.qpAttr.sq_sig_all = qpConfig.sq_sig_all;
    3131            0 :     ext_attrs.udpSport = 0x0;
    3132            0 :     ext_attrs.cstmFlag.bs.useResvMem = qpConfig.use_resv_mem;
    3133            0 :     ext_attrs.resvMemPoolId = qpConfig.resv_mem_pool_id;
    3134              : 
    3135            0 :     CHK_RET(hrtRaQpCreateWithCQWithAttrs(rdmaHandle, &ext_attrs, qpConfig.sendCqn, qpConfig.recvCqn, qpHandle));
    3136              : 
    3137            0 :     struct QpAttr attr{};
    3138            0 :     HcclResult ret = hrtRaGetQpAttr(qpHandle, &attr);
    3139            0 :     if (ret != HCCL_SUCCESS) {
    3140            0 :         HCCL_ERROR("[CreateQpWithCQConfig] hrtRaGetQpAttr failed, ret[%d].", ret);
    3141            0 :         HrtRaQpDestroy(qpHandle);
    3142            0 :         return ret;
    3143              :     }
    3144            0 :     qpInfo.qpn = attr.qpn;
    3145            0 :     qpInfo.gidIdx = attr.gidIdx;
    3146            0 :     for (uint32_t i = 0; i < HCCP_GID_RAW_LEN; i++) {
    3147            0 :         qpInfo.gid[i] = attr.gid[i];
    3148              :     }
    3149            0 :     qpInfo.psn = attr.psn;
    3150            0 :     HCCL_DEBUG("CreateQpWithCQConfig qpn[%u], gidIdx[%u], psn[%u]", qpInfo.qpn, qpInfo.gidIdx, qpInfo.psn);
    3151            0 :     return HCCL_SUCCESS;
    3152              : }
    3153              : 
    3154           13 : HcclResult HrtRaGetTlsEnable(struct RaInfo *info, bool *tlsEnable)
    3155              : {
    3156           13 :     u32 tlsVersion = 0;
    3157           13 :     u32 phyId = 0;  // phyId无实际意义,这里直接传入0
    3158           13 :     HcclResult vRet = hrtRaGetInterfaceVersion(phyId, GET_TLS_ENABLE, &tlsVersion);
    3159           13 :     if (vRet != HCCL_SUCCESS || tlsVersion < TLS_ENABLE_VERSION) {
    3160            0 :         HCCL_WARNING("this package does not support HrtRaGetTlsEnable for device, please change new package");
    3161            0 :         return HCCL_E_NOT_SUPPORT;
    3162              :     }
    3163           13 :     HCCL_DEBUG("HrtRaGetTlsEnable tlsVersion[%u]", tlsVersion);
    3164           13 :     s32 ret = DlRaFunction::GetInstance().dlRaRaGetTlsEnable(info, tlsEnable);
    3165           13 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("[HrtRaGetTlsEnable]errNo[0x%016llx] "
    3166              :         "failed ret[%d]", HCCL_ERROR_CODE(HCCL_E_NETWORK), ret), HCCL_E_NETWORK);
    3167           13 :     HCCL_INFO("HrtRaGetTlsEnable phyId[%u], tlsEnable[%d]", info->phyId, *tlsEnable);
    3168           13 :     return HCCL_SUCCESS;
    3169              : }
    3170              : 
    3171            0 : HcclResult SnapShotSaveAction(s32 networkMode, u32 devicePhyId, HcclSaveSnapShotAction action)
    3172              : {
    3173            0 :     HCCL_INFO("%s networkMode[%d], devicePhyId[%u], action[%d]", __func__, networkMode, devicePhyId, action);
    3174            0 :     struct RaInfo raInfo = {};
    3175            0 :     raInfo.mode = networkMode;
    3176            0 :     raInfo.phyId = devicePhyId;
    3177            0 :     s32 ret = DlRaFunction::GetInstance().dlRaSaveSnapShot(&raInfo, static_cast<enum SaveSnapshotAction>(action));
    3178            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("%s errNo[0x%016llx] failed ret[%d], networkMode[%d], phyId[%u], action[%d]",
    3179              :         __func__, HCCL_ERROR_CODE(HCCL_E_NETWORK), ret, networkMode, devicePhyId, action), HCCL_E_NETWORK);
    3180            0 :     return HCCL_SUCCESS;
    3181              : }
    3182              : 
    3183            0 : HcclResult SnapShotRestoreAction(s32 networkMode, u32 devicePhyId)
    3184              : {
    3185            0 :     HCCL_INFO("%s networkMode[%d], devicePhyId[%u]", __func__, networkMode, devicePhyId);
    3186              :     struct RaInfo raInfo;
    3187            0 :     raInfo.mode = networkMode;
    3188            0 :     raInfo.phyId = devicePhyId;
    3189            0 :     s32 ret = DlRaFunction::GetInstance().dlRaRestoreSnapShot(&raInfo);
    3190            0 :     CHK_PRT_RET(ret != 0, HCCL_ERROR("%s errNo[0x%016llx] failed ret[%d], networkMode[%d], phyId[%u]",
    3191              :         __func__, HCCL_ERROR_CODE(HCCL_E_NETWORK), ret, networkMode, devicePhyId), HCCL_E_NETWORK);
    3192            0 :     return HCCL_SUCCESS;
    3193              : }
    3194              : 
    3195           31 : HcclResult HrtRaGetHccnCfg(s32 networkMode, u32 devicePhyId, enum HccnCfgKeyT key, std::string &value)
    3196              : {
    3197           31 :     u32 raGetHccnCfg = 0;
    3198           31 :     HcclResult vRet = hrtRaGetInterfaceVersion(devicePhyId, GET_HCCH_CFG, &raGetHccnCfg);
    3199              :     static bool isPrintWarning = false;
    3200           62 :     if (vRet != HCCL_SUCCESS || raGetHccnCfg < GET_HCCH_CFG_VERSION ||
    3201           31 :         UNLIKELY(DlRaFunction::GetInstance().dlRaGetHccnCfg == nullptr)) {
    3202           31 :         if (!isPrintWarning) {
    3203            1 :             HCCL_WARNING("[HrtRaGetHccnCfg] this package does not support HrtRaGetHccnCfg for device, "
    3204              :                          "please change new package ret[%d], version[%lu]",
    3205              :                 static_cast<int>(vRet),
    3206              :                 raGetHccnCfg);
    3207            1 :             isPrintWarning = true;
    3208              :         }
    3209           31 :         return HCCL_SUCCESS;
    3210              :     }
    3211              : 
    3212            0 :     if ((key == HccnCfgKeyT::HCCN_RESV_MEM_INFO) && (raGetHccnCfg <= GET_HCCH_CFG_VERSION)) {
    3213            0 :         HCCL_WARNING("[HrtRaGetHccnCfg] this package does not support resvMem for device, "
    3214              :             "please change new package ret[%d], version[%lu]",
    3215              :             static_cast<int>(vRet), raGetHccnCfg);
    3216            0 :         return HCCL_SUCCESS;
    3217              :     }
    3218              : 
    3219            0 :     struct RaInfo raInfo = {};
    3220            0 :     raInfo.mode = networkMode;
    3221            0 :     raInfo.phyId = devicePhyId;
    3222              : 
    3223            0 :     HccnCfgKey hccnKey{HccnCfgKey::HCCN_CFG_UDP_PORT_MODE};
    3224            0 :     switch (key) {
    3225            0 :         case HccnCfgKeyT::HCCN_UDP_PORT_MODE:
    3226            0 :             hccnKey = HccnCfgKey::HCCN_CFG_UDP_PORT_MODE;
    3227            0 :             break;
    3228            0 :         case HccnCfgKeyT::HCCN_MULTI_QP_COUNT:
    3229            0 :             hccnKey = HccnCfgKey::HCCN_CFG_MULTI_QP_COUNT;
    3230            0 :             break;
    3231            0 :         case HccnCfgKeyT::HCCN_MULTI_QP_UDP_PORTS:
    3232            0 :             hccnKey = HccnCfgKey::HCCN_CFG_MULTI_QP_UDP_PORTS;
    3233            0 :             break;
    3234            0 :         case HccnCfgKeyT::HCCN_RESV_MEM_INFO:
    3235            0 :             hccnKey = HccnCfgKey::HCCN_CFG_RESV_MEM_INFO;
    3236            0 :             break;
    3237            0 :         default:
    3238            0 :             HCCL_ERROR("[HrtRaGetHccnCfg]not support key[%d]", key);
    3239            0 :             return HCCL_E_PARA;
    3240              :     }
    3241              : 
    3242            0 :     constexpr std::uint32_t READ_MAX_LEN = 1024 * 2;
    3243            0 :     std::vector<char> buffer(READ_MAX_LEN);
    3244            0 :     int actualLen = static_cast<int>(buffer.size());
    3245            0 :     s32 ret = DlRaFunction::GetInstance().dlRaGetHccnCfg(&raInfo, hccnKey, buffer.data(), &actualLen);
    3246            0 :     if (ret == 0 && actualLen == 0) {  // 文件不存在的话 HCCP长度返回0,且ret为0
    3247            0 :         HCCL_WARNING("[HrtRaGetHccnCfg] device networkMode[%d] with phyId[%u], "
    3248              :                      "get hccn config key[%d] info is empty. Possible reasons: "
    3249              :                      "1. Device not need to use multi_qp/nslb-dp settings. "
    3250              :                      "  2. In this package, hccn_tool not support multi_qp/nslb-dp settings. "
    3251              :                      "  3. The right key not exist in device's config file or key's value is empty.",
    3252              :             networkMode,
    3253              :             devicePhyId,
    3254              :             key);
    3255            0 :         value.assign(buffer.data(), actualLen);
    3256            0 :         return HCCL_SUCCESS;
    3257              :     }
    3258            0 :     CHK_PRT_RET(ret != 0,  // 其他
    3259              :         HCCL_ERROR("[HrtRaGetHccnCfg]errNo[0x%016llx] error occurred."
    3260              :                    " networkMode[%d], devicePhyId[%u], key[%d], return: ret[%d]",
    3261              :             HCCL_ERROR_CODE(HCCL_E_NETWORK),
    3262              :             networkMode,
    3263              :             devicePhyId,
    3264              :             key,
    3265              :             ret),
    3266              :         HCCL_E_NETWORK);
    3267            0 :     value.assign(buffer.data(), actualLen != 0 && buffer[actualLen - 1] == '\0' ? actualLen - 1 : actualLen);
    3268            0 :     HCCL_DEBUG("[HrtRaGetHccnCfg]devicePhyId[%u] key[%d], value[%s], value len[%d]",devicePhyId, key, value.c_str(),
    3269              :                 actualLen);
    3270            0 :     return HCCL_SUCCESS;
    3271              : }
    3272              : 
    3273            0 : HcclResult hrtRaGetSecRandom(struct RaInfo *info, unsigned int* token)
    3274              : {
    3275            0 :     if (DlRaFunction::GetInstance().dlRaGetSecRandom == nullptr) {
    3276            0 :         HCCL_ERROR("driver package does not support dlRaGetSecRandom, please change new package");
    3277            0 :         return HCCL_E_NOT_SUPPORT;
    3278              :     }
    3279            0 :     s32 ret = DlRaFunction::GetInstance().dlRaGetSecRandom(info, token);
    3280            0 :     if (ret != 0) {
    3281            0 :         HCCL_ERROR("[HrtRaGetSecRandom] RaGetSecRandom failed, call interface, ret[%d]", ret);
    3282            0 :         return HCCL_E_NETWORK;
    3283              :     }
    3284            0 :     return HCCL_SUCCESS;
    3285              : }
    3286              : 
    3287            0 : HcclResult hrtRaGetDevEidInfoNum(RaInfo info, unsigned int* num)
    3288              : {
    3289            0 :     if (DlRaFunction::GetInstance().dlRaGetDevEidInfoNum == nullptr) {
    3290            0 :         HCCL_ERROR("driver package does not support dlRaGetDevEidInfoNum, please change new package");
    3291            0 :         return HCCL_E_NOT_SUPPORT;
    3292              :     }
    3293            0 :     s32 ret = DlRaFunction::GetInstance().dlRaGetDevEidInfoNum(info, num);
    3294            0 :     if (ret != 0) {
    3295            0 :         HCCL_ERROR("[HrtRaGetSecRandom] RaGetDevEidInfoNum failed, call interface, ret[%d]", ret);
    3296            0 :         return HCCL_E_NETWORK;
    3297              :     }
    3298            0 :     return HCCL_SUCCESS;
    3299              : }
    3300              : 
    3301            0 : HcclResult hrtRaGetDevEidInfoList(RaInfo info, struct HccpDevEidInfo *eid_info, unsigned int* num)
    3302              : {
    3303            0 :     if (DlRaFunction::GetInstance().dlRaGetDevEidInfoList == nullptr) {
    3304            0 :         HCCL_ERROR("driver package does not support dlRaGetDevEidInfoNum, please change new package");
    3305            0 :         return HCCL_E_NOT_SUPPORT;
    3306              :     }
    3307            0 :     s32 ret = DlRaFunction::GetInstance().dlRaGetDevEidInfoList(info, eid_info, num);
    3308            0 :     if (ret != 0) {
    3309            0 :         HCCL_ERROR("[HrtRaGetSecRandom] RaGetDevEidInfoList failed, call interface, ret[%d]", ret);
    3310            0 :         return HCCL_E_NETWORK;
    3311              :     }
    3312            0 :     return HCCL_SUCCESS;
    3313              : }
        

Generated by: LCOV version 2.0-1