You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by na...@apache.org on 2022/08/25 13:17:58 UTC

[mynewt-nimble] 01/02: host: add Pairing Complete GAP event

This is an automated email from the ASF dual-hosted git repository.

naraj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 0c9bb5d050212711bf924f2262dded535a442c79
Author: Krzysztof Kopyściński <kr...@codecoup.pl>
AuthorDate: Wed Sep 22 14:32:13 2021 +0200

    host: add Pairing Complete GAP event
    
    Added event to inform application via GAP event that peer completed
    pairing with reason code. This is required by SM/CEN/KDU/BI-02-C.
---
 nimble/host/include/host/ble_gap.h | 19 +++++++++++++++++++
 nimble/host/include/host/ble_sm.h  |  4 +++-
 nimble/host/src/ble_gap.c          | 14 ++++++++++++++
 nimble/host/src/ble_gap_priv.h     |  1 +
 nimble/host/src/ble_sm.c           |  9 +++++++++
 5 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/nimble/host/include/host/ble_gap.h b/nimble/host/include/host/ble_gap.h
index 83aacacd..5ff34f58 100644
--- a/nimble/host/include/host/ble_gap.h
+++ b/nimble/host/include/host/ble_gap.h
@@ -137,6 +137,7 @@ struct hci_conn_update;
 #define BLE_GAP_EVENT_PERIODIC_TRANSFER     24
 #define BLE_GAP_EVENT_PATHLOSS_THRESHOLD    25
 #define BLE_GAP_EVENT_TRANSMIT_POWER        26
+#define BLE_GAP_EVENT_PARING_COMPLETE       27
 
 /*** Reason codes for the subscribe GAP event. */
 
@@ -1023,6 +1024,24 @@ struct ble_gap_event {
 	    uint8_t delta;
 	} transmit_power;
 #endif
+        /**
+         * Represents a received Pairing Complete message
+         *
+         * Valid for the following event types:
+         *     o BLE_GAP_EVENT_PARING_COMPLETE
+         */
+        struct {
+            /**
+             * Indicates the result of the encryption state change attempt;
+             *     o 0: the encrypted state was successfully updated;
+             *     o BLE host error code: the encryption state change attempt
+             *       failed for the specified reason.
+             */
+            int status;
+
+            /** The handle of the relevant connection. */
+            uint16_t conn_handle;
+        } pairing_complete;
     };
 };
 
diff --git a/nimble/host/include/host/ble_sm.h b/nimble/host/include/host/ble_sm.h
index ceebb856..ff381cf2 100644
--- a/nimble/host/include/host/ble_sm.h
+++ b/nimble/host/include/host/ble_sm.h
@@ -27,6 +27,7 @@
 extern "C" {
 #endif
 
+#define BLE_SM_ERR_SUCCESS                      0x00
 #define BLE_SM_ERR_PASSKEY                      0x01
 #define BLE_SM_ERR_OOB                          0x02
 #define BLE_SM_ERR_AUTHREQ                      0x03
@@ -41,7 +42,8 @@ extern "C" {
 #define BLE_SM_ERR_NUMCMP                       0x0c
 #define BLE_SM_ERR_ALREADY                      0x0d
 #define BLE_SM_ERR_CROSS_TRANS                  0x0e
-#define BLE_SM_ERR_MAX_PLUS_1                   0x0f
+#define BLE_SM_ERR_KEY_REJ                      0x0f
+#define BLE_SM_ERR_MAX_PLUS_1                   0x10
 
 #define BLE_SM_PAIR_ALG_JW                      0
 #define BLE_SM_PAIR_ALG_PASSKEY                 1
diff --git a/nimble/host/src/ble_gap.c b/nimble/host/src/ble_gap.c
index 289ad591..0dcf9358 100644
--- a/nimble/host/src/ble_gap.c
+++ b/nimble/host/src/ble_gap.c
@@ -5898,6 +5898,20 @@ ble_gap_repeat_pairing_event(const struct ble_gap_repeat_pairing *rp)
 #endif
 }
 
+void
+ble_gap_pairing_complete_event(uint16_t conn_handle, int status)
+{
+#if NIMBLE_BLE_SM && NIMBLE_BLE_CONNECT
+    struct ble_gap_event event;
+
+    memset(&event, 0, sizeof event);
+    event.type = BLE_GAP_EVENT_PARING_COMPLETE;
+    event.pairing_complete.conn_handle = conn_handle;
+    event.pairing_complete.status = status;
+    ble_gap_call_conn_event_cb(&event, conn_handle);
+#endif
+}
+
 /*****************************************************************************
  * $rssi                                                                     *
  *****************************************************************************/
diff --git a/nimble/host/src/ble_gap_priv.h b/nimble/host/src/ble_gap_priv.h
index ca85db3d..06c4d16b 100644
--- a/nimble/host/src/ble_gap_priv.h
+++ b/nimble/host/src/ble_gap_priv.h
@@ -135,6 +135,7 @@ void ble_gap_subscribe_event(uint16_t conn_handle, uint16_t attr_handle,
 void ble_gap_mtu_event(uint16_t conn_handle, uint16_t cid, uint16_t mtu);
 void ble_gap_identity_event(uint16_t conn_handle);
 int ble_gap_repeat_pairing_event(const struct ble_gap_repeat_pairing *rp);
+void ble_gap_pairing_complete_event(uint16_t conn_handle, int status);
 int ble_gap_master_in_progress(void);
 
 void ble_gap_preempt(void);
diff --git a/nimble/host/src/ble_sm.c b/nimble/host/src/ble_sm.c
index 0339e3eb..71b9f769 100644
--- a/nimble/host/src/ble_sm.c
+++ b/nimble/host/src/ble_sm.c
@@ -933,6 +933,12 @@ ble_sm_process_result(uint16_t conn_handle, struct ble_sm_result *res)
 
         ble_hs_unlock();
 
+        if (res->enc_cb &&
+            res->app_status != BLE_HS_ENOTCONN) {
+            /* Do not send this event on broken connection */
+            ble_gap_pairing_complete_event(conn_handle, res->sm_err);
+        }
+
         if (proc == NULL) {
             break;
         }
@@ -2053,6 +2059,8 @@ ble_sm_key_exch_success(struct ble_sm_proc *proc, struct ble_sm_result *res)
     res->app_status = 0;
     res->enc_cb = 1;
     res->bonded = bonded;
+
+    res->sm_err = BLE_SM_ERR_SUCCESS;
 }
 
 static void
@@ -2423,6 +2431,7 @@ ble_sm_fail_rx(uint16_t conn_handle, struct os_mbuf **om,
         cmd = (struct ble_sm_pair_fail *)(*om)->om_data;
 
         res->app_status = BLE_HS_SM_PEER_ERR(cmd->reason);
+        res->sm_err =  cmd->reason;
     }
 }