OSDN Git Service

Don't start the authentication when peer device already started it
authorilbeom.kim <ilbeom.kim@lge.com>
Wed, 11 Apr 2018 23:26:10 +0000 (08:26 +0900)
committerilbeom.kim <ilbeom.kim@lge.com>
Wed, 11 Apr 2018 23:26:10 +0000 (08:26 +0900)
If host gets link_key_request event from the controller, it means peer
device started the authentication.
In this case, host should not start the authentication because it will
be caused the authentication collision by controller side.

This sequence can be referred at BT 4.2 core specification document,
p.1388, Figure 4.2.

Bug: 74241491
Test: Manual
      - Connect Android wear to Android phone
      - Turn off BT on Android wear
      - Turn on BT on Android wear
      - Observe the logcat whether connection time is within 30 seconds
      Android Wear Stability Test

Change-Id: I138d45316ea75dd96444c36bde36ce15a64b669a

stack/btm/btm_sec.cc

index b080901..87601a0 100644 (file)
@@ -4046,6 +4046,8 @@ void btm_sec_encrypt_change(uint16_t handle, uint8_t status,
                       __func__, p_dev_rec, p_dev_rec->p_callback);
       p_dev_rec->p_callback = NULL;
       l2cu_resubmit_pending_sec_req(&p_dev_rec->bd_addr);
+    } else if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) {
+      p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
     }
     return;
   }
@@ -4700,6 +4702,7 @@ void btm_sec_link_key_request(const RawAddress& bda) {
   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_or_alloc_dev(bda);
 
   VLOG(2) << __func__ << " bda: " << bda;
+  p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
 
   if ((btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) &&
       (btm_cb.collision_start_time != 0) &&