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

Commit 602a6829 authored by Myles Watson's avatar Myles Watson
Browse files

Move parsing of BQR into hci

Bug: 322230000
Test: mma -j32
Flag: EXEMPT, no logical change
Change-Id: Ibfd5939b1226a3a4ec3af2978161411332988d8c
parent ee771ae1
Loading
Loading
Loading
Loading
+16 −22
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@
#include "stack/include/bt_types.h"
#include "stack/include/btm_api.h"
#include "stack/include/btm_ble_privacy.h"
#include "stack/include/hcidefs.h"
#include "stack/include/l2cap_controller_interface.h"
#include "types/raw_address.h"

@@ -514,32 +515,18 @@ tBTM_STATUS BTM_RegisterForVSEvents(tBTM_VS_EVT_CB* p_cb, bool is_register) {
 *
 * Function         btm_vendor_specific_evt
 *
 * Description      Process event HCI_VENDOR_SPECIFIC_EVT
 * Description      Process event HCI_VENDOR_SPECIFIC_EVT (BQR)
 *
 * Returns          void
 *
 ******************************************************************************/
void btm_vendor_specific_evt(const uint8_t* p, uint8_t evt_len) {
  uint8_t i;
  uint8_t sub_event_code = HCI_VSE_SUBCODE_BQR_SUB_EVT;
  uint8_t bqr_parameter_length = evt_len;
  const uint8_t* p_bqr_event = p;

  log::verbose("BTM Event: Vendor Specific event from controller");

  // Handle BQR events
  const uint8_t* bqr_ptr = p;
  uint8_t event_code;
  uint8_t len;

  if (evt_len >= 2) {
    STREAM_TO_UINT8(event_code, bqr_ptr);
    STREAM_TO_UINT8(len, bqr_ptr);
    // Check if there's at least a subevent code
    if (len > 1 && evt_len >= 2 + 1 && event_code == HCI_VENDOR_SPECIFIC_EVT) {
      uint8_t sub_event_code;
      STREAM_TO_UINT8(sub_event_code, bqr_ptr);
      if (sub_event_code == HCI_VSE_SUBCODE_BQR_SUB_EVT) {
        // Excluding the HCI Event packet header and 1 octet sub-event code
        int16_t bqr_parameter_length = evt_len - HCIE_PREAMBLE_SIZE - 1;
        const uint8_t* p_bqr_event = bqr_ptr;
        // The stream currently points to the BQR sub-event parameters
        switch (sub_event_code) {
        case bluetooth::bqr::QUALITY_REPORT_ID_LMP_LL_MESSAGE_TRACE:
@@ -563,13 +550,20 @@ void btm_vendor_specific_evt(const uint8_t* p, uint8_t evt_len) {
        default:
          log::info("Unhandled BQR subevent 0x{:02x}x", sub_event_code);
        }
      }
    }

        uint8_t i;
        std::vector<uint8_t> reconstructed_event;
        reconstructed_event[0] = HCI_VENDOR_SPECIFIC_EVT;
        reconstructed_event[1] = 3 + bqr_parameter_length;  // event size
        reconstructed_event[2] = HCI_VSE_SUBCODE_BQR_SUB_EVT;
        for (i = 0; i < bqr_parameter_length; i++) {
          reconstructed_event.emplace_back(p[i]);
        }

  for (i = 0; i < BTM_MAX_VSE_CALLBACKS; i++) {
    if (btm_cb.devcb.p_vend_spec_cb[i])
      (*btm_cb.devcb.p_vend_spec_cb[i])(evt_len, p);
      (*btm_cb.devcb.p_vend_spec_cb[i])(reconstructed_event.size(),
                                        reconstructed_event.data());
  }
}

+26 −1
Original line number Diff line number Diff line
@@ -108,6 +108,7 @@ static void btu_hcif_create_conn_cancel_complete(const uint8_t* p,
static void btu_hcif_read_local_oob_complete(const uint8_t* p,
                                             uint16_t evt_len);

static void btu_hcif_vendor_specific_evt(const uint8_t* p, uint16_t evt_len);
/* Simple Pairing Events */
static void btu_hcif_io_cap_request_evt(const uint8_t* p);
static void btu_hcif_io_cap_response_evt(const uint8_t* p);
@@ -391,7 +392,7 @@ void btu_hcif_process_event(UNUSED_ATTR uint8_t controller_id,
    } break;

    case HCI_VENDOR_SPECIFIC_EVT:
      btm_vendor_specific_evt(const_cast<const uint8_t*>(p), hci_evt_len);
      btu_hcif_vendor_specific_evt(p, hci_evt_len);
      break;

      // Events now captured by gd::hci_layer module
@@ -1411,6 +1412,30 @@ void btu_hcif_read_local_oob_complete(const uint8_t* p, uint16_t evt_len) {
err_out:
  log::error("bogus event packet, too short");
}
void btu_hcif_vendor_specific_evt(const uint8_t* p, uint16_t evt_len) {
  LOG_VERBOSE("BTM Event: Vendor Specific event from controller");

  // Handle BQR events
  const uint8_t* bqr_ptr = p;
  uint8_t event_code;
  uint8_t len;

  if (evt_len >= 2) {
    STREAM_TO_UINT8(event_code, bqr_ptr);
    STREAM_TO_UINT8(len, bqr_ptr);
    // Check if there's at least a subevent code
    if (len > 1 && evt_len >= 2 + 1 && event_code == HCI_VENDOR_SPECIFIC_EVT) {
      uint8_t sub_event_code;
      STREAM_TO_UINT8(sub_event_code, bqr_ptr);
      if (sub_event_code == HCI_VSE_SUBCODE_BQR_SUB_EVT) {
        // Excluding the HCI Event packet header and 1 octet sub-event code
        int16_t bqr_parameter_length = evt_len - HCIE_PREAMBLE_SIZE - 1;
        // The stream currently points to the BQR sub-event parameters
        btm_vendor_specific_evt(bqr_ptr, bqr_parameter_length);
      }
    }
  }
}

/*******************************************************************************
 *