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 "hccl_network.h"
12 : #include <sys/socket.h>
13 : #include "hccl/base.h"
14 : #include "log.h"
15 : #include "adapter_rts_common.h"
16 : #include "dlra_function.h"
17 : #include "network_manager_pub.h"
18 : #include "dlhal_function.h"
19 : #include "adapter_hccp_common.h"
20 : #include "hccl_net_dev_v1.h"
21 :
22 : using namespace std;
23 :
24 0 : HcclResult HcclNetDevOpenV1(const HcclNetDevInfos* info, HcclNetDev* netDev)
25 : {
26 0 : CHK_PTR_NULL(netDev);
27 0 : CHK_PTR_NULL(info);
28 : static bool flag = false;
29 0 : if (UNLIKELY(flag == false)) {
30 0 : CHK_RET(hccl::DlHalFunction::GetInstance().DlHalFunctionInit());
31 0 : CHK_RET(hccl::DlRaFunction::GetInstance().DlRaFunctionInit());
32 : }
33 : // 拉起进程 对比HcclNetInit
34 : u32 deviceLogicId;
35 0 : bool hasBackup = info->isBackup; // 从外部判断是否有备份
36 0 : CHK_RET(hrtGetDeviceIndexByPhyId(info->devicePhyId, deviceLogicId));
37 0 : switch (info->netdevDeployment) {
38 0 : case HCCL_NETDEV_DEPLOYMENT_HOST: {
39 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId)
40 : .InitV2(NICDeployment::NIC_DEPLOYMENT_HOST, hasBackup, info->devicePhyId));
41 0 : break;
42 : }
43 0 : case HCCL_NETDEV_DEPLOYMENT_DEVICE: {
44 : bool isHostUseDevNic;
45 0 : CHK_RET(IsHostUseDevNic(isHostUseDevNic));
46 0 : u32 tempDevicePhyId = hasBackup ? static_cast<u32>(info->devicePhyId) : hccl::DEFAULT_PHY_ID;
47 0 : HCCL_DEBUG(
48 : "[%s]start HcclNetDevOpen, deviceLogicId[%u], devicePhyId[%u], nicDeploy[%d], hasBackup[%d],"
49 : " tempDevicePhyId[%u]",
50 : __func__, deviceLogicId, info->devicePhyId, info->netdevDeployment, hasBackup, tempDevicePhyId);
51 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId)
52 : .InitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, hasBackup, tempDevicePhyId, isHostUseDevNic));
53 0 : break;
54 : }
55 0 : default: {
56 0 : HCCL_ERROR("[HcclNetDevOpen]No Such HcclNetDevDeployment: %d", info->netdevDeployment);
57 0 : *netDev = nullptr;
58 0 : return HCCL_E_NOT_SUPPORT;
59 : }
60 : }
61 : // 实现设备
62 :
63 0 : hccl::NetDevContext* pNetDevCtx = new (std::nothrow) hccl::NetDevContext();
64 0 : CHK_PTR_NULL(pNetDevCtx);
65 :
66 0 : HcclResult ret = pNetDevCtx->InitV2(info);
67 0 : if (ret != HCCL_SUCCESS) {
68 0 : HCCL_ERROR("[HcclNetDevOpen][InitV2]Init fail. ret[%u]", ret);
69 0 : delete pNetDevCtx;
70 0 : pNetDevCtx = nullptr;
71 0 : *netDev = nullptr;
72 0 : return ret;
73 : }
74 :
75 0 : *netDev = pNetDevCtx;
76 0 : return HCCL_SUCCESS;
77 : }
78 :
79 0 : HcclResult HcclNetDevCloseV1(HcclNetDev netDev)
80 : {
81 : // 先销毁设备
82 0 : CHK_PTR_NULL(netDev);
83 :
84 0 : hccl::NetDevContext* pNetDevCtx = static_cast<hccl::NetDevContext*>(netDev);
85 0 : bool isBackup = pNetDevCtx->GetIsBackup();
86 0 : HcclResult ret = pNetDevCtx->DeinitV2();
87 0 : if (ret != HCCL_SUCCESS) {
88 0 : HCCL_ERROR("[HcclNetDevClose] NetDev Close fail. ret[%u]", ret);
89 : }
90 :
91 : // 再销毁进程
92 0 : switch (pNetDevCtx->GetNetDevDeployment()) {
93 0 : case HCCL_NETDEV_DEPLOYMENT_HOST: {
94 0 : HcclResult ret_temp = hccl::NetworkManager::GetInstance(pNetDevCtx->GetLogicId())
95 0 : .DeInitV2(NICDeployment::NIC_DEPLOYMENT_HOST, isBackup, false);
96 0 : if (ret_temp != HCCL_SUCCESS) {
97 0 : HCCL_ERROR("[HcclNetDevClose] DEPLOYMENT_HOST close fail");
98 0 : delete pNetDevCtx;
99 0 : return ret_temp;
100 : }
101 0 : break;
102 : }
103 0 : case HCCL_NETDEV_DEPLOYMENT_DEVICE: {
104 0 : HcclResult ret_temp = hccl::NetworkManager::GetInstance(pNetDevCtx->GetLogicId())
105 0 : .DeInitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, isBackup, false);
106 0 : if (ret_temp != HCCL_SUCCESS) {
107 0 : HCCL_ERROR("[HcclNetDevClose] DEPLOYMENT_DEVICE close fail");
108 0 : delete pNetDevCtx;
109 0 : return ret_temp;
110 : }
111 0 : break;
112 : }
113 0 : default:
114 0 : HCCL_ERROR("[HcclNetDevClose]No Such HcclNetDevDeployment: %d", pNetDevCtx->GetNetDevDeployment());
115 0 : delete pNetDevCtx;
116 0 : return HCCL_E_NOT_SUPPORT;
117 : }
118 :
119 0 : delete pNetDevCtx;
120 0 : return ret;
121 : }
122 :
123 0 : HcclResult HcclNetDevGetAddrV1(HcclNetDev netDev, HcclAddress* addr)
124 : {
125 0 : CHK_PTR_NULL(netDev);
126 0 : CHK_PTR_NULL(addr);
127 :
128 0 : hccl::NetDevContext* pNetDevCtx = static_cast<hccl::NetDevContext*>(netDev);
129 0 : hccl::HcclIpAddress ipAddr = pNetDevCtx->GetLocalIp();
130 0 : addr->protoType = pNetDevCtx->GetProtoType();
131 0 : hccl::NetworkManager::GetInstance(pNetDevCtx->GetLogicId()).HcclIpAddressConvertHcclAddr(addr, &ipAddr);
132 0 : return HCCL_SUCCESS;
133 0 : }
134 :
135 0 : HcclResult HcclNetDevGetBusAddrV1(HcclDeviceId dstDevId, HcclAddress* busAddr)
136 : {
137 0 : CHK_PTR_NULL(busAddr);
138 :
139 : s32 localDeviceLogicId;
140 : u32 localDeviceId;
141 0 : CHK_RET(hrtGetDevice(&localDeviceLogicId));
142 0 : CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(localDeviceLogicId), localDeviceId));
143 : // 先创建进程
144 : bool isHostUseDevNic;
145 0 : CHK_RET(IsHostUseDevNic(isHostUseDevNic));
146 0 : u32 tempDevicePhyId = hccl::DEFAULT_PHY_ID;
147 0 : HCCL_DEBUG(
148 : "[%s]HcclNetDevGetBusAddr, deviceLogicId[%u], devicePhyId[%u], nicDeploy[%d], hasBackup[%d],"
149 : " tempDevicePhyId[%u]",
150 : __func__, localDeviceLogicId, dstDevId.devicePhyId, NICDeployment::NIC_DEPLOYMENT_DEVICE, false,
151 : tempDevicePhyId);
152 0 : CHK_RET(hccl::NetworkManager::GetInstance(localDeviceLogicId)
153 : .InitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, tempDevicePhyId, isHostUseDevNic));
154 :
155 : // 参考 Heartbeat::GetConnInfo
156 0 : hccl::HcclIpAddress vnicIP(localDeviceId);
157 0 : if (dstDevId.superDeviceId != SUPER_DEVICE_ID_INVALID) {
158 0 : CHK_RET(hrtRaGetSingleSocketVnicIpInfo(
159 : localDeviceId, DeviceIdType::DEVICE_ID_TYPE_SDID, dstDevId.superDeviceId, vnicIP));
160 : } else {
161 0 : CHK_RET(hrtRaGetSingleSocketVnicIpInfo(
162 : localDeviceId, DeviceIdType::DEVICE_ID_TYPE_PHY_ID, dstDevId.devicePhyId, vnicIP));
163 : }
164 :
165 0 : hccl::NetworkManager::GetInstance(localDeviceLogicId).HcclIpAddressConvertHcclAddr(busAddr, &vnicIP);
166 0 : busAddr->protoType = HCCL_PROTO_TYPE_BUS;
167 0 : HCCL_INFO("[HcclNetDevGetBusAddr] vnicIP [%s] ", vnicIP.GetReadableAddress());
168 : // 销毁进程
169 0 : CHK_RET(hccl::NetworkManager::GetInstance(localDeviceLogicId)
170 : .DeInitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, false));
171 :
172 0 : return HCCL_SUCCESS;
173 0 : }
174 :
175 0 : HcclResult HcclNetDevGetNicAddrV1(int32_t devicePhyId, HcclAddress** addr, uint32_t* addrNum)
176 : {
177 0 : CHK_PTR_NULL(addrNum);
178 0 : CHK_PTR_NULL(addr);
179 :
180 : u32 deviceLogicId;
181 0 : CHK_RET(hrtGetDeviceIndexByPhyId(devicePhyId, deviceLogicId));
182 :
183 : // 先创建进程
184 : bool isHostUseDevNic;
185 0 : CHK_RET(IsHostUseDevNic(isHostUseDevNic));
186 0 : u32 tempDevicePhyId = hccl::DEFAULT_PHY_ID;
187 0 : HCCL_DEBUG(
188 : "[%s]HcclNetDevGetBusAddr, deviceLogicId[%u], devicePhyId[%u], nicDeploy[%d], hasBackup[%d],"
189 : " tempDevicePhyId[%u]",
190 : __func__, deviceLogicId, devicePhyId, NICDeployment::NIC_DEPLOYMENT_DEVICE, false, tempDevicePhyId);
191 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId)
192 : .InitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, tempDevicePhyId, isHostUseDevNic));
193 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId).GetNicIp(devicePhyId, addr, addrNum));
194 :
195 : // 销毁进程
196 0 : CHK_RET(
197 : hccl::NetworkManager::GetInstance(deviceLogicId).DeInitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, false));
198 0 : return HCCL_SUCCESS;
199 : }
|