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

Commit bc3697f9 authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by android-build-merger
Browse files

Advertising Filtering: send all filters in one batch (2/2)

am: c274abfd

Change-Id: I36dca21c52968fc4ddb2ef3b1cfd4b7d6106391b
parents cc6e506a c274abfd
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -25,9 +25,6 @@
#include "bta/include/bta_gatt_api.h"

void btif_to_bta_response(tGATTS_RSP* p_dest, btgatt_response_t* p_src);
void btif_to_bta_uuid_mask(tBTM_BLE_PF_COND_MASK* p_mask,
                           const bluetooth::Uuid& p_src,
                           const bluetooth::Uuid& svc_uuid);

void btif_gatt_check_encrypted_link(RawAddress bd_addr,
                                    tGATT_TRANSPORT transport);
+11 −83
Original line number Diff line number Diff line
@@ -255,90 +255,18 @@ class BleScannerInterfaceImpl : public BleScannerInterface {
                                jni_thread_wrapper(FROM_HERE, std::move(cb))));
  }

  void ScanFilterAddRemove(int action, int filt_type, int filt_index,
                           int company_id, int company_id_mask,
                           const bluetooth::Uuid* p_uuid,
                           const bluetooth::Uuid* p_uuid_mask,
                           const RawAddress* bd_addr, char addr_type,
                           vector<uint8_t> data, vector<uint8_t> mask,
  void ScanFilterAdd(int filter_index, std::vector<ApcfCommand> filters,
                     FilterConfigCallback cb) override {
    BTIF_TRACE_DEBUG("%s, %d, %d", __func__, action, filt_type);
    BTIF_TRACE_DEBUG("%s: %d", __func__, filter_index);

    /* If data is passed, both mask and data have to be the same length */
    if (data.size() != mask.size() && data.size() != 0 && mask.size() != 0)
      return;

    switch (filt_type) {
      case BTM_BLE_PF_ADDR_FILTER: {
        tBLE_BD_ADDR target_addr;
        target_addr.bda = *bd_addr;
        target_addr.type = addr_type;

        do_in_bta_thread(
            FROM_HERE,
            base::Bind(&BTM_LE_PF_addr_filter, action, filt_index,
                       std::move(target_addr),
                       jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type))));
        return;
      }

      case BTM_BLE_PF_SRVC_DATA:
        do_in_bta_thread(FROM_HERE,
                         base::Bind(&BTM_LE_PF_srvc_data, action, filt_index));
        return;

      case BTM_BLE_PF_SRVC_UUID:
      case BTM_BLE_PF_SRVC_SOL_UUID: {
        if (p_uuid_mask == NULL) {
          do_in_bta_thread(
              FROM_HERE,
              base::Bind(&BTM_LE_PF_uuid_filter, action, filt_index, filt_type,
                         *p_uuid, BTM_BLE_PF_LOGIC_AND, nullptr,
                         jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type))));
          return;
        }

        tBTM_BLE_PF_COND_MASK* mask = new tBTM_BLE_PF_COND_MASK;
        btif_to_bta_uuid_mask(mask, *p_uuid_mask, *p_uuid);
        do_in_bta_thread(
            FROM_HERE,
            base::Bind(&BTM_LE_PF_uuid_filter, action, filt_index, filt_type,
                       *p_uuid, BTM_BLE_PF_LOGIC_AND, base::Owned(mask),
                       jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type))));
        return;
      }

      case BTM_BLE_PF_LOCAL_NAME: {
    do_in_bta_thread(
        FROM_HERE,
            base::Bind(&BTM_LE_PF_local_name, action, filt_index,
                       std::move(data),
                       jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type))));
        return;
      }

      case BTM_BLE_PF_MANU_DATA: {
        do_in_bta_thread(
            FROM_HERE,
            base::Bind(&BTM_LE_PF_manu_data, action, filt_index, company_id,
                       company_id_mask, std::move(data), std::move(mask),
                       jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type))));
        return;
      }

      case BTM_BLE_PF_SRVC_DATA_PATTERN: {
        do_in_bta_thread(
        base::Bind(
            &BTM_LE_PF_set, filter_index, std::move(filters),
            jni_thread_wrapper(
                FROM_HERE,
            base::Bind(&BTM_LE_PF_srvc_data_pattern, action, filt_index,
                       std::move(data), std::move(mask),
                       jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type))));
        return;
      }

      default:
        LOG_ERROR(LOG_TAG, "%s: Unknown filter type (%d)!", __func__, action);
        return;
    }
                Bind(std::move(cb),
                     0 /*TODO: this used to be filter type, unused ?*/))));
  }

  void ScanFilterClear(int filter_index, FilterConfigCallback cb) override {
+0 −25
Original line number Diff line number Diff line
@@ -53,31 +53,6 @@ void btif_to_bta_response(tGATTS_RSP* p_dest, btgatt_response_t* p_src) {
  memcpy(p_dest->attr_value.value, p_src->attr_value.value, GATT_MAX_ATTR_LEN);
}

void btif_to_bta_uuid_mask(tBTM_BLE_PF_COND_MASK* p_mask,
                           const bluetooth::Uuid& uuid_mask,
                           const bluetooth::Uuid& svc_uuid) {
  // we use svc_uuid for uuid_mask length picking ?
  int uuid_len = svc_uuid.GetShortestRepresentationSize();

  switch (uuid_len) {
    case Uuid::kNumBytes16:
      p_mask->uuid16_mask = uuid_mask.As16Bit();
      break;

    case Uuid::kNumBytes32:
      p_mask->uuid32_mask = uuid_mask.As32Bit();
      break;

    case Uuid::kNumBytes128:
      memcpy(p_mask->uuid128_mask, uuid_mask.To128BitLE().data(),
             Uuid::kNumBytes128);
      break;

    default:
      break;
  }
}

/*******************************************************************************
 * Encrypted link map handling
 ******************************************************************************/
+2 −8
Original line number Diff line number Diff line
@@ -86,13 +86,7 @@ class BleScannerInterface {
      FilterParamSetupCallback cb) = 0;

  /** Configure a scan filter condition  */
  virtual void ScanFilterAddRemove(int action, int filt_type, int filt_index,
                                   int company_id, int company_id_mask,
                                   const bluetooth::Uuid* p_uuid,
                                   const bluetooth::Uuid* p_uuid_mask,
                                   const RawAddress* bd_addr, char addr_type,
                                   std::vector<uint8_t> data,
                                   std::vector<uint8_t> p_mask,
  virtual void ScanFilterAdd(int filter_index, std::vector<ApcfCommand> filters,
                             FilterConfigCallback cb) = 0;

  /** Clear all scan filter conditions for specific filter index*/
+15 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include "bluetooth.h"

#include <bluetooth/uuid.h>
#include <vector>

typedef struct {
  uint8_t client_if;
@@ -86,4 +87,18 @@ typedef struct {
  uint16_t num_of_tracking_entries;
} btgatt_filt_param_setup_t;

// Advertising Packet Content Filter
struct ApcfCommand {
  uint8_t type;
  RawAddress address;
  uint8_t addr_type;
  bluetooth::Uuid uuid;
  bluetooth::Uuid uuid_mask;
  std::vector<uint8_t> name;
  uint16_t company;
  uint16_t company_mask;
  std::vector<uint8_t> data;
  std::vector<uint8_t> data_mask;
};

#endif /* ANDROID_INCLUDE_BT_COMMON_TYPES_H */
Loading