l2c_api.h revision ead3cde4bac0c3e32cd31f149093f004eef8ceeb
1/******************************************************************************
2 *
3 *  Copyright (C) 1999-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 file contains the L2CAP API definitions
22 *
23 ******************************************************************************/
24#ifndef L2C_API_H
25#define L2C_API_H
26
27#include "bt_target.h"
28#include "l2cdefs.h"
29#include "hcidefs.h"
30
31/*****************************************************************************
32**  Constants
33*****************************************************************************/
34
35/* Define the minimum offset that L2CAP needs in a buffer. This is made up of
36** HCI type(1), len(2), handle(2), L2CAP len(2) and CID(2) => 9
37*/
38#define L2CAP_MIN_OFFSET    13     /* plus control(2), SDU length(2) */
39
40/* Minimum offset for broadcast needs another two bytes for the PSM */
41#define L2CAP_BCST_MIN_OFFSET       11
42
43/* ping result codes */
44#define L2CAP_PING_RESULT_OK        0       /* Ping reply received OK     */
45#define L2CAP_PING_RESULT_NO_LINK   1       /* Link could not be setup    */
46#define L2CAP_PING_RESULT_NO_RESP   2       /* Remote L2CAP did not reply */
47
48/* result code for L2CA_DataWrite() */
49#define L2CAP_DW_FAILED        FALSE
50#define L2CAP_DW_SUCCESS       TRUE
51#define L2CAP_DW_CONGESTED     2
52
53/* Values for priority parameter to L2CA_SetAclPriority */
54#define L2CAP_PRIORITY_NORMAL       0
55#define L2CAP_PRIORITY_HIGH         1
56
57/* Values for priority parameter to L2CA_SetTxPriority */
58#define L2CAP_CHNL_PRIORITY_HIGH    0
59#define L2CAP_CHNL_PRIORITY_MEDIUM  1
60#define L2CAP_CHNL_PRIORITY_LOW     2
61
62typedef UINT8 tL2CAP_CHNL_PRIORITY;
63
64/* Values for Tx/Rx data rate parameter to L2CA_SetChnlDataRate */
65#define L2CAP_CHNL_DATA_RATE_HIGH       3
66#define L2CAP_CHNL_DATA_RATE_MEDIUM     2
67#define L2CAP_CHNL_DATA_RATE_LOW        1
68#define L2CAP_CHNL_DATA_RATE_NO_TRAFFIC 0
69
70typedef UINT8 tL2CAP_CHNL_DATA_RATE;
71
72/* Data Packet Flags  (bits 2-15 are reserved) */
73/* layer specific 14-15 bits are used for FCR SAR */
74#define L2CAP_FLUSHABLE_MASK        0x0003
75#define L2CAP_FLUSHABLE_CH_BASED    0x0000
76#define L2CAP_FLUSHABLE_PKT         0x0001
77#define L2CAP_NON_FLUSHABLE_PKT     0x0002
78
79
80/* L2CA_FlushChannel num_to_flush definitions */
81#define L2CAP_FLUSH_CHANS_ALL       0xffff
82#define L2CAP_FLUSH_CHANS_GET       0x0000
83
84
85/* special CID for Multi-AV for reporting congestion */
86#define L2CAP_MULTI_AV_CID          0
87
88/* length of the HCI header block */
89/* HCI header(4) + SNK count(1) + FCR bits(1) + AV data length(2) */
90#define L2CAP_MULTI_AV_HCI_HDR_LEN	8
91
92/* length of padding for 4 bytes align */
93#define L2CAP_MULTI_AV_PADDING_LEN  2
94
95/* length of the HCI header block with padding for FCR */
96/* HCI header(4) + SNK count(1) + FCR bits(1) + AV data length(2) + padding(2) */
97#define L2CAP_MULTI_AV_HCI_HDR_LEN_WITH_PADDING	10
98
99/* length of the L2CAP header block */
100/* HCI header(4) + L2CAP header(4) + padding(4) or control word(2) + FCS(2) */
101#define L2CAP_MULTI_AV_L2C_HDR_LEN	12
102
103/* definition used for L2CA_SetDesireRole */
104#define L2CAP_ROLE_SLAVE            HCI_ROLE_SLAVE
105#define L2CAP_ROLE_MASTER           HCI_ROLE_MASTER
106#define L2CAP_ROLE_ALLOW_SWITCH     0x80    /* set this bit to allow switch at create conn */
107#define L2CAP_ROLE_DISALLOW_SWITCH  0x40    /* set this bit to disallow switch at create conn */
108#define L2CAP_ROLE_CHECK_SWITCH     0xC0
109
110
111/* Values for 'allowed_modes' field passed in structure tL2CAP_ERTM_INFO
112*/
113#define L2CAP_FCR_CHAN_OPT_BASIC    (1 << L2CAP_FCR_BASIC_MODE)
114#define L2CAP_FCR_CHAN_OPT_ERTM     (1 << L2CAP_FCR_ERTM_MODE)
115#define L2CAP_FCR_CHAN_OPT_STREAM   (1 << L2CAP_FCR_STREAM_MODE)
116
117#define L2CAP_FCR_CHAN_OPT_ALL_MASK (L2CAP_FCR_CHAN_OPT_BASIC | L2CAP_FCR_CHAN_OPT_ERTM | L2CAP_FCR_CHAN_OPT_STREAM)
118
119/* Validity check for PSM.  PSM values must be odd.  Also, all PSM values must
120** be assigned such that the least significant bit of the most sigificant
121** octet equals zero.
122*/
123#define L2C_INVALID_PSM(psm)    (((psm) & 0x0101) != 0x0001)
124#define L2C_IS_VALID_PSM(psm)   (((psm) & 0x0101) == 0x0001)
125
126/*****************************************************************************
127**  Type Definitions
128*****************************************************************************/
129
130typedef struct
131{
132#define L2CAP_FCR_BASIC_MODE    0x00
133#define L2CAP_FCR_ERTM_MODE     0x03
134#define L2CAP_FCR_STREAM_MODE   0x04
135
136    UINT8  mode;
137
138    UINT8  tx_win_sz;
139    UINT8  max_transmit;
140    UINT16 rtrans_tout;
141    UINT16 mon_tout;
142    UINT16 mps;
143} tL2CAP_FCR_OPTS;
144
145/* Define a structure to hold the configuration parameters. Since the
146** parameters are optional, for each parameter there is a boolean to
147** use to signify its presence or absence.
148*/
149typedef struct
150{
151    UINT16      result;                 /* Only used in confirm messages */
152    BOOLEAN     mtu_present;
153    UINT16      mtu;
154    BOOLEAN     qos_present;
155    FLOW_SPEC   qos;
156    BOOLEAN     flush_to_present;
157    UINT16      flush_to;
158    BOOLEAN     fcr_present;
159    tL2CAP_FCR_OPTS fcr;
160    BOOLEAN     fcs_present;            /* Optionally bypasses FCS checks */
161    UINT8       fcs;                    /* '0' if desire is to bypass FCS, otherwise '1' */
162    BOOLEAN               ext_flow_spec_present;
163    tHCI_EXT_FLOW_SPEC    ext_flow_spec;
164    UINT16      flags;                  /* bit 0: 0-no continuation, 1-continuation */
165} tL2CAP_CFG_INFO;
166
167/* L2CAP channel configured field bitmap */
168#define L2CAP_CH_CFG_MASK_MTU           0x0001
169#define L2CAP_CH_CFG_MASK_QOS           0x0002
170#define L2CAP_CH_CFG_MASK_FLUSH_TO      0x0004
171#define L2CAP_CH_CFG_MASK_FCR           0x0008
172#define L2CAP_CH_CFG_MASK_FCS           0x0010
173#define L2CAP_CH_CFG_MASK_EXT_FLOW_SPEC 0x0020
174
175typedef UINT16 tL2CAP_CH_CFG_BITS;
176
177/*********************************
178**  Callback Functions Prototypes
179**********************************/
180
181/* Connection indication callback prototype. Parameters are
182**              BD Address of remote
183**              Local CID assigned to the connection
184**              PSM that the remote wants to connect to
185**              Identifier that the remote sent
186*/
187typedef void (tL2CA_CONNECT_IND_CB) (BD_ADDR, UINT16, UINT16, UINT8);
188
189
190/* Connection confirmation callback prototype. Parameters are
191**              Local CID
192**              Result - 0 = connected, non-zero means failure reason
193*/
194typedef void (tL2CA_CONNECT_CFM_CB) (UINT16, UINT16);
195
196
197/* Connection pending callback prototype. Parameters are
198**              Local CID
199*/
200typedef void (tL2CA_CONNECT_PND_CB) (UINT16);
201
202
203/* Configuration indication callback prototype. Parameters are
204**              Local CID assigned to the connection
205**              Pointer to configuration info
206*/
207typedef void (tL2CA_CONFIG_IND_CB) (UINT16, tL2CAP_CFG_INFO *);
208
209
210/* Configuration confirm callback prototype. Parameters are
211**              Local CID assigned to the connection
212**              Pointer to configuration info
213*/
214typedef void (tL2CA_CONFIG_CFM_CB) (UINT16, tL2CAP_CFG_INFO *);
215
216
217/* Disconnect indication callback prototype. Parameters are
218**              Local CID
219**              Boolean whether upper layer should ack this
220*/
221typedef void (tL2CA_DISCONNECT_IND_CB) (UINT16, BOOLEAN);
222
223
224/* Disconnect confirm callback prototype. Parameters are
225**              Local CID
226**              Result
227*/
228typedef void (tL2CA_DISCONNECT_CFM_CB) (UINT16, UINT16);
229
230
231/* QOS Violation indication callback prototype. Parameters are
232**              BD Address of violating device
233*/
234typedef void (tL2CA_QOS_VIOLATION_IND_CB) (BD_ADDR);
235
236
237/* Data received indication callback prototype. Parameters are
238**              Local CID
239**              Address of buffer
240*/
241typedef void (tL2CA_DATA_IND_CB) (UINT16, BT_HDR *);
242
243
244/* Echo response callback prototype. Note that this is not included in the
245** registration information, but is passed to L2CAP as part of the API to
246** actually send an echo request. Parameters are
247**              Result
248*/
249typedef void (tL2CA_ECHO_RSP_CB) (UINT16);
250
251
252/* Callback function prototype to pass broadcom specific echo response  */
253/* to the upper layer                                                   */
254typedef void (tL2CA_ECHO_DATA_CB) (BD_ADDR, UINT16, UINT8 *);
255
256
257/* Congestion status callback protype. This callback is optional. If
258** an application tries to send data when the transmit queue is full,
259** the data will anyways be dropped. The parameter is:
260**              Local CID
261**              TRUE if congested, FALSE if uncongested
262*/
263typedef void (tL2CA_CONGESTION_STATUS_CB) (UINT16, BOOLEAN);
264
265/* Callback prototype for number of packets completed events.
266** This callback notifies the application when Number of Completed Packets
267** event has been received.
268** This callback is originally designed for 3DG devices.
269** The parameter is:
270**          peer BD_ADDR
271*/
272typedef void (tL2CA_NOCP_CB) (BD_ADDR);
273
274/* Transmit complete callback protype. This callback is optional. If
275** set, L2CAP will call it when packets are sent or flushed. If the
276** count is 0xFFFF, it means all packets are sent for that CID (eRTM
277** mode only). The parameters are:
278**              Local CID
279**              Number of SDUs sent or dropped
280*/
281typedef void (tL2CA_TX_COMPLETE_CB) (UINT16, UINT16);
282
283/* Define the structure that applications use to register with
284** L2CAP. This structure includes callback functions. All functions
285** MUST be provided, with the exception of the "connect pending"
286** callback and "congestion status" callback.
287*/
288typedef struct
289{
290    tL2CA_CONNECT_IND_CB        *pL2CA_ConnectInd_Cb;
291    tL2CA_CONNECT_CFM_CB        *pL2CA_ConnectCfm_Cb;
292    tL2CA_CONNECT_PND_CB        *pL2CA_ConnectPnd_Cb;
293    tL2CA_CONFIG_IND_CB         *pL2CA_ConfigInd_Cb;
294    tL2CA_CONFIG_CFM_CB         *pL2CA_ConfigCfm_Cb;
295    tL2CA_DISCONNECT_IND_CB     *pL2CA_DisconnectInd_Cb;
296    tL2CA_DISCONNECT_CFM_CB     *pL2CA_DisconnectCfm_Cb;
297    tL2CA_QOS_VIOLATION_IND_CB  *pL2CA_QoSViolationInd_Cb;
298    tL2CA_DATA_IND_CB           *pL2CA_DataInd_Cb;
299    tL2CA_CONGESTION_STATUS_CB  *pL2CA_CongestionStatus_Cb;
300    tL2CA_TX_COMPLETE_CB        *pL2CA_TxComplete_Cb;
301
302} tL2CAP_APPL_INFO;
303
304/* Define the structure that applications use to create or accept
305** connections with enhanced retransmission mode.
306*/
307typedef struct
308{
309    UINT8       preferred_mode;
310    UINT8       allowed_modes;
311    UINT8       user_rx_pool_id;
312    UINT8       user_tx_pool_id;
313    UINT8       fcr_rx_pool_id;
314    UINT8       fcr_tx_pool_id;
315
316} tL2CAP_ERTM_INFO;
317
318#define L2CA_REGISTER(a,b,c)        L2CA_Register(a,(tL2CAP_APPL_INFO *)b)
319#define L2CA_DEREGISTER(a)          L2CA_Deregister(a)
320#define L2CA_CONNECT_REQ(a,b,c,d)   L2CA_ErtmConnectReq(a,b,c)
321#define L2CA_CONNECT_RSP(a,b,c,d,e,f,g) L2CA_ErtmConnectRsp(a,b,c,d,e,f)
322#define L2CA_CONFIG_REQ(a,b)        L2CA_ConfigReq(a,b)
323#define L2CA_CONFIG_RSP(a,b)        L2CA_ConfigRsp(a,b)
324#define L2CA_DISCONNECT_REQ(a)      L2CA_DisconnectReq(a)
325#define L2CA_DISCONNECT_RSP(a)      L2CA_DisconnectRsp(a)
326#define L2CA_DATA_WRITE(a, b)       L2CA_DataWrite(a, b)
327
328/*****************************************************************************
329**  External Function Declarations
330*****************************************************************************/
331#ifdef __cplusplus
332extern "C"
333{
334#endif
335
336/*******************************************************************************
337**
338** Function         L2CA_Register
339**
340** Description      Other layers call this function to register for L2CAP
341**                  services.
342**
343** Returns          PSM to use or zero if error. Typically, the PSM returned
344**                  is the same as was passed in, but for an outgoing-only
345**                  connection to a dynamic PSM, a "virtual" PSM is returned
346**                  and should be used in the calls to L2CA_ConnectReq() and
347**                  BTM_SetSecurityLevel().
348**
349*******************************************************************************/
350L2C_API extern UINT16 L2CA_Register (UINT16 psm, tL2CAP_APPL_INFO *p_cb_info);
351
352/*******************************************************************************
353**
354** Function         L2CA_Deregister
355**
356** Description      Other layers call this function to deregister for L2CAP
357**                  services.
358**
359** Returns          void
360**
361*******************************************************************************/
362L2C_API extern void L2CA_Deregister (UINT16 psm);
363
364/*******************************************************************************
365**
366** Function         L2CA_AllocatePSM
367**
368** Description      Other layers call this function to find an unused PSM for L2CAP
369**                  services.
370**
371** Returns          PSM to use.
372**
373*******************************************************************************/
374L2C_API extern UINT16 L2CA_AllocatePSM(void);
375
376/*******************************************************************************
377**
378** Function         L2CA_ConnectReq
379**
380** Description      Higher layers call this function to create an L2CAP connection.
381**                  Note that the connection is not established at this time, but
382**                  connection establishment gets started. The callback function
383**                  will be invoked when connection establishes or fails.
384**
385** Returns          the CID of the connection, or 0 if it failed to start
386**
387*******************************************************************************/
388L2C_API extern UINT16 L2CA_ConnectReq (UINT16 psm, BD_ADDR p_bd_addr);
389
390/*******************************************************************************
391**
392** Function         L2CA_ConnectRsp
393**
394** Description      Higher layers call this function to accept an incoming
395**                  L2CAP connection, for which they had gotten an connect
396**                  indication callback.
397**
398** Returns          TRUE for success, FALSE for failure
399**
400*******************************************************************************/
401L2C_API extern BOOLEAN L2CA_ConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid,
402                                        UINT16 result, UINT16 status);
403
404/*******************************************************************************
405**
406** Function         L2CA_ErtmConnectReq
407**
408** Description      Higher layers call this function to create an L2CAP connection
409**                  that needs to use Enhanced Retransmission Mode.
410**                  Note that the connection is not established at this time, but
411**                  connection establishment gets started. The callback function
412**                  will be invoked when connection establishes or fails.
413**
414** Returns          the CID of the connection, or 0 if it failed to start
415**
416*******************************************************************************/
417L2C_API extern UINT16 L2CA_ErtmConnectReq (UINT16 psm, BD_ADDR p_bd_addr,
418                                           tL2CAP_ERTM_INFO *p_ertm_info);
419
420/*******************************************************************************
421**
422** Function         L2CA_ErtmConnectRsp
423**
424** Description      Higher layers call this function to accept an incoming
425**                  L2CAP connection, for which they had gotten an connect
426**                  indication callback, and for which the higher layer wants
427**                  to use Enhanced Retransmission Mode.
428**
429** Returns          TRUE for success, FALSE for failure
430**
431*******************************************************************************/
432L2C_API extern BOOLEAN  L2CA_ErtmConnectRsp (BD_ADDR p_bd_addr, UINT8 id, UINT16 lcid,
433                                             UINT16 result, UINT16 status,
434                                             tL2CAP_ERTM_INFO *p_ertm_info);
435
436/*******************************************************************************
437**
438** Function         L2CA_ConfigReq
439**
440** Description      Higher layers call this function to send configuration.
441**
442** Returns          TRUE if configuration sent, else FALSE
443**
444*******************************************************************************/
445L2C_API extern BOOLEAN L2CA_ConfigReq (UINT16 cid, tL2CAP_CFG_INFO *p_cfg);
446
447/*******************************************************************************
448**
449** Function         L2CA_ConfigRsp
450**
451** Description      Higher layers call this function to send a configuration
452**                  response.
453**
454** Returns          TRUE if configuration response sent, else FALSE
455**
456*******************************************************************************/
457L2C_API extern BOOLEAN L2CA_ConfigRsp (UINT16 cid, tL2CAP_CFG_INFO *p_cfg);
458
459/*******************************************************************************
460**
461** Function         L2CA_DisconnectReq
462**
463** Description      Higher layers call this function to disconnect a channel.
464**
465** Returns          TRUE if disconnect sent, else FALSE
466**
467*******************************************************************************/
468L2C_API extern BOOLEAN L2CA_DisconnectReq (UINT16 cid);
469
470/*******************************************************************************
471**
472** Function         L2CA_DisconnectRsp
473**
474** Description      Higher layers call this function to acknowledge the
475**                  disconnection of a channel.
476**
477** Returns          void
478**
479*******************************************************************************/
480L2C_API extern BOOLEAN L2CA_DisconnectRsp (UINT16 cid);
481
482/*******************************************************************************
483**
484** Function         L2CA_DataWrite
485**
486** Description      Higher layers call this function to write data.
487**
488** Returns          L2CAP_DW_SUCCESS, if data accepted, else FALSE
489**                  L2CAP_DW_CONGESTED, if data accepted and the channel is congested
490**                  L2CAP_DW_FAILED, if error
491**
492*******************************************************************************/
493L2C_API extern UINT8 L2CA_DataWrite (UINT16 cid, BT_HDR *p_data);
494
495/*******************************************************************************
496**
497** Function         L2CA_Ping
498**
499** Description      Higher layers call this function to send an echo request.
500**
501** Returns          TRUE if echo request sent, else FALSE.
502**
503*******************************************************************************/
504L2C_API extern BOOLEAN L2CA_Ping (BD_ADDR p_bd_addr, tL2CA_ECHO_RSP_CB *p_cb);
505
506/*******************************************************************************
507**
508** Function         L2CA_Echo
509**
510** Description      Higher layers call this function to send an echo request
511**                  with application-specific data.
512**
513** Returns          TRUE if echo request sent, else FALSE.
514**
515*******************************************************************************/
516L2C_API extern BOOLEAN  L2CA_Echo (BD_ADDR p_bd_addr, BT_HDR *p_data, tL2CA_ECHO_DATA_CB *p_callback);
517
518/*******************************************************************************
519**
520** Function         L2CA_SetIdleTimeout
521**
522** Description      Higher layers call this function to set the idle timeout for
523**                  a connection, or for all future connections. The "idle timeout"
524**                  is the amount of time that a connection can remain up with
525**                  no L2CAP channels on it. A timeout of zero means that the
526**                  connection will be torn down immediately when the last channel
527**                  is removed. A timeout of 0xFFFF means no timeout. Values are
528**                  in seconds.
529**
530** Returns          TRUE if command succeeded, FALSE if failed
531**
532*******************************************************************************/
533L2C_API extern BOOLEAN L2CA_SetIdleTimeout (UINT16 cid, UINT16 timeout,
534                                            BOOLEAN is_global);
535
536/*******************************************************************************
537**
538** Function         L2CA_SetIdleTimeoutByBdAddr
539**
540** Description      Higher layers call this function to set the idle timeout for
541**                  a connection. The "idle timeout" is the amount of time that
542**                  a connection can remain up with no L2CAP channels on it.
543**                  A timeout of zero means that the connection will be torn
544**                  down immediately when the last channel is removed.
545**                  A timeout of 0xFFFF means no timeout. Values are in seconds.
546**                  A bd_addr is the remote BD address. If bd_addr = BT_BD_ANY,
547**                  then the idle timeouts for all active l2cap links will be
548**                  changed.
549**
550** Returns          TRUE if command succeeded, FALSE if failed
551**
552** NOTE             This timeout applies to all logical channels active on the
553**                  ACL link.
554*******************************************************************************/
555L2C_API extern BOOLEAN L2CA_SetIdleTimeoutByBdAddr(BD_ADDR bd_addr, UINT16 timeout);
556
557/*******************************************************************************
558**
559** Function         L2CA_SetTraceLevel
560**
561** Description      This function sets the trace level for L2CAP. If called with
562**                  a value of 0xFF, it simply reads the current trace level.
563**
564** Returns          the new (current) trace level
565**
566*******************************************************************************/
567L2C_API extern UINT8 L2CA_SetTraceLevel (UINT8 trace_level);
568
569/*******************************************************************************
570**
571** Function     L2CA_SetDesireRole
572**
573** Description  This function sets the desire role for L2CAP.
574**              If the new role is L2CAP_ROLE_ALLOW_SWITCH, allow switch on
575**              HciCreateConnection.
576**              If the new role is L2CAP_ROLE_DISALLOW_SWITCH, do not allow switch on
577**              HciCreateConnection.
578**
579**              If the new role is a valid role (HCI_ROLE_MASTER or HCI_ROLE_SLAVE),
580**              the desire role is set to the new value. Otherwise, it is not changed.
581**
582** Returns      the new (current) role
583**
584*******************************************************************************/
585L2C_API extern UINT8 L2CA_SetDesireRole (UINT8 new_role);
586
587/*******************************************************************************
588**
589** Function     L2CA_LocalLoopbackReq
590**
591** Description  This function sets up a CID for local loopback
592**
593** Returns      CID of 0 if none.
594**
595*******************************************************************************/
596L2C_API extern UINT16 L2CA_LocalLoopbackReq (UINT16 psm, UINT16 handle, BD_ADDR p_bd_addr);
597
598/*******************************************************************************
599**
600** Function     L2CA_FlushChannel
601**
602** Description  This function flushes none, some or all buffers queued up
603**              for xmission for a particular CID. If called with
604**              L2CAP_FLUSH_CHANS_GET (0), it simply returns the number
605**              of buffers queued for that CID L2CAP_FLUSH_CHANS_ALL (0xffff)
606**              flushes all buffers.  All other values specifies the maximum
607**              buffers to flush.
608**
609** Returns      Number of buffers left queued for that CID
610**
611*******************************************************************************/
612L2C_API extern UINT16   L2CA_FlushChannel (UINT16 lcid, UINT16 num_to_flush);
613
614
615/*******************************************************************************
616**
617** Function         L2CA_SetAclPriority
618**
619** Description      Sets the transmission priority for an ACL channel.
620**                  (For initial implementation only two values are valid.
621**                  L2CAP_PRIORITY_NORMAL and L2CAP_PRIORITY_HIGH).
622**
623** Returns          TRUE if a valid channel, else FALSE
624**
625*******************************************************************************/
626L2C_API extern BOOLEAN L2CA_SetAclPriority (BD_ADDR bd_addr, UINT8 priority);
627
628/*******************************************************************************
629**
630** Function         L2CA_FlowControl
631**
632** Description      Higher layers call this function to flow control a channel.
633**
634**                  data_enabled - TRUE data flows, FALSE data is stopped
635**
636** Returns          TRUE if valid channel, else FALSE
637**
638*******************************************************************************/
639L2C_API extern BOOLEAN L2CA_FlowControl (UINT16 cid, BOOLEAN data_enabled);
640
641/*******************************************************************************
642**
643** Function         L2CA_SendTestSFrame
644**
645** Description      Higher layers call this function to send a test S-frame.
646**
647** Returns          TRUE if valid Channel, else FALSE
648**
649*******************************************************************************/
650L2C_API extern BOOLEAN L2CA_SendTestSFrame (UINT16 cid, BOOLEAN rr_or_rej,
651                                            UINT8 back_track);
652
653/*******************************************************************************
654**
655** Function         L2CA_SetTxPriority
656**
657** Description      Sets the transmission priority for a channel. (FCR Mode)
658**
659** Returns          TRUE if a valid channel, else FALSE
660**
661*******************************************************************************/
662L2C_API extern BOOLEAN L2CA_SetTxPriority (UINT16 cid, tL2CAP_CHNL_PRIORITY priority);
663
664/*******************************************************************************
665**
666** Function         L2CA_RegForNoCPEvt
667**
668** Description      Register callback for Number of Completed Packets event.
669**
670** Input Param      p_cb - callback for Number of completed packets event
671**                  p_bda - BT address of remote device
672**
673** Returns
674**
675*******************************************************************************/
676L2C_API extern BOOLEAN L2CA_RegForNoCPEvt(tL2CA_NOCP_CB *p_cb, BD_ADDR p_bda);
677
678/*******************************************************************************
679**
680** Function         L2CA_SetChnlDataRate
681**
682** Description      Sets the tx/rx data rate for a channel.
683**
684** Returns          TRUE if a valid channel, else FALSE
685**
686*******************************************************************************/
687L2C_API extern BOOLEAN L2CA_SetChnlDataRate (UINT16 cid, tL2CAP_CHNL_DATA_RATE tx, tL2CAP_CHNL_DATA_RATE rx);
688
689typedef void (tL2CA_RESERVE_CMPL_CBACK) (void);
690
691/*******************************************************************************
692**
693** Function         L2CA_SetFlushTimeout
694**
695** Description      This function set the automatic flush time out in Baseband
696**                  for ACL-U packets.
697**                  BdAddr : the remote BD address of ACL link. If it is BT_DB_ANY
698**                           then the flush time out will be applied to all ACL link.
699**                  FlushTimeout: flush time out in ms
700**                           0x0000 : No automatic flush
701**                           L2CAP_NO_RETRANSMISSION : No retransmission
702**                           0x0002 - 0xFFFE : flush time out, if (flush_tout*8)+3/5)
703**                                    <= HCI_MAX_AUTO_FLUSH_TOUT (in 625us slot).
704**                                    Otherwise, return FALSE.
705**                           L2CAP_NO_AUTOMATIC_FLUSH : No automatic flush
706**
707** Returns          TRUE if command succeeded, FALSE if failed
708**
709** NOTE             This flush timeout applies to all logical channels active on the
710**                  ACL link.
711*******************************************************************************/
712L2C_API extern BOOLEAN L2CA_SetFlushTimeout (BD_ADDR bd_addr, UINT16 flush_tout);
713
714/*******************************************************************************
715**
716** Function         L2CA_DataWriteEx
717**
718** Description      Higher layers call this function to write data with extended
719**                  flags.
720**                  flags : L2CAP_FLUSHABLE_CH_BASED
721**                          L2CAP_FLUSHABLE_PKT
722**                          L2CAP_NON_FLUSHABLE_PKT
723**
724** Returns          L2CAP_DW_SUCCESS, if data accepted, else FALSE
725**                  L2CAP_DW_CONGESTED, if data accepted and the channel is congested
726**                  L2CAP_DW_FAILED, if error
727**
728*******************************************************************************/
729L2C_API extern UINT8 L2CA_DataWriteEx (UINT16 cid, BT_HDR *p_data, UINT16 flags);
730
731/*******************************************************************************
732**
733** Function         L2CA_SetChnlFlushability
734**
735** Description      Higher layers call this function to set a channels
736**                  flushability flags
737**
738** Returns          TRUE if CID found, else FALSE
739**
740*******************************************************************************/
741L2C_API extern BOOLEAN L2CA_SetChnlFlushability (UINT16 cid, BOOLEAN is_flushable);
742
743/*******************************************************************************
744**
745**  Function         L2CA_GetPeerFeatures
746**
747**  Description      Get a peers features and fixed channel map
748**
749**  Parameters:      BD address of the peer
750**                   Pointers to features and channel mask storage area
751**
752**  Return value:    TRUE if peer is connected
753**
754*******************************************************************************/
755L2C_API extern BOOLEAN L2CA_GetPeerFeatures (BD_ADDR bd_addr, UINT32 *p_ext_feat, UINT8 *p_chnl_mask);
756
757/*******************************************************************************
758**
759**  Function         L2CA_GetBDAddrbyHandle
760**
761**  Description      Get BD address for the given HCI handle
762**
763**  Parameters:      HCI handle
764**                   BD address of the peer
765**
766**  Return value:    TRUE if found lcb for the given handle, FALSE otherwise
767**
768*******************************************************************************/
769L2C_API extern BOOLEAN L2CA_GetBDAddrbyHandle (UINT16 handle, BD_ADDR bd_addr);
770
771/*******************************************************************************
772**
773**  Function         L2CA_GetChnlFcrMode
774**
775**  Description      Get the channel FCR mode
776**
777**  Parameters:      Local CID
778**
779**  Return value:    Channel mode
780**
781*******************************************************************************/
782L2C_API extern UINT8 L2CA_GetChnlFcrMode (UINT16 lcid);
783
784
785/*******************************************************************************
786**
787**                      UCD callback prototypes
788**
789*******************************************************************************/
790
791/* UCD discovery. Parameters are
792**      BD Address of remote
793**      Data Type
794**      Data
795*/
796#define L2CAP_UCD_INFO_TYPE_RECEPTION   0x01
797#define L2CAP_UCD_INFO_TYPE_MTU         0x02
798
799typedef void (tL2CA_UCD_DISCOVER_CB) (BD_ADDR, UINT8, UINT32);
800
801/* UCD data received. Parameters are
802**      BD Address of remote
803**      Pointer to buffer with data
804*/
805typedef void (tL2CA_UCD_DATA_CB) (BD_ADDR, BT_HDR *);
806
807/* Congestion status callback protype. This callback is optional. If
808** an application tries to send data when the transmit queue is full,
809** the data will anyways be dropped. The parameter is:
810**              remote BD_ADDR
811**              TRUE if congested, FALSE if uncongested
812*/
813typedef void (tL2CA_UCD_CONGESTION_STATUS_CB) (BD_ADDR, BOOLEAN);
814
815/* UCD registration info (the callback addresses and PSM)
816*/
817typedef struct
818{
819    tL2CA_UCD_DISCOVER_CB           *pL2CA_UCD_Discover_Cb;
820    tL2CA_UCD_DATA_CB               *pL2CA_UCD_Data_Cb;
821    tL2CA_UCD_CONGESTION_STATUS_CB  *pL2CA_UCD_Congestion_Status_Cb;
822} tL2CAP_UCD_CB_INFO;
823
824/*******************************************************************************
825**
826**  Function        L2CA_UcdRegister
827**
828**  Description     Register PSM on UCD.
829**
830**  Parameters:     tL2CAP_UCD_CB_INFO
831**
832**  Return value:   TRUE if successs
833**
834*******************************************************************************/
835L2C_API extern BOOLEAN L2CA_UcdRegister ( UINT16 psm, tL2CAP_UCD_CB_INFO *p_cb_info );
836
837/*******************************************************************************
838**
839**  Function        L2CA_UcdDeregister
840**
841**  Description     Deregister PSM on UCD.
842**
843**  Parameters:     PSM
844**
845**  Return value:   TRUE if successs
846**
847*******************************************************************************/
848L2C_API extern BOOLEAN L2CA_UcdDeregister ( UINT16 psm );
849
850/*******************************************************************************
851**
852**  Function        L2CA_UcdDiscover
853**
854**  Description     Discover UCD of remote device.
855**
856**  Parameters:     PSM
857**                  BD_ADDR of remote device
858**                  info_type : L2CAP_UCD_INFO_TYPE_RECEPTION
859**                              L2CAP_UCD_INFO_TYPE_MTU
860**
861**
862**  Return value:   TRUE if successs
863**
864*******************************************************************************/
865L2C_API extern BOOLEAN L2CA_UcdDiscover ( UINT16 psm, BD_ADDR rem_bda, UINT8 info_type );
866
867/*******************************************************************************
868**
869**  Function        L2CA_UcdDataWrite
870**
871**  Description     Send UCD to remote device
872**
873**  Parameters:     PSM
874**                  BD Address of remote
875**                  Pointer to buffer of type BT_HDR
876**                  flags : L2CAP_FLUSHABLE_CH_BASED
877**                          L2CAP_FLUSHABLE_PKT
878**                          L2CAP_NON_FLUSHABLE_PKT
879**
880** Return value     L2CAP_DW_SUCCESS, if data accepted
881**                  L2CAP_DW_FAILED,  if error
882**
883*******************************************************************************/
884L2C_API extern UINT16 L2CA_UcdDataWrite (UINT16 psm, BD_ADDR rem_bda, BT_HDR *p_buf, UINT16 flags);
885
886/*******************************************************************************
887**
888**  Function        L2CA_UcdSetIdleTimeout
889**
890**  Description     Set UCD Idle timeout.
891**
892**  Parameters:     BD Addr
893**                  Timeout in second
894**
895**  Return value:   TRUE if successs
896**
897*******************************************************************************/
898L2C_API extern BOOLEAN L2CA_UcdSetIdleTimeout ( BD_ADDR rem_bda, UINT16 timeout );
899
900/*******************************************************************************
901**
902** Function         L2CA_UCDSetTxPriority
903**
904** Description      Sets the transmission priority for a connectionless channel.
905**
906** Returns          TRUE if a valid channel, else FALSE
907**
908*******************************************************************************/
909L2C_API extern BOOLEAN L2CA_UCDSetTxPriority ( BD_ADDR rem_bda, tL2CAP_CHNL_PRIORITY priority );
910
911
912/*******************************************************************************
913**
914**                      Fixed Channel callback prototypes
915**
916*******************************************************************************/
917
918/* Fixed channel connected and disconnected. Parameters are
919**      BD Address of remote
920**      TRUE if channel is connected, FALSE if disconnected
921**      Reason for connection failure
922*/
923typedef void (tL2CA_FIXED_CHNL_CB) (BD_ADDR, BOOLEAN, UINT16);
924
925/* Signalling data received. Parameters are
926**      BD Address of remote
927**      Pointer to buffer with data
928*/
929typedef void (tL2CA_FIXED_DATA_CB) (BD_ADDR, BT_HDR *);
930
931/* Fixed channel registration info (the callback addresses and channel config)
932*/
933typedef struct
934{
935    tL2CA_FIXED_CHNL_CB    *pL2CA_FixedConn_Cb;
936    tL2CA_FIXED_DATA_CB    *pL2CA_FixedData_Cb;
937    tL2CAP_FCR_OPTS         fixed_chnl_opts;
938
939    UINT16                  default_idle_tout;
940} tL2CAP_FIXED_CHNL_REG;
941
942
943#if (L2CAP_NUM_FIXED_CHNLS > 0)
944/*******************************************************************************
945**
946**  Function        L2CA_RegisterFixedChannel
947**
948**  Description     Register a fixed channel.
949**
950**  Parameters:     Fixed Channel #
951**                  Channel Callbacks and config
952**
953**  Return value:   TRUE if registered OK
954**
955*******************************************************************************/
956L2C_API extern BOOLEAN  L2CA_RegisterFixedChannel (UINT16 fixed_cid, tL2CAP_FIXED_CHNL_REG *p_freg);
957
958/*******************************************************************************
959**
960**  Function        L2CA_ConnectFixedChnl
961**
962**  Description     Connect an fixed signalling channel to a remote device.
963**
964**  Parameters:     Fixed CID
965**                  BD Address of remote
966**
967**  Return value:   TRUE if connection started
968**
969*******************************************************************************/
970L2C_API extern BOOLEAN L2CA_ConnectFixedChnl (UINT16 fixed_cid, BD_ADDR bd_addr);
971
972/*******************************************************************************
973**
974**  Function        L2CA_SendFixedChnlData
975**
976**  Description     Write data on a fixed signalling channel.
977**
978**  Parameters:     Fixed CID
979**                  BD Address of remote
980**                  Pointer to buffer of type BT_HDR
981**
982** Return value     L2CAP_DW_SUCCESS, if data accepted
983**                  L2CAP_DW_FAILED,  if error
984**
985*******************************************************************************/
986L2C_API extern UINT16 L2CA_SendFixedChnlData (UINT16 fixed_cid, BD_ADDR rem_bda, BT_HDR *p_buf);
987
988/*******************************************************************************
989**
990**  Function        L2CA_RemoveFixedChnl
991**
992**  Description     Remove a fixed channel to a remote device.
993**
994**  Parameters:     Fixed CID
995**                  BD Address of remote
996**                  Idle timeout to use (or 0xFFFF if don't care)
997**
998**  Return value:   TRUE if channel removed
999**
1000*******************************************************************************/
1001L2C_API extern BOOLEAN L2CA_RemoveFixedChnl (UINT16 fixed_cid, BD_ADDR rem_bda);
1002
1003/*******************************************************************************
1004**
1005** Function         L2CA_SetFixedChannelTout
1006**
1007** Description      Higher layers call this function to set the idle timeout for
1008**                  a fixed channel. The "idle timeout" is the amount of time that
1009**                  a connection can remain up with no L2CAP channels on it.
1010**                  A timeout of zero means that the connection will be torn
1011**                  down immediately when the last channel is removed.
1012**                  A timeout of 0xFFFF means no timeout. Values are in seconds.
1013**                  A bd_addr is the remote BD address. If bd_addr = BT_BD_ANY,
1014**                  then the idle timeouts for all active l2cap links will be
1015**                  changed.
1016**
1017** Returns          TRUE if command succeeded, FALSE if failed
1018**
1019*******************************************************************************/
1020L2C_API extern BOOLEAN L2CA_SetFixedChannelTout (BD_ADDR rem_bda, UINT16 fixed_cid, UINT16 idle_tout);
1021
1022#endif /* (L2CAP_NUM_FIXED_CHNLS > 0) */
1023
1024/*******************************************************************************
1025**
1026** Function     L2CA_GetCurrentConfig
1027**
1028** Description  This function returns configurations of L2CAP channel
1029**              pp_our_cfg : pointer of our saved configuration options
1030**              p_our_cfg_bits : valid config in bitmap
1031**              pp_peer_cfg: pointer of peer's saved configuration options
1032**              p_peer_cfg_bits : valid config in bitmap
1033**
1034** Returns      TRUE if successful
1035**
1036*******************************************************************************/
1037L2C_API extern BOOLEAN L2CA_GetCurrentConfig (UINT16 lcid,
1038                                              tL2CAP_CFG_INFO **pp_our_cfg,  tL2CAP_CH_CFG_BITS *p_our_cfg_bits,
1039                                              tL2CAP_CFG_INFO **pp_peer_cfg, tL2CAP_CH_CFG_BITS *p_peer_cfg_bits);
1040
1041#if (L2CAP_CORRUPT_ERTM_PKTS == TRUE)
1042/*******************************************************************************
1043**
1044** Function         L2CA_SetupErtmTest
1045**
1046** Description      This function is used for testing purposes only.
1047**                  It corrupts or drops one or more packets used with ERTM channels.
1048**
1049** Parameters
1050**                  cid - channel ID  (0 uses RFCOMM PSM's CID)
1051**
1052**                  type - type of test to run (L2CAP_FCR_TTYPE_CORR_IFRAMES
1053**                                              L2CAP_FCR_TTYPE_CORR_SFRAME
1054**                                              L2CAP_FCR_TTYPE_STOP_TEST
1055**                                              L2CAP_FCR_TTYPE_GET_CID - returns rfcomm cid only)
1056**
1057**                  is_rx  - TRUE to corrupt Rx packet, FALSE for Tx packet)
1058**
1059**                  freq - L2CAP_FCR_FREQ_RANDOM    (turns on random corruptions/drops)
1060**                         L2CAP_FCR_FREQ_NORMAL    (turns on test with "count" corruptions/drops)
1061**
1062**                  count - number of packets in a row to drop or corrupt
1063**
1064** Returns          CID of channel running test
1065**
1066*******************************************************************************/
1067L2C_API extern UINT16 L2CA_SetupErtmTest (UINT16 cid, UINT8 type, BOOLEAN is_rx, UINT8 freq, UINT16 count);
1068
1069/*******************************************************************************
1070**
1071** Function         L2CA_SendPolledSFrame
1072**
1073** Description      This function is used for testing purposes only.
1074**                  It Sends a Polled RR or RNR to the peer
1075**
1076** Parameters
1077**                  cid - channel ID
1078**
1079**                  sup_type - (L2CAP_FCR_SUP_RR or L2CAP_FCR_SUP_RNR)
1080**
1081** Returns          void
1082**
1083*******************************************************************************/
1084L2C_API extern void L2CA_SendPolledSFrame (UINT16 cid, UINT16 sup_type);
1085
1086/*******************************************************************************
1087**
1088** Function         L2CA_BypassSFrame
1089**
1090** Description      This function is used for testing purposes only.
1091**                  It skips sending 'count' S-Frames.
1092**
1093** Parameters
1094**                  cid - channel ID
1095**
1096**                  count - Number of S-Frames to skip sending
1097**
1098** Returns          void
1099**
1100*******************************************************************************/
1101L2C_API extern void L2CA_BypassSFrame (UINT16 cid, UINT8 count);
1102
1103#endif /* (L2CAP_CORRUPT_ERTM_PKTS == TRUE) */
1104
1105
1106#if (BLE_INCLUDED == TRUE)
1107/*******************************************************************************
1108**
1109**  Function        L2CA_CancelBleConnectReq
1110**
1111**  Description     Cancel a pending connection attempt to a BLE device.
1112**
1113**  Parameters:     BD Address of remote
1114**
1115**  Return value:   TRUE if connection was cancelled
1116**
1117*******************************************************************************/
1118L2C_API extern BOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda);
1119
1120/*******************************************************************************
1121**
1122**  Function        L2CA_UpdateBleConnParams
1123**
1124**  Description     Update BLE connection parameters.
1125**
1126**  Parameters:     BD Address of remote
1127**
1128**  Return value:   TRUE if update started
1129**
1130*******************************************************************************/
1131L2C_API extern BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bdRa, UINT16 min_int, UINT16 max_int, UINT16 latency, UINT16 timeout);
1132
1133/*******************************************************************************
1134**
1135**  Function        L2CA_EnableUpdateBleConnParams
1136**
1137**  Description     Update BLE connection parameters.
1138**
1139**  Parameters:     BD Address of remote
1140**                  enable flag
1141**
1142**  Return value:   TRUE if update started
1143**
1144*******************************************************************************/
1145L2C_API extern BOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable);
1146
1147/*******************************************************************************
1148**
1149** Function         L2CA_GetBleConnRole
1150**
1151** Description      This function returns the connection role.
1152**
1153** Returns          link role.
1154**
1155*******************************************************************************/
1156L2C_API extern UINT8 L2CA_GetBleConnRole (BD_ADDR bd_addr);
1157
1158/*******************************************************************************
1159**
1160** Function         L2CA_GetDisconnectReason
1161**
1162** Description      This function returns the disconnect reason code.
1163**
1164** Returns          disconnect reason
1165**
1166*******************************************************************************/
1167L2C_API extern UINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda);
1168
1169#endif /* (BLE_INCLUDED == TRUE) */
1170
1171#ifdef __cplusplus
1172}
1173#endif
1174
1175#endif  /* L2C_API_H */
1176