Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac059702 authored by Myles Watson's avatar Myles Watson
Browse files

Call l2cble_process_rc_param_request_evt

Implement the GD TODO for accepting parameter
update requests from the remote device.

Bug: 348355226
Bug: 322230000
Test: mma -j32
Flag: EXEMPT, no logical change for legacy
Change-Id: I89a7557a73871cbbe237a188e199df26f95bb3b7
parent a71c9ea6
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -59,6 +59,14 @@ class LeAclConnectionTracker : public LeConnectionManagementCallbacks {
    SAVE_OR_CALL(OnConnectionUpdate, hci_status, conn_interval, conn_latency, supervision_timeout)
    SAVE_OR_CALL(OnConnectionUpdate, hci_status, conn_interval, conn_latency, supervision_timeout)
  }
  }


  void OnParameterUpdateRequest(
      uint16_t interval_min,
      uint16_t interval_max,
      uint16_t latency,
      uint16_t supervision_timeout) override {
    SAVE_OR_CALL(OnParameterUpdateRequest, interval_min, interval_max, latency, supervision_timeout)
  }

  void OnDataLengthChange(uint16_t tx_octets, uint16_t tx_time, uint16_t rx_octets, uint16_t rx_time) override {
  void OnDataLengthChange(uint16_t tx_octets, uint16_t tx_time, uint16_t rx_octets, uint16_t rx_time) override {
    SAVE_OR_CALL(OnDataLengthChange, tx_octets, tx_time, rx_octets, rx_time)
    SAVE_OR_CALL(OnDataLengthChange, tx_octets, tx_time, rx_octets, rx_time)
  }
  }
+5 −0
Original line number Original line Diff line number Diff line
@@ -30,6 +30,11 @@ class LeConnectionManagementCallbacks {
      uint16_t connection_interval,
      uint16_t connection_interval,
      uint16_t connection_latency,
      uint16_t connection_latency,
      uint16_t supervision_timeout) = 0;
      uint16_t supervision_timeout) = 0;
  virtual void OnParameterUpdateRequest(
      uint16_t interval_min,
      uint16_t interval_max,
      uint16_t latency,
      uint16_t supervision_timeout) = 0;
  virtual void OnDataLengthChange(uint16_t tx_octets, uint16_t tx_time, uint16_t rx_octets, uint16_t rx_time) = 0;
  virtual void OnDataLengthChange(uint16_t tx_octets, uint16_t tx_time, uint16_t rx_octets, uint16_t rx_time) = 0;
  virtual void OnDisconnection(hci::ErrorCode reason) = 0;
  virtual void OnDisconnection(hci::ErrorCode reason) = 0;
  virtual void OnReadRemoteVersionInformationComplete(
  virtual void OnReadRemoteVersionInformationComplete(
+8 −0
Original line number Original line Diff line number Diff line
@@ -37,6 +37,14 @@ class MockLeConnectionManagementCallbacks : public LeConnectionManagementCallbac
       uint16_t connection_latency,
       uint16_t connection_latency,
       uint16_t supervision_timeout),
       uint16_t supervision_timeout),
      (override));
      (override));
  MOCK_METHOD(
      void,
      OnParameterUpdateRequest,
      (uint16_t interval_min,
       uint16_t interval_max,
       uint16_t latency,
       uint16_t supervision_timeout),
      (override));
  MOCK_METHOD(
  MOCK_METHOD(
      void,
      void,
      OnDataLengthChange,
      OnDataLengthChange,
+6 −12
Original line number Original line Diff line number Diff line
@@ -613,20 +613,14 @@ struct le_impl : public bluetooth::hci::LeAddressManagerCallback {
      return;
      return;
    }
    }


    auto handle = request_view.GetConnectionHandle();
    connections.execute(
    connections.execute(handle, [=, this](LeConnectionManagementCallbacks* /* callbacks */) {
        request_view.GetConnectionHandle(),
      // TODO: this is blindly accepting any parameters, just so we don't hang connection
        [request_view](LeConnectionManagementCallbacks* callbacks) {
      // have proper parameter negotiation
          callbacks->OnParameterUpdateRequest(
      le_acl_connection_interface_->EnqueueCommand(
          LeRemoteConnectionParameterRequestReplyBuilder::Create(
              handle,
              request_view.GetIntervalMin(),
              request_view.GetIntervalMin(),
              request_view.GetIntervalMax(),
              request_view.GetIntervalMax(),
              request_view.GetLatency(),
              request_view.GetLatency(),
              request_view.GetTimeout(),
              request_view.GetTimeout());
              0,
              0),
          handler_->BindOnce([](CommandCompleteView /* status */) {}));
        });
        });
  }
  }


+9 −10
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@
#include <gtest/gtest.h>
#include <gtest/gtest.h>


#include <chrono>
#include <chrono>
#include <future>


#include "common/bidi_queue.h"
#include "common/bidi_queue.h"
#include "hci/acl_manager/le_connection_callbacks.h"
#include "hci/acl_manager/le_connection_callbacks.h"
@@ -1114,6 +1115,13 @@ TEST_F(LeImplWithConnectionTest, on_le_event__DATA_LENGTH_CHANGE) {
}
}


TEST_F(LeImplWithConnectionTest, on_le_event__REMOTE_CONNECTION_PARAMETER_REQUEST) {
TEST_F(LeImplWithConnectionTest, on_le_event__REMOTE_CONNECTION_PARAMETER_REQUEST) {
  std::promise<void> request_promise;
  auto request = request_promise.get_future();
  EXPECT_CALL(
      connection_management_callbacks_,
      OnParameterUpdateRequest(kIntervalMin, kIntervalMax, kLatency, kTimeout))
      .WillOnce([&request_promise]() { request_promise.set_value(); });

  // Send a remote connection parameter request
  // Send a remote connection parameter request
  auto command = hci::LeRemoteConnectionParameterRequestBuilder::Create(
  auto command = hci::LeRemoteConnectionParameterRequestBuilder::Create(
      kHciHandle, kIntervalMin, kIntervalMax, kLatency, kTimeout);
      kHciHandle, kIntervalMin, kIntervalMax, kLatency, kTimeout);
@@ -1124,16 +1132,7 @@ TEST_F(LeImplWithConnectionTest, on_le_event__REMOTE_CONNECTION_PARAMETER_REQUES
    le_impl_->on_le_event(view);
    le_impl_->on_le_event(view);
  }
  }


  sync_handler();
  ASSERT_EQ(std::future_status::ready, request.wait_for(std::chrono::seconds(1)));

  auto view = CreateLeConnectionManagementCommandView<LeRemoteConnectionParameterRequestReplyView>(
      hci_layer_->GetCommand());
  ASSERT_TRUE(view.IsValid());

  ASSERT_EQ(kIntervalMin, view.GetIntervalMin());
  ASSERT_EQ(kIntervalMax, view.GetIntervalMax());
  ASSERT_EQ(kLatency, view.GetLatency());
  ASSERT_EQ(kTimeout, view.GetTimeout());
}
}


// b/260920739
// b/260920739
Loading