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

Commit c932598b authored by Chienyuan's avatar Chienyuan
Browse files

Add support for APCF Generic AD Type and RSI AD Type Filter

Add support for APCF Generic AD Type Filter and
use for RSI AD Type for CSIP Member Discovery.

Bug: 233021154
Test: APCF Generic AD Type (RSI AD Type) Filter working fine
      for CSIP Member Discovery

Change-Id: Ic2f9794902a271e5b90d33a7e5a143cdb5ea07e0
parent 45fbace7
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1587,6 +1587,7 @@ static void gattClientScanFilterAddNative(JNIEnv* env, jobject object,
  jfieldID nameFid = env->GetFieldID(entryClazz, "name", "Ljava/lang/String;");
  jfieldID companyFid = env->GetFieldID(entryClazz, "company", "I");
  jfieldID companyMaskFid = env->GetFieldID(entryClazz, "company_mask", "I");
  jfieldID adTypeFid = env->GetFieldID(entryClazz, "ad_type", "I");
  jfieldID dataFid = env->GetFieldID(entryClazz, "data", "[B");
  jfieldID dataMaskFid = env->GetFieldID(entryClazz, "data_mask", "[B");

@@ -1657,6 +1658,8 @@ static void gattClientScanFilterAddNative(JNIEnv* env, jobject object,

    curr.company_mask = env->GetIntField(current.get(), companyMaskFid);

    curr.ad_type = env->GetByteField(current.get(), adTypeFid);

    ScopedLocalRef<jbyteArray> data(
        env, (jbyteArray)env->GetObjectField(current.get(), dataFid));
    if (data.get() != NULL) {
+15 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import java.util.UUID;
    public static final int TYPE_LOCAL_NAME = 4;
    public static final int TYPE_MANUFACTURER_DATA = 5;
    public static final int TYPE_SERVICE_DATA = 6;
    public static final int TYPE_ADVERTISING_DATA_TYPE = 7;

    // Max length is 31 - 3(flags) - 2 (one byte for length and one byte for type).
    private static final int MAX_LEN_PER_FIELD = 26;
@@ -56,6 +57,7 @@ import java.util.UUID;
        public String name;
        public int company;
        public int company_mask;
        public int ad_type;
        public byte[] data;
        public byte[] data_mask;
    }
@@ -145,6 +147,15 @@ import java.util.UUID;
        mEntries.add(entry);
    }

    void addAdvertisingDataType(int adType, byte[] data, byte[] dataMask) {
        Entry entry = new Entry();
        entry.type = TYPE_ADVERTISING_DATA_TYPE;
        entry.ad_type = adType;
        entry.data = data;
        entry.data_mask = dataMask;
        mEntries.add(entry);
    }

    Entry pop() {
        if (mEntries.isEmpty()) {
            return null;
@@ -226,6 +237,10 @@ import java.util.UUID;
                addServiceData(serviceData, serviceDataMask);
            }
        }
        if (filter.getAdvertisingDataType() > 0) {
            addAdvertisingDataType(filter.getAdvertisingDataType(),
                    filter.getAdvertisingData(), filter.getAdvertisingDataMask());
        }
    }

    private byte[] concate(ParcelUuid serviceDataUuid, byte[] serviceData) {
+1 −1
Original line number Diff line number Diff line
@@ -1171,7 +1171,7 @@ class CsisClientImpl : public CsisClient {
  void CsisActiveObserverSet(bool enable) {
    LOG(INFO) << __func__ << " CSIS Discovery SET: " << enable;

    bluetooth::shim::set_empty_filter(enable);
    bluetooth::shim::set_ad_type_rsi_filter(enable);
    BTA_DmBleCsisObserve(
        enable, [](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {
          /* If there's no instance we are most likely shutting
+13 −0
Original line number Diff line number Diff line
@@ -4827,6 +4827,7 @@ enum ApcfOpcode : 8 {
  LOCAL_NAME = 0x05,
  MANUFACTURER_DATA = 0x06,
  SERVICE_DATA = 0x07,
  AD_TYPE = 0x08,
}

// https://source.android.com/devices/bluetooth/hci_requirements#advertising-packet-content-filter
@@ -4870,6 +4871,7 @@ enum ApcfFilterType : 8 {
  LOCAL_NAME = 0x04,
  MANUFACTURER_DATA = 0x05,
  SERVICE_DATA = 0x06,
  AD_TYPE = 0x07,
}

packet LeAdvFilterSetFilteringParameters : LeAdvFilter (apcf_opcode = SET_FILTERING_PARAMETERS) {
@@ -4982,6 +4984,17 @@ packet LeAdvFilterServiceDataComplete : LeAdvFilterComplete (apcf_opcode = SERVI
  apcf_available_spaces : 8,
}

packet LeAdvFilterADType : LeAdvFilter (apcf_opcode = AD_TYPE) {
  apcf_action : ApcfAction,
  apcf_filter_index : 8,
  apcf_ad_type_data : 8[],
}

packet LeAdvFilterADTypeComplete : LeAdvFilterComplete (apcf_opcode = AD_TYPE) {
  apcf_action : ApcfAction,
  apcf_available_spaces : 8,
}

packet LeEnergyInfo : VendorCommand (op_code = LE_ENERGY_INFO) {
}

+1 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ class AdvertisingPacketContentFilterCommand {
  std::vector<uint8_t> name;
  uint16_t company;
  uint16_t company_mask;
  uint8_t ad_type;
  std::vector<uint8_t> data;
  std::vector<uint8_t> data_mask;
  std::array<uint8_t, 16> irk;
Loading