• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }