Closed makmorit closed 6 years ago
FDSによりFlash ROM書込み管理を行うと、書込みのために必要な領域がいっぱいになった場合、FDSの関数 (fds_record_update, fds_record_write) から「FDS_ERR_NO_SPACE_IN_FLASH」というステータスが戻ります。
該当箇所は下記4箇所になりますが、いずれの処理でも「FDS_ERR_NO_SPACE_IN_FLASH」というステータスが戻る可能性はあります。
static bool write_pairing_mode(void)
{
:
if (ret == FDS_SUCCESS) {
// 既存のデータが存在する場合は上書き
ret = fds_record_update(&record_desc, &record);
:
} else if (ret == FDS_ERR_NOT_FOUND) {
// 既存のデータが存在しない場合は新規追加
ret = fds_record_write(&record_desc, &record);
:
}
bool ble_u2f_flash_keydata_write(ble_u2f_context_t *p_u2f_context)
{
:
if (ret == FDS_SUCCESS) {
// 既存のデータが存在する場合は上書き
ret = fds_record_update(&record_desc, &record);
:
} else if (ret == FDS_ERR_NOT_FOUND) {
// 既存のデータが存在しない場合は新規追加
ret = fds_record_write(&record_desc, &record);
:
}
bool ble_u2f_flash_token_counter_write(ble_u2f_context_t *p_u2f_context, uint8_t *p_appid_hash, uint32_t token_counter, uint32_t reserve_word)
{
:
if (found == true) {
// 既存のデータが存在する場合は上書き
ret = fds_record_update(&record_desc, &record);
} else {
// 既存のデータが存在しない場合は新規追加
ret = fds_record_write(&record_desc, &record);
}
:
}
static bool write_random_vector(uint32_t *p_fds_record_buffer)
{
:
if (ret == FDS_SUCCESS) {
// 既存のデータが存在する場合は上書き
ret = fds_record_update(&record_desc, &record);
:
} else if (ret == FDS_ERR_NOT_FOUND) {
// 既存のデータが存在しない場合は新規追加
ret = fds_record_write(&record_desc, &record);
:
}
Chrome BookのBLEエクステンションは、BLE接続がキープされる仕様なので、(One Cardアプリケーション側で用意した)BLE接続の切断時に行われる、FDSのガベージコレクション(以下GCと略す)処理が行われない不具合があります。
このため、Chromeブラウザーで処理を再試行しても、FDSのリソース不足が解消されるタイミングがなく、エラーが発生し続けてしまいます。
また、同じくBLE接続がキープされる仕様のFIDO認証テストツール(BLECertificationTool.exe)でも、同様な問題が発生してしまいます。
上記問題・影響を踏まえ、以下の対策を施したいと考えます。
FDS書込処理 (fds_record_update, fds_record_write) から「FDS_ERR_NO_SPACE_IN_FLASH」というステータスが戻った場合、この時点ではレスポンスをリターンさせずに、まずFDS GCを実行。
その後、FDSイベントのコールバック関数で、GC完了イベントが検知されたら、ここで初めてエラーレスポンスをリターンさせるようにする。
エラーレスポンスは「0x9E01」で統一する。
問題が解決しましたのでcloseします。
確認された事象
U2Fトークン(One Card上のFIDO BLE U2Fサービス)を使って、U2FテストサイトにSign(テスト認証)を数回繰り返すと、nRF52ボードのリソース不足が原因で、処理が失敗する障害が発生。 (2017/11/30 14:52頃に発覚)
ログ
U2F管理ツール(U2FMaintenanceTool.app)のログ
nRF52のUARTログ
FDS(Flash ROM読み書き用のライブラリー)のリソース不足により「ble_u2f_flash:ERROR:fds_record_update returns 0x07 」のログが出力されていました。