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"), ConverReturnCode(HCCP_INIT, -EINVAL));
32 :
33 3 : CHK_PRT_RETURN(initInfo->nicPosition != NETWORK_OFFLINE,
34 : hccp_err("[init][ra_tlv]mode(%u) not support", initInfo->nicPosition), ConverReturnCode(HCCP_INIT, -EINVAL));
35 3 : CHK_PRT_RETURN(initInfo->phyId >= RA_MAX_PHY_ID_NUM,
36 : hccp_err("[init][ra_tlv]phy_id(%u) must smaller than %u", initInfo->phyId, RA_MAX_PHY_ID_NUM),
37 : ConverReturnCode(HCCP_INIT, -EINVAL));
38 :
39 3 : tlvHandleTmp = calloc(1, sizeof(struct RaTlvHandle));
40 3 : CHK_PRT_RETURN(tlvHandleTmp == NULL, hccp_err("[init][ra_tlv]calloc for tlv_handle failed"),
41 : ConverReturnCode(HCCP_INIT, -ENOMEM));
42 :
43 3 : (void)memcpy_s(&(tlvHandleTmp->initInfo), sizeof(struct TlvInitInfo), initInfo, sizeof(struct TlvInitInfo));
44 3 : tlvHandleTmp->tlvOps = &gRaHdcTlvOps;
45 3 : if (tlvHandleTmp->tlvOps->raTlvInit == NULL) {
46 0 : ret = -EINVAL;
47 0 : hccp_err("[init][ra_tlv]ra_tlv_init is NULL");
48 0 : goto ra_tlv_init_err;
49 : }
50 :
51 3 : hccp_run_info("Input parameters: phy_id[%u], nicPosition[%u]", initInfo->phyId, initInfo->nicPosition);
52 3 : ret = tlvHandleTmp->tlvOps->raTlvInit(tlvHandleTmp);
53 3 : if (ret == -ENOTSUPP) {
54 0 : hccp_run_warn("[init][ra_tlv]ra_tlv_init unsuccessful, ret(%d), phyId(%u)", ret, initInfo->phyId);
55 0 : goto ra_tlv_init_err;
56 3 : } else if (ret != 0) {
57 1 : hccp_err("[init][ra_tlv]ra_tlv_init failed, ret(%d), phyId(%u)", ret, initInfo->phyId);
58 1 : goto ra_tlv_init_err;
59 : }
60 :
61 2 : ret = pthread_mutex_init(&tlvHandleTmp->mutex, NULL);
62 2 : if (ret != 0) {
63 1 : hccp_err("[init][ra_tlv]init mutext failed, ret(%d), phyId(%u)", ret, initInfo->phyId);
64 1 : goto ra_tlv_init_err;
65 : }
66 :
67 1 : *bufferSize = tlvHandleTmp->bufferSize;
68 1 : *tlvHandle = (void *)tlvHandleTmp;
69 1 : return 0;
70 :
71 2 : ra_tlv_init_err:
72 2 : free(tlvHandleTmp);
73 2 : tlvHandleTmp = NULL;
74 2 : *bufferSize = 0;
75 2 : return ConverReturnCode(HCCP_INIT, ret);
76 : }
77 :
78 3 : HCCP_ATTRI_VISI_DEF int RaTlvDeinit(void *tlvHandle)
79 : {
80 3 : struct RaTlvHandle *tlvHandleTmp = NULL;
81 3 : int ret = 0;
82 :
83 3 : CHK_PRT_RETURN(tlvHandle == NULL, hccp_err("[deinit][ra_tlv]tlv_handle is NULL"),
84 : ConverReturnCode(HCCP_INIT, -EINVAL));
85 :
86 3 : tlvHandleTmp = (struct RaTlvHandle *)tlvHandle;
87 3 : if (tlvHandleTmp->tlvOps->raTlvDeinit == NULL) {
88 1 : ret = -EINVAL;
89 1 : hccp_err("[deinit][ra_tlv]ra_tlv_deinit is NULL, ret(%d), phyId(%u)", ret, tlvHandleTmp->initInfo.phyId);
90 1 : goto ra_tlv_deinit_fail;
91 : }
92 :
93 2 : hccp_run_info("Input parameters: phy_id[%u], nic_position[%u]", tlvHandleTmp->initInfo.phyId,
94 : tlvHandleTmp->initInfo.nicPosition);
95 :
96 2 : ret = tlvHandleTmp->tlvOps->raTlvDeinit(tlvHandleTmp);
97 2 : if (ret != 0) {
98 1 : hccp_err("[deinit][ra_tlv]ra_tlv_deinit failed, ret(%d), phyId(%u)", ret, tlvHandleTmp->initInfo.phyId);
99 1 : goto ra_tlv_deinit_fail;
100 : }
101 :
102 1 : ra_tlv_deinit_fail:
103 3 : (void)pthread_mutex_destroy(&tlvHandleTmp->mutex);
104 3 : free(tlvHandleTmp);
105 3 : tlvHandleTmp = NULL;
106 3 : return ConverReturnCode(HCCP_INIT, ret);
107 : }
108 :
109 4 : HCCP_ATTRI_VISI_DEF int RaTlvRequest(void *tlvHandle, unsigned int moduleType, struct TlvMsg *sendMsg,
110 : 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)", moduleType, TLV_MODULE_TYPE_MAX),
120 : -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)", sendMsg->length, tlvHandleTmp->bufferSize),
125 : ConverReturnCode(OTHERS, -EINVAL));
126 3 : CHK_PRT_RETURN(tlvHandleTmp->tlvOps->raTlvRequest == NULL, hccp_err("[request][ra_tlv]ra_tlv_request is NULL"),
127 : 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)", ret,
133 : 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)", ret,
136 : tlvHandleTmp->initInfo.phyId, sendMsg->type);
137 : }
138 2 : RA_PTHREAD_MUTEX_UNLOCK(&tlvHandleTmp->mutex);
139 :
140 2 : return ConverReturnCode(OTHERS, ret);
141 : }
|