From 1f9447886254d1207aa3283b2106170089c5c5e5 Mon Sep 17 00:00:00 2001 From: Jakub Pawlowski Date: Sat, 20 Jan 2018 16:07:10 -0800 Subject: [PATCH] Report credit count change, when credits are received for LE CoC Test: manual with HA Bug: 69623109 Change-Id: I1c6f240eaf08d876bb285f3ffa737365f392925e --- stack/avct/avct_l2c.cc | 25 ++++++++++++------------- stack/avct/avct_l2c_br.cc | 4 ++-- stack/avdt/avdt_l2c.cc | 25 ++++++++++++------------- stack/gatt/gatt_main.cc | 3 ++- stack/hid/hidd_conn.cc | 24 +++++++++++++----------- stack/hid/hidh_conn.cc | 4 ++-- stack/include/l2c_api.h | 11 ++++++++++- stack/l2cap/l2c_csm.cc | 6 ++++++ stack/mcap/mca_l2c.cc | 24 +++++++++++++----------- 9 files changed, 72 insertions(+), 54 deletions(-) diff --git a/stack/avct/avct_l2c.cc b/stack/avct/avct_l2c.cc index ed2e9e4cc..718a9c9c2 100644 --- a/stack/avct/avct_l2c.cc +++ b/stack/avct/avct_l2c.cc @@ -48,19 +48,18 @@ void avct_l2c_congestion_ind_cback(uint16_t lcid, bool is_congested); void avct_l2c_data_ind_cback(uint16_t lcid, BT_HDR* p_buf); /* L2CAP callback function structure */ -const tL2CAP_APPL_INFO avct_l2c_appl = { - avct_l2c_connect_ind_cback, - avct_l2c_connect_cfm_cback, - NULL, - avct_l2c_config_ind_cback, - avct_l2c_config_cfm_cback, - avct_l2c_disconnect_ind_cback, - avct_l2c_disconnect_cfm_cback, - NULL, - avct_l2c_data_ind_cback, - avct_l2c_congestion_ind_cback, - NULL /* tL2CA_TX_COMPLETE_CB */ -}; +const tL2CAP_APPL_INFO avct_l2c_appl = {avct_l2c_connect_ind_cback, + avct_l2c_connect_cfm_cback, + NULL, + avct_l2c_config_ind_cback, + avct_l2c_config_cfm_cback, + avct_l2c_disconnect_ind_cback, + avct_l2c_disconnect_cfm_cback, + NULL, + avct_l2c_data_ind_cback, + avct_l2c_congestion_ind_cback, + NULL, /* tL2CA_TX_COMPLETE_CB */ + NULL /* tL2CA_CREDITS_RECEIVED_CB */}; /******************************************************************************* * diff --git a/stack/avct/avct_l2c_br.cc b/stack/avct/avct_l2c_br.cc index 3c40b48a3..1be8a7b84 100644 --- a/stack/avct/avct_l2c_br.cc +++ b/stack/avct/avct_l2c_br.cc @@ -92,8 +92,8 @@ const tL2CAP_APPL_INFO avct_l2c_br_appl = { NULL, avct_l2c_br_data_ind_cback, avct_l2c_br_congestion_ind_cback, - NULL /* tL2CA_TX_COMPLETE_CB */ -}; + NULL, /* tL2CA_TX_COMPLETE_CB */ + NULL /* tL2CA_CREDITS_RECEIVED_CB */}; /* Browsing channel eL2CAP default options */ const tL2CAP_FCR_OPTS avct_l2c_br_fcr_opts_def = { diff --git a/stack/avdt/avdt_l2c.cc b/stack/avdt/avdt_l2c.cc index 148985962..8c088355e 100644 --- a/stack/avdt/avdt_l2c.cc +++ b/stack/avdt/avdt_l2c.cc @@ -48,19 +48,18 @@ void avdt_l2c_congestion_ind_cback(uint16_t lcid, bool is_congested); void avdt_l2c_data_ind_cback(uint16_t lcid, BT_HDR* p_buf); /* L2CAP callback function structure */ -const tL2CAP_APPL_INFO avdt_l2c_appl = { - avdt_l2c_connect_ind_cback, - avdt_l2c_connect_cfm_cback, - NULL, - avdt_l2c_config_ind_cback, - avdt_l2c_config_cfm_cback, - avdt_l2c_disconnect_ind_cback, - avdt_l2c_disconnect_cfm_cback, - NULL, - avdt_l2c_data_ind_cback, - avdt_l2c_congestion_ind_cback, - NULL /* tL2CA_TX_COMPLETE_CB */ -}; +const tL2CAP_APPL_INFO avdt_l2c_appl = {avdt_l2c_connect_ind_cback, + avdt_l2c_connect_cfm_cback, + NULL, + avdt_l2c_config_ind_cback, + avdt_l2c_config_cfm_cback, + avdt_l2c_disconnect_ind_cback, + avdt_l2c_disconnect_cfm_cback, + NULL, + avdt_l2c_data_ind_cback, + avdt_l2c_congestion_ind_cback, + NULL, /* tL2CA_TX_COMPLETE_CB */ + NULL /* tL2CA_CREDITS_RECEIVED_CB */}; /******************************************************************************* * diff --git a/stack/gatt/gatt_main.cc b/stack/gatt/gatt_main.cc index 6e9d17d0f..9e91628c8 100644 --- a/stack/gatt/gatt_main.cc +++ b/stack/gatt/gatt_main.cc @@ -80,7 +80,8 @@ static const tL2CAP_APPL_INFO dyn_info = {gatt_l2cif_connect_ind_cback, NULL, gatt_l2cif_data_ind_cback, gatt_l2cif_congest_cback, - NULL}; + NULL, + NULL /* tL2CA_CREDITS_RECEIVED_CB */}; tGATT_CB gatt_cb; diff --git a/stack/hid/hidd_conn.cc b/stack/hid/hidd_conn.cc index e62a375a5..e4525f9c1 100644 --- a/stack/hid/hidd_conn.cc +++ b/stack/hid/hidd_conn.cc @@ -54,17 +54,19 @@ static void hidd_l2cif_disconnect_cfm(uint16_t cid, uint16_t result); static void hidd_l2cif_data_ind(uint16_t cid, BT_HDR* p_msg); static void hidd_l2cif_cong_ind(uint16_t cid, bool congested); -static const tL2CAP_APPL_INFO dev_reg_info = {hidd_l2cif_connect_ind, - hidd_l2cif_connect_cfm, - NULL, - hidd_l2cif_config_ind, - hidd_l2cif_config_cfm, - hidd_l2cif_disconnect_ind, - hidd_l2cif_disconnect_cfm, - NULL, - hidd_l2cif_data_ind, - hidd_l2cif_cong_ind, - NULL}; +static const tL2CAP_APPL_INFO dev_reg_info = { + hidd_l2cif_connect_ind, + hidd_l2cif_connect_cfm, + NULL, + hidd_l2cif_config_ind, + hidd_l2cif_config_cfm, + hidd_l2cif_disconnect_ind, + hidd_l2cif_disconnect_cfm, + NULL, + hidd_l2cif_data_ind, + hidd_l2cif_cong_ind, + NULL, + NULL /* tL2CA_CREDITS_RECEIVED_CB */}; /******************************************************************************* * diff --git a/stack/hid/hidh_conn.cc b/stack/hid/hidh_conn.cc index b00ad4282..76c03a6f9 100644 --- a/stack/hid/hidh_conn.cc +++ b/stack/hid/hidh_conn.cc @@ -72,8 +72,8 @@ static const tL2CAP_APPL_INFO hst_reg_info = { NULL, hidh_l2cif_data_ind, hidh_l2cif_cong_ind, - NULL /* tL2CA_TX_COMPLETE_CB */ -}; + NULL, /* tL2CA_TX_COMPLETE_CB */ + NULL /* tL2CA_CREDITS_RECEIVED_CB */}; /******************************************************************************* * diff --git a/stack/include/l2c_api.h b/stack/include/l2c_api.h index 61c66455c..83c6845fb 100644 --- a/stack/include/l2c_api.h +++ b/stack/include/l2c_api.h @@ -286,6 +286,15 @@ typedef void(tL2CA_NOCP_CB)(const RawAddress&); */ typedef void(tL2CA_TX_COMPLETE_CB)(uint16_t, uint16_t); +/* Callback for receiving credits from the remote device. + * |credit_received| parameter represents number of credits received in "LE Flow + * Control Credit" packet from the remote. |credit_count| parameter represents + * the total available credits, including |credit_received|. + */ +typedef void(tL2CA_CREDITS_RECEIVED_CB)(uint16_t local_cid, + uint16_t credits_received, + uint16_t credit_count); + /* Define the structure that applications use to register with * L2CAP. This structure includes callback functions. All functions * MUST be provided, with the exception of the "connect pending" @@ -303,7 +312,7 @@ typedef struct { tL2CA_DATA_IND_CB* pL2CA_DataInd_Cb; tL2CA_CONGESTION_STATUS_CB* pL2CA_CongestionStatus_Cb; tL2CA_TX_COMPLETE_CB* pL2CA_TxComplete_Cb; - + tL2CA_CREDITS_RECEIVED_CB* pL2CA_CreditsReceived_Cb; } tL2CAP_APPL_INFO; /* Define the structure that applications use to create or accept diff --git a/stack/l2cap/l2c_csm.cc b/stack/l2cap/l2c_csm.cc index 01c320fd9..2fe0d0be1 100644 --- a/stack/l2cap/l2c_csm.cc +++ b/stack/l2cap/l2c_csm.cc @@ -1112,6 +1112,12 @@ static void l2c_csm_open(tL2C_CCB* p_ccb, uint16_t event, void* p_data) { l2cble_send_peer_disc_req(p_ccb); } else { p_ccb->peer_conn_cfg.credits += *credit; + + tL2CA_CREDITS_RECEIVED_CB* cr_cb = + p_ccb->p_rcb->api.pL2CA_CreditsReceived_Cb; + if (p_ccb->p_lcb->transport == BT_TRANSPORT_LE && (cr_cb)) { + (*cr_cb)(p_ccb->local_cid, *credit, p_ccb->peer_conn_cfg.credits); + } l2c_link_check_send_pkts(p_ccb->p_lcb, NULL, NULL); } break; diff --git a/stack/mcap/mca_l2c.cc b/stack/mcap/mca_l2c.cc index e285c89f6..e0540fa34 100644 --- a/stack/mcap/mca_l2c.cc +++ b/stack/mcap/mca_l2c.cc @@ -33,17 +33,19 @@ #include "osi/include/osi.h" /* L2CAP callback function structure */ -const tL2CAP_APPL_INFO mca_l2c_int_appl = {NULL, - mca_l2c_connect_cfm_cback, - NULL, - mca_l2c_config_ind_cback, - mca_l2c_config_cfm_cback, - mca_l2c_disconnect_ind_cback, - mca_l2c_disconnect_cfm_cback, - NULL, - mca_l2c_data_ind_cback, - mca_l2c_congestion_ind_cback, - NULL}; +const tL2CAP_APPL_INFO mca_l2c_int_appl = { + NULL, + mca_l2c_connect_cfm_cback, + NULL, + mca_l2c_config_ind_cback, + mca_l2c_config_cfm_cback, + mca_l2c_disconnect_ind_cback, + mca_l2c_disconnect_cfm_cback, + NULL, + mca_l2c_data_ind_cback, + mca_l2c_congestion_ind_cback, + NULL, + NULL /* tL2CA_CREDITS_RECEIVED_CB */}; /* Control channel eL2CAP default options */ const tL2CAP_FCR_OPTS mca_l2c_fcr_opts_def = { -- 2.11.0