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("[%s]start HcclNetDevOpen, deviceLogicId[%u], devicePhyId[%u], nicDeploy[%d], hasBackup[%d],"
47 : " tempDevicePhyId[%u]", __func__, deviceLogicId, info->devicePhyId, info->netdevDeployment, hasBackup, tempDevicePhyId);
48 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId)
49 : .InitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, hasBackup, tempDevicePhyId, isHostUseDevNic));
50 0 : break;
51 : }
52 0 : default: {
53 0 : HCCL_ERROR("[HcclNetDevOpen]No Such HcclNetDevDeployment: %d", info->netdevDeployment);
54 0 : *netDev = nullptr;
55 0 : return HCCL_E_NOT_SUPPORT;
56 : }
57 : }
58 : // 实现设备
59 :
60 0 : hccl::NetDevContext *pNetDevCtx = new (std::nothrow) hccl::NetDevContext();
61 0 : CHK_PTR_NULL(pNetDevCtx);
62 :
63 0 : HcclResult ret = pNetDevCtx->InitV2(info);
64 0 : if (ret != HCCL_SUCCESS) {
65 0 : HCCL_ERROR("[HcclNetDevOpen][InitV2]Init fail. ret[%u]", ret);
66 0 : delete pNetDevCtx;
67 0 : pNetDevCtx = nullptr;
68 0 : *netDev = nullptr;
69 0 : return ret;
70 : }
71 :
72 0 : *netDev = pNetDevCtx;
73 0 : return HCCL_SUCCESS;
74 : }
75 :
76 0 : HcclResult HcclNetDevCloseV1(HcclNetDev netDev)
77 : {
78 : // 先销毁设备
79 0 : CHK_PTR_NULL(netDev);
80 :
81 0 : hccl::NetDevContext *pNetDevCtx = static_cast<hccl::NetDevContext *>(netDev);
82 0 : bool isBackup = pNetDevCtx->GetIsBackup();
83 0 : HcclResult ret = pNetDevCtx->DeinitV2();
84 0 : if (ret != HCCL_SUCCESS) {
85 0 : HCCL_ERROR("[HcclNetDevClose] NetDev Close fail. ret[%u]", ret);
86 : }
87 :
88 : // 再销毁进程
89 0 : switch (pNetDevCtx->GetNetDevDeployment()) {
90 0 : case HCCL_NETDEV_DEPLOYMENT_HOST: {
91 0 : HcclResult ret_temp = hccl::NetworkManager::GetInstance(pNetDevCtx->GetLogicId())
92 0 : .DeInitV2(NICDeployment::NIC_DEPLOYMENT_HOST, isBackup, false);
93 0 : if (ret_temp != HCCL_SUCCESS) {
94 0 : HCCL_ERROR("[HcclNetDevClose] DEPLOYMENT_HOST close fail");
95 0 : delete pNetDevCtx;
96 0 : return ret_temp;
97 : }
98 0 : break;
99 : }
100 0 : case HCCL_NETDEV_DEPLOYMENT_DEVICE: {
101 0 : HcclResult ret_temp = hccl::NetworkManager::GetInstance(pNetDevCtx->GetLogicId())
102 0 : .DeInitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, isBackup, false);
103 0 : if (ret_temp != HCCL_SUCCESS) {
104 0 : HCCL_ERROR("[HcclNetDevClose] DEPLOYMENT_DEVICE close fail");
105 0 : delete pNetDevCtx;
106 0 : return ret_temp;
107 : }
108 0 : break;
109 : }
110 0 : default:
111 0 : HCCL_ERROR("[HcclNetDevClose]No Such HcclNetDevDeployment: %d", pNetDevCtx->GetNetDevDeployment());
112 0 : delete pNetDevCtx;
113 0 : return HCCL_E_NOT_SUPPORT;
114 : }
115 :
116 0 : delete pNetDevCtx;
117 0 : return ret;
118 : }
119 :
120 0 : HcclResult HcclNetDevGetAddrV1(HcclNetDev netDev, HcclAddress *addr)
121 : {
122 0 : CHK_PTR_NULL(netDev);
123 0 : CHK_PTR_NULL(addr);
124 :
125 0 : hccl::NetDevContext *pNetDevCtx = static_cast<hccl::NetDevContext *>(netDev);
126 0 : hccl::HcclIpAddress ipAddr = pNetDevCtx->GetLocalIp();
127 0 : addr->protoType = pNetDevCtx->GetProtoType();
128 0 : hccl::NetworkManager::GetInstance(pNetDevCtx->GetLogicId()).HcclIpAddressConvertHcclAddr(addr, &ipAddr);
129 0 : return HCCL_SUCCESS;
130 0 : }
131 :
132 0 : HcclResult HcclNetDevGetBusAddrV1(HcclDeviceId dstDevId, HcclAddress *busAddr)
133 : {
134 0 : CHK_PTR_NULL(busAddr);
135 :
136 : s32 localDeviceLogicId;
137 : u32 localDeviceId;
138 0 : CHK_RET(hrtGetDevice(&localDeviceLogicId));
139 0 : CHK_RET(hrtGetDevicePhyIdByIndex(static_cast<u32>(localDeviceLogicId), localDeviceId));
140 : // 先创建进程
141 : bool isHostUseDevNic;
142 0 : CHK_RET(IsHostUseDevNic(isHostUseDevNic));
143 0 : u32 tempDevicePhyId = hccl::DEFAULT_PHY_ID;
144 0 : HCCL_DEBUG("[%s]HcclNetDevGetBusAddr, deviceLogicId[%u], devicePhyId[%u], nicDeploy[%d], hasBackup[%d],"
145 : " tempDevicePhyId[%u]",
146 : __func__,
147 : localDeviceLogicId,
148 : dstDevId.devicePhyId,
149 : NICDeployment::NIC_DEPLOYMENT_DEVICE,
150 : 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(localDeviceId, DeviceIdType::DEVICE_ID_TYPE_SDID, dstDevId.superDeviceId, vnicIP));
159 : } else {
160 0 : CHK_RET(hrtRaGetSingleSocketVnicIpInfo(localDeviceId, DeviceIdType::DEVICE_ID_TYPE_PHY_ID, dstDevId.devicePhyId, vnicIP));
161 : }
162 :
163 0 : hccl::NetworkManager::GetInstance(localDeviceLogicId).HcclIpAddressConvertHcclAddr(busAddr, &vnicIP);
164 0 : busAddr->protoType = HCCL_PROTO_TYPE_BUS;
165 0 : HCCL_INFO("[HcclNetDevGetBusAddr] vnicIP [%s] ", vnicIP.GetReadableAddress());
166 : // 销毁进程
167 0 : CHK_RET(hccl::NetworkManager::GetInstance(localDeviceLogicId)
168 : .DeInitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, false));
169 :
170 0 : return HCCL_SUCCESS;
171 0 : }
172 :
173 0 : HcclResult HcclNetDevGetNicAddrV1(int32_t devicePhyId, HcclAddress **addr, uint32_t *addrNum)
174 : {
175 0 : CHK_PTR_NULL(addrNum);
176 0 : CHK_PTR_NULL(addr);
177 :
178 : u32 deviceLogicId;
179 0 : CHK_RET(hrtGetDeviceIndexByPhyId(devicePhyId, deviceLogicId));
180 :
181 : // 先创建进程
182 : bool isHostUseDevNic;
183 0 : CHK_RET(IsHostUseDevNic(isHostUseDevNic));
184 0 : u32 tempDevicePhyId = hccl::DEFAULT_PHY_ID;
185 0 : HCCL_DEBUG("[%s]HcclNetDevGetBusAddr, deviceLogicId[%u], devicePhyId[%u], nicDeploy[%d], hasBackup[%d],"
186 : " tempDevicePhyId[%u]",
187 : __func__,
188 : deviceLogicId,
189 : devicePhyId,
190 : NICDeployment::NIC_DEPLOYMENT_DEVICE,
191 : false,
192 : tempDevicePhyId);
193 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId)
194 : .InitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, tempDevicePhyId, isHostUseDevNic));
195 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId).GetNicIp(devicePhyId, addr, addrNum));
196 :
197 : // 销毁进程
198 0 : CHK_RET(hccl::NetworkManager::GetInstance(deviceLogicId)
199 : .DeInitV2(NICDeployment::NIC_DEPLOYMENT_DEVICE, false, false));
200 0 : return HCCL_SUCCESS;
201 : }
|