Loading android/app/jni/com_android_bluetooth_gatt.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -1786,6 +1786,8 @@ static void gattClientScanFilterAddNative(JNIEnv* env, jobject object, jfieldID orgFid = env->GetFieldID(entryClazz, "org_id", "I"); jfieldID TDSFlagsFid = env->GetFieldID(entryClazz, "tds_flags", "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) { ApcfCommand curr{}; Loading Loading @@ -1881,6 +1883,19 @@ static void gattClientScanFilterAddNative(JNIEnv* env, jobject object, curr.org_id = env->GetIntField(current.get(), orgFid); curr.tds_flags = env->GetIntField(current.get(), TDSFlagsFid); 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); } Loading android/app/src/com/android/bluetooth/gatt/ScanFilterQueue.java +11 −3 Original line number Diff line number Diff line Loading @@ -50,6 +50,10 @@ import java.util.UUID; // Values defined in bluedroid. 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 { public byte type; public String address; Loading @@ -66,6 +70,8 @@ import java.util.UUID; public int org_id; public int tds_flags; public int tds_flags_mask; public int meta_data_type; public byte[] meta_data; } private Set<Entry> mEntries = new HashSet<Entry>(); Loading Loading @@ -154,7 +160,7 @@ import java.util.UUID; } 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.type = TYPE_TRANSPORT_DISCOVERY_DATA; entry.org_id = orgId; Loading @@ -162,6 +168,8 @@ import java.util.UUID; entry.tds_flags_mask = tdsFlagsMask; entry.data = transportData; entry.data_mask = transportDataMask; entry.meta_data_type = metaDataType; entry.meta_data = metaData; mEntries.add(entry); } Loading Loading @@ -265,12 +273,12 @@ import java.util.UUID; == OrganizationId.WIFI_ALLIANCE_NEIGHBOR_AWARENESS_NETWORKING) { addTransportDiscoveryData(transportBlockFilter.getOrgId(), transportBlockFilter.getTdsFlags(), transportBlockFilter.getTdsFlagsMask(), transportBlockFilter.getWifiNanHash(), null); null, null, TYPE_WIFI_NAN_HASH, transportBlockFilter.getWifiNanHash()); } else { addTransportDiscoveryData(transportBlockFilter.getOrgId(), transportBlockFilter.getTdsFlags(), transportBlockFilter.getTdsFlagsMask(), transportBlockFilter.getTransportData(), transportBlockFilter.getTransportDataMask()); transportBlockFilter.getTransportDataMask(), TYPE_INVALID, null); } } Loading system/gd/hci/hci_packets.pdl +21 −1 Original line number Diff line number Diff line Loading @@ -5206,12 +5206,32 @@ packet LeAdvFilterServiceDataComplete : LeAdvFilterComplete (apcf_opcode = SERVI apcf_available_spaces : 8, } packet LeAdvFilterTransportDiscoveryData : LeAdvFilter (apcf_opcode = TRANSPORT_DISCOVERY_DATA) { packet LeAdvFilterTransportDiscoveryDataOld : LeAdvFilter (apcf_opcode = TRANSPORT_DISCOVERY_DATA) { apcf_action : ApcfAction, apcf_filter_index : 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) { apcf_action : ApcfAction, apcf_available_spaces : 8, Loading system/gd/hci/le_scanning_callback.h +2 −0 Original line number Diff line number Diff line Loading @@ -106,6 +106,8 @@ class AdvertisingPacketContentFilterCommand { uint8_t org_id; uint8_t tds_flags; uint8_t tds_flags_mask; ApcfMetaDataType meta_data_type; std::vector<uint8_t> meta_data; uint8_t ad_type; std::vector<uint8_t> data; std::vector<uint8_t> data_mask; Loading system/gd/hci/le_scanning_manager.cc +54 −30 Original line number Diff line number Diff line Loading @@ -774,7 +774,9 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { filter.tds_flags, filter.tds_flags_mask, filter.data, filter.data_mask); filter.data_mask, filter.meta_data_type, filter.meta_data); break; } case ApcfFilterType::AD_TYPE: { Loading Loading @@ -978,12 +980,12 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { uint8_t tds_flags, uint8_t tds_flags_mask, std::vector<uint8_t> transport_data, std::vector<uint8_t> transport_data_mask) { std::vector<uint8_t> combined_data = {}; std::vector<uint8_t> transport_data_mask, ApcfMetaDataType meta_data_type, std::vector<uint8_t> meta_data) { 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. if (!is_transport_discovery_data_filter_supported_ && !(local_version_information.manufacturer_name_ == LMP_COMPID_QTI)) { Loading @@ -991,38 +993,60 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { 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( "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, tds_flags, tds_flags_mask, 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( 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)); } 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( Loading Loading
android/app/jni/com_android_bluetooth_gatt.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -1786,6 +1786,8 @@ static void gattClientScanFilterAddNative(JNIEnv* env, jobject object, jfieldID orgFid = env->GetFieldID(entryClazz, "org_id", "I"); jfieldID TDSFlagsFid = env->GetFieldID(entryClazz, "tds_flags", "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) { ApcfCommand curr{}; Loading Loading @@ -1881,6 +1883,19 @@ static void gattClientScanFilterAddNative(JNIEnv* env, jobject object, curr.org_id = env->GetIntField(current.get(), orgFid); curr.tds_flags = env->GetIntField(current.get(), TDSFlagsFid); 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); } Loading
android/app/src/com/android/bluetooth/gatt/ScanFilterQueue.java +11 −3 Original line number Diff line number Diff line Loading @@ -50,6 +50,10 @@ import java.util.UUID; // Values defined in bluedroid. 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 { public byte type; public String address; Loading @@ -66,6 +70,8 @@ import java.util.UUID; public int org_id; public int tds_flags; public int tds_flags_mask; public int meta_data_type; public byte[] meta_data; } private Set<Entry> mEntries = new HashSet<Entry>(); Loading Loading @@ -154,7 +160,7 @@ import java.util.UUID; } 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.type = TYPE_TRANSPORT_DISCOVERY_DATA; entry.org_id = orgId; Loading @@ -162,6 +168,8 @@ import java.util.UUID; entry.tds_flags_mask = tdsFlagsMask; entry.data = transportData; entry.data_mask = transportDataMask; entry.meta_data_type = metaDataType; entry.meta_data = metaData; mEntries.add(entry); } Loading Loading @@ -265,12 +273,12 @@ import java.util.UUID; == OrganizationId.WIFI_ALLIANCE_NEIGHBOR_AWARENESS_NETWORKING) { addTransportDiscoveryData(transportBlockFilter.getOrgId(), transportBlockFilter.getTdsFlags(), transportBlockFilter.getTdsFlagsMask(), transportBlockFilter.getWifiNanHash(), null); null, null, TYPE_WIFI_NAN_HASH, transportBlockFilter.getWifiNanHash()); } else { addTransportDiscoveryData(transportBlockFilter.getOrgId(), transportBlockFilter.getTdsFlags(), transportBlockFilter.getTdsFlagsMask(), transportBlockFilter.getTransportData(), transportBlockFilter.getTransportDataMask()); transportBlockFilter.getTransportDataMask(), TYPE_INVALID, null); } } Loading
system/gd/hci/hci_packets.pdl +21 −1 Original line number Diff line number Diff line Loading @@ -5206,12 +5206,32 @@ packet LeAdvFilterServiceDataComplete : LeAdvFilterComplete (apcf_opcode = SERVI apcf_available_spaces : 8, } packet LeAdvFilterTransportDiscoveryData : LeAdvFilter (apcf_opcode = TRANSPORT_DISCOVERY_DATA) { packet LeAdvFilterTransportDiscoveryDataOld : LeAdvFilter (apcf_opcode = TRANSPORT_DISCOVERY_DATA) { apcf_action : ApcfAction, apcf_filter_index : 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) { apcf_action : ApcfAction, apcf_available_spaces : 8, Loading
system/gd/hci/le_scanning_callback.h +2 −0 Original line number Diff line number Diff line Loading @@ -106,6 +106,8 @@ class AdvertisingPacketContentFilterCommand { uint8_t org_id; uint8_t tds_flags; uint8_t tds_flags_mask; ApcfMetaDataType meta_data_type; std::vector<uint8_t> meta_data; uint8_t ad_type; std::vector<uint8_t> data; std::vector<uint8_t> data_mask; Loading
system/gd/hci/le_scanning_manager.cc +54 −30 Original line number Diff line number Diff line Loading @@ -774,7 +774,9 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { filter.tds_flags, filter.tds_flags_mask, filter.data, filter.data_mask); filter.data_mask, filter.meta_data_type, filter.meta_data); break; } case ApcfFilterType::AD_TYPE: { Loading Loading @@ -978,12 +980,12 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { uint8_t tds_flags, uint8_t tds_flags_mask, std::vector<uint8_t> transport_data, std::vector<uint8_t> transport_data_mask) { std::vector<uint8_t> combined_data = {}; std::vector<uint8_t> transport_data_mask, ApcfMetaDataType meta_data_type, std::vector<uint8_t> meta_data) { 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. if (!is_transport_discovery_data_filter_supported_ && !(local_version_information.manufacturer_name_ == LMP_COMPID_QTI)) { Loading @@ -991,38 +993,60 @@ struct LeScanningManager::impl : public LeAddressManagerCallback { 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( "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, tds_flags, tds_flags_mask, 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( 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)); } 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( Loading