1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "lnn_lane_common.h"
17
18 #include <securec.h>
19
20 #include "lnn_lane_def.h"
21 #include "lnn_lane_interface.h"
22 #include "lnn_lane_link.h"
23 #include "lnn_lane_model.h"
24 #include "lnn_map.h"
25 #include "message_handler.h"
26 #include "softbus_def.h"
27 #include "softbus_errcode.h"
28 #include "softbus_log.h"
29
30 #define UINT_TO_STR_MAX_LEN 11
31
32 typedef int32_t (*LinkInfoProc)(const LaneLinkInfo *, LaneConnInfo *, LaneProfile *);
33
BrInfoProc(const LaneLinkInfo * linkInfo,LaneConnInfo * connInfo,LaneProfile * profile)34 static int32_t BrInfoProc(const LaneLinkInfo *linkInfo, LaneConnInfo *connInfo, LaneProfile *profile)
35 {
36 connInfo->type = LANE_BR;
37 if (memcpy_s(connInfo->connInfo.br.brMac, BT_MAC_LEN,
38 linkInfo->linkInfo.br.brMac, BT_MAC_LEN) != EOK) {
39 return SOFTBUS_ERR;
40 }
41 profile->linkType = LANE_BR;
42 return SOFTBUS_OK;
43 }
44
BleInfoProc(const LaneLinkInfo * linkInfo,LaneConnInfo * connInfo,LaneProfile * profile)45 static int32_t BleInfoProc(const LaneLinkInfo *linkInfo, LaneConnInfo *connInfo, LaneProfile *profile)
46 {
47 connInfo->type = LANE_BLE;
48 if (memcpy_s(connInfo->connInfo.ble.bleMac, BT_MAC_LEN,
49 linkInfo->linkInfo.ble.bleMac, BT_MAC_LEN) != EOK) {
50 return SOFTBUS_ERR;
51 }
52 if (memcpy_s(connInfo->connInfo.ble.deviceIdHash, UDID_HASH_LEN,
53 linkInfo->linkInfo.ble.deviceIdHash, UDID_HASH_LEN) != EOK) {
54 return SOFTBUS_ERR;
55 }
56 connInfo->connInfo.ble.protoType = linkInfo->linkInfo.ble.protoType;
57 connInfo->connInfo.ble.psm = linkInfo->linkInfo.ble.psm;
58 profile->linkType = LANE_BLE;
59 return SOFTBUS_OK;
60 }
61
P2pInfoProc(const LaneLinkInfo * linkInfo,LaneConnInfo * connInfo,LaneProfile * profile)62 static int32_t P2pInfoProc(const LaneLinkInfo *linkInfo, LaneConnInfo *connInfo, LaneProfile *profile)
63 {
64 connInfo->type = LANE_P2P;
65 if (memcpy_s(&connInfo->connInfo.p2p, sizeof(P2pConnInfo),
66 &linkInfo->linkInfo.p2p.connInfo, sizeof(P2pConnInfo)) != EOK) {
67 return SOFTBUS_ERR;
68 }
69 profile->linkType = LANE_P2P;
70 profile->bw = linkInfo->linkInfo.p2p.bw;
71 profile->phyChannel = linkInfo->linkInfo.p2p.channel;
72 return SOFTBUS_OK;
73 }
P2pReuseInfoProc(const LaneLinkInfo * linkInfo,LaneConnInfo * connInfo,LaneProfile * profile)74 static int32_t P2pReuseInfoProc(const LaneLinkInfo *linkInfo, LaneConnInfo *connInfo, LaneProfile *profile)
75 {
76 connInfo->type = LANE_P2P_REUSE;
77 connInfo->connInfo.wlan = linkInfo->linkInfo.wlan.connInfo;
78 profile->linkType = LANE_P2P_REUSE;
79 return SOFTBUS_OK;
80 }
81
Wlan2P4GInfoProc(const LaneLinkInfo * linkInfo,LaneConnInfo * connInfo,LaneProfile * profile)82 static int32_t Wlan2P4GInfoProc(const LaneLinkInfo *linkInfo, LaneConnInfo *connInfo, LaneProfile *profile)
83 {
84 connInfo->type = LANE_WLAN_2P4G;
85 if (memcpy_s(&connInfo->connInfo.wlan, sizeof(WlanConnInfo),
86 &linkInfo->linkInfo.wlan.connInfo, sizeof(WlanConnInfo)) != EOK) {
87 return SOFTBUS_ERR;
88 }
89 profile->linkType = LANE_WLAN_2P4G;
90 profile->bw = linkInfo->linkInfo.wlan.bw;
91 profile->phyChannel = linkInfo->linkInfo.wlan.channel;
92 return SOFTBUS_OK;
93 }
94
Wlan5GInfoProc(const LaneLinkInfo * linkInfo,LaneConnInfo * connInfo,LaneProfile * profile)95 static int32_t Wlan5GInfoProc(const LaneLinkInfo *linkInfo, LaneConnInfo *connInfo, LaneProfile *profile)
96 {
97 connInfo->type = LANE_WLAN_5G;
98 if (memcpy_s(&connInfo->connInfo.wlan, sizeof(WlanConnInfo),
99 &linkInfo->linkInfo.wlan.connInfo, sizeof(WlanConnInfo)) != EOK) {
100 return SOFTBUS_ERR;
101 }
102 profile->linkType = LANE_WLAN_5G;
103 profile->bw = linkInfo->linkInfo.wlan.bw;
104 profile->phyChannel = linkInfo->linkInfo.wlan.channel;
105 return SOFTBUS_OK;
106 }
107
BleDirectInfoProc(const LaneLinkInfo * linkInfo,LaneConnInfo * connInfo,LaneProfile * profile)108 static int32_t BleDirectInfoProc(const LaneLinkInfo *linkInfo, LaneConnInfo *connInfo, LaneProfile *profile)
109 {
110 if (memcpy_s(connInfo->connInfo.bleDirect.nodeIdHash, NODEID_SHORT_HASH_LEN,
111 linkInfo->linkInfo.bleDirect.nodeIdHash, NODEID_SHORT_HASH_LEN) != EOK) {
112 return SOFTBUS_ERR;
113 }
114 if (memcpy_s(connInfo->connInfo.bleDirect.localUdidHash, UDID_SHORT_HASH_LEN,
115 linkInfo->linkInfo.bleDirect.localUdidHash, UDID_SHORT_HASH_LEN) != EOK) {
116 return SOFTBUS_ERR;
117 }
118 if (memcpy_s(connInfo->connInfo.bleDirect.peerUdidHash, SHA_256_HASH_LEN,
119 linkInfo->linkInfo.bleDirect.peerUdidHash, SHA_256_HASH_LEN) != EOK) {
120 return SOFTBUS_ERR;
121 }
122 connInfo->type = LANE_BLE_DIRECT;
123 connInfo->connInfo.bleDirect.protoType = linkInfo->linkInfo.bleDirect.protoType;
124 profile->linkType = LANE_BLE_DIRECT;
125 return SOFTBUS_OK;
126 }
127
CocInfoProc(const LaneLinkInfo * linkInfo,LaneConnInfo * connInfo,LaneProfile * profile)128 static int32_t CocInfoProc(const LaneLinkInfo *linkInfo, LaneConnInfo *connInfo, LaneProfile *profile)
129 {
130 connInfo->type = LANE_COC;
131 if (memcpy_s(connInfo->connInfo.ble.bleMac, BT_MAC_LEN,
132 linkInfo->linkInfo.ble.bleMac, BT_MAC_LEN) != EOK) {
133 return SOFTBUS_ERR;
134 }
135 if (memcpy_s(connInfo->connInfo.ble.deviceIdHash, UDID_HASH_LEN,
136 linkInfo->linkInfo.ble.deviceIdHash, UDID_HASH_LEN) != EOK) {
137 return SOFTBUS_ERR;
138 }
139 connInfo->connInfo.ble.psm = linkInfo->linkInfo.ble.psm;
140 profile->linkType = LANE_COC;
141 return SOFTBUS_OK;
142 }
143
144 static LinkInfoProc g_funcList[LANE_LINK_TYPE_BUTT] = {
145 [LANE_BR] = BrInfoProc,
146 [LANE_BLE] = BleInfoProc,
147 [LANE_P2P] = P2pInfoProc,
148 [LANE_WLAN_2P4G] = Wlan2P4GInfoProc,
149 [LANE_WLAN_5G] = Wlan5GInfoProc,
150 [LANE_P2P_REUSE] = P2pReuseInfoProc,
151 [LANE_BLE_DIRECT] = BleDirectInfoProc,
152 [LANE_COC] = CocInfoProc,
153 // CoC reuse gatt direct
154 [LANE_COC_DIRECT] = BleDirectInfoProc,
155 };
156
LaneInfoProcess(const LaneLinkInfo * linkInfo,LaneConnInfo * connInfo,LaneProfile * profile)157 NO_SANITIZE("cfi") int32_t LaneInfoProcess(const LaneLinkInfo *linkInfo, LaneConnInfo *connInfo, LaneProfile *profile)
158 {
159 if ((linkInfo == NULL) || (connInfo == NULL) || (profile == NULL)) {
160 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "laneInfoProcess param invalid");
161 return SOFTBUS_ERR;
162 }
163 if ((linkInfo->type >= LANE_LINK_TYPE_BUTT) || (g_funcList[linkInfo->type] == NULL)) {
164 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "unsupport linkType[%d]", linkInfo->type);
165 return SOFTBUS_ERR;
166 }
167 return g_funcList[linkInfo->type](linkInfo, connInfo, profile);
168 }
169
LnnCreateData(Map * map,uint32_t key,const void * value,uint32_t valueSize)170 NO_SANITIZE("cfi") int32_t LnnCreateData(Map *map, uint32_t key, const void *value, uint32_t valueSize)
171 {
172 char keyStr[UINT_TO_STR_MAX_LEN] = {0};
173 if (sprintf_s(keyStr, UINT_TO_STR_MAX_LEN, "%u", key) < 0) {
174 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "[create]convert dataType fail");
175 return SOFTBUS_ERR;
176 }
177 if (LnnMapSet(map, (const char *)keyStr, value, valueSize) != SOFTBUS_OK) {
178 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "save data fail");
179 return SOFTBUS_ERR;
180 }
181 return SOFTBUS_OK;
182 }
183
LnnReadData(const Map * map,uint32_t key)184 NO_SANITIZE("cfi") void *LnnReadData(const Map *map, uint32_t key)
185 {
186 char keyStr[UINT_TO_STR_MAX_LEN] = {0};
187 if (sprintf_s(keyStr, UINT_TO_STR_MAX_LEN, "%u", key) < 0) {
188 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "[read]convert dataType fail");
189 return NULL;
190 }
191 void *data = LnnMapGet(map, (const char *)keyStr);
192 return data;
193 }
194
LnnDeleteData(Map * map,uint32_t key)195 NO_SANITIZE("cfi") void LnnDeleteData(Map *map, uint32_t key)
196 {
197 char keyStr[UINT_TO_STR_MAX_LEN] = {0};
198 if (sprintf_s(keyStr, UINT_TO_STR_MAX_LEN, "%u", key) < 0) {
199 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "[delete]convert dataType fail");
200 return;
201 }
202 if (LnnMapErase(map, (const char *)keyStr) != SOFTBUS_OK) {
203 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "delete data fail");
204 return;
205 }
206 }
207
LnnGetSysTimeMs(void)208 NO_SANITIZE("cfi") uint64_t LnnGetSysTimeMs(void)
209 {
210 return SoftBusGetSysTimeMs();
211 }
212
LnnInitLaneLooper(void)213 NO_SANITIZE("cfi") int32_t LnnInitLaneLooper(void)
214 {
215 SoftBusLooper *looper = CreateNewLooper("Lane-looper");
216 if (!looper) {
217 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init laneLooper fail");
218 return SOFTBUS_ERR;
219 }
220 SetLooper(LOOP_TYPE_LANE, looper);
221 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "init laneLooper success");
222 return SOFTBUS_OK;
223 }
224
LnnDeinitLaneLooper(void)225 NO_SANITIZE("cfi") void LnnDeinitLaneLooper(void)
226 {
227 SoftBusLooper *looper = GetLooper(LOOP_TYPE_LANE);
228 if (looper != NULL) {
229 DestroyLooper(looper);
230 SetLooper(LOOP_TYPE_LANE, NULL);
231 }
232 }