1 /*
2  * Copyright 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <bluetooth/log.h>
20 #include <stdbool.h>
21 
22 #include <cstdint>
23 #include <vector>
24 
25 #include "stack/include/bt_hdr.h"
26 #include "stack/include/l2cap_types.h"
27 #include "types/bt_transport.h"
28 #include "types/hci_role.h"
29 #include "types/raw_address.h"
30 
31 /* result code for L2CA_DataWrite() */
32 enum class tL2CAP_DW_RESULT : uint8_t {
33   FAILED = 0,
34   SUCCESS = 1,
35   CONGESTED = 2,
36 };
37 
38 /*********************************
39  *  Callback Functions Prototypes
40  *********************************/
41 
42 /* Connection indication callback prototype. Parameters are
43  *              BD Address of remote
44  *              Local CID assigned to the connection
45  *              PSM that the remote wants to connect to
46  *              Identifier that the remote sent
47  */
48 typedef void(tL2CA_CONNECT_IND_CB)(const RawAddress&, uint16_t, uint16_t, uint8_t);
49 
50 /* Connection confirmation callback prototype. Parameters are
51  *              Local CID
52  *              Result - 0 = connected
53  *              If there is an error, tL2CA_ERROR_CB is invoked
54  */
55 typedef void(tL2CA_CONNECT_CFM_CB)(uint16_t, tL2CAP_CONN);
56 
57 /* Configuration indication callback prototype. Parameters are
58  *              Local CID assigned to the connection
59  *              Pointer to configuration info
60  */
61 typedef void(tL2CA_CONFIG_IND_CB)(uint16_t, tL2CAP_CFG_INFO*);
62 
63 /* Configuration confirm callback prototype. Parameters are
64  *              Local CID assigned to the connection
65  *              Initiator (1 for local, 0 for remote)
66  *              Initial config from remote
67  * If there is an error, tL2CA_ERROR_CB is invoked
68  */
69 typedef void(tL2CA_CONFIG_CFM_CB)(uint16_t, uint16_t, tL2CAP_CFG_INFO*);
70 
71 /* Disconnect indication callback prototype. Parameters are
72  *              Local CID
73  *              Boolean whether upper layer should ack this
74  */
75 typedef void(tL2CA_DISCONNECT_IND_CB)(uint16_t, bool);
76 
77 /* Disconnect confirm callback prototype. Parameters are
78  *              Local CID
79  *              Result
80  */
81 typedef void(tL2CA_DISCONNECT_CFM_CB)(uint16_t, uint16_t);
82 
83 /* Disconnect confirm callback prototype. Parameters are
84  *              Local CID
85  *              Result
86  */
87 typedef void(tL2CA_DATA_IND_CB)(uint16_t, BT_HDR*);
88 
89 /* Congestion status callback protype. This callback is optional. If
90  * an application tries to send data when the transmit queue is full,
91  * the data will anyways be dropped. The parameter is:
92  *              Local CID
93  *              true if congested, false if uncongested
94  */
95 typedef void(tL2CA_CONGESTION_STATUS_CB)(uint16_t, bool);
96 
97 /* Transmit complete callback protype. This callback is optional. If
98  * set, L2CAP will call it when packets are sent or flushed. If the
99  * count is 0xFFFF, it means all packets are sent for that CID (eRTM
100  * mode only). The parameters are:
101  *              Local CID
102  *              Number of SDUs sent or dropped
103  */
104 typedef void(tL2CA_TX_COMPLETE_CB)(uint16_t, uint16_t);
105 
106 /*
107  * Notify the user when the remote send error result on ConnectRsp or ConfigRsp
108  * The parameters are:
109  *              Local CID
110  *              Error code
111  */
112 typedef void(tL2CA_ERROR_CB)(uint16_t, uint16_t);
113 
114 /* Create credit based connection request callback prototype. Parameters are
115  *              BD Address of remote
116  *              Vector of allocated local cids to accept
117  *              PSM
118  *              Peer MTU
119  *              Identifier that the remote sent
120  */
121 typedef void(tL2CA_CREDIT_BASED_CONNECT_IND_CB)(const RawAddress& bdaddr,
122                                                 std::vector<uint16_t>& lcids, uint16_t psm,
123                                                 uint16_t peer_mtu, uint8_t identifier);
124 
125 /* Collision Indication callback prototype. Used to notify upper layer that
126  * remote devices sent Credit Based Connection Request but it was rejected due
127  * to ongoing local request. Upper layer might want to sent another request when
128  * local request is completed. Parameters are:
129  *              BD Address of remote
130  */
131 typedef void(tL2CA_CREDIT_BASED_COLLISION_IND_CB)(const RawAddress& bdaddr);
132 
133 /* Credit based connection confirmation callback prototype. Parameters are
134  *              BD Address of remote
135  *              Connected Local CIDs
136  *              Peer MTU
137  *              Result - 0 = connected, non-zero means CID is not connected
138  */
139 typedef void(tL2CA_CREDIT_BASED_CONNECT_CFM_CB)(const RawAddress& bdaddr, uint16_t lcid,
140                                                 uint16_t peer_mtu, tL2CAP_LE_RESULT_CODE result);
141 
142 /* Credit based reconfiguration confirm callback prototype. Parameters are
143  *              BD Address of remote
144  *              Local CID assigned to the connection
145  *              Flag indicating if this is local or peer configuration
146  *              Pointer to configuration info
147  */
148 typedef void(tL2CA_CREDIT_BASED_RECONFIG_COMPLETED_CB)(const RawAddress& bdaddr, uint16_t lcid,
149                                                        bool is_local_cfg,
150                                                        tL2CAP_LE_CFG_INFO* p_cfg);
151 
152 /* Define the structure that applications use to register with
153  * L2CAP. This structure includes callback functions. All functions
154  * MUST be provided, with the exception of the "connect pending"
155  * callback and "congestion status" callback.
156  */
157 struct tL2CAP_APPL_INFO {
158   tL2CA_CONNECT_IND_CB* pL2CA_ConnectInd_Cb;
159   tL2CA_CONNECT_CFM_CB* pL2CA_ConnectCfm_Cb;
160   tL2CA_CONFIG_IND_CB* pL2CA_ConfigInd_Cb;
161   tL2CA_CONFIG_CFM_CB* pL2CA_ConfigCfm_Cb;
162   tL2CA_DISCONNECT_IND_CB* pL2CA_DisconnectInd_Cb;
163   tL2CA_DISCONNECT_CFM_CB* pL2CA_DisconnectCfm_Cb;
164   tL2CA_DATA_IND_CB* pL2CA_DataInd_Cb;
165   tL2CA_CONGESTION_STATUS_CB* pL2CA_CongestionStatus_Cb;
166   tL2CA_TX_COMPLETE_CB* pL2CA_TxComplete_Cb;
167   tL2CA_ERROR_CB* pL2CA_Error_Cb;
168   tL2CA_CREDIT_BASED_CONNECT_IND_CB* pL2CA_CreditBasedConnectInd_Cb;
169   tL2CA_CREDIT_BASED_CONNECT_CFM_CB* pL2CA_CreditBasedConnectCfm_Cb;
170   tL2CA_CREDIT_BASED_RECONFIG_COMPLETED_CB* pL2CA_CreditBasedReconfigCompleted_Cb;
171   tL2CA_CREDIT_BASED_COLLISION_IND_CB* pL2CA_CreditBasedCollisionInd_Cb;
172 };
173 
174 /*******************************************************************************
175  *
176  *                      Fixed Channel callback prototypes
177  *
178  ******************************************************************************/
179 
180 /* Fixed channel connected and disconnected. Parameters are
181  *      channel
182  *      BD Address of remote
183  *      true if channel is connected, false if disconnected
184  *      Reason for connection failure
185  *      transport : physical transport, BR/EDR or LE
186  */
187 typedef void(tL2CA_FIXED_CHNL_CB)(uint16_t, const RawAddress&, bool, uint16_t, tBT_TRANSPORT);
188 
189 /* Signalling data received. Parameters are
190  *      channel
191  *      BD Address of remote
192  *      Pointer to buffer with data
193  */
194 typedef void(tL2CA_FIXED_DATA_CB)(uint16_t, const RawAddress&, BT_HDR*);
195 
196 /* Congestion status callback protype. This callback is optional. If
197  * an application tries to send data when the transmit queue is full,
198  * the data will anyways be dropped. The parameter is:
199  *      remote BD_ADDR
200  *      true if congested, false if uncongested
201  */
202 typedef void(tL2CA_FIXED_CONGESTION_STATUS_CB)(const RawAddress&, bool);
203 
204 /* Fixed channel registration info (the callback addresses and channel config)
205  */
206 struct tL2CAP_FIXED_CHNL_REG {
207   tL2CA_FIXED_CHNL_CB* pL2CA_FixedConn_Cb;
208   tL2CA_FIXED_DATA_CB* pL2CA_FixedData_Cb;
209   tL2CA_FIXED_CONGESTION_STATUS_CB* pL2CA_FixedCong_Cb;
210 
211   uint16_t default_idle_tout;
212   tL2CA_TX_COMPLETE_CB* pL2CA_FixedTxComplete_Cb; /* fixed channel tx complete callback */
213 };
214 
215 /*******************************************************************************
216  *
217  *                      Fixed Channel callback prototypes
218  *
219  ******************************************************************************/
220 
221 /* Fixed channel connected and disconnected. Parameters are
222  *      channel
223  *      BD Address of remote
224  *      true if channel is connected, false if disconnected
225  *      Reason for connection failure
226  *      transport : physical transport, BR/EDR or LE
227  */
228 typedef void(tL2CA_FIXED_CHNL_CB)(uint16_t, const RawAddress&, bool, uint16_t, tBT_TRANSPORT);
229 
230 /* Signalling data received. Parameters are
231  *      channel
232  *      BD Address of remote
233  *      Pointer to buffer with data
234  */
235 typedef void(tL2CA_FIXED_DATA_CB)(uint16_t, const RawAddress&, BT_HDR*);
236 
237 /* Congestion status callback protype. This callback is optional. If
238  * an application tries to send data when the transmit queue is full,
239  * the data will anyways be dropped. The parameter is:
240  *      remote BD_ADDR
241  *      true if congested, false if uncongested
242  */
243 typedef void(tL2CA_FIXED_CONGESTION_STATUS_CB)(const RawAddress&, bool);
244 
245 /* Fixed channel registration info (the callback addresses and channel config)
246  */
247 namespace bluetooth {
248 namespace stack {
249 namespace l2cap {
250 
251 class Interface {
252 public:
253   virtual ~Interface() = default;
254 
255   /*******************************************************************************
256    **
257    ** Function         L2CA_Register
258    **
259    ** Description      Register for L2CAP a PSM service.
260    **
261    ** Parameters:      psm: L2cap PSM service to register
262    **                  p_cb_info: Set of l2cap callbacks
263    **                  enable_snoop: Enable to disable snooping on this PSM
264    **                  p_ertm_info:
265    **                  my_mtu:
266    **                  required_remote_mtu:
267    **                  sec_level: Security requirements for connection
268    **
269    ** Returns          PSM to use or zero if error. Typically, the PSM returned
270    **                  is the same as was passed in, but for an outgoing-only
271    **                  connection to a dynamic PSM, a "virtual" PSM is returned
272    **                  and should be used in the calls to L2CA_ConnectReq() and
273    **                  BTM_SetSecurityLevel().
274    **
275    ******************************************************************************/
276   virtual uint16_t L2CA_Register(uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info, bool enable_snoop,
277                                  tL2CAP_ERTM_INFO* p_ertm_info, uint16_t my_mtu,
278                                  uint16_t required_remote_mtu, uint16_t sec_level) = 0;
279   virtual uint16_t L2CA_RegisterWithSecurity(uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
280                                              bool enable_snoop, tL2CAP_ERTM_INFO* p_ertm_info,
281                                              uint16_t my_mtu, uint16_t required_remote_mtu,
282                                              uint16_t sec_level) = 0;
283 
284   /*******************************************************************************
285    **
286    ** Function         L2CA_Deregister
287    **
288    ** Description      Other layers call this function to deregister for L2CAP
289    **                  services.
290    **
291    ** Parameters:      psm: L2cap PSM value to deregister
292    **
293    ** Returns          void
294    **
295    ******************************************************************************/
296   virtual void L2CA_Deregister(uint16_t psm) = 0;
297 
298   /*******************************************************************************
299    **
300    ** Function         L2CA_AllocateLePSM
301    **
302    ** Description      Find an unused LE PSM for an L2CAP service.
303    **
304    ** Returns          LE_PSM to use if success. Otherwise returns 0.
305    **
306    ******************************************************************************/
307   virtual uint16_t L2CA_AllocateLePSM(void) = 0;
308 
309   /*******************************************************************************
310    **
311    ** Function         L2CA_FreeLePSM
312    **
313    ** Description      Free an assigned LE PSM.
314    **
315    ** Parameters:      psm: L2cap PSM value to free.
316    **
317    ** Returns          void
318    **
319    ******************************************************************************/
320   virtual void L2CA_FreeLePSM(uint16_t psm) = 0;
321 
322   /*******************************************************************************
323    **
324    ** Function         L2CA_ConnectReq
325    **
326    ** Description      Create an L2CAP connection to a target device requesting
327    **                  the PSM service.
328    **                  Note that the connection is not established at this time,
329    **                  but connection establishment gets started. The callback
330    **                  will be invoked when connection establishes or fails.
331    **
332    ** Parameters:      psm: L2cap PSM on remote to request connection.
333    **                  bd_addr: Remote address of peer connection device.
334    **                  sec_level: Security requirements for connection.
335    **
336    ** Returns          Local CID of the connection, or 0 if it failed to
337    **                  start
338    **
339    ******************************************************************************/
340   virtual uint16_t L2CA_ConnectReq(uint16_t psm, const RawAddress& p_bd_addr) = 0;
341   virtual uint16_t L2CA_ConnectReqWithSecurity(uint16_t psm, const RawAddress& p_bd_addr,
342                                                uint16_t sec_level) = 0;
343 
344   /*******************************************************************************
345    **
346    ** Function         L2CA_RegisterLECoc
347    **
348    ** Description      Register for L2CAP Connection Oriented Channel.
349    **
350    ** Parameters:      psm: L2cap PSM service to register
351    **                  p_cb_info: Set of l2cap callbacks
352    **                  sec_level: Security requirements for connection
353    **                  cfg: Le configuration info.
354    **
355    ** Returns          PSM to use or zero if error. Typically, the PSM returned
356    **                  is the same as was passed in, but for an outgoing-only
357    **                  connection to a dynamic PSM, a "virtual" PSM is returned
358    **                  and should be used in the calls to L2CA_ConnectLECocReq()
359    **                  and BTM_SetSecurityLevel().
360    **
361    ******************************************************************************/
362   virtual uint16_t L2CA_RegisterLECoc(uint16_t psm, const tL2CAP_APPL_INFO& p_cb_info,
363                                       uint16_t sec_level, tL2CAP_LE_CFG_INFO cfg) = 0;
364 
365   /*******************************************************************************
366    **
367    ** Function         L2CA_DeregisterLECoc
368    **
369    ** Description      Other layers call this function to deregister for L2CAP
370    **                  Connection Oriented Channel.
371    **
372    ** Parameters:      psm: L2cap PSM service to deregister
373    **
374    ** Returns          void
375    **
376    ******************************************************************************/
377   virtual void L2CA_DeregisterLECoc(uint16_t psm) = 0;
378 
379   /*******************************************************************************
380    **
381    ** Function         L2CA_ConnectLECocReq
382    **
383    ** Description      Higher layers call this function to create an L2CAP LE
384    **                  COC. Note that the connection is not established at this
385    **                  time, but connection establishment gets started. The
386    **                  callback will be invoked when connection establishes or
387    **                  fails.
388    **
389    ** Parameters:      psm: L2cap PSM service to register
390    **                  bd_addr: Peer bluetooth device address
391    **                  p_cfg: Peer le configuration info
392    **                  sec_level: Security requirements for connection
393    **
394    ** Returns          the CID of the connection, or 0 if it failed to start
395    **
396    ******************************************************************************/
397   virtual uint16_t L2CA_ConnectLECocReq(uint16_t psm, const RawAddress& p_bd_addr,
398                                         tL2CAP_LE_CFG_INFO* p_cfg, uint16_t sec_level) = 0;
399 
400   /*******************************************************************************
401    **
402    ** Function         L2CA_ConnectCreditBasedReq
403    **
404    ** Description      With this function L2CAP will initiate setup of up to 5
405    **                  credit based connections for given psm using provided
406    **                  configuration. L2CAP will notify user on the connection
407    **                  result, by calling pL2CA_CreditBasedConnectCfm_Cb for
408    **                  each cid with a result.
409    **
410    ** Parameters:      psm: PSM of peer service for connection
411    **                  bd_addr: Peer bluetooth device address
412    **                  p_cfg: Peer le configuration info
413    **
414    ** Returns          Local cids allocated for the connection
415    **
416    ******************************************************************************/
417   virtual std::vector<uint16_t> L2CA_ConnectCreditBasedReq(uint16_t psm,
418                                                            const RawAddress& p_bd_addr,
419                                                            tL2CAP_LE_CFG_INFO* p_cfg) = 0;
420 
421   /*******************************************************************************
422    **
423    ** Function         L2CA_GetPeerLECocCredit
424    **
425    ** Description      Get peers current credit for LE Connection Oriented
426    **                  Channel.
427    **
428    ** Parameters:      bd_addr: Peer bluetooth device address
429    **                  lcid: Local l2cap channel id
430    **
431    ** Returns          Number of the peer current credit
432    **
433    ******************************************************************************/
434   virtual uint16_t L2CA_GetPeerLECocCredit(const RawAddress& bd_addr, uint16_t lcid) = 0;
435 
436   /*******************************************************************************
437    **
438    ** Function         L2CA_ReconfigCreditBasedConnsReq
439    **
440    ** Description      Start reconfigure procedure on Connection Oriented
441    **                  Channel.
442    **
443    ** Parameters:      bd_addr: Peer bluetooth device address
444    **                  lcids: Local channel ids for reconfiguration
445    **                  p_cfg: Peer le configuration info
446    **
447    ** Returns          true if peer is connected
448    **
449    ******************************************************************************/
450   virtual bool L2CA_ReconfigCreditBasedConnsReq(const RawAddress& bd_addr,
451                                                 std::vector<uint16_t>& lcids,
452                                                 tL2CAP_LE_CFG_INFO* p_cfg) = 0;
453 
454   /*******************************************************************************
455    **
456    ** Function         L2CA_ConnectCreditBasedRsp
457    **
458    ** Description      Response for the pL2CA_CreditBasedConnectInd_Cb which is
459    **                  the indication for peer requesting credit based
460    **                  connection.
461    **
462    ** Parameters:      bd_addr: Peer bluetooth device address
463    **                  id:
464    **                  accepted_lcids:
465    **                  result:
466    **                  p_cfg: Peer le configuration info
467    **
468    ** Returns          true if peer is connected false otherwise
469    **
470    ******************************************************************************/
471   virtual bool L2CA_ConnectCreditBasedRsp(const RawAddress& p_bd_addr, uint8_t id,
472                                           std::vector<uint16_t>& accepted_lcids,
473                                           tL2CAP_LE_RESULT_CODE result,
474                                           tL2CAP_LE_CFG_INFO* p_cfg) = 0;
475 
476   /*******************************************************************************
477    **
478    ** Function         L2CA_SetIdleTimeoutByBdAddr
479    **
480    ** Description      Higher layers call this function to set the idle timeout
481    **                  for a connection. The "idle timeout" is the amount of
482    *time
483    **                  that a connection can remain up with no L2CAP channels on
484    **                  it. A timeout of zero means that the connection will be
485    **                  torn down immediately when the last channel is removed.
486    **                  A timeout of 0xFFFF means no timeout. Values are in
487    **                  seconds. A bd_addr is the remote BD address. If
488    **                  bd_addr = RawAddress::kAny, then the idle timeouts for
489    **                  all active l2cap links will be changed.
490    **
491    ** Parameters:      bd_addr: Peer bluetooth device address
492    **                  timeout: Timeout value for ACL link
493    **                  transport: Transport to set timeout (BR/EDR or BLE)
494    **
495    ** Returns          true if command succeeded, false if failed
496    **
497    ** NOTE             This timeout applies to all logical channels active on
498    *the
499    **                  ACL link.
500    ******************************************************************************/
501   virtual bool L2CA_SetIdleTimeoutByBdAddr(const RawAddress& bd_addr, uint16_t timeout,
502                                            tBT_TRANSPORT transport) = 0;
503 
504   /*******************************************************************************
505    **
506    ** Function         L2CA_UseLatencyMode
507    **
508    ** Description      Sets use latency mode for an ACL channel.
509    **
510    ** Parameters:      bd_addr: Peer bluetooth device address
511    **                  use_latency_mode: Enable or disable latency mode
512    **
513    ** Returns          true if command succeeded, false if failed
514    **
515    ******************************************************************************/
516   virtual bool L2CA_UseLatencyMode(const RawAddress& bd_addr, bool use_latency_mode) = 0;
517 
518   /*******************************************************************************
519    **
520    ** Function         L2CA_SetAclPriority
521    **
522    ** Description      Sets the transmission priority for an ACL channel.
523    **                  (For initial implementation only two values are valid.
524    **                  L2CAP_PRIORITY_NORMAL and L2CAP_PRIORITY_HIGH).
525    **
526    ** Parameters:      bd_addr: Peer bluetooth device address
527    **                  priority: Priority for ACL to peer
528    **
529    ** Returns          true if command succeeded, false if failed
530    **
531    ******************************************************************************/
532   virtual bool L2CA_SetAclPriority(const RawAddress& bd_addr, tL2CAP_PRIORITY priority) = 0;
533 
534   /*******************************************************************************
535    **
536    ** Function         L2CA_SetAclLatency
537    **
538    ** Description      Sets the transmission latency for a channel.
539    **
540    ** Parameters:      bd_addr: Peer bluetooth device address
541    **                  latency: Latency value for the ACL link
542    **
543    ** Returns          true if command succeeded, false if failed
544    **
545    ******************************************************************************/
546   virtual bool L2CA_SetAclLatency(const RawAddress& bd_addr, tL2CAP_LATENCY latency) = 0;
547 
548   /*******************************************************************************
549    **
550    ** Function         L2CA_GetPeerFeatures
551    **
552    ** Description      Request peer features and fixed channel map
553    **
554    ** Parameters:      bd_addr: Peer bluetooth device address
555    **                  p_ext_feat: Peer features
556    **                  p_chnl_mask: Peer fixed channel map
557    **
558    ** Returns          true if command succeeded, false if failed
559    **
560    ******************************************************************************/
561   virtual bool L2CA_GetPeerFeatures(const RawAddress& bd_addr, uint32_t* p_ext_feat,
562                                     uint8_t* p_chnl_mask) = 0;
563 
564   /*******************************************************************************
565    **
566    ** Function         L2CA_SetLeGattTimeout
567    **
568    ** Description      Higher layers call this function to set the idle timeout
569    **                  for a fixed channel. The "idle timeout" is the amount of
570    **                  time that a connection can remain up with no L2CAP
571    **                  channels on it. A timeout of zero means that the
572    **                  connection will be torn down immediately when the last
573    **                  channel is removed. A timeout of 0xFFFF means no timeout.
574    **                  Values are in seconds. A bd_addr is the remote BD
575    *address.
576    **                  If bd_addr = RawAddress::kAny, then the idle timeouts for
577    **                  all active l2cap links will be changed.
578    **
579    ** Parameters:      bd_addr: Peer bluetooth device address
580    **                  idle_tout: Idle timeout for GATT BLE connection
581    **
582    ** Returns          true if command succeeded, false if failed
583    **
584    ******************************************************************************/
585   virtual bool L2CA_SetLeGattTimeout(const RawAddress& rem_bda, uint16_t idle_tout) = 0;
586 
587   virtual bool L2CA_MarkLeLinkAsActive(const RawAddress& rem_bda) = 0;
588 
589   virtual bool L2CA_UpdateBleConnParams(const RawAddress& rem_bda, uint16_t min_int,
590                                         uint16_t max_int, uint16_t latency, uint16_t timeout,
591                                         uint16_t min_ce_len, uint16_t max_ce_len) = 0;
592 
593   /*******************************************************************************
594    **
595    ** Function         L2CA_LockBleConnParamsForServiceDiscovery
596    **
597    ** Description:     When called with lock=true, LE connection parameters will
598    **                  be locked on fastest value, and we won't accept request
599    **                  to change it from remote. When called with lock=false,
600    **                  parameters are relaxed.
601    **
602    ** Parameters:      bd_addr: Peer bluetooth device address
603    **                  lock: Determines fast or relaxed parameters
604    **
605    ** Returns          void
606    **
607    ******************************************************************************/
608   virtual void L2CA_LockBleConnParamsForServiceDiscovery(const RawAddress& rem_bda, bool lock) = 0;
609 
610   /*******************************************************************************
611    **
612    ** Function         L2CA_LockBleConnParamsForProfileConnection
613    **
614    ** Description:     When called with lock=true, LE connection parameters will
615    **                  be locked on fastest value, and we won't accept request
616    **                  to change it from remote. When called with lock=false,
617    **                  parameters are relaxed.
618    **
619    ** Parameters:      bd_addr: Peer bluetooth device address
620    **                  lock: Determines fast or relaxed parameters
621    **
622    ** Returns          void
623    **
624    ******************************************************************************/
625   virtual void L2CA_LockBleConnParamsForProfileConnection(const RawAddress& rem_bda, bool lock) = 0;
626 
627   /*******************************************************************************
628    **
629    ** Function         L2CA_Consolidate
630    **
631    ** Description      This function consolidates two addresses.
632    **
633    ** Parameters:      identity_addr: Identity address of peer
634    **                  rpa: Resolvable Private Address of peer
635    **
636    ** Returns          void
637    **
638    ******************************************************************************/
639   virtual void L2CA_Consolidate(const RawAddress& identity_addr, const RawAddress& rpa) = 0;
640   virtual tHCI_ROLE L2CA_GetBleConnRole(const RawAddress& bd_addr) = 0;
641 
642   /*******************************************************************************
643    **
644    ** Function         L2CA_IsLinkEstablished
645    **
646    ** Description      Check if a BR/EDR or BLE link to the remote device is
647    **                  established.
648    **
649    ** Parameters:      bd_addr: Peer bluetooth device address
650    **                  transport: Transport to check (BR/EDR or BLE)
651    **
652    ** Returns          true if peer is connected false otherwise
653    **
654    ******************************************************************************/
655   virtual bool L2CA_IsLinkEstablished(const RawAddress& bd_addr, tBT_TRANSPORT transport) = 0;
656 
657   /*******************************************************************************
658    **
659    ** Function         L2CA_SubrateRequest
660    **
661    ** Description      BLE Subrate request.
662    **
663    ** Parameters:      bd_addr: Peer bluetooth device address
664    **                  Power subrating parameters
665    **
666    ** Return value:    true if update started
667    **
668    ******************************************************************************/
669   virtual bool L2CA_SubrateRequest(const RawAddress& rem_bda, uint16_t subrate_min,
670                                    uint16_t subrate_max, uint16_t max_latency, uint16_t cont_num,
671                                    uint16_t timeout) = 0;
672 
673   /*******************************************************************************
674    **
675    ** Function         L2CA_GetPeerLECocConfig
676    **
677    ** Description      Request peer configuration for LE Connection Oriented
678    **                  Channel.
679    **
680    ** Parameters:      cid: Local channel id of L2CAP connection
681    **                  peer_cfg: Peer LE CoC configuration
682    **
683    ** Return value:    true if peer is connected
684    **
685    ******************************************************************************/
686   virtual bool L2CA_GetPeerLECocConfig(uint16_t cid, tL2CAP_LE_CFG_INFO* peer_cfg) = 0;
687 
688   /*******************************************************************************
689    **
690    ** Function         L2CA_DisconnectReq
691    **
692    ** Description      Higher layers call this function to disconnect a channel.
693    **
694    ** Parameters:      cid: Local channel id of L2CAP connection
695    **
696    ** Returns          true if disconnect sent, else false
697    **
698    ******************************************************************************/
699   virtual bool L2CA_DisconnectReq(uint16_t cid) = 0;
700   virtual bool L2CA_DisconnectLECocReq(uint16_t cid) = 0;
701 
702   /*******************************************************************************
703    **
704    ** Function         L2CA_DataWrite
705    **
706    ** Description      Higher layers call this function to write data.
707    **
708    ** Parameters:      cid: Local channel id of L2CAP connection
709    **                  p_data: Data to write to peer
710    **
711    ** Returns          L2CAP_DW_SUCCESS, if data accepted, else false
712    **                  L2CAP_DW_CONGESTED, if data accepted and the channel is
713    **                                      congested
714    **                  L2CAP_DW_FAILED, if error
715    **
716    ******************************************************************************/
717   virtual tL2CAP_DW_RESULT L2CA_DataWrite(uint16_t cid, BT_HDR* p_data) = 0;
718   virtual tL2CAP_DW_RESULT L2CA_LECocDataWrite(uint16_t cid, BT_HDR* p_data) = 0;
719 
720   /*******************************************************************************
721    **
722    ** Function         L2CA_GetRemoteChannelId
723    **
724    ** Description      Given a local channel identifier, |lcid|, this function
725    **                  returns the bound remote channel identifier, |rcid|. If
726    **                  |lcid| is not known or is invalid, this function returns
727    **                  false and does not modify the value pointed at by |rcid|.
728    **                  |rcid| may be NULL.
729    **
730    ** Parameters:      cid: Local channel id of L2CAP connection
731    **                  rcid: Remote channel id of L2CAP connection
732    **
733    ** Returns          true if remote cid exists, false otherwise
734    **
735    ******************************************************************************/
736   virtual bool L2CA_GetRemoteChannelId(uint16_t cid, uint16_t* rcid) = 0;
737 
738   /*******************************************************************************
739    **
740    ** Function         L2CA_FlushChannel
741    **
742    ** Description      This function flushes none, some or all buffers queued up
743    **                  for xmission for a particular CID. If called with
744    **                  L2CAP_FLUSH_CHANS_GET (0), it simply returns the number
745    **                  of buffers queued for that CID L2CAP_FLUSH_CHANS_ALL
746    **                  (0xffff) flushes all buffers.  All other values specifies
747    **                  the maximum buffers to flush.
748    **
749    ** Parameters:      lcid: Local channel id of L2CAP connection
750    **                  num_to_flush: Number of buffers to flush or
751    **                  L2CAP_FLUSH_CHANS_ALL
752    **
753    ** Returns          Number of buffers left queued for that CID
754    **
755    ******************************************************************************/
756   virtual uint16_t L2CA_FlushChannel(uint16_t cid, uint16_t num_to_flush) = 0;
757 
758   /*******************************************************************************
759    **
760    ** Function         L2CA_SetTxPriority
761    **
762    ** Description      Sets the transmission priority for a channel. (FCR Mode)
763    **
764    ** Parameters:      cid: Local channel id of L2CAP connection
765    **                  priority: L2CAP channel priority
766    **
767    ** Returns          true if a valid channel, else false
768    **
769    ******************************************************************************/
770   virtual bool L2CA_SetTxPriority(uint16_t cid, tL2CAP_CHNL_PRIORITY priority) = 0;
771 
772   /*******************************************************************************
773    *
774    * Function         L2CA_SetChnlFlushability
775    *
776    * Description      Higher layers call this function to set a channels
777    *                  flushability flags
778    *
779    ** Parameters:      cid: Local channel id of L2CAP connection
780    **                  is_flushable: Set or clear flushability flag for channel
781    * Returns          true if CID found, else false
782    *
783    ******************************************************************************/
784   virtual bool L2CA_SetChnlFlushability(uint16_t cid, bool is_flushable) = 0;
785 
786   /*******************************************************************************
787    **
788    **  Function        L2CA_RegisterFixedChannel
789    **
790    **  Description     Register a fixed channel.
791    **
792    **  Parameters:     fixed_cid: Fixed Channel #
793    **                  p_freg: Channel Callbacks and config
794    **
795    **  Return value:   true if registered OK, false otherwise
796    **
797    ******************************************************************************/
798   virtual bool L2CA_RegisterFixedChannel(uint16_t fixed_cid, tL2CAP_FIXED_CHNL_REG* p_freg) = 0;
799 
800   /*******************************************************************************
801    **
802    **  Function        L2CA_ConnectFixedChnl
803    **
804    **  Description     Connect an fixed signalling channel to a remote device.
805    **
806    **  Parameters:     fixed_cid: Fixed CID
807    **                  bd_addr: BD Address of remote
808    **
809    **  Return value:   true if connection started, false otherwise
810    **
811    ******************************************************************************/
812   virtual bool L2CA_ConnectFixedChnl(uint16_t fixed_cid, const RawAddress& bd_addr) = 0;
813 
814   /*******************************************************************************
815    **
816    **  Function        L2CA_SendFixedChnlData
817    **
818    **  Description     Write data on a fixed signalling channel.
819    **
820    **  Parameters:     fixed_cid: Fixed CID
821    **                  bd_addr: BD Address of remote
822    **                  p_buf: Pointer to data buffer
823    **
824    ** Return value     L2CAP_DW_SUCCESS, if data accepted
825    **                  L2CAP_DW_FAILED,  if error
826    **
827    ******************************************************************************/
828   virtual tL2CAP_DW_RESULT L2CA_SendFixedChnlData(uint16_t fixed_cid, const RawAddress& rem_bda,
829                                                   BT_HDR* p_buf) = 0;
830 
831   /*******************************************************************************
832    **
833    **  Function        L2CA_RemoveFixedChnl
834    **
835    **  Description     Remove a fixed channel to a remote device.
836    **
837    **  Parameters:     fixed_cid: Fixed CID
838    **                  bd_addr: Mac address of remote
839    **
840    **  Return value:   true if channel removed, false otherwise
841    **
842    ******************************************************************************/
843   virtual bool L2CA_RemoveFixedChnl(uint16_t fixed_cid, const RawAddress& rem_bda) = 0;
844 
845   /*******************************************************************************
846    **
847    ** Function         L2CA_AdjustConnectionIntervals
848    **
849    ** Description      Adjust connection intervals
850    **
851    ** Parameters:      Connection intervals
852    **
853    ** Return value:    void
854    **
855    ******************************************************************************/
856   virtual void L2CA_AdjustConnectionIntervals(uint16_t* min_interval, uint16_t* max_interval,
857                                               uint16_t floor_interval) = 0;
858 
859   /*******************************************************************************
860    **
861    ** Function         L2CA_SetEcosystemBaseInterval
862    **
863    ** Description      Sets the base ecosystem interval
864    **
865    ** Parameters:      Base interval
866    **
867    ** Return value:    void
868    **
869    ******************************************************************************/
870   virtual void L2CA_SetEcosystemBaseInterval(uint32_t base_interval) = 0;
871 
872   /*******************************************************************************
873    *
874    *  Function        L2CA_SetDefaultSubrate
875    *
876    *  Description     BLE Set Default Subrate.
877    *
878    *  Parameters:     Subrate parameters
879    *
880    *  Return value:   void
881    *
882    ******************************************************************************/
883   virtual void L2CA_SetDefaultSubrate(uint16_t subrate_min, uint16_t subrate_max,
884                                       uint16_t max_latency, uint16_t cont_num,
885                                       uint16_t timeout) = 0;
886 
887   /*******************************************************************************
888    **
889    ** Function         L2CA_SetMediaStreamChannel
890    **
891    ** Description      This function is called to set/reset the ccb of active
892    **                  media streaming channel
893    **
894    **  Parameters:     local_media_cid: The local cid provided to A2DP to be
895    **                    used for streaming
896    **                  status: The status of media streaming on this channel
897    **
898    ** Returns          void
899    **
900    *******************************************************************************/
901   virtual void L2CA_SetMediaStreamChannel(uint16_t local_media_cid, bool status) = 0;
902 
903   /*******************************************************************************
904    **
905    ** Function         L2CA_isMediaChannel
906    **
907    ** Description      This function returns if the channel id passed as
908    **                  parameter is an A2DP streaming channel
909    **
910    **  Parameters:     handle: Connection handle with the remote device
911    **                  channel_id: Channel ID
912    **                  is_local_cid: Signifies if the channel id passed is local
913    **                    cid or remote cid (true if local, remote otherwise)
914    **
915    ** Returns          bool
916    **
917    *******************************************************************************/
918   virtual bool L2CA_isMediaChannel(uint16_t handle, uint16_t channel_id, bool is_local_cid) = 0;
919 
920   /*******************************************************************************
921    **
922    ** Function         L2CA_GetAclHandle
923    **
924    ** Description      Given a local channel identifier, |lcid|, this function
925    **                  returns the handle of the corresponding ACL connection, |acl_handle|. If
926    **                  |lcid| is not known or is invalid, this function returns false and does not
927    **                  modify the value pointed at by |acl_handle|.
928    **
929    ** Parameters:      lcid: Local CID
930    **                  acl_handle: Pointer to ACL handle must NOT be nullptr
931    **
932    ** Returns          true if acl_handle lookup was successful
933    **
934    ******************************************************************************/
935   virtual bool L2CA_GetAclHandle(uint16_t lcid, uint16_t* acl_handle) = 0;
936 };
937 
938 Interface& get_interface();
939 
940 }  // namespace l2cap
941 }  // namespace stack
942 }  // namespace bluetooth
943