Bluedroid L2CAP 链路限制总结

来源:互联网 发布:淘宝最牛卖家骂人 店名 编辑:程序博客网 时间:2024/05/21 16:56

问题现象:
蓝牙性能极限测试,连接3条Classic和4条BLE后,无法再连接更多的classic或ble设备,提示连接失败。

LOG分析

10-12 19:46:10.113  4512  4560 I BluetoothBondStateMachine: bondStateChangeCallback: Status: 0 Address: D8:68:69:F6:4F:CB(Designer Mouse) newState: 210-12 19:46:10.113  4512  4580 I bt_att  : GATT_Connect gatt_if=310-12 19:46:10.113  4512  4580 D bt_att  : gatt_get_ch_state: ch_state=010-12 19:46:10.113  4512  4580 D bt_att  : gatt_set_ch_state: old=0 new=210-12 19:46:10.113  4512  4580 I bt_l2cap: L2CA_ConnectFixedChnl() CID: 0x0004  BDA: d86869f64fcb10-12 19:46:10.113  4512  4580 W bt_l2cap: L2CA_ConnectFixedChnl(0x0004) - no LCB10-12 19:46:10.113  4512  4580 E bt_att  : gatt_connect failed10-12 19:46:10.113  4512  4560 I bt_btif : btif_dm_upstreams_cback  ev: BTA_DM_AUTH_CMPL_EVT10-12 19:46:10.113  4512  4580 E bt_btif : Connection open failure

连接新设备时,GATT发起SDP操作,需要建立l2cap channel。Bluetooth 协议栈分配lcb。由于lcb分配失败,导致l2cap channel建立失败,整个连接断开。

Code 分析

**  Description     Connect an fixed signalling channel to a remote device.BOOLEAN L2CA_ConnectFixedChnl (UINT16 fixed_cid, BD_ADDR rem_bda) {    // No link. Get an LCB and start link establishment    if ((p_lcb = l2cu_allocate_lcb (rem_bda, FALSE, transport)) == NULL)    {        L2CAP_TRACE_WARNING ("%s(0x%04x) - no LCB", __func__, fixed_cid);        return FALSE;    }}tL2C_LCB *l2cu_allocate_lcb (BD_ADDR p_bd_addr, BOOLEAN is_bonding, tBT_TRANSPORT transport){    for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) {    }    /* If here, no free LCB found */    return (NULL);}/* The maximum number of simultaneous links that L2CAP can support. */#ifndef MAX_ACL_CONNECTIONS#define MAX_L2CAP_LINKS             7#else#define MAX_L2CAP_LINKS             MAX_ACL_CONNECTIONS#endif

Android Bluedroid 对可用L2CAP最大支持为7个。超过7个将不再分配。
Android M 与Android N都有相同的链路上线设置,均为7个。

BUG 总结
由于Android源生设计,规定同时支持的L2CAP最大link数为7。测试过程中,已经连接7个设备(3 classic和4个ble)。7条linck均正在被使用,所以无法与新设备进行连接。如果连接中途有设备断连,l2cap将释放占用的link,这样后续才能有新设备可连接。

0 0