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

Commit 28b221dc authored by Chris Manton's avatar Chris Manton
Browse files

gd: Handle EventCode::SNIFF_SUBRATING in acl connection

Bug: 175344733
Test: cert
Tag: #refactor

Change-Id: I71ae0cbd35e3faf1d5112ca3b735423752852898
parent a52d7daa
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ constexpr EventCode AclConnectionEvents[] = {
    EventCode::AUTHENTICATION_COMPLETE,
    EventCode::READ_CLOCK_OFFSET_COMPLETE,
    EventCode::MODE_CHANGE,
    EventCode::SNIFF_SUBRATING,
    EventCode::QOS_SETUP_COMPLETE,
    EventCode::FLOW_SPECIFICATION_COMPLETE,
    EventCode::FLUSH_OCCURRED,
+12 −0
Original line number Diff line number Diff line
@@ -67,6 +67,18 @@ class AclConnectionTracker : public ConnectionManagementCallbacks {
  void OnModeChange(Mode current_mode, uint16_t interval) override {
    SAVE_OR_CALL(OnModeChange, current_mode, interval)
  }
  void OnSniffSubrating(
      uint16_t maximum_transmit_latency,
      uint16_t maximum_receive_latency,
      uint16_t minimum_remote_timeout,
      uint16_t minimum_local_timeout) override {
    SAVE_OR_CALL(
        OnSniffSubrating,
        maximum_transmit_latency,
        maximum_receive_latency,
        minimum_remote_timeout,
        minimum_local_timeout);
  }
  void OnQosSetupComplete(ServiceType service_type, uint32_t token_rate, uint32_t peak_bandwidth, uint32_t latency,
                          uint32_t delay_variation) override {
    SAVE_OR_CALL(OnQosSetupComplete, service_type, token_rate, peak_bandwidth, latency, delay_variation)
+28 −0
Original line number Diff line number Diff line
@@ -96,6 +96,9 @@ struct classic_impl : public security::ISecurityManagerListener {
      case EventCode::MODE_CHANGE:
        on_mode_change(event_packet);
        break;
      case EventCode::SNIFF_SUBRATING:
        on_sniff_subrating(event_packet);
        break;
      case EventCode::QOS_SETUP_COMPLETE:
        on_qos_setup_complete(event_packet);
        break;
@@ -417,6 +420,31 @@ struct classic_impl : public security::ISecurityManagerListener {
    callbacks->OnModeChange(current_mode, interval);
  }

  void on_sniff_subrating(EventView packet) {
    SniffSubratingEventView sniff_subrating_view = SniffSubratingEventView::Create(packet);
    if (!sniff_subrating_view.IsValid()) {
      LOG_ERROR("Received on_sniff_subrating with invalid packet");
      return;
    } else if (sniff_subrating_view.GetStatus() != ErrorCode::SUCCESS) {
      auto status = sniff_subrating_view.GetStatus();
      std::string error_code = ErrorCodeText(status);
      LOG_ERROR("Received on_sniff_subrating with error code %s", error_code.c_str());
      return;
    }
    uint16_t handle = sniff_subrating_view.GetConnectionHandle();
    auto callbacks = get_callbacks(handle);
    if (callbacks == nullptr) {
      LOG_WARN("Unknown connection handle 0x%04hx", handle);
      ASSERT(!crash_on_unknown_handle_);
      return;
    }
    uint16_t max_tx_lat = sniff_subrating_view.GetMaximumTransmitLatency();
    uint16_t max_rx_lat = sniff_subrating_view.GetMaximumReceiveLatency();
    uint16_t min_remote_timeout = sniff_subrating_view.GetMinimumRemoteTimeout();
    uint16_t min_local_timeout = sniff_subrating_view.GetMinimumLocalTimeout();
    callbacks->OnSniffSubrating(max_tx_lat, max_rx_lat, min_remote_timeout, min_local_timeout);
  }

  void on_qos_setup_complete(EventView packet) {
    QosSetupCompleteView complete_view = QosSetupCompleteView::Create(packet);
    if (!complete_view.IsValid()) {
+7 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#pragma once

#include <cstdint>
#include <memory>
#include "hci/hci_packets.h"

@@ -38,6 +39,12 @@ class ConnectionManagementCallbacks {
  virtual void OnReadClockOffsetComplete(uint16_t clock_offset) = 0;
  // Invoked when controller sends Mode Change event with Success error code
  virtual void OnModeChange(Mode current_mode, uint16_t interval) = 0;
  // Invoked when controller sends Sniff Subrating event with Success error code
  virtual void OnSniffSubrating(
      uint16_t maximum_transmit_latency,
      uint16_t maximum_receive_latency,
      uint16_t minimum_remote_timeout,
      uint16_t minimum_local_timeout) = 0;
  // Invoked when controller sends QoS Setup Complete event with Success error code
  virtual void OnQosSetupComplete(ServiceType service_type, uint32_t token_rate, uint32_t peak_bandwidth,
                                  uint32_t latency, uint32_t delay_variation) = 0;
+7 −0
Original line number Diff line number Diff line
@@ -486,6 +486,13 @@ class AclManagerWithConnectionTest : public AclManagerTest {
    MOCK_METHOD0(OnChangeConnectionLinkKeyComplete, void());
    MOCK_METHOD1(OnReadClockOffsetComplete, void(uint16_t clock_offse));
    MOCK_METHOD2(OnModeChange, void(Mode current_mode, uint16_t interval));
    MOCK_METHOD4(
        OnSniffSubrating,
        void(
            uint16_t maximum_transmit_latency,
            uint16_t maximum_receive_latency,
            uint16_t minimum_remote_timeout,
            uint16_t minimum_local_timeout));
    MOCK_METHOD5(OnQosSetupComplete, void(ServiceType service_type, uint32_t token_rate, uint32_t peak_bandwidth,
                                          uint32_t latency, uint32_t delay_variation));
    MOCK_METHOD6(OnFlowSpecificationComplete,
Loading