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

Commit e5a85f55 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "TransportBlockFilter: Add metadata TLV format in hci cmd" am: 3336e90b am: 1574ffae

parents cc715557 1574ffae
Loading
Loading
Loading
Loading
+15 −0
Original line number Original line Diff line number Diff line
@@ -1786,6 +1786,8 @@ static void gattClientScanFilterAddNative(JNIEnv* env, jobject object,
  jfieldID orgFid = env->GetFieldID(entryClazz, "org_id", "I");
  jfieldID orgFid = env->GetFieldID(entryClazz, "org_id", "I");
  jfieldID TDSFlagsFid = env->GetFieldID(entryClazz, "tds_flags", "I");
  jfieldID TDSFlagsFid = env->GetFieldID(entryClazz, "tds_flags", "I");
  jfieldID TDSFlagsMaskFid = env->GetFieldID(entryClazz, "tds_flags_mask", "I");
  jfieldID TDSFlagsMaskFid = env->GetFieldID(entryClazz, "tds_flags_mask", "I");
  jfieldID metaDataTypeFid = env->GetFieldID(entryClazz, "meta_data_type", "I");
  jfieldID metaDataFid = env->GetFieldID(entryClazz, "meta_data", "[B");


  for (int i = 0; i < numFilters; ++i) {
  for (int i = 0; i < numFilters; ++i) {
    ApcfCommand curr{};
    ApcfCommand curr{};
@@ -1881,6 +1883,19 @@ static void gattClientScanFilterAddNative(JNIEnv* env, jobject object,
    curr.org_id = env->GetIntField(current.get(), orgFid);
    curr.org_id = env->GetIntField(current.get(), orgFid);
    curr.tds_flags = env->GetIntField(current.get(), TDSFlagsFid);
    curr.tds_flags = env->GetIntField(current.get(), TDSFlagsFid);
    curr.tds_flags_mask = env->GetIntField(current.get(), TDSFlagsMaskFid);
    curr.tds_flags_mask = env->GetIntField(current.get(), TDSFlagsMaskFid);
    curr.meta_data_type = env->GetIntField(current.get(), metaDataTypeFid);

    ScopedLocalRef<jbyteArray> meta_data(
        env, (jbyteArray)env->GetObjectField(current.get(), metaDataFid));
    if (meta_data.get() != NULL) {
      jbyte* data_array = env->GetByteArrayElements(meta_data.get(), 0);
      int data_len = env->GetArrayLength(meta_data.get());
      if (data_array && data_len) {
        curr.meta_data =
            std::vector<uint8_t>(data_array, data_array + data_len);
        env->ReleaseByteArrayElements(meta_data.get(), data_array, JNI_ABORT);
      }
    }


    native_filters.push_back(curr);
    native_filters.push_back(curr);
  }
  }
+11 −3
Original line number Original line Diff line number Diff line
@@ -50,6 +50,10 @@ import java.util.UUID;
    // Values defined in bluedroid.
    // Values defined in bluedroid.
    private static final byte DEVICE_TYPE_ALL = 2;
    private static final byte DEVICE_TYPE_ALL = 2;


    // Meta data type for Transport Block Filter
    public static final int TYPE_INVALID = 0x00;
    public static final int TYPE_WIFI_NAN_HASH = 0x01; // WIFI NAN HASH type

    class Entry {
    class Entry {
        public byte type;
        public byte type;
        public String address;
        public String address;
@@ -66,6 +70,8 @@ import java.util.UUID;
        public int org_id;
        public int org_id;
        public int tds_flags;
        public int tds_flags;
        public int tds_flags_mask;
        public int tds_flags_mask;
        public int meta_data_type;
        public byte[] meta_data;
    }
    }


    private Set<Entry> mEntries = new HashSet<Entry>();
    private Set<Entry> mEntries = new HashSet<Entry>();
@@ -154,7 +160,7 @@ import java.util.UUID;
    }
    }


    void addTransportDiscoveryData(int orgId, int tdsFlags, int tdsFlagsMask,
    void addTransportDiscoveryData(int orgId, int tdsFlags, int tdsFlagsMask,
            byte[] transportData, byte[] transportDataMask) {
            byte[] transportData, byte[] transportDataMask, int metaDataType, byte[] metaData) {
        Entry entry = new Entry();
        Entry entry = new Entry();
        entry.type = TYPE_TRANSPORT_DISCOVERY_DATA;
        entry.type = TYPE_TRANSPORT_DISCOVERY_DATA;
        entry.org_id = orgId;
        entry.org_id = orgId;
@@ -162,6 +168,8 @@ import java.util.UUID;
        entry.tds_flags_mask = tdsFlagsMask;
        entry.tds_flags_mask = tdsFlagsMask;
        entry.data = transportData;
        entry.data = transportData;
        entry.data_mask = transportDataMask;
        entry.data_mask = transportDataMask;
        entry.meta_data_type = metaDataType;
        entry.meta_data = metaData;
        mEntries.add(entry);
        mEntries.add(entry);
    }
    }


