@@ -47,7 +47,10 @@ BLEDeviceManager::BLEDeviceManager():
47
47
_local_name(" " ),
48
48
_state(BLE_PERIPH_STATE_NOT_READY),
49
49
_local_ble(NULL ),
50
- _peer_peripheral_index(0 )
50
+ _peer_peripheral_index(0 ),
51
+ _duplicate_filter_header(0 ),
52
+ _duplicate_filter_tail(0 ),
53
+ _adv_duplicate_filter_enabled(false )
51
54
{
52
55
memset (&_local_bda, 0 , sizeof (_local_bda));
53
56
memset (&_wait_for_connect_peripheral, 0 , sizeof (_wait_for_connect_peripheral));
@@ -530,7 +533,8 @@ BLEDevice BLEDeviceManager::peripheral()
530
533
531
534
bool BLEDeviceManager::startScanning ()
532
535
{
533
- _scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;// BT_HCI_LE_SCAN_FILTER_DUP_DISABLE;
536
+ _adv_duplicate_filter_enabled = false ;
537
+ _scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;
534
538
int err = bt_le_scan_start (&_scan_param, ble_central_device_found);
535
539
if (err)
536
540
{
@@ -542,14 +546,17 @@ bool BLEDeviceManager::startScanning()
542
546
543
547
bool BLEDeviceManager::startScanningWithDuplicates ()
544
548
{
549
+ _adv_duplicate_filter_enabled = true ;
550
+ memset (_peer_duplicate_address_buffer, 0 , sizeof (_peer_duplicate_address_buffer));
551
+
545
552
_scan_param.filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE;
546
553
int err = bt_le_scan_start (&_scan_param, ble_central_device_found);
547
554
if (err)
548
555
{
549
556
pr_info (LOG_MODULE_BLE, " Scanning failed to start (err %d)\n " , err);
550
557
return false ;
551
558
}
552
- return false ;
559
+ return true ;
553
560
}
554
561
555
562
bool BLEDeviceManager::stopScanning ()
@@ -1164,6 +1171,38 @@ bool BLEDeviceManager::advertiseDataProc(uint8_t type,
1164
1171
return false ;
1165
1172
}
1166
1173
1174
+ bool BLEDeviceManager::deviceInDuplicateFilterBuffer (const bt_addr_le_t * addr)
1175
+ {
1176
+ bool retVal = false ;
1177
+ for (uint8_t i = 0 ;
1178
+ i < (sizeof (_peer_duplicate_address_buffer) / sizeof (bt_addr_le_t ));
1179
+ i++)
1180
+ {
1181
+ if (0 == bt_addr_le_cmp (addr, &_peer_duplicate_address_buffer[i]))
1182
+ {
1183
+ retVal = true ;
1184
+ break ;
1185
+ }
1186
+ }
1187
+ return retVal;
1188
+ }
1189
+
1190
+ void BLEDeviceManager::updateDuplicateFilter (const bt_addr_le_t * addr)
1191
+ {
1192
+ uint8_t i = (_duplicate_filter_header + 1 ) % (ARRAY_SIZE (_peer_duplicate_address_buffer));
1193
+ if (deviceInDuplicateFilterBuffer (addr))
1194
+ {
1195
+ return ;
1196
+ }
1197
+ bt_addr_le_copy (&_peer_duplicate_address_buffer[_duplicate_filter_header],
1198
+ addr);
1199
+ if (i == _duplicate_filter_tail)
1200
+ {
1201
+ _duplicate_filter_tail = (_duplicate_filter_tail + 1 ) % (ARRAY_SIZE (_peer_duplicate_address_buffer));
1202
+ }
1203
+ _duplicate_filter_header = i;
1204
+ }
1205
+
1167
1206
BLEDevice BLEDeviceManager::available ()
1168
1207
{
1169
1208
BLEDevice tempdevice;
@@ -1179,6 +1218,13 @@ BLEDevice BLEDeviceManager::available()
1179
1218
temp = &_peer_adv_buffer[i];
1180
1219
if ((timestamp_delta <= 2000 ) && (max_delta < timestamp_delta))
1181
1220
{
1221
+ // Eable the duplicate filter
1222
+ if (_adv_duplicate_filter_enabled &&
1223
+ true == deviceInDuplicateFilterBuffer (temp))
1224
+ {
1225
+ _peer_adv_mill[i] -= 2000 ; // Invalid the item
1226
+ continue ;
1227
+ }
1182
1228
max_delta = timestamp_delta;
1183
1229
index = i;
1184
1230
}
@@ -1198,6 +1244,10 @@ BLEDevice BLEDeviceManager::available()
1198
1244
1199
1245
pr_debug (LOG_MODULE_BLE, " %s-%d:Con addr-%s" , __FUNCTION__, __LINE__, BLEUtils::macAddressBT2String (*temp).c_str ());
1200
1246
_peer_adv_mill[index ] -= 2000 ; // Set it as expired
1247
+ if (_adv_duplicate_filter_enabled)
1248
+ {
1249
+ updateDuplicateFilter (temp);
1250
+ }
1201
1251
}
1202
1252
}
1203
1253
return tempdevice;
0 commit comments