Loading system/stack/eatt/eatt_impl.h +15 −7 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <com_android_bluetooth_flags.h> #include <map> #include <memory> #include <utility> #include <vector> #include "bind_helpers.h" Loading Loading @@ -157,13 +159,15 @@ struct eatt_impl { uint16_t max_mps = shim::GetController()->GetLeBufferSize().le_data_packet_length_; tL2CAP_LE_CFG_INFO local_coc_cfg = { .result = L2CAP_LE_RESULT_CONN_OK, .result = tL2CAP_CFG_RESULT::L2CAP_CFG_OK, .mtu = eatt_dev->rx_mtu_, .mps = eatt_dev->rx_mps_ < max_mps ? eatt_dev->rx_mps_ : max_mps, .credits = L2CA_LeCreditDefault(), }; if (!L2CA_ConnectCreditBasedRsp(bda, identifier, lcids, L2CAP_CONN_OK, &local_coc_cfg)) { if (!L2CA_ConnectCreditBasedRsp(bda, identifier, lcids, tL2CAP_LE_RESULT_CODE::L2CAP_LE_RESULT_CONN_OK, &local_coc_cfg)) { log::warn("Unable to respond L2CAP le_coc credit indication peer:{}", bda); return false; } Loading Loading @@ -415,8 +419,9 @@ struct eatt_impl { // regardless of success result, we have finished reconfiguration channel->EattChannelSetState(EattChannelState::EATT_CHANNEL_OPENED); if (p_cfg->result != L2CAP_CFG_OK) { log::info("reconfig failed lcid: 0x{:x} result: 0x{:x}", lcid, p_cfg->result); if (p_cfg->result != tL2CAP_CFG_RESULT::L2CAP_CFG_OK) { log::info("reconfig failed lcid: 0x{:x} result:{}", lcid, l2cap_cfg_result_text(p_cfg->result)); return; } Loading Loading @@ -541,7 +546,7 @@ struct eatt_impl { } tL2CAP_LE_CFG_INFO local_coc_cfg = { .result = L2CAP_LE_RESULT_CONN_OK, .result = tL2CAP_CFG_RESULT::L2CAP_CFG_OK, .mtu = eatt_dev->rx_mtu_, .mps = eatt_dev->rx_mps_, .credits = L2CA_LeCreditDefault(), Loading Loading @@ -782,7 +787,10 @@ struct eatt_impl { std::vector<uint16_t> cids = {cid}; tL2CAP_LE_CFG_INFO cfg = { .result = L2CAP_LE_RESULT_CONN_OK, .mtu = new_mtu, .mps = eatt_dev->rx_mps_}; .result = tL2CAP_CFG_RESULT::L2CAP_CFG_OK, .mtu = new_mtu, .mps = eatt_dev->rx_mps_, }; if (!L2CA_ReconfigCreditBasedConnsReq(eatt_dev->bda_, cids, &cfg)) { log::error("Could not start reconfig cid: 0x{:x} or device {}", cid, bd_addr); Loading Loading @@ -821,7 +829,7 @@ struct eatt_impl { } tL2CAP_LE_CFG_INFO cfg = { .result = L2CAP_LE_RESULT_CONN_OK, .mtu = new_mtu, .mps = eatt_dev->rx_mps_}; .result = tL2CAP_CFG_RESULT::L2CAP_CFG_OK, .mtu = new_mtu, .mps = eatt_dev->rx_mps_}; if (!L2CA_ReconfigCreditBasedConnsReq(eatt_dev->bda_, cids, &cfg)) { log::error("Could not start reconfig for device {}", bd_addr); Loading system/stack/hid/hidh_conn.cc +1 −1 Original line number Diff line number Diff line Loading @@ -285,7 +285,7 @@ static void hidh_on_l2cap_error(uint16_t l2cap_cid, uint16_t result) { hidh_conn_disconnect(dhandle); if (result != L2CAP_CFG_FAILED_NO_REASON) { if (result != static_cast<uint16_t>(tL2CAP_CFG_RESULT::L2CAP_CFG_FAILED_NO_REASON)) { #if (HID_HOST_MAX_CONN_RETRY > 0) if ((hh_cb.devices[dhandle].conn_tries <= HID_HOST_MAX_CONN_RETRY) && (result == HCI_ERR_CONNECTION_TOUT || result == HCI_ERR_UNSPECIFIED || Loading system/stack/include/l2cap_types.h +2 −2 Original line number Diff line number Diff line Loading @@ -116,7 +116,7 @@ typedef struct { * use to signify its presence or absence. */ typedef struct { uint16_t result; /* Only used in confirm messages */ tL2CAP_CFG_RESULT result; /* Only used in confirm messages */ bool mtu_present; uint16_t mtu; bool qos_present; Loading Loading @@ -150,7 +150,7 @@ uint16_t L2CA_LeCreditThreshold(); constexpr uint8_t L2CAP_CREDIT_BASED_MAX_CIDS = 5; struct tL2CAP_LE_CFG_INFO { uint16_t result{L2CAP_LE_RESULT_CONN_OK}; /* Only used in confirm messages */ tL2CAP_CFG_RESULT result{tL2CAP_CFG_RESULT::L2CAP_CFG_OK}; /* Only used in confirm messages */ uint16_t mtu{kDefaultL2capMtu}; uint16_t mps{kDefaultL2capMps}; uint16_t credits{L2CA_LeCreditDefault()}; Loading system/stack/include/l2cdefs.h +13 −2 Original line number Diff line number Diff line Loading @@ -272,7 +272,7 @@ inline std::string l2cap_cid_fixed_text(const tL2CAP_CID_FIXED& cid) { CASE_RETURN_STRING_HEX04(L2CAP_SMP_CID); CASE_RETURN_STRING_HEX04(L2CAP_SMP_BR_CID); CASE_RETURN_STRING_HEX04(L2CAP_BASE_APPL_CID); }; } RETURN_UNKNOWN_TYPE_STRING(type, cid); } Loading @@ -298,7 +298,7 @@ inline std::string l2cap_cid_fixed_text(const tL2CAP_CID_FIXED& cid) { /* Define the L2CAP configuration result codes */ enum tL2CAP_CFG_RESULT : uint16_t { enum class tL2CAP_CFG_RESULT : uint16_t { L2CAP_CFG_OK = 0, L2CAP_CFG_UNACCEPTABLE_PARAMS = 1, L2CAP_CFG_FAILED_NO_REASON = 2, Loading @@ -306,6 +306,17 @@ enum tL2CAP_CFG_RESULT : uint16_t { L2CAP_CFG_PENDING = 4, }; inline std::string l2cap_cfg_result_text(const tL2CAP_CFG_RESULT& result) { switch (result) { CASE_RETURN_STRING_HEX04(tL2CAP_CFG_RESULT::L2CAP_CFG_OK); CASE_RETURN_STRING_HEX04(tL2CAP_CFG_RESULT::L2CAP_CFG_UNACCEPTABLE_PARAMS); CASE_RETURN_STRING_HEX04(tL2CAP_CFG_RESULT::L2CAP_CFG_FAILED_NO_REASON); CASE_RETURN_STRING_HEX04(tL2CAP_CFG_RESULT::L2CAP_CFG_UNKNOWN_OPTIONS); CASE_RETURN_STRING_HEX04(tL2CAP_CFG_RESULT::L2CAP_CFG_PENDING); } RETURN_UNKNOWN_TYPE_STRING(type, result); } /* Define the L2CAP configuration option types */ #define L2CAP_CFG_TYPE_MTU 0x01 Loading system/stack/l2cap/l2c_ble.cc +13 −13 Original line number Diff line number Diff line Loading @@ -317,9 +317,9 @@ void l2cble_process_sig_cmd(tL2C_LCB* p_lcb, uint8_t* p, uint16_t pkt_len) { * 1.25) - 1)) ||*/ timeout < BTM_BLE_CONN_SUP_TOUT_MIN || timeout > BTM_BLE_CONN_SUP_TOUT_MAX || max_interval < min_interval) { l2cu_send_peer_ble_par_rsp(p_lcb, L2CAP_CFG_UNACCEPTABLE_PARAMS, id); l2cu_send_peer_ble_par_rsp(p_lcb, tL2CAP_CFG_RESULT::L2CAP_CFG_UNACCEPTABLE_PARAMS, id); } else { l2cu_send_peer_ble_par_rsp(p_lcb, L2CAP_CFG_OK, id); l2cu_send_peer_ble_par_rsp(p_lcb, tL2CAP_CFG_RESULT::L2CAP_CFG_OK, id); p_lcb->min_interval = min_interval; p_lcb->max_interval = max_interval; Loading Loading @@ -655,14 +655,16 @@ void l2cble_process_sig_cmd(tL2C_LCB* p_lcb, uint8_t* p, uint16_t pkt_len) { } case L2CAP_CMD_CREDIT_BASED_RECONFIG_RES: { uint16_t result; if (p + sizeof(uint16_t) > p_pkt_end) { uint16_t result_u16; if (p + sizeof(tL2CAP_CFG_RESULT) > p_pkt_end) { log::error("invalid read"); return; } STREAM_TO_UINT16(result, p); STREAM_TO_UINT16(result_u16, p); tL2CAP_CFG_RESULT result = static_cast<tL2CAP_CFG_RESULT>(result_u16); log::verbose("Recv L2CAP_CMD_CREDIT_BASED_RECONFIG_RES for result = 0x{:04x}", result); log::verbose("Recv L2CAP_CMD_CREDIT_BASED_RECONFIG_RES for result:{}", l2cap_cfg_result_text(result)); p_lcb->pending_ecoc_reconfig_cfg.result = result; Loading @@ -676,7 +678,7 @@ void l2cble_process_sig_cmd(tL2C_LCB* p_lcb, uint8_t* p, uint16_t pkt_len) { &p_lcb->pending_ecoc_reconfig_cfg); temp_p_ccb->reconfig_started = false; if (result == L2CAP_CFG_OK) { if (result == tL2CAP_CFG_RESULT::L2CAP_CFG_OK) { temp_p_ccb->local_conn_cfg = p_lcb->pending_ecoc_reconfig_cfg; } } Loading Loading @@ -977,16 +979,14 @@ void l2c_ble_link_adjust_allocation(void) { if (num_lowpri_links > low_quota) { l2cb.ble_round_robin_quota = low_quota; qq = qq_remainder = 0; } } else if (num_lowpri_links > 0) { /* If each low priority link can have at least one buffer */ else if (num_lowpri_links > 0) { l2cb.ble_round_robin_quota = 0; l2cb.ble_round_robin_unacked = 0; qq = low_quota / num_lowpri_links; qq_remainder = low_quota % num_lowpri_links; } } else { /* If no low priority link */ else { l2cb.ble_round_robin_quota = 0; l2cb.ble_round_robin_unacked = 0; qq = qq_remainder = 0; Loading Loading
system/stack/eatt/eatt_impl.h +15 −7 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <com_android_bluetooth_flags.h> #include <map> #include <memory> #include <utility> #include <vector> #include "bind_helpers.h" Loading Loading @@ -157,13 +159,15 @@ struct eatt_impl { uint16_t max_mps = shim::GetController()->GetLeBufferSize().le_data_packet_length_; tL2CAP_LE_CFG_INFO local_coc_cfg = { .result = L2CAP_LE_RESULT_CONN_OK, .result = tL2CAP_CFG_RESULT::L2CAP_CFG_OK, .mtu = eatt_dev->rx_mtu_, .mps = eatt_dev->rx_mps_ < max_mps ? eatt_dev->rx_mps_ : max_mps, .credits = L2CA_LeCreditDefault(), }; if (!L2CA_ConnectCreditBasedRsp(bda, identifier, lcids, L2CAP_CONN_OK, &local_coc_cfg)) { if (!L2CA_ConnectCreditBasedRsp(bda, identifier, lcids, tL2CAP_LE_RESULT_CODE::L2CAP_LE_RESULT_CONN_OK, &local_coc_cfg)) { log::warn("Unable to respond L2CAP le_coc credit indication peer:{}", bda); return false; } Loading Loading @@ -415,8 +419,9 @@ struct eatt_impl { // regardless of success result, we have finished reconfiguration channel->EattChannelSetState(EattChannelState::EATT_CHANNEL_OPENED); if (p_cfg->result != L2CAP_CFG_OK) { log::info("reconfig failed lcid: 0x{:x} result: 0x{:x}", lcid, p_cfg->result); if (p_cfg->result != tL2CAP_CFG_RESULT::L2CAP_CFG_OK) { log::info("reconfig failed lcid: 0x{:x} result:{}", lcid, l2cap_cfg_result_text(p_cfg->result)); return; } Loading Loading @@ -541,7 +546,7 @@ struct eatt_impl { } tL2CAP_LE_CFG_INFO local_coc_cfg = { .result = L2CAP_LE_RESULT_CONN_OK, .result = tL2CAP_CFG_RESULT::L2CAP_CFG_OK, .mtu = eatt_dev->rx_mtu_, .mps = eatt_dev->rx_mps_, .credits = L2CA_LeCreditDefault(), Loading Loading @@ -782,7 +787,10 @@ struct eatt_impl { std::vector<uint16_t> cids = {cid}; tL2CAP_LE_CFG_INFO cfg = { .result = L2CAP_LE_RESULT_CONN_OK, .mtu = new_mtu, .mps = eatt_dev->rx_mps_}; .result = tL2CAP_CFG_RESULT::L2CAP_CFG_OK, .mtu = new_mtu, .mps = eatt_dev->rx_mps_, }; if (!L2CA_ReconfigCreditBasedConnsReq(eatt_dev->bda_, cids, &cfg)) { log::error("Could not start reconfig cid: 0x{:x} or device {}", cid, bd_addr); Loading Loading @@ -821,7 +829,7 @@ struct eatt_impl { } tL2CAP_LE_CFG_INFO cfg = { .result = L2CAP_LE_RESULT_CONN_OK, .mtu = new_mtu, .mps = eatt_dev->rx_mps_}; .result = tL2CAP_CFG_RESULT::L2CAP_CFG_OK, .mtu = new_mtu, .mps = eatt_dev->rx_mps_}; if (!L2CA_ReconfigCreditBasedConnsReq(eatt_dev->bda_, cids, &cfg)) { log::error("Could not start reconfig for device {}", bd_addr); Loading
system/stack/hid/hidh_conn.cc +1 −1 Original line number Diff line number Diff line Loading @@ -285,7 +285,7 @@ static void hidh_on_l2cap_error(uint16_t l2cap_cid, uint16_t result) { hidh_conn_disconnect(dhandle); if (result != L2CAP_CFG_FAILED_NO_REASON) { if (result != static_cast<uint16_t>(tL2CAP_CFG_RESULT::L2CAP_CFG_FAILED_NO_REASON)) { #if (HID_HOST_MAX_CONN_RETRY > 0) if ((hh_cb.devices[dhandle].conn_tries <= HID_HOST_MAX_CONN_RETRY) && (result == HCI_ERR_CONNECTION_TOUT || result == HCI_ERR_UNSPECIFIED || Loading
system/stack/include/l2cap_types.h +2 −2 Original line number Diff line number Diff line Loading @@ -116,7 +116,7 @@ typedef struct { * use to signify its presence or absence. */ typedef struct { uint16_t result; /* Only used in confirm messages */ tL2CAP_CFG_RESULT result; /* Only used in confirm messages */ bool mtu_present; uint16_t mtu; bool qos_present; Loading Loading @@ -150,7 +150,7 @@ uint16_t L2CA_LeCreditThreshold(); constexpr uint8_t L2CAP_CREDIT_BASED_MAX_CIDS = 5; struct tL2CAP_LE_CFG_INFO { uint16_t result{L2CAP_LE_RESULT_CONN_OK}; /* Only used in confirm messages */ tL2CAP_CFG_RESULT result{tL2CAP_CFG_RESULT::L2CAP_CFG_OK}; /* Only used in confirm messages */ uint16_t mtu{kDefaultL2capMtu}; uint16_t mps{kDefaultL2capMps}; uint16_t credits{L2CA_LeCreditDefault()}; Loading
system/stack/include/l2cdefs.h +13 −2 Original line number Diff line number Diff line Loading @@ -272,7 +272,7 @@ inline std::string l2cap_cid_fixed_text(const tL2CAP_CID_FIXED& cid) { CASE_RETURN_STRING_HEX04(L2CAP_SMP_CID); CASE_RETURN_STRING_HEX04(L2CAP_SMP_BR_CID); CASE_RETURN_STRING_HEX04(L2CAP_BASE_APPL_CID); }; } RETURN_UNKNOWN_TYPE_STRING(type, cid); } Loading @@ -298,7 +298,7 @@ inline std::string l2cap_cid_fixed_text(const tL2CAP_CID_FIXED& cid) { /* Define the L2CAP configuration result codes */ enum tL2CAP_CFG_RESULT : uint16_t { enum class tL2CAP_CFG_RESULT : uint16_t { L2CAP_CFG_OK = 0, L2CAP_CFG_UNACCEPTABLE_PARAMS = 1, L2CAP_CFG_FAILED_NO_REASON = 2, Loading @@ -306,6 +306,17 @@ enum tL2CAP_CFG_RESULT : uint16_t { L2CAP_CFG_PENDING = 4, }; inline std::string l2cap_cfg_result_text(const tL2CAP_CFG_RESULT& result) { switch (result) { CASE_RETURN_STRING_HEX04(tL2CAP_CFG_RESULT::L2CAP_CFG_OK); CASE_RETURN_STRING_HEX04(tL2CAP_CFG_RESULT::L2CAP_CFG_UNACCEPTABLE_PARAMS); CASE_RETURN_STRING_HEX04(tL2CAP_CFG_RESULT::L2CAP_CFG_FAILED_NO_REASON); CASE_RETURN_STRING_HEX04(tL2CAP_CFG_RESULT::L2CAP_CFG_UNKNOWN_OPTIONS); CASE_RETURN_STRING_HEX04(tL2CAP_CFG_RESULT::L2CAP_CFG_PENDING); } RETURN_UNKNOWN_TYPE_STRING(type, result); } /* Define the L2CAP configuration option types */ #define L2CAP_CFG_TYPE_MTU 0x01 Loading
system/stack/l2cap/l2c_ble.cc +13 −13 Original line number Diff line number Diff line Loading @@ -317,9 +317,9 @@ void l2cble_process_sig_cmd(tL2C_LCB* p_lcb, uint8_t* p, uint16_t pkt_len) { * 1.25) - 1)) ||*/ timeout < BTM_BLE_CONN_SUP_TOUT_MIN || timeout > BTM_BLE_CONN_SUP_TOUT_MAX || max_interval < min_interval) { l2cu_send_peer_ble_par_rsp(p_lcb, L2CAP_CFG_UNACCEPTABLE_PARAMS, id); l2cu_send_peer_ble_par_rsp(p_lcb, tL2CAP_CFG_RESULT::L2CAP_CFG_UNACCEPTABLE_PARAMS, id); } else { l2cu_send_peer_ble_par_rsp(p_lcb, L2CAP_CFG_OK, id); l2cu_send_peer_ble_par_rsp(p_lcb, tL2CAP_CFG_RESULT::L2CAP_CFG_OK, id); p_lcb->min_interval = min_interval; p_lcb->max_interval = max_interval; Loading Loading @@ -655,14 +655,16 @@ void l2cble_process_sig_cmd(tL2C_LCB* p_lcb, uint8_t* p, uint16_t pkt_len) { } case L2CAP_CMD_CREDIT_BASED_RECONFIG_RES: { uint16_t result; if (p + sizeof(uint16_t) > p_pkt_end) { uint16_t result_u16; if (p + sizeof(tL2CAP_CFG_RESULT) > p_pkt_end) { log::error("invalid read"); return; } STREAM_TO_UINT16(result, p); STREAM_TO_UINT16(result_u16, p); tL2CAP_CFG_RESULT result = static_cast<tL2CAP_CFG_RESULT>(result_u16); log::verbose("Recv L2CAP_CMD_CREDIT_BASED_RECONFIG_RES for result = 0x{:04x}", result); log::verbose("Recv L2CAP_CMD_CREDIT_BASED_RECONFIG_RES for result:{}", l2cap_cfg_result_text(result)); p_lcb->pending_ecoc_reconfig_cfg.result = result; Loading @@ -676,7 +678,7 @@ void l2cble_process_sig_cmd(tL2C_LCB* p_lcb, uint8_t* p, uint16_t pkt_len) { &p_lcb->pending_ecoc_reconfig_cfg); temp_p_ccb->reconfig_started = false; if (result == L2CAP_CFG_OK) { if (result == tL2CAP_CFG_RESULT::L2CAP_CFG_OK) { temp_p_ccb->local_conn_cfg = p_lcb->pending_ecoc_reconfig_cfg; } } Loading Loading @@ -977,16 +979,14 @@ void l2c_ble_link_adjust_allocation(void) { if (num_lowpri_links > low_quota) { l2cb.ble_round_robin_quota = low_quota; qq = qq_remainder = 0; } } else if (num_lowpri_links > 0) { /* If each low priority link can have at least one buffer */ else if (num_lowpri_links > 0) { l2cb.ble_round_robin_quota = 0; l2cb.ble_round_robin_unacked = 0; qq = low_quota / num_lowpri_links; qq_remainder = low_quota % num_lowpri_links; } } else { /* If no low priority link */ else { l2cb.ble_round_robin_quota = 0; l2cb.ble_round_robin_unacked = 0; qq = qq_remainder = 0; Loading