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 <string.h>
12 : #include "securec.h"
13 : #include "ra_hdc.h"
14 : #include "ra_hdc_tlv.h"
15 : #include "ra_rs_err.h"
16 : #include "ra.h"
17 : #include "ra_tlv.h"
18 :
19 : STATIC struct RaTlvOps gRaHdcTlvOps = {
20 : .raTlvInit = RaHdcTlvInit,
21 : .raTlvDeinit = RaHdcTlvDeinit,
22 : .raTlvRequest = RaHdcTlvRequest,
23 : };
24 :
25 3 : HCCP_ATTRI_VISI_DEF int RaTlvInit(struct TlvInitInfo *initInfo, unsigned int *bufferSize, void **tlvHandle)
26 : {
27 3 : struct RaTlvHandle *tlvHandleTmp = NULL;
28 3 : int ret = 0;
29 :
30 3 : CHK_PRT_RETURN(initInfo == NULL || bufferSize == NULL || tlvHandle == NULL,
31 : hccp_err("[init][ra_tlv]init_info or buffer_size or tlv_handle is NULL"),
32 : ConverReturnCode(HCCP_INIT, -EINVAL));
33 :
34 3 : CHK_PRT_RETURN(initInfo->nicPosition != NETWORK_OFFLINE, hccp_err("[init][ra_tlv]mode(%u) not support",
35 : initInfo->nicPosition), ConverReturnCode(HCCP_INIT, -EINVAL));
36 3 : CHK_PRT_RETURN(initInfo->phyId >= RA_MAX_PHY_ID_NUM,
37 : hccp_err("[init][ra_tlv]phy_id(%u) must smaller than %u", initInfo->phyId, RA_MAX_PHY_ID_NUM),
38 : ConverReturnCode(HCCP_INIT, -EINVAL));
39 :
40 3 : tlvHandleTmp = calloc(1, sizeof(struct RaTlvHandle));
41 3 : CHK_PRT_RETURN(tlvHandleTmp == NULL, hccp_err("[init][ra_tlv]calloc for tlv_handle failed"),
42 : ConverReturnCode(HCCP_INIT, -ENOMEM));
43 :
44 3 : (void)memcpy_s(&(tlvHandleTmp->initInfo), sizeof(struct TlvInitInfo), initInfo, sizeof(struct TlvInitInfo));
45 3 : tlvHandleTmp->tlvOps = &gRaHdcTlvOps;
46 3 : if (tlvHandleTmp->tlvOps->raTlvInit == NULL) {
47 0 : ret = -EINVAL;
48 0 : hccp_err("[init][ra_tlv]ra_tlv_init is NULL");
49 0 : goto ra_tlv_init_err;
50 : }
51 :
52 3 : hccp_run_info("Input parameters: phy_id[%u], nicPosition[%u]", initInfo->phyId, initInfo->nicPosition);
53 3 : ret = tlvHandleTmp->tlvOps->raTlvInit(tlvHandleTmp);
54 3 : if (ret == -ENOTSUPP) {
55 0 : hccp_run_warn("[init][ra_tlv]ra_tlv_init unsuccessful, ret(%d), phyId(%u)", ret, initInfo->phyId);
56 0 : goto ra_tlv_init_err;
57 3 : } else if (ret != 0) {
58 1 : hccp_err("[init][ra_tlv]ra_tlv_init failed, ret(%d), phyId(%u)", ret, initInfo->phyId);
59 1 : goto ra_tlv_init_err;
60 : }
61 :
62 2 : ret = pthread_mutex_init(&tlvHandleTmp->mutex, NULL);
63 2 : if (ret != 0) {
64 1 : hccp_err("[init][ra_tlv]init mutext failed, ret(%d), phyId(%u)", ret, initInfo->phyId);
65 1 : goto ra_tlv_init_err;
66 : }
67 :
68 1 : *bufferSize = tlvHandleTmp->bufferSize;
69 1 : *tlvHandle = (void *)tlvHandleTmp;
70 1 : return 0;
71 :
72 2 : ra_tlv_init_err:
73 2 : free(tlvHandleTmp);
74 2 : tlvHandleTmp = NULL;
75 2 : *bufferSize = 0;
76 2 : return ConverReturnCode(HCCP_INIT, ret);
77 : }
78 :
79 3 : HCCP_ATTRI_VISI_DEF int RaTlvDeinit(void *tlvHandle)
80 : {
81 3 : struct RaTlvHandle *tlvHandleTmp = NULL;
82 3 : int ret = 0;
83 :
84 3 : CHK_PRT_RETURN(tlvHandle == NULL, hccp_err("[deinit][ra_tlv]tlv_handle is NULL"),
85 : ConverReturnCode(HCCP_INIT, -EINVAL));
86 :
87 3 : tlvHandleTmp = (struct RaTlvHandle *)tlvHandle;
88 3 : if (tlvHandleTmp->tlvOps->raTlvDeinit == NULL) {
89 1 : ret = -EINVAL;
90 1 : hccp_err("[deinit][ra_tlv]ra_tlv_deinit is NULL, ret(%d), phyId(%u)", ret, tlvHandleTmp->initInfo.phyId);
91 1 : goto ra_tlv_deinit_fail;
92 : }
93 :
94 2 : hccp_run_info("Input parameters: phy_id[%u], nic_position[%u]", tlvHandleTmp->initInfo.phyId,
95 : tlvHandleTmp->initInfo.nicPosition);
96 :
97 2 : ret = tlvHandleTmp->tlvOps->raTlvDeinit(tlvHandleTmp);
98 2 : if (ret != 0) {
99 1 : hccp_err("[deinit][ra_tlv]ra_tlv_deinit failed, ret(%d), phyId(%u)", ret, tlvHandleTmp->initInfo.phyId);
100 1 : goto ra_tlv_deinit_fail;
101 : }
102 :
103 1 : ra_tlv_deinit_fail:
104 3 : (void)pthread_mutex_destroy(&tlvHandleTmp->mutex);
105 3 : free(tlvHandleTmp);
106 3 : tlvHandleTmp = NULL;
107 3 : return ConverReturnCode(HCCP_INIT, ret);
108 : }
109 :
110 4 : HCCP_ATTRI_VISI_DEF int RaTlvRequest(void *tlvHandle, unsigned int moduleType, struct TlvMsg *sendMsg, struct TlvMsg *recvMsg)
111 : {
112 4 : struct RaTlvHandle *tlvHandleTmp = NULL;
113 4 : int ret = 0;
114 :
115 4 : CHK_PRT_RETURN(tlvHandle == NULL || sendMsg == NULL || recvMsg == NULL,
116 : hccp_err("[request][ra_tlv]tlv_handle or send_msg or recv_msg is NULL"), ConverReturnCode(OTHERS, -EINVAL));
117 :
118 4 : CHK_PRT_RETURN(moduleType > TLV_MODULE_TYPE_MAX,
119 : hccp_err("[request][ra_tlv]module_type(%u) invalid, must smaller than (%u)",
120 : moduleType, TLV_MODULE_TYPE_MAX), -EINVAL);
121 :
122 4 : tlvHandleTmp = (struct RaTlvHandle *)tlvHandle;
123 4 : CHK_PRT_RETURN(sendMsg->length > tlvHandleTmp->bufferSize,
124 : hccp_err("[request][ra_tlv]send length(%u) out of range(%u)",
125 : sendMsg->length, tlvHandleTmp->bufferSize), ConverReturnCode(OTHERS, -EINVAL));
126 3 : CHK_PRT_RETURN(tlvHandleTmp->tlvOps->raTlvRequest == NULL,
127 : hccp_err("[request][ra_tlv]ra_tlv_request is NULL"), ConverReturnCode(OTHERS, -EINVAL));
128 :
129 2 : RA_PTHREAD_MUTEX_LOCK(&tlvHandleTmp->mutex);
130 2 : ret = tlvHandleTmp->tlvOps->raTlvRequest(tlvHandleTmp, moduleType, sendMsg, recvMsg);
131 2 : if (ret == -EUSERS || ret == -ENOTSUPP) {
132 0 : hccp_warn("[request][ra_tlv]ra_tlv_request unsuccessful, ret(%d), phyId(%u) sendType(%u)",
133 : ret, tlvHandleTmp->initInfo.phyId, sendMsg->type);
134 2 : } else if (ret != 0) {
135 1 : hccp_err("[request][ra_tlv]ra_tlv_request failed, ret(%d), phyId(%u) sendType(%u)",
136 : ret, tlvHandleTmp->initInfo.phyId, sendMsg->type);
137 : }
138 2 : RA_PTHREAD_MUTEX_UNLOCK(&tlvHandleTmp->mutex);
139 :
140 2 : return ConverReturnCode(OTHERS, ret);
141 : }
|