27
27
#include "l2cap_internal.h"
28
28
29
29
#define LE_CHAN_RTX (_w ) CONTAINER_OF(_w, struct bt_l2cap_le_chan, chan.rtx_work)
30
- #define CHAN_RX (_w ) CONTAINER_OF(_w, struct bt_l2cap_chan , rx_work)
30
+ #define CHAN_RX (_w ) CONTAINER_OF(_w, struct bt_l2cap_le_chan , rx_work)
31
31
32
32
#define L2CAP_LE_MIN_MTU 23
33
33
@@ -221,8 +221,6 @@ void bt_l2cap_chan_set_state(struct bt_l2cap_chan *chan,
221
221
222
222
void bt_l2cap_chan_del (struct bt_l2cap_chan * chan )
223
223
{
224
- struct net_buf * buf ;
225
-
226
224
BT_DBG ("conn %p chan %p" , chan -> conn , chan );
227
225
228
226
if (!chan -> conn ) {
@@ -242,11 +240,6 @@ void bt_l2cap_chan_del(struct bt_l2cap_chan *chan)
242
240
chan -> psm = 0U ;
243
241
#endif
244
242
245
- /* Remove buffers on the RX queue */
246
- while ((buf = net_buf_get (& chan -> rx_queue , K_NO_WAIT ))) {
247
- net_buf_unref (buf );
248
- }
249
-
250
243
if (chan -> destroy ) {
251
244
chan -> destroy (chan );
252
245
}
@@ -262,19 +255,22 @@ static void l2cap_rtx_timeout(struct k_work *work)
262
255
bt_l2cap_chan_del (& chan -> chan );
263
256
}
264
257
265
- static void l2cap_chan_recv (struct bt_l2cap_chan * chan , struct net_buf * buf );
258
+ #if defined(CONFIG_BT_L2CAP_DYNAMIC_CHANNEL )
259
+ static void l2cap_chan_le_recv (struct bt_l2cap_le_chan * chan ,
260
+ struct net_buf * buf );
266
261
267
262
static void l2cap_rx_process (struct k_work * work )
268
263
{
269
- struct bt_l2cap_chan * chan = CHAN_RX (work );
264
+ struct bt_l2cap_le_chan * ch = CHAN_RX (work );
270
265
struct net_buf * buf ;
271
266
272
- while ((buf = net_buf_get (& chan -> rx_queue , K_NO_WAIT ))) {
273
- BT_DBG ("chan %p buf %p" , chan , buf );
274
- l2cap_chan_recv ( chan , buf );
267
+ while ((buf = net_buf_get (& ch -> rx_queue , K_NO_WAIT ))) {
268
+ BT_DBG ("ch %p buf %p" , ch , buf );
269
+ l2cap_chan_le_recv ( ch , buf );
275
270
net_buf_unref (buf );
276
271
}
277
272
}
273
+ #endif /* CONFIG_BT_L2CAP_DYNAMIC_CHANNEL */
278
274
279
275
void bt_l2cap_chan_add (struct bt_conn * conn , struct bt_l2cap_chan * chan ,
280
276
bt_l2cap_chan_destroy_t destroy )
@@ -304,15 +300,16 @@ static bool l2cap_chan_add(struct bt_conn *conn, struct bt_l2cap_chan *chan,
304
300
}
305
301
306
302
k_delayed_work_init (& chan -> rtx_work , l2cap_rtx_timeout );
307
- k_work_init (& chan -> rx_work , l2cap_rx_process );
308
- k_fifo_init (& chan -> rx_queue );
309
303
310
304
bt_l2cap_chan_add (conn , chan , destroy );
311
305
312
- if (IS_ENABLED (CONFIG_BT_L2CAP_DYNAMIC_CHANNEL ) &&
313
- L2CAP_LE_CID_IS_DYN (ch -> rx .cid )) {
306
+ #if defined(CONFIG_BT_L2CAP_DYNAMIC_CHANNEL )
307
+ if (L2CAP_LE_CID_IS_DYN (ch -> rx .cid )) {
308
+ k_work_init (& ch -> rx_work , l2cap_rx_process );
309
+ k_fifo_init (& ch -> rx_queue );
314
310
bt_l2cap_chan_set_state (chan , BT_L2CAP_CONNECT );
315
311
}
312
+ #endif /* CONFIG_BT_L2CAP_DYNAMIC_CHANNEL */
316
313
317
314
return true;
318
315
}
@@ -759,6 +756,11 @@ static void l2cap_chan_destroy(struct bt_l2cap_chan *chan)
759
756
net_buf_unref (buf );
760
757
}
761
758
759
+ /* Remove buffers on the RX queue */
760
+ while ((buf = net_buf_get (& ch -> rx_queue , K_NO_WAIT ))) {
761
+ net_buf_unref (buf );
762
+ }
763
+
762
764
/* Destroy segmented SDU if it exists */
763
765
if (ch -> _sdu ) {
764
766
net_buf_unref (ch -> _sdu );
@@ -1660,7 +1662,8 @@ static void l2cap_chan_recv(struct bt_l2cap_chan *chan, struct net_buf *buf)
1660
1662
struct bt_l2cap_le_chan * ch = BT_L2CAP_LE_CHAN (chan );
1661
1663
1662
1664
if (L2CAP_LE_CID_IS_DYN (ch -> rx .cid )) {
1663
- l2cap_chan_le_recv (ch , buf );
1665
+ net_buf_put (& ch -> rx_queue , net_buf_ref (buf ));
1666
+ k_work_submit (& ch -> rx_work );
1664
1667
return ;
1665
1668
}
1666
1669
#endif /* CONFIG_BT_L2CAP_DYNAMIC_CHANNEL */
@@ -1670,13 +1673,6 @@ static void l2cap_chan_recv(struct bt_l2cap_chan *chan, struct net_buf *buf)
1670
1673
chan -> ops -> recv (chan , buf );
1671
1674
}
1672
1675
1673
- static void l2cap_chan_recv_queue (struct bt_l2cap_chan * chan ,
1674
- struct net_buf * buf )
1675
- {
1676
- net_buf_put (& chan -> rx_queue , buf );
1677
- k_work_submit (& chan -> rx_work );
1678
- }
1679
-
1680
1676
void bt_l2cap_recv (struct bt_conn * conn , struct net_buf * buf )
1681
1677
{
1682
1678
struct bt_l2cap_hdr * hdr ;
@@ -1707,7 +1703,8 @@ void bt_l2cap_recv(struct bt_conn *conn, struct net_buf *buf)
1707
1703
return ;
1708
1704
}
1709
1705
1710
- l2cap_chan_recv_queue (chan , buf );
1706
+ l2cap_chan_recv (chan , buf );
1707
+ net_buf_unref (buf );
1711
1708
}
1712
1709
1713
1710
int bt_l2cap_update_conn_param (struct bt_conn * conn ,
0 commit comments