@@ -265,12 +273,12 @@ import java.util.UUID;
                    == OrganizationId.WIFI_ALLIANCE_NEIGHBOR_AWARENESS_NETWORKING) {
                    == OrganizationId.WIFI_ALLIANCE_NEIGHBOR_AWARENESS_NETWORKING) {
                addTransportDiscoveryData(transportBlockFilter.getOrgId(),
                addTransportDiscoveryData(transportBlockFilter.getOrgId(),
                        transportBlockFilter.getTdsFlags(), transportBlockFilter.getTdsFlagsMask(),
                        transportBlockFilter.getTdsFlags(), transportBlockFilter.getTdsFlagsMask(),
                        transportBlockFilter.getWifiNanHash(), null);
                        null, null, TYPE_WIFI_NAN_HASH, transportBlockFilter.getWifiNanHash());
            } else {
            } else {
                addTransportDiscoveryData(transportBlockFilter.getOrgId(),
                addTransportDiscoveryData(transportBlockFilter.getOrgId(),
                        transportBlockFilter.getTdsFlags(), transportBlockFilter.getTdsFlagsMask(),
                        transportBlockFilter.getTdsFlags(), transportBlockFilter.getTdsFlagsMask(),
                        transportBlockFilter.getTransportData(),
                        transportBlockFilter.getTransportData(),
                        transportBlockFilter.getTransportDataMask());
                        transportBlockFilter.getTransportDataMask(), TYPE_INVALID, null);
            }
            }


        }
        }
+21 −1
Original line number Original line Diff line number Diff line
@@ -5206,12 +5206,32 @@ packet LeAdvFilterServiceDataComplete : LeAdvFilterComplete (apcf_opcode = SERVI
  apcf_available_spaces : 8,
  apcf_available_spaces : 8,
}
}


packet LeAdvFilterTransportDiscoveryData : LeAdvFilter (apcf_opcode = TRANSPORT_DISCOVERY_DATA) {
packet LeAdvFilterTransportDiscoveryDataOld : LeAdvFilter (apcf_opcode = TRANSPORT_DISCOVERY_DATA) {
  apcf_action : ApcfAction,
  apcf_action : ApcfAction,
  apcf_filter_index : 8,
  apcf_filter_index : 8,
  apcf_transport_discovery_data : 8[],
  apcf_transport_discovery_data : 8[],
}
}


enum ApcfMetaDataType : 8 {
  INVALID = 0x00,
  WIFI_NAN_HASH = 0x01,
}

packet LeAdvFilterTransportDiscoveryData : LeAdvFilter (apcf_opcode = TRANSPORT_DISCOVERY_DATA) {
  apcf_action : ApcfAction,
  apcf_filter_index : 8,
  org_id : 8,
  tds_flags: 8,
  tds_flags_mask: 8,
  _size_(transport_data): 8,
  transport_data: 8[],
  _size_(transport_data_mask): 8,
  transport_data_mask: 8[],
  meta_data_type: ApcfMetaDataType,
  _size_(meta_data): 8,
  meta_data: 8[],
}

