양산 모드인 경우 BLE 보안 실패 처리 개선
- PM 핸들러 중복 호출 제거 - conn_sec_failed 재페어링 로직 일원화 - NRF_ERROR_BUSY 크래시 수정: 보안 실패 시 보드 리셋되는 현상 개선
This commit is contained in:
@@ -97,9 +97,8 @@ void ble_security_quick_pm_handler(pm_evt_t const *p_evt)
|
|||||||
|
|
||||||
// Call standard handlers (required)
|
// Call standard handlers (required)
|
||||||
pm_handler_on_pm_evt(p_evt);
|
pm_handler_on_pm_evt(p_evt);
|
||||||
pm_handler_disconnect_on_sec_failure(p_evt);
|
|
||||||
pm_handler_flash_clean(p_evt);
|
pm_handler_flash_clean(p_evt);
|
||||||
|
|
||||||
// Handle events
|
// Handle events
|
||||||
switch (p_evt->evt_id) {
|
switch (p_evt->evt_id) {
|
||||||
case PM_EVT_CONN_SEC_SUCCEEDED:
|
case PM_EVT_CONN_SEC_SUCCEEDED:
|
||||||
@@ -109,17 +108,26 @@ void ble_security_quick_pm_handler(pm_evt_t const *p_evt)
|
|||||||
DBG_PRINTF("PROD: Link secured (bonded)\r\n");
|
DBG_PRINTF("PROD: Link secured (bonded)\r\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PM_EVT_CONN_SEC_FAILED:
|
case PM_EVT_CONN_SEC_FAILED:
|
||||||
DBG_PRINTF("Security failed: error=%d\r\n",
|
DBG_PRINTF("Security failed: error=%d\r\n",
|
||||||
p_evt->params.conn_sec_failed.error);
|
p_evt->params.conn_sec_failed.error);
|
||||||
|
|
||||||
// Auto-retry if key missing
|
|
||||||
if (p_evt->params.conn_sec_failed.error == PM_CONN_SEC_ERROR_PIN_OR_KEY_MISSING) {
|
if (p_evt->params.conn_sec_failed.error == PM_CONN_SEC_ERROR_PIN_OR_KEY_MISSING) {
|
||||||
|
// Key missing: 재페어링 시도, 실패 시 disconnect로 폴백
|
||||||
err_code = pm_conn_secure(p_evt->conn_handle, true);
|
err_code = pm_conn_secure(p_evt->conn_handle, true);
|
||||||
if (err_code != NRF_ERROR_INVALID_STATE) {
|
if (err_code != NRF_ERROR_INVALID_STATE &&
|
||||||
|
err_code != NRF_ERROR_BUSY &&
|
||||||
|
err_code != BLE_ERROR_INVALID_CONN_HANDLE) {
|
||||||
APP_ERROR_CHECK(err_code);
|
APP_ERROR_CHECK(err_code);
|
||||||
}
|
}
|
||||||
|
if (err_code != NRF_SUCCESS) {
|
||||||
|
// 재페어링 불가 → disconnect
|
||||||
|
pm_handler_disconnect_on_sec_failure(p_evt);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 기타 보안 실패 → disconnect
|
||||||
|
pm_handler_disconnect_on_sec_failure(p_evt);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
* 빌드 설정
|
* 빌드 설정
|
||||||
* DEBUG_MINIMAL_BOOT 삭제 26.03.26 jhChun
|
* DEBUG_MINIMAL_BOOT 삭제 26.03.26 jhChun
|
||||||
*============================================================================*/
|
*============================================================================*/
|
||||||
#define BLE_DEV_MODE 1 /* 1: 개발 모드 (보안 없음), 0: 양산 모드 (패스키 필수) */
|
#define BLE_DEV_MODE 0 /* 1: 개발 모드 (보안 없음), 0: 양산 모드 (패스키 필수) */
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
* 하드웨어 핀 정의
|
* 하드웨어 핀 정의
|
||||||
@@ -890,10 +890,7 @@ static void pm_evt_handler(pm_evt_t const * p_evt)
|
|||||||
uint32_t return_code;
|
uint32_t return_code;
|
||||||
ret_code_t err_code;
|
ret_code_t err_code;
|
||||||
|
|
||||||
/* SDK 기본 핸들러 체인 호출 */
|
/* SDK 기본 핸들러 + 보안 처리 (ble_quick_security 내부에서 SDK 핸들러 호출) */
|
||||||
pm_handler_on_pm_evt(p_evt);
|
|
||||||
pm_handler_disconnect_on_sec_failure(p_evt);
|
|
||||||
pm_handler_flash_clean(p_evt);
|
|
||||||
ble_security_quick_pm_handler(p_evt);
|
ble_security_quick_pm_handler(p_evt);
|
||||||
|
|
||||||
switch (p_evt->evt_id)
|
switch (p_evt->evt_id)
|
||||||
@@ -924,21 +921,14 @@ static void pm_evt_handler(pm_evt_t const * p_evt)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* 보안 연결 실패 → PIN/키 누락 시 강제 재페어링 시도 */
|
/* 보안 연결 실패 (retry/disconnect는 ble_quick_security에서 처리) */
|
||||||
case PM_EVT_CONN_SEC_FAILED:
|
case PM_EVT_CONN_SEC_FAILED:
|
||||||
DBG_PRINTF("[PM] Sec failed\r\n");
|
DBG_PRINTF("[PM] Sec failed\r\n");
|
||||||
if (p_evt->params.conn_sec_failed.error == PM_CONN_SEC_ERROR_PIN_OR_KEY_MISSING)
|
|
||||||
{
|
|
||||||
err_code = pm_conn_secure(p_evt->conn_handle, true);
|
|
||||||
if (err_code != NRF_ERROR_INVALID_STATE)
|
|
||||||
{
|
|
||||||
APP_ERROR_CHECK(err_code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* 모든 본딩 삭제 완료 → 광고 재시작 */
|
/* 모든 본딩 삭제 완료 → 광고 재시작 */
|
||||||
case PM_EVT_PEERS_DELETE_SUCCEEDED:
|
case PM_EVT_PEERS_DELETE_SUCCEEDED:
|
||||||
|
DBG_PRINTF("[PM] Bonds erased\r\n");
|
||||||
advertising_start(false);
|
advertising_start(false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user