LCOV - code coverage report
Current view: top level - legacy/ascend910/framework/nslbdp - hccl_nslbdp.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 1.6 % 1222 20
Test Date: 2026-07-28 12:11:00 Functions: 8.7 % 69 6

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

Generated by: LCOV version 2.0-1