Line data Source code
1 : /**
2 : * Copyright (c) 2025 Huawei Technologies Co., Ltd.
3 : * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4 : * CANN Open Software License Agreement Version 2.0 (the "License").
5 : * Please refer to the License for details. You may not use this file except in compliance with the License.
6 : * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7 : * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8 : * See LICENSE in the root of the software repository for the full text of the License.
9 : */
10 : #include "hccl_network.h"
11 : #include <sys/socket.h>
12 : #include "hccl/base.h"
13 : #include "log.h"
14 : #include "adapter_rts_common.h"
15 : #include "dlra_function.h"
16 : #include "network_manager_pub.h"
17 : #include "dlhal_function.h"
18 : #include "adapter_hccp_common.h"
19 : #include "hccl_net_dev_v1.h"
20 :
21 : using namespace std;
22 :
23 0 : HcclResult HcclNetDevOpenV1(const HcclNetDevInfos* info, HcclNetDev* netDev)
24 : {
25 0 : CHK_PTR_NULL(netDev);
26 0 : CHK_PTR_NULL(info);
27 : static bool flag = false;
28 0 : if (UNLIKELY(flag == false)) {
29 0 : CHK_RET(hccl::DlHalFunction::GetInstance().DlHalFunctionInit());
30 0 : CHK_RET(hccl::DlRaFunction::GetInstance().DlRaFunctionInit());
31 : }
32 : // 拉起进程 对比HcclNetInit
33 : u32 deviceLogicId;
34 0 : bool hasBackup = info->isBackup; // 从外部判断是否有备份
35 0 : CHK_RET(hrtGetDeviceIndexByPhyId(info->devicePhyId, deviceLogicId));
36 0 : switch (info->netdevDeployment) {
37 0 : case HCCL_NETDEV_DEPLOYMENT_HOST: {
38 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId)
39 : .InitV2(NICDeployment::NIC_DEPLOYMENT_HOST, hasBackup, info->devicePhyId));
40 0 : break;
41 : }
42 0 : case HCCL_NETDEV_DEPLOYMENT_DEVICE: {
43 : bool isHostUseDevNic;
44 0 : CHK_RET(IsHostUseDevNic(isHostUseDevNic));
45 0 : u32 tempDevicePhyId = hasBackup ? static_cast<u32>(info->devicePhyId) : hccl::DEFAULT_PHY_ID;
46 0 : HCCL_DEBUG(
47 : "[%s]start HcclNetDevOpen, deviceLogicId[%u], devicePhyId[%u], nicDeploy[%d], hasBackup[%d],"
48 : " tempDevicePhyId[%u]",
49 : __func__, deviceLogicId, info->devicePhyId, info->netdevDeployment, hasBackup, tempDevicePhyId);
50 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId)
51 : .InitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, hasBackup, tempDevicePhyId, isHostUseDevNic));
52 0 : break;
53 : }
54 0 : default: {
55 0 : HCCL_ERROR("[HcclNetDevOpen]No Such HcclNetDevDeployment: %d", info->netdevDeployment);
56 0 : *netDev = nullptr;
57 0 : return HCCL_E_NOT_SUPPORT;
58 : }
59 : }
60 : // 实现设备
61 :
62 0 : hccl::NetDevContext* pNetDevCtx = new (std::nothrow) hccl::NetDevContext();
63 0 : CHK_PTR_NULL(pNetDevCtx);
64 :
65 0 : HcclResult ret = pNetDevCtx->InitV2(info);
66 0 : if (ret != HCCL_SUCCESS) {
67 0 : HCCL_ERROR("[HcclNetDevOpen][InitV2]Init fail. ret[%u]", ret);
68 0 : delete pNetDevCtx;
69 0 : pNetDevCtx = nullptr;
70 0 : *netDev = nullptr;
71 0 : return ret;
72 : }
73 :
74 0 : *netDev = pNetDevCtx;
75 0 : return HCCL_SUCCESS;
76 : }
77 :
78 0 : HcclResult HcclNetDevCloseV1(HcclNetDev netDev)
79 : {
80 : // 先销毁设备
81 0 : CHK_PTR_NULL(netDev);
82 :
83 0 : hccl::NetDevContext* pNetDevCtx = static_cast<hccl::NetDevContext*>(netDev);
84 0 : bool isBackup = pNetDevCtx->GetIsBackup();
85 0 : HcclResult ret = pNetDevCtx->DeinitV2();
86 0 : if (ret != HCCL_SUCCESS) {
87 0 : HCCL_ERROR("[HcclNetDevClose] NetDev Close fail. ret[%u]", ret);
88 : }
89 :
90 : // 再销毁进程
91 0 : switch (pNetDevCtx->GetNetDevDeployment()) {
92 0 : case HCCL_NETDEV_DEPLOYMENT_HOST: {
93 0 : HcclResult ret_temp = hccl::NetworkManager::GetInstance(pNetDevCtx->GetLogicId())
94 0 : .DeInitV2(NICDeployment::NIC_DEPLOYMENT_HOST, isBackup, false);
95 0 : if (ret_temp != HCCL_SUCCESS) {
96 0 : HCCL_ERROR("[HcclNetDevClose] DEPLOYMENT_HOST close fail");
97 0 : delete pNetDevCtx;
98 0 : return ret_temp;
99 : }
100 0 : break;
101 : }
102 0 : case HCCL_NETDEV_DEPLOYMENT_DEVICE: {
103 0 : HcclResult ret_temp = hccl::NetworkManager::GetInstance(pNetDevCtx->GetLogicId())
104 0 : .DeInitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, isBackup, false);
105 0 : if (ret_temp != HCCL_SUCCESS) {
106 0 : HCCL_ERROR("[HcclNetDevClose] DEPLOYMENT_DEVICE close fail");
107 0 : delete pNetDevCtx;
108 0 : return ret_temp;
109 : }
110 0 : break;
111 : }
112 0 : default:
113 0 : HCCL_ERROR("[HcclNetDevClose]No Such HcclNetDevDeployment: %d", pNetDevCtx->GetNetDevDeployment());
114 0 : delete pNetDevCtx;
115 0 : return HCCL_E_NOT_SUPPORT;
116 : }
117 :
118 0 : delete pNetDevCtx;
119 0 : return ret;
120 : }
121 :
122 0 : HcclResult HcclNetDevGetAddrV1(HcclNetDev netDev, HcclAddress* addr)
123 : {
124 0 : CHK_PTR_NULL(netDev);
125 0 : CHK_PTR_NULL(addr);
126 :
127 0 : hccl::NetDevContext* pNetDevCtx = static_cast<hccl::NetDevContext*>(netDev);
128 0 : hccl::HcclIpAddress ipAddr = pNetDevCtx->GetLocalIp();
129 0 : addr->protoType = pNetDevCtx->GetProtoType();
130 0 : hccl::NetworkManager::GetInstance(pNetDevCtx->GetLogicId()).HcclIpAddressConvertHcclAddr(addr, &ipAddr);
131 0 : return HCCL_SUCCESS;
132 0 : }
133 :
134 0 : HcclResult HcclNetDevGetBusAddrV1(HcclDeviceId dstDevId, HcclAddress* busAddr)
135 : {
136 0 : CHK_PTR_NULL(busAddr);
137 :
138 : s32 localDeviceLogicId;
139 : u32 localDeviceId;
140 0 : CHK_RET(hrtGetDevice(&localDeviceLogicId));
141 0 : CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(localDeviceLogicId), localDeviceId));
142 : // 先创建进程
143 : bool isHostUseDevNic;
144 0 : CHK_RET(IsHostUseDevNic(isHostUseDevNic));
145 0 : u32 tempDevicePhyId = hccl::DEFAULT_PHY_ID;
146 0 : HCCL_DEBUG(
147 : "[%s]HcclNetDevGetBusAddr, deviceLogicId[%u], devicePhyId[%u], nicDeploy[%d], hasBackup[%d],"
148 : " tempDevicePhyId[%u]",
149 : __func__, localDeviceLogicId, dstDevId.devicePhyId, NICDeployment::NIC_DEPLOYMENT_DEVICE, false,
150 : tempDevicePhyId);
151 0 : CHK_RET(hccl::NetworkManager::GetInstance(localDeviceLogicId)
152 : .InitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, tempDevicePhyId, isHostUseDevNic));
153 :
154 : // 参考 Heartbeat::GetConnInfo
155 0 : hccl::HcclIpAddress vnicIP(localDeviceId);
156 0 : if (dstDevId.superDeviceId != SUPER_DEVICE_ID_INVALID) {
157 0 : CHK_RET(hrtRaGetSingleSocketVnicIpInfo(
158 : localDeviceId, DeviceIdType::DEVICE_ID_TYPE_SDID, dstDevId.superDeviceId, vnicIP));
159 : } else {
160 0 : CHK_RET(hrtRaGetSingleSocketVnicIpInfo(
161 : localDeviceId, DeviceIdType::DEVICE_ID_TYPE_PHY_ID, dstDevId.devicePhyId, vnicIP));
162 : }
163 :
164 0 : hccl::NetworkManager::GetInstance(localDeviceLogicId).HcclIpAddressConvertHcclAddr(busAddr, &vnicIP);
165 0 : busAddr->protoType = HCCL_PROTO_TYPE_BUS;
166 0 : HCCL_INFO("[HcclNetDevGetBusAddr] vnicIP [%s] ", vnicIP.GetReadableAddress());
167 : // 销毁进程
168 0 : CHK_RET(hccl::NetworkManager::GetInstance(localDeviceLogicId)
169 : .DeInitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, false));
170 :
171 0 : return HCCL_SUCCESS;
172 0 : }
173 :
174 0 : HcclResult HcclNetDevGetNicAddrV1(int32_t devicePhyId, HcclAddress** addr, uint32_t* addrNum)
175 : {
176 0 : CHK_PTR_NULL(addrNum);
177 0 : CHK_PTR_NULL(addr);
178 :
179 : u32 deviceLogicId;
180 0 : CHK_RET(hrtGetDeviceIndexByPhyId(devicePhyId, deviceLogicId));
181 :
182 : // 先创建进程
183 : bool isHostUseDevNic;
184 0 : CHK_RET(IsHostUseDevNic(isHostUseDevNic));
185 0 : u32 tempDevicePhyId = hccl::DEFAULT_PHY_ID;
186 0 : HCCL_DEBUG(
187 : "[%s]HcclNetDevGetBusAddr, deviceLogicId[%u], devicePhyId[%u], nicDeploy[%d], hasBackup[%d],"
188 : " tempDevicePhyId[%u]",
189 : __func__, deviceLogicId, devicePhyId, NICDeployment::NIC_DEPLOYMENT_DEVICE, false, tempDevicePhyId);
190 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId)
191 : .InitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, tempDevicePhyId, isHostUseDevNic));
192 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId).GetNicIp(devicePhyId, addr, addrNum));
193 :
194 : // 销毁进程
195 0 : CHK_RET(
196 : hccl::NetworkManager::GetInstance(deviceLogicId).DeInitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, false));
197 0 : return HCCL_SUCCESS;
198 : }
|