]> granicus.if.org Git - esp-idf/commitdiff
Component/bt: do not update connection params when already have keys in slave
authorzhiweijian <zhiweijian@espressif.com>
Mon, 2 Apr 2018 07:33:04 +0000 (15:33 +0800)
committerzhiweijian <zhiweijian@espressif.com>
Mon, 2 Apr 2018 11:44:09 +0000 (19:44 +0800)
components/bt/bluedroid/stack/btm/btm_ble.c
components/bt/bluedroid/stack/include/btm_int.h
components/bt/bluedroid/stack/smp/smp_act.c
components/bt/bluedroid/stack/smp/smp_utils.c

index 9dc9191f4ed56d7bf8825fe0552486b9c41ef2ad..507e3e7f64605e5400263d4a8961bd5bd529a16e 100644 (file)
@@ -1447,6 +1447,12 @@ tBTM_STATUS btm_ble_set_encryption (BD_ADDR bd_addr, void *p_ref_data, UINT8 lin
             }
         }
 
+        // already have encrypted information, do not need to update connection parameters
+        if(link_role == BTM_ROLE_SLAVE && (p_rec->ble.key_type & BTM_LE_KEY_PENC)) {
+            p_rec->ble.skip_update_conn_param = true;
+        } else {
+            p_rec->ble.skip_update_conn_param = false;    
+        }
         if (SMP_Pair(bd_addr) == SMP_STARTED) {
             cmd = BTM_CMD_STARTED;
             p_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
index 79a10cf71411959834856652ac4256cfd0f50c08..c45e88f063510ff173b2c11d1a8d5120ff59df88 100644 (file)
@@ -485,6 +485,7 @@ typedef struct {
 #if SMP_INCLUDED == TRUE
     tBTM_LE_KEY_TYPE    key_type;       /* bit mask of valid key types in record */
     tBTM_SEC_BLE_KEYS   keys;           /* LE device security info in slave rode */
+    bool skip_update_conn_param;        /* skip update connection paraams or not*/
 #endif
 #if (BLE_PRIVACY_SPT == TRUE)
     tBLE_ADDR_TYPE      current_addr_type; /* current adv addr type*/  
index 99f248accf79a5fd7db1a0c9412b7664d5986b71..10c8821f5d0bd5e1c5d1202a3342609cd0366e2f 100644 (file)
@@ -1389,6 +1389,11 @@ void smp_idle_terminate(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
 *******************************************************************************/
 void smp_fast_conn_param(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
 {
+    tBTM_SEC_DEV_REC    *p_rec = btm_find_dev (p_cb->pairing_bda);
+    if(p_rec && p_rec->ble.skip_update_conn_param) {
+        //do nothing
+        return;
+    }
     /* Disable L2CAP connection parameter updates while bonding since
        some peripherals are not able to revert to fast connection parameters
        during the start of service discovery. Connection paramter updates
index aa596df1d5ef987bad14dca69e38553f7e702806..ba039bfcb420496753fbf85b05712e4529820acc 100644 (file)
@@ -951,6 +951,7 @@ void smp_proc_pairing_cmpl(tSMP_CB *p_cb)
     tSMP_EVT_DATA   evt_data = {0};
     tSMP_CALLBACK   *p_callback = p_cb->p_callback;
     BD_ADDR         pairing_bda;
+    tBTM_SEC_DEV_REC    *p_rec;
 
     SMP_TRACE_DEBUG ("smp_proc_pairing_cmpl \n");
 
@@ -975,7 +976,13 @@ void smp_proc_pairing_cmpl(tSMP_CB *p_cb)
     memcpy (pairing_bda, p_cb->pairing_bda, BD_ADDR_LEN);
 
     if (p_cb->role == HCI_ROLE_SLAVE) {
-        L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, TRUE);
+        p_rec = btm_find_dev (p_cb->pairing_bda);
+        if(p_rec && p_rec->ble.skip_update_conn_param) {
+            //clear flag
+            p_rec->ble.skip_update_conn_param = false;
+        } else {
+            L2CA_EnableUpdateBleConnParams(p_cb->pairing_bda, TRUE);
+        }
     }
     smp_reset_control_value(p_cb);