OSDN Git Service

L2cap shim: Implement remote features
authorHansong Zhang <hsz@google.com>
Tue, 19 Jan 2021 22:40:53 +0000 (14:40 -0800)
committerHansong Zhang <hsz@google.com>
Thu, 21 Jan 2021 01:05:14 +0000 (17:05 -0800)
Test: cert/run
Tag: #gd-refactor
Bug: 141555841
Change-Id: I1e9906d6dc4219648f376b7c4a09e58e593fdae3

main/shim/l2c_api.cc
main/shim/l2c_api.h
stack/acl/btm_acl.cc
stack/test/common/mock_main_shim_l2c_api.cc

index e1ac21f..ac48077 100644 (file)
@@ -334,6 +334,7 @@ struct RemoteFeature {
   uint8_t lmp_version = 0;
   uint16_t manufacturer_name = 0;
   uint16_t sub_version = 0;
+  uint8_t raw_remote_features[8];
   bool version_info_received = false;
   bool role_switch_supported = false;
   bool ssp_supported = false;
@@ -375,6 +376,7 @@ struct LinkPropertyListenerShim
     if (page_number == 0) {
       entry.received_page_0 = true;
       if (features & 0x20) entry.role_switch_supported = true;
+      std::memcpy(entry.raw_remote_features, &features, 8);
     }
     if (page_number == 1) {
       entry.received_page_1 = true;
@@ -612,6 +614,14 @@ bool L2CA_ReadRemoteVersion(const RawAddress& addr, uint8_t* lmp_version,
   return true;
 }
 
+uint8_t* L2CA_ReadRemoteFeatures(const RawAddress& addr) {
+  auto& entry = remote_feature_map_[addr];
+  if (!entry.received_page_0) {
+    return nullptr;
+  }
+  return entry.raw_remote_features;
+}
+
 static void on_sco_disconnect(uint16_t handle, uint8_t reason) {
   GetGdShimHandler()->Post(base::BindOnce(base::IgnoreResult(&btm_sco_removed),
                                           handle,
index 5d675ca..2bfa9e3 100644 (file)
@@ -472,6 +472,8 @@ void L2CA_SwitchRoleToCentral(const RawAddress& addr);
 bool L2CA_ReadRemoteVersion(const RawAddress& addr, uint8_t* lmp_version,
                             uint16_t* manufacturer, uint16_t* lmp_sub_version);
 
+uint8_t* L2CA_ReadRemoteFeatures(const RawAddress& addr);
+
 void L2CA_DisconnectLink(const RawAddress& remote);
 
 uint16_t L2CA_GetNumLinks();
index 679d456..be25420 100644 (file)
@@ -1606,6 +1606,9 @@ bool BTM_ReadRemoteVersion(const RawAddress& addr, uint8_t* lmp_version,
  *
  ******************************************************************************/
 uint8_t* BTM_ReadRemoteFeatures(const RawAddress& addr) {
+  if (bluetooth::shim::is_gd_l2cap_enabled()) {
+    return bluetooth::shim::L2CA_ReadRemoteFeatures(addr);
+  }
   tACL_CONN* p = internal_.btm_bda_to_acl(addr, BT_TRANSPORT_BR_EDR);
   if (p == NULL) {
     LOG_WARN("Unable to find active acl");
index 77b4cb2..90ccc9f 100644 (file)
@@ -207,6 +207,10 @@ bool bluetooth::shim::L2CA_ReadRemoteVersion(const RawAddress& addr,
   mock_function_count_map[__func__]++;
   return false;
 }
+uint8_t* bluetooth::shim::L2CA_ReadRemoteFeatures(const RawAddress& remote) {
+  mock_function_count_map[__func__]++;
+  return 0;
+}
 void bluetooth::shim::L2CA_DisconnectLink(const RawAddress& remote) {
   mock_function_count_map[__func__]++;
 }