Bluedroid L2CAP 链路限制总结

问题现象:
蓝牙性能极限测试,连接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: 2
10-12 19:46:10.113  4512  4580 I bt_att  : GATT_Connect gatt_if=3
10-12 19:46:10.113  4512  4580 D bt_att  : gatt_get_ch_state: ch_state=0
10-12 19:46:10.113  4512  4580 D bt_att  : gatt_set_ch_state: old=0 new=2
10-12 19:46:10.113  4512  4580 I bt_l2cap: L2CA_ConnectFixedChnl() CID: 0x0004  BDA: d86869f64fcb
10-12 19:46:10.113  4512  4580 W bt_l2cap: L2CA_ConnectFixedChnl(0x0004) - no LCB
10-12 19:46:10.113  4512  4580 E bt_att  : gatt_connect failed
10-12 19:46:10.113  4512  4560 I bt_btif : btif_dm_upstreams_cback  ev: BTA_DM_AUTH_CMPL_EVT
10-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,这样后续才能有新设备可连接。

你可能感兴趣的:(android,bluetooth)