Zephyr API Documentation 4.5.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
l2cap.h
Go to the documentation of this file.
1
4
5/*
6 * Copyright (c) 2015-2016 Intel Corporation
7 * Copyright (c) 2023 Nordic Semiconductor
8 *
9 * SPDX-License-Identifier: Apache-2.0
10 */
11#ifndef ZEPHYR_INCLUDE_BLUETOOTH_L2CAP_H_
12#define ZEPHYR_INCLUDE_BLUETOOTH_L2CAP_H_
13
22
23#include <stddef.h>
24#include <stdint.h>
25
29#include <zephyr/kernel.h>
30#include <zephyr/net_buf.h>
31#include <zephyr/sys/atomic.h>
32#include <zephyr/sys/slist.h>
33#include <zephyr/sys/util.h>
34#include <sys/types.h>
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
41#define BT_L2CAP_HDR_SIZE 4
42
44#define BT_L2CAP_TX_MTU (CONFIG_BT_L2CAP_TX_MTU)
45
47#define BT_L2CAP_RX_MTU (CONFIG_BT_BUF_ACL_RX_SIZE - BT_L2CAP_HDR_SIZE)
48
56#define BT_L2CAP_BUF_SIZE(mtu) BT_BUF_ACL_SIZE(BT_L2CAP_HDR_SIZE + (mtu))
57
59#define BT_L2CAP_SDU_HDR_SIZE 2
60
69#define BT_L2CAP_SDU_TX_MTU (BT_L2CAP_TX_MTU - BT_L2CAP_SDU_HDR_SIZE)
70
81#define BT_L2CAP_SDU_RX_MTU (BT_L2CAP_RX_MTU - BT_L2CAP_SDU_HDR_SIZE)
82
92#define BT_L2CAP_SDU_BUF_SIZE(mtu) BT_L2CAP_BUF_SIZE(BT_L2CAP_SDU_HDR_SIZE + (mtu))
93
103#define BT_L2CAP_ECRED_MIN_MTU 64
104
114#define BT_L2CAP_ECRED_MIN_MPS 64
115
121#define BT_L2CAP_MAX_MTU UINT16_MAX
122
128#define BT_L2CAP_MAX_MPS 65533
129
142#define BT_L2CAP_ECRED_CHAN_MAX_PER_REQ 5
143
151
153#define BT_L2CAP_CID_BR_SIG 0x0001
155#define BT_L2CAP_CID_ATT 0x0004
157#define BT_L2CAP_CID_LE_SIG 0x0005
159#define BT_L2CAP_CID_SMP 0x0006
161#define BT_L2CAP_CID_BR_SMP 0x0007
162
164
165struct bt_l2cap_chan;
166
172typedef void (*bt_l2cap_chan_destroy_t)(struct bt_l2cap_chan *chan);
173
199
204
211
214
215 /* Total number of status - must be at the end of the enum */
218
230
242
260
263
297#if defined(CONFIG_BT_L2CAP_DYNAMIC_CHANNEL)
299 struct net_buf *_sdu;
300 uint16_t _sdu_len;
301#if defined(CONFIG_BT_L2CAP_SEG_RECV)
302 uint16_t _sdu_len_done;
303#endif /* CONFIG_BT_L2CAP_SEG_RECV */
304
305 struct k_work rx_work;
306 struct k_fifo rx_queue;
307
310 uint16_t psm;
312 uint8_t ident;
314 uint8_t pending_req;
315 bt_security_t required_sec_level;
316
317 /* Response Timeout eXpired (RTX) timer */
318 struct k_work_delayable rtx_work;
319 struct k_work_sync rtx_sync;
320#endif
321
323 sys_snode_t _pdu_ready;
325 size_t _pdu_remaining;
326};
327
337#define BT_L2CAP_LE_CHAN(_ch) CONTAINER_OF(_ch, struct bt_l2cap_le_chan, chan)
338
351
386 int (*accept)(struct bt_conn *conn, struct bt_l2cap_chan **chan);
387};
388
402#define BT_L2CAP_FIXED_CHANNEL_DEFINE(_name) \
403 static const STRUCT_SECTION_ITERABLE(bt_l2cap_fixed_chan, \
404 _CONCAT(bt_l2cap_fixed_chan, _name))
405
407#define BT_L2CAP_BR_LINK_MODE_BASIC 0x00
409#define BT_L2CAP_BR_LINK_MODE_RET 0x01
411#define BT_L2CAP_BR_LINK_MODE_FC 0x02
413#define BT_L2CAP_BR_LINK_MODE_ERET 0x03
415#define BT_L2CAP_BR_LINK_MODE_STREAM 0x04
416
418#define BT_L2CAP_BR_FCS_NO 0x00
420#define BT_L2CAP_BR_FCS_16BIT 0x01
421
428#if defined(CONFIG_BT_L2CAP_RET_FC) || defined(__DOXYGEN__)
489#endif /* CONFIG_BT_L2CAP_RET_FC */
490};
491
515
524 /* For internal use only */
526
533
534 /* Response Timeout eXpired (RTX) timer */
537
539
541 struct k_work_delayable retry_work;
542
544
546 sys_snode_t _pdu_ready;
548 atomic_t _pdu_ready_lock;
550 sys_slist_t _pdu_tx_queue;
551
552#if defined(CONFIG_BT_L2CAP_RET_FC) || defined(__DOXYGEN__)
554 size_t _pdu_remaining;
555
557 struct net_buf *_pdu_buf;
558
560 sys_slist_t _pdu_outstanding;
561
563 struct net_buf_simple_state _pdu_state;
564
566 struct k_fifo _free_tx_win;
567
569 struct bt_l2cap_br_window tx_win[CONFIG_BT_L2CAP_MAX_WINDOW_SIZE];
570
572 struct net_buf *_sdu;
574 uint16_t _sdu_len;
575#if defined(CONFIG_BT_L2CAP_SEG_RECV) || defined(__DOXYGEN__)
576 uint16_t _sdu_len_done;
577#endif /* CONFIG_BT_L2CAP_SEG_RECV */
610
617
622#endif /* CONFIG_BT_L2CAP_RET_FC */
623};
624
645 void (*connected)(struct bt_l2cap_chan *chan);
646
655 void (*disconnected)(struct bt_l2cap_chan *chan);
656
672 void (*encrypt_change)(struct bt_l2cap_chan *chan, uint8_t hci_status);
673
685 struct net_buf *(*alloc_seg)(struct bt_l2cap_chan *chan);
686
704 struct net_buf *(*alloc_buf)(struct bt_l2cap_chan *chan);
705
728 int (*recv)(struct bt_l2cap_chan *chan, struct net_buf *buf);
729
739 void (*sent)(struct bt_l2cap_chan *chan);
740
749 void (*status)(struct bt_l2cap_chan *chan, atomic_t *status);
750
751 /* @brief Channel released callback
752 *
753 * If this callback is set it is called when the stack has release all
754 * references to the channel object.
755 */
756 void (*released)(struct bt_l2cap_chan *chan);
757
766 void (*reconfigured)(struct bt_l2cap_chan *chan);
767
768#if defined(CONFIG_BT_L2CAP_SEG_RECV) || defined(__DOXYGEN__)
800 void (*seg_recv)(struct bt_l2cap_chan *chan, size_t sdu_len,
801 off_t seg_offset, struct net_buf_simple *seg);
802#endif /* CONFIG_BT_L2CAP_SEG_RECV */
803};
804
808#define BT_L2CAP_CHAN_SEND_RESERVE (BT_L2CAP_BUF_SIZE(0))
809
813#define BT_L2CAP_SDU_CHAN_SEND_RESERVE (BT_L2CAP_SDU_BUF_SIZE(0))
814
847
850
879 int (*accept)(struct bt_conn *conn, struct bt_l2cap_server *server,
880 struct bt_l2cap_chan **chan);
881
883};
884
905
926
936
954 struct bt_l2cap_chan **chans, uint16_t psm);
955
969
1013int bt_l2cap_ecred_chan_reconfigure_explicit(struct bt_l2cap_chan **chans, size_t chan_count,
1014 uint16_t mtu, uint16_t mps);
1015
1044 uint16_t psm);
1045
1063
1116int bt_l2cap_chan_send(struct bt_l2cap_chan *chan, struct net_buf *buf);
1117
1139int bt_l2cap_chan_give_credits(struct bt_l2cap_chan *chan, uint16_t additional_credits);
1140
1154 struct net_buf *buf);
1155
1156#ifdef __cplusplus
1157}
1158#endif
1159
1163
1164#endif /* ZEPHYR_INCLUDE_BLUETOOTH_L2CAP_H_ */
Header file for the Atomic operations API.
Bluetooth data buffer API.
Bluetooth connection handling.
long atomic_t
Atomic integer variable.
Definition atomic_types.h:34
#define ATOMIC_DEFINE(name, num_bits)
Define an array of atomic variables.
Definition atomic.h:122
bt_security_t
Security level.
Definition conn.h:1201
int bt_l2cap_ecred_chan_reconfigure(struct bt_l2cap_chan **chans, uint16_t mtu)
Reconfigure Enhanced Credit Based L2CAP channels.
int bt_l2cap_server_register(struct bt_l2cap_server *server)
Register L2CAP server.
bt_l2cap_chan_status
Status of L2CAP channel.
Definition l2cap.h:201
enum bt_l2cap_chan_status bt_l2cap_chan_status_t
Status of L2CAP channel.
int bt_l2cap_chan_connect(struct bt_conn *conn, struct bt_l2cap_chan *chan, uint16_t psm)
Connect L2CAP channel.
enum bt_l2cap_chan_state bt_l2cap_chan_state_t
Life-span states of L2CAP CoC channel.
int bt_l2cap_br_server_register(struct bt_l2cap_server *server)
Register L2CAP server on BR/EDR oriented connection.
bt_l2cap_chan_state
Life-span states of L2CAP CoC channel.
Definition l2cap.h:186
int bt_l2cap_ecred_chan_reconfigure_explicit(struct bt_l2cap_chan **chans, size_t chan_count, uint16_t mtu, uint16_t mps)
Reconfigure Enhanced Credit Based L2CAP channels.
int bt_l2cap_chan_disconnect(struct bt_l2cap_chan *chan)
Disconnect L2CAP channel.
int bt_l2cap_br_server_unregister(struct bt_l2cap_server *server)
Unregister L2CAP server on BR/EDR oriented connection.
void(* bt_l2cap_chan_destroy_t)(struct bt_l2cap_chan *chan)
Channel destroy callback.
Definition l2cap.h:172
int bt_l2cap_chan_send(struct bt_l2cap_chan *chan, struct net_buf *buf)
Send data to L2CAP channel.
int bt_l2cap_chan_give_credits(struct bt_l2cap_chan *chan, uint16_t additional_credits)
Give credits to the remote.
int bt_l2cap_chan_recv_complete(struct bt_l2cap_chan *chan, struct net_buf *buf)
Complete receiving L2CAP channel data.
int bt_l2cap_ecred_chan_connect(struct bt_conn *conn, struct bt_l2cap_chan **chans, uint16_t psm)
Connect Enhanced Credit Based L2CAP channels.
@ BT_L2CAP_STATUS_SHUTDOWN
Channel shutdown status.
Definition l2cap.h:210
@ BT_L2CAP_STATUS_OUT
Channel can send at least one PDU.
Definition l2cap.h:203
@ BT_L2CAP_NUM_STATUS
Definition l2cap.h:216
@ BT_L2CAP_STATUS_ENCRYPT_PENDING
Channel encryption pending status.
Definition l2cap.h:213
@ BT_L2CAP_DISCONNECTED
Channel disconnected.
Definition l2cap.h:188
@ BT_L2CAP_CONFIG
Channel in config state, BR/EDR specific.
Definition l2cap.h:192
@ BT_L2CAP_CONNECTED
Channel ready for upper layer traffic on it.
Definition l2cap.h:194
@ BT_L2CAP_DISCONNECTING
Channel in disconnecting state.
Definition l2cap.h:196
@ BT_L2CAP_CONNECTING
Channel in connecting state.
Definition l2cap.h:190
struct _slist sys_slist_t
Single-linked list structure.
Definition slist.h:54
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:44
Public kernel APIs.
__INTPTR_TYPE__ off_t
Definition types.h:36
Buffer management.
state
Definition parser_state.h:29
Header file for the single-linked list API.
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Opaque type representing a connection to a remote device.
BREDR L2CAP Channel structure.
Definition l2cap.h:517
struct bt_l2cap_br_endpoint rx
Channel Receiving Endpoint.
Definition l2cap.h:521
atomic_t flags[1]
Definition l2cap.h:525
struct k_work_delayable rtx_work
Definition l2cap.h:535
bt_security_t required_sec_level
Definition l2cap.h:532
uint16_t psm
Remote PSM to be connected.
Definition l2cap.h:529
struct k_work_sync rtx_sync
Definition l2cap.h:536
struct bt_l2cap_chan chan
Common L2CAP channel reference object.
Definition l2cap.h:519
uint16_t retry_count
Definition l2cap.h:614
bt_l2cap_chan_state_t state
Definition l2cap.h:527
struct bt_l2cap_br_endpoint tx
Channel Transmission Endpoint.
Definition l2cap.h:523
struct k_work_delayable ret_work
Definition l2cap.h:619
uint16_t next_tx_seq
Definition l2cap.h:589
uint16_t expected_tx_seq
Definition l2cap.h:604
struct bt_l2cap_br_window tx_win[CONFIG_BT_L2CAP_MAX_WINDOW_SIZE]
Definition l2cap.h:569
uint16_t srej_save_req_seq
Definition l2cap.h:616
uint16_t buffer_seq
Definition l2cap.h:609
struct k_work_delayable monitor_work
Definition l2cap.h:621
uint8_t ident
Helps match request context during CoC.
Definition l2cap.h:531
uint16_t tx_seq
Definition l2cap.h:585
uint16_t expected_ack_seq
Definition l2cap.h:593
uint16_t req_seq
Definition l2cap.h:601
BREDR L2CAP Endpoint structure.
Definition l2cap.h:423
uint16_t max_window
Endpoint Maximum Window Size MAX supported window size is configured by <code class='doxyxref' data-...
Definition l2cap.h:470
uint16_t monitor_timeout
Endpoint Monitor Timeout The field is configured by <code class='doxyxref' data-stype='kconfig:optio...
Definition l2cap.h:462
uint8_t max_transmit
Endpoint Maximum Transmit The field is used to set the max retransmission count.
Definition l2cap.h:450
uint16_t mtu
Endpoint Maximum Transmission Unit.
Definition l2cap.h:427
uint16_t mps
Endpoint Maximum PDU payload Size.
Definition l2cap.h:464
bool extended_control
Endpoint Extended Control.
Definition l2cap.h:488
uint8_t fcs
Endpoint FCS Type The value is defined as BT_L2CAP_BR_FCS_* The default setting should be BT_L2CAP_BR...
Definition l2cap.h:481
uint16_t cid
Endpoint Channel Identifier (CID).
Definition l2cap.h:425
uint16_t ret_timeout
Endpoint Retransmission Timeout The field is configured by <code class='doxyxref' data-stype='kconfi...
Definition l2cap.h:457
uint8_t mode
Endpoint Link Mode.
Definition l2cap.h:432
bool optional
Whether Endpoint Link Mode is optional If the optional is true, the mode could be changed according t...
Definition l2cap.h:442
I-Frame transmission window for none BASIC mode L2cap connected channel.
Definition l2cap.h:493
uint8_t * data
data address
Definition l2cap.h:501
bool srej
srej flag
Definition l2cap.h:507
struct net_buf_simple_state sdu_state
Definition l2cap.h:511
uint16_t len
data len
Definition l2cap.h:499
uint8_t transmit_counter
Transmit Counter.
Definition l2cap.h:503
uint8_t sar
SAR flag.
Definition l2cap.h:505
sys_snode_t node
Definition l2cap.h:494
bool retransmit
retransmit flag
Definition l2cap.h:509
uint16_t tx_seq
tx seq
Definition l2cap.h:497
struct net_buf * sdu
Definition l2cap.h:513
L2CAP Channel operations structure.
Definition l2cap.h:637
int(* recv)(struct bt_l2cap_chan *chan, struct net_buf *buf)
Channel recv callback.
Definition l2cap.h:728
void(* encrypt_change)(struct bt_l2cap_chan *chan, uint8_t hci_status)
Channel encrypt_change callback.
Definition l2cap.h:672
void(* disconnected)(struct bt_l2cap_chan *chan)
Channel disconnected callback.
Definition l2cap.h:655
void(* connected)(struct bt_l2cap_chan *chan)
Channel connected callback.
Definition l2cap.h:645
void(* status)(struct bt_l2cap_chan *chan, atomic_t *status)
Channel status callback.
Definition l2cap.h:749
void(* released)(struct bt_l2cap_chan *chan)
Definition l2cap.h:756
void(* sent)(struct bt_l2cap_chan *chan)
Channel sent callback.
Definition l2cap.h:739
void(* seg_recv)(struct bt_l2cap_chan *chan, size_t sdu_len, off_t seg_offset, struct net_buf_simple *seg)
Handle L2CAP segments directly.
Definition l2cap.h:800
void(* reconfigured)(struct bt_l2cap_chan *chan)
Channel reconfigured callback.
Definition l2cap.h:766
L2CAP Channel structure.
Definition l2cap.h:220
struct bt_conn * conn
Channel connection reference.
Definition l2cap.h:222
sys_snode_t node
Definition l2cap.h:225
const struct bt_l2cap_chan_ops * ops
Channel operations reference.
Definition l2cap.h:224
atomic_t status[ATOMIC_BITMAP_SIZE(BT_L2CAP_NUM_STATUS)]
Definition l2cap.h:228
bt_l2cap_chan_destroy_t destroy
Definition l2cap.h:226
Fixed L2CAP Channel structure.
Definition l2cap.h:342
uint16_t cid
Channel Identifier (CID).
Definition l2cap.h:350
int(* accept)(struct bt_conn *conn, struct bt_l2cap_chan **chan)
Channel accept callback.
Definition l2cap.h:386
LE L2CAP Channel structure.
Definition l2cap.h:244
struct bt_l2cap_le_endpoint tx
Channel Transmission Endpoint.
Definition l2cap.h:271
uint16_t pending_rx_mtu
Pending RX MTU on ECFC reconfigure, used internally by stack.
Definition l2cap.h:262
struct k_fifo tx_queue
Channel Transmission queue.
Definition l2cap.h:296
struct bt_l2cap_le_endpoint rx
Channel Receiving Endpoint.
Definition l2cap.h:259
struct bt_l2cap_chan chan
Common L2CAP channel reference object.
Definition l2cap.h:246
LE L2CAP Endpoint structure.
Definition l2cap.h:232
uint16_t mtu
Endpoint Maximum Transmission Unit.
Definition l2cap.h:236
uint16_t mps
Endpoint Maximum PDU payload Size.
Definition l2cap.h:238
atomic_t credits
Endpoint credits.
Definition l2cap.h:240
uint16_t cid
Endpoint Channel Identifier (CID).
Definition l2cap.h:234
L2CAP Server structure.
Definition l2cap.h:816
uint16_t psm
Server PSM.
Definition l2cap.h:846
sys_snode_t node
Definition l2cap.h:882
bt_security_t sec_level
Required minimum security level.
Definition l2cap.h:849
int(* accept)(struct bt_conn *conn, struct bt_l2cap_server *server, struct bt_l2cap_chan **chan)
Server accept callback.
Definition l2cap.h:879
Kernel FIFO structure.
Definition kernel.h:2965
A structure used to submit work after a delay.
Definition kernel.h:4705
A structure holding internal state for a pending synchronous operation on a work item or queue.
Definition kernel.h:4800
A structure used to submit work.
Definition kernel.h:4663
Parsing state of a buffer.
Definition net_buf.h:1006
Simple network buffer representation.
Definition net_buf.h:97
Network buffer representation.
Definition net_buf.h:1062
Misc utilities.