Loading system/bta/av/bta_av_aact.cc +18 −9 Original line number Diff line number Diff line Loading @@ -922,6 +922,7 @@ void bta_av_cleanup(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { p_scb->cur_psc_mask = 0; p_scb->wait = 0; p_scb->num_disc_snks = 0; p_scb->coll_mask = 0; alarm_cancel(p_scb->avrc_ct_timer); /* TODO(eisenbach): RE-IMPLEMENT USING VSC OR HAL EXTENSION Loading Loading @@ -1061,18 +1062,21 @@ void bta_av_disconnect_req(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { tBTA_AV_RCB* p_rcb; APPL_TRACE_WARNING("%s: conn_lcb: 0x%x peer_addr: %s", __func__, bta_av_cb.conn_lcb, p_scb->PeerAddress().ToString().c_str()); APPL_TRACE_API("%s: conn_lcb: 0x%x peer_addr: %s", __func__, bta_av_cb.conn_lcb, p_scb->PeerAddress().ToString().c_str()); alarm_cancel(bta_av_cb.link_signalling_timer); alarm_cancel(p_scb->avrc_ct_timer); if (bta_av_cb.conn_lcb) { // conn_lcb is the index bitmask of all used LCBs, and since LCB and SCB use // the same index, it should be safe to use SCB index here. if ((bta_av_cb.conn_lcb & (1 << p_scb->hdi)) != 0) { p_rcb = bta_av_get_rcb_by_shdl((uint8_t)(p_scb->hdi + 1)); if (p_rcb) bta_av_del_rc(p_rcb); AVDT_DisconnectReq(p_scb->PeerAddress(), &bta_av_proc_stream_evt); } else { APPL_TRACE_WARNING("%s: conn_lcb=0x%x bta_handle=0x%x (hdi=%u) no link", __func__, bta_av_cb.conn_lcb, p_scb->hndl, p_scb->hdi); bta_av_ssm_execute(p_scb, BTA_AV_AVDT_DISCONNECT_EVT, NULL); } } Loading Loading @@ -1398,15 +1402,16 @@ void bta_av_do_close(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { * ******************************************************************************/ void bta_av_connect_req(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { APPL_TRACE_DEBUG("%s: peer %s coll_mask:0x%x", __func__, APPL_TRACE_DEBUG("%s: peer %s coll_mask=0x%02x", __func__, p_scb->PeerAddress().ToString().c_str(), p_scb->coll_mask); p_scb->sdp_discovery_started = false; if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) { /* SNK initiated L2C connection while SRC was doing SDP. */ /* Wait until timeout to check if SNK starts signalling. */ APPL_TRACE_EVENT("%s: coll_mask = 0x%2X", __func__, p_scb->coll_mask); APPL_TRACE_WARNING("%s: coll_mask=0x%02x incoming timer is up", __func__, p_scb->coll_mask); p_scb->coll_mask |= BTA_AV_COLL_API_CALLED; APPL_TRACE_EVENT("%s: updated coll_mask = 0x%2X", __func__, APPL_TRACE_EVENT("%s: updated coll_mask=0x%02x", __func__, p_scb->coll_mask); return; } Loading Loading @@ -2690,9 +2695,13 @@ void bta_av_rcfg_failed(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { } else { /* open failed. try again */ p_scb->num_recfg++; if (bta_av_cb.conn_lcb) { // conn_lcb is the index bitmask of all used LCBs, and since LCB and SCB use // the same index, it should be safe to use SCB index here. if ((bta_av_cb.conn_lcb & (1 << p_scb->hdi)) != 0) { AVDT_DisconnectReq(p_scb->PeerAddress(), &bta_av_proc_stream_evt); } else { APPL_TRACE_WARNING("%s: conn_lcb=0x%x bta_handle=0x%x (hdi=%u) no link", __func__, bta_av_cb.conn_lcb, p_scb->hndl, p_scb->hdi); bta_av_connect_req(p_scb, NULL); } } Loading Loading @@ -3057,7 +3066,7 @@ void bta_av_open_rc(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { void bta_av_open_at_inc(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { memcpy(&(p_scb->open_api), &(p_data->api_open), sizeof(tBTA_AV_API_OPEN)); APPL_TRACE_DEBUG("%s: peer %s coll_mask:0x%x", __func__, APPL_TRACE_DEBUG("%s: peer %s coll_mask=0x%02x", __func__, p_scb->PeerAddress().ToString().c_str(), p_scb->coll_mask); if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) { Loading system/bta/av/bta_av_act.cc +4 −3 Original line number Diff line number Diff line Loading @@ -1474,7 +1474,7 @@ void bta_av_sig_chg(tBTA_AV_DATA* p_data) { #endif else { /* disconnected. */ APPL_TRACE_DEBUG("%s: bta_av_cb.conn_lcb is %d", __func__, APPL_TRACE_DEBUG("%s: bta_av_cb.conn_lcb=0x%x", __func__, bta_av_cb.conn_lcb); p_lcb = bta_av_find_lcb(p_data->str_msg.bd_addr, BTA_AV_LCB_FREE); Loading @@ -1500,7 +1500,8 @@ void bta_av_sig_chg(tBTA_AV_DATA* p_data) { } } } APPL_TRACE_DEBUG("%s: sig_chg conn_lcb: 0x%x", __func__, p_cb->conn_lcb); APPL_TRACE_DEBUG("%s: bta_av_cb.conn_lcb=0x%x after sig_chg", __func__, p_cb->conn_lcb); } /******************************************************************************* Loading Loading @@ -1567,7 +1568,7 @@ static void bta_av_accept_signalling_timer_cback(void* data) { p_scb = p_cb->p_scb[inx]; } if (p_scb) { APPL_TRACE_DEBUG("%s: coll_mask = 0x%02X", __func__, p_scb->coll_mask); APPL_TRACE_DEBUG("%s: coll_mask=0x%02x", __func__, p_scb->coll_mask); if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) { p_scb->coll_mask &= ~BTA_AV_COLL_INC_TMR; Loading system/gd/l2cap/classic/cert/api.proto +6 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,11 @@ message ConfigurationRequest { bool fcs = 5; } enum ConfigurationResult { SUCCESS = 0; NOT_SUCCESS = 1; } message SendConfigurationRequestResult {} message ConfigurationResponse { Loading @@ -115,6 +120,7 @@ message ConfigurationResponse { uint32 mtu = 3; ChannelRetransmissionFlowControlConfig retransmission_config = 4; bool fcs = 5; ConfigurationResult result = 6; } message SendConfigurationResponseResult {} Loading system/gd/l2cap/classic/cert/cert.cc +11 −0 Original line number Diff line number Diff line Loading @@ -376,6 +376,17 @@ class L2capClassicModuleCertService : public L2capClassicModuleCert::Service { FetchL2capLogResponse response; response.mutable_configuration_response()->set_signal_id(control_view.GetIdentifier()); response.mutable_configuration_response()->set_scid(view.GetSourceCid()); if (view.GetResult() == ConfigurationResponseResult::SUCCESS) { response.mutable_configuration_response()->set_result(ConfigurationResult::SUCCESS); } else { response.mutable_configuration_response()->set_result(ConfigurationResult::NOT_SUCCESS); } for (auto& option : view.GetConfig()) { if (option->type_ == ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL) { response.mutable_configuration_response()->mutable_retransmission_config()->set_mode( ChannelRetransmissionFlowControlMode::ERTM); } } LogEvent(response); break; } Loading system/gd/l2cap/classic/cert/simple_l2cap_test.py +29 −0 Original line number Diff line number Diff line Loading @@ -651,3 +651,32 @@ class SimpleL2capTest(GdBaseTestClass): l2cap_event_asserts.assert_event_occurs( lambda log: log.HasField("data_packet") and log.data_packet.channel == scid and log.data_packet.payload == b'\x01\x0a' ) def test_respond_configuration_request_ertm(self): """ L2CAP/CMC/BV-02-C [Lower Tester Initiated Configuration of Enhanced Retransmission Mode] """ with EventCallbackStream( self.cert_device.l2cap.FetchL2capLog( empty_pb2.Empty())) as l2cap_log_stream: l2cap_event_asserts = EventAsserts(l2cap_log_stream) self._register_callbacks(l2cap_log_stream) self._setup_link(l2cap_event_asserts) psm = 1 scid = 0x0101 self.retransmission_mode = l2cap_facade_pb2.RetransmissionFlowControlMode.ERTM self.device_under_test.l2cap.SetDynamicChannel( l2cap_facade_pb2.SetEnableDynamicChannelRequest( psm=psm, retransmission_mode=self.retransmission_mode)) self.cert_device.l2cap.SendConnectionRequest( l2cap_cert_pb2.ConnectionRequest(scid=scid, psm=psm)) l2cap_event_asserts.assert_event_occurs( lambda log: is_configuration_request(log) and \ log.configuration_response.scid == scid and\ log.configuration_response.result == log.l2cap_cert_pb2.ConfigurationResult.SUCCESS and \ log.HasField("retransmission_config") and \ log.configuration_response.retransmission_config.mode == l2cap_cert_pb2.ChannelRetransmissionFlowControlMode.ERTM) Loading
system/bta/av/bta_av_aact.cc +18 −9 Original line number Diff line number Diff line Loading @@ -922,6 +922,7 @@ void bta_av_cleanup(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { p_scb->cur_psc_mask = 0; p_scb->wait = 0; p_scb->num_disc_snks = 0; p_scb->coll_mask = 0; alarm_cancel(p_scb->avrc_ct_timer); /* TODO(eisenbach): RE-IMPLEMENT USING VSC OR HAL EXTENSION Loading Loading @@ -1061,18 +1062,21 @@ void bta_av_disconnect_req(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { tBTA_AV_RCB* p_rcb; APPL_TRACE_WARNING("%s: conn_lcb: 0x%x peer_addr: %s", __func__, bta_av_cb.conn_lcb, p_scb->PeerAddress().ToString().c_str()); APPL_TRACE_API("%s: conn_lcb: 0x%x peer_addr: %s", __func__, bta_av_cb.conn_lcb, p_scb->PeerAddress().ToString().c_str()); alarm_cancel(bta_av_cb.link_signalling_timer); alarm_cancel(p_scb->avrc_ct_timer); if (bta_av_cb.conn_lcb) { // conn_lcb is the index bitmask of all used LCBs, and since LCB and SCB use // the same index, it should be safe to use SCB index here. if ((bta_av_cb.conn_lcb & (1 << p_scb->hdi)) != 0) { p_rcb = bta_av_get_rcb_by_shdl((uint8_t)(p_scb->hdi + 1)); if (p_rcb) bta_av_del_rc(p_rcb); AVDT_DisconnectReq(p_scb->PeerAddress(), &bta_av_proc_stream_evt); } else { APPL_TRACE_WARNING("%s: conn_lcb=0x%x bta_handle=0x%x (hdi=%u) no link", __func__, bta_av_cb.conn_lcb, p_scb->hndl, p_scb->hdi); bta_av_ssm_execute(p_scb, BTA_AV_AVDT_DISCONNECT_EVT, NULL); } } Loading Loading @@ -1398,15 +1402,16 @@ void bta_av_do_close(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { * ******************************************************************************/ void bta_av_connect_req(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { APPL_TRACE_DEBUG("%s: peer %s coll_mask:0x%x", __func__, APPL_TRACE_DEBUG("%s: peer %s coll_mask=0x%02x", __func__, p_scb->PeerAddress().ToString().c_str(), p_scb->coll_mask); p_scb->sdp_discovery_started = false; if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) { /* SNK initiated L2C connection while SRC was doing SDP. */ /* Wait until timeout to check if SNK starts signalling. */ APPL_TRACE_EVENT("%s: coll_mask = 0x%2X", __func__, p_scb->coll_mask); APPL_TRACE_WARNING("%s: coll_mask=0x%02x incoming timer is up", __func__, p_scb->coll_mask); p_scb->coll_mask |= BTA_AV_COLL_API_CALLED; APPL_TRACE_EVENT("%s: updated coll_mask = 0x%2X", __func__, APPL_TRACE_EVENT("%s: updated coll_mask=0x%02x", __func__, p_scb->coll_mask); return; } Loading Loading @@ -2690,9 +2695,13 @@ void bta_av_rcfg_failed(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { } else { /* open failed. try again */ p_scb->num_recfg++; if (bta_av_cb.conn_lcb) { // conn_lcb is the index bitmask of all used LCBs, and since LCB and SCB use // the same index, it should be safe to use SCB index here. if ((bta_av_cb.conn_lcb & (1 << p_scb->hdi)) != 0) { AVDT_DisconnectReq(p_scb->PeerAddress(), &bta_av_proc_stream_evt); } else { APPL_TRACE_WARNING("%s: conn_lcb=0x%x bta_handle=0x%x (hdi=%u) no link", __func__, bta_av_cb.conn_lcb, p_scb->hndl, p_scb->hdi); bta_av_connect_req(p_scb, NULL); } } Loading Loading @@ -3057,7 +3066,7 @@ void bta_av_open_rc(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { void bta_av_open_at_inc(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { memcpy(&(p_scb->open_api), &(p_data->api_open), sizeof(tBTA_AV_API_OPEN)); APPL_TRACE_DEBUG("%s: peer %s coll_mask:0x%x", __func__, APPL_TRACE_DEBUG("%s: peer %s coll_mask=0x%02x", __func__, p_scb->PeerAddress().ToString().c_str(), p_scb->coll_mask); if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) { Loading
system/bta/av/bta_av_act.cc +4 −3 Original line number Diff line number Diff line Loading @@ -1474,7 +1474,7 @@ void bta_av_sig_chg(tBTA_AV_DATA* p_data) { #endif else { /* disconnected. */ APPL_TRACE_DEBUG("%s: bta_av_cb.conn_lcb is %d", __func__, APPL_TRACE_DEBUG("%s: bta_av_cb.conn_lcb=0x%x", __func__, bta_av_cb.conn_lcb); p_lcb = bta_av_find_lcb(p_data->str_msg.bd_addr, BTA_AV_LCB_FREE); Loading @@ -1500,7 +1500,8 @@ void bta_av_sig_chg(tBTA_AV_DATA* p_data) { } } } APPL_TRACE_DEBUG("%s: sig_chg conn_lcb: 0x%x", __func__, p_cb->conn_lcb); APPL_TRACE_DEBUG("%s: bta_av_cb.conn_lcb=0x%x after sig_chg", __func__, p_cb->conn_lcb); } /******************************************************************************* Loading Loading @@ -1567,7 +1568,7 @@ static void bta_av_accept_signalling_timer_cback(void* data) { p_scb = p_cb->p_scb[inx]; } if (p_scb) { APPL_TRACE_DEBUG("%s: coll_mask = 0x%02X", __func__, p_scb->coll_mask); APPL_TRACE_DEBUG("%s: coll_mask=0x%02x", __func__, p_scb->coll_mask); if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) { p_scb->coll_mask &= ~BTA_AV_COLL_INC_TMR; Loading
system/gd/l2cap/classic/cert/api.proto +6 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,11 @@ message ConfigurationRequest { bool fcs = 5; } enum ConfigurationResult { SUCCESS = 0; NOT_SUCCESS = 1; } message SendConfigurationRequestResult {} message ConfigurationResponse { Loading @@ -115,6 +120,7 @@ message ConfigurationResponse { uint32 mtu = 3; ChannelRetransmissionFlowControlConfig retransmission_config = 4; bool fcs = 5; ConfigurationResult result = 6; } message SendConfigurationResponseResult {} Loading
system/gd/l2cap/classic/cert/cert.cc +11 −0 Original line number Diff line number Diff line Loading @@ -376,6 +376,17 @@ class L2capClassicModuleCertService : public L2capClassicModuleCert::Service { FetchL2capLogResponse response; response.mutable_configuration_response()->set_signal_id(control_view.GetIdentifier()); response.mutable_configuration_response()->set_scid(view.GetSourceCid()); if (view.GetResult() == ConfigurationResponseResult::SUCCESS) { response.mutable_configuration_response()->set_result(ConfigurationResult::SUCCESS); } else { response.mutable_configuration_response()->set_result(ConfigurationResult::NOT_SUCCESS); } for (auto& option : view.GetConfig()) { if (option->type_ == ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL) { response.mutable_configuration_response()->mutable_retransmission_config()->set_mode( ChannelRetransmissionFlowControlMode::ERTM); } } LogEvent(response); break; } Loading
system/gd/l2cap/classic/cert/simple_l2cap_test.py +29 −0 Original line number Diff line number Diff line Loading @@ -651,3 +651,32 @@ class SimpleL2capTest(GdBaseTestClass): l2cap_event_asserts.assert_event_occurs( lambda log: log.HasField("data_packet") and log.data_packet.channel == scid and log.data_packet.payload == b'\x01\x0a' ) def test_respond_configuration_request_ertm(self): """ L2CAP/CMC/BV-02-C [Lower Tester Initiated Configuration of Enhanced Retransmission Mode] """ with EventCallbackStream( self.cert_device.l2cap.FetchL2capLog( empty_pb2.Empty())) as l2cap_log_stream: l2cap_event_asserts = EventAsserts(l2cap_log_stream) self._register_callbacks(l2cap_log_stream) self._setup_link(l2cap_event_asserts) psm = 1 scid = 0x0101 self.retransmission_mode = l2cap_facade_pb2.RetransmissionFlowControlMode.ERTM self.device_under_test.l2cap.SetDynamicChannel( l2cap_facade_pb2.SetEnableDynamicChannelRequest( psm=psm, retransmission_mode=self.retransmission_mode)) self.cert_device.l2cap.SendConnectionRequest( l2cap_cert_pb2.ConnectionRequest(scid=scid, psm=psm)) l2cap_event_asserts.assert_event_occurs( lambda log: is_configuration_request(log) and \ log.configuration_response.scid == scid and\ log.configuration_response.result == log.l2cap_cert_pb2.ConfigurationResult.SUCCESS and \ log.HasField("retransmission_config") and \ log.configuration_response.retransmission_config.mode == l2cap_cert_pb2.ChannelRetransmissionFlowControlMode.ERTM)