LCOV - code coverage report
Current view: top level - legacy/ascend910/framework/nslbdp - hccl_nslbdp.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 52.8 % 1267 669
Test Date: 2026-08-29 17:38:31 Functions: 61.8 % 76 47

            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              : 
      11              : #include <atomic>
      12              : #include <fcntl.h>
      13              : #include <unistd.h>
      14              : #include <hccl/hccl_types.h>
      15              : #include "topoinfo_struct.h"
      16              : #include "adapter_hccp_common.h"
      17              : #include "hccl_nslb_md5.h"
      18              : #include "../common/src/h2d_tlv/hccl_h2dtlv.h"
      19              : #include "hccl_nslbdp.h"
      20              : 
      21              : namespace hccl {
      22              : 
      23              : const u32 COMM_SLICING_LENGTH = 1024; // group name max length
      24              : 
      25          459 : hcclNslbDp& hcclNslbDp::GetInstance()
      26              : {
      27          459 :     static hcclNslbDp pNslbDp;
      28          462 :     return pNslbDp;
      29              : }
      30              : 
      31            8 : hcclNslbDp::hcclNslbDp() {}
      32              : 
      33            8 : hcclNslbDp::~hcclNslbDp() {}
      34              : 
      35            0 : void hcclNslbDp::InitCmmDesc(std::string& identifier_nslb)
      36              : {
      37            0 :     nslbdp_identifier_ = identifier_nslb;
      38            0 :     HCCL_INFO("[NSLB-DP] Init CmmDesc nslbdp_identifier_[%s] .", nslbdp_identifier_.c_str());
      39            0 :     return;
      40              : }
      41              : 
      42            0 : std::string hcclNslbDp::GetCmmDesc()
      43              : {
      44            0 :     HCCL_INFO("[NSLB-DP] Get CmmDesc nslbdp_identifier_[%s] .", nslbdp_identifier_.c_str());
      45            0 :     return nslbdp_identifier_;
      46              : }
      47              : 
      48            0 : void hcclNslbDp::SetDeviceType()
      49              : {
      50            0 :     check910_93_ = true;
      51            0 :     return;
      52              : }
      53              : 
      54            2 : bool hcclNslbDp::GetDeviceType()
      55              : {
      56            2 :     bool is91093 = check910_93_;
      57            2 :     return is91093;
      58              : }
      59              : 
      60            0 : HcclResult hcclNslbDp::SetH2DTlvInitInfo(u32 buffer_size, void* tlv_handle)
      61              : {
      62            0 :     HCCL_DEBUG("[NSLB-DP] try to set tlvinit info.");
      63            0 :     nslbdp_buffsize_ = buffer_size;
      64            0 :     nslbdp_handle_ = tlv_handle;
      65            0 :     nslbdpIsInitNetCo_ = true;
      66            0 :     HCCL_INFO("[NSLB-DP] set tlvinit info buffer_size:[%u].", buffer_size);
      67            0 :     return HCCL_SUCCESS;
      68              : }
      69              : 
      70           12 : bool hcclNslbDp::GetInitNetCoFlag() { return nslbdpIsInitNetCo_; }
      71              : 
      72            0 : HcclResult hcclNslbDp::ClearInitNetCoFlag()
      73              : {
      74            0 :     nslbdpIsInitNetCo_ = false;
      75            0 :     return HCCL_SUCCESS;
      76              : }
      77              : 
      78            0 : u32 hcclNslbDp::GetTlvInitBufferSize()
      79              : {
      80            0 :     u32 nslbdpBuffsize = nslbdp_buffsize_;
      81            0 :     return nslbdpBuffsize;
      82              : }
      83              : 
      84            0 : HcclResult hcclNslbDp::HcclSetGlobalRankTotalNum(u32 nRanks)
      85              : {
      86              :     // 填充表4
      87            0 :     hcclNslbDpGlobalRankVal_.rankTotalNum = nRanks;
      88            0 :     return HCCL_SUCCESS;
      89              : }
      90              : 
      91           92 : void hcclNslbDp::SetGlobalCommTaskId(u64 taskId)
      92              : {
      93           92 :     hcclNslbDpGlobalCommInfo_.taskId = taskId;
      94           92 :     return;
      95              : }
      96              : 
      97            0 : void hcclNslbDp::SetGlobalCommNodeId(u32 nodeId)
      98              : {
      99            0 :     hcclNslbDpGlobalCommInfo_.nodeId = nodeId;
     100            0 :     return;
     101              : }
     102              : 
     103            0 : void hcclNslbDp::SetGlobalCommLocalRankNum(u32 localRankNum)
     104              : {
     105            0 :     hcclNslbDpGlobalCommInfo_.localRankNum = localRankNum;
     106            0 :     return;
     107              : }
     108              : 
     109            0 : void hcclNslbDp::SetGlobalCommRankTotalNum(u32 rankTotalNum)
     110              : {
     111            0 :     hcclNslbDpGlobalCommInfo_.rankTotalNum = rankTotalNum;
     112            0 :     return;
     113              : }
     114              : 
     115          416 : u64 hcclNslbDp::GetGlobalCommTaskId() { return hcclNslbDpGlobalCommInfo_.taskId; }
     116              : 
     117            0 : u32 hcclNslbDp::GetGlobalCommNodeId() { return hcclNslbDpGlobalCommInfo_.nodeId; }
     118              : 
     119            0 : u8 hcclNslbDp::GetGlobalCommLocalRankNum() { return hcclNslbDpGlobalCommInfo_.localRankNum; }
     120              : 
     121            0 : u32 hcclNslbDp::GetGlobalCommRankTotalNum() { return hcclNslbDpGlobalCommInfo_.rankTotalNum; }
     122              : 
     123              : /* 获取 l4SPortId */
     124            0 : u32 hcclNslbDp::Getl4SPortId()
     125              : {
     126            0 :     u32 NslbDpL4SPortId = hcclNslbDpL4SPortId_;
     127            0 :     return NslbDpL4SPortId;
     128              : }
     129              : 
     130              : /* 切分identifier字段 */
     131            4 : void hcclNslbDp::SplitString(
     132              :     const std::string& identifier, std::vector<std::string>& splitInfo, const std::string& frag) const
     133              : {
     134            4 :     std::string::size_type pos2 = identifier.find(frag);
     135            4 :     std::string::size_type pos1 = 0;
     136            8 :     while (std::string::npos != pos2) {
     137            4 :         splitInfo.push_back(identifier.substr(pos1, pos2 - pos1));
     138            4 :         pos1 = pos2 + frag.size();
     139            4 :         pos2 = identifier.find(frag, pos1);
     140              :     }
     141            4 :     if (pos1 != identifier.length()) {
     142            3 :         splitInfo.push_back(identifier.substr(pos1));
     143              :     }
     144            4 :     return;
     145              : }
     146              : 
     147              : /* 将IP转换成U32值 */
     148           25 : u32 hcclNslbDp::ipToUint32(const std::string& ipAddress)
     149              : {
     150              :     struct sockaddr_in sa;
     151           25 :     inet_pton(AF_INET, ipAddress.c_str(), &(sa.sin_addr));
     152           25 :     return ntohl(sa.sin_addr.s_addr); // Convert to host byte order
     153              : }
     154              : 
     155              : /* 执行send 流程 */
     156            3 : HcclResult hcclNslbDp::SendCommRankTable(uint32_t rank, NslbDpCommConfigVal globalCommInfo)
     157              : {
     158            3 :     HCCL_DEBUG("[NSLB-DP] entry to send TBL_COMM_INFO");
     159            3 :     u32 rankTotalNum = globalCommInfo.rankTotalNum;
     160              : 
     161            3 :     HCCL_INFO("[NSLB-DP] TBL_COMM_INFO rankTotalNum:[%u].", rankTotalNum);
     162            3 :     if (rankTotalNum > NSLBDP_RANKTOTALNUM_BLOCK_FOU) {
     163            1 :         return HCCL_SUCCESS;
     164              :     }
     165            2 :     u32 packetNum = CalcPacketNum(rankTotalNum);
     166            2 :     SendTableProc(rank, packetNum, globalCommInfo);
     167              : 
     168            2 :     HCCL_DEBUG("[NSLB-DP] entry send TBL_COMM_INFO end");
     169            2 :     return HCCL_SUCCESS;
     170              : }
     171              : 
     172            0 : bool hcclNslbDp::CheckAhcCommInfo(NslbDpCommConfigVal comInfo)
     173              : {
     174            0 :     std::unordered_map<uint32_t, int> podToIpCount;
     175            0 :     for (const auto& info : comInfo.rankInfo) {
     176            0 :         podToIpCount[info.podId]++;
     177              :     }
     178              :     // 获取超节点对应的ip数量
     179            0 :     std::vector<int> ipCounts;
     180            0 :     for (const auto& entry : podToIpCount) {
     181            0 :         ipCounts.push_back(entry.second);
     182              :     }
     183            0 :     if (ipCounts.empty()) {
     184            0 :         return true;
     185              :     }
     186              :     // 找到最小的ip数量
     187            0 :     uint32_t minCount = *std::min_element(ipCounts.begin(), ipCounts.end());
     188            0 :     for (uint32_t count : ipCounts) {
     189            0 :         if (count % minCount != 0) {
     190            0 :             return false;
     191              :         }
     192              :     }
     193            0 :     return true;
     194            0 : }
     195              : 
     196            7 : bool hcclNslbDp::CheckAhcSupport(u8 algType, std::string identifier)
     197              : {
     198            7 :     if (algType != NSLB_ALGO_TYPE_AHC) {
     199            7 :         return true;
     200              :     }
     201              :     char commDesc[COMM_DESC_MAX_LENGTH];
     202            0 :     s32 sRet = memset_s(commDesc, COMM_DESC_MAX_LENGTH, 0, sizeof(commDesc));
     203            0 :     if (sRet != EOK) {
     204            0 :         HCCL_ERROR("memset_s commDesc fail");
     205            0 :         return true;
     206              :     }
     207              : 
     208            0 :     s32 ret = strncpy_s(commDesc, COMM_DESC_MAX_LENGTH, identifier.c_str(), identifier.size());
     209            0 :     if (ret != EOK) {
     210            0 :         HCCL_INFO("strncpy_s commDesc fail");
     211            0 :         return true;
     212              :     }
     213            0 :     commDesc[COMM_DESC_MAX_LENGTH - 1] = '\0';
     214            0 :     for (const auto& info : hcclNslbDpCommConfig_) {
     215            0 :         if (strcmp(commDesc, info.commDesc) == 0) {
     216            0 :             return CheckAhcCommInfo(info);
     217              :         }
     218              :     }
     219            0 :     return true;
     220              : }
     221              : 
     222              : /* 判断指定 commDesc + taskId 的表一是否已存在(避免重复填充, inittime 必然不同) */
     223            7 : bool hcclNslbDp::IsCommDescDuplicated(const char* commDesc, u64 taskId) const
     224              : {
     225           10 :     for (size_t i = 0; i < hcclNslbDpCommConfig_.size(); i++) {
     226            5 :         if (hcclNslbDpCommConfig_[i].taskId == taskId && strcmp(hcclNslbDpCommConfig_[i].commDesc, commDesc) == 0) {
     227            2 :             return true;
     228              :         }
     229              :     }
     230            5 :     return false;
     231              : }
     232              : 
     233              : /* 从 rankTable.rankList 构建并填充 rankInfo 列表到 globalCommInfo */
     234            4 : void hcclNslbDp::FillRankInfoFromRankTable(NslbDpCommConfigVal& globalCommInfo, const hccl::RankTable_t& rankTable)
     235              : {
     236           12 :     for (u32 rankIndex = 0; rankIndex < rankTable.rankList.size(); rankIndex++) {
     237              :         NslbDpRankInfo dpRankInfo;
     238            8 :         HcclIpAddress tmpIp = rankTable.rankList[rankIndex].deviceInfo.deviceIp[0];
     239            8 :         std::string deviceIp = tmpIp.GetReadableAddress();
     240            8 :         dpRankInfo.deviceIp = ipToUint32(deviceIp);
     241            8 :         HCCL_INFO("[NSLB-DP] FillRankInfoFromRankTable deviceIp:[%u] success.", dpRankInfo.deviceIp);
     242            8 :         if (rankTable.rankList[rankIndex].superPodIdx == INVALID_UINT) {
     243            1 :             dpRankInfo.podId = 0;
     244              :         } else {
     245            7 :             dpRankInfo.podId = rankTable.rankList[rankIndex].superPodIdx;
     246              :         }
     247            8 :         dpRankInfo.rev = 0;
     248            8 :         globalCommInfo.rankInfo.push_back(dpRankInfo);
     249            8 :     }
     250            4 : }
     251              : 
     252              : /* 读配置文件的场景与正常创建通信域场景下填充通信域信息表(表一) */
     253            0 : void hcclNslbDp::SetGlobalCommRankTable_RootInfo(
     254              :     const RankTable_t& rankTable, const HcclBasicRankInfo& localRankInfo, const std::vector<RankInfo>& rankLists,
     255              :     const std::string& identifier, u32 nRanks, u32 rank)
     256              : {
     257            0 :     HCCL_INFO(
     258              :         "[NSLB-DP] Try to collect NSLBDP_TYPE_TBL_COMM_INFO commDesc[%s] - size = [%u].", identifier.c_str(),
     259              :         rankTable.rankList.size());
     260            0 :     u64 checkTaskId = GetGlobalCommTaskId();
     261            0 :     if (checkTaskId == 0 || nRanks == 1) {
     262            0 :         return;
     263              :     }
     264            0 :     if (nRanks > NSLBDP_RANKTOTALNUM_BLOCK_FOU) {
     265            0 :         HCCL_INFO("[NSLB-DP] nRanks[%u] exceeds limit[%u], skip TBL_COMM_INFO.", nRanks, NSLBDP_RANKTOTALNUM_BLOCK_FOU);
     266            0 :         return;
     267              :     }
     268              : 
     269              :     // 判断是否跨机
     270            0 :     if (CheckMultiMachine(rankTable) == false) {
     271            0 :         HCCL_INFO("[NSLB-DP] CheckMultiMachine is false");
     272            0 :         return;
     273              :     }
     274              : 
     275            0 :     NslbDpCommConfigVal globalCommInfo{};
     276            0 :     u32 sRet = memset_s(globalCommInfo.commDesc, COMM_DESC_MAX_LENGTH, 0, sizeof(globalCommInfo.commDesc));
     277            0 :     if (sRet != EOK) {
     278            0 :         HCCL_ERROR("memset_s commDesc fail sRet[%u]", sRet);
     279            0 :         return;
     280              :     }
     281              :     /* 获取通信域唯一标识 */
     282            0 :     sRet = strncpy_s(globalCommInfo.commDesc, COMM_DESC_MAX_LENGTH, identifier.c_str(), identifier.size());
     283            0 :     if (sRet != EOK) {
     284            0 :         HCCL_ERROR("strncpy_s commDesc fail sRet[%u]", sRet);
     285            0 :         return;
     286              :     }
     287            0 :     globalCommInfo.commDesc[COMM_DESC_MAX_LENGTH - 1] = '\0';
     288              : 
     289            0 :     if (IsCommDescDuplicated(globalCommInfo.commDesc, checkTaskId)) {
     290            0 :         HCCL_INFO(
     291              :             "[NSLB-DP] commDesc[%s] taskId[%llu] already exists, skip TBL_COMM_INFO.", identifier.c_str(), checkTaskId);
     292            0 :         return;
     293              :     }
     294              : 
     295              :     u64 utime
     296            0 :         = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
     297            0 :               .count();
     298            0 :     globalCommInfo.commInitTime = utime;
     299            0 :     globalCommInfo.taskId = checkTaskId;
     300            0 :     globalCommInfo.rankTotalNum = nRanks;
     301              : 
     302            0 :     for (u32 rankIndex = 0; rankIndex < rankTable.rankList.size(); rankIndex++) {
     303              :         NslbDpRankInfo dpRankInfo;
     304            0 :         HcclIpAddress tmpIp = rankTable.rankList[rankIndex].deviceInfo.deviceIp[0];
     305            0 :         std::string deviceIp = tmpIp.GetReadableAddress();
     306            0 :         dpRankInfo.deviceIp = ipToUint32(deviceIp);
     307            0 :         HCCL_INFO("[NSLB-DP] SetGlobalCommRankTable_RootInfo deviceIp:[%u] success.", dpRankInfo.deviceIp);
     308              : 
     309            0 :         std::string serverIp = rankTable.rankList[rankIndex].serverId;
     310            0 :         size_t underscorePos = serverIp.find('_');
     311            0 :         if (underscorePos != std::string::npos) {
     312            0 :             serverIp = serverIp.substr(0, underscorePos);
     313              :         }
     314            0 :         dpRankInfo.serverIp = ipToUint32(serverIp);
     315            0 :         HCCL_INFO("[NSLB-DP] SetGlobalCommRankTable_RootInfo serverIp:[%s] success.", serverIp.c_str());
     316            0 :         if (rankLists.size() < rankIndex) {
     317            0 :             return;
     318              :         }
     319            0 :         if (rankLists[rankIndex].superPodIdx == INVALID_UINT) {
     320            0 :             dpRankInfo.podId = 0;
     321              :         } else {
     322            0 :             dpRankInfo.podId = rankLists[rankIndex].superPodIdx;
     323              :         }
     324            0 :         dpRankInfo.rev = 0;
     325            0 :         globalCommInfo.rankInfo.push_back(dpRankInfo);
     326            0 :     }
     327            0 :     NSLBMD5::calculateRankInfoMd5(globalCommInfo.rankInfo, globalCommInfo.commMd5Sum);
     328            0 :     std::string nslbdpmd5 = NSLBMD5::md5ToString(globalCommInfo.commMd5Sum);
     329            0 :     HCCL_DEBUG("[NSLB-DP] NSLBDP-MD5 nslbdpmd5:[%s] success.", nslbdpmd5.c_str());
     330              : 
     331            0 :     std::string npuIp = localRankInfo.deviceIP[0].GetReadableIP();
     332            0 :     if (ipToUint32(npuIp) != 0) {
     333            0 :         HCCL_RUN_INFO(
     334              :             "[NSLB-DP] rank[%u]: identifier[%s] nslbdpmd5:[%s].", rank, identifier.c_str(), nslbdpmd5.c_str());
     335            0 :         SendCommRankTable(rank, globalCommInfo);
     336              :     }
     337            0 :     hcclNslbDpCommConfig_.push_back(globalCommInfo);
     338            0 :     HCCL_INFO("[NSLB-DP] Entry SetGlobalCommRankTable_RootInfo end size = [%zu]", hcclNslbDpCommConfig_.size());
     339            0 : }
     340              : 
     341              : /* 填充表5 */
     342            0 : void hcclNslbDp::SetGlobalDisRankTable(const HcclBasicRankInfo& rankTable)
     343              : {
     344            0 :     HCCL_INFO("[NSLB-DP] Try to collect NSLBDP_TYPE_TBL_RANK_DIST");
     345            0 :     u64 taskId = GetGlobalCommTaskId();
     346            0 :     if (taskId == 0) {
     347            0 :         return;
     348              :     }
     349            0 :     std::string npuIp = rankTable.deviceIP[0].GetReadableIP();
     350            0 :     if (ipToUint32(npuIp) == 0) {
     351            0 :         return;
     352              :     }
     353            0 :     hcclNslbDpGlobalDisRankVal_.taskId = taskId;
     354            0 :     hcclNslbDpGlobalDisRankVal_.nodeId = GetGlobalCommNodeId();
     355            0 :     hcclNslbDpGlobalDisRankVal_.localRankNum = GetGlobalCommLocalRankNum();
     356            0 :     hcclNslbDpGlobalDisRankVal_.rankTotalNum = GetGlobalCommRankTotalNum();
     357              : 
     358            0 :     std::string serverIp = rankTable.hostIP.GetReadableIP();
     359            0 :     hcclNslbDpGlobalDisRankVal_.serverIp = ipToUint32(serverIp);
     360            0 :     HCCL_DEBUG("[NSLB-DP] SetGlobalDisRankTable serverIp:[%u].", hcclNslbDpGlobalDisRankVal_.serverIp);
     361              : 
     362            0 :     hcclNslbDpGlobalDisRankVal_.npuIp = ipToUint32(npuIp);
     363            0 :     HCCL_DEBUG("[NSLB-DP] SetGlobalDisRankTable npuIp:[%u].", hcclNslbDpGlobalDisRankVal_.npuIp);
     364            0 : }
     365              : 
     366              : /* check 是否是多机场景 */
     367            2 : bool hcclNslbDp::CheckMultiMachine(const RankTable_t rankTable)
     368              : {
     369            2 :     HCCL_DEBUG("[NSLB-DP] check device is multi machine");
     370            2 :     u32 serverIpFir = 0;
     371            2 :     u16 podIdFir = 0;
     372            2 :     bool bIsMultiMachine = false;
     373            2 :     if (GetDeviceType() == true) {
     374            0 :         u16 podIdIndex = 0;
     375            0 :         for (u32 index = 0; index < rankTable.rankList.size(); index++) {
     376            0 :             if (rankTable.rankList[index].superPodIdx == INVALID_UINT) {
     377            0 :                 podIdIndex = 0;
     378              :             } else {
     379            0 :                 podIdIndex = rankTable.rankList[index].superPodIdx;
     380              :             }
     381            0 :             if (index == 0) {
     382            0 :                 podIdFir = podIdIndex;
     383            0 :                 continue;
     384              :             }
     385              : 
     386            0 :             if (podIdFir != podIdIndex) {
     387            0 :                 return true;
     388              :             }
     389              :         }
     390            0 :         return false;
     391              :     }
     392            4 :     for (u32 rankIndex = 0; rankIndex < rankTable.rankList.size(); rankIndex++) {
     393            4 :         std::string serverIpInfo = rankTable.rankList[rankIndex].serverId;
     394            4 :         u32 serverIp = ipToUint32(serverIpInfo);
     395            4 :         u16 podIdInfo = 0;
     396            4 :         if (rankTable.rankList[rankIndex].superPodIdx == INVALID_UINT) {
     397            0 :             podIdInfo = 0;
     398              :         } else {
     399            4 :             podIdInfo = rankTable.rankList[rankIndex].superPodIdx;
     400              :         }
     401            4 :         if (rankIndex == 0) {
     402            2 :             serverIpFir = serverIp;
     403            2 :             podIdFir = podIdInfo;
     404            2 :             continue;
     405              :         }
     406              : 
     407            2 :         if (serverIp != serverIpFir || podIdFir != podIdInfo) {
     408            2 :             bIsMultiMachine = true;
     409            2 :             break;
     410              :         }
     411            4 :     }
     412            2 :     return bIsMultiMachine;
     413              : }
     414              : 
     415              : /* 无ranktable场景, 子通信域场景表1 赋值 */
     416              : HcclResult
     417            4 : hcclNslbDp::SetCommInfo_NoRankTable(const hccl::RankTable_t rankTable, std::string identifier, u32 subCommRankId)
     418              : {
     419            4 :     HCCL_DEBUG("[NSLB-DP] Try to collect NSLBDP_TYPE_TBL_COMM_INFO for no RankTable");
     420            4 :     u64 taskId = GetGlobalCommTaskId();
     421            4 :     if (taskId == 0) {
     422            1 :         return HCCL_SUCCESS;
     423              :     }
     424            3 :     if (rankTable.rankNum > NSLBDP_RANKTOTALNUM_BLOCK_FOU) {
     425            1 :         HCCL_INFO(
     426              :             "[NSLB-DP] rankNum[%u] exceeds limit[%u], skip TBL_COMM_INFO.", rankTable.rankNum,
     427              :             NSLBDP_RANKTOTALNUM_BLOCK_FOU);
     428            1 :         return HCCL_SUCCESS;
     429              :     }
     430              :     // 判断是否跨机 false非错误场景
     431            2 :     if (CheckMultiMachine(rankTable) == false) {
     432            0 :         HCCL_INFO("[NSLB-DP] nslb-dp CheckMultiMachine is false");
     433            0 :         return HCCL_SUCCESS;
     434              :     }
     435              : 
     436            2 :     NslbDpCommConfigVal globalCommInfo;
     437            2 :     (void)memset_s(globalCommInfo.commDesc, COMM_DESC_MAX_LENGTH, 0, sizeof(globalCommInfo.commDesc));
     438              : 
     439              :     // 获取通信域唯一标识
     440            2 :     s32 ret = strncpy_s(globalCommInfo.commDesc, COMM_DESC_MAX_LENGTH, identifier.c_str(), identifier.size());
     441            2 :     CHK_PRT_RET(ret != EOK, HCCL_ERROR("[NSLB_DP]GetIdentifier str copy fail. return[%d]", ret), HCCL_E_INTERNAL);
     442              : 
     443            2 :     globalCommInfo.commDesc[COMM_DESC_MAX_LENGTH - 1] = '\0';
     444            2 :     if (IsCommDescDuplicated(globalCommInfo.commDesc, taskId)) {
     445            1 :         HCCL_INFO(
     446              :             "[NSLB-DP] commDesc[%s] taskId[%llu] already exists, skip TBL_COMM_INFO.", identifier.c_str(), taskId);
     447            1 :         return HCCL_SUCCESS;
     448              :     }
     449              : 
     450              :     // commInitTime在有ranktable的赋值
     451              :     u64 utime
     452            1 :         = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
     453            1 :               .count();
     454            1 :     globalCommInfo.commInitTime = utime;
     455            1 :     u16 nRanks = rankTable.rankNum;
     456            1 :     globalCommInfo.taskId = taskId;
     457            1 :     globalCommInfo.rankTotalNum = nRanks;
     458              : 
     459            1 :     FillRankInfoFromRankTable(globalCommInfo, rankTable);
     460            1 :     NSLBMD5::calculateRankInfoMd5(globalCommInfo.rankInfo, globalCommInfo.commMd5Sum);
     461            1 :     std::string nslbdpmd5 = NSLBMD5::md5ToString(globalCommInfo.commMd5Sum);
     462            1 :     HCCL_RUN_INFO(
     463              :         "[NSLB-DP] Subcomm rankId[%u] identifier[%s] nslbdpmd5:[%s].", subCommRankId, identifier.c_str(),
     464              :         nslbdpmd5.c_str());
     465              : 
     466            1 :     SendCommRankTable(subCommRankId, globalCommInfo);
     467            1 :     hcclNslbDpCommConfig_.push_back(globalCommInfo);
     468              : 
     469            1 :     return HCCL_SUCCESS;
     470            2 : }
     471              : 
     472              : /* 有ranktable场景, 表1 赋值 */
     473            3 : HcclResult hcclNslbDp::SetCommInfo_RankTableExit(RankTable_t rankTable)
     474              : {
     475            3 :     HCCL_DEBUG("[NSLB-DP] Entry SetCommInfo for RankTable exit");
     476            3 :     u16 nRanks = rankTable.rankNum;
     477            3 :     u64 taskId = GetGlobalCommTaskId();
     478            3 :     if (taskId == 0 || nRanks == 1) {
     479            1 :         return HCCL_SUCCESS;
     480              :     }
     481            2 :     if (nRanks > NSLBDP_RANKTOTALNUM_BLOCK_FOU) {
     482            1 :         HCCL_INFO("[NSLB-DP] nRanks[%u] exceeds limit[%u], skip TBL_COMM_INFO.", nRanks, NSLBDP_RANKTOTALNUM_BLOCK_FOU);
     483            1 :         return HCCL_SUCCESS;
     484              :     }
     485              : 
     486            1 :     NslbDpCommConfigVal globalCommInfo = {};
     487              :     // 获取通信域唯一标识
     488            1 :     (void)memset_s(
     489            1 :         hcclNslbDpGlobalRankVal_.commDesc, COMM_DESC_MAX_LENGTH, 0, sizeof(hcclNslbDpGlobalRankVal_.commDesc));
     490            1 :     char commDesc[COMM_DESC_MAX_LENGTH] = "HCCL_WORLD_GROUP";
     491            1 :     s32 sRet = memcpy_s(globalCommInfo.commDesc, sizeof(globalCommInfo.commDesc), commDesc, COMM_DESC_MAX_LENGTH);
     492            1 :     if (sRet != EOK) {
     493            0 :         HCCL_ERROR("memcpy_s commDesc fail");
     494            0 :         return HCCL_SUCCESS;
     495              :     }
     496              : 
     497            1 :     if (IsCommDescDuplicated(globalCommInfo.commDesc, taskId)) {
     498            0 :         HCCL_INFO(
     499              :             "[NSLB-DP] commDesc[%s] taskId[%llu] already exists, skip TBL_COMM_INFO.", globalCommInfo.commDesc, taskId);
     500            0 :         return HCCL_SUCCESS;
     501              :     }
     502            1 :     globalCommInfo.taskId = taskId;
     503            1 :     globalCommInfo.rankTotalNum = nRanks;
     504              : 
     505              :     u64 utime
     506            1 :         = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
     507            1 :               .count();
     508            1 :     globalCommInfo.commInitTime = utime;
     509              : 
     510            1 :     u32 size = rankTable.rankList.size();
     511            1 :     HCCL_INFO("[NSLB-DP] RankTableExit size:[%u] success.", size);
     512              : 
     513            5 :     for (size_t ranksize = 0; ranksize < rankTable.rankList.size(); ranksize++) {
     514           20 :         for (size_t rankIndex = 0; rankIndex < rankTable.rankList.size(); rankIndex++) {
     515           16 :             u16 podId = 0;
     516           16 :             if (rankTable.rankList[rankIndex].superPodIdx != INVALID_UINT) {
     517           16 :                 podId = rankTable.rankList[rankIndex].superPodIdx;
     518              :             }
     519              :             // 按照rankid 排序
     520           16 :             if (ranksize == rankTable.rankList[rankIndex].rankId) {
     521              :                 NslbDpRankInfo dpRankInfo;
     522            4 :                 HcclIpAddress tmpIp = rankTable.rankList[rankIndex].deviceInfo.deviceIp[0];
     523            4 :                 std::string deviceIp = tmpIp.GetReadableAddress();
     524            4 :                 dpRankInfo.deviceIp = ipToUint32(deviceIp);
     525            4 :                 HCCL_INFO("[NSLB-DP] SetCommInfo_RankTableExit deviceIp:[%s] success.", deviceIp.c_str());
     526            4 :                 std::string serverIp = rankTable.rankList[rankIndex].serverId;
     527            4 :                 dpRankInfo.serverIp = ipToUint32(serverIp);
     528            4 :                 HCCL_INFO("[NSLB-DP] SetCommInfo_RankTableExit serverIp:[%s] success.", serverIp.c_str());
     529            4 :                 dpRankInfo.podId = podId;
     530            4 :                 dpRankInfo.rev = 0;
     531            4 :                 globalCommInfo.rankInfo.push_back(dpRankInfo);
     532            4 :             }
     533              :         }
     534              :     }
     535            1 :     NSLBMD5::calculateRankInfoMd5(globalCommInfo.rankInfo, globalCommInfo.commMd5Sum);
     536            1 :     std::string nslbdpmd5 = NSLBMD5::md5ToString(globalCommInfo.commMd5Sum);
     537            1 :     HCCL_INFO("[NSLB-DP] check pmd5:[%s] success.", nslbdpmd5.c_str());
     538              : 
     539            1 :     hcclNslbDpCommConfig_.push_back(globalCommInfo);
     540            1 :     HCCL_DEBUG("[NSLB-DP] entry SetCommInfo_RankTableExit end");
     541              : 
     542            1 :     return HCCL_SUCCESS;
     543            1 : }
     544              : 
     545              : /* 有ranktable场景,表4赋值 */
     546            0 : HcclResult hcclNslbDp::SetGlobalRank_RankTableExit(const hccl::RankTable_t rankTable)
     547              : {
     548            0 :     u64 taskId = GetGlobalCommTaskId();
     549            0 :     HCCL_INFO("[NSLB-DP] set TBL_RANK for RankTableExit[%ull] success.", taskId);
     550              : 
     551            0 :     if (taskId == 0) {
     552            0 :         return HCCL_SUCCESS;
     553              :     }
     554            0 :     u16 nRanks = rankTable.rankNum;
     555            0 :     hcclNslbDpGlobalRankVal_.taskId = taskId;
     556            0 :     (void)memset_s(
     557            0 :         hcclNslbDpGlobalRankVal_.commDesc, COMM_DESC_MAX_LENGTH, 0, sizeof(hcclNslbDpGlobalRankVal_.commDesc));
     558            0 :     char commDesc[COMM_DESC_MAX_LENGTH] = "HCCL_WORLD_GROUP";
     559            0 :     s32 sRet = memcpy_s(
     560            0 :         hcclNslbDpGlobalRankVal_.commDesc, sizeof(hcclNslbDpGlobalRankVal_.commDesc), commDesc, COMM_DESC_MAX_LENGTH);
     561            0 :     if (sRet != EOK) {
     562            0 :         HCCL_ERROR("memcpy_s commDesc fail");
     563            0 :         return HCCL_SUCCESS;
     564              :     }
     565              : 
     566              :     hcclNslbDpGlobalRankVal_.commInitTime
     567            0 :         = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
     568            0 :               .count();
     569            0 :     hcclNslbDpGlobalRankVal_.rankTotalNum = nRanks;
     570              : 
     571            0 :     for (size_t ranksize = 0; ranksize < rankTable.rankList.size(); ranksize++) {
     572            0 :         for (size_t rankIndex = 0; rankIndex < rankTable.rankList.size(); rankIndex++) {
     573            0 :             if (ranksize == rankTable.rankList[rankIndex].rankId) {
     574              :                 TableFourRankInfo dpGloRankInfo;
     575            0 :                 HcclIpAddress tmpIp = rankTable.rankList[rankIndex].deviceInfo.deviceIp[0];
     576            0 :                 std::string deviceIp = tmpIp.GetReadableAddress();
     577            0 :                 dpGloRankInfo.deviceIp = ipToUint32(deviceIp);
     578              : 
     579            0 :                 std::string serverIp = rankTable.rankList[rankIndex].serverId;
     580            0 :                 dpGloRankInfo.serverIp = ipToUint32(serverIp);
     581              : 
     582            0 :                 hcclNslbDpGlobalRankVal_.rankInfo.push_back(dpGloRankInfo);
     583            0 :             }
     584              :         }
     585              :     }
     586            0 :     NSLBMD5::calculateTableFourRankInfoMd5(hcclNslbDpGlobalRankVal_.rankInfo, hcclNslbDpGlobalRankVal_.commMd5Sum);
     587            0 :     std::string nslbdpmd5 = NSLBMD5::md5ToString(hcclNslbDpGlobalRankVal_.commMd5Sum);
     588            0 :     HCCL_INFO("[NSLB-DP] check pmd5:[%s] success.", nslbdpmd5.c_str());
     589            0 :     return HCCL_SUCCESS;
     590            0 : }
     591              : 
     592              : /* 拼接 l4SPortId */
     593            1 : HcclResult hcclNslbDp::GetNslbDpl4SPortId(u32 rankSize, u8 algType, u16* l4SPortId)
     594              : {
     595            1 :     u16 priFlag = NSLBDP_PRIVATE_PORT;
     596            1 :     u16 CommIntervalFlag = NSLB_COMM_INTERVAL_FLAG_BEGIN;
     597            1 :     if (rankSize > NSLBDP_COMMINTERVAL_FLAGSIX) {
     598            0 :         CommIntervalFlag = NSLB_COMM_INTERVAL_FLAG_SEV;
     599            1 :     } else if (rankSize > NSLBDP_COMMINTERVAL_FLAGFIV) {
     600            0 :         CommIntervalFlag = NSLB_COMM_INTERVAL_FLAG_SIX;
     601            1 :     } else if (rankSize > NSLBDP_COMMINTERVAL_FLAGFOU) {
     602            0 :         CommIntervalFlag = NSLB_COMM_INTERVAL_FLAG_FIV;
     603            1 :     } else if (rankSize > NSLBDP_COMMINTERVAL_FLAGTHR) {
     604            0 :         CommIntervalFlag = NSLB_COMM_INTERVAL_FLAG_FOR;
     605            1 :     } else if (rankSize > NSLBDP_COMMINTERVAL_FLAGSEC) {
     606            0 :         CommIntervalFlag = NSLB_COMM_INTERVAL_FLAG_THR;
     607            1 :     } else if (rankSize > NSLBDP_COMMINTERVAL_FLAG) {
     608            0 :         CommIntervalFlag = NSLB_COMM_INTERVAL_FLAG_SEC;
     609              :     } else {
     610            1 :         CommIntervalFlag = NSLB_COMM_INTERVAL_FLAG_FIR;
     611              :     }
     612            1 :     u16 CommPrecisely = rankSize % NSLBDP_COMMINTERVAL_FLAG;
     613            1 :     u8 CommalgType = algType;
     614              : 
     615            1 :     *l4SPortId = (priFlag << NSLBDP_RANGE_ID) + (CommIntervalFlag << NSLBDP_COMMON_RANGE)
     616            1 :                  + (CommPrecisely << NSLBDP_ALGO_RANGE) + CommalgType;
     617            1 :     hcclNslbDpL4SPortId_ = *l4SPortId;
     618              : 
     619            1 :     HCCL_INFO("[NSLB-DP-L4PORT] get hcclNslbDpL4SPortId_[%u] success", hcclNslbDpL4SPortId_);
     620            1 :     return HCCL_SUCCESS;
     621              : }
     622              : 
     623              : /* 表6赋值 */
     624            0 : HcclResult hcclNslbDp::SetNslbDpRootRank(HcclCMDType opType, u32 rootRank, std::string identifier, u8 algType)
     625              : {
     626            0 :     HCCL_DEBUG("[NSLB-DP] try to collect NSLBDP_TYPE_TBL_ROOT_RANK");
     627            0 :     u64 taskId = GetGlobalCommTaskId();
     628            0 :     if (taskId == 0) {
     629            0 :         return HCCL_SUCCESS;
     630              :     }
     631            0 :     if (hcclNslbDpRootRankVal_.taskId == 0) {
     632            0 :         HCCL_DEBUG("[NSLB-DP-BEGIN] RootRank first entry");
     633              :         // 获取task id
     634            0 :         hcclNslbDpRootRankVal_.taskId = taskId;
     635            0 :         s32 sRet = memset_s(
     636            0 :             hcclNslbDpRootRankVal_.commDesc, COMM_DESC_MAX_LENGTH, 0, sizeof(hcclNslbDpRootRankVal_.commDesc));
     637            0 :         if (sRet != EOK) {
     638            0 :             HCCL_ERROR("memset_s commDesc fail");
     639            0 :             return HCCL_SUCCESS;
     640              :         }
     641              :         // 获取通信域唯一标识
     642              :         s32 ret
     643            0 :             = strncpy_s(hcclNslbDpRootRankVal_.commDesc, COMM_DESC_MAX_LENGTH, identifier.c_str(), identifier.size());
     644            0 :         if (ret != EOK) {
     645            0 :             HCCL_INFO("strncpy_s hcclNslbDpRootRankVal_.commDesc fail");
     646            0 :             return HCCL_SUCCESS;
     647              :         }
     648            0 :         hcclNslbDpRootRankVal_.commDesc[COMM_DESC_MAX_LENGTH - 1] = '\0';
     649              : 
     650              :         // commInitTime在有ranktable的赋值
     651              :         hcclNslbDpRootRankVal_.commInitTime
     652            0 :             = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
     653            0 :                   .count();
     654              : 
     655              :         // 获取operator、algorithm
     656            0 :         hcclNslbDpRootRankVal_.oper = GetNslbOpType(opType);
     657            0 :         hcclNslbDpRootRankVal_.algorithm = algType;
     658            0 :         hcclNslbDpRootRankVal_.rootRankNum = hcclNslbDpRootRankVal_.rootRankNum + 1;
     659              : 
     660              :         NslbDpRankId rootRankId;
     661            0 :         rootRankId.rankID = rootRank;
     662            0 :         hcclNslbDpRootRankVal_.rankId.push_back(rootRankId);
     663              : 
     664            0 :         HCCL_INFO(
     665              :             "[NSLB-DP] Rootable rootRankNum[%u]-rootRank[%u]-algorithm[%u].", hcclNslbDpRootRankVal_.rootRankNum,
     666              :             rootRank, hcclNslbDpRootRankVal_.algorithm);
     667              : 
     668            0 :         HCCL_DEBUG("[NSLB-DP] Rootabl entry SetNslbDpRootRank end");
     669            0 :         SendRootRankTable();
     670            0 :         return HCCL_SUCCESS;
     671              :     }
     672            0 :     HCCL_INFO(
     673              :         "[NSLB-DP] Rootable rankId.size[%zu]-rootRankNum[%u]-rootRank[%u].", hcclNslbDpRootRankVal_.rankId.size(),
     674              :         hcclNslbDpRootRankVal_.rootRankNum, rootRank);
     675              : 
     676            0 :     for (const auto& rank : hcclNslbDpRootRankVal_.rankId) {
     677            0 :         HCCL_INFO("[NSLB-DP] Rootable rootRank exit rankID[%u]-rootRank[%u]", rank.rankID, rootRank);
     678            0 :         if (rank.rankID == rootRank) {
     679            0 :             return HCCL_SUCCESS;
     680              :         }
     681              :     }
     682              : 
     683              :     NslbDpRankId rootRankId;
     684            0 :     rootRankId.rankID = static_cast<u16>(rootRank);
     685            0 :     hcclNslbDpRootRankVal_.rankId.push_back(rootRankId);
     686            0 :     hcclNslbDpRootRankVal_.rootRankNum = hcclNslbDpRootRankVal_.rootRankNum + 1;
     687              : 
     688              :     // 新增场景下走send 流程
     689            0 :     SendRootRankTable();
     690              : 
     691            0 :     return HCCL_SUCCESS;
     692              : }
     693              : 
     694              : /* AlgType 的转换 */
     695            9 : u8 hcclNslbDp::GetNslbLevel1AlgType(AlgTypeLevel1 algValue)
     696              : {
     697            9 :     HCCL_DEBUG("[NSLB-DP] try to switch Level1 type to nslbtype");
     698            9 :     switch (algValue) {
     699            1 :         case AlgTypeLevel1::ALG_LEVEL1_RING: {
     700            1 :             return NSLB_ALGO_TYPE_RING;
     701              :         }
     702            1 :         case AlgTypeLevel1::ALG_LEVEL1_PIPELINE: {
     703            1 :             return NSLB_ALGO_TYPE_PIPELINE;
     704              :         }
     705            1 :         case AlgTypeLevel1::ALG_LEVEL1_HD: {
     706            1 :             return NSLB_ALGO_TYPE_HDR;
     707              :         }
     708            1 :         case AlgTypeLevel1::ALG_LEVEL1_NHR: {
     709            1 :             return NSLB_ALGO_TYPE_NHR;
     710              :         }
     711            1 :         case AlgTypeLevel1::ALG_LEVEL1_NHR_V1: {
     712            1 :             return NSLB_ALGO_TYPE_NHR_V1;
     713              :         }
     714            1 :         case AlgTypeLevel1::ALG_LEVEL1_NB: {
     715            1 :             return NSLB_ALGO_TYPE_NB;
     716              :         }
     717            1 :         case AlgTypeLevel1::ALG_LEVEL1_AHC: {
     718            1 :             return NSLB_ALGO_TYPE_AHC;
     719              :         }
     720            1 :         case AlgTypeLevel1::ALG_LEVEL1_AHC_BROKE: {
     721            1 :             return NSLB_ALGO_TYPE_AHC;
     722              :         }
     723            1 :         default:
     724            1 :             return NSLB_ALGO_TYPE_NA;
     725              :     }
     726              : }
     727              : 
     728              : /* Level2 的 AlgType 转换 */
     729            6 : u8 hcclNslbDp::GetNslbLevel2AlgType(AlgTypeLevel2 algValue)
     730              : {
     731            6 :     HCCL_DEBUG("[NSLB-DP] try to switch Level2 type to nslbtype");
     732            6 :     switch (algValue) {
     733            1 :         case AlgTypeLevel2::ALG_LEVEL2_RING: {
     734            1 :             return NSLB_ALGO_TYPE_RING;
     735              :         }
     736            1 :         case AlgTypeLevel2::ALG_LEVEL2_HD: {
     737            1 :             return NSLB_ALGO_TYPE_HDR;
     738              :         }
     739            1 :         case AlgTypeLevel2::ALG_LEVEL2_NHR: {
     740            1 :             return NSLB_ALGO_TYPE_NHR;
     741              :         }
     742            1 :         case AlgTypeLevel2::ALG_LEVEL2_NB: {
     743            1 :             return NSLB_ALGO_TYPE_NB;
     744              :         }
     745            1 :         case AlgTypeLevel2::ALG_LEVEL2_PIPELINE: {
     746            1 :             return NSLB_ALGO_TYPE_PIPELINE;
     747              :         }
     748            1 :         default:
     749            1 :             return NSLB_ALGO_TYPE_NA;
     750              :     }
     751              : }
     752              : 
     753              : /* opType 的转换 */
     754          148 : u8 hcclNslbDp::GetNslbOpType(HcclCMDType opType)
     755              : {
     756          148 :     HCCL_DEBUG("[NSLB-DP] try to get nslb optype");
     757          148 :     switch (opType) {
     758            8 :         case HcclCMDType::HCCL_CMD_BROADCAST: {
     759            8 :             return NSLBDP_CMD_BROADCAST;
     760              :         }
     761           10 :         case HcclCMDType::HCCL_CMD_ALLREDUCE: {
     762           10 :             return NSLBDP_CMD_ALLREDUCE;
     763              :         }
     764           11 :         case HcclCMDType::HCCL_CMD_REDUCE: {
     765           11 :             return NSLBDP_CMD_REDUCE;
     766              :         }
     767           12 :         case HcclCMDType::HCCL_CMD_SEND: {
     768           12 :             return NSLBDP_CMD_SEND;
     769              :         }
     770           12 :         case HcclCMDType::HCCL_CMD_RECEIVE: {
     771           12 :             return NSLBDP_CMD_RECEIVE;
     772              :         }
     773           18 :         case HcclCMDType::HCCL_CMD_ALLGATHER: {
     774           18 :             return NSLBDP_CMD_ALLGATHER;
     775              :         }
     776            4 :         case HcclCMDType::HCCL_CMD_REDUCE_SCATTER: {
     777            4 :             return NSLBDP_CMD_REDUCE_SCATTER;
     778              :         }
     779            6 :         case HcclCMDType::HCCL_CMD_ALLTOALLV: {
     780            6 :             return NSLBDP_CMD_ALLTOALLV;
     781              :         }
     782            7 :         case HcclCMDType::HCCL_CMD_ALLTOALLVC: {
     783            7 :             return NSLBDP_CMD_ALLTOALLVC;
     784              :         }
     785            5 :         case HcclCMDType::HCCL_CMD_ALLTOALL: {
     786            5 :             return NSLBDP_CMD_ALLTOALL;
     787              :         }
     788           23 :         case HcclCMDType::HCCL_CMD_GATHER: {
     789           23 :             return NSLBDP_CMD_GATHER;
     790              :         }
     791            9 :         case HcclCMDType::HCCL_CMD_SCATTER: {
     792            9 :             return NSLBDP_CMD_SCATTER;
     793              :         }
     794           11 :         case HcclCMDType::HCCL_CMD_BATCH_SEND_RECV: {
     795           11 :             return NSLBDP_CMD_BATCH_SEND_RECV;
     796              :         }
     797           12 :         default:
     798           12 :             return 0;
     799              :     }
     800              : }
     801              : 
     802              : /* 获取通信量的前4bit */
     803            7 : u64 hcclNslbDp::GetNslbDpFirstFourBit(u8 opType, u8 algType)
     804              : {
     805            7 :     u64 firstFourBit = 0;
     806            7 :     if (opType == NSLBDP_CMD_ALLREDUCE) {
     807            2 :         firstFourBit = 1 << NSLBDP_BEGINFOURBIT;
     808            2 :         firstFourBit = firstFourBit + 1;
     809              :     }
     810              : 
     811            7 :     if (opType == NSLBDP_CMD_ALLGATHER) {
     812            1 :         firstFourBit = 1 << 1;
     813              :     }
     814              : 
     815            7 :     HCCL_INFO("[NSLB-DP-FIRST4] try to get first FourBit[%llu]-algType[%u]", firstFourBit, algType);
     816            7 :     return firstFourBit;
     817              : }
     818              : 
     819              : /* 校验算法的一致性 */
     820           12 : bool hcclNslbDp::CheckAlgoConsistency(HcclCMDType opType, std::string& algName)
     821              : {
     822           12 :     if (opType == HcclCMDType::HCCL_CMD_ALLREDUCE) {
     823            2 :         if (algName.find("AllReduce") != std::string::npos) {
     824            1 :             return true;
     825              :         } else {
     826            1 :             return false;
     827              :         }
     828           10 :     } else if (opType == HcclCMDType::HCCL_CMD_ALLGATHER) {
     829            2 :         if (algName.find("AllGather") != std::string::npos) {
     830            1 :             return true;
     831              :         } else {
     832            1 :             return false;
     833              :         }
     834            8 :     } else if (opType == HcclCMDType::HCCL_CMD_REDUCE_SCATTER) {
     835            2 :         if (algName.find("ReduceScatter") != std::string::npos) {
     836            1 :             return true;
     837              :         } else {
     838            1 :             return false;
     839              :         }
     840            6 :     } else if (opType == HcclCMDType::HCCL_CMD_ALLTOALL) {
     841            2 :         if (algName != "RunAlltoAllVFullMesh") {
     842            1 :             return false;
     843              :         }
     844            4 :     } else if (opType == HcclCMDType::HCCL_CMD_BROADCAST) {
     845            2 :         if (algName.find("BroadCast") != std::string::npos) {
     846            1 :             return true;
     847              :         } else {
     848            1 :             return false;
     849              :         }
     850            2 :     } else if (opType == HcclCMDType::HCCL_CMD_SCATTER) {
     851            2 :         if (algName.find("Scatter") != std::string::npos) {
     852            1 :             return true;
     853              :         } else {
     854            1 :             return false;
     855              :         }
     856              :     }
     857            1 :     return true;
     858              : }
     859              : 
     860           22 : bool hcclNslbDp::CheckSupportOptype(HcclCMDType opType)
     861              : {
     862           22 :     HCCL_DEBUG("[NSLB-DP] try to check support optype");
     863           39 :     if (GetNslbOpType(opType) != NSLBDP_CMD_ALLREDUCE && GetNslbOpType(opType) != NSLBDP_CMD_ALLGATHER
     864           13 :         && GetNslbOpType(opType) != NSLBDP_CMD_REDUCE_SCATTER && GetNslbOpType(opType) != NSLBDP_CMD_ALLTOALL
     865           11 :         && GetNslbOpType(opType) != NSLBDP_CMD_ALLTOALLV && GetNslbOpType(opType) != NSLBDP_CMD_ALLTOALLVC
     866            9 :         && GetNslbOpType(opType) != NSLBDP_CMD_BROADCAST && GetNslbOpType(opType) != NSLBDP_CMD_SCATTER
     867            7 :         && GetNslbOpType(opType) != NSLBDP_CMD_BATCH_SEND_RECV && GetNslbOpType(opType) != NSLBDP_CMD_REDUCE
     868           39 :         && GetNslbOpType(opType) != NSLBDP_CMD_SEND) {
     869            4 :         return false;
     870              :     }
     871           18 :     return true;
     872              : }
     873              : 
     874              : /* 写算法算子表--表3 */
     875            7 : HcclResult hcclNslbDp::GetAlgAdjacencyTable(
     876              :     HcclCMDType opType, u32 srcLocalRankId, u32 rootRank, u8 algType, std::string identifier, AdjInfo nslbAdjInfo)
     877              : {
     878            7 :     HCCL_DEBUG("[NSLB-DP] check table NSLBDP_TYPE_TBL_ADJ size:[%zu].", hcclNslbDpAlgorithmInfo_.size());
     879            7 :     if (CheckAhcSupport(algType, identifier) == false) {
     880            0 :         HCCL_RUN_INFO("[NSLB-DP-ADJ] Check AHC commoninfo is not support.");
     881            0 :         return HCCL_SUCCESS;
     882              :     }
     883            7 :     u64 taskId = GetGlobalCommTaskId();
     884            7 :     if (taskId == 0) {
     885            1 :         return HCCL_SUCCESS;
     886              :     }
     887            6 :     HCCL_INFO(
     888              :         "[NSLB-DP-ADJ] opType:[%u],srcLocalRankId[%u],rootRank[%u]-commDesc[%s],dstRankNum:[%u].", opType,
     889              :         srcLocalRankId, rootRank, identifier.c_str(), nslbAdjInfo.dstRankNum);
     890              : 
     891            6 :     if (CheckSupportOptype(opType) == false) {
     892            1 :         HCCL_INFO("[NSLB-DP-OPER] CheckSupportOptype false .");
     893            1 :         return HCCL_SUCCESS;
     894              :     }
     895              : 
     896            5 :     NslbDpAlgorithmInfo algorithmInfo;
     897            5 :     algorithmInfo.taskId = taskId;
     898            5 :     if (InitAlgInfoCommDesc(algorithmInfo, identifier) == false) {
     899            1 :         return HCCL_SUCCESS;
     900              :     }
     901            4 :     if (FillAlgInfoCommMd5(algorithmInfo) == false) {
     902            0 :         return HCCL_SUCCESS;
     903              :     }
     904            4 :     FillAlgInfoBaseFields(algorithmInfo, opType, srcLocalRankId, rootRank, algType);
     905              : 
     906            4 :     HCCL_RUN_INFO(
     907              :         "[NSLB-DP] add adjINfo:***[%llu]***[%u]***[%u]***[%u]***[%u]-[%zu] success.", taskId, srcLocalRankId, rootRank,
     908              :         GetNslbOpType(opType), algType, nslbAdjInfo.nsAdjInfo.size());
     909              : 
     910            4 :     if (IsAlgAdjacencyDuplicated(algorithmInfo) == true) {
     911            1 :         HCCL_INFO("[NSLB-DP] Deduplication hcclNslbDpAlgorithmInfo_");
     912            1 :         return HCCL_SUCCESS;
     913              :     }
     914              : 
     915            3 :     HCCL_INFO(
     916              :         "[NSLB-DP-ADJ] add adjINfo:***[%llu]***[%u]***[%u]***[%u]***[%u] success.", taskId, srcLocalRankId, rootRank,
     917              :         GetNslbOpType(opType), algType);
     918              : 
     919            3 :     if (FillAlgInfoAdjInfo(algorithmInfo, nslbAdjInfo, srcLocalRankId) == false) {
     920            0 :         return HCCL_SUCCESS;
     921              :     }
     922              : 
     923            3 :     algorithmInfo.sedFlag = 0;
     924            3 :     hcclNslbDpAlgorithmInfo_.push_back(algorithmInfo);
     925            3 :     HCCL_DEBUG("[NSLB-DP] entry GetAlgAdjacencyTable end");
     926            3 :     return HCCL_SUCCESS;
     927            5 : }
     928              : 
     929              : /* 初始化commDesc并校验通信域是否存在;存在返回true,不存在返回false */
     930            8 : bool hcclNslbDp::InitAlgInfoCommDesc(NslbDpAlgorithmInfo& algorithmInfo, const std::string& identifier)
     931              : {
     932            8 :     (void)memset_s(algorithmInfo.commDesc, COMM_DESC_MAX_LENGTH, 0, sizeof(algorithmInfo.commDesc));
     933            8 :     s32 ret = strncpy_s(algorithmInfo.commDesc, COMM_DESC_MAX_LENGTH, identifier.c_str(), identifier.size());
     934            8 :     if (ret != EOK) {
     935            0 :         HCCL_ERROR("[NSLB-DP] strncpy_s algorithmInfo.commDesc fail");
     936            0 :         return true;
     937              :     }
     938            8 :     algorithmInfo.commDesc[COMM_DESC_MAX_LENGTH - 1] = '\0';
     939              : 
     940            8 :     HCCL_INFO("[NSLB-DP] CheckCommDescExit algorithmInfo.commDesc[%s] .", algorithmInfo.commDesc);
     941              : 
     942              :     // 去除不存在的通信域信息
     943            8 :     bool commDescExit = false;
     944           10 :     for (const auto& info : hcclNslbDpCommConfig_) {
     945            7 :         if (strcmp(algorithmInfo.commDesc, info.commDesc) == 0) {
     946            5 :             commDescExit = true;
     947            5 :             break;
     948              :         }
     949              :     }
     950            8 :     return commDescExit;
     951              : }
     952              : 
     953              : /* 根据表一信息填充commMd5Sum;memcpy失败返回false */
     954            6 : bool hcclNslbDp::FillAlgInfoCommMd5(NslbDpAlgorithmInfo& algorithmInfo)
     955              : {
     956              :     // 根据表一信息填充MD5
     957            7 :     for (size_t comsize = 0; comsize < hcclNslbDpCommConfig_.size(); comsize++) {
     958            6 :         if (strcmp(algorithmInfo.commDesc, hcclNslbDpCommConfig_[comsize].commDesc) == 0) {
     959           10 :             s32 sRet = memcpy_s(
     960            5 :                 algorithmInfo.commMd5Sum, sizeof(algorithmInfo.commMd5Sum), hcclNslbDpCommConfig_[comsize].commMd5Sum,
     961              :                 sizeof(hcclNslbDpCommConfig_[comsize].commMd5Sum));
     962            5 :             if (sRet != EOK) {
     963            0 :                 HCCL_ERROR("memcpy_s commMd5Sum fail");
     964            0 :                 return false;
     965              :             }
     966            5 :             break;
     967              :         }
     968              :     }
     969            6 :     return true;
     970              : }
     971              : 
     972              : /* 填充srcLocalRankId/rootRank/oper/algorithm基础字段 */
     973            6 : void hcclNslbDp::FillAlgInfoBaseFields(
     974              :     NslbDpAlgorithmInfo& algorithmInfo, HcclCMDType opType, u32 srcLocalRankId, u32 rootRank, u8 algType)
     975              : {
     976            6 :     algorithmInfo.srcLocalRankId = srcLocalRankId;
     977            6 :     algorithmInfo.rootRank = static_cast<u16>(rootRank);
     978            6 :     algorithmInfo.oper = GetNslbOpType(opType);
     979            6 :     algorithmInfo.algorithm = algType;
     980            6 : }
     981              : 
     982              : /* 判断是否与已有邻接表项重复(去重) */
     983            8 : bool hcclNslbDp::IsAlgAdjacencyDuplicated(const NslbDpAlgorithmInfo& algorithmInfo)
     984              : {
     985           11 :     for (const auto& info : hcclNslbDpAlgorithmInfo_) {
     986            5 :         HCCL_INFO(
     987              :             "[NSLB-DP-ADJ] info: *[%llu]-[%u]-[%u]-[%u]-[%u]* success.", algorithmInfo.taskId, info.srcLocalRankId,
     988              :             info.rootRank, info.oper, info.algorithm);
     989            5 :         if (info.taskId == algorithmInfo.taskId && info.srcLocalRankId == algorithmInfo.srcLocalRankId
     990            3 :             && info.rootRank == algorithmInfo.rootRank && info.oper == algorithmInfo.oper
     991            3 :             && info.algorithm == algorithmInfo.algorithm && strcmp(algorithmInfo.commDesc, info.commDesc) == 0) {
     992            2 :             return true;
     993              :         }
     994              :     }
     995            6 :     return false;
     996              : }
     997              : 
     998              : /* 填充dstRankNum与AdjInfo邻接信息;nsAdjInfo为空返回false */
     999            5 : bool hcclNslbDp::FillAlgInfoAdjInfo(NslbDpAlgorithmInfo& algorithmInfo, const AdjInfo& nslbAdjInfo, u32 srcLocalRankId)
    1000              : {
    1001            5 :     algorithmInfo.dstRankNum = nslbAdjInfo.dstRankNum;
    1002            5 :     HCCL_INFO("[NSLB-DP-ADJ] nslbAdjInfo.dstRankNum:[%u].", nslbAdjInfo.dstRankNum);
    1003              : 
    1004            5 :     if (nslbAdjInfo.nsAdjInfo.size() == 0) {
    1005            1 :         algorithmInfo.dstRankNum = 0;
    1006            1 :         HCCL_INFO("[NSLB-DP] get nsAdjInfo fail dstRankNum:[%u]", algorithmInfo.dstRankNum);
    1007            1 :         return false;
    1008              :     }
    1009              : 
    1010           14 :     for (size_t rankIndex = 0; rankIndex < nslbAdjInfo.nsAdjInfo.size(); rankIndex++) {
    1011              :         NslbDpAdjInfo adjInfo;
    1012           10 :         adjInfo.dstLocalRankId = nslbAdjInfo.nsAdjInfo[rankIndex].dstLocalRankId;
    1013           10 :         adjInfo.phaseId = nslbAdjInfo.nsAdjInfo[rankIndex].phaseId;
    1014           10 :         adjInfo.rev = nslbAdjInfo.nsAdjInfo[rankIndex].rev;
    1015           10 :         HCCL_INFO(
    1016              :             "[NSLB-DP-ADJ] adjINfo:[%u]-[%u]-[%u] success.", srcLocalRankId,
    1017              :             nslbAdjInfo.nsAdjInfo[rankIndex].dstLocalRankId, nslbAdjInfo.nsAdjInfo[rankIndex].phaseId);
    1018           10 :         algorithmInfo.AdjInfo.push_back(adjInfo);
    1019              :     }
    1020            4 :     return true;
    1021              : }
    1022              : 
    1023            5 : bool hcclNslbDp::CheckCommDescExit(NslbDpOperatorInfo& OperatorInfo)
    1024              : {
    1025            5 :     HCCL_DEBUG("[NSLB-DP-OPER] Check CommDescExit size:[%zu].", hcclNslbDpCommConfig_.size());
    1026            7 :     for (const auto& info : hcclNslbDpCommConfig_) {
    1027            4 :         HCCL_DEBUG("[NSLB-DP-OPER] CheckCommDescExit info.commDesc[%s] .", info.commDesc);
    1028            4 :         if (strcmp(OperatorInfo.commDesc, info.commDesc) == 0) {
    1029            2 :             return true;
    1030              :         }
    1031              :     }
    1032            3 :     return false;
    1033              : }
    1034              : 
    1035            4 : void hcclNslbDp::fullcommDescInitTime(std::string identifier, NslbDpOperatorInfo& OperatorInfo)
    1036              : {
    1037              :     /* 获取通信域唯一标识 */
    1038            4 :     s32 ret = strncpy_s(OperatorInfo.commDesc, COMM_DESC_MAX_LENGTH, identifier.c_str(), identifier.size());
    1039            4 :     if (ret != EOK) {
    1040            0 :         HCCL_INFO("[NSLB-DP] strncpy_s OperatorInfo.commDesc fail");
    1041            0 :         return;
    1042              :     }
    1043            4 :     HCCL_DEBUG("[NSLB-DP-OPER] fullcommDescInitTime commDesc[%s] .", identifier.c_str());
    1044              : 
    1045            4 :     OperatorInfo.commDesc[COMM_DESC_MAX_LENGTH - 1] = '\0';
    1046              : 
    1047              :     // commInitTime在有ranktable的赋值
    1048              :     OperatorInfo.commInitTime
    1049            4 :         = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
    1050            4 :               .count();
    1051              : 
    1052            4 :     return;
    1053              : }
    1054              : 
    1055            4 : bool hcclNslbDp::CheckSameOperatorVal(size_t operSize, NslbDpOperatorInfo& OperatorInfo, u32 rootRank)
    1056              : {
    1057            4 :     size_t num = hcclNslbDpOperatorVal_.size();
    1058            4 :     if (operSize >= num) {
    1059            1 :         return false;
    1060              :     }
    1061            3 :     if (hcclNslbDpOperatorVal_[operSize].taskId == OperatorInfo.taskId
    1062            3 :         && hcclNslbDpOperatorVal_[operSize].rootRank == rootRank
    1063            2 :         && hcclNslbDpOperatorVal_[operSize].oper == OperatorInfo.oper
    1064            2 :         && hcclNslbDpOperatorVal_[operSize].algorithm == OperatorInfo.algorithm
    1065            6 :         && strcmp(OperatorInfo.commDesc, hcclNslbDpOperatorVal_[operSize].commDesc) == 0) {
    1066            1 :         return true;
    1067              :     }
    1068            2 :     return false;
    1069              : }
    1070              : 
    1071              : /* 写算法算子表--表2 */
    1072            4 : HcclResult hcclNslbDp::GenerateOpAndAdjTable(
    1073              :     HcclCMDType opType, u32 rootRank, u32 srcLocalRankId, u8 algType, std::string identifier, u64 count, u32 rankSize)
    1074              : {
    1075            4 :     HCCL_INFO("[NSLB-DP-OPER] count=[%llu], hcclNslbDpOperatorVal_ size:[%zu].", count, hcclNslbDpOperatorVal_.size());
    1076            4 :     u64 taskId = GetGlobalCommTaskId();
    1077            4 :     if (taskId == 0) {
    1078            1 :         return HCCL_SUCCESS;
    1079              :     }
    1080              : 
    1081              :     // 获取,0号
    1082            3 :     if (rootRank != 0) {
    1083            1 :         return HCCL_SUCCESS;
    1084              :     }
    1085            2 :     u64 trafficNum = count;
    1086            2 :     if (CheckSupportOptype(opType) == false) {
    1087            0 :         trafficNum = 0;
    1088            0 :         HCCL_DEBUG("[NSLB-DP-OPER] CheckSupportOptype false trafficNum == 0.");
    1089              :     }
    1090              : 
    1091            2 :     NslbDpOperatorInfo OperatorInfo = {};
    1092              :     // 获取task id
    1093            2 :     OperatorInfo.taskId = taskId;
    1094            2 :     (void)memset_s(OperatorInfo.commDesc, COMM_DESC_MAX_LENGTH, 0, sizeof(OperatorInfo.commDesc));
    1095              : 
    1096            2 :     fullcommDescInitTime(identifier, OperatorInfo);
    1097              : 
    1098              :     // 去除不存在的通信域信息
    1099            2 :     if (CheckCommDescExit(OperatorInfo) == false) {
    1100            1 :         HCCL_INFO("[NSLB-DP-OPER] CheckCommDesc not exit ");
    1101            1 :         return HCCL_SUCCESS;
    1102              :     }
    1103              : 
    1104              :     // 获取operator、algorithm
    1105            1 :     OperatorInfo.oper = GetNslbOpType(opType);
    1106            1 :     OperatorInfo.algorithm = algType;
    1107            1 :     u64 trafficCount = GetNslbDpFirstFourBit(OperatorInfo.oper, OperatorInfo.algorithm);
    1108            1 :     trafficCount = (trafficCount << NSLBDP_TRAFFICCONUT) + trafficNum;
    1109              : 
    1110            1 :     for (size_t operSize = 0; operSize < hcclNslbDpOperatorVal_.size(); operSize++) {
    1111            0 :         if (CheckSameOperatorVal(operSize, OperatorInfo, rootRank) == true) {
    1112            0 :             if (hcclNslbDpOperatorVal_[operSize].trafficCnt < trafficCount && srcLocalRankId == 0) {
    1113            0 :                 hcclNslbDpOperatorVal_[operSize].trafficCnt = trafficCount;
    1114            0 :                 hcclNslbDpOperatorVal_[operSize].sedFlag = 0;
    1115            0 :                 SendRankTableOpAndAdj(hcclNslbDpOperatorVal_[operSize]);
    1116            0 :                 HCCL_RUN_INFO(
    1117              :                     "[NSLB-DP-ADJ] commDesc[%s] try to update trafficCnt[%llu] success.", OperatorInfo.commDesc,
    1118              :                     trafficCount);
    1119              :             }
    1120            0 :             return HCCL_SUCCESS;
    1121              :         }
    1122              :     }
    1123              : 
    1124            1 :     OperatorInfo.trafficCnt = trafficCount; // 判断变大
    1125            1 :     OperatorInfo.rootRank = rootRank;
    1126            1 :     HCCL_INFO(
    1127              :         "[NSLB-DP-OPER] add operInfo:***[%llu]***[%llu]***[%u]***[%u]***[%u] success.", taskId,
    1128              :         OperatorInfo.commInitTime, rootRank, OperatorInfo.oper, OperatorInfo.algorithm);
    1129              : 
    1130            1 :     GetNslbDpl4SPortId(rankSize, algType, &OperatorInfo.l4SPortId);
    1131            1 :     if (srcLocalRankId == 0) {
    1132            1 :         SendRankTableOpAndAdj(OperatorInfo);
    1133              :     }
    1134            1 :     hcclNslbDpOperatorVal_.push_back(OperatorInfo);
    1135              : 
    1136            1 :     return HCCL_SUCCESS;
    1137              : }
    1138              : 
    1139              : /* 根将表1 序列化处理 */
    1140            0 : std::vector<uint8_t> hcclNslbDp::serializeTLV_TableFir(NslbDpCommConfigInfo cominfo)
    1141              : {
    1142            0 :     HCCL_DEBUG("[NSLB-DP] entry serializeTLV TBL_COMM_INFO beg");
    1143              : 
    1144            0 :     std::vector<uint8_t> tlvData;
    1145              : 
    1146              :     // Task ID
    1147            0 :     uint64_t netTaskId = htobe64(cominfo.taskId);
    1148            0 :     tlvData.resize(tlvData.size() + sizeof(netTaskId));
    1149            0 :     (void)memcpy_s(
    1150            0 :         tlvData.data() + tlvData.size() - sizeof(netTaskId), sizeof(netTaskId), &netTaskId, sizeof(netTaskId));
    1151              : 
    1152              :     // CommDesc
    1153            0 :     tlvData.insert(tlvData.end(), cominfo.commDesc, cominfo.commDesc + COMM_DESC_MAX_LENGTH);
    1154              : 
    1155              :     // CommInitTime
    1156            0 :     uint64_t netCommInitTime = htobe64(cominfo.commInitTime);
    1157            0 :     tlvData.resize(tlvData.size() + sizeof(netCommInitTime));
    1158            0 :     (void)memcpy_s(
    1159            0 :         tlvData.data() + tlvData.size() - sizeof(netCommInitTime), sizeof(netCommInitTime), &netCommInitTime,
    1160              :         sizeof(netCommInitTime));
    1161              : 
    1162              :     // packetId
    1163            0 :     uint16_t netPacketId = htons(cominfo.packetId);
    1164            0 :     tlvData.resize(tlvData.size() + sizeof(netPacketId));
    1165            0 :     (void)memcpy_s(
    1166            0 :         tlvData.data() + tlvData.size() - sizeof(netPacketId), sizeof(netPacketId), &netPacketId, sizeof(netPacketId));
    1167              : 
    1168              :     // rev
    1169            0 :     uint16_t netRev = htons(cominfo.rev);
    1170            0 :     tlvData.resize(tlvData.size() + sizeof(netRev));
    1171            0 :     (void)memcpy_s(tlvData.data() + tlvData.size() - sizeof(netRev), sizeof(netRev), &netRev, sizeof(netRev));
    1172              : 
    1173              :     // packetNum
    1174            0 :     uint16_t netPacketNum = htons(cominfo.packetNum);
    1175            0 :     tlvData.resize(tlvData.size() + sizeof(netPacketNum));
    1176            0 :     (void)memcpy_s(
    1177            0 :         tlvData.data() + tlvData.size() - sizeof(netPacketNum), sizeof(netPacketNum), &netPacketNum,
    1178              :         sizeof(netPacketNum));
    1179              : 
    1180              :     // revSecond
    1181            0 :     uint16_t netRevSecond = htons(cominfo.revSecond);
    1182            0 :     tlvData.resize(tlvData.size() + sizeof(netRevSecond));
    1183            0 :     (void)memcpy_s(
    1184            0 :         tlvData.data() + tlvData.size() - sizeof(netRevSecond), sizeof(netRevSecond), &netRevSecond,
    1185              :         sizeof(netRevSecond));
    1186              : 
    1187              :     // sendRankInfo
    1188            0 :     for (const auto& rankInfo : cominfo.sendRankInfo) {
    1189            0 :         uint32_t netDeviceIp = htonl(rankInfo.deviceIp);
    1190            0 :         tlvData.resize(tlvData.size() + sizeof(netDeviceIp));
    1191            0 :         (void)memcpy_s(
    1192            0 :             tlvData.data() + tlvData.size() - sizeof(netDeviceIp), sizeof(netDeviceIp), &netDeviceIp,
    1193              :             sizeof(netDeviceIp));
    1194              :     }
    1195              : 
    1196              :     // CommMd5Sum
    1197            0 :     tlvData.insert(tlvData.end(), cominfo.commMd5Sum, cominfo.commMd5Sum + sizeof(cominfo.commMd5Sum));
    1198              : 
    1199              :     // RankTotalNum
    1200            0 :     uint16_t netRankTotalNum = htons(cominfo.rankTotalNum);
    1201            0 :     tlvData.resize(tlvData.size() + sizeof(netRankTotalNum));
    1202            0 :     (void)memcpy_s(
    1203            0 :         tlvData.data() + tlvData.size() - sizeof(netRankTotalNum), sizeof(netRankTotalNum), &netRankTotalNum,
    1204              :         sizeof(netRankTotalNum));
    1205              : 
    1206              :     // Rank Number
    1207            0 :     uint16_t netRankNum = htons(cominfo.rankNum);
    1208            0 :     tlvData.resize(tlvData.size() + sizeof(netRankNum));
    1209            0 :     (void)memcpy_s(
    1210            0 :         tlvData.data() + tlvData.size() - sizeof(netRankNum), sizeof(netRankNum), &netRankNum, sizeof(netRankNum));
    1211              : 
    1212              :     // Rank Info
    1213            0 :     for (const auto& rankInfo : cominfo.rankInfo) {
    1214            0 :         uint32_t netDeviceIp = htonl(rankInfo.deviceIp);
    1215            0 :         uint32_t netServerIp = htonl(rankInfo.serverIp);
    1216            0 :         uint16_t netPodId = htons(rankInfo.podId);
    1217            0 :         uint16_t netRev3 = htons(rankInfo.rev);
    1218            0 :         tlvData.resize(tlvData.size() + sizeof(netDeviceIp));
    1219            0 :         (void)memcpy_s(
    1220            0 :             tlvData.data() + tlvData.size() - sizeof(netDeviceIp), sizeof(netDeviceIp), &netDeviceIp,
    1221              :             sizeof(netDeviceIp));
    1222            0 :         tlvData.resize(tlvData.size() + sizeof(netServerIp));
    1223            0 :         (void)memcpy_s(
    1224            0 :             tlvData.data() + tlvData.size() - sizeof(netServerIp), sizeof(netServerIp), &netServerIp,
    1225              :             sizeof(netServerIp));
    1226            0 :         tlvData.resize(tlvData.size() + sizeof(netPodId));
    1227            0 :         (void)memcpy_s(
    1228            0 :             tlvData.data() + tlvData.size() - sizeof(netPodId), sizeof(netPodId), &netPodId, sizeof(netPodId));
    1229            0 :         tlvData.resize(tlvData.size() + sizeof(netRev3));
    1230            0 :         (void)memcpy_s(tlvData.data() + tlvData.size() - sizeof(netRev3), sizeof(netRev3), &netRev3, sizeof(netRev3));
    1231              :     }
    1232            0 :     HCCL_DEBUG("[NSLB-DP] entry serializeTLV TBL_COMM_INFO end");
    1233              : 
    1234            0 :     return tlvData;
    1235            0 : }
    1236              : 
    1237           12 : void hcclNslbDp::fullCommConfigInfo(NslbDpCommConfigInfo& tab_f, NslbDpCommConfigVal cominfo, u32 packetNum)
    1238              : {
    1239           12 :     HCCL_DEBUG("[NSLB-DP] entry full CommConfigInfo");
    1240           12 :     tab_f.taskId = cominfo.taskId;
    1241           12 :     s32 sRet = memcpy_s(tab_f.commDesc, sizeof(tab_f.commDesc), cominfo.commDesc, COMM_DESC_MAX_LENGTH);
    1242           12 :     if (sRet != EOK) {
    1243            0 :         HCCL_INFO("memcpy_s commDesc fail");
    1244              :     }
    1245           12 :     tab_f.commInitTime = cominfo.commInitTime;
    1246              : 
    1247           12 :     tab_f.rev = 0;
    1248           12 :     tab_f.packetNum = packetNum;
    1249           12 :     tab_f.revSecond = 0;
    1250           12 :     u32 sendCnt = std::min(packetNum, static_cast<u32>(cominfo.rankInfo.size()));
    1251           48 :     for (u32 dip = 0; dip < sendCnt; dip++) {
    1252           36 :         tab_f.sendRankInfo[dip].deviceIp = cominfo.rankInfo[dip].deviceIp;
    1253              :     }
    1254           12 :     sRet = memcpy_s(tab_f.commMd5Sum, sizeof(tab_f.commMd5Sum), cominfo.commMd5Sum, sizeof(cominfo.commMd5Sum));
    1255           12 :     if (sRet != EOK) {
    1256            0 :         HCCL_INFO("memcpy_s commmd5 fail");
    1257              :     }
    1258           12 : }
    1259              : 
    1260              : /* 根据表1 中的rank数量进行分片处理 */
    1261            7 : HcclResult hcclNslbDp::SendTableProc(u32 rank, u32 packetNum, NslbDpCommConfigVal cominfo)
    1262              : {
    1263            7 :     if (packetNum - 1 < rank) {
    1264            1 :         HCCL_INFO("[NSLB-DP] rank [%u] no need send TableFir(packetNum[%u]).", rank, packetNum);
    1265            1 :         return HCCL_SUCCESS;
    1266              :     }
    1267            6 :     u32 packetIndex = rank;
    1268            6 :     NslbDpCommConfigInfo tab_f = {};
    1269            6 :     fullCommConfigInfo(tab_f, cominfo, packetNum);
    1270            6 :     tab_f.packetId = packetIndex;
    1271              : 
    1272            6 :     u32 start = packetIndex * NSLBDP_RANKTOTALNUM_BLOCK_FIR;
    1273            6 :     u32 end = (packetIndex + 1) * NSLBDP_RANKTOTALNUM_BLOCK_FIR;
    1274            6 :     u32 totalSize = static_cast<u32>(cominfo.rankInfo.size());
    1275            6 :     if (totalSize < start) {
    1276            1 :         HCCL_INFO("[NSLB-DP] Comm RankInfo not as expected, size[%u] < start[%u]", totalSize, start);
    1277            1 :         return HCCL_SUCCESS;
    1278              :     }
    1279            5 :     end = std::min(end, totalSize);
    1280              : 
    1281            5 :     u32 count = end - start;
    1282            5 :     tab_f.rankInfo.reserve(count);
    1283         3078 :     for (u32 i = start; i < end; i++) {
    1284         3073 :         tab_f.rankInfo.push_back(cominfo.rankInfo[i]);
    1285              :     }
    1286            5 :     tab_f.rankTotalNum = cominfo.rankTotalNum;
    1287            5 :     tab_f.rankNum = static_cast<u16>(tab_f.rankInfo.size());
    1288              : 
    1289            5 :     const char* tag = (packetIndex != packetNum - 1) ? "SendTableProc-F" : "SendTableProc-N";
    1290            5 :     HCCL_INFO(
    1291              :         "[NSLB-DP] %s info:[%u]-[%u]-[%u]-[%u].", tag, packetNum, packetIndex, cominfo.rankTotalNum,
    1292              :         tab_f.rankInfo.size());
    1293            5 :     HCCL_DEBUG(
    1294              :         "[NSLB-DP] SendRankTable-info:[%u]-[%u]-[%u]-[%u].", tab_f.rankTotalNum, tab_f.packetNum, tab_f.rankTotalNum,
    1295              :         tab_f.rankInfo.size());
    1296            5 :     SendRankTable(tab_f);
    1297              : 
    1298            5 :     return HCCL_SUCCESS;
    1299            6 : }
    1300              : 
    1301              : /* 遍历表1 执行send 流程 */
    1302            1 : HcclResult hcclNslbDp::SendTableFir(uint32_t rank)
    1303              : {
    1304            1 :     size_t size = hcclNslbDpCommConfig_.size();
    1305            1 :     HCCL_INFO("[NSLB-DP] SendTableFir size:[%u] success.", size);
    1306            2 :     for (size_t i = 0; i < hcclNslbDpCommConfig_.size(); i++) {
    1307            1 :         u32 rankTotalNum = hcclNslbDpCommConfig_[i].rankTotalNum;
    1308            1 :         if (rankTotalNum > NSLBDP_RANKTOTALNUM_BLOCK_FOU) {
    1309            0 :             return HCCL_SUCCESS;
    1310              :         }
    1311            1 :         u32 packetNum = CalcPacketNum(rankTotalNum);
    1312            1 :         SendTableProc(rank, packetNum, hcclNslbDpCommConfig_[i]);
    1313              :     }
    1314            1 :     HCCL_DEBUG("[NSLB-DP] entry SendTableFir end");
    1315            1 :     return HCCL_SUCCESS;
    1316              : }
    1317              : 
    1318            5 : HcclResult hcclNslbDp::SendRankTable(NslbDpCommConfigInfo tab_f)
    1319              : {
    1320            5 :     if (GetInitNetCoFlag() == false) {
    1321            5 :         return HCCL_SUCCESS;
    1322              :     }
    1323              : 
    1324            0 :     u32 tablen = sizeof(tab_f);
    1325            0 :     HCCL_INFO("[NSLB-DP] SendRankTable NslbDpCommConfigInfo len:[%u].", tablen);
    1326              : 
    1327            0 :     std::vector<uint8_t> tlvData = serializeTLV_TableFir(tab_f);
    1328            0 :     u32 datlen = tlvData.size();
    1329            0 :     HCCL_INFO("[NSLB-DP] SendRankTable tlvData.len:[%u] success.", datlen);
    1330              : 
    1331            0 :     if (nslbdp_handle_ == nullptr) {
    1332            0 :         HCCL_INFO("[NSLB-DP] ndlbdp nslbdp_handle_ error SendRankTable.");
    1333            0 :         return HCCL_SUCCESS;
    1334              :     }
    1335              : 
    1336            0 :     nslb_msg sendMsg;
    1337            0 :     nslb_msg recvMsg;
    1338            0 :     sendMsg.type = NSLBDP_TYPE_TBL_COMM_INFO;
    1339            0 :     sendMsg.length = datlen;
    1340            0 :     sendMsg.data.assign(tlvData.begin(), tlvData.end());
    1341            0 :     s32 ret = H2DTlvRequest(
    1342            0 :         nslbdp_handle_, MODULE_TYPE_NSLB, reinterpret_cast<TlvMsg*>(&sendMsg), reinterpret_cast<TlvMsg*>(&recvMsg));
    1343              : 
    1344            0 :     HCCL_INFO("[NSLBDP-SENDTABLE] hccl send table NSLBDP_TYPE_TBL_COMM_INFO(1001) to hccp. ret(%d)\n", ret);
    1345            0 :     return HCCL_SUCCESS;
    1346            0 : }
    1347              : 
    1348              : /* 根将表2 序列化处理 */
    1349            2 : std::vector<uint8_t> hcclNslbDp::serializeTLV_TableOpAndAdj(NslbDpOperatorInfo& info)
    1350              : {
    1351            2 :     HCCL_DEBUG("[NSLB-DP] ndlbdp entry serializeTLV TableOpAndAdj.");
    1352            2 :     std::vector<uint8_t> tlvData;
    1353              : 
    1354              :     // 处理 taskId
    1355            2 :     uint64_t netTaskId = htobe64(info.taskId);
    1356            2 :     tlvData.resize(tlvData.size() + sizeof(netTaskId));
    1357            2 :     (void)memcpy_s(
    1358            2 :         tlvData.data() + tlvData.size() - sizeof(netTaskId), sizeof(netTaskId), &netTaskId, sizeof(netTaskId));
    1359              : 
    1360              :     // 处理 commDesc
    1361            2 :     tlvData.insert(tlvData.end(), info.commDesc, info.commDesc + COMM_DESC_MAX_LENGTH);
    1362              : 
    1363              :     // 处理 commInitTime
    1364            2 :     uint64_t netCommInitTime = htobe64(info.commInitTime);
    1365            2 :     tlvData.resize(tlvData.size() + sizeof(netCommInitTime));
    1366            2 :     (void)memcpy_s(
    1367            2 :         tlvData.data() + tlvData.size() - sizeof(netCommInitTime), sizeof(netCommInitTime), &netCommInitTime,
    1368              :         sizeof(netCommInitTime));
    1369              : 
    1370              :     // 处理 oper
    1371            2 :     tlvData.push_back(info.oper);
    1372              : 
    1373              :     // 处理 algorithm
    1374            2 :     tlvData.push_back(info.algorithm);
    1375              : 
    1376              :     // 处理 rootRank
    1377            2 :     uint16_t netRootRank = htons(info.rootRank);
    1378            2 :     tlvData.resize(tlvData.size() + sizeof(netRootRank));
    1379            2 :     (void)memcpy_s(
    1380            2 :         tlvData.data() + tlvData.size() - sizeof(netRootRank), sizeof(netRootRank), &netRootRank, sizeof(netRootRank));
    1381              : 
    1382              :     // 处理 trafficCnt
    1383            2 :     uint64_t netTrafficCnt = htobe64(info.trafficCnt);
    1384            2 :     tlvData.resize(tlvData.size() + sizeof(netTrafficCnt));
    1385            2 :     (void)memcpy_s(
    1386            2 :         tlvData.data() + tlvData.size() - sizeof(netTrafficCnt), sizeof(netTrafficCnt), &netTrafficCnt,
    1387              :         sizeof(netTrafficCnt));
    1388              : 
    1389              :     // 处理 l4SPortId
    1390            2 :     uint16_t netL4SPortId = htons(info.l4SPortId);
    1391            2 :     tlvData.resize(tlvData.size() + sizeof(netL4SPortId));
    1392            2 :     (void)memcpy_s(
    1393            2 :         tlvData.data() + tlvData.size() - sizeof(netL4SPortId), sizeof(netL4SPortId), &netL4SPortId,
    1394              :         sizeof(netL4SPortId));
    1395              : 
    1396              :     // 处理 maskLen
    1397            2 :     uint16_t netMaskLen = htons(info.maskLen);
    1398            2 :     tlvData.resize(tlvData.size() + sizeof(netMaskLen));
    1399            2 :     (void)memcpy_s(
    1400            2 :         tlvData.data() + tlvData.size() - sizeof(netMaskLen), sizeof(netMaskLen), &netMaskLen, sizeof(netMaskLen));
    1401            2 :     HCCL_INFO("[NSLB-DP] entry serializeTLV_TableOpAndAdj end.");
    1402            2 :     return tlvData;
    1403            0 : }
    1404              : 
    1405              : /* 执行send 流程 */
    1406            2 : HcclResult hcclNslbDp::SendRankTableOpAndAdj(NslbDpOperatorInfo& tab_f)
    1407              : {
    1408            2 :     if (GetInitNetCoFlag() == false) {
    1409            1 :         return HCCL_SUCCESS;
    1410              :     }
    1411            1 :     HCCL_DEBUG("[NSLB-DP] ndlbdp entry SendRankTableOpAndAdj.");
    1412            1 :     std::vector<uint8_t> tlvData = serializeTLV_TableOpAndAdj(tab_f);
    1413              : 
    1414            1 :     u32 datlen = tlvData.size();
    1415            1 :     HCCL_INFO("[NSLB-DP] SendRankTableOpAndAdj tlvData.len:[%u] success.", datlen);
    1416              : 
    1417            1 :     nslb_msg sendMsg;
    1418            1 :     nslb_msg recvMsg;
    1419            1 :     sendMsg.type = NSLBDP_TYPE_TBL_OPER;
    1420            1 :     sendMsg.length = datlen;
    1421            1 :     sendMsg.data.assign(tlvData.begin(), tlvData.end());
    1422            1 :     s32 ret = H2DTlvRequest(
    1423            1 :         nslbdp_handle_, MODULE_TYPE_NSLB, reinterpret_cast<TlvMsg*>(&sendMsg), reinterpret_cast<TlvMsg*>(&recvMsg));
    1424              : 
    1425            1 :     HCCL_INFO("[NSLBDP-SENDTABLE] hccl send table NSLBDP_TYPE_TBL_OPER(1002) to hccp. ret(%d)\n", ret);
    1426              : 
    1427            1 :     return HCCL_SUCCESS;
    1428            1 : }
    1429              : 
    1430              : /* 遍历表2 执行send 流程 */
    1431            1 : HcclResult hcclNslbDp::SendOpAndAdjTable()
    1432              : {
    1433            1 :     HCCL_DEBUG("[NSLB-DP] ndlbdp entry SendOpAndAdjTable.");
    1434            2 :     for (size_t i = 0; i < hcclNslbDpOperatorVal_.size(); i++) {
    1435            1 :         if (hcclNslbDpOperatorVal_[i].sedFlag == 1) {
    1436            0 :             continue;
    1437              :         }
    1438            1 :         NslbDpOperatorInfo tab_f = {};
    1439            1 :         tab_f.taskId = hcclNslbDpOperatorVal_[i].taskId;
    1440            2 :         s32 sRet = memcpy_s(
    1441            1 :             tab_f.commDesc, sizeof(tab_f.commDesc), hcclNslbDpOperatorVal_[i].commDesc, COMM_DESC_MAX_LENGTH);
    1442            1 :         if (sRet != EOK) {
    1443            0 :             HCCL_ERROR("memcpy_s commDesc fail");
    1444              :         }
    1445            1 :         tab_f.commInitTime = hcclNslbDpOperatorVal_[i].commInitTime;
    1446            1 :         tab_f.rootRank = hcclNslbDpOperatorVal_[i].rootRank;
    1447            1 :         tab_f.oper = hcclNslbDpOperatorVal_[i].oper;
    1448            1 :         tab_f.algorithm = hcclNslbDpOperatorVal_[i].algorithm;
    1449            1 :         tab_f.trafficCnt = hcclNslbDpOperatorVal_[i].trafficCnt;
    1450            1 :         tab_f.l4SPortId = hcclNslbDpOperatorVal_[i].l4SPortId;
    1451            1 :         tab_f.maskLen = hcclNslbDpOperatorVal_[i].maskLen;
    1452            1 :         SendRankTableOpAndAdj(tab_f);
    1453            1 :         hcclNslbDpOperatorVal_[i].sedFlag = 1;
    1454            1 :         HCCL_INFO("[NSLB-DP] try to sen RankTableOpAndAdj times:[%u].", i);
    1455              :     }
    1456            1 :     HCCL_INFO("[NSLB-DP] SendOpAndAdjTable end.");
    1457            1 :     return HCCL_SUCCESS;
    1458              : }
    1459              : 
    1460              : /* 根将表3 序列化处理 */
    1461            2 : std::vector<uint8_t> hcclNslbDp::serializeTLV_TableAlgorithmInfo(NslbDpAlgorithmTlv& info)
    1462              : {
    1463            2 :     HCCL_DEBUG("[NSLB-DP] entry serializeTLV_TableAlgorithmInfo.");
    1464            2 :     std::vector<uint8_t> tlvData;
    1465              : 
    1466              :     // 处理 taskId
    1467            2 :     uint64_t netTaskId = htobe64(info.taskId);
    1468            2 :     tlvData.resize(tlvData.size() + sizeof(netTaskId));
    1469            2 :     (void)memcpy_s(
    1470            2 :         tlvData.data() + tlvData.size() - sizeof(netTaskId), sizeof(netTaskId), &netTaskId, sizeof(netTaskId));
    1471              : 
    1472              :     // 处理 commDesc
    1473            2 :     tlvData.insert(tlvData.end(), info.commDesc, info.commDesc + COMM_DESC_MAX_LENGTH);
    1474              : 
    1475              :     // CommMd5Sum
    1476            2 :     tlvData.insert(tlvData.end(), info.commMd5Sum, info.commMd5Sum + sizeof(info.commMd5Sum));
    1477              : 
    1478              :     // 处理 srcLocalRankId
    1479            2 :     uint16_t netSrcLocalRankId = htons(info.srcLocalRankId);
    1480            2 :     tlvData.resize(tlvData.size() + sizeof(netSrcLocalRankId));
    1481            2 :     (void)memcpy_s(
    1482            2 :         tlvData.data() + tlvData.size() - sizeof(netSrcLocalRankId), sizeof(netSrcLocalRankId), &netSrcLocalRankId,
    1483              :         sizeof(netSrcLocalRankId));
    1484              : 
    1485              :     // 处理 oper
    1486            2 :     tlvData.push_back(info.oper);
    1487              : 
    1488              :     // 处理 algorithm
    1489            2 :     tlvData.push_back(info.algorithm);
    1490              : 
    1491              :     // 处理 rootRank
    1492            2 :     uint16_t netRootRank = htons(info.rootRank);
    1493            2 :     tlvData.resize(tlvData.size() + sizeof(netRootRank));
    1494            2 :     (void)memcpy_s(
    1495            2 :         tlvData.data() + tlvData.size() - sizeof(netRootRank), sizeof(netRootRank), &netRootRank, sizeof(netRootRank));
    1496              : 
    1497              :     // 处理 rev
    1498            2 :     uint16_t netRev = htons(info.rev);
    1499            2 :     tlvData.resize(tlvData.size() + sizeof(netRev));
    1500            2 :     (void)memcpy_s(tlvData.data() + tlvData.size() - sizeof(netRev), sizeof(netRev), &netRev, sizeof(netRev));
    1501              : 
    1502              :     // 处理 dstRankNum
    1503            2 :     uint16_t netDstRankNum = htons(info.dstRankNum);
    1504            2 :     tlvData.resize(tlvData.size() + sizeof(netDstRankNum));
    1505            2 :     (void)memcpy_s(
    1506            2 :         tlvData.data() + tlvData.size() - sizeof(netDstRankNum), sizeof(netDstRankNum), &netDstRankNum,
    1507              :         sizeof(netDstRankNum));
    1508              : 
    1509              :     // 处理 revSecond
    1510            2 :     uint16_t netRevSecond = htons(info.revsecond);
    1511            2 :     tlvData.resize(tlvData.size() + sizeof(netRevSecond));
    1512            2 :     (void)memcpy_s(
    1513            2 :         tlvData.data() + tlvData.size() - sizeof(netRevSecond), sizeof(netRevSecond), &netRevSecond,
    1514              :         sizeof(netRevSecond));
    1515              : 
    1516            2 :     HCCL_INFO("[NSLB-DP] serializeTLV_TableAlgorithmInfo proc adjInfo.");
    1517              :     // 处理 adjInfo
    1518            5 :     for (const auto& adj : info.AdjInfo) {
    1519            3 :         uint16_t netDstLocalRankId = htons(adj.dstLocalRankId);
    1520            3 :         tlvData.resize(tlvData.size() + sizeof(netDstLocalRankId));
    1521            3 :         (void)memcpy_s(
    1522            3 :             tlvData.data() + tlvData.size() - sizeof(netDstLocalRankId), sizeof(netDstLocalRankId), &netDstLocalRankId,
    1523              :             sizeof(netDstLocalRankId));
    1524            3 :         tlvData.push_back(adj.phaseId);
    1525            3 :         tlvData.push_back(adj.rev);
    1526            3 :         HCCL_INFO("[NSLB-DP] serializeTLV_TableAlgo adjInfo:***[%u]***[%c]***.", adj.dstLocalRankId, adj.phaseId);
    1527              :     }
    1528            2 :     HCCL_DEBUG("[NSLB-DP] serializeTLV_TableAlgo proc adjInfo end.");
    1529              : 
    1530            2 :     return tlvData;
    1531            0 : }
    1532              : 
    1533            1 : HcclResult hcclNslbDp::SendRankTableAlgorithmInfo(NslbDpAlgorithmTlv& tab_f)
    1534              : {
    1535            1 :     if (GetInitNetCoFlag() == false) {
    1536            0 :         return HCCL_SUCCESS;
    1537              :     }
    1538            1 :     std::vector<uint8_t> tlvData = serializeTLV_TableAlgorithmInfo(tab_f);
    1539              : 
    1540            1 :     u32 datlen = tlvData.size();
    1541            1 :     HCCL_INFO("[NSLB-DP] SendRankTableAlgorithmInfo tlvData.len:[%u] success.", datlen);
    1542              : 
    1543            1 :     nslb_msg sendMsg;
    1544            1 :     nslb_msg recvMsg;
    1545            1 :     sendMsg.type = NSLBDP_TYPE_TBL_ADJ;
    1546            1 :     sendMsg.length = datlen;
    1547            1 :     sendMsg.data.assign(tlvData.begin(), tlvData.end());
    1548            1 :     s32 ret = H2DTlvRequest(
    1549            1 :         nslbdp_handle_, MODULE_TYPE_NSLB, reinterpret_cast<TlvMsg*>(&sendMsg), reinterpret_cast<TlvMsg*>(&recvMsg));
    1550              : 
    1551            1 :     HCCL_INFO("[NSLBDP-SENDTABLE] hccl send table NSLBDP_TYPE_TBL_ADJ(1003) to hccp. ret(%d)\n", ret);
    1552            1 :     return HCCL_SUCCESS;
    1553            1 : }
    1554              : 
    1555              : /* 遍历表3 执行send 流程 */
    1556            1 : HcclResult hcclNslbDp::SendAlgorithmInfoTable()
    1557              : {
    1558            1 :     u32 size = hcclNslbDpAlgorithmInfo_.size();
    1559            1 :     HCCL_INFO("[NSLB-DP] ndlbdp entry SendAlgorithmInfoTable size=[%u].", size);
    1560              : 
    1561            2 :     for (size_t i = 0; i < hcclNslbDpAlgorithmInfo_.size(); i++) {
    1562            1 :         if (hcclNslbDpAlgorithmInfo_[i].sedFlag == 1) {
    1563            0 :             continue;
    1564              :         }
    1565            1 :         NslbDpAlgorithmTlv tab_f = {};
    1566            1 :         tab_f.taskId = hcclNslbDpAlgorithmInfo_[i].taskId;
    1567            2 :         s32 sRet = memcpy_s(
    1568            1 :             tab_f.commDesc, sizeof(tab_f.commDesc), hcclNslbDpAlgorithmInfo_[i].commDesc, COMM_DESC_MAX_LENGTH);
    1569            2 :         sRet = memcpy_s(
    1570            1 :             tab_f.commMd5Sum, sizeof(tab_f.commMd5Sum), hcclNslbDpAlgorithmInfo_[i].commMd5Sum,
    1571              :             sizeof(hcclNslbDpAlgorithmInfo_[i].commMd5Sum));
    1572            1 :         if (sRet != EOK) {
    1573            0 :             HCCL_INFO("memcpy_s commDesc fail");
    1574              :         }
    1575            1 :         tab_f.srcLocalRankId = hcclNslbDpAlgorithmInfo_[i].srcLocalRankId;
    1576            1 :         tab_f.rootRank = hcclNslbDpAlgorithmInfo_[i].rootRank;
    1577            1 :         tab_f.oper = hcclNslbDpAlgorithmInfo_[i].oper;
    1578            1 :         tab_f.algorithm = hcclNslbDpAlgorithmInfo_[i].algorithm;
    1579              : 
    1580            1 :         tab_f.rev = 0;
    1581              : 
    1582            1 :         tab_f.dstRankNum = hcclNslbDpAlgorithmInfo_[i].dstRankNum;
    1583            1 :         tab_f.revsecond = 0;
    1584            1 :         tab_f.AdjInfo = hcclNslbDpAlgorithmInfo_[i].AdjInfo;
    1585              : 
    1586            1 :         SendRankTableAlgorithmInfo(tab_f);
    1587            1 :         HCCL_INFO("[NSLB-DP] try to sen AlgorithmInfoTable times:[%u].", i);
    1588              : 
    1589            1 :         hcclNslbDpAlgorithmInfo_[i].sedFlag = 1;
    1590            1 :     }
    1591            1 :     HCCL_DEBUG("[NSLB-DP] entry SendAlgorithmInfoTable end.");
    1592              : 
    1593            1 :     return HCCL_SUCCESS;
    1594              : }
    1595              : 
    1596              : /* 序列化表4 */
    1597            0 : std::vector<uint8_t> hcclNslbDp::serializeTLV_TableGlobalRankInfo(NslbDpGlobalRankInfo& info)
    1598              : {
    1599            0 :     HCCL_DEBUG("[NSLB-DP] entry serializeTLV_TableGlobalRankInfo.");
    1600            0 :     std::vector<uint8_t> tlvData;
    1601              :     // 处理 taskId
    1602            0 :     uint64_t netTaskId = htobe64(info.taskId);
    1603            0 :     tlvData.resize(tlvData.size() + sizeof(netTaskId));
    1604            0 :     (void)memcpy_s(
    1605            0 :         tlvData.data() + tlvData.size() - sizeof(netTaskId), sizeof(netTaskId), &netTaskId, sizeof(netTaskId));
    1606              : 
    1607              :     // 处理 commDesc
    1608            0 :     tlvData.insert(tlvData.end(), info.commDesc, info.commDesc + COMM_DESC_MAX_LENGTH);
    1609              : 
    1610              :     // 处理 commInitTime
    1611            0 :     uint64_t netCommInitTime = htobe64(info.commInitTime);
    1612            0 :     tlvData.resize(tlvData.size() + sizeof(netCommInitTime));
    1613            0 :     (void)memcpy_s(
    1614            0 :         tlvData.data() + tlvData.size() - sizeof(netCommInitTime), sizeof(netCommInitTime), &netCommInitTime,
    1615              :         sizeof(netCommInitTime));
    1616              : 
    1617              :     // 处理 packetId
    1618            0 :     uint16_t netPacketId = htons(info.packetId);
    1619            0 :     tlvData.resize(tlvData.size() + sizeof(netPacketId));
    1620            0 :     (void)memcpy_s(
    1621            0 :         tlvData.data() + tlvData.size() - sizeof(netPacketId), sizeof(netPacketId), &netPacketId, sizeof(netPacketId));
    1622              : 
    1623              :     // 处理 rev
    1624            0 :     uint16_t netRev = htons(info.rev);
    1625            0 :     tlvData.resize(tlvData.size() + sizeof(netRev));
    1626            0 :     (void)memcpy_s(tlvData.data() + tlvData.size() - sizeof(netRev), sizeof(netRev), &netRev, sizeof(netRev));
    1627              : 
    1628              :     // 处理 packetNum
    1629            0 :     uint16_t netPacketNum = htons(info.packetNum);
    1630            0 :     tlvData.resize(tlvData.size() + sizeof(netPacketNum));
    1631            0 :     (void)memcpy_s(
    1632            0 :         tlvData.data() + tlvData.size() - sizeof(netPacketNum), sizeof(netPacketNum), &netPacketNum,
    1633              :         sizeof(netPacketNum));
    1634            0 :     HCCL_INFO("[NSLB-DP] hcclNslbDpGlobalRankVal_ info.packetNum:[%u]", netPacketNum);
    1635              : 
    1636              :     // 处理 rev2
    1637            0 :     uint16_t netRev2 = htons(info.rev2);
    1638            0 :     tlvData.resize(tlvData.size() + sizeof(netRev2));
    1639            0 :     (void)memcpy_s(tlvData.data() + tlvData.size() - sizeof(netRev2), sizeof(netRev2), &netRev2, sizeof(netRev2));
    1640              : 
    1641              :     // 处理 sendRankInfo
    1642            0 :     for (const auto& rankInfo : info.sendRankInfo) {
    1643            0 :         uint32_t netDeviceIp = htonl(rankInfo.deviceIp);
    1644            0 :         tlvData.resize(tlvData.size() + sizeof(netDeviceIp));
    1645            0 :         (void)memcpy_s(
    1646            0 :             tlvData.data() + tlvData.size() - sizeof(netDeviceIp), sizeof(netDeviceIp), &netDeviceIp,
    1647              :             sizeof(netDeviceIp));
    1648              :     }
    1649              : 
    1650              :     // 处理 commMd5Sum
    1651            0 :     tlvData.insert(tlvData.end(), info.commMd5Sum, info.commMd5Sum + sizeof(info.commMd5Sum));
    1652              : 
    1653              :     // 处理 rankTotalNum
    1654            0 :     uint32_t netRankTotalNum = htonl(info.rankTotalNum);
    1655            0 :     tlvData.resize(tlvData.size() + sizeof(netRankTotalNum));
    1656            0 :     (void)memcpy_s(
    1657            0 :         tlvData.data() + tlvData.size() - sizeof(netRankTotalNum), sizeof(netRankTotalNum), &netRankTotalNum,
    1658              :         sizeof(netRankTotalNum));
    1659              : 
    1660              :     // 处理 rankNum
    1661            0 :     uint16_t netRankNum = htons(info.rankNum);
    1662            0 :     tlvData.resize(tlvData.size() + sizeof(netRankNum));
    1663            0 :     (void)memcpy_s(
    1664            0 :         tlvData.data() + tlvData.size() - sizeof(netRankNum), sizeof(netRankNum), &netRankNum, sizeof(netRankNum));
    1665              : 
    1666              :     // 处理 rev3
    1667            0 :     uint16_t netRev3 = htons(info.rev3);
    1668            0 :     tlvData.resize(tlvData.size() + sizeof(netRev3));
    1669            0 :     (void)memcpy_s(tlvData.data() + tlvData.size() - sizeof(netRev3), sizeof(netRev3), &netRev3, sizeof(netRev3));
    1670              : 
    1671              :     // 处理 rankInfo
    1672            0 :     for (const auto& rankInfo : info.rankInfo) {
    1673            0 :         uint32_t netDeviceIp = htonl(rankInfo.deviceIp);
    1674            0 :         uint32_t netServerIp = htonl(rankInfo.serverIp);
    1675            0 :         tlvData.resize(tlvData.size() + sizeof(netDeviceIp));
    1676            0 :         (void)memcpy_s(
    1677            0 :             tlvData.data() + tlvData.size() - sizeof(netDeviceIp), sizeof(netDeviceIp), &netDeviceIp,
    1678              :             sizeof(netDeviceIp));
    1679            0 :         tlvData.resize(tlvData.size() + sizeof(netServerIp));
    1680            0 :         (void)memcpy_s(
    1681            0 :             tlvData.data() + tlvData.size() - sizeof(netServerIp), sizeof(netServerIp), &netServerIp,
    1682              :             sizeof(netServerIp));
    1683              :     }
    1684            0 :     return tlvData;
    1685            0 : }
    1686              : 
    1687            4 : HcclResult hcclNslbDp::SendRankTableGlobalRank(NslbDpGlobalRankInfo& tab_f)
    1688              : {
    1689            4 :     if (GetInitNetCoFlag() == false) {
    1690            4 :         return HCCL_SUCCESS;
    1691              :     }
    1692            0 :     std::vector<uint8_t> tlvData = serializeTLV_TableGlobalRankInfo(tab_f);
    1693            0 :     u32 datlen = tlvData.size();
    1694            0 :     HCCL_INFO("[NSLB-DP] SendRankTableGlobalRank tlvData.len:[%u] success.", datlen);
    1695              : 
    1696            0 :     nslb_msg sendMsg;
    1697            0 :     nslb_msg recvMsg;
    1698            0 :     sendMsg.type = NSLBDP_TYPE_TBL_RANK;
    1699            0 :     sendMsg.length = datlen;
    1700            0 :     sendMsg.data.assign(tlvData.begin(), tlvData.end());
    1701            0 :     s32 ret = H2DTlvRequest(
    1702            0 :         nslbdp_handle_, MODULE_TYPE_NSLB, reinterpret_cast<TlvMsg*>(&sendMsg), reinterpret_cast<TlvMsg*>(&recvMsg));
    1703              : 
    1704            0 :     HCCL_INFO("[NSLBDP-SENDTABLE] hccl send table NSLBDP_TYPE_TBL_RANK(1004) to hccp. ret(%d)\n", ret);
    1705              : 
    1706            0 :     return HCCL_SUCCESS;
    1707            0 : }
    1708              : 
    1709            6 : void hcclNslbDp::fullCommonGlobalRankInfo(NslbDpGlobalRankInfo& tab_f, NslbDpGlobalRankVal& cominfo)
    1710              : {
    1711            6 :     tab_f.rev = 0;
    1712            6 :     tab_f.rev2 = 0;
    1713            6 :     tab_f.rev3 = 0;
    1714            6 :     tab_f.taskId = cominfo.taskId;
    1715            6 :     s32 sRet = memcpy_s(tab_f.commDesc, sizeof(tab_f.commDesc), cominfo.commDesc, sizeof(cominfo.commDesc));
    1716            6 :     if (sRet != EOK) {
    1717            0 :         HCCL_ERROR("memcpy_s commDesc fail");
    1718              :     }
    1719            6 :     tab_f.commInitTime = cominfo.commInitTime;
    1720            6 :     sRet = memcpy_s(tab_f.commMd5Sum, sizeof(tab_f.commMd5Sum), cominfo.commMd5Sum, sizeof(cominfo.commMd5Sum));
    1721            6 :     if (sRet != EOK) {
    1722            0 :         HCCL_ERROR("memcpy_s commMD5 fail");
    1723              :     }
    1724              :     /* 当前函数仅仅用于发送流程,在处理packetNum时需要根据rankNum进行处理,不能超过rankNum的范围,packetNum值由赋值处确定
    1725              :      */
    1726            6 :     u32 sendCnt = std::min(static_cast<u32>(tab_f.packetNum), static_cast<u32>(cominfo.rankInfo.size()));
    1727           20 :     for (u32 dip = 0; dip < sendCnt; dip++) {
    1728           14 :         tab_f.sendRankInfo[dip].deviceIp = cominfo.rankInfo[dip].deviceIp;
    1729              :     }
    1730            6 :     return;
    1731              : }
    1732              : 
    1733              : /* 根据表4 中的rank数量进行分片处理 */
    1734            5 : HcclResult hcclNslbDp::SendTableGlobalRankProc(uint32_t rank, uint32_t packetNum, NslbDpGlobalRankVal& cominfo)
    1735              : {
    1736            5 :     HCCL_INFO("[NSLB-DP] entry SendTableGlobalRankProc packetNum:[%u]", packetNum);
    1737            5 :     if (packetNum - 1 < rank) {
    1738            1 :         HCCL_INFO("[NSLB-DP] rank [%u] no need send TableFir(packetNum[%u]).", rank, packetNum);
    1739            1 :         return HCCL_SUCCESS;
    1740              :     }
    1741            4 :     u32 packetIndex = rank;
    1742            4 :     NslbDpGlobalRankInfo tab_f = {};
    1743            4 :     tab_f.packetId = packetIndex;
    1744            4 :     tab_f.packetNum = packetNum;
    1745            4 :     fullCommonGlobalRankInfo(tab_f, cominfo);
    1746              : 
    1747            4 :     uint32_t start = packetIndex * NSLBDP_RANKTOTALNUM_BLOCK_FIR;
    1748            4 :     uint32_t end = (packetIndex + 1) * NSLBDP_RANKTOTALNUM_BLOCK_FIR;
    1749            4 :     uint32_t totalSize = static_cast<uint32_t>(cominfo.rankInfo.size());
    1750            4 :     end = std::min(end, totalSize);
    1751            4 :     if (start >= end) {
    1752            0 :         HCCL_INFO("[NSLB-DP] GlobalRank RankInfo empty range[%u-%u], totalSize[%u]", start, end, totalSize);
    1753              :     } else {
    1754            4 :         tab_f.rankInfo.reserve(end - start);
    1755         3121 :         for (uint32_t j = start; j < end; ++j) {
    1756         3117 :             tab_f.rankInfo.push_back(cominfo.rankInfo[j]);
    1757              :         }
    1758              :     }
    1759            4 :     tab_f.rankTotalNum = cominfo.rankTotalNum;
    1760            4 :     tab_f.rankNum = static_cast<u16>(tab_f.rankInfo.size());
    1761            4 :     SendRankTableGlobalRank(tab_f);
    1762            4 :     return HCCL_SUCCESS;
    1763            4 : }
    1764              : 
    1765              : /* 根据rankNum的总数做分片发送流程 */
    1766            2 : HcclResult hcclNslbDp::SendGlobalRankTable(uint32_t rank)
    1767              : {
    1768            2 :     HCCL_DEBUG("[NSLB-DP] try to send GlobalRankTable.");
    1769            2 :     u32 rankTotalNum = hcclNslbDpGlobalRankVal_.rankTotalNum;
    1770            2 :     if (rankTotalNum > NSLBDP_RANKTOTALNUM_BLOCK_FOU) {
    1771            1 :         return HCCL_SUCCESS;
    1772              :     }
    1773            1 :     u32 packetNum = CalcPacketNum(rankTotalNum);
    1774            1 :     SendTableGlobalRankProc(rank, packetNum, hcclNslbDpGlobalRankVal_);
    1775              : 
    1776            1 :     return HCCL_SUCCESS;
    1777              : }
    1778              : 
    1779              : /* 序列化表5 */
    1780            0 : std::vector<uint8_t> hcclNslbDp::serializeTLV_TableGlobalDisRankVal(NslbDpGlobalDisRankVal& info)
    1781              : {
    1782            0 :     HCCL_DEBUG("[NSLB-DP] entry serializeTLV_TableGlobalDisRankVal.");
    1783            0 :     std::vector<uint8_t> tlvData;
    1784              : 
    1785              :     // 处理 taskId
    1786            0 :     uint64_t netTaskId = htobe64(info.taskId);
    1787            0 :     tlvData.resize(tlvData.size() + sizeof(netTaskId));
    1788            0 :     (void)memcpy_s(
    1789            0 :         tlvData.data() + tlvData.size() - sizeof(netTaskId), sizeof(netTaskId), &netTaskId, sizeof(netTaskId));
    1790              : 
    1791              :     // 处理 npuIp
    1792            0 :     uint32_t netNpuIp = htonl(info.npuIp);
    1793            0 :     tlvData.resize(tlvData.size() + sizeof(netNpuIp));
    1794            0 :     (void)memcpy_s(tlvData.data() + tlvData.size() - sizeof(netNpuIp), sizeof(netNpuIp), &netNpuIp, sizeof(netNpuIp));
    1795              : 
    1796              :     // 处理 serverIp
    1797            0 :     uint32_t netServerIp = htonl(info.serverIp);
    1798            0 :     tlvData.resize(tlvData.size() + sizeof(netServerIp));
    1799            0 :     (void)memcpy_s(
    1800            0 :         tlvData.data() + tlvData.size() - sizeof(netServerIp), sizeof(netServerIp), &netServerIp, sizeof(netServerIp));
    1801              : 
    1802              :     // 处理 nodeId
    1803            0 :     uint32_t netNodeId = htonl(info.nodeId);
    1804            0 :     tlvData.resize(tlvData.size() + sizeof(netNodeId));
    1805            0 :     (void)memcpy_s(
    1806            0 :         tlvData.data() + tlvData.size() - sizeof(netNodeId), sizeof(netNodeId), &netNodeId, sizeof(netNodeId));
    1807              : 
    1808              :     // 处理 localRankNum
    1809            0 :     tlvData.push_back(info.localRankNum);
    1810              : 
    1811              :     // 处理 rev
    1812            0 :     tlvData.insert(tlvData.end(), info.rev, info.rev + sizeof(info.rev));
    1813              : 
    1814              :     // 处理 rankTotalNum
    1815            0 :     uint32_t netRankTotalNum = htonl(info.rankTotalNum);
    1816            0 :     tlvData.resize(tlvData.size() + sizeof(netRankTotalNum));
    1817            0 :     (void)memcpy_s(
    1818            0 :         tlvData.data() + tlvData.size() - sizeof(netRankTotalNum), sizeof(netRankTotalNum), &netRankTotalNum,
    1819              :         sizeof(netRankTotalNum));
    1820              : 
    1821            0 :     return tlvData;
    1822            0 : }
    1823              : 
    1824              : /* 发送GlobalDisRank表信息 */
    1825            0 : HcclResult hcclNslbDp::SendRankTableGlobalDisRankVal(NslbDpGlobalDisRankVal& tab_f)
    1826              : {
    1827            0 :     if (GetInitNetCoFlag() == false) {
    1828            0 :         return HCCL_SUCCESS;
    1829              :     }
    1830            0 :     std::vector<uint8_t> tlvData = serializeTLV_TableGlobalDisRankVal(tab_f);
    1831            0 :     u32 datlen = tlvData.size();
    1832            0 :     HCCL_INFO("[NSLB-DP] SendRankTableGlobalDisRankVal tlvData.len:[%u] success.", datlen);
    1833              : 
    1834            0 :     nslb_msg sendMsg;
    1835            0 :     nslb_msg recvMsg;
    1836            0 :     sendMsg.type = NSLBDP_TYPE_TBL_RANK_DIST;
    1837            0 :     sendMsg.length = datlen;
    1838            0 :     sendMsg.data.assign(tlvData.begin(), tlvData.end());
    1839            0 :     s32 ret = H2DTlvRequest(
    1840            0 :         nslbdp_handle_, MODULE_TYPE_NSLB, reinterpret_cast<TlvMsg*>(&sendMsg), reinterpret_cast<TlvMsg*>(&recvMsg));
    1841              : 
    1842            0 :     HCCL_INFO("[NSLBDP-SENDTABLE] hccl send table NSLBDP_TYPE_TBL_RANK_DIST(1005) to hccp. ret(%d)\n", ret);
    1843            0 :     return HCCL_SUCCESS;
    1844            0 : }
    1845              : 
    1846              : /* 遍历表5 执行send流程 */
    1847            0 : HcclResult hcclNslbDp::SendGlobalDisRankTable()
    1848              : {
    1849            0 :     HCCL_DEBUG("[NSLB-DP] ndlbdp entry serializeTLV_TableGlobalDisRankVal.");
    1850            0 :     NslbDpGlobalDisRankVal tab_f = {};
    1851            0 :     tab_f.taskId = hcclNslbDpGlobalDisRankVal_.taskId;
    1852            0 :     tab_f.npuIp = hcclNslbDpGlobalDisRankVal_.npuIp;
    1853            0 :     tab_f.serverIp = hcclNslbDpGlobalDisRankVal_.serverIp;
    1854            0 :     tab_f.nodeId = hcclNslbDpGlobalDisRankVal_.nodeId;
    1855            0 :     tab_f.localRankNum = hcclNslbDpGlobalDisRankVal_.localRankNum;
    1856            0 :     s32 sRet = memcpy_s(
    1857            0 :         tab_f.rev, sizeof(tab_f.rev), hcclNslbDpGlobalDisRankVal_.rev, sizeof(hcclNslbDpGlobalDisRankVal_.rev));
    1858            0 :     if (sRet != EOK) {
    1859            0 :         HCCL_INFO("memcpy_s rev info fail");
    1860              :     }
    1861            0 :     tab_f.rankTotalNum = hcclNslbDpGlobalDisRankVal_.rankTotalNum;
    1862              : 
    1863            0 :     SendRankTableGlobalDisRankVal(tab_f);
    1864            0 :     return HCCL_SUCCESS;
    1865              : }
    1866              : 
    1867              : /* 序列化表6 */
    1868            0 : std::vector<uint8_t> hcclNslbDp::serializeTLV_TableRootRank(NslbDpRootRank& config)
    1869              : {
    1870            0 :     HCCL_DEBUG("[NSLB-DP] ndlbdp entry serializeTLV_TableRootRank.");
    1871            0 :     std::vector<uint8_t> tlvData;
    1872              : 
    1873              :     // 处理 taskId
    1874            0 :     uint64_t netTaskId = htobe64(config.taskId);
    1875            0 :     tlvData.resize(tlvData.size() + sizeof(netTaskId));
    1876            0 :     (void)memcpy_s(
    1877            0 :         tlvData.data() + tlvData.size() - sizeof(netTaskId), sizeof(netTaskId), &netTaskId, sizeof(netTaskId));
    1878              : 
    1879              :     // 处理 commDesc
    1880            0 :     tlvData.insert(tlvData.end(), config.commDesc, config.commDesc + COMM_DESC_MAX_LENGTH);
    1881              : 
    1882              :     // 处理 commInitTime
    1883            0 :     uint64_t netCommInitTime = htobe64(config.commInitTime);
    1884            0 :     tlvData.resize(tlvData.size() + sizeof(netCommInitTime));
    1885            0 :     (void)memcpy_s(
    1886            0 :         tlvData.data() + tlvData.size() - sizeof(netCommInitTime), sizeof(netCommInitTime), &netCommInitTime,
    1887              :         sizeof(netCommInitTime));
    1888              : 
    1889              :     // 处理 oper
    1890            0 :     tlvData.push_back(config.oper);
    1891              : 
    1892              :     // 处理 algorithm
    1893            0 :     tlvData.push_back(config.algorithm);
    1894              : 
    1895              :     // 处理 revfir
    1896            0 :     uint16_t netRevfir = htons(config.revfir);
    1897            0 :     tlvData.resize(tlvData.size() + sizeof(netRevfir));
    1898            0 :     (void)memcpy_s(
    1899            0 :         tlvData.data() + tlvData.size() - sizeof(netRevfir), sizeof(netRevfir), &netRevfir, sizeof(netRevfir));
    1900              : 
    1901              :     // 处理 rootRankNum
    1902            0 :     uint16_t netRootRankNum = htons(config.rootRankNum);
    1903            0 :     tlvData.resize(tlvData.size() + sizeof(netRootRankNum));
    1904            0 :     (void)memcpy_s(
    1905            0 :         tlvData.data() + tlvData.size() - sizeof(netRootRankNum), sizeof(netRootRankNum), &netRootRankNum,
    1906              :         sizeof(netRootRankNum));
    1907              : 
    1908              :     // 处理 revsec
    1909            0 :     uint16_t netRevsec = htons(config.revsec);
    1910            0 :     tlvData.resize(tlvData.size() + sizeof(netRevsec));
    1911            0 :     (void)memcpy_s(
    1912            0 :         tlvData.data() + tlvData.size() - sizeof(netRevsec), sizeof(netRevsec), &netRevsec, sizeof(netRevsec));
    1913              : 
    1914              :     // 处理 rankId
    1915            0 :     for (const auto& id : config.rankId) {
    1916            0 :         uint32_t netRankId = htonl(id.rankID);
    1917            0 :         tlvData.resize(tlvData.size() + sizeof(netRankId));
    1918            0 :         (void)memcpy_s(
    1919            0 :             tlvData.data() + tlvData.size() - sizeof(netRankId), sizeof(netRankId), &netRankId, sizeof(netRankId));
    1920              :     }
    1921            0 :     return tlvData;
    1922            0 : }
    1923              : 
    1924              : /* 发送Rank表到netco */
    1925            0 : HcclResult hcclNslbDp::SendRankTableRootRank(NslbDpRootRank& tab_f)
    1926              : {
    1927            0 :     if (GetInitNetCoFlag() == false) {
    1928            0 :         return HCCL_SUCCESS;
    1929              :     }
    1930            0 :     std::vector<uint8_t> tlvData = serializeTLV_TableRootRank(tab_f);
    1931              : 
    1932            0 :     u32 datlen = tlvData.size();
    1933            0 :     HCCL_DEBUG("[NSLB-DP] SendRankTableRootRank tlvData.len:[%u] success.", datlen);
    1934              : 
    1935            0 :     nslb_msg sendMsg;
    1936            0 :     nslb_msg recvMsg;
    1937            0 :     sendMsg.type = NSLBDP_TYPE_TBL_ROOT_RANK;
    1938            0 :     sendMsg.length = datlen;
    1939            0 :     sendMsg.data.assign(tlvData.begin(), tlvData.end());
    1940            0 :     s32 ret = H2DTlvRequest(
    1941            0 :         nslbdp_handle_, MODULE_TYPE_NSLB, reinterpret_cast<TlvMsg*>(&sendMsg), reinterpret_cast<TlvMsg*>(&recvMsg));
    1942              : 
    1943            0 :     HCCL_INFO("[NSLBDP-SENDTABLE] hccl send table NSLBDP_TYPE_TBL_ROOT_RANK(1006) to hccp. ret(%d)\n", ret);
    1944            0 :     return HCCL_SUCCESS;
    1945            0 : }
    1946              : 
    1947              : /* 遍历表6 执行send流程 */
    1948            0 : HcclResult hcclNslbDp::SendRootRankTable()
    1949              : {
    1950            0 :     HCCL_DEBUG("[NSLB-DP] entry SendRootRankTable.");
    1951            0 :     NslbDpRootRank tab_f = {};
    1952            0 :     tab_f.taskId = hcclNslbDpRootRankVal_.taskId;
    1953            0 :     s32 sRet = memcpy_s(
    1954            0 :         tab_f.commDesc, sizeof(tab_f.commDesc), hcclNslbDpRootRankVal_.commDesc,
    1955              :         sizeof(hcclNslbDpRootRankVal_.commDesc));
    1956            0 :     if (sRet != EOK) {
    1957            0 :         HCCL_INFO("memcpy_s commDesc info fail");
    1958              :     }
    1959            0 :     tab_f.commInitTime = hcclNslbDpRootRankVal_.commInitTime;
    1960            0 :     tab_f.oper = hcclNslbDpRootRankVal_.oper;
    1961            0 :     tab_f.algorithm = hcclNslbDpRootRankVal_.algorithm;
    1962            0 :     tab_f.revfir = hcclNslbDpRootRankVal_.revfir;
    1963            0 :     tab_f.rootRankNum = hcclNslbDpRootRankVal_.rootRankNum;
    1964            0 :     tab_f.revsec = hcclNslbDpRootRankVal_.revsec;
    1965            0 :     tab_f.rankId = hcclNslbDpRootRankVal_.rankId;
    1966              : 
    1967            0 :     for (const auto& rank : hcclNslbDpRootRankVal_.rankId) {
    1968            0 :         tab_f.rankId.push_back(rank);
    1969              :     }
    1970              : 
    1971            0 :     SendRankTableRootRank(tab_f);
    1972              : 
    1973            0 :     return HCCL_SUCCESS;
    1974            0 : }
    1975              : 
    1976              : /* 初始化NetCo通道 */
    1977            0 : HcclResult hcclNslbDp::InitNetCo()
    1978              : {
    1979            0 :     if (hcclH2dTlv::GetInstance().GetH2dTlvInitFlag() != true) {
    1980            0 :         HCCL_INFO("Check GetH2dTlvInitFlag is not success");
    1981            0 :         return HCCL_SUCCESS;
    1982              :     }
    1983              :     /* 避免二次初始化 */
    1984            0 :     if (GetInitNetCoFlag() == true) {
    1985            0 :         HCCL_INFO("Get getHccpInitFlag is true");
    1986            0 :         return HCCL_SUCCESS;
    1987              :     }
    1988            0 :     if (hcclH2dTlv::GetInstance().GetH2dTlvBufferSize() == NSLBDP_ILLEGAL_TLVBUFFERSIZE) {
    1989              :         /* 异常场景处理 */
    1990            0 :         HCCL_INFO("Check H2dTlvBufferSize equal 0.");
    1991            0 :         ClearInitNetCoFlag();
    1992            0 :         return HCCL_E_NOT_SUPPORT;
    1993              :     }
    1994            0 :     if (hcclH2dTlv::GetInstance().GetH2dTlvHandle() == nullptr) {
    1995            0 :         HCCL_ERROR("Check InitNetCo handle is null.");
    1996            0 :         ClearInitNetCoFlag();
    1997            0 :         return HCCL_E_NOT_SUPPORT;
    1998              :     }
    1999            0 :     u32 nslbBuffersize = hcclH2dTlv::GetInstance().GetH2dTlvBufferSize();
    2000            0 :     void* tlvHandle = hcclH2dTlv::GetInstance().GetH2dTlvHandle();
    2001            0 :     nslb_msg sendMsg;
    2002            0 :     nslb_msg recvMsg;
    2003            0 :     sendMsg.type = NSLBDP_TYPE_INIT_NETCO;
    2004            0 :     sendMsg.length = NSLBDP_ILLEGAL_MSGLENGTH;
    2005              : 
    2006              :     /* init/deinit 场景date信息默认填成数字0,hccp不关注此字段,但数据不能为NULL */
    2007            0 :     std::vector<uint8_t> tlvData;
    2008            0 :     tlvData.push_back(0);
    2009            0 :     sendMsg.data.assign(tlvData.begin(), tlvData.end());
    2010            0 :     s32 ret = H2DTlvRequest(
    2011            0 :         tlvHandle, MODULE_TYPE_NSLB, reinterpret_cast<TlvMsg*>(&sendMsg), reinterpret_cast<TlvMsg*>(&recvMsg));
    2012            0 :     HCCL_RUN_INFO("[NSLBDP-SENDTABLE] hccl send table NSLBDP_TYPE_INIT_NETCO(9001) to hccp. ret(%d)\n", ret);
    2013            0 :     if (ret != 0) {
    2014            0 :         return HCCL_E_NOT_SUPPORT;
    2015              :     }
    2016              :     /* 数据转存 */
    2017            0 :     SetH2DTlvInitInfo(nslbBuffersize, tlvHandle);
    2018            0 :     HCCL_DEBUG("Entry InitNetCo end");
    2019            0 :     return HCCL_SUCCESS;
    2020            0 : }
    2021              : 
    2022              : /* 去初始化NetCo通道 */
    2023            0 : void hcclNslbDp::DeinitNetCo()
    2024              : {
    2025            0 :     if (GetInitNetCoFlag() == false) {
    2026            0 :         return;
    2027              :     }
    2028            0 :     if (hcclH2dTlv::GetInstance().GetH2dTlvBufferSize() == NSLBDP_ILLEGAL_TLVBUFFERSIZE) {
    2029            0 :         return;
    2030              :     }
    2031            0 :     if (hcclH2dTlv::GetInstance().GetH2dTlvHandle() == nullptr) {
    2032            0 :         return;
    2033              :     }
    2034            0 :     nslb_msg sendMsg;
    2035            0 :     nslb_msg recvMsg;
    2036            0 :     sendMsg.type = NSLBDP_TYPE_DEINIT_NETCO;
    2037            0 :     sendMsg.length = NSLBDP_ILLEGAL_MSGLENGTH;
    2038              :     /* init/deinit 场景date信息默认填成数字0,hccp不关注此字段,但数据不能为NULL */
    2039            0 :     std::vector<uint8_t> tlvData;
    2040            0 :     tlvData.push_back(0);
    2041            0 :     sendMsg.data.assign(tlvData.begin(), tlvData.end());
    2042            0 :     s32 ret = H2DTlvRequest(
    2043            0 :         nslbdp_handle_, MODULE_TYPE_NSLB, reinterpret_cast<TlvMsg*>(&sendMsg), reinterpret_cast<TlvMsg*>(&recvMsg));
    2044            0 :     HCCL_RUN_INFO("[NSLBDP-SENDTABLE] hccl send table NSLBDP_TYPE_DEINIT_NETCO(9002) to hccp. ret(%d)\n", ret);
    2045            0 :     ClearInitNetCoFlag();
    2046            0 :     return;
    2047            0 : }
    2048              : 
    2049              : } // namespace hccl
        

Generated by: LCOV version 2.0-1