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  #ifndef LNN_LANE_INTERFACE_H
17  #define LNN_LANE_INTERFACE_H
18  
19  #include <stdint.h>
20  #include "softbus_common.h"
21  #include "softbus_def.h"
22  #include "softbus_protocol_def.h"
23  #include "session.h"
24  
25  #ifdef __cplusplus
26  extern "C" {
27  #endif
28  
29  #define INVALID_LANE_REQ_ID 0
30  #define INVALID_LANE_ID 0
31  
32  typedef enum {
33      LANE_BR = 0x0,
34      LANE_BLE,
35      LANE_P2P,
36      LANE_WLAN_2P4G,
37      LANE_WLAN_5G,
38      LANE_ETH,
39      LANE_P2P_REUSE,
40      LANE_BLE_DIRECT,
41      LANE_BLE_REUSE,
42      LANE_COC,
43      LANE_COC_DIRECT,
44      LANE_HML,
45      LANE_HML_RAW,
46      LANE_LINK_TYPE_BUTT,
47  } LaneLinkType;
48  
49  typedef enum {
50      LANE_T_CTRL = 0x0,
51      LANE_T_MIX,
52      LANE_T_BYTE,
53      LANE_T_MSG,
54      LANE_T_FILE,
55      LANE_T_RAW_STREAM,
56      LANE_T_COMMON_VIDEO,
57      LANE_T_COMMON_VOICE,
58      LANE_T_BUTT,
59  } LaneTransType;
60  
61  typedef enum {
62      LANE_STATE_OK = 0,
63      LANE_STATE_LINKUP,
64      LANE_STATE_LINKDOWN,
65  } LaneState;
66  
67  typedef enum {
68      LANE_REQUEST_INFO_INVALID,
69      LANE_RESOURCE_EXHAUSTED,
70      LANE_LINK_FAILED,
71  } LaneRequestFailReason;
72  
73  typedef enum {
74      LANE_LINK_TYPE_WIFI_WLAN = 1,
75      LANE_LINK_TYPE_WIFI_P2P = 2,
76      LANE_LINK_TYPE_BR = 3,
77      LANE_LINK_TYPE_COC_DIRECT = 4,
78      LANE_LINK_TYPE_BLE_DIRECT = 5,
79      LANE_LINK_TYPE_HML = 6,
80      LANE_LINK_TYPE_MAX,
81  } LaneSpecifiedLink;
82  
83  typedef struct {
84      char brMac[BT_MAC_LEN];
85  } BrConnInfo;
86  
87  typedef struct {
88      BleProtocolType protoType;
89      char bleMac[BT_MAC_LEN];
90      char deviceIdHash[UDID_HASH_LEN];
91      int32_t psm;
92  } BleConnInfo;
93  
94  typedef struct {
95      BleProtocolType protoType;
96      char networkId[NETWORK_ID_BUF_LEN];
97  } BleDirectConnInfo;
98  
99  typedef struct {
100      uint16_t protocol;
101      char localIp[IP_LEN];
102      char peerIp[IP_LEN];
103  } P2pConnInfo;
104  
105  typedef struct {
106      ProtocolType protocol;
107      char addr[MAX_SOCKET_ADDR_LEN];
108      uint16_t port;
109  } WlanConnInfo;
110  
111  typedef struct {
112      uint16_t protocol;
113      char localIp[IP_LEN];
114      char peerIp[IP_LEN];
115      int32_t port;
116      bool isReuse;
117      int32_t pid;
118  } RawWifiDirectConnInfo;
119  
120  typedef struct {
121      uint64_t laneId;
122      LaneLinkType type;
123      union {
124          BrConnInfo br;
125          BleConnInfo ble;
126          P2pConnInfo p2p;
127          WlanConnInfo wlan;
128          BleDirectConnInfo bleDirect;
129          RawWifiDirectConnInfo rawWifiDirect;
130      } connInfo;
131  } LaneConnInfo;
132  
133  typedef enum {
134      LANE_OWNER_SELF = 0x0,
135      LANE_OWNER_OTHER,
136      LANE_OWNER_BUTT,
137  } LaneOwner;
138  
139  typedef enum {
140      LANE_QOS_BW_HIGH = 0x0,
141      LANE_QOS_BW_MID,
142      LANE_QOS_BW_LOW,
143      LANE_QOS_BW_BUTT,
144  } LaneQosEvent;
145  
146  typedef struct {
147      void (*onLaneAllocSuccess)(uint32_t laneHandle, const LaneConnInfo *info);
148      void (*onLaneAllocFail)(uint32_t laneHandle, int32_t errCode);
149      void (*onLaneFreeSuccess)(uint32_t laneHandle);
150      void (*onLaneFreeFail)(uint32_t laneHandle, int32_t errCode);
151      void (*onLaneQosEvent)(uint32_t laneHandle, LaneOwner laneOwner, LaneQosEvent qosEvent);
152  } LaneAllocListener;
153  
154  typedef struct {
155      void (*onLaneRequestSuccess)(uint32_t laneReqId, const LaneConnInfo *info);
156      void (*onLaneRequestFail)(uint32_t laneReqId, int32_t errCode);
157  } ILaneListener;
158  
159  typedef enum {
160      LANE_TYPE_HDLC = 0x0,
161      LANE_TYPE_TRANS,
162      LANE_TYPE_CTRL,
163      LANE_TYPE_BUTT,
164  } LaneType;
165  
166  typedef enum {
167      QUERY_RESULT_OK = 0,
168      QUERY_RESULT_RESOURCE_LIMIT,
169      QUERY_RESULT_UNKNOWN,
170      QUERY_RESULT_REQUEST_ILLEGAL,
171  } QueryResult;
172  
173  typedef enum {
174      LANE_RTT_LEVEL_DEFAULT = 0,
175      LANE_RTT_LEVEL_LOW = 1,
176  } LaneRttLevel;
177  
178  typedef struct {
179      char networkId[NETWORK_ID_BUF_LEN];
180      LaneTransType transType;
181  } LaneQueryInfo;
182  
183  typedef struct {
184      uint32_t linkTypeNum;
185      LaneLinkType linkType[LANE_LINK_TYPE_BUTT];
186  } LanePreferredLinkList;
187  
188  typedef struct {
189      uint32_t minBW;
190      uint32_t maxLaneLatency;
191      uint32_t minLaneLatency;
192      LaneRttLevel rttLevel;
193  } QosInfo;
194  
195  typedef struct {
196      char localMac[MAX_MAC_LEN];
197      char remoteMac[MAX_MAC_LEN];
198  } LnnMacInfo;
199  
200  typedef struct {
201      char networkId[NETWORK_ID_BUF_LEN];
202      LaneTransType transType;
203      bool networkDelegate;
204      bool p2pOnly;
205      ProtocolType acceptableProtocols;
206      int32_t pid;
207      char peerBleMac[MAX_MAC_LEN];
208      //'psm' is valid only when 'expectedlink' contains 'LANE_COC'
209      int32_t psm;
210      uint32_t expectedBw;
211      LanePreferredLinkList expectedLink;
212      uint32_t actionAddr;
213      bool isSupportIpv6;
214  } TransOption;
215  
216  typedef struct {
217      LaneType type;
218      union {
219          TransOption trans;
220      } requestInfo;
221  } LaneRequestOption;
222  
223  typedef struct {
224      LaneType type;
225      LaneTransType transType;
226      QosInfo qosRequire;
227      uint32_t actionAddr;
228      uint8_t udidHash[UDID_HASH_LEN];
229  } RawLaneAllocInfo;
230  
231  typedef struct {
232      void (*onLaneLinkup)(uint64_t laneId, const char *peerUdid, const LaneConnInfo *laneConnInfo);
233      void (*onLaneLinkdown)(uint64_t laneId, const char *peerUdid, const LaneConnInfo *laneConnInfo);
234      void (*onLaneStateChange)(uint64_t laneId, LaneState state);
235  } LaneStatusListener;
236  
237  typedef struct {
238      char peerBleMac[MAX_MAC_LEN];
239      bool networkDelegate;
240      bool isSpecifiedLink;
241      LaneSpecifiedLink linkType;
242      uint32_t actionAddr;
243      bool isSupportIpv6;
244  } AllocExtendInfo;
245  
246  typedef struct {
247      LaneType type;
248      char networkId[NETWORK_ID_BUF_LEN];
249      QosInfo qosRequire;
250      LaneTransType transType;
251      int32_t pid;
252      ProtocolType acceptableProtocols;
253      AllocExtendInfo extendInfo;
254  } LaneAllocInfo;
255  
256  typedef struct {
257      char networkId[NETWORK_ID_BUF_LEN];
258      LaneTransType transType;
259  } LaneAllocCommInfo;
260  
261  typedef struct {
262      LaneType type;
263      LaneAllocCommInfo commInfo;
264      LanePreferredLinkList linkList;
265  } LaneAllocInfoExt;
266  
267  typedef struct {
268      int32_t (*lnnQueryLaneResource)(const LaneQueryInfo *queryInfo, const QosInfo *qosInfo);
269      uint32_t (*lnnGetLaneHandle)(LaneType type);
270      int32_t (*lnnAllocLane)(uint32_t laneHandle, const LaneAllocInfo *allocInfo, const LaneAllocListener *listener);
271      int32_t (*lnnAllocRawLane)(uint32_t laneRequestId, const RawLaneAllocInfo *request,
272          const LaneAllocListener *listener);
273      int32_t (*lnnReAllocLane)(uint32_t laneHandle, uint64_t laneId, const LaneAllocInfo *allocInfo,
274          const LaneAllocListener *listener);
275      int32_t (*lnnAllocTargetLane)(uint32_t laneHandle, const LaneAllocInfoExt *allocInfo,
276          const LaneAllocListener *listener);
277      int32_t (*lnnCancelLane)(uint32_t laneHandle);
278      int32_t (*lnnFreeLane)(uint32_t laneHandle);
279      int32_t (*registerLaneListener)(LaneType type, const LaneStatusListener *listener);
280      int32_t (*unRegisterLaneListener)(LaneType type);
281  } LnnLaneManager;
282  
283  LnnLaneManager* GetLaneManager(void);
284  
285  int32_t LnnQueryLaneResource(const LaneQueryInfo *queryInfo, const QosInfo *qosInfo);
286  uint32_t ApplyLaneReqId(LaneType type);
287  int32_t LnnRequestLane(uint32_t laneReqId, const LaneRequestOption *request, const ILaneListener *listener);
288  int32_t LnnFreeLane(uint32_t laneReqId);
289  int32_t GetMacInfoByLaneId(uint64_t laneId, LnnMacInfo *macInfo);
290  
291  #ifdef __cplusplus
292  }
293  #endif
294  #endif // LNN_LANE_INTERFACE_H
295