diff --git a/system/gd/hci/acl_manager/classic_impl.h b/system/gd/hci/acl_manager/classic_impl.h index cab484fef99069e872854b5362bfd3f6838fcac8..4103038ab4c636338aca795078952b5b75c3d723 100644 --- a/system/gd/hci/acl_manager/classic_impl.h +++ b/system/gd/hci/acl_manager/classic_impl.h @@ -384,6 +384,28 @@ struct classic_impl : public security::ISecurityManagerListener { ASSERT(connection_complete.IsValid()); auto status = connection_complete.GetStatus(); auto address = connection_complete.GetBdAddr(); + + // TODO(b/261610529) - Some controllers incorrectly return connection + // failures via HCI Connect Complete instead of SCO connect complete. + // Temporarily just drop these packets until we have finer grained control + // over these ASSERTs. +#if TARGET_FLOSS + auto handle = connection_complete.GetConnectionHandle(); + auto link_type = connection_complete.GetLinkType(); + + // HACK: Some failed SCO connections are reporting failures via + // ConnectComplete instead of ScoConnectionComplete. + // Drop such packets. + if (handle == 0xffff && link_type == LinkType::SCO) { + LOG_ERROR( + "ConnectionComplete with invalid handle(%u), link type(%u) and status(%d). Dropping packet.", + handle, + link_type, + status); + return; + } +#endif + acl_scheduler_->ReportAclConnectionCompletion( address, handler_->BindOnceOn(