1/******************************************************************************
2 *
3 *  Copyright (C) 2001-2012 Broadcom Corporation
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 *  This interface file contains the interface to the Bluetooth Network
22 *  Encapsilation Protocol (BNEP).
23 *
24 ******************************************************************************/
25#ifndef BNEP_API_H
26#define BNEP_API_H
27
28#include "l2c_api.h"
29
30/*****************************************************************************
31 *  Constants
32 ****************************************************************************/
33
34/* Define the minimum offset needed in a GKI buffer for
35 * sending BNEP packets. Note, we are currently not sending
36 * extension headers, but may in the future, so allow
37 * space for them
38*/
39#define BNEP_MINIMUM_OFFSET (15 + L2CAP_MIN_OFFSET)
40#define BNEP_INVALID_HANDLE 0xFFFF
41
42/*****************************************************************************
43 *  Type Definitions
44 ****************************************************************************/
45
46/* Define the result codes from BNEP
47*/
48enum {
49  BNEP_SUCCESS,               /* Success                           */
50  BNEP_CONN_DISCONNECTED,     /* Connection terminated   */
51  BNEP_NO_RESOURCES,          /* No resources                      */
52  BNEP_MTU_EXCEDED,           /* Attempt to write long data        */
53  BNEP_INVALID_OFFSET,        /* Insufficient offset in GKI buffer */
54  BNEP_CONN_FAILED,           /* Connection failed                 */
55  BNEP_CONN_FAILED_CFG,       /* Connection failed cos of config   */
56  BNEP_CONN_FAILED_SRC_UUID,  /* Connection failed wrong source UUID   */
57  BNEP_CONN_FAILED_DST_UUID,  /* Connection failed wrong destination UUID   */
58  BNEP_CONN_FAILED_UUID_SIZE, /* Connection failed wrong size UUID   */
59  BNEP_Q_SIZE_EXCEEDED,       /* Too many buffers to dest          */
60  BNEP_TOO_MANY_FILTERS,      /* Too many local filters specified  */
61  BNEP_SET_FILTER_FAIL,       /* Set Filter failed  */
62  BNEP_WRONG_HANDLE,          /* Wrong handle for the connection  */
63  BNEP_WRONG_STATE,           /* Connection is in wrong state */
64  BNEP_SECURITY_FAIL,         /* Failed because of security */
65  BNEP_IGNORE_CMD,            /* To ignore the rcvd command */
66  BNEP_TX_FLOW_ON,            /* tx data flow enabled */
67  BNEP_TX_FLOW_OFF            /* tx data flow disabled */
68
69};
70typedef uint8_t tBNEP_RESULT;
71
72/***************************
73 *  Callback Functions
74 ***************************/
75
76/* Connection state change callback prototype. Parameters are
77 *              Connection handle
78 *              BD Address of remote
79 *              Connection state change result
80 *                  BNEP_SUCCESS indicates connection is success
81 *                  All values are used to indicate the reason for failure
82 *              Flag to indicate if it is just a role change
83*/
84typedef void(tBNEP_CONN_STATE_CB)(uint16_t handle, BD_ADDR rem_bda,
85                                  tBNEP_RESULT result, bool is_role_change);
86
87/* Connection indication callback prototype. Parameters are
88 *              BD Address of remote, remote UUID and local UUID
89 *              and flag to indicate role change and handle to the connection
90 *              When BNEP calls this function profile should
91 *              use BNEP_ConnectResp call to accept or reject the request
92*/
93typedef void(tBNEP_CONNECT_IND_CB)(uint16_t handle, BD_ADDR bd_addr,
94                                   tBT_UUID* remote_uuid, tBT_UUID* local_uuid,
95                                   bool is_role_change);
96
97/* Data buffer received indication callback prototype. Parameters are
98 *              Handle to the connection
99 *              Source BD/Ethernet Address
100 *              Dest BD/Ethernet address
101 *              Protocol
102 *              Pointer to the buffer
103 *              Flag to indicate whether extension headers to be forwarded are
104 *                present
105 */
106typedef void(tBNEP_DATA_BUF_CB)(uint16_t handle, uint8_t* src, uint8_t* dst,
107                                uint16_t protocol, BT_HDR* p_buf,
108                                bool fw_ext_present);
109
110/* Data received indication callback prototype. Parameters are
111 *              Handle to the connection
112 *              Source BD/Ethernet Address
113 *              Dest BD/Ethernet address
114 *              Protocol
115 *              Pointer to the beginning of the data
116 *              Length of data
117 *              Flag to indicate whether extension headers to be forwarded are
118 *                present
119 */
120typedef void(tBNEP_DATA_IND_CB)(uint16_t handle, uint8_t* src, uint8_t* dst,
121                                uint16_t protocol, uint8_t* p_data,
122                                uint16_t len, bool fw_ext_present);
123
124/* Flow control callback for TX data. Parameters are
125 *              Handle to the connection
126 *              Event  flow status
127*/
128typedef void(tBNEP_TX_DATA_FLOW_CB)(uint16_t handle, tBNEP_RESULT event);
129
130/* Filters received indication callback prototype. Parameters are
131 *              Handle to the connection
132 *              true if the cb is called for indication
133 *              Ignore this if it is indication, otherwise it is the result
134 *                      for the filter set operation performed by the local
135 *                      device
136 *              Number of protocol filters present
137 *              Pointer to the filters start. Filters are present in pairs
138 *                      of start of the range and end of the range.
139 *                      They will be present in big endian order. First
140 *                      two bytes will be starting of the first range and
141 *                      next two bytes will be ending of the range.
142*/
143typedef void(tBNEP_FILTER_IND_CB)(uint16_t handle, bool indication,
144                                  tBNEP_RESULT result, uint16_t num_filters,
145                                  uint8_t* p_filters);
146
147/* Multicast Filters received indication callback prototype. Parameters are
148 *              Handle to the connection
149 *              true if the cb is called for indication
150 *              Ignore this if it is indication, otherwise it is the result
151 *                      for the filter set operation performed by the local
152 *                      device
153 *              Number of multicast filters present
154 *              Pointer to the filters start. Filters are present in pairs
155 *                      of start of the range and end of the range.
156 *                      First six bytes will be starting of the first range and
157 *                      next six bytes will be ending of the range.
158*/
159typedef void(tBNEP_MFILTER_IND_CB)(uint16_t handle, bool indication,
160                                   tBNEP_RESULT result, uint16_t num_mfilters,
161                                   uint8_t* p_mfilters);
162
163/* This is the structure used by profile to register with BNEP */
164typedef struct {
165  tBNEP_CONNECT_IND_CB* p_conn_ind_cb;  /* To indicate the conn request */
166  tBNEP_CONN_STATE_CB* p_conn_state_cb; /* To indicate conn state change */
167  tBNEP_DATA_IND_CB* p_data_ind_cb;     /* To pass the data received */
168  tBNEP_DATA_BUF_CB* p_data_buf_cb;     /* To pass the data buffer received */
169  tBNEP_TX_DATA_FLOW_CB* p_tx_data_flow_cb; /* data flow callback */
170  tBNEP_FILTER_IND_CB*
171      p_filter_ind_cb; /* To indicate that peer set protocol filters */
172  tBNEP_MFILTER_IND_CB*
173      p_mfilter_ind_cb; /* To indicate that peer set mcast filters */
174
175} tBNEP_REGISTER;
176
177/* This is the structure used by profile to get the status of BNEP */
178typedef struct {
179#define BNEP_STATUS_FAILE 0
180#define BNEP_STATUS_CONNECTED 1
181  uint8_t con_status;
182
183  uint16_t l2cap_cid;
184  BD_ADDR rem_bda;
185  uint16_t rem_mtu_size;
186  uint16_t xmit_q_depth;
187
188  uint16_t sent_num_filters;
189  uint16_t sent_mcast_filters;
190  uint16_t rcvd_num_filters;
191  uint16_t rcvd_mcast_filters;
192  tBT_UUID src_uuid;
193  tBT_UUID dst_uuid;
194
195} tBNEP_STATUS;
196
197/*****************************************************************************
198 *  External Function Declarations
199 ****************************************************************************/
200/*******************************************************************************
201 *
202 * Function         BNEP_Register
203 *
204 * Description      This function is called by the upper layer to register
205 *                  its callbacks with BNEP
206 *
207 * Parameters:      p_reg_info - contains all callback function pointers
208 *
209 *
210 * Returns          BNEP_SUCCESS        if registered successfully
211 *                  BNEP_FAILURE        if connection state callback is missing
212 *
213 ******************************************************************************/
214extern tBNEP_RESULT BNEP_Register(tBNEP_REGISTER* p_reg_info);
215
216/*******************************************************************************
217 *
218 * Function         BNEP_Deregister
219 *
220 * Description      This function is called by the upper layer to de-register
221 *                  its callbacks.
222 *
223 * Parameters:      void
224 *
225 *
226 * Returns          void
227 *
228 ******************************************************************************/
229extern void BNEP_Deregister(void);
230
231/*******************************************************************************
232 *
233 * Function         BNEP_Connect
234 *
235 * Description      This function creates a BNEP connection to a remote
236 *                  device.
237 *
238 * Parameters:      p_rem_addr - BD_ADDR of the peer
239 *                  src_uuid   - source uuid for the connection
240 *                  dst_uuid   - destination uuid for the connection
241 *                  p_handle   - pointer to return the handle for the connection
242 *
243 * Returns          BNEP_SUCCESS                if connection started
244 *                  BNEP_NO_RESOURCES           if no resources
245 *
246 ******************************************************************************/
247extern tBNEP_RESULT BNEP_Connect(BD_ADDR p_rem_bda, tBT_UUID* src_uuid,
248                                 tBT_UUID* dst_uuid, uint16_t* p_handle);
249
250/*******************************************************************************
251 *
252 * Function         BNEP_ConnectResp
253 *
254 * Description      This function is called in responce to connection indication
255 *
256 *
257 * Parameters:      handle  - handle given in the connection indication
258 *                  resp    - responce for the connection indication
259 *
260 * Returns          BNEP_SUCCESS                if connection started
261 *                  BNEP_WRONG_HANDLE           if the connection is not found
262 *                  BNEP_WRONG_STATE            if the responce is not expected
263 *
264 ******************************************************************************/
265extern tBNEP_RESULT BNEP_ConnectResp(uint16_t handle, tBNEP_RESULT resp);
266
267/*******************************************************************************
268 *
269 * Function         BNEP_Disconnect
270 *
271 * Description      This function is called to close the specified connection.
272 *
273 * Parameters:      handle   - handle of the connection
274 *
275 * Returns          BNEP_SUCCESS                if connection is disconnected
276 *                  BNEP_WRONG_HANDLE           if no connection is not found
277 *
278 ******************************************************************************/
279extern tBNEP_RESULT BNEP_Disconnect(uint16_t handle);
280
281/*******************************************************************************
282 *
283 * Function         BNEP_WriteBuf
284 *
285 * Description      This function sends data in a GKI buffer on BNEP connection
286 *
287 * Parameters:      handle       - handle of the connection to write
288 *                  p_dest_addr  - BD_ADDR/Ethernet addr of the destination
289 *                  p_buf        - pointer to address of buffer with data
290 *                  protocol     - protocol type of the packet
291 *                  p_src_addr   - (optional) BD_ADDR/ethernet address of the
292 *                                 source (should be NULL if it is the local BD
293 *                                         Addr)
294 *                  fw_ext_present - forwarded extensions present
295 *
296 * Returns:         BNEP_WRONG_HANDLE       - if passed handle is not valid
297 *                  BNEP_MTU_EXCEDED        - If the data length is greater
298 *                                            than MTU
299 *                  BNEP_IGNORE_CMD         - If the packet is filtered out
300 *                  BNEP_Q_SIZE_EXCEEDED    - If the Tx Q is full
301 *                  BNEP_SUCCESS            - If written successfully
302 *
303 ******************************************************************************/
304extern tBNEP_RESULT BNEP_WriteBuf(uint16_t handle, uint8_t* p_dest_addr,
305                                  BT_HDR* p_buf, uint16_t protocol,
306                                  uint8_t* p_src_addr, bool fw_ext_present);
307
308/*******************************************************************************
309 *
310 * Function         BNEP_Write
311 *
312 * Description      This function sends data over a BNEP connection
313 *
314 * Parameters:      handle       - handle of the connection to write
315 *                  p_dest_addr  - BD_ADDR/Ethernet addr of the destination
316 *                  p_data       - pointer to data start
317 *                  protocol     - protocol type of the packet
318 *                  p_src_addr   - (optional) BD_ADDR/ethernet address of the
319 *                                 source (should be NULL if it is the local BD
320 *                                 Addr)
321 *                  fw_ext_present - forwarded extensions present
322 *
323 * Returns:         BNEP_WRONG_HANDLE       - if passed handle is not valid
324 *                  BNEP_MTU_EXCEDED        - If the data length is greater than
325 *                                            the MTU
326 *                  BNEP_IGNORE_CMD         - If the packet is filtered out
327 *                  BNEP_Q_SIZE_EXCEEDED    - If the Tx Q is full
328 *                  BNEP_NO_RESOURCES       - If not able to allocate a buffer
329 *                  BNEP_SUCCESS            - If written successfully
330 *
331 ******************************************************************************/
332extern tBNEP_RESULT BNEP_Write(uint16_t handle, uint8_t* p_dest_addr,
333                               uint8_t* p_data, uint16_t len, uint16_t protocol,
334                               uint8_t* p_src_addr, bool fw_ext_present);
335
336/*******************************************************************************
337 *
338 * Function         BNEP_SetProtocolFilters
339 *
340 * Description      This function sets the protocol filters on peer device
341 *
342 * Parameters:      handle        - Handle for the connection
343 *                  num_filters   - total number of filter ranges
344 *                  p_start_array - Array of beginings of all protocol ranges
345 *                  p_end_array   - Array of ends of all protocol ranges
346 *
347 * Returns          BNEP_WRONG_HANDLE           - if the connection handle is
348 *                                                not valid
349 *                  BNEP_SET_FILTER_FAIL        - if the connection is in the
350 *                                                wrong state
351 *                  BNEP_TOO_MANY_FILTERS       - if too many filters
352 *                  BNEP_SUCCESS                - if request sent successfully
353 *
354 ******************************************************************************/
355extern tBNEP_RESULT BNEP_SetProtocolFilters(uint16_t handle,
356                                            uint16_t num_filters,
357                                            uint16_t* p_start_array,
358                                            uint16_t* p_end_array);
359
360/*******************************************************************************
361 *
362 * Function         BNEP_SetMulticastFilters
363 *
364 * Description      This function sets the filters for multicast addresses for
365 *                  BNEP.
366 *
367 * Parameters:      handle        - Handle for the connection
368 *                  num_filters   - total number of filter ranges
369 *                  p_start_array - Pointer to sequence of beginings of all
370 *                                         multicast address ranges
371 *                  p_end_array   - Pointer to sequence of ends of all
372 *                                         multicast address ranges
373 *
374 * Returns          BNEP_WRONG_HANDLE           - if the connection handle is
375 *                                                not valid
376 *                  BNEP_SET_FILTER_FAIL        - if the connection is in the
377 *                                                wrong state
378 *                  BNEP_TOO_MANY_FILTERS       - if too many filters
379 *                  BNEP_SUCCESS                - if request sent successfully
380 *
381 ******************************************************************************/
382extern tBNEP_RESULT BNEP_SetMulticastFilters(uint16_t handle,
383                                             uint16_t num_filters,
384                                             uint8_t* p_start_array,
385                                             uint8_t* p_end_array);
386
387/*******************************************************************************
388 *
389 * Function         BNEP_SetTraceLevel
390 *
391 * Description      This function sets the trace level for BNEP. If called with
392 *                  a value of 0xFF, it simply reads the current trace level.
393 *
394 * Returns          the new (current) trace level
395 *
396 ******************************************************************************/
397extern uint8_t BNEP_SetTraceLevel(uint8_t new_level);
398
399/*******************************************************************************
400 *
401 * Function         BNEP_Init
402 *
403 * Description      This function initializes the BNEP unit. It should be called
404 *                  before accessing any other APIs to initialize the control
405 *                  block
406 *
407 * Returns          void
408 *
409 ******************************************************************************/
410extern void BNEP_Init(void);
411
412/*******************************************************************************
413 *
414 * Function         BNEP_GetStatus
415 *
416 * Description      This function gets the status information for BNEP
417 *                  connection
418 *
419 * Returns          BNEP_SUCCESS            - if the status is available
420 *                  BNEP_NO_RESOURCES       - if no structure is passed for
421 *                                            output
422 *                  BNEP_WRONG_HANDLE       - if the handle is invalid
423 *                  BNEP_WRONG_STATE        - if not in connected state
424 *
425 ******************************************************************************/
426extern tBNEP_RESULT BNEP_GetStatus(uint16_t handle, tBNEP_STATUS* p_status);
427
428#endif
429