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 "network_manager.h"
12 : #include "externalinput_pub.h"
13 : #include "device_capacity.h"
14 : #include "adapter_tdt.h"
15 : #include "adapter_rts.h"
16 : #include "adapter_hccp.h"
17 : #include "adapter_hal.h"
18 : #include "adapter_error_manager.h"
19 : #include "dlhal_function.h"
20 : #include "adapter_hccp_common.h"
21 : namespace hccl {
22 :
23 : using namespace std;
24 :
25 : constexpr u32 SOCKET_LISTEN_AUTO_INTERFACE = 4;
26 : constexpr u32 SOCKET_LISTEN_AUTO_INTERFACE_VERSION = 3;
27 :
28 : NetworkManager* NetworkManager::nmInstance[MAX_DEV_NUM] = {nullptr};
29 : std::atomic<unsigned> NetworkManager::InitTool::initCount(0);
30 :
31 1579 : NetworkManager::InitTool::InitTool()
32 : {
33 1579 : if (initCount.load() == 0) {
34 1551 : for (u32 i = 0; i < MAX_DEV_NUM; i++) {
35 1504 : NetworkManager::nmInstance[i] = new (std::nothrow) NetworkManager;
36 1504 : CHK_PRT_CONT(
37 : NetworkManager::nmInstance[i] == nullptr,
38 : HCCL_ERROR("[NetworkManager][InitTool] nmInstance[%u] new failed", i));
39 : }
40 : }
41 1579 : ++initCount;
42 1579 : }
43 :
44 1579 : NetworkManager::InitTool::~InitTool()
45 : {
46 1579 : --initCount;
47 1579 : if (initCount.load() == 0) {
48 1551 : for (u32 i = 0; i < MAX_DEV_NUM; i++) {
49 1504 : if (NetworkManager::nmInstance[i] != nullptr) {
50 1504 : delete NetworkManager::nmInstance[i];
51 1504 : NetworkManager::nmInstance[i] = nullptr;
52 : }
53 : }
54 : }
55 1579 : }
56 :
57 1504 : NetworkManager::NetworkManager()
58 1504 : : deviceLogicId_(INVALID_INT),
59 1504 : devicePhyId_(INVALID_UINT),
60 1504 : isHostUseDevNic_(false),
61 1504 : notifyType_(NO_USE)
62 1504 : {}
63 :
64 1504 : NetworkManager::~NetworkManager()
65 : {
66 1504 : Destroy();
67 1504 : isRaDeInit_ = false;
68 1504 : }
69 :
70 1178 : NetworkManager& NetworkManager::GetInstance(s32 deviceLogicID)
71 : {
72 1178 : HCCL_INFO("NetworkManager::GetInstance deviceLogicID[%u].", deviceLogicID);
73 1179 : if (deviceLogicID == HOST_DEVICE_ID) {
74 4 : nmInstance[DEFAULT_DEVICE_LOGIC_ID]->deviceLogicId_ = DEFAULT_DEVICE_LOGIC_ID;
75 4 : return *(nmInstance[DEFAULT_DEVICE_LOGIC_ID]);
76 : }
77 :
78 1175 : if (static_cast<u32>(deviceLogicID) >= MAX_DEV_NUM || deviceLogicID <= HOST_DEVICE_ID) {
79 0 : HCCL_WARNING("[Get][Instance]deviceLogicID[%d] is invalid", deviceLogicID);
80 0 : nmInstance[DEFAULT_DEVICE_LOGIC_ID]->deviceLogicId_ = DEFAULT_DEVICE_LOGIC_ID;
81 0 : return *(nmInstance[DEFAULT_DEVICE_LOGIC_ID]);
82 : }
83 1175 : nmInstance[deviceLogicID]->deviceLogicId_ = deviceLogicID;
84 1175 : return *(nmInstance[deviceLogicID]);
85 : }
86 :
87 411 : HcclResult NetworkManager::TsdCapabilityGet(bool& supportMultiProcHCCP)
88 : {
89 411 : int32_t type = TSD_CAPABILITY_MUTIPLE_HCCP;
90 411 : bool* resultPtr = &supportMultiProcHCCP;
91 411 : CHK_RET(hrtTsdCapabilityGet(deviceLogicId_, type, static_cast<uint64_t>(reinterpret_cast<uintptr_t>(resultPtr))));
92 411 : return HCCL_SUCCESS;
93 : }
94 :
95 0 : HcclResult NetworkManager::GetNicIp(uint32_t devicePhyId, HcclAddress** addr, uint32_t* len)
96 : {
97 0 : vector<HcclIpAddress> tempIp;
98 0 : std::unique_lock<std::mutex> lock(memResMutex_);
99 0 : if (nicIpAddrs_.size() == 0) {
100 0 : CHK_RET(hrtRaGetDeviceIP(devicePhyId, tempIp));
101 0 : nicIpAddrs_.resize(tempIp.size());
102 0 : for (size_t i = 0; i < tempIp.size(); ++i) {
103 0 : CHK_RET(HcclIpAddressConvertHcclAddr(&nicIpAddrs_[i], &tempIp[i]));
104 : }
105 : }
106 0 : *addr = this->nicIpAddrs_.data();
107 0 : *len = this->nicIpAddrs_.size();
108 0 : lock.unlock();
109 0 : return HCCL_SUCCESS;
110 0 : }
111 :
112 0 : HcclResult NetworkManager::TsdProcessOpen(bool hasBackup)
113 : {
114 0 : s32 locaLogDevid = 0;
115 0 : hrtGetDevice(&locaLogDevid);
116 0 : if (locaLogDevid != deviceLogicId_) {
117 0 : hrtSetDevice(deviceLogicId_);
118 : }
119 : // 校验是否为新版本驱动,旧版本驱动不支持配置backupPhyId,报错返回
120 0 : s32 halAPIVersion = 0;
121 0 : CHK_RET(DlHalFunction::GetInstance().DlHalFunctionInit());
122 0 : CHK_RET(hrtHalGetAPIVersion(halAPIVersion));
123 0 : HCCL_INFO(
124 : "[%s]params: halAPIVersion[%d], BACKUP_DEVICE_LOG_DEV_VERSION[%d]", __func__, halAPIVersion,
125 : BACKUP_DEVICE_LOG_DEV_VERSION);
126 0 : if (halAPIVersion < BACKUP_DEVICE_LOG_DEV_VERSION) {
127 0 : HCCL_WARNING(
128 : "[%s]this package does not support obtaining backUp HCCP Log in PLOG. halAPIVersion[%d]", __func__,
129 : halAPIVersion);
130 : }
131 0 : isTsdProcessOpen_ = true;
132 0 : if (!hasBackup || halAPIVersion < BACKUP_DEVICE_LOG_DEV_VERSION) {
133 0 : std::string extPam("--hdcType=" + std::to_string(HDC_SERVICE_TYPE_RDMA_V2));
134 : rtNetServiceOpenArgs openArgs;
135 0 : rtProcExtParam extParam{};
136 0 : extParam.paramInfo = extPam.c_str();
137 0 : extParam.paramLen = extPam.size();
138 0 : openArgs.extParamList = &extParam;
139 0 : openArgs.extParamCnt = 1UL;
140 : // 根据pid粒度拉起hccp的rs进程
141 0 : CHK_RET(hrtOpenNetService(&openArgs));
142 0 : HCCL_INFO(
143 : "[%s]hrtOpenNetService success, subPid[%d], devicePhyId_[%u], deviceLogicId_[%d], hasBackup[%u]", __func__,
144 : subPid_, devicePhyId_, deviceLogicId_, hasBackup);
145 0 : } else {
146 : // 获取chip上另一个die的logicalID
147 0 : u32 deviceBackUpPhyId = 0;
148 0 : CHK_RET(hrtGetPairDevicePhyId(devicePhyId_, deviceBackUpPhyId));
149 : rtNetServiceOpenArgs openArgs;
150 : std::string extPams[TSD_OPEN_EXT_PARA_NUM]
151 0 : = {std::string("--hdcType=" + std::to_string(HDC_SERVICE_TYPE_RDMA_V2)),
152 0 : std::string("--backupPhyId=" + std::to_string(deviceBackUpPhyId))};
153 0 : rtProcExtParam extParams[TSD_OPEN_EXT_PARA_NUM]{};
154 0 : for (u32 i = 0; i < TSD_OPEN_EXT_PARA_NUM; i++) {
155 0 : extParams[i].paramInfo = extPams[i].c_str();
156 0 : extParams[i].paramLen = extPams[i].size();
157 : }
158 0 : openArgs.extParamList = extParams;
159 0 : openArgs.extParamCnt = TSD_OPEN_EXT_PARA_NUM;
160 : // 根据pid粒度拉起hccp的rs进程
161 0 : CHK_RET(hrtOpenNetService(&openArgs));
162 0 : HCCL_INFO(
163 : "[%s]hrtOpenNetService success, subPid[%u], "
164 : "devicePhyId_[%u], deviceLogicId_[%d], deviceBackUpPhyId[%u], hasBackup[%u]",
165 : __func__, subPid_, devicePhyId_, deviceLogicId_, deviceBackUpPhyId, hasBackup);
166 0 : }
167 :
168 0 : if (locaLogDevid != deviceLogicId_) {
169 0 : hrtSetDevice(locaLogDevid);
170 : }
171 0 : return HCCL_SUCCESS;
172 : }
173 :
174 1 : HcclResult NetworkManager::PrepareInit(NICDeployment nicDeploy, u32 devicePhyId, s32& ref)
175 : {
176 1 : HCCL_INFO("nicDeploy = [%u], devicePhyId = [%u] ", nicDeploy, devicePhyId);
177 1 : if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_HOST) {
178 0 : ref = hostNicInitRef_.Ref();
179 1 : } else if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE) {
180 1 : ref = deviceNicInitRef_.Ref();
181 : } else {
182 0 : HCCL_ERROR(
183 : "[NetworkManager][PrepareInit]NetworkManager: init nic failed, nicPosition[%u] is not supported.",
184 : static_cast<u32>(nicDeploy));
185 0 : return HCCL_E_INTERNAL;
186 : }
187 1 : if (ref > 1) {
188 0 : HCCL_INFO("NetworkManager: init nic, nicPosition[%u] ref[%u], skip.", static_cast<u32>(nicDeploy), ref);
189 0 : return HCCL_SUCCESS;
190 : }
191 :
192 1 : if (devicePhyId != INVALID_UINT) {
193 0 : devicePhyId_ = devicePhyId;
194 : } else {
195 : // 初始化ra资源(dev信息带入逻辑ID)
196 1 : CHK_RET(hrtGetDevice(&deviceLogicId_));
197 1 : CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(deviceLogicId_), devicePhyId_));
198 : }
199 1 : return HCCL_SUCCESS;
200 : }
201 1 : HcclResult NetworkManager::GetConfigAndRaInit(struct RaInitConfig& config, bool isHdcV2, NICDeployment nicDeploy)
202 : {
203 : // DC场景网卡与进程在同一侧,需要设置为类似host网卡模式
204 1 : config.nicPosition = Is310PDevice() ? 0 : static_cast<u32>(nicDeploy);
205 1 : config.phyId = devicePhyId_;
206 :
207 1 : if (isHdcV2) {
208 : // 使用HDC_SERVICE_TYPE_RDMA_V2指定进程粒度
209 0 : config.hdcType = HDC_SERVICE_TYPE_RDMA_V2;
210 0 : HCCL_DEBUG(
211 : "[%s]hdcType is set to HDC_SERVICE_TYPE_RDMA_V2"
212 : "devicePhyId[%u], deviceLogicId_[%d]",
213 : __func__, devicePhyId_, deviceLogicId_);
214 : }
215 1 : HcclResult ret = HrtRaInit(&config);
216 1 : RPT_CALL_ERR(
217 : ret != HCCL_SUCCESS, "ra init failed,return[%d] devicePhyId_[%u], nicPosition[%u]", ret, devicePhyId_,
218 : static_cast<u32>(nicDeploy));
219 1 : CHK_PRT_RET(
220 : ret != HCCL_SUCCESS,
221 : HCCL_ERROR(
222 : "[NetworkManager][Init]errNo[0x%016llx] ra init failed,return[%d] devicePhyId_[%u], "
223 : "nicPosition[%u]",
224 : HCCL_ERROR_CODE(ret), ret, devicePhyId_, static_cast<u32>(nicDeploy)),
225 : HCCL_E_NETWORK);
226 :
227 1 : return HCCL_SUCCESS;
228 : }
229 :
230 1 : HcclResult NetworkManager::GetTsdOpen(NICDeployment nicDeploy, bool hasBackup, bool& supportMultiProcHCCP)
231 : {
232 1 : if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE && !Is310PDevice()) { // DC场景不需要拉起tsd
233 1 : CHK_RET(DlTdtFunction::GetInstance().DlTdtFunctionInit());
234 1 : CHK_RET(TsdCapabilityGet(supportMultiProcHCCP));
235 1 : HCCL_INFO("[NetworkManager][Init]supportMultiProcHCCP[%u], hasBackup[%u]", supportMultiProcHCCP, hasBackup);
236 1 : if (supportMultiProcHCCP || hasBackup) {
237 : // 根据pid粒度拉起hccp的rs进程
238 0 : CHK_RET(TsdProcessOpen(hasBackup));
239 0 : HCCL_INFO(
240 : "[NetworkManager][Init]open tsd by process success, devicePhyId[%u], deviceLogicId_[%d].", devicePhyId_,
241 : deviceLogicId_);
242 0 : } else {
243 : // device 网卡初始化前需要拉起 hccp.
244 1 : CHK_RET(hrtOpenTsd());
245 1 : HCCL_INFO(
246 : "[%s]NetworkManager open tsd success, devicePhyId[%u], deviceLogicId_[%d]", __func__, devicePhyId_,
247 : deviceLogicId_);
248 : }
249 : }
250 1 : return HCCL_SUCCESS;
251 : }
252 : /* init network resource */
253 252 : HcclResult NetworkManager::Init(
254 : NICDeployment nicDeploy, bool enableWhitelistFlag, u32 devicePhyId, bool isHostUseDevNic, bool hasBackup)
255 : {
256 252 : s32 ref = 0;
257 252 : if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_HOST) {
258 25 : ref = hostNicInitRef_.Ref();
259 227 : } else if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE) {
260 227 : ref = deviceNicInitRef_.Ref();
261 : } else {
262 0 : HCCL_ERROR(
263 : "[NetworkManager][Init]NetworkManager: init nic failed, nicPosition[%u] is not supported.",
264 : static_cast<u32>(nicDeploy));
265 0 : return HCCL_E_INTERNAL;
266 : }
267 252 : if (ref > 1) {
268 25 : HCCL_INFO("NetworkManager: init nic, nicPosition[%u] ref[%u], skip.", static_cast<u32>(nicDeploy), ref);
269 25 : return HCCL_SUCCESS;
270 : }
271 :
272 227 : if (devicePhyId != INVALID_UINT) {
273 37 : devicePhyId_ = devicePhyId;
274 : } else {
275 : // 初始化ra资源(dev信息带入逻辑ID)
276 190 : CHK_RET(hrtGetDevice(&deviceLogicId_));
277 190 : CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(deviceLogicId_), devicePhyId_));
278 : }
279 227 : HCCL_INFO(
280 : "NetworkManager: devicePhyId[%u], devicePhyId_[%u] deviceLogicId_[%u], hasBackup[%d]", devicePhyId,
281 : devicePhyId_, deviceLogicId_, hasBackup);
282 :
283 227 : bool supportMultiProcHCCP = false;
284 227 : if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE && !Is310PDevice()) { // DC场景不需要拉起tsd
285 206 : CHK_RET(DlTdtFunction::GetInstance().DlTdtFunctionInit());
286 206 : CHK_RET(TsdCapabilityGet(supportMultiProcHCCP));
287 206 : HCCL_INFO("[NetworkManager][Init]supportMultiProcHCCP[%u], hasBackup[%u]", supportMultiProcHCCP, hasBackup);
288 206 : if (supportMultiProcHCCP || hasBackup) {
289 : // 根据pid粒度拉起hccp的rs进程
290 0 : CHK_RET(TsdProcessOpen(hasBackup));
291 0 : HCCL_INFO(
292 : "[NetworkManager][Init]open tsd by process success, devicePhyId[%u], deviceLogicId_[%d].", devicePhyId_,
293 : deviceLogicId_);
294 0 : } else {
295 : // device 网卡初始化前需要拉起 hccp.
296 206 : CHK_RET(hrtOpenTsd());
297 206 : HCCL_INFO(
298 : "[%s]NetworkManager open tsd success, devicePhyId[%u], deviceLogicId_[%d]", __func__, devicePhyId_,
299 : deviceLogicId_);
300 : }
301 : }
302 :
303 227 : struct RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, false};
304 227 : u32 enableWhiteList = (GetExternalInputHcclEnableWhitelist() == HCCL_WHITELIST_ON) ? 1 : 0;
305 227 : if (GetRemoteIsHdc() && IsGeneralServer()) {
306 0 : HCCL_INFO("General server NetworkManager open Whitelist");
307 0 : enableWhitelistFlag = true;
308 0 : enableWhiteList = true;
309 : }
310 227 : if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_HOST && enableWhitelistFlag) {
311 16 : CHK_RET(hrtRaSocketSetWhiteListStatus(enableWhiteList));
312 : }
313 : // DC场景网卡与进程在同一侧,需要设置为类似host网卡模式
314 227 : config.nicPosition = Is310PDevice() ? 0 : static_cast<u32>(nicDeploy);
315 227 : config.phyId = devicePhyId_;
316 227 : HCCL_DEBUG(
317 : "[%s]config.phyId = %u, nicPosition[%u], hasBackup[%d], devicePhyId_[%u], deviceLogicId_[%d], "
318 : "devicePhyId[%u]",
319 : __func__, config.phyId, config.nicPosition, hasBackup, devicePhyId_, deviceLogicId_, devicePhyId);
320 :
321 227 : if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE && !Is310PDevice() && (supportMultiProcHCCP || hasBackup)) {
322 : // 使用HDC_SERVICE_TYPE_RDMA_V2指定进程粒度
323 0 : config.hdcType = HDC_SERVICE_TYPE_RDMA_V2;
324 0 : HCCL_DEBUG(
325 : "[%s]hdcType is set to HDC_SERVICE_TYPE_RDMA_V2, hasBackup[%d], nicDeploy[%d], "
326 : "devicePhyId[%u], deviceLogicId_[%d]",
327 : __func__, hasBackup, nicDeploy, devicePhyId_, deviceLogicId_);
328 : }
329 : DevType devType;
330 227 : CHK_RET(hrtGetDeviceType(devType));
331 227 : if (devType == DevType::DEV_TYPE_910_93 && nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE) {
332 8 : isEnableHdcAsync_ = true;
333 8 : config.enableHdcAsync = true;
334 : }
335 227 : HCCL_INFO(
336 : "[%s]config.phyId[%u], config.nicPosition[%u], config.hdcType[%d], config.enableHdcAsync[%d]", __func__,
337 : config.phyId, config.nicPosition, config.hdcType, config.enableHdcAsync);
338 227 : HcclResult ret = HrtRaInit(&config);
339 227 : RPT_CALL_ERR(
340 : ret != HCCL_SUCCESS, "ra init failed,return[%d] devicePhyId_[%u], nicPosition[%u]", ret, devicePhyId_,
341 : static_cast<u32>(nicDeploy));
342 227 : CHK_PRT_RET(
343 : ret != HCCL_SUCCESS,
344 : HCCL_ERROR(
345 : "[NetworkManager][Init]errNo[0x%016llx] ra init failed,return[%d] devicePhyId_[%u], "
346 : "nicPosition[%u]",
347 : HCCL_ERROR_CODE(ret), ret, devicePhyId_, static_cast<u32>(nicDeploy)),
348 : HCCL_E_NETWORK);
349 :
350 226 : HCCL_INFO(
351 : "NetworkManager nicDeploy[%u] deviceLogicId_[%d] devicePhyId_[%u] init ra OK, nicSocketMap size[%u], "
352 : "isHostUseDevNic[%d]",
353 : static_cast<u32>(nicDeploy), deviceLogicId_, devicePhyId_, raResourceInfo_.nicSocketMap.size(),
354 : isHostUseDevNic);
355 226 : return HCCL_SUCCESS;
356 : }
357 :
358 1 : HcclResult NetworkManager::InitV2(NICDeployment nicDeploy, bool isBackup, u32 devicePhyId, bool isHostUseDevNic)
359 : {
360 1 : s32 ref = 0;
361 1 : CHK_RET(PrepareInit(nicDeploy, devicePhyId, ref));
362 1 : if (ref > 1) {
363 0 : HCCL_INFO("NetworkManager: initv2 nic, nicPosition[%u] ref[%u], skip.", static_cast<u32>(nicDeploy), ref);
364 0 : return HCCL_SUCCESS;
365 : }
366 1 : HCCL_INFO(
367 : "NetworkManager InitV2: devicePhyId[%u], devicePhyId_[%u] deviceLogicId_[%u], isBackup[%d]", devicePhyId,
368 : devicePhyId_, deviceLogicId_, isBackup);
369 :
370 1 : bool supportMultiProcHCCP = false;
371 1 : CHK_RET(GetTsdOpen(nicDeploy, isBackup, supportMultiProcHCCP));
372 :
373 1 : struct RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, false};
374 : bool isHdcV2
375 1 : = (nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE && !Is310PDevice() && (supportMultiProcHCCP || isBackup));
376 1 : if (isHdcV2) {
377 0 : HCCL_DEBUG(
378 : "[%s]hdcType is set to HDC_SERVICE_TYPE_RDMA_V2, isBackup[%d], nicDeploy[%d], "
379 : "devicePhyId[%u], deviceLogicId_[%d]",
380 : __func__, isBackup, nicDeploy, devicePhyId_, deviceLogicId_);
381 : }
382 1 : CHK_RET(GetConfigAndRaInit(config, isHdcV2, nicDeploy));
383 :
384 1 : HCCL_INFO(
385 : "NetworkManager nicDeploy[%u] deviceLogicId_[%d] devicePhyId_[%u] init ra OK, nicSocketMap size[%u], "
386 : "isHostUseDevNic[%d]",
387 : static_cast<u32>(nicDeploy), deviceLogicId_, devicePhyId_, raResourceInfo_.nicSocketMap.size(),
388 : isHostUseDevNic);
389 1 : return HCCL_SUCCESS;
390 : }
391 :
392 0 : HcclResult NetworkManager::HeterogStartListen(const HcclIpAddress& ipAddr, u32 port)
393 : {
394 0 : HCCL_DEBUG("HeterogStartListen ipAddr[%s] port[%u]", ipAddr.GetReadableAddress(), port);
395 0 : SocketHandle nicSocketHandle = raResourceInfo_.nicSocketMap[ipAddr].nicSocketHandle;
396 :
397 0 : CHK_PRT_RET(
398 : port > MAX_PORT_ID || port < MIN_PORT_ID,
399 : HCCL_ERROR("[NetworkManager][HeterogStartListen] port error[%u]", port), HCCL_E_NETWORK);
400 :
401 0 : if (nicSocketHandle != nullptr
402 0 : && raResourceInfo_.nicSocketMap[ipAddr].listenedPort.find(port)
403 0 : == raResourceInfo_.nicSocketMap[ipAddr].listenedPort.end()
404 0 : && IPPortListenRefMapHost_[ipAddr][port].Ref() == FIRST_LISTEN) {
405 0 : CHK_RET(StartListenSocket(nicSocketHandle, port));
406 0 : raResourceInfo_.nicSocketMap[ipAddr].listenedPort.insert(port);
407 0 : raResourceInfo_.hostNetSocketMap[ipAddr].listenedPort.insert(port);
408 : }
409 0 : return HCCL_SUCCESS;
410 : }
411 :
412 1 : HcclResult NetworkManager::HeterogInit(u32 devId, const HcclIpAddress& ipAddr, u32 port)
413 : {
414 1 : s32 ref = hostNicInitRef_.Ref();
415 1 : if (ref > 1) {
416 0 : HCCL_INFO("NetworkManager: heterog init nic, ref[%u], skip", ref);
417 0 : return HCCL_SUCCESS;
418 : }
419 :
420 1 : CHK_RET(hrtRaSocketSetWhiteListStatus(0));
421 :
422 : // 暂缺获取物理id的手段
423 1 : RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, false};
424 1 : config.phyId = ((static_cast<s32>(devId) == HOST_DEVICE_ID) ? 0 : devId);
425 1 : config.nicPosition = static_cast<u32>(NICDeployment::NIC_DEPLOYMENT_HOST);
426 1 : HCCL_INFO("HeterogInit call HrtRaInit.");
427 1 : CHK_RET(HrtRaInit(&config));
428 :
429 1 : struct rdev nicRdevInfo = {};
430 1 : nicRdevInfo.phyId = devId;
431 1 : nicRdevInfo.family = ipAddr.GetFamily();
432 1 : nicRdevInfo.localIp.addr = ipAddr.GetBinaryAddress().addr;
433 1 : nicRdevInfo.localIp.addr6 = ipAddr.GetBinaryAddress().addr6;
434 1 : SocketHandle socketHandle = nullptr;
435 1 : HcclResult ret = hrtRaSocketInit(NETWORK_PEER_ONLINE, nicRdevInfo, socketHandle);
436 1 : if (ret != HCCL_SUCCESS) {
437 1 : HCCL_ERROR(
438 : "[HeterogInit]errNo[0x%016llx] ra socket init failed, ip[%s], return[%d]",
439 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ipAddr.GetReadableAddress(), ret);
440 1 : HrtRaDeInit(&config);
441 1 : return HCCL_E_TCP_CONNECT;
442 : }
443 0 : HCCL_INFO("ip[%s] socket init OK", ipAddr.GetReadableAddress());
444 :
445 0 : IpSocket ipSocketInfo;
446 0 : ipSocketInfo.nicSocketHandle = socketHandle;
447 :
448 0 : raResourceInfo_.nicSocketMap.insert(std::make_pair(ipAddr, ipSocketInfo));
449 0 : raResourceInfo_.hostNetSocketMap.insert(std::make_pair(ipAddr, ipSocketInfo));
450 :
451 : /* device网卡初始化暂不考虑 */
452 0 : if (!GetExternalInputHcclIsTcpMode()) {
453 0 : ret = InitRdmaHandle(devId, ipAddr);
454 0 : if (ret != HCCL_SUCCESS) {
455 0 : HCCL_ERROR("[HeterogInit] InitRdmaHandle fail, ret[%d], destroy resource.", ret);
456 0 : hrtRaSocketDeInit(socketHandle);
457 0 : HrtRaDeInit(&config);
458 0 : return ret;
459 : }
460 : }
461 :
462 0 : ret = HeterogStartListen(ipAddr, port);
463 0 : if (ret != HCCL_SUCCESS) {
464 0 : HCCL_ERROR("[HeterogInit] HeterogStartListen fail, ret[%d], destroy resource.", ret);
465 0 : if (!GetExternalInputHcclIsTcpMode()) {
466 0 : auto& ipSock = raResourceInfo_.nicSocketMap[ipAddr];
467 0 : if (ipSock.nicRdmaHandle != nullptr) {
468 0 : (void)HrtRaRdmaDeInit(ipSock.nicRdmaHandle, NO_USE);
469 : }
470 : }
471 0 : hrtRaSocketDeInit(socketHandle);
472 0 : HrtRaDeInit(&config);
473 0 : raResourceInfo_.nicSocketMap.erase(ipAddr);
474 0 : return ret;
475 : }
476 0 : return HCCL_SUCCESS;
477 0 : }
478 :
479 0 : HcclResult NetworkManager::HeterogStopListen(const HcclIpAddress& ipAddr, u32 port, bool isNeedDeinit)
480 : {
481 0 : HCCL_DEBUG("HeterogStopListen ipAddr[%s] port[%u]", ipAddr.GetReadableAddress(), port);
482 0 : SocketHandle nicSocketHandle = raResourceInfo_.nicSocketMap[ipAddr].nicSocketHandle;
483 :
484 0 : if (nicSocketHandle != nullptr && raResourceInfo_.nicSocketMap[ipAddr].listenedPort.size() > 0) {
485 0 : if (raResourceInfo_.nicSocketMap[ipAddr].listenedPort.find(port)
486 0 : != raResourceInfo_.nicSocketMap[ipAddr].listenedPort.end()
487 0 : && IPPortListenRefMapHost_[ipAddr][port].Unref() == LAST_RELEASE) {
488 : // 重复raInit时不用去停止监听,但是要处理引用计数,否则析构会出问题
489 0 : if (isRaInitRepeated_) {
490 0 : return HCCL_SUCCESS;
491 : }
492 0 : HCCL_INFO("HeterogStopListen socket listen stop, socket port[%u]", port);
493 0 : CHK_RET(StopListenSocket(nicSocketHandle, port));
494 0 : raResourceInfo_.nicSocketMap[ipAddr].listenedPort.erase(port);
495 0 : raResourceInfo_.hostNetSocketMap[ipAddr].listenedPort.erase(port);
496 : }
497 :
498 0 : if (isNeedDeinit) {
499 0 : CHK_RET(hrtRaSocketDeInit(nicSocketHandle));
500 : }
501 : }
502 0 : return HCCL_SUCCESS;
503 : }
504 :
505 1 : HcclResult NetworkManager::HeterogDeinit(u32 devId, const HcclIpAddress& ipAddr, u32 port)
506 : {
507 1 : s32 ref = hostNicInitRef_.Unref();
508 1 : if (ref > 0) {
509 0 : HCCL_INFO("NetworkManager: heterog deinit nic success, ref[%u], skip.", ref);
510 0 : return HCCL_SUCCESS;
511 1 : } else if (ref < 0) {
512 1 : HCCL_ERROR("[NetworkManager][DeInit]NetworkManager: heterog deinit nic failed, nic has already deinit.");
513 1 : return HCCL_E_INTERNAL;
514 : }
515 :
516 0 : CHK_RET(HeterogStopListen(ipAddr, port, true));
517 :
518 0 : SocketHandle nicRdmaHandle = raResourceInfo_.nicSocketMap[ipAddr].nicRdmaHandle;
519 0 : if (!GetExternalInputHcclIsTcpMode() && nicRdmaHandle != nullptr) {
520 0 : CHK_RET(HrtRaRdmaDeInit(nicRdmaHandle, NO_USE));
521 : }
522 :
523 0 : RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, false};
524 0 : config.phyId = devId;
525 0 : config.nicPosition = static_cast<u32>(NICDeployment::NIC_DEPLOYMENT_HOST);
526 :
527 0 : HCCL_INFO("HeterogDeinit call HrtRaDeInit.");
528 0 : CHK_RET(HrtRaDeInit(&config));
529 :
530 0 : raResourceInfo_.nicSocketMap.erase(raResourceInfo_.nicSocketMap.find(ipAddr));
531 0 : raResourceInfo_.hostNetSocketMap.erase(raResourceInfo_.hostNetSocketMap.find(ipAddr));
532 :
533 0 : return HCCL_SUCCESS;
534 : }
535 :
536 1 : HcclResult NetworkManager::CloseHccpProcess()
537 : {
538 1 : std::unique_lock<std::mutex> lock(hccpProcInfoMutex_);
539 1 : if (isTsdProcessOpen_ == true) {
540 0 : s32 locaLogDevid = 0;
541 0 : hrtGetDevice(&locaLogDevid);
542 0 : if (locaLogDevid != deviceLogicId_) {
543 0 : hrtSetDevice(deviceLogicId_);
544 : }
545 0 : CHK_RET(hrtCloseNetService());
546 0 : isTsdProcessOpen_ = false;
547 0 : if (locaLogDevid != deviceLogicId_) {
548 0 : hrtSetDevice(locaLogDevid);
549 : }
550 : }
551 1 : return HCCL_SUCCESS;
552 1 : }
553 :
554 1 : HcclResult NetworkManager::PrepareDeInit(s32& ref, NICDeployment nicDeploy)
555 : {
556 1 : if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_HOST) {
557 1 : ref = hostNicInitRef_.Unref();
558 0 : } else if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE) {
559 0 : ref = deviceNicInitRef_.Unref();
560 : } else {
561 0 : HCCL_ERROR(
562 : "[NetworkManager][PrepareDeInit]NetworkManager: deinit nic failed, nicPosition[%u] is not supported.",
563 : static_cast<u32>(nicDeploy));
564 0 : return HCCL_E_INTERNAL;
565 : }
566 :
567 1 : if (ref > 0) {
568 0 : HCCL_INFO(
569 : "NetworkManager: PrepareDeInit nic success, nicPosition[%u] ref[%u], skip.", static_cast<u32>(nicDeploy),
570 : ref);
571 0 : return HCCL_SUCCESS;
572 1 : } else if (ref < 0) {
573 1 : HCCL_ERROR(
574 : "[NetworkManager][PrepareDeInit]NetworkManager: deinit nic failed, nicPosition[%u] has already deinit.",
575 : nicDeploy);
576 1 : return HCCL_E_INTERNAL;
577 : }
578 0 : return HCCL_SUCCESS;
579 : }
580 :
581 0 : HcclResult NetworkManager::GetConfigAndRaDeinit(
582 : struct RaInitConfig& config, NICDeployment nicDeploy, bool& isMultiProc, bool hasBackup)
583 : {
584 0 : if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE && !Is310PDevice()) {
585 0 : CHK_RET(DlTdtFunction::GetInstance().DlTdtFunctionInit());
586 0 : bool supportMultiProcHCCP = false;
587 0 : CHK_RET(TsdCapabilityGet(supportMultiProcHCCP));
588 0 : if (supportMultiProcHCCP || hasBackup) {
589 0 : isMultiProc = true;
590 0 : config.hdcType = HDC_SERVICE_TYPE_RDMA_V2;
591 : }
592 : }
593 :
594 0 : HcclResult ret = HrtRaDeInit(&config);
595 0 : CHK_PRT_RET(
596 : ret != HCCL_SUCCESS,
597 : HCCL_ERROR(
598 : "[NetworkManager][DeInit]ra deinit failed. para: nicdeploy[%u], phyId[%u], ret[%u]", config.nicPosition,
599 : config.phyId, ret),
600 : ret);
601 0 : if (IsGeneralServer()) {
602 0 : isRaDeInit_ = true;
603 : }
604 0 : return HCCL_SUCCESS;
605 : }
606 :
607 234 : HcclResult NetworkManager::DeInit(NICDeployment nicDeploy, [[maybe_unused]] bool resetDeviceFlag, bool hasBackup)
608 : {
609 234 : s32 ref = 0;
610 234 : if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_HOST) {
611 20 : ref = hostNicInitRef_.Unref();
612 214 : } else if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE) {
613 217 : ref = deviceNicInitRef_.Unref();
614 : } else {
615 0 : HCCL_ERROR(
616 : "[NetworkManager][DeInit]NetworkManager: deinit nic failed, nicPosition[%u] is not supported.",
617 : static_cast<u32>(nicDeploy));
618 0 : return HCCL_E_INTERNAL;
619 : }
620 :
621 237 : if (ref > 0) {
622 16 : HCCL_INFO(
623 : "NetworkManager: deinit nic success, nicPosition[%u] ref[%u], skip.", static_cast<u32>(nicDeploy), ref);
624 16 : return HCCL_SUCCESS;
625 221 : } else if (ref < 0) {
626 1 : HCCL_ERROR(
627 : "[NetworkManager][DeInit]NetworkManager: deinit nic failed, nicPosition[%u] has already deinit.",
628 : nicDeploy);
629 1 : return HCCL_E_INTERNAL;
630 : }
631 :
632 220 : struct RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, isEnableHdcAsync_};
633 220 : config.nicPosition = Is310PDevice() ? 0 : static_cast<u32>(nicDeploy);
634 220 : config.phyId = devicePhyId_;
635 :
636 220 : bool isMultiProc = false;
637 220 : if (nicDeploy == NICDeployment::NIC_DEPLOYMENT_DEVICE && !Is310PDevice()) {
638 205 : CHK_RET(DlTdtFunction::GetInstance().DlTdtFunctionInit());
639 205 : bool supportMultiProcHCCP = false;
640 205 : CHK_RET(TsdCapabilityGet(supportMultiProcHCCP));
641 205 : if (supportMultiProcHCCP || hasBackup) {
642 1 : isMultiProc = true;
643 1 : config.hdcType = HDC_SERVICE_TYPE_RDMA_V2;
644 : }
645 : }
646 :
647 220 : HcclResult ret = HrtRaDeInit(&config);
648 220 : CHK_PRT_RET(
649 : ret != HCCL_SUCCESS,
650 : HCCL_ERROR(
651 : "[NetworkManager][DeInit]ra deinit failed. para: nicdeploy[%u], phyId[%u], ret[%u]", config.nicPosition,
652 : config.phyId, ret),
653 : ret);
654 220 : if (IsGeneralServer()) {
655 0 : isRaDeInit_ = true;
656 : }
657 :
658 220 : if (isMultiProc) {
659 1 : CHK_RET(CloseHccpProcess());
660 1 : HCCL_INFO(
661 : "[%s]finish CloseHccpProcess, phyId[%u], hdcType[%d], nicDeployment[%d], hasBackup[%d]", __func__,
662 : config.phyId, config.hdcType, nicDeploy, hasBackup);
663 : }
664 :
665 220 : HCCL_INFO("NetworkManager: deinit nic success, nicPosition[%u] ref[%u].", static_cast<u32>(nicDeploy), ref);
666 220 : return HCCL_SUCCESS;
667 : }
668 :
669 0 : HcclResult NetworkManager::DeInitV2(NICDeployment nicDeploy, bool isBackup, [[maybe_unused]] bool resetDeviceFlag)
670 : {
671 0 : s32 ref = 0;
672 0 : CHK_RET(PrepareDeInit(ref, nicDeploy));
673 0 : if (ref > 0) {
674 0 : HCCL_INFO(
675 : "NetworkManager: DeInitV2 nic success, nicPosition[%u] ref[%u], skip.", static_cast<u32>(nicDeploy), ref);
676 0 : return HCCL_SUCCESS;
677 : }
678 :
679 0 : struct RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, false};
680 0 : config.nicPosition = Is310PDevice() ? 0 : static_cast<u32>(nicDeploy);
681 0 : config.phyId = devicePhyId_;
682 :
683 0 : bool isMultiProc = false;
684 0 : CHK_RET(GetConfigAndRaDeinit(config, nicDeploy, isMultiProc, isBackup));
685 :
686 0 : if (isMultiProc) {
687 0 : CHK_RET(CloseHccpProcess());
688 0 : HCCL_INFO(
689 : "[%s]finish CloseHccpProcess, phyId[%u], hdcType[%d], nicDeployment[%d], isBackup[%d]", __func__,
690 : config.phyId, config.hdcType, nicDeploy, isBackup);
691 : }
692 :
693 0 : HCCL_INFO("NetworkManager: DeInitV2 success, nicPosition[%u] ref[%u].", static_cast<u32>(nicDeploy), ref);
694 0 : return HCCL_SUCCESS;
695 : }
696 :
697 24 : HcclResult NetworkManager::StartVnic(HcclIpAddress localIp, u32& port)
698 : {
699 24 : CHK_PRT_RET(
700 : deviceNicInitRef_.Count() <= 0, HCCL_ERROR("[Start][Vnic]can't start vnic socket before init device nic!"),
701 : HCCL_E_INTERNAL);
702 19 : CHK_PRT_RET(Is310PDevice(), HCCL_INFO("DC does not need vnic"), HCCL_SUCCESS);
703 19 : CHK_PRT_RET(port > MAX_PORT_ID, HCCL_ERROR("[Start][Vnic]invalid port id[%u]", port), HCCL_E_PARA);
704 :
705 19 : auto sockInfo = raResourceInfo_.vnicSocketMap.find(localIp);
706 19 : if (sockInfo == raResourceInfo_.vnicSocketMap.end()) {
707 14 : IpSocket tempSock;
708 14 : raResourceInfo_.vnicSocketMap.insert(std::make_pair(localIp, tempSock)); // 本IP占位
709 14 : HCCL_INFO("[Start][Vnic]device[%u] Start Vnic insert ip[%s]", devicePhyId_, localIp.GetReadableAddress());
710 14 : }
711 :
712 19 : IpSocket& sock = raResourceInfo_.vnicSocketMap[localIp];
713 19 : if (sock.listenedPort.size() == 0 && sock.nicSocketHandle == nullptr) {
714 14 : HcclResult ret = InitDeviceSocket(devicePhyId_, localIp, sock.nicSocketHandle);
715 14 : CHK_PRT_RET(
716 : ret != HCCL_SUCCESS,
717 : HCCL_ERROR(
718 : "[Start][Vnic]errNo[0x%016llx] ra vnic init socket failed, devid[%u], ipAddr[%s], return[%d]",
719 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, localIp.GetReadableAddress(), ret),
720 : ret);
721 : } else {
722 5 : HCCL_INFO(
723 : "[Start][Vnic]vnic socket has inited, ipAddr[%s] port[%u], skip init.", localIp.GetReadableAddress(), port);
724 : }
725 :
726 19 : if (sock.listenedPort.find(port) != sock.listenedPort.end()) {
727 5 : HCCL_WARNING("[Start][Vnic]ipAddr[%s] port[%u] is already listened.", localIp.GetReadableAddress(), port);
728 : } else {
729 : // 作为socket server端启动监听(虚拟网卡)
730 14 : bool isAutoPort = port == 0;
731 14 : HCCL_INFO("[Start][Vnic]trying to listen on ip[%s] port[%u].", localIp.GetReadableAddress(), port);
732 14 : CHK_RET(CheckAutoListenVersion(isAutoPort));
733 14 : HcclResult ret = StartListenSocket(sock.nicSocketHandle, port); /* 只拉起1个vnic */
734 14 : CHK_PRT_RET(
735 : ret == HCCL_E_UNAVAIL,
736 : HCCL_INFO(
737 : "[Start][StartVnic]Could not start listening socket for IP [%s] and port [%u].",
738 : localIp.GetReadableAddress(), port),
739 : ret);
740 14 : CHK_PRT_RET(
741 : ret != HCCL_SUCCESS,
742 : HCCL_ERROR(
743 : "[Start][Vnic]errNo[0x%016llx] ra inner listen start failed, "
744 : "devid[%u], ip[%s], port[%u], return[%d]",
745 : HCCL_ERROR_CODE(ret), devicePhyId_, localIp.GetReadableAddress(), port, ret),
746 : ret);
747 14 : sock.listenedPort.insert(port);
748 14 : HCCL_RUN_INFO(
749 : "[Start][Vnic]Listen on ip[%s], port[%u] success, devPhyId[%u], devLogicId[%u], isAutoPort[%d]",
750 : localIp.GetReadableAddress(), port, devicePhyId_, deviceLogicId_, isAutoPort);
751 : }
752 19 : int refCount = IPPortListenRefMapVnicDevice_[localIp][port].Ref();
753 19 : HCCL_INFO(
754 : "NetworkManager devicePhyId_[%u] ip[%s] port[%u] start vnic OK. refCount[%d]", devicePhyId_,
755 : localIp.GetReadableAddress(), port, refCount);
756 19 : return HCCL_SUCCESS;
757 : }
758 :
759 : // 此处只进行socket的创建 不listen
760 0 : HcclResult NetworkManager::CreateVnicSocketHandle(HcclIpAddress localIp)
761 : {
762 0 : CHK_PRT_RET(
763 : !deviceNicInitRef_.Count(),
764 : HCCL_ERROR("[NetworkManager][CreateVnicSocketHandle]"
765 : "can't start vnic socket before init device nic!"),
766 : HCCL_E_INTERNAL);
767 0 : OccupyIp(localIp, raResourceInfo_.vnicSocketMap);
768 0 : CHK_PRT_RET(Is310PDevice(), HCCL_INFO("DC does not need vnic"), HCCL_SUCCESS);
769 :
770 0 : IpSocket& sock = raResourceInfo_.vnicSocketMap[localIp];
771 0 : if (sock.listenedPort.size() == 0 && sock.nicSocketHandle == nullptr) {
772 0 : HcclResult ret = InitDeviceSocket(devicePhyId_, localIp, sock.nicSocketHandle);
773 0 : CHK_PRT_RET(
774 : ret != HCCL_SUCCESS,
775 : HCCL_ERROR(
776 : "[NetworkManager][CreateVnicSocketHandle]errNo[0x%016llx] ra vnic init socket failed, "
777 : "devid[%u], return[%d]",
778 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, ret),
779 : ret);
780 : } else {
781 0 : HCCL_INFO(
782 : "[NetworkManager][CreateVnicSocketHandle] socket has inited, ipAddr[%s], skip.",
783 : localIp.GetReadableAddress());
784 : }
785 0 : HCCL_INFO(
786 : "[NetworkManager][CreateVnicSocketHandle] CreateVnicSocketHandle OK, ipAddr[%s].",
787 : localIp.GetReadableAddress());
788 0 : return HCCL_SUCCESS;
789 : }
790 :
791 6 : HcclResult NetworkManager::StopVnic(const HcclIpAddress& localIp, u32 port)
792 : {
793 6 : auto it = raResourceInfo_.vnicSocketMap.find(localIp);
794 6 : CHK_PRT_RET(
795 : it == raResourceInfo_.vnicSocketMap.end(),
796 : HCCL_ERROR("[Stop][Vnic]ip[%s] is not found in vnicSocketMap, port[%u].", localIp.GetReadableAddress(), port),
797 : HCCL_E_INTERNAL);
798 6 : IpSocket& ipSock = it->second;
799 :
800 6 : int count = IPPortListenRefMapVnicDevice_[localIp][port].Unref();
801 6 : CHK_PRT_RET(
802 : count > 0,
803 : HCCL_INFO("[Stop][Vnic]ip[%s] port[%u] ref[%d] skip stop.", localIp.GetReadableAddress(), port, count),
804 : HCCL_SUCCESS);
805 6 : CHK_PRT_RET(
806 : count < 0,
807 : HCCL_INFO(
808 : "[Stop][Vnic]ip[%s] port[%u] devicePhyId_[%u] vnic stopped ERROR, refcount[%d].",
809 : localIp.GetReadableAddress(), port, devicePhyId_, count),
810 : HCCL_SUCCESS);
811 :
812 : // Stop Listen
813 6 : CHK_PRT_RET(
814 : ipSock.nicSocketHandle != nullptr && StopListenSocket(ipSock.nicSocketHandle, port) != HCCL_SUCCESS,
815 : HCCL_ERROR(
816 : "[Stop][Vnic]errNo[0x%016llx] stop vnic socket failed,devid[%u], ip[%s], port[%u]",
817 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, localIp.GetReadableAddress(), port),
818 : HCCL_E_INTERNAL);
819 6 : ipSock.listenedPort.erase(port);
820 :
821 : // DeInit Socket
822 6 : if (ipSock.listenedPort.size() == 0 && ipSock.nicSocketHandle != nullptr) {
823 6 : HcclResult ret = hrtRaSocketDeInit(ipSock.nicSocketHandle);
824 6 : CHK_PRT_RET(
825 : ret != HCCL_SUCCESS,
826 : HCCL_ERROR(
827 : "[Stop][Vnic]errNo[0x%016llx] stop vnic socket failed,devid[%u], ip[%s], return[%d]",
828 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, localIp.GetReadableAddress(), ret),
829 : HCCL_E_INTERNAL);
830 6 : raResourceInfo_.vnicSocketMap.erase(localIp);
831 : }
832 6 : return HCCL_SUCCESS;
833 : }
834 :
835 1 : HcclResult NetworkManager::StopVnicSocketHandle(const HcclIpAddress& localIp)
836 : {
837 1 : auto it = raResourceInfo_.vnicSocketMap.find(localIp);
838 1 : CHK_PRT_RET(
839 : it == raResourceInfo_.vnicSocketMap.end(),
840 : HCCL_ERROR(
841 : "[NetworkManager][StopVnicSocketHandle]ip[%s] is not found in vnicSocketMap.",
842 : localIp.GetReadableAddress()),
843 : HCCL_E_INTERNAL);
844 :
845 1 : IpSocket& ipSock = it->second;
846 : // 关闭该ip下的全部端口的listen
847 2 : for (auto& port : ipSock.listenedPort) {
848 1 : if (ipSock.nicSocketHandle != nullptr && StopListenSocket(ipSock.nicSocketHandle, port) != HCCL_SUCCESS) {
849 0 : HCCL_ERROR(
850 : "[NetworkManager][StopVnicSocketHandle]errNo[0x%016llx] stop vnic listen failed, "
851 : "devid[%u], ip[%s], port[%u]",
852 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, localIp.GetReadableAddress(), port);
853 0 : break;
854 : }
855 1 : IPPortListenRefMapVnicDevice_[localIp][port].Clear();
856 1 : HCCL_INFO(
857 : "[NetworkManager][StopVnicSocketHandle] ip[%s] stop listen port[%u]", localIp.GetReadableAddress(), port);
858 : }
859 1 : ipSock.listenedPort.clear();
860 :
861 : // 销毁socket
862 1 : CHK_PRT_RET(
863 : ipSock.nicSocketHandle != nullptr && hrtRaSocketDeInit(ipSock.nicSocketHandle),
864 : HCCL_ERROR("[Stop][NicsSocket]VNIC socket deInit not successfully"), HCCL_E_NETWORK);
865 1 : ipSock.nicSocketHandle = nullptr;
866 1 : raResourceInfo_.vnicSocketMap.erase(localIp);
867 :
868 1 : HCCL_INFO(
869 : "[NetworkManager][StopVnicSocketHandle] devid[%u] ip[%s] stop vnic socket success", devicePhyId_,
870 : localIp.GetReadableAddress());
871 1 : return HCCL_SUCCESS;
872 : }
873 :
874 39 : HcclResult NetworkManager::StartNic(const HcclIpAddress& ipAddr, u32& port, bool rdmaFlag, HcclIpAddress ipAddrBackup)
875 : {
876 39 : CHK_PRT_RET(
877 : !deviceNicInitRef_.Count(), HCCL_ERROR("[Start][Nic]can't start nic socket before init device nic!"),
878 : HCCL_E_INTERNAL);
879 38 : auto sockInfo = raResourceInfo_.nicSocketMap.find(ipAddr);
880 38 : if (sockInfo == raResourceInfo_.nicSocketMap.end()) {
881 37 : IpSocket tempSock;
882 37 : raResourceInfo_.nicSocketMap.insert(std::make_pair(ipAddr, tempSock)); // 本IP占位
883 37 : HCCL_INFO("device[%u] Start Nic insert ip[%s]", devicePhyId_, ipAddr.GetReadableAddress());
884 37 : }
885 :
886 38 : IpSocket& sock = raResourceInfo_.nicSocketMap[ipAddr];
887 38 : if (sock.listenedPort.size() == 0) {
888 37 : if (sock.nicSocketHandle == nullptr) {
889 37 : HcclResult ret = InitDeviceSocket(devicePhyId_, ipAddr, sock.nicSocketHandle);
890 37 : CHK_PRT_RET(
891 : ret != HCCL_SUCCESS,
892 : HCCL_ERROR(
893 : "[Start][Nic]errNo[0x%016llx] ra nic init socket failed, devid[%u], return[%d]",
894 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, ret),
895 : ret);
896 : }
897 : } else {
898 1 : HCCL_INFO("NetworkManager: socket has inited, ipAddr[%s] port[%u], skip.", ipAddr.GetReadableAddress(), port);
899 : }
900 38 : if (sock.nicRdmaHandle == nullptr && rdmaFlag) {
901 : NetworkMode netMode;
902 34 : GetNetworkMode(netMode);
903 34 : CHK_RET(GetNotifyType(notifyType_));
904 68 : HcclResult ret = InitRDMA(
905 34 : devicePhyId_, ipAddr, netMode, notifyType_, sock.nicRdmaHandle, isDisableLiteThread_, false, ipAddrBackup);
906 34 : CHK_PRT_RET(
907 : ret != HCCL_SUCCESS,
908 : HCCL_ERROR(
909 : "[Start][Nic]errNo[0x%016llx] ra nic init rdma failed, devid[%u], return[%d]",
910 : HCCL_ERROR_CODE(HCCL_E_NETWORK), devicePhyId_, ret),
911 : HCCL_E_NETWORK);
912 :
913 : int supportLite;
914 34 : ret = HrtGetRdmaLiteStatus(sock.nicRdmaHandle, &supportLite);
915 34 : CHK_PRT_RET(
916 : ret != HCCL_SUCCESS,
917 : HCCL_ERROR(
918 : "[Get][RdmaLiteStatus]errNo[0x%016llx] get rdma lite status failed, return[%d]",
919 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret),
920 : HCCL_E_TCP_CONNECT);
921 34 : isRdmaLiteEn_ = (supportLite == 1);
922 34 : } else {
923 4 : HCCL_INFO(
924 : "[Start][Nic] requesting not init rdma , or already init rdma, "
925 : "rdmaFlag[%u], ipAddr[%s], port[%u], skip.",
926 : rdmaFlag, ipAddr.GetReadableAddress(), port);
927 : }
928 : // 如果port id传入的值无效值0xFFFFFFFF, 不启动监听
929 38 : CHK_PRT_RET(port == MAX_VALUE_U32, HCCL_INFO("[Start][Nic] port id[%u], skip listen socket", port), HCCL_SUCCESS);
930 6 : CHK_PRT_RET(port > MAX_PORT_ID, HCCL_ERROR("[Start][Nic]invalid port id[%u]", port), HCCL_E_INTERNAL);
931 6 : if (sock.listenedPort.find(port) != sock.listenedPort.end()) {
932 0 : HCCL_WARNING("port[%u] is already listened.", port);
933 : } else {
934 6 : bool isAutoPort = port == 0;
935 6 : HCCL_INFO("[Start][Nic]trying to listen on ip[%s] port[%u].", ipAddr.GetReadableAddress(), port);
936 6 : CHK_RET(CheckAutoListenVersion(isAutoPort));
937 6 : HcclResult ret = StartListenSocket(sock.nicSocketHandle, port);
938 6 : CHK_PRT_RET(
939 : ret == HCCL_E_UNAVAIL,
940 : HCCL_INFO(
941 : "[Start][Nic]Could not start listening socket for IP [%s] and port [%u].", ipAddr.GetReadableAddress(),
942 : port),
943 : ret);
944 6 : CHK_PRT_RET(
945 : ret != HCCL_SUCCESS,
946 : HCCL_ERROR(
947 : "[Start][Nic]errNo[0x%016llx] ra inner listen start failed, "
948 : "devid[%u], ip[%s], port[%u], return[%d]",
949 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, ipAddr.GetReadableAddress(), port, ret),
950 : HCCL_E_TCP_CONNECT);
951 6 : HCCL_INFO("port[%u] listen start OK", port);
952 6 : sock.listenedPort.insert(port);
953 6 : HCCL_RUN_INFO(
954 : "[Start][Nic]Listen on ip[%s], port[%u] success, devPhyId[%u], devLogicId[%u], isAutoPort[%d]",
955 : ipAddr.GetReadableAddress(), port, devicePhyId_, deviceLogicId_, isAutoPort);
956 : }
957 6 : int refCount = IPPortListenRefMapDevice_[ipAddr][port].Ref();
958 6 : HCCL_INFO("Nic ip[%s] port[%u] refcount is [%d]", ipAddr.GetReadableAddress(), port, refCount);
959 6 : return HCCL_SUCCESS;
960 : }
961 :
962 2 : void NetworkManager::SetDisableLiteThread(bool disable) { isDisableLiteThread_ = disable; }
963 :
964 0 : HcclResult NetworkManager::CreateNicSocketHandle(const HcclIpAddress& ipAddr)
965 : {
966 0 : CHK_PRT_RET(
967 : !deviceNicInitRef_.Count(),
968 : HCCL_ERROR("[NetworkManager][CreateNicSocketHandle]can't start nic socket before init device nic!"),
969 : HCCL_E_INTERNAL);
970 0 : OccupyIp(ipAddr, raResourceInfo_.nicSocketMap);
971 :
972 0 : IpSocket& sock = raResourceInfo_.nicSocketMap[ipAddr];
973 0 : if (sock.listenedPort.size() == 0) {
974 0 : if (sock.nicSocketHandle == nullptr) {
975 0 : HcclResult ret = InitDeviceSocket(devicePhyId_, ipAddr, sock.nicSocketHandle);
976 0 : CHK_PRT_RET(
977 : ret != HCCL_SUCCESS,
978 : HCCL_ERROR(
979 : "[NetworkManager][CreateNicSocketHandle]errNo[0x%016llx] ra nic init socket failed, devid[%u], "
980 : "return[%d]",
981 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, ret),
982 : ret);
983 : }
984 : } else {
985 0 : HCCL_INFO(
986 : "[NetworkManager][CreateNicSocketHandle] socket has inited, ipAddr[%s], skip.",
987 : ipAddr.GetReadableAddress());
988 : }
989 0 : HCCL_INFO(
990 : "[NetworkManager][CreateNicSocketHandle] CreateNicSocketHandle OK, ipAddr[%s].", ipAddr.GetReadableAddress());
991 0 : return HCCL_SUCCESS;
992 : }
993 :
994 0 : HcclResult NetworkManager::CreateRdmaHandle(
995 : const HcclIpAddress& ipAddr, bool isBackup, NetworkMode netMode, NotifyTypeT notifyType,
996 : HcclNetDevDeployment netDevDeployment)
997 : {
998 : // device侧如果传入的ip是备份ip,那么给InitRDMA传递的两个主备ip(两个相同)都是备份ip hostrdma没有备份 不受影响
999 0 : HcclIpAddress ipAddrBackup(ipAddr.GetFamily(), ipAddr.GetBinaryAddress());
1000 0 : if (!isBackup) {
1001 0 : HCCL_INFO("[NetworkManager][CreateRdmaHandle] ipAddr[%s] is not backup", ipAddr.GetReadableAddress());
1002 0 : ipAddrBackup.clear();
1003 : }
1004 0 : CHK_PRT_RET(
1005 : !(deviceNicInitRef_.Count() || hostNicInitRef_.Count()),
1006 : HCCL_ERROR("[NetworkManager][CreateRdmaHandle]can't start nic socket before init device nic!"),
1007 : HCCL_E_INTERNAL);
1008 0 : switch (netDevDeployment) {
1009 0 : case HcclNetDevDeployment::HCCL_NETDEV_DEPLOYMENT_DEVICE: {
1010 : // ip占位
1011 0 : OccupyIp(ipAddr, raResourceInfo_.nicSocketMap);
1012 : // 初始化socket
1013 0 : IpSocket& sock = raResourceInfo_.nicSocketMap[ipAddr];
1014 0 : if (sock.nicRdmaHandle == nullptr) {
1015 0 : notifyType_ = notifyType;
1016 0 : HcclResult ret = InitRDMA(
1017 0 : devicePhyId_, ipAddr, netMode, notifyType_, sock.nicRdmaHandle, false, false, ipAddrBackup);
1018 0 : CHK_PRT_RET(
1019 : ret != HCCL_SUCCESS,
1020 : HCCL_ERROR(
1021 : "[NetworkManager][CreateRdmaHandle]errNo[0x%016llx] ra nic init rdma failed, devid[%u], "
1022 : "return[%d]",
1023 : HCCL_ERROR_CODE(HCCL_E_NETWORK), devicePhyId_, ret),
1024 : HCCL_E_NETWORK);
1025 : } else {
1026 0 : HCCL_INFO(
1027 : "[NetworkManager][CreateRdmaHandle] requesting not init rdma , or already init rdma, "
1028 : "ipAddr[%s], skip.",
1029 : ipAddr.GetReadableAddress());
1030 : }
1031 : // device-roce需要开启rdmalite
1032 0 : RdmaSupportLite(sock.nicRdmaHandle);
1033 0 : break;
1034 : }
1035 0 : case HcclNetDevDeployment::HCCL_NETDEV_DEPLOYMENT_HOST: {
1036 : // 本ip占位
1037 0 : OccupyIp(ipAddr, raResourceInfo_.hostNetSocketMap);
1038 : // 初始化socket
1039 0 : IpSocket& sock = raResourceInfo_.hostNetSocketMap[ipAddr];
1040 0 : if (sock.nicRdmaHandle == nullptr) {
1041 0 : notifyType_ = NOTIFY;
1042 0 : HcclResult ret = InitRDMA(devicePhyId_, ipAddr, netMode, notifyType_, sock.nicRdmaHandle);
1043 0 : CHK_PRT_RET(
1044 : ret != HCCL_SUCCESS,
1045 : HCCL_ERROR(
1046 : "[Start][Nic]errNo[0x%016llx] ra nic init rdma failed, devid[%u], return[%d]",
1047 : HCCL_ERROR_CODE(HCCL_E_NETWORK), devicePhyId_, ret),
1048 : HCCL_E_NETWORK);
1049 : } else {
1050 0 : HCCL_INFO(
1051 : "[NetworkManager][CreateRdmaHandle] requesting not init rdma , or already init rdma, "
1052 : "ipAddr[%s], skip.",
1053 : ipAddr.GetReadableAddress());
1054 : }
1055 : // host rdma的额外占位
1056 0 : auto temp = raResourceInfo_.nicSocketMap.find(ipAddr);
1057 0 : if (temp != raResourceInfo_.nicSocketMap.end()) {
1058 0 : HCCL_ERROR(
1059 : "[NetworkManager][CreateRdmaHandle] ipAddr[%s] has already occupied.", ipAddr.GetReadableAddress());
1060 0 : return HCCL_E_INTERNAL;
1061 : }
1062 0 : raResourceInfo_.nicSocketMap.insert(std::make_pair(ipAddr, sock));
1063 0 : break;
1064 : }
1065 0 : default: {
1066 0 : HCCL_ERROR(
1067 : "[NetworkManager][CreateRdmaHandle]this Deployment [%u] is not supported, please check the "
1068 : "configuration.",
1069 : netDevDeployment);
1070 0 : return HCCL_E_NOT_SUPPORT;
1071 : }
1072 : }
1073 0 : return HCCL_SUCCESS;
1074 0 : }
1075 :
1076 0 : HcclResult NetworkManager::RdmaSupportLite(RdmaHandle rdmaHandle)
1077 : {
1078 : int supportLite;
1079 0 : HcclResult ret = HrtGetRdmaLiteStatus(rdmaHandle, &supportLite);
1080 0 : CHK_PRT_RET(
1081 : ret != HCCL_SUCCESS,
1082 : HCCL_ERROR(
1083 : "[Get][RdmaLiteStatus]errNo[0x%016llx] get rdma lite status failed, return[%d]",
1084 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ret),
1085 : HCCL_E_TCP_CONNECT);
1086 0 : isRdmaLiteEn_ = (supportLite == 1);
1087 0 : return HCCL_SUCCESS;
1088 : }
1089 :
1090 0 : HcclResult NetworkManager::StopRdmaHandle(const HcclIpAddress& ipAddr, HcclNetDevDeployment netDevDeployment)
1091 : {
1092 : // rdma没有socket 没有listen
1093 :
1094 : // 销毁socket
1095 0 : switch (netDevDeployment) {
1096 0 : case HcclNetDevDeployment::HCCL_NETDEV_DEPLOYMENT_DEVICE: {
1097 0 : auto it = raResourceInfo_.nicSocketMap.find(ipAddr);
1098 0 : if (it == raResourceInfo_.nicSocketMap.end()) {
1099 0 : HCCL_WARNING(
1100 : "[Stop][NicsSocket]ip[%s] not found in nicSocketMap, may already cleaned.",
1101 : ipAddr.GetReadableAddress());
1102 0 : return HCCL_SUCCESS;
1103 : }
1104 0 : IpSocket& ipSock = it->second;
1105 0 : if (ipSock.nicRdmaHandle != nullptr && HrtRaRdmaDeInit(ipSock.nicRdmaHandle, notifyType_)) {
1106 0 : HCCL_ERROR("[Stop][rmda]NIC rdev deInit not successfully, notifyType_[%d]", notifyType_);
1107 0 : return HCCL_E_NETWORK;
1108 : }
1109 0 : ipSock.nicRdmaHandle = nullptr;
1110 : // 如果该ip下既没有tcp也没有rdma那么移除该ip
1111 0 : if (ipSock.nicSocketHandle == nullptr && ipSock.nicRdmaHandle == nullptr) {
1112 0 : raResourceInfo_.nicSocketMap.erase(ipAddr);
1113 : }
1114 0 : break;
1115 : }
1116 0 : case HcclNetDevDeployment::HCCL_NETDEV_DEPLOYMENT_HOST: {
1117 0 : auto it = raResourceInfo_.hostNetSocketMap.find(ipAddr);
1118 0 : CHK_PRT_RET(
1119 : it == raResourceInfo_.hostNetSocketMap.end(),
1120 : HCCL_ERROR("[Stop][rdma]ip[%s] is not found in hostNetSocketMap.", ipAddr.GetReadableAddress()),
1121 : HCCL_E_INTERNAL);
1122 0 : IpSocket& ipSock = it->second;
1123 0 : if (ipSock.nicRdmaHandle != nullptr && HrtRaRdmaDeInit(ipSock.nicRdmaHandle, notifyType_)) {
1124 0 : HCCL_ERROR("[Stop][rdma]NIC rdev deInit not successfully, notifyType_[%d]", notifyType_);
1125 0 : return HCCL_E_NETWORK;
1126 : }
1127 0 : ipSock.nicRdmaHandle = nullptr;
1128 0 : raResourceInfo_.nicSocketMap.erase(ipAddr); // 移除额外的占位
1129 : // 如果该ip下没有tcp也没有rdma那么移除该ip
1130 0 : if (ipSock.nicSocketHandle == nullptr && ipSock.nicRdmaHandle == nullptr) {
1131 0 : raResourceInfo_.hostNetSocketMap.erase(ipAddr);
1132 : }
1133 0 : break;
1134 : }
1135 0 : default: {
1136 0 : HCCL_ERROR(
1137 : "[NetworkManager][StopRdmaHandle]this Deployment [%u] is not supported, please check the "
1138 : "configuration.",
1139 : netDevDeployment);
1140 0 : return HCCL_E_NOT_SUPPORT;
1141 : }
1142 : }
1143 :
1144 0 : HCCL_INFO(
1145 : "[NetworkManager] [StopRdmaHandle] devicePhyId_[%u] StopRdmaHandle success ip [%s]", devicePhyId_,
1146 : ipAddr.GetReadableAddress());
1147 0 : return HCCL_SUCCESS; // stop socket。port 数清零时自动关闭socket
1148 : }
1149 :
1150 2 : HcclResult NetworkManager::StopNicSocketHandle(const HcclIpAddress& ipAddr)
1151 : {
1152 2 : auto it = raResourceInfo_.nicSocketMap.find(ipAddr);
1153 2 : CHK_PRT_RET(
1154 : it == raResourceInfo_.nicSocketMap.end(),
1155 : HCCL_ERROR(
1156 : "[NetworkManager][StopNicSocketHandle]ip[%s] is not found in nicSocketMap.", ipAddr.GetReadableAddress()),
1157 : HCCL_E_INTERNAL);
1158 0 : IpSocket& ipSock = it->second;
1159 : HcclResult ret;
1160 : // 关闭该ip下的全部端口的listen
1161 0 : for (auto& port : ipSock.listenedPort) {
1162 0 : ret = StopNicsSocketListen(ipAddr, port);
1163 0 : CHK_PRT_RET(
1164 : ret != HCCL_SUCCESS,
1165 : HCCL_ERROR(
1166 : "[NetworkManager][StopNicSocketHandle]errNo[0x%016llx] stop nic listen failed,devid[%u], ip[%s], "
1167 : "port[%u], return[%d]",
1168 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, ipAddr.GetReadableAddress(), port, ret),
1169 : HCCL_E_INTERNAL);
1170 0 : ipSock.listenedPort.erase(port);
1171 0 : IPPortListenRefMapDevice_[ipAddr][port].Clear(); // port计数更新
1172 0 : HCCL_WARNING(
1173 : "[NetworkManager][StopNicSocketHandle] ip [%s] stop listen port [%u] refcount is [%d]",
1174 : ipAddr.GetReadableAddress(), port, IPPortListenRefMapDevice_[ipAddr][port].Count());
1175 : }
1176 :
1177 : // 销毁socket
1178 0 : if (ipSock.nicSocketHandle != nullptr && hrtRaSocketDeInit(ipSock.nicSocketHandle)) {
1179 0 : HCCL_ERROR("[Stop][NicsSocket]NIC socket deInit not successfully");
1180 0 : return HCCL_E_NETWORK;
1181 : }
1182 0 : ipSock.nicSocketHandle = nullptr;
1183 :
1184 : // 如果该ip下既没有tcp也没有rdma那么移除该ip
1185 0 : if (ipSock.nicSocketHandle == nullptr && ipSock.nicRdmaHandle == nullptr) {
1186 0 : raResourceInfo_.nicSocketMap.erase(ipAddr);
1187 : }
1188 :
1189 0 : return HCCL_SUCCESS;
1190 : }
1191 :
1192 36 : HcclResult NetworkManager::StopNic(const HcclIpAddress& ipAddr, u32 port)
1193 : {
1194 36 : auto it = raResourceInfo_.nicSocketMap.find(ipAddr);
1195 36 : CHK_PRT_RET(
1196 : it == raResourceInfo_.nicSocketMap.end(),
1197 : HCCL_ERROR("[Stop][Nic]ip[%s] is not found in nicSocketMap, port[%u].", ipAddr.GetReadableAddress(), port),
1198 : HCCL_E_INTERNAL);
1199 36 : IpSocket& ipSock = it->second;
1200 : HcclResult ret;
1201 : // 传入端口号为无效值0xFFFFFFFF,未启动监听,不需要stop listen
1202 36 : if (port != MAX_VALUE_U32) {
1203 4 : CHK_PRT_RET(
1204 : IPPortListenRefMapDevice_[ipAddr][port].Unref() > 0,
1205 : HCCL_INFO(
1206 : "[Stop][Nic]ip[%s] port[%u] ref[%d] skip stop.", ipAddr.GetReadableAddress(), port,
1207 : IPPortListenRefMapDevice_[ipAddr][port].Count()),
1208 : HCCL_SUCCESS);
1209 4 : ret = StopNicsSocketListen(ipAddr, port);
1210 4 : CHK_PRT_RET(
1211 : ret != HCCL_SUCCESS,
1212 : HCCL_ERROR(
1213 : "[Stop][Nic]errNo[0x%016llx] stop nic socket failed,devid[%u], ip[%s], port[%u], return[%d]",
1214 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, ipAddr.GetReadableAddress(), port, ret),
1215 : HCCL_E_INTERNAL);
1216 4 : ipSock.listenedPort.erase(port);
1217 : }
1218 :
1219 36 : if (ipSock.listenedPort.size() == 0) {
1220 35 : ret = StopNicsSocket(ipAddr);
1221 35 : CHK_PRT_RET(
1222 : ret != HCCL_SUCCESS,
1223 : HCCL_ERROR(
1224 : "[Stop][Nic]errNo[0x%016llx] stop nic socket failed,devid[%u], ip[%s], return[%d]",
1225 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, ipAddr.GetReadableAddress(), ret),
1226 : HCCL_E_INTERNAL);
1227 33 : raResourceInfo_.nicSocketMap.erase(ipAddr);
1228 : }
1229 34 : return HCCL_SUCCESS;
1230 : }
1231 5 : HcclResult NetworkManager::StopAllDeviceNicSockets()
1232 : {
1233 : HcclResult ret;
1234 11 : for (auto& itSocket : raResourceInfo_.nicSocketMap) {
1235 6 : std::set<u32> listenedPorts = itSocket.second.listenedPort;
1236 7 : for (auto itPort : listenedPorts) {
1237 3 : ret = StopNicsSocketListen(itSocket.first, itPort);
1238 3 : if (ret != HCCL_SUCCESS) {
1239 2 : HCCL_ERROR(
1240 : "[Stop][AllDeviceNicSockets]errNo[0x%016llx] stop nic socket failed,devid[%u],ip[%s], "
1241 : "port[%u],return[%d]",
1242 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, itSocket.first.GetReadableAddress(), itPort,
1243 : ret);
1244 2 : itSocket.second.listenedPort.erase(itPort);
1245 2 : break;
1246 : }
1247 : }
1248 6 : ret = StopNicsSocket(itSocket.first);
1249 6 : if (ret != HCCL_SUCCESS) {
1250 2 : HCCL_ERROR(
1251 : "[Stop][AllDeviceNicSockets]errNo[0x%016llx] stop nic socket failed,devid[%u],ip[%s],return[%d]",
1252 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, itSocket.first.GetReadableAddress(), ret);
1253 2 : if (itSocket.second.nicRdmaHandle != nullptr) {
1254 0 : HCCL_ERROR("[StopVnicSocketHandle] itSocket.second.nicRdmaHandle is not nullptr.");
1255 0 : (void)HrtRaRdmaDeInit(itSocket.second.nicRdmaHandle, notifyType_);
1256 0 : itSocket.second.nicRdmaHandle = nullptr;
1257 : }
1258 2 : if (itSocket.second.nicSocketHandle != nullptr) {
1259 2 : HCCL_ERROR("[StopVnicSocketHandle] itSocket.second.nicSocketHandle is not nullptr.");
1260 2 : (void)HrtRaRdmaDeInit(itSocket.second.nicSocketHandle, notifyType_);
1261 2 : itSocket.second.nicSocketHandle = nullptr;
1262 : }
1263 : }
1264 6 : }
1265 :
1266 5 : raResourceInfo_.nicSocketMap.clear();
1267 5 : return HCCL_SUCCESS;
1268 : }
1269 :
1270 7 : HcclResult NetworkManager::StopAllDeviceVnicSockets()
1271 : {
1272 : HcclResult ret;
1273 :
1274 14 : for (auto itSocket : raResourceInfo_.vnicSocketMap) {
1275 7 : HCCL_WARNING(
1276 : "vnicSocketMap ip[%s] is not released when NetworkManager Destroy, force releasing",
1277 : itSocket.first.GetReadableAddress());
1278 7 : if (itSocket.second.nicSocketHandle != nullptr) {
1279 14 : for (auto itPort : itSocket.second.listenedPort) {
1280 7 : ret = StopListenSocket(itSocket.second.nicSocketHandle, itPort);
1281 7 : if (ret != HCCL_SUCCESS) {
1282 0 : HCCL_ERROR(
1283 : "[Stop][AllDeviceVnicSockets]errNo[0x%016llx] stop vnic socket listen failed, "
1284 : "devid[%u], ip[%s], port[%u], return[%d]",
1285 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, itSocket.first.GetReadableAddress(), itPort,
1286 : ret);
1287 : }
1288 7 : IPPortListenRefMapVnicDevice_[itSocket.first][itPort].Clear();
1289 : }
1290 7 : ret = hrtRaSocketDeInit(itSocket.second.nicSocketHandle);
1291 7 : if (ret != HCCL_SUCCESS) {
1292 1 : HCCL_ERROR(
1293 : "[Stop][AllDeviceVnicSockets]errNo[0x%016llx] deinit vnic socket failed, "
1294 : "devid[%u], ip[%s], return[%d]",
1295 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, itSocket.first.GetReadableAddress(), ret);
1296 : }
1297 7 : itSocket.second.nicSocketHandle = nullptr;
1298 : }
1299 7 : }
1300 7 : raResourceInfo_.vnicSocketMap.clear();
1301 :
1302 7 : return HCCL_SUCCESS;
1303 : }
1304 :
1305 34 : HcclResult NetworkManager::InitRDMA(
1306 : u32 devicePhysicID, const HcclIpAddress& ipAddr, NetworkMode netMode, NotifyTypeT notifyType,
1307 : RdmaHandle& rdmaHandle, bool disabledLiteThread, bool enable910ALite, HcclIpAddress ipAddrBackup)
1308 : {
1309 : struct rdev nicRdevInfo;
1310 34 : nicRdevInfo.phyId = devicePhysicID;
1311 34 : nicRdevInfo.family = ipAddr.GetFamily();
1312 34 : nicRdevInfo.localIp.addr = ipAddr.GetBinaryAddress().addr;
1313 34 : nicRdevInfo.localIp.addr6 = ipAddr.GetBinaryAddress().addr6;
1314 :
1315 34 : struct RdevInitInfo init_info = {};
1316 34 : init_info.mode = netMode;
1317 34 : init_info.notifyType = notifyType;
1318 34 : init_info.disabledLiteThread = disabledLiteThread;
1319 34 : init_info.enabled910aLite = enable910ALite;
1320 34 : init_info.enabled2mbLite = GetExternalInputRdmaFastPost();
1321 :
1322 : HcclResult ret;
1323 34 : HCCL_DEBUG("isRaInitRepeated_[%d]", isRaInitRepeated_);
1324 34 : if (isRaInitRepeated_) {
1325 : // 重复RaInit时,调用此接口获取相同的rdmaHandle,防止重新生成
1326 0 : ret = HrtRaRdmaGetHandle(devicePhysicID, rdmaHandle);
1327 : } else {
1328 34 : if (!ipAddrBackup.IsInvalid()) {
1329 : struct rdev nicRdevInfoback;
1330 0 : CHK_RET(hrtGetPairDevicePhyId(devicePhysicID, nicRdevInfoback.phyId));
1331 0 : nicRdevInfoback.family = ipAddrBackup.GetFamily();
1332 0 : nicRdevInfoback.localIp.addr = ipAddrBackup.GetBinaryAddress().addr;
1333 0 : nicRdevInfoback.localIp.addr6 = ipAddrBackup.GetBinaryAddress().addr6;
1334 0 : HCCL_DEBUG(
1335 : "[%s]backup rdev info: ipAddr[%s], ipAddrBackup[%s]", __func__, ipAddr.GetReadableIP(),
1336 : ipAddrBackup.GetReadableIP());
1337 0 : ret = HrtRdmaInitWithBackupAttr(init_info, nicRdevInfo, nicRdevInfoback, rdmaHandle);
1338 : } else {
1339 34 : ret = HrtRaRdmaInitWithAttr(init_info, nicRdevInfo, rdmaHandle);
1340 : }
1341 : }
1342 :
1343 34 : CHK_PRT_RET(
1344 : ret != HCCL_SUCCESS,
1345 : HCCL_ERROR(
1346 : "[Init][RDMA]errNo[0x%016llx] ra rdma init failed, devid[%u] ip[%s], notifyType[%d], return[%d]",
1347 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhysicID, ipAddr.GetReadableAddress(), notifyType, ret),
1348 : HCCL_E_TCP_CONNECT);
1349 34 : HCCL_INFO(
1350 : "devicePhyId[%u], ip[%s] disabledLiteThread[%u] enabled910aLite[%u] rdmaHandle[%p] rdma init OK",
1351 : devicePhysicID, ipAddr.GetReadableAddress(), disabledLiteThread, enable910ALite, rdmaHandle);
1352 :
1353 34 : return HCCL_SUCCESS;
1354 : }
1355 :
1356 153 : bool NetworkManager::GetRdmaLiteStatus() { return isRdmaLiteEn_; }
1357 :
1358 34 : HcclResult NetworkManager::GetNotifyType(NotifyTypeT& notifyType) const
1359 : {
1360 : DevType deviceType;
1361 34 : CHK_RET(hrtGetDeviceType(deviceType));
1362 34 : if (deviceType == DevType::DEV_TYPE_910 || deviceType == DevType::DEV_TYPE_910B
1363 0 : || deviceType == DevType::DEV_TYPE_910_93) {
1364 34 : notifyType = NOTIFY;
1365 0 : } else if (deviceType == DevType::DEV_TYPE_310P3 || deviceType == DevType::DEV_TYPE_310P1) {
1366 0 : notifyType = EVENTID;
1367 : } else {
1368 0 : HCCL_ERROR("[Init][DeviceRDMA]devType[%d] is invalid", deviceType);
1369 0 : return HCCL_E_PARA;
1370 : }
1371 34 : return HCCL_SUCCESS;
1372 : }
1373 :
1374 85 : void NetworkManager::GetNetworkMode(NetworkMode& netMode) const
1375 : {
1376 85 : if (Is310PDevice()) {
1377 0 : netMode = NETWORK_PEER_ONLINE;
1378 : } else {
1379 85 : netMode = NETWORK_OFFLINE;
1380 : }
1381 85 : }
1382 :
1383 51 : HcclResult NetworkManager::InitDeviceSocket(u32 devicePhysicID, const HcclIpAddress& ipAddr, SocketHandle& socketHandle)
1384 : {
1385 : struct rdev nicRdevInfo;
1386 51 : nicRdevInfo.phyId = devicePhysicID;
1387 51 : nicRdevInfo.family = ipAddr.GetFamily();
1388 51 : nicRdevInfo.localIp.addr = ipAddr.GetBinaryAddress().addr;
1389 51 : nicRdevInfo.localIp.addr6 = ipAddr.GetBinaryAddress().addr6;
1390 :
1391 : NetworkMode netMode;
1392 51 : GetNetworkMode(netMode);
1393 :
1394 51 : HcclResult ret = hrtRaSocketInit(netMode, nicRdevInfo, socketHandle);
1395 51 : CHK_PRT_RET(
1396 : ret != HCCL_SUCCESS,
1397 : HCCL_ERROR(
1398 : "[Init][DeviceSocket]ra socket init failed, network mode[%d] devid[%u] ip[%s], return[%d]", netMode,
1399 : devicePhysicID, ipAddr.GetReadableAddress(), ret),
1400 : HCCL_E_TCP_CONNECT);
1401 51 : HCCL_INFO("devicePhyId[%u], ip[%s] socket init OK", devicePhysicID, ipAddr.GetReadableAddress());
1402 :
1403 51 : return HCCL_SUCCESS;
1404 : }
1405 :
1406 : HcclResult
1407 22 : NetworkManager::StartHostNetAndListen(const HcclIpAddress& ipAddr, SocketHandle& socketHandle, u32& port, bool rdmaFlag)
1408 : {
1409 22 : CHK_PRT_RET(
1410 : (hostNicInitRef_.Count() == 0),
1411 : HCCL_ERROR("[Start][HostNetAndListen]cannot start nic socket before host nic inited!"), HCCL_E_INTERNAL);
1412 22 : auto sockInfo = raResourceInfo_.hostNetSocketMap.find(ipAddr);
1413 22 : if (sockInfo == raResourceInfo_.hostNetSocketMap.end()) {
1414 2 : IpSocket tempSock;
1415 2 : raResourceInfo_.hostNetSocketMap.insert(std::make_pair(ipAddr, tempSock)); // 本IP占位
1416 2 : HCCL_INFO("device[%u] Start host nic insert Ip[%s]", devicePhyId_, ipAddr.GetReadableAddress());
1417 2 : }
1418 :
1419 : HcclResult ret;
1420 22 : IpSocket& sock = raResourceInfo_.hostNetSocketMap[ipAddr];
1421 22 : if (sock.nicSocketHandle == nullptr) {
1422 2 : ret = InitHostSocket(ipAddr, sock.nicSocketHandle);
1423 2 : CHK_PRT_RET(
1424 : ret != HCCL_SUCCESS,
1425 : HCCL_ERROR(
1426 : "[Start][HostNetAndListen]start host socket failed, devid[%u], ip[%s] return[%d]", devicePhyId_,
1427 : ipAddr.GetReadableAddress(), ret),
1428 : ret);
1429 : }
1430 22 : if (sock.nicRdmaHandle == nullptr && rdmaFlag) {
1431 0 : notifyType_ = EVENTID;
1432 0 : ret = InitRDMA(devicePhyId_, ipAddr, NETWORK_PEER_ONLINE, notifyType_, sock.nicRdmaHandle);
1433 0 : CHK_PRT_RET(
1434 : ret != HCCL_SUCCESS,
1435 : HCCL_ERROR(
1436 : "[Start][Nic]errNo[0x%016llx] ra nic init rdma failed, devid[%u], return[%d]",
1437 : HCCL_ERROR_CODE(HCCL_E_NETWORK), devicePhyId_, ret),
1438 : HCCL_E_NETWORK);
1439 : }
1440 22 : if (IPPortListenRefMapHost_[ipAddr][port].Count() == 0 && sock.listenedPort.find(port) == sock.listenedPort.end()) {
1441 21 : bool isAutoPort = port == 0;
1442 21 : HCCL_INFO("[Start][HostNetAndListen]trying to listen on ip[%s] port[%u].", ipAddr.GetReadableAddress(), port);
1443 21 : ret = StartListenSocket(sock.nicSocketHandle, port);
1444 21 : CHK_PRT_RET(
1445 : ret == HCCL_E_UNAVAIL,
1446 : HCCL_INFO(
1447 : "[Start][HostNetAndListen]Could not start listening socket for IP [%s] and port [%u].",
1448 : ipAddr.GetReadableAddress(), port),
1449 : ret);
1450 21 : CHK_PRT_RET(
1451 : ret != HCCL_SUCCESS,
1452 : HCCL_ERROR(
1453 : "[Start][HostNetAndListen]start host socket failed, devid[%u], ip[%s], port[%u], return[%d]",
1454 : devicePhyId_, ipAddr.GetReadableAddress(), port, ret),
1455 : ret);
1456 21 : sock.listenedPort.insert(port);
1457 21 : HCCL_RUN_INFO(
1458 : "[Start][HostNetAndListen]Listen on ip[%s], port[%u] success, "
1459 : "devPhyId[%u], devLogicId[%u], isAutoPort[%d]",
1460 : ipAddr.GetReadableAddress(), port, devicePhyId_, deviceLogicId_, isAutoPort);
1461 : }
1462 22 : int refCount = IPPortListenRefMapHost_[ipAddr][port].Ref();
1463 22 : HCCL_INFO("host ip[%s] port[%u] refcount is [%d]", ipAddr.GetReadableAddress(), port, refCount);
1464 :
1465 22 : socketHandle = sock.nicSocketHandle;
1466 22 : raResourceInfo_.nicSocketMap.insert(std::make_pair(ipAddr, sock));
1467 22 : hostNicSocketClientRef_[ipAddr].Ref();
1468 22 : HCCL_INFO("HostNet, ip[%s] port[%u] socket init OK", ipAddr.GetReadableAddress(), port);
1469 22 : return HCCL_SUCCESS;
1470 : }
1471 :
1472 45 : HcclResult NetworkManager::CheckSocketInfo(const SocketHandle socketHandle, const HcclIpAddress& ipAddr, u32 port) const
1473 : {
1474 45 : auto iterIP = raResourceInfo_.hostNetSocketMap.find(ipAddr);
1475 45 : CHK_PRT_RET(
1476 : (iterIP == raResourceInfo_.hostNetSocketMap.end()),
1477 : HCCL_ERROR(
1478 : "[Check][SocketInfo]ip[%s] port[%u] has not been started. ip is invalid.", ipAddr.GetReadableAddress(),
1479 : port),
1480 : HCCL_E_INTERNAL);
1481 :
1482 45 : CHK_PRT_RET(
1483 : (socketHandle != iterIP->second.nicSocketHandle),
1484 : HCCL_ERROR(
1485 : "[Check][SocketInfo]ip[%s] port[%u] has not been started. socketHandle is invalid",
1486 : ipAddr.GetReadableAddress(), port),
1487 : HCCL_E_INTERNAL);
1488 :
1489 45 : if (port != NO_LISTEN_PORT) {
1490 20 : CHK_PRT_RET(
1491 : (iterIP->second.listenedPort.count(port) == 0),
1492 : HCCL_ERROR(
1493 : "[Check][SocketInfo]ip[%s] port[%u] has not been started. port is invalid", ipAddr.GetReadableAddress(),
1494 : port),
1495 : HCCL_E_INTERNAL);
1496 : }
1497 45 : return HCCL_SUCCESS;
1498 : }
1499 :
1500 20 : HcclResult NetworkManager::StopHostNetAndListen(SocketHandle socketHandle, const HcclIpAddress& ipAddr, u32 port)
1501 : {
1502 20 : std::unique_lock<std::mutex> lock(raLock_);
1503 20 : CHK_PRT_RET(
1504 : (hostNicInitRef_.Count() == 0),
1505 : HCCL_ERROR("[Stop][HostNetAndListen]cannot start nic socket before host nic inited!"), HCCL_E_INTERNAL);
1506 :
1507 20 : CHK_RET(CheckSocketInfo(socketHandle, ipAddr, port));
1508 :
1509 20 : if (IPPortListenRefMapHost_[ipAddr][port].Unref() == 0) {
1510 20 : CHK_RET(StopListenSocket(socketHandle, port)); /* 当前只拉起一个server */
1511 :
1512 20 : HCCL_INFO("ip[%s] port[%u] stop success.", ipAddr.GetReadableAddress(), port);
1513 20 : raResourceInfo_.hostNetSocketMap[ipAddr].listenedPort.erase(port);
1514 20 : raResourceInfo_.nicSocketMap[ipAddr].listenedPort.erase(port);
1515 : } else {
1516 0 : HCCL_INFO(
1517 : "ip[%s] port[%u] skip stop. ref[%d].", ipAddr.GetReadableAddress(), port,
1518 : IPPortListenRefMapHost_[ipAddr][port].Count());
1519 : }
1520 :
1521 20 : if (hostNicSocketClientRef_[ipAddr].Unref() == 0
1522 20 : && raResourceInfo_.hostNetSocketMap[ipAddr].listenedPort.size() == 0) {
1523 0 : CHK_RET(hrtRaSocketDeInit(socketHandle));
1524 0 : raResourceInfo_.hostNetSocketMap.erase(ipAddr);
1525 0 : raResourceInfo_.nicSocketMap.erase(ipAddr);
1526 0 : HCCL_INFO("ip[%s] port[%u] deinit success.", ipAddr.GetReadableAddress(), port);
1527 : }
1528 :
1529 20 : return HCCL_SUCCESS;
1530 20 : }
1531 2 : HcclResult NetworkManager::StopAllHostNicSockets()
1532 : {
1533 : HcclResult ret;
1534 4 : for (auto itSocket : raResourceInfo_.hostNetSocketMap) {
1535 3 : for (auto itPort : itSocket.second.listenedPort) {
1536 1 : ret = (StopListenSocket(itSocket.second.nicSocketHandle, itPort));
1537 1 : if (ret != HCCL_SUCCESS) {
1538 1 : HCCL_ERROR(
1539 : "[Stop][StopAllHostNicSockets]errNo[0x%016llx] stop listen socket failed,"
1540 : "devid[%u], ip[%s], port[%u], return[%d].",
1541 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, itSocket.first.GetReadableAddress(), itPort,
1542 : ret);
1543 : } else {
1544 0 : HCCL_INFO("ip[%s] port[%u] stop success.", itSocket.first.GetReadableAddress(), itPort);
1545 : }
1546 : }
1547 2 : ret = hrtRaSocketDeInit(itSocket.second.nicSocketHandle);
1548 2 : if (ret != HCCL_SUCCESS) {
1549 1 : HCCL_ERROR(
1550 : "[Stop][StopAllHostNicSockets]errNo[0x%016llx] deinit socket failed, devid[%u], ip[%s], return[%d]",
1551 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), devicePhyId_, itSocket.first.GetReadableAddress(), ret);
1552 : } else {
1553 1 : HCCL_INFO("ip[%s] deinit success.", itSocket.first.GetReadableAddress());
1554 : }
1555 2 : hostNicSocketClientRef_[itSocket.first].Clear();
1556 2 : }
1557 :
1558 2 : raResourceInfo_.hostNetSocketMap.clear();
1559 2 : return HCCL_SUCCESS;
1560 : }
1561 : /* destroy network resource */
1562 1513 : HcclResult NetworkManager::Destroy()
1563 : {
1564 : /* 停止nic ra的监听 */
1565 1513 : if (raResourceInfo_.nicSocketMap.size() != 0) {
1566 7 : for (auto it : raResourceInfo_.nicSocketMap) {
1567 4 : HCCL_WARNING("nicSocketMap[%s] is not stopped when NetworkManager Destroy", it.first.GetReadableAddress());
1568 4 : }
1569 : // StartHostNetAndListen等函数中,同一地址在nicSocketMap和hostNetSocketMap内同时插入
1570 : // 此处StopAllDeviceNicSockets()销毁nicSocketMap后,StopAllHostNicSockets内会发生重复销毁导致core
1571 : // 为了避免此种情况,同时尽量减少对既有函数的修改扩散影响,此处同步对hostNetSocketMap进行清理
1572 : // 最终修改方案需要重构本类,解除两个MAP的耦合
1573 :
1574 7 : for (auto& it : raResourceInfo_.nicSocketMap) {
1575 4 : raResourceInfo_.hostNetSocketMap.erase(it.first); // key不存在则不会删除
1576 : }
1577 3 : StopAllDeviceNicSockets();
1578 : }
1579 :
1580 : /* 停止vnic ra的监听 */
1581 1513 : if (raResourceInfo_.vnicSocketMap.size() != 0) {
1582 5 : StopAllDeviceVnicSockets();
1583 : }
1584 :
1585 : /* 停止host nic ra的监听 */
1586 1513 : if (raResourceInfo_.hostNetSocketMap.size() != 0) {
1587 0 : for (auto it : raResourceInfo_.hostNetSocketMap) {
1588 0 : HCCL_WARNING("hostNicSocketMap[%s] is not stop when NetworkManager Destroy", it.first.GetReadableAddress());
1589 0 : }
1590 0 : StopAllHostNicSockets();
1591 : }
1592 :
1593 : /* 释放ra资源 重复RaInit时,不再调用内部DeInit */
1594 1513 : HCCL_DEBUG("Destroy call HrtRaDeInit.");
1595 1513 : if (deviceNicInitRef_.Count() != 0 && !isRaDeInit_) {
1596 5 : HCCL_WARNING("device Nic is not deinit when NetworkManager Destroy. ref[%d]", deviceNicInitRef_.Count());
1597 5 : struct RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, isEnableHdcAsync_};
1598 5 : GetDeviceRaInitConfig(config);
1599 5 : config.nicPosition = static_cast<u32>(NICDeployment::NIC_DEPLOYMENT_DEVICE);
1600 5 : if (HrtRaDeInit(&config) != HCCL_SUCCESS) {
1601 0 : HCCL_ERROR("ra deinit failed. para: nicdeploy[%u], phyId[%u]", config.nicPosition, config.phyId);
1602 : }
1603 :
1604 5 : isRaDeInit_ = true;
1605 5 : deviceNicInitRef_.Clear();
1606 : }
1607 1513 : if (hostNicInitRef_.Count() != 0) {
1608 6 : HCCL_WARNING("host Nic is not deinit when NetworkManager Destroy. ref[%d]", hostNicInitRef_.Count());
1609 6 : struct RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, isEnableHdcAsync_};
1610 6 : config.nicPosition = static_cast<u32>(NICDeployment::NIC_DEPLOYMENT_HOST);
1611 6 : config.phyId = devicePhyId_;
1612 6 : if (HrtRaDeInit(&config) != HCCL_SUCCESS) {
1613 1 : HCCL_ERROR("ra deinit failed. para: nicdeploy[%u], phyId[%u]", config.nicPosition, config.phyId);
1614 : }
1615 6 : hostNicInitRef_.Clear();
1616 : }
1617 1513 : HCCL_INFO("destroy all nic/vnic.");
1618 1513 : return HCCL_SUCCESS;
1619 : }
1620 :
1621 6 : HcclResult NetworkManager::StopNicsSocketListen(const HcclIpAddress& ipAddr, u32 port)
1622 : {
1623 6 : auto it = raResourceInfo_.nicSocketMap.find(ipAddr);
1624 6 : CHK_PRT_RET(
1625 : it == raResourceInfo_.nicSocketMap.end(),
1626 : HCCL_ERROR(
1627 : "[Stop][NicsSocketPort]ip[%s] port[%u] is not found in nicSocketMap.", ipAddr.GetReadableAddress(), port),
1628 : HCCL_E_INTERNAL);
1629 6 : IpSocket& ipSock = it->second;
1630 6 : bool portFound = false;
1631 13 : for (auto itPort : ipSock.listenedPort) {
1632 7 : if (itPort == port) {
1633 6 : portFound = true;
1634 : }
1635 : }
1636 6 : CHK_PRT_RET(
1637 : !portFound,
1638 : HCCL_ERROR("[Stop][NicsSocketPort]PORT(ip[%s] port[%u]) is not found.", ipAddr.GetReadableAddress(), port),
1639 : HCCL_E_INTERNAL);
1640 6 : if (ipSock.nicSocketHandle != nullptr && StopListenSocket(ipSock.nicSocketHandle, port)) {
1641 1 : HCCL_ERROR("[Stop][NicsSocketPort]NIC socket listen is not stopped successfully");
1642 1 : return HCCL_E_NETWORK;
1643 : }
1644 5 : return HCCL_SUCCESS;
1645 : }
1646 :
1647 40 : HcclResult NetworkManager::StopNicsSocket(const HcclIpAddress& ipAddr)
1648 : {
1649 40 : auto it = raResourceInfo_.nicSocketMap.find(ipAddr);
1650 40 : CHK_PRT_RET(
1651 : it == raResourceInfo_.nicSocketMap.end(),
1652 : HCCL_ERROR("[Stop][NicsSocket]ip[%s] is not found in nicSocketMap.", ipAddr.GetReadableAddress()),
1653 : HCCL_E_INTERNAL);
1654 40 : IpSocket& ipSock = it->second;
1655 40 : if (ipSock.nicRdmaHandle != nullptr && HrtRaRdmaDeInit(ipSock.nicRdmaHandle, notifyType_)) {
1656 2 : HCCL_ERROR("[Stop][NicsSocket]NIC rdev deInit not successfully, notifyType_[%d]", notifyType_);
1657 2 : return HCCL_E_NETWORK;
1658 : }
1659 38 : ipSock.nicRdmaHandle = nullptr;
1660 38 : if (ipSock.nicSocketHandle != nullptr && hrtRaSocketDeInit(ipSock.nicSocketHandle)) {
1661 1 : HCCL_ERROR("[Stop][NicsSocket]NIC socket deInit not successfully");
1662 1 : return HCCL_E_NETWORK;
1663 : }
1664 37 : ipSock.nicSocketHandle = nullptr;
1665 37 : return HCCL_SUCCESS;
1666 : }
1667 :
1668 : HcclResult
1669 0 : NetworkManager::InitRdmaHandle(u32 devId, const HcclIpAddress& ipAddr, bool disabledLiteThread, bool enable910ALite)
1670 : {
1671 0 : if (raResourceInfo_.nicSocketMap[ipAddr].nicRdmaHandle != nullptr
1672 0 : && raResourceInfo_.hostNetSocketMap[ipAddr].nicRdmaHandle != nullptr) {
1673 0 : HCCL_INFO("NetworkManager: RdmaInit already nic");
1674 0 : return HCCL_SUCCESS;
1675 : }
1676 :
1677 0 : u32 devicePhyId = ((static_cast<s32>(devId) == HOST_DEVICE_ID) ? 0 : devId);
1678 0 : RdmaHandle rdmaHandle = nullptr;
1679 : // 模式和notify类型按照是否为hdc模式进行赋值
1680 0 : NetworkMode initRdmaMode = (isHostUseDevNic_) ? NETWORK_OFFLINE : NETWORK_PEER_ONLINE;
1681 0 : NotifyTypeT notifyType = (isHostUseDevNic_) ? NotifyTypeT::NOTIFY : NotifyTypeT::NO_USE;
1682 : HcclResult ret
1683 0 : = InitRDMA(devicePhyId, ipAddr, initRdmaMode, notifyType, rdmaHandle, disabledLiteThread, enable910ALite);
1684 0 : CHK_PRT_RET(
1685 : ret != HCCL_SUCCESS,
1686 : HCCL_ERROR(
1687 : "[Init][RDMA]errNo[0x%016llx] ra rdma init failed, ip[%s], return[%d]", HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT),
1688 : ipAddr.GetReadableAddress(), ret),
1689 : HCCL_E_TCP_CONNECT);
1690 0 : HCCL_INFO("ip[%s] rdma init OK", ipAddr.GetReadableAddress());
1691 0 : CHK_PTR_NULL(rdmaHandle);
1692 0 : raResourceInfo_.nicSocketMap[ipAddr].nicRdmaHandle = rdmaHandle;
1693 0 : raResourceInfo_.hostNetSocketMap[ipAddr].nicRdmaHandle = rdmaHandle;
1694 0 : return HCCL_SUCCESS;
1695 : }
1696 :
1697 238 : HcclResult NetworkManager::GetRaResourceInfo(RaResourceInfo& raResourceInfo)
1698 : {
1699 238 : raResourceInfo = raResourceInfo_;
1700 238 : return HCCL_SUCCESS;
1701 : }
1702 :
1703 1 : HcclResult NetworkManager::PsWorkerRaInit(
1704 : u32 devId, const HcclIpAddress& ipAddr, u32 port, bool isHostUseDevNic, bool remoteIsHdc, bool isBoardVersion)
1705 : {
1706 1 : HCCL_INFO("PsWorkerRaInit, devicePhyId[%u], deviceLogicId_[%d]", devicePhyId_, deviceLogicId_);
1707 : // 引用计数
1708 1 : u32 devicePhyId = ((static_cast<s32>(devId) == HOST_DEVICE_ID) ? 0 : devId);
1709 1 : std::string ipAddrStr(ipAddr.GetReadableAddress());
1710 1 : if (ipAddrStr == "127.0.0.1") {
1711 0 : hostNicInitRef_.Ref();
1712 0 : HCCL_INFO("hostNicInitRef_[%d]", hostNicInitRef_.Count());
1713 : } else {
1714 1 : bool fistUsed{false};
1715 1 : deviceNicInitRef_.Ref();
1716 1 : CHK_RET(hrtRaIsFirstUsed(devicePhyId, fistUsed));
1717 1 : HCCL_INFO(
1718 : "deviceNicInitRef_[%d] fistUsed[%u] devicePhyId[%u]", deviceNicInitRef_.Count(), fistUsed, devicePhyId);
1719 1 : if (deviceNicInitRef_.Count() == 1 && !fistUsed) {
1720 0 : isRaInitRepeated_ = true;
1721 1 : } else if (!fistUsed) {
1722 0 : HCCL_INFO("[NetworkManager] PsWorkerRa is not fistUsed");
1723 0 : return HCCL_SUCCESS;
1724 : }
1725 : }
1726 :
1727 1 : CHK_PRT_RET(
1728 : (raResourceInfo_.nicSocketMap.count(ipAddr) != 0),
1729 : HCCL_INFO("NetworkManager: PsWorkerRa already Init, ipAddr[%s]", ipAddr.GetReadableAddress()), HCCL_SUCCESS);
1730 1 : isHostUseDevNic_ = isHostUseDevNic;
1731 :
1732 : // hdc模式下需要先拉起device上的hccp进程
1733 1 : if (isHostUseDevNic_) {
1734 : // 拉起device进程
1735 0 : if (devId != INVALID_UINT) {
1736 0 : devicePhyId_ = devId;
1737 : } else {
1738 : // 初始化ra资源(dev信息带入逻辑ID)
1739 0 : CHK_RET(hrtGetDevice(&deviceLogicId_));
1740 0 : CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(deviceLogicId_), devicePhyId_));
1741 : }
1742 :
1743 : // device 网卡初始化前需要拉起 hccp .
1744 : rtNetServiceOpenArgs openArgs;
1745 0 : rtProcExtParam extParam{};
1746 0 : std::string extPam("--hdcType=" + std::to_string(PID_HDC_TYPE));
1747 :
1748 0 : extParam.paramInfo = extPam.c_str();
1749 0 : extParam.paramLen = extPam.size();
1750 0 : openArgs.extParamList = &extParam;
1751 0 : openArgs.extParamCnt = 1UL;
1752 0 : isTsdProcessOpen_ = true;
1753 0 : CHK_RET(hrtOpenNetService(&openArgs));
1754 0 : HCCL_INFO(
1755 : "NetworkManager open tsd success, devicePhyId[%u], deviceLogicId_[%d], subPid[%lld]", devicePhyId_,
1756 : deviceLogicId_, static_cast<s64>(subPid_));
1757 0 : }
1758 :
1759 1 : bool isOpenWhiteList = false;
1760 1 : if (!isBoardVersion && remoteIsHdc && IsGeneralServer()) {
1761 0 : HCCL_INFO("general server, ps open WhiteList");
1762 0 : isOpenWhiteList = true;
1763 : }
1764 :
1765 1 : CHK_RET(hrtRaSocketSetWhiteListStatus(static_cast<u32>(isOpenWhiteList)));
1766 :
1767 1 : RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, false};
1768 1 : config.phyId = devicePhyId;
1769 1 : if (ipAddrStr == "127.0.0.1") {
1770 0 : config.nicPosition = static_cast<u32>(NICDeployment::NIC_DEPLOYMENT_HOST);
1771 : } else {
1772 1 : config.nicPosition = static_cast<u32>(isHostUseDevNic_);
1773 : }
1774 1 : if (isHostUseDevNic_) {
1775 0 : config.hdcType = PID_HDC_TYPE;
1776 : }
1777 :
1778 1 : if (!isRaInitRepeated_) {
1779 1 : HCCL_INFO(
1780 : "PsWorkerRaInit call HrtRaInit. devicePhyId[%u] isRaInitRepeated_[%u]", devicePhyId_, isRaInitRepeated_);
1781 1 : HcclResult hcclRet = HrtRaInit(&config);
1782 1 : if (hcclRet != HCCL_SUCCESS) {
1783 0 : HCCL_ERROR("[PsWorkerRaInit] ra init failed, ret[%d].", hcclRet);
1784 0 : if (isTsdProcessOpen_) {
1785 0 : (void)hrtCloseNetService();
1786 0 : isTsdProcessOpen_ = false;
1787 : }
1788 0 : return hcclRet;
1789 : }
1790 : }
1791 :
1792 1 : struct rdev nicRdevInfo = {};
1793 1 : nicRdevInfo.phyId = devicePhyId;
1794 1 : nicRdevInfo.family = ipAddr.GetFamily();
1795 1 : nicRdevInfo.localIp.addr = ipAddr.GetBinaryAddress().addr;
1796 1 : nicRdevInfo.localIp.addr6 = ipAddr.GetBinaryAddress().addr6;
1797 1 : SocketHandle socketHandle = nullptr;
1798 1 : NetworkMode raSocketInitMode = (isHostUseDevNic_) ? NETWORK_OFFLINE : NETWORK_PEER_ONLINE;
1799 1 : HcclResult ret = hrtRaSocketInit(raSocketInitMode, nicRdevInfo, socketHandle);
1800 1 : if (ret != HCCL_SUCCESS) {
1801 1 : HCCL_ERROR(
1802 : "[Init][HostSocket]errNo[0x%016llx] ra socket init failed, ip[%s], return[%d]",
1803 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), ipAddr.GetReadableAddress(), ret);
1804 1 : if (!isRaInitRepeated_) {
1805 1 : (void)HrtRaDeInit(&config);
1806 : }
1807 1 : if (isTsdProcessOpen_) {
1808 0 : (void)hrtCloseNetService();
1809 0 : isTsdProcessOpen_ = false;
1810 : }
1811 1 : return HCCL_E_TCP_CONNECT;
1812 : }
1813 0 : HCCL_INFO(
1814 : "ip[%s] socket init OK, devicePhyId_[%u], socketHandle[%llu]", ipAddr.GetReadableAddress(), devicePhyId_,
1815 : hash<void*>{}(socketHandle));
1816 :
1817 0 : IpSocket ipSocketInfo;
1818 0 : ipSocketInfo.nicSocketHandle = socketHandle;
1819 :
1820 0 : raResourceInfo_.nicSocketMap.insert(std::make_pair(ipAddr, ipSocketInfo));
1821 0 : raResourceInfo_.hostNetSocketMap.insert(std::make_pair(ipAddr, ipSocketInfo));
1822 :
1823 0 : ret = HeterogStartListen(ipAddr, port);
1824 0 : if (ret != HCCL_SUCCESS) {
1825 0 : HCCL_ERROR("[PsWorkerRaInit] HeterogStartListen failed, ret[%d]", ret);
1826 0 : (void)hrtRaSocketDeInit(socketHandle);
1827 0 : raResourceInfo_.nicSocketMap.erase(ipAddr);
1828 0 : raResourceInfo_.hostNetSocketMap.erase(ipAddr);
1829 0 : if (!isRaInitRepeated_) {
1830 0 : (void)HrtRaDeInit(&config);
1831 : }
1832 0 : if (isTsdProcessOpen_) {
1833 0 : (void)hrtCloseNetService();
1834 0 : isTsdProcessOpen_ = false;
1835 : }
1836 0 : return ret;
1837 : }
1838 :
1839 0 : return HCCL_SUCCESS;
1840 1 : }
1841 :
1842 : // 最后一次ra_deinit时才关闭device的hccp进程。ES场景主要使用
1843 0 : HcclResult NetworkManager::CloseHccpSubProc()
1844 : {
1845 0 : if (!isHostUseDevNic_ || subPid_ == 0) {
1846 0 : HCCL_INFO("No need to close hccp sub proc, devicePhyId[%u], subPid[%lld]", devicePhyId_, subPid_);
1847 0 : return HCCL_SUCCESS;
1848 : }
1849 0 : HCCL_INFO(
1850 : "NetworkManager ProcessCloseSubProcList HDC devicePhyId[%u], deviceLogicId_[%d], subPid[%lld]", devicePhyId_,
1851 : deviceLogicId_, static_cast<s64>(subPid_));
1852 0 : s32 locaLogDevid = 0;
1853 0 : hrtGetDevice(&locaLogDevid);
1854 0 : if (locaLogDevid != deviceLogicId_) {
1855 0 : hrtSetDevice(deviceLogicId_);
1856 : }
1857 0 : HcclResult ret = hrtCloseNetService();
1858 0 : if (locaLogDevid != deviceLogicId_) {
1859 0 : hrtSetDevice(locaLogDevid);
1860 : }
1861 0 : CHK_RET(ret);
1862 0 : subPid_ = 0;
1863 :
1864 0 : return HCCL_SUCCESS;
1865 : }
1866 :
1867 16 : HcclResult NetworkManager::PingMeshRaPingInit(u32 devLogicId, u32 devPhyId, RaInitConfig* config)
1868 : {
1869 : // 引用计数
1870 16 : deviceLogicId_ = static_cast<s32>(devLogicId);
1871 16 : devicePhyId_ = ((static_cast<s32>(devPhyId) == HOST_DEVICE_ID) ? 0 : devPhyId);
1872 16 : isHostUseDevNic_ = true;
1873 16 : isRaInitRepeated_ = false;
1874 :
1875 : // hccp侧初始化ping mesh资源
1876 16 : CHK_RET(HrtRaInit(config));
1877 16 : HCCL_INFO(
1878 : "[HCCN][PingMeshRaPingInit]Device[%u] config.hdcType[%d], config.nicPosition[%u], config.phyId[%u].",
1879 : deviceLogicId_, config->hdcType, config->nicPosition, config->phyId);
1880 16 : deviceNicInitRef_.Ref();
1881 :
1882 16 : return HCCL_SUCCESS;
1883 : }
1884 :
1885 15 : HcclResult NetworkManager::PingMeshRaPingDeinit()
1886 : {
1887 : // 引用计数
1888 15 : isRaInitRepeated_ = false;
1889 :
1890 15 : struct RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, false};
1891 15 : GetDeviceRaInitConfig(config);
1892 15 : CHK_RET(HrtRaDeInit(&config));
1893 15 : deviceNicInitRef_.Unref();
1894 :
1895 15 : return HCCL_SUCCESS;
1896 : }
1897 :
1898 20 : void NetworkManager::GetDeviceRaInitConfig(RaInitConfig& config)
1899 : {
1900 20 : u32 devicePhyId = ((static_cast<s32>(devicePhyId_) == HOST_DEVICE_ID) ? 0 : devicePhyId_);
1901 20 : HCCL_INFO("RaDeinit devicePhyId_[%u] devicePhyId[%u]", devicePhyId_, devicePhyId);
1902 :
1903 20 : config.phyId = devicePhyId;
1904 20 : config.nicPosition = static_cast<u32>(isHostUseDevNic_);
1905 :
1906 20 : if (isHostUseDevNic_) {
1907 16 : config.hdcType = PID_HDC_TYPE;
1908 : }
1909 20 : }
1910 :
1911 0 : HcclResult NetworkManager::PsWorkerRaDeinit(u32 devId, const HcclIpAddress& ipAddr, u32 port)
1912 : {
1913 0 : string ipAddrStr(ipAddr.GetReadableAddress());
1914 0 : u32 devicePhyId = ((static_cast<s32>(devicePhyId_) == HOST_DEVICE_ID) ? 0 : devicePhyId_);
1915 0 : if (ipAddrStr == "127.0.0.1") {
1916 0 : hostNicInitRef_.Unref();
1917 0 : HCCL_INFO("hostNicInitRef_[%d]", hostNicInitRef_.Count());
1918 : } else {
1919 0 : bool lastUsed{false};
1920 0 : deviceNicInitRef_.Unref();
1921 0 : CHK_RET(hrtRaIsLastUsed(devicePhyId, lastUsed));
1922 0 : HCCL_INFO(
1923 : "deviceNicInitRef_[%d] lastUsed[%u] devicePhyId[%u]", deviceNicInitRef_.Count(), lastUsed, devicePhyId);
1924 0 : if (deviceNicInitRef_.Count() == 0 && !lastUsed) {
1925 0 : isRaInitRepeated_ = true;
1926 0 : } else if (lastUsed) {
1927 0 : isRaInitRepeated_ = false;
1928 0 : } else if (deviceNicInitRef_.Count() > 0) {
1929 0 : HCCL_INFO("[NetworkManager] PsWorkerRa is not lastUsed");
1930 0 : return HCCL_SUCCESS;
1931 : }
1932 : }
1933 0 : CHK_PRT_RET(
1934 : (raResourceInfo_.nicSocketMap.count(ipAddr) == 0),
1935 : HCCL_INFO("NetworkManager: PsWorkerRa already Deinit, ipAddr[%s]", ipAddr.GetReadableAddress()), HCCL_SUCCESS);
1936 :
1937 0 : HCCL_INFO("PsWorkerRaDeinit devId[%u], isRaInitRepeated[%d]", devId, isRaInitRepeated_);
1938 : // 重复RaInit时,不再调用内部DeInit
1939 0 : if (!isRaInitRepeated_) {
1940 0 : CHK_RET(HeterogStopListen(ipAddr, port, true));
1941 : }
1942 :
1943 0 : SocketHandle nicRdmaHandle = raResourceInfo_.nicSocketMap[ipAddr].nicRdmaHandle;
1944 0 : if (!GetExternalInputHcclIsTcpMode() && nicRdmaHandle != nullptr && !isRaInitRepeated_) {
1945 : // Helper的PS临时暂不调用 CHK_RET(HrtRaRdmaDeInit(nicRdmaHandle, (isHostUseDevNic_) ?
1946 : // NotifyTypeT::NOTIFY : NotifyTypeT::NO_USE));
1947 0 : HCCL_INFO("Not call RaRdmaDeInit devicePhyId[%u]", devicePhyId_);
1948 : }
1949 :
1950 0 : struct RaInitConfig config = {DEFAULT_INIT_PHY_ID, DEFAULT_INIT_NIC_POS, DEFAULT_HDC_TYPE, false};
1951 0 : GetDeviceRaInitConfig(config);
1952 :
1953 0 : if (ipAddrStr == "127.0.0.1") {
1954 0 : if (hostNicInitRef_.Count() == 0) {
1955 0 : HCCL_INFO("PsWorkerRaDeinit call hrtRaDeInit. devicePhyId[%u]", devicePhyId_);
1956 0 : config.nicPosition = static_cast<u32>(NICDeployment::NIC_DEPLOYMENT_HOST);
1957 0 : CHK_RET(HrtRaDeInit(&config));
1958 : }
1959 : } else {
1960 0 : if (deviceNicInitRef_.Count() == 0) {
1961 0 : HCCL_INFO("PsWorkerRaDeinit call HrtRaDeInit. devicePhyId[%u]", devicePhyId_);
1962 0 : if (!isRaInitRepeated_) {
1963 0 : CHK_RET(HrtRaDeInit(&config));
1964 0 : CHK_RET(CloseHccpSubProc());
1965 : }
1966 : }
1967 : }
1968 :
1969 0 : raResourceInfo_.nicSocketMap.erase(raResourceInfo_.nicSocketMap.find(ipAddr));
1970 0 : raResourceInfo_.hostNetSocketMap.erase(raResourceInfo_.hostNetSocketMap.find(ipAddr));
1971 :
1972 0 : return HCCL_SUCCESS;
1973 0 : }
1974 :
1975 22 : HcclResult NetworkManager::InitHostSocket(const HcclIpAddress& addr, SocketHandle& socketHandle) const
1976 : {
1977 22 : struct SocketInitInfoT socketInitInfo = {};
1978 22 : socketInitInfo.rdevInfo.family = addr.GetFamily();
1979 22 : socketInitInfo.rdevInfo.phyId = devicePhyId_;
1980 22 : socketInitInfo.rdevInfo.localIp.addr = addr.GetBinaryAddress().addr;
1981 22 : socketInitInfo.rdevInfo.localIp.addr6 = addr.GetBinaryAddress().addr6;
1982 22 : socketInitInfo.scopeId = addr.GetScopeID();
1983 22 : HcclResult ret = hrtRaSocketInitV1(NETWORK_PEER_ONLINE, socketInitInfo, socketHandle);
1984 22 : CHK_PRT_RET(
1985 : ret != HCCL_SUCCESS,
1986 : HCCL_ERROR(
1987 : "[Init][HostSocket]errNo[0x%016llx] ra socket init v1 failed, ip[%s], return[%d]",
1988 : HCCL_ERROR_CODE(HCCL_E_TCP_CONNECT), addr.GetReadableAddress(), ret),
1989 : HCCL_E_TCP_CONNECT);
1990 22 : HCCL_INFO("ip[%s] socket init OK", addr.GetReadableAddress());
1991 22 : return HCCL_SUCCESS;
1992 : }
1993 :
1994 25 : HcclResult NetworkManager::StopHostNet(SocketHandle socketHandle, const HcclIpAddress& ipAddr)
1995 : {
1996 25 : std::unique_lock<std::mutex> lock(raLock_);
1997 25 : CHK_PRT_RET(
1998 : (hostNicInitRef_.Count() == 0), HCCL_ERROR("[Stop][HostNet]cannot start nic socket before host nic inited!"),
1999 : HCCL_E_INTERNAL);
2000 :
2001 25 : CHK_RET(CheckSocketInfo(socketHandle, ipAddr));
2002 :
2003 25 : if (hostNicSocketClientRef_[ipAddr].Unref() == 0
2004 25 : && raResourceInfo_.hostNetSocketMap[ipAddr].listenedPort.size() == 0) {
2005 20 : CHK_RET(hrtRaSocketDeInit(socketHandle));
2006 20 : HCCL_INFO("ip[%s] deinit success.", ipAddr.GetReadableAddress());
2007 :
2008 20 : raResourceInfo_.hostNetSocketMap.erase(ipAddr);
2009 20 : raResourceInfo_.nicSocketMap.erase(ipAddr);
2010 : }
2011 25 : return HCCL_SUCCESS;
2012 25 : }
2013 :
2014 : // 从ip查handle 把ip下所有的listen全stop
2015 0 : HcclResult NetworkManager::StopHostSocketHandle(const HcclIpAddress& ipAddr)
2016 : {
2017 0 : std::unique_lock<std::mutex> lock(raLock_);
2018 0 : CHK_PRT_RET(
2019 : (hostNicInitRef_.Count() == 0),
2020 : HCCL_ERROR("[NetworkManager][StopHostSocketHandle]cannot start nic socket before host nic inited!"),
2021 : HCCL_E_INTERNAL);
2022 :
2023 0 : auto sockInfo = raResourceInfo_.hostNetSocketMap.find(ipAddr);
2024 0 : auto ipIt = IPPortListenRefMapHost_.find(ipAddr);
2025 0 : CHK_PRT_RET(
2026 : (sockInfo == raResourceInfo_.hostNetSocketMap.end()),
2027 : HCCL_ERROR("[NetworkManager][StopHostSocketHandle]ipAddr is invalid"), HCCL_E_INTERNAL);
2028 0 : IpSocket& sock = raResourceInfo_.hostNetSocketMap[ipAddr];
2029 0 : CHK_RET(CheckSocketInfo(sock.nicSocketHandle, ipAddr));
2030 :
2031 : // 停止所有的listen
2032 0 : if (ipIt != IPPortListenRefMapHost_.end()) {
2033 0 : for (auto& portIt : ipIt->second) {
2034 0 : u32 port = portIt.first;
2035 0 : if (IPPortListenRefMapHost_[ipAddr][port].Count() > 0) {
2036 0 : CHK_RET(StopListenSocket(sock.nicSocketHandle, port));
2037 0 : HCCL_WARNING(
2038 : "[NetworkManager][StopHostSocketHandle] ip [%s] stop listen port [%u]", ipAddr.GetReadableAddress(),
2039 : port);
2040 0 : raResourceInfo_.hostNetSocketMap[ipAddr].listenedPort.erase(port);
2041 0 : IPPortListenRefMapHost_[ipAddr][port].Clear(); // 引用计数归0
2042 : }
2043 : }
2044 : }
2045 0 : CHK_PRT_RET(
2046 : (raResourceInfo_.hostNetSocketMap[ipAddr].listenedPort.size() != 0),
2047 : HCCL_ERROR(
2048 : "[NetworkManager][StopHostSocketHandle]IPPortListenRefMapHost_[%s] is unequal to "
2049 : "hostNetSocketMap[%s].listenedPort",
2050 : ipAddr.GetReadableAddress(), ipAddr.GetReadableAddress()),
2051 : HCCL_E_INTERNAL);
2052 : // 删除socket 删除IP
2053 0 : CHK_RET(hrtRaSocketDeInit(sock.nicSocketHandle));
2054 0 : HCCL_INFO("[NetworkManager][StopHostSocketHandle] ip [%s] deinit success.", ipAddr.GetReadableAddress());
2055 0 : sock.nicSocketHandle = nullptr;
2056 : // 没有host和rdma时 删除ip
2057 0 : if (sock.nicSocketHandle == nullptr && sock.nicRdmaHandle == nullptr) {
2058 0 : raResourceInfo_.hostNetSocketMap.erase(ipAddr);
2059 : }
2060 0 : hostNicSocketClientRef_[ipAddr].Clear();
2061 0 : return HCCL_SUCCESS;
2062 0 : }
2063 :
2064 25 : HcclResult NetworkManager::StartHostNet(const HcclIpAddress& ipAddr, SocketHandle& socketHandle)
2065 : {
2066 25 : CHK_RET(CreateHostSocketHandle(ipAddr, socketHandle));
2067 25 : return HCCL_SUCCESS;
2068 : }
2069 :
2070 25 : HcclResult NetworkManager::CreateHostSocketHandle(const HcclIpAddress& ipAddr, SocketHandle& socketHandle)
2071 : {
2072 25 : CHK_PRT_RET(
2073 : (hostNicInitRef_.Count() == 0),
2074 : HCCL_ERROR("[CreateHostSocketHandle]cannot start nic socket before host nic inited!"), HCCL_E_INTERNAL);
2075 25 : OccupyIp(ipAddr, raResourceInfo_.hostNetSocketMap);
2076 25 : IpSocket& sock = raResourceInfo_.hostNetSocketMap[ipAddr];
2077 25 : if (sock.nicSocketHandle == nullptr) {
2078 20 : CHK_RET(InitHostSocket(ipAddr, sock.nicSocketHandle));
2079 : }
2080 :
2081 25 : socketHandle = sock.nicSocketHandle;
2082 25 : HCCL_INFO("ip[%s] socket start success socketHandle[%p]", ipAddr.GetReadableAddress(), socketHandle);
2083 25 : hostNicSocketClientRef_[ipAddr].Ref(); // 引用计数
2084 25 : return HCCL_SUCCESS;
2085 : }
2086 :
2087 41 : HcclResult NetworkManager::StartListenSocket(const SocketHandle socketHandle, u32& port) const
2088 : {
2089 41 : struct SocketListenInfoT serverInfo = {};
2090 41 : serverInfo.socketHandle = const_cast<SocketHandle>(socketHandle);
2091 41 : serverInfo.port = port;
2092 41 : if (isRaInitRepeated_) {
2093 0 : return HCCL_SUCCESS;
2094 : }
2095 41 : bool isAutoPort = port == AUTO_LISTEN_PORT;
2096 41 : HcclResult ret = hrtRaSocketListenStart(&serverInfo, 1);
2097 41 : CHK_PRT_RET(
2098 : ret == HCCL_E_UNAVAIL,
2099 : HCCL_INFO(
2100 : "socket port[%u] has already been bound. Could not start listening host nic. please use an idle port.",
2101 : port),
2102 : ret);
2103 41 : RPT_CALL_ERR(ret != HCCL_SUCCESS, "host nic listen start failed, port[%u], return[%d]", port, ret);
2104 41 : CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("host nic listen start failed, port[%u], return[%d]", port, ret), ret);
2105 41 : if (isAutoPort) {
2106 0 : port = serverInfo.port;
2107 0 : CHK_PRT_RET(
2108 : port == AUTO_LISTEN_PORT, HCCL_ERROR("start listen on a port selected by os automatically failed"),
2109 : HCCL_E_NOT_SUPPORT);
2110 0 : HCCL_RUN_INFO("start listen on port[%u] by auto success.", port);
2111 : }
2112 41 : return HCCL_SUCCESS;
2113 : }
2114 :
2115 39 : HcclResult NetworkManager::StopListenSocket(const SocketHandle socketHandle, u32 port) const
2116 : {
2117 : struct SocketListenInfoT serverInfo;
2118 39 : serverInfo.socketHandle = const_cast<SocketHandle>(socketHandle);
2119 39 : serverInfo.port = port;
2120 39 : HcclResult ret = hrtRaSocketListenStop(&serverInfo, 1);
2121 39 : RPT_CALL_ERR(ret != HCCL_SUCCESS, "socket listen stop failed, port[%u], return[%d]", port, ret);
2122 39 : CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("socket listen stop failed, port[%u], return[%d]", port, ret), ret);
2123 39 : return HCCL_SUCCESS;
2124 : }
2125 :
2126 32 : HcclResult NetworkManager::GetRdmaHandleByIpAddr(const HcclIpAddress& ipAddr, RdmaHandle& rdmaHandle)
2127 : {
2128 32 : auto it = raResourceInfo_.nicSocketMap.find(ipAddr);
2129 32 : CHK_PRT_RET(
2130 : it == raResourceInfo_.nicSocketMap.end(),
2131 : HCCL_ERROR("GetRdmaHandleByIpAddr ip[%s] is not found in nicSocketMap.", ipAddr.GetReadableAddress()),
2132 : HCCL_E_INTERNAL);
2133 32 : rdmaHandle = raResourceInfo_.nicSocketMap[ipAddr].nicRdmaHandle;
2134 32 : CHK_PTR_NULL(rdmaHandle);
2135 32 : return HCCL_SUCCESS;
2136 : }
2137 :
2138 0 : HcclResult NetworkManager::GetNicHandleByIpAddr(const HcclIpAddress& ipAddr, SocketHandle& nicHandle)
2139 : {
2140 0 : auto it = raResourceInfo_.nicSocketMap.find(ipAddr);
2141 0 : CHK_PRT_RET(
2142 : it == raResourceInfo_.nicSocketMap.end(),
2143 : HCCL_ERROR("GetNicHandleByIpAddr ip[%s] is not found in nicSocketMap.", ipAddr.GetReadableAddress()),
2144 : HCCL_E_INTERNAL);
2145 0 : nicHandle = raResourceInfo_.nicSocketMap[ipAddr].nicSocketHandle;
2146 0 : CHK_PTR_NULL(nicHandle);
2147 0 : return HCCL_SUCCESS;
2148 : }
2149 :
2150 21 : HcclResult NetworkManager::CheckAutoListenVersion(bool isAutoPort)
2151 : {
2152 21 : if (isAutoPort) {
2153 1 : u32 listenStartVersion = 0;
2154 1 : HcclResult vRet = hrtRaGetInterfaceVersion(devicePhyId_, SOCKET_LISTEN_AUTO_INTERFACE, &listenStartVersion);
2155 1 : HCCL_INFO("[CheckAutoListenVersion] listen start version[%u].", listenStartVersion);
2156 1 : CHK_PRT_RET(
2157 : vRet != HCCL_SUCCESS || listenStartVersion < SOCKET_LISTEN_AUTO_INTERFACE_VERSION,
2158 : HCCL_ERROR(
2159 : "this package does not support hrtRaSocketNonBlockListenStart to "
2160 : "listen automatically with port %u, please change new package.",
2161 : AUTO_LISTEN_PORT),
2162 : HCCL_E_NOT_SUPPORT);
2163 : }
2164 20 : return HCCL_SUCCESS;
2165 : }
2166 :
2167 : // 新旧ip类型转换
2168 0 : HcclResult NetworkManager::HcclIpAddressConvertHcclAddr(HcclAddress* hccladdr, HcclIpAddress* hcclIP)
2169 : {
2170 0 : CHK_PTR_NULL(hcclIP);
2171 0 : CHK_PTR_NULL(hccladdr);
2172 0 : if (hcclIP->GetFamily() == AF_INET) {
2173 0 : hccladdr->type = HCCL_ADDR_TYPE_IP_V4;
2174 0 : hccladdr->addr = hcclIP->GetBinaryAddress().addr;
2175 0 : } else if (hcclIP->GetFamily() == AF_INET6) {
2176 0 : hccladdr->type = HCCL_ADDR_TYPE_IP_V6;
2177 0 : hccladdr->addr6 = hcclIP->GetBinaryAddress().addr6;
2178 : } else {
2179 0 : HCCL_ERROR("[HcclIpAddressConvertingHcclAddr]ERROR IP type!");
2180 0 : return HCCL_E_PARA;
2181 : }
2182 0 : return HCCL_SUCCESS;
2183 : }
2184 :
2185 25 : HcclResult NetworkManager::OccupyIp(const HcclIpAddress& ipAddr, std::map<hccl::HcclIpAddress, IpSocket>& socketMap)
2186 : {
2187 25 : auto sockInfo = socketMap.find(ipAddr);
2188 25 : if (sockInfo == socketMap.end()) {
2189 20 : IpSocket tempSock;
2190 20 : socketMap.insert(std::make_pair(ipAddr, tempSock)); // 本IP占位
2191 20 : HCCL_INFO("[NetworkManager][OccupyIp] device[%u] insert ip[%s]", devicePhyId_, ipAddr.GetReadableAddress());
2192 20 : } else {
2193 5 : HCCL_INFO(
2194 : "[NetworkManager][OccupyIp] device[%u] ip[%s] has already occupied.", devicePhyId_,
2195 : ipAddr.GetReadableAddress());
2196 : }
2197 25 : return HCCL_SUCCESS;
2198 : }
2199 : } // namespace hccl
|