]> granicus.if.org Git - esp-idf/commitdiff
component/bt: Fix bug when add device to whitelist twice
authorbaohongde <baohongde@espressif.com>
Tue, 2 Jan 2018 09:20:34 +0000 (17:20 +0800)
committerbaohongde <baohongde@espressif.com>
Tue, 2 Jan 2018 09:20:34 +0000 (17:20 +0800)
components/bt/bluedroid/stack/btm/btm_ble_bgconn.c

index 1a9b12654b50933f01e79286ef18185645d2ebc6..ef3f6c2db20a528440f3b8b2c0045e7028ffafaa 100644 (file)
@@ -69,7 +69,7 @@ static void background_connections_lazy_init()
     }
 }
 
-static void background_connection_add(bt_bdaddr_t *address)
+static BOOLEAN background_connection_add(bt_bdaddr_t *address)
 {
     assert(address);
     background_connections_lazy_init();
@@ -78,14 +78,17 @@ static void background_connection_add(bt_bdaddr_t *address)
         connection = osi_calloc(sizeof(background_connection_t));
         connection->address = *address;
         hash_map_set(background_connections, &(connection->address), connection);
+        return TRUE;
     }
+    return FALSE;
 }
 
-static void background_connection_remove(bt_bdaddr_t *address)
+static BOOLEAN background_connection_remove(bt_bdaddr_t *address)
 {
     if (address && background_connections) {
-        hash_map_erase(background_connections, address);
+        return hash_map_erase(background_connections, address);
     }
+    return FALSE;
 }
 
 static void background_connections_clear()
@@ -262,17 +265,30 @@ BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, tBTM_ADD_W
         BTM_TRACE_DEBUG("%s Whitelist full, unable to add device", __func__);
         return FALSE;
     }
-    if (add_wl_cb){
-        //save add whitelist complete callback
-        p_cb->add_wl_cb = add_wl_cb;
-    }
 
     if (to_add) {
         /* added the bd_addr to the connection hash map queue */
-        background_connection_add((bt_bdaddr_t *)bd_addr);
+        if(!background_connection_add((bt_bdaddr_t *)bd_addr)) {
+            /* if the bd_addr already exist in whitelist, just callback return TRUE */
+            if (add_wl_cb){
+                add_wl_cb(HCI_SUCCESS,to_add);
+            }
+            return TRUE;
+        }
     } else {
         /* remove the bd_addr to the connection hash map queue */
-        background_connection_remove((bt_bdaddr_t *)bd_addr);
+        if(!background_connection_remove((bt_bdaddr_t *)bd_addr)){
+            /* if the bd_addr don't exist in whitelist, just callback return TRUE */
+            if (add_wl_cb){
+                add_wl_cb(HCI_SUCCESS,to_add);
+            }
+            return TRUE;
+        }
+    }
+
+    if (add_wl_cb){
+        //save add whitelist complete callback
+        p_cb->add_wl_cb = add_wl_cb;
     }
     /* stop the auto connect */
     btm_suspend_wl_activity(p_cb->wl_state);