OSDN Git Service

Fix for GATT not returning disconnect callback.
authorJakub Pawlowski <jpawlowski@google.com>
Tue, 2 Apr 2019 17:21:14 +0000 (19:21 +0200)
committerJakub Pawlowski <jpawlowski@google.com>
Tue, 2 Apr 2019 21:10:24 +0000 (21:10 +0000)
Before recent refactor GATT was using the L2CAP layer to start LE
connections. Since the refactor, GATT talks directly to added
connection_manager, just like L2CAP.
L2CAP does have it's own timer for direct connections, that was
returning conneciton failure after timeout. After switching to
connection_manager, GATT no longer receives those callbacks.

This patch makes the connection_manager send the on_connection_timed_out
callback, and wire it to same handler that L2CAP layer was using before.

Test: unit tests added
Bug: 125553095
Change-Id: Iaf8be46fe8eed49f78ddbc6a2f3516bc8279e91f

stack/gatt/connection_manager.cc
stack/gatt/connection_manager.h
stack/gatt/gatt_main.cc
stack/test/gatt_connection_manager_test.cc

index bbbf100..cfbb02e 100644 (file)
@@ -183,6 +183,8 @@ void reset(bool after_reset) {
 }
 
 void wl_direct_connect_timeout_cb(uint8_t app_id, const RawAddress& address) {
+  on_connection_timed_out(app_id, address);
+
   // TODO: this would free the timer, from within the timer callback, which is
   // bad.
   direct_connect_remove(app_id, address);
index 81abd8e..4704c8f 100644 (file)
@@ -53,4 +53,9 @@ extern bool direct_connect_add(tAPP_ID app_id, const RawAddress& address);
 extern bool direct_connect_remove(tAPP_ID app_id, const RawAddress& address);
 
 extern void dump(int fd);
+
+/* This callback will be executed when direct connect attempt fails due to
+ * timeout. It must be implemented by users of connection_manager */
+extern void on_connection_timed_out(uint8_t app_id, const RawAddress& address);
+
 }  // namespace connection_manager
index 7bac5b4..49e7da9 100644 (file)
@@ -382,6 +382,12 @@ bool gatt_act_connect(tGATT_REG* p_reg, const RawAddress& bd_addr,
   return true;
 }
 
+namespace connection_manager {
+void on_connection_timed_out(uint8_t app_id, const RawAddress& address) {
+  gatt_le_connect_cback(L2CAP_ATT_CID, address, false, 0xff, BT_TRANSPORT_LE);
+}
+}  // namespace connection_manager
+
 /** This callback function is called by L2CAP to indicate that the ATT fixed
  * channel for LE is connected (conn = true)/disconnected (conn = false).
  */
index a257f7a..eed3776 100644 (file)
@@ -26,6 +26,7 @@ class WhiteListMock {
   MOCK_METHOD0(WhiteListClear, void());
   MOCK_METHOD0(SetLeConnectionModeToFast, bool());
   MOCK_METHOD0(SetLeConnectionModeToSlow, void());
+  MOCK_METHOD2(OnConnectionTimedOut, void(uint8_t, const RawAddress&));
 };
 
 std::unique_ptr<WhiteListMock> localWhiteListMock;
@@ -71,6 +72,10 @@ class BleConnectionManager : public testing::Test {
   }
 };
 
+void on_connection_timed_out(uint8_t app_id, const RawAddress& address) {
+  localWhiteListMock->OnConnectionTimedOut(app_id, address);
+}
+
 /** Verify that app can add a device to white list, it is returned as interested
  * app, and then can remove the device later. */
 TEST_F(BleConnectionManager, test_background_connection_add_remove) {
@@ -183,6 +188,7 @@ TEST_F(BleConnectionManager, test_direct_connect_timeout) {
 
   EXPECT_CALL(*localWhiteListMock, SetLeConnectionModeToSlow()).Times(1);
   EXPECT_CALL(*localWhiteListMock, WhiteListRemove(_)).Times(1);
+  EXPECT_CALL(*localWhiteListMock, OnConnectionTimedOut(CLIENT1, address1)).Times(1);
   EXPECT_CALL(*AlarmMock::Get(), AlarmFree(_)).Times(1);
 
   // simulate timeout seconds passed, alarm executing