Bluetooth: l2cap: Decouple segmentation size

L2CAP Tx segmentation used BT_L2CAP_RX_MTU value which is
the value used by fixed channel protocols. Decoupling the
buffer size provides the opportunity to reduce RAM used per
connection.

Change-id: Id064f9b2e3f02073402815d09c3ea13a35df2a6c
Signed-off-by: Vinayak Chettimada <vinayak.kariappa.chettimada@nordicsemi.no>
This commit is contained in:
Vinayak Chettimada 2017-04-25 14:37:15 +02:00 committed by Anas Nashif
commit 27bad8743f
2 changed files with 15 additions and 9 deletions

View file

@ -267,6 +267,15 @@ config BLUETOOTH_L2CAP_DYNAMIC_CHANNEL
This option enables support for LE Connection oriented Channels, This option enables support for LE Connection oriented Channels,
allowing the creation of dynamic L2CAP Channels. allowing the creation of dynamic L2CAP Channels.
config BLUETOOTH_L2CAP_DYN_CHAN_BUF_SIZE
int "L2CAP Dynamic channel segment buffer size"
depends on BLUETOOTH_L2CAP_DYNAMIC_CHANNEL
range 23 BLUETOOTH_L2CAP_TX_MTU
default 23
help
Size of the buffer used for segmentation of SDU when application
supplied buffer does not have sufficient headroom.
config BLUETOOTH_GATT_DYNAMIC_DB config BLUETOOTH_GATT_DYNAMIC_DB
bool "GATT dynamic database support" bool "GATT dynamic database support"
help help

View file

@ -41,6 +41,9 @@
#define L2CAP_CONN_TIMEOUT K_SECONDS(40) #define L2CAP_CONN_TIMEOUT K_SECONDS(40)
#define L2CAP_DISC_TIMEOUT K_SECONDS(1) #define L2CAP_DISC_TIMEOUT K_SECONDS(1)
static sys_slist_t le_channels;
#if defined(CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL)
/* Size of MTU is based on the maximum amount of data the buffer can hold /* Size of MTU is based on the maximum amount of data the buffer can hold
* excluding ACL and driver headers. * excluding ACL and driver headers.
*/ */
@ -48,20 +51,14 @@
/* For now use MPS - SDU length to disable segmentation */ /* For now use MPS - SDU length to disable segmentation */
#define L2CAP_MAX_LE_MTU (L2CAP_MAX_LE_MPS - 2) #define L2CAP_MAX_LE_MTU (L2CAP_MAX_LE_MPS - 2)
#if defined(CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL)
#define l2cap_lookup_ident(conn, ident) __l2cap_lookup_ident(conn, ident, false) #define l2cap_lookup_ident(conn, ident) __l2cap_lookup_ident(conn, ident, false)
#define l2cap_remove_ident(conn, ident) __l2cap_lookup_ident(conn, ident, true) #define l2cap_remove_ident(conn, ident) __l2cap_lookup_ident(conn, ident, true)
#endif /* CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL */
static sys_slist_t le_channels;
#if defined(CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL)
static sys_slist_t servers; static sys_slist_t servers;
#endif /* CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL */
#if defined(CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL)
/* Pool for outgoing LE data packets, MTU is 23 */ /* Pool for outgoing LE data packets, MTU is 23 */
NET_BUF_POOL_DEFINE(le_data_pool, CONFIG_BLUETOOTH_MAX_CONN, NET_BUF_POOL_DEFINE(le_l2cap_dyn_chan_pool, CONFIG_BLUETOOTH_MAX_CONN,
BT_L2CAP_BUF_SIZE(L2CAP_MAX_LE_MPS), BT_L2CAP_BUF_SIZE(CONFIG_BLUETOOTH_L2CAP_DYN_CHAN_BUF_SIZE),
BT_BUF_USER_DATA_MIN, NULL); BT_BUF_USER_DATA_MIN, NULL);
#endif /* CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL */ #endif /* CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL */
@ -1016,7 +1013,7 @@ static inline struct net_buf *l2cap_alloc_seg(struct net_buf *buf)
} }
} }
return bt_l2cap_create_pdu(&le_data_pool, 0); return bt_l2cap_create_pdu(&le_l2cap_dyn_chan_pool, 0);
} }
static struct net_buf *l2cap_chan_create_seg(struct bt_l2cap_le_chan *ch, static struct net_buf *l2cap_chan_create_seg(struct bt_l2cap_le_chan *ch,