]> granicus.if.org Git - esp-idf/commitdiff
Component/bt: fix receive adv pkt when enable duplicate scan
authorzhiweijian <zhiweijian@espressif.com>
Fri, 23 Nov 2018 12:03:40 +0000 (20:03 +0800)
committerzhiweijian <zhiweijian@espressif.com>
Mon, 17 Dec 2018 07:51:28 +0000 (15:51 +0800)
components/bt/bluedroid/stack/btm/btm_ble_gap.c

index a3d4b85126d35861095ed03aeef2159200f77d27..2bbd8e3ea7286acec3d76281b0072991803eacce 100644 (file)
@@ -3316,9 +3316,26 @@ static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt
     BOOLEAN     update = TRUE;
     UINT8       result = 0;
 
-   //if scan duplicate is enabled, the adv packet without scan response is allowed to report to higgher layer
+    /* Event_Type:
+        0x00 Connectable undirected advertising (ADV_IND).
+        0x01 Connectable directed advertising (ADV_DIRECT_IND)
+        0x02 Scannable undirected advertising (ADV_SCAN_IND)
+        0x03 Non connectable undirected advertising (ADV_NONCONN_IND)
+        0x04 Scan Response (SCAN_RSP)
+        0x05-0xFF Reserved for future use 
+    */
+   //if scan duplicate is enabled, the adv packet without scan response is allowed to report to higher layer
    if(p_le_inq_cb->scan_duplicate_filter == BTM_BLE_SCAN_DUPLICATE_ENABLE) {
-       if(memcmp(bda, p_le_inq_cb->adv_addr, BD_ADDR_LEN) != 0) {
+       /*
+        Bluedroid will put the advertising packet and scan response into a packet and send it to the higher layer.
+        If two advertising packets are not with the same address, or can't be combined into a packet, then the first advertising 
+        packet will be discarded. So we added the following judgment:
+        1. For different addresses, send the last advertising packet to higher layer
+        2. For same address and same advertising type (not scan response), send the last advertising packet to higher layer
+        3. For same address and scan response, do nothing
+        */
+       int same_addr = memcmp(bda, p_le_inq_cb->adv_addr, BD_ADDR_LEN);
+       if (same_addr != 0 || (same_addr == 0 && evt_type != BTM_BLE_SCAN_RSP_EVT)) {
             btm_ble_process_last_adv_pkt();
        }
    }