PM_EVT_CONN_SEC_CONFIG_REQ and PM_EVT_CONN_SEC_PARAMS_REQ continuously triggered when bonding.

I'm developing my project by nrf5 SDK in nrf52832.

Pairing and bonding used in my project and implemented by peer_manager.The pm_evt_handler() defined as follow:

static void pm_evt_handler(pm_evt_t const * p_evt)
{
    ret_code_t err_code;
    NRF_LOG_DEBUG("PMID:%d EVT:%d",p_evt->peer_id,p_evt->evt_id);
    switch (p_evt->evt_id)
    {
        case PM_EVT_CONN_SEC_SUCCEEDED:
        {
            pm_conn_sec_status_t conn_sec_status;

            // Check if the link is authenticated (meaning at least MITM).
            err_code = pm_conn_sec_status_get(p_evt->conn_handle, &conn_sec_status);
            APP_ERROR_CHECK(err_code);

            if (conn_sec_status.mitm_protected)
            {
                NRF_LOG_INFO("Link secured. Role: %d. conn_handle: %d, Procedure: %d",
                             ble_conn_state_role(p_evt->conn_handle),
                             p_evt->conn_handle,
                             p_evt->params.conn_sec_succeeded.procedure);
                uint8_t conn_num;
                for (uint8_t i = 0; i < NRF_SDH_BLE_PERIPHERAL_LINK_COUNT; i++)
                {
                    if (conn_dev[i].dev_params.conn_handle == m_conn_handle)
                    {
                        conn_num = i;
                        break;
                    }
                }
                fds_record_desc_t desc = {0};
                fds_find_token_t  tok  = {0};
                fds_flash_record_t config = {0};
                pm_peer_id_get(conn_dev[conn_num].dev_params.conn_handle,&conn_dev[conn_num].dev_info.peer_id);
                if (conn_dev[conn_num].dev_info.peer_id == PM_PEER_ID_INVALID)
                {
                    conn_dev[conn_num].dev_info.peer_id = p_evt->peer_id;
                }
                conn_dev[conn_num].dev_info.peer_id = p_evt->peer_id;
                bool bonded = false;
                while (!fds_record_find(USR_FILE,USERDATA_KEY,&desc,&tok))
                {
                    struct flash_dev_t data;
                    fds_record_open(&desc,&config);
                    memcpy(&data,config.p_data,sizeof(data));
                    fds_record_close(&desc);
                    if (data.peer_id == conn_dev[conn_num].dev_info.peer_id)
                    {
                        conn_dev[conn_num].dev_info = data;
                        bonded = true;
                        break;
                    }
                }
                if (!bonded)
                {
                    user_list.peer_id = conn_dev[conn_num].dev_info.peer_id;
                    user_list.type = app_env_params.add_flag;
                    user_list.open_rssi = 0xFF;
                    user_list.keep_rssi = 0xFF;
                    name_init();
                    conn_dev[conn_num].dev_info = user_list;
                    ret_code_t err_code;
                    struct fds_list_t *new_point;
                    struct fds_list_t *end_point = &fds_list;
                    for (uint8_t i = 0; i < fds_list.type; i++)
                    {
                        end_point = end_point->next;
                    }
                    new_point = (struct fds_list_t *)malloc(sizeof(struct fds_list_t));
                    if (new_point != NULL)
                    {
                        new_point->type = 0;
                        new_point->mess = user_list;
                        end_point->next = new_point;
                        new_point->next = NULL;
                        fds_list.type++;
                    }
                }
                if (app_env_params.sp_dev_add)
                {
                    struct conn_dev_t mess_dev;
                    uint8_t data_array[] = {0xAA,0xCC,11,0x03,0x06,0,app_env_params.notify_id,
                                            p_evt->peer_id,0x01,0xFF,0x55};
                    for (size_t i = 0; i < NRF_SDH_BLE_PERIPHERAL_LINK_COUNT; i++)
                    {
                        if (app_env_params.notify_id == conn_dev[i].dev_info.peer_id)
                        {
                            mess_dev = conn_dev[i];
                            break;
                        }
                    }
                    check_alg_xor(data_array);
                    nus_send_data(mess_dev,data_array);
                    app_env_params.sp_dev_add = false;
                }
            }
            else
            {
                // The peer did not use MITM, disconnect.
                NRF_LOG_INFO("Collector did not use MITM, disconnecting");
                err_code = pm_peer_id_get(m_conn_handle, &m_peer_to_be_deleted);
                APP_ERROR_CHECK(err_code);
                err_code = sd_ble_gap_disconnect(m_conn_handle,
                                                 BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
                APP_ERROR_CHECK(err_code);
            }
            //conn_dev list output
            uint32_t periph_link_cnt = ble_conn_state_peripheral_conn_count();
            if (periph_link_cnt < NRF_SDH_BLE_PERIPHERAL_LINK_COUNT)
            {
                advertising_start();
            }
        } break;

        case PM_EVT_CONN_SEC_FAILED:
        {
            NRF_LOG_INFO("Failed to secure connection. Disconnecting.");
            NRF_LOG_INFO("%d %04x %02x",p_evt->params.conn_sec_failed.procedure,p_evt->params.conn_sec_failed.error,p_evt->params.conn_sec_failed.error_src);
            if (app_env_params.sp_dev_add)
            {
                struct conn_dev_t mess_dev;
                uint8_t data_array[] = {0xAA,0xCC,11,0x03,0x06,0,app_env_params.notify_id,
                                        p_evt->peer_id,0x02,0xFF,0x55};
                for (size_t i = 0; i < NRF_SDH_BLE_PERIPHERAL_LINK_COUNT; i++)
                {
                    if (app_env_params.notify_id == conn_dev[i].dev_info.peer_id)
                    {
                        mess_dev = conn_dev[i];
                        break;
                    }
                }
                check_alg_xor(data_array);
                nus_send_data(mess_dev,data_array); 
                app_env_params.sp_dev_add = false;
            }
            err_code = sd_ble_gap_disconnect(m_conn_handle,
                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
            advertising_start();
        } break;

        case PM_EVT_CONN_SEC_CONFIG_REQ:
        {
            // Reject pairing request from an already bonded peer.
            pm_conn_sec_config_t conn_sec_config = {.allow_repairing = true};
            pm_conn_sec_config_reply(p_evt->conn_handle, &conn_sec_config);
        } break;

        case PM_EVT_STORAGE_FULL:
        {
            // Run garbage collection on the flash.
            err_code = fds_gc();
            if (err_code == FDS_ERR_NO_SPACE_IN_QUEUES)
            {
                // Retry.
            }
            else
            {
                APP_ERROR_CHECK(err_code);
            }
        } break;

        case PM_EVT_PEERS_DELETE_SUCCEEDED:
        {
            //advertising_start();
        } break;

        case PM_EVT_PEER_DATA_UPDATE_FAILED:
        {
            // Assert.
            APP_ERROR_CHECK(p_evt->params.peer_data_update_failed.error);
        } break;

        case PM_EVT_PEER_DELETE_FAILED:
        {
            // Assert.
            APP_ERROR_CHECK(p_evt->params.peer_delete_failed.error);
        } break;

        case PM_EVT_PEERS_DELETE_FAILED:
        {
            // Assert.
            APP_ERROR_CHECK(p_evt->params.peers_delete_failed_evt.error);
        } break;

        case PM_EVT_ERROR_UNEXPECTED:
        {
            // Assert.
            APP_ERROR_CHECK(p_evt->params.error_unexpected.error);
        } break;

        case PM_EVT_CONN_SEC_START:
        case PM_EVT_PEER_DATA_UPDATE_SUCCEEDED:
        case PM_EVT_PEER_DELETE_SUCCEEDED:
        case PM_EVT_LOCAL_DB_CACHE_APPLIED:
        case PM_EVT_LOCAL_DB_CACHE_APPLY_FAILED:
            // This can happen when the local DB has changed.
        case PM_EVT_SERVICE_CHANGED_IND_SENT:
        case PM_EVT_SERVICE_CHANGED_IND_CONFIRMED:
        default:
            break;
    }
}

Due to the implementation of HID service, I can use my phone to connect directly to Bluetooth that advertised by my board.

After running for a while,I try to using my phone connect and bond with my board.The phone's Bluetooth keeps saying it's pairing.

The log of my board see as follow:

It tell me that PM_EVT_CONN_SEC_CONFIG_REQ and PM_EVT_CONN_SEC_PARAMS_REQ keeping be triggered.And it will keep until pairing failures are displayed on the phone.

How can I to deal it?

pm_evt_handler

Related