packet LeAdvFilterTransportDiscoveryDataComplete : LeAdvFilterComplete (apcf_opcode = TRANSPORT_DISCOVERY_DATA) {
packet LeAdvFilterTransportDiscoveryDataComplete : LeAdvFilterComplete (apcf_opcode = TRANSPORT_DISCOVERY_DATA) {
  apcf_action : ApcfAction,
  apcf_action : ApcfAction,
  apcf_available_spaces : 8,
  apcf_available_spaces : 8,
+2 −0
Original line number Original line Diff line number Diff line
@@ -106,6 +106,8 @@ class AdvertisingPacketContentFilterCommand {
  uint8_t org_id;
  uint8_t org_id;
  uint8_t tds_flags;
  uint8_t tds_flags;
  uint8_t tds_flags_mask;
  uint8_t tds_flags_mask;
  ApcfMetaDataType meta_data_type;
  std::vector<uint8_t> meta_data;
  uint8_t ad_type;
  uint8_t ad_type;
  std::vector<uint8_t> data;
  std::vector<uint8_t> data;
  std::vector<uint8_t> data_mask;
  std::vector<uint8_t> data_mask;
+54 −30
Original line number Original line Diff line number Diff line
@@ -774,7 +774,9 @@ struct LeScanningManager::impl : public LeAddressManagerCallback {
              filter.tds_flags,
              filter.tds_flags,
              filter.tds_flags_mask,
              filter.tds_flags_mask,
              filter.data,
              filter.data,
              filter.data_mask);
              filter.data_mask,
              filter.meta_data_type,
              filter.meta_data);
          break;
          break;
        }
        }
        case ApcfFilterType::AD_TYPE: {
        case ApcfFilterType::AD_TYPE: {
@@ -978,12 +980,12 @@ struct LeScanningManager::impl : public LeAddressManagerCallback {
      uint8_t tds_flags,
      uint8_t tds_flags,
      uint8_t tds_flags_mask,
      uint8_t tds_flags_mask,
      std::vector<uint8_t> transport_data,
      std::vector<uint8_t> transport_data,
      std::vector<uint8_t> transport_data_mask) {
      std::vector<uint8_t> transport_data_mask,
    std::vector<uint8_t> combined_data = {};
      ApcfMetaDataType meta_data_type,

      std::vector<uint8_t> meta_data) {
    LocalVersionInformation local_version_information = controller_->GetLocalVersionInformation();
    LocalVersionInformation local_version_information = controller_->GetLocalVersionInformation();


    // QTI controller, transport discovery data  filter are supported by default. Check is added
    // In QTI controller, transport discovery data filter are supported by default. Check is added
    // to keep backward compatibility.
    // to keep backward compatibility.
    if (!is_transport_discovery_data_filter_supported_ &&
    if (!is_transport_discovery_data_filter_supported_ &&
        !(local_version_information.manufacturer_name_ == LMP_COMPID_QTI)) {
        !(local_version_information.manufacturer_name_ == LMP_COMPID_QTI)) {
@@ -991,38 +993,60 @@ struct LeScanningManager::impl : public LeAddressManagerCallback {
      return;
      return;
    }
    }


    if (action != ApcfAction::CLEAR) {
      combined_data.push_back((uint8_t)org_id);
      combined_data.push_back((uint8_t)tds_flags);
      combined_data.push_back((uint8_t)tds_flags_mask);
      if (transport_data.size() != 0) {
        // 0x02 Wi�Fi Alliance Neighbor Awareness Networking
        if (org_id == 0x02) {
          // Transport data contains WIFI NAN hash, reverse it before sending controller.
          std::reverse(transport_data.begin(), transport_data.end());
        }
        combined_data.insert(combined_data.end(), transport_data.begin(), transport_data.end());
        // For future version , controller may also filter using transport data
        // & transport data mask for non WIFI NAN id.
        if (is_transport_discovery_data_filter_supported_ && org_id != 0x02) {
          combined_data.insert(
              combined_data.end(), transport_data_mask.begin(), transport_data_mask.end());
        }
      }
    }

    LOG_INFO(
    LOG_INFO(
        "org id: %d, tds_flags: %d, tds_flags_mask = %d,"
        "org id: %d, tds_flags: %d, tds_flags_mask = %d,"
        "transport_data size: %zu, transport_data_mask size: %zu",
        "transport_data size: %zu, transport_data_mask size: %zu"
        "meta_data_type: %u, meta_data size: %zu",
        org_id,
        org_id,
        tds_flags,
        tds_flags,
        tds_flags_mask,
        tds_flags_mask,
        transport_data.size(),
        transport_data.size(),
        transport_data_mask.size());
        transport_data_mask.size(),
        (uint8_t)meta_data_type,
        meta_data.size());

    // 0x02 Wi-Fi Alliance Neighbor Awareness Networking & meta_data_type is 0x01 for NAN Hash.
    if (org_id == 0x02) {
      // meta data contains WIFI NAN hash, reverse it before sending controller.
      switch (meta_data_type) {
        case ApcfMetaDataType::WIFI_NAN_HASH:
          std::reverse(meta_data.begin(), meta_data.end());
          break;
        default:
          break;
      }
    }


    if (is_transport_discovery_data_filter_supported_) {
      le_scanning_interface_->EnqueueCommand(
      le_scanning_interface_->EnqueueCommand(
        LeAdvFilterTransportDiscoveryDataBuilder::Create(action, filter_index, combined_data),
          LeAdvFilterTransportDiscoveryDataBuilder::Create(
              action,
              filter_index,
              org_id,
              tds_flags,
              tds_flags_mask,
              transport_data,
              transport_data_mask,
              meta_data_type,
              meta_data),
          module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
          module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
    } else {
      // In QTI controller, transport discovery data filter are supported by default.
      // keeping old version for backward compatibility
      std::vector<uint8_t> combined_data = {};
      if (action != ApcfAction::CLEAR) {
        combined_data.push_back((uint8_t)org_id);
        combined_data.push_back((uint8_t)tds_flags);
        combined_data.push_back((uint8_t)tds_flags_mask);
        if (org_id == 0x02 && meta_data_type == ApcfMetaDataType::WIFI_NAN_HASH) {
          // meta data contains WIFI NAN hash
          combined_data.insert(combined_data.end(), meta_data.begin(), meta_data.end());
        }
      }
      le_scanning_interface_->EnqueueCommand(
          LeAdvFilterTransportDiscoveryDataOldBuilder::Create(action, filter_index, combined_data),
          module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
    }
  }
  }


  void update_ad_type_filter(
  void update_ad_type_filter(
Loading