diff --git a/system/stack/include/smp_api_types.h b/system/stack/include/smp_api_types.h index 47e4078fadb7e50a0fa10bd355d1f58a0e541705..12b64f35c997f3f201a36969dda375f3b020c26d 100644 --- a/system/stack/include/smp_api_types.h +++ b/system/stack/include/smp_api_types.h @@ -26,6 +26,7 @@ #include "bt_target.h" // Must be first to define build configuration #include "stack/include/bt_octets.h" #include "stack/include/btm_status.h" +#include "stack/include/smp_status.h" #include "types/ble_address_with_type.h" #include "types/raw_address.h" @@ -102,77 +103,6 @@ typedef enum : uint8_t { SMP_LE_ADDR_ASSOC_EVT = 15, /* Identity address association event */ } tSMP_EVT; -/* pairing failure reason code */ -typedef enum : uint8_t { - SMP_SUCCESS = 0, - SMP_PASSKEY_ENTRY_FAIL = 0x01, - SMP_OOB_FAIL = 0x02, - SMP_PAIR_AUTH_FAIL = 0x03, - SMP_CONFIRM_VALUE_ERR = 0x04, - SMP_PAIR_NOT_SUPPORT = 0x05, - SMP_ENC_KEY_SIZE = 0x06, - SMP_INVALID_CMD = 0x07, - SMP_PAIR_FAIL_UNKNOWN = 0x08, - SMP_REPEATED_ATTEMPTS = 0x09, - SMP_INVALID_PARAMETERS = 0x0A, - SMP_DHKEY_CHK_FAIL = 0x0B, - SMP_NUMERIC_COMPAR_FAIL = 0x0C, - SMP_BR_PARING_IN_PROGR = 0x0D, - SMP_XTRANS_DERIVE_NOT_ALLOW = 0x0E, - SMP_MAX_FAIL_RSN_PER_SPEC = SMP_XTRANS_DERIVE_NOT_ALLOW, - - /* self defined error code */ - SMP_PAIR_INTERNAL_ERR = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x01), /* 0x0F */ - - /* Unknown IO capability, unable to decide association model */ - SMP_UNKNOWN_IO_CAP = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x02), /* 0x10 */ - - SMP_BUSY = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x05), /* 0x13 */ - SMP_ENC_FAIL = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x06), /* 0x14 */ - SMP_STARTED = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x07), /* 0x15 */ - SMP_RSP_TIMEOUT = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x08), /* 0x16 */ - - /* Unspecified failure reason */ - SMP_FAIL = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0A), /* 0x18 */ - - SMP_CONN_TOUT = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0B), /* 0x19 */ -} tSMP_STATUS; - -#define CASE_RETURN_TEXT(code) \ - case code: \ - return #code - -inline std::string smp_status_text(const tSMP_STATUS& status) { - switch (status) { - CASE_RETURN_TEXT(SMP_SUCCESS); - CASE_RETURN_TEXT(SMP_PASSKEY_ENTRY_FAIL); - CASE_RETURN_TEXT(SMP_OOB_FAIL); - CASE_RETURN_TEXT(SMP_PAIR_AUTH_FAIL); - CASE_RETURN_TEXT(SMP_CONFIRM_VALUE_ERR); - CASE_RETURN_TEXT(SMP_PAIR_NOT_SUPPORT); - CASE_RETURN_TEXT(SMP_ENC_KEY_SIZE); - CASE_RETURN_TEXT(SMP_INVALID_CMD); - CASE_RETURN_TEXT(SMP_PAIR_FAIL_UNKNOWN); - CASE_RETURN_TEXT(SMP_REPEATED_ATTEMPTS); - CASE_RETURN_TEXT(SMP_INVALID_PARAMETERS); - CASE_RETURN_TEXT(SMP_DHKEY_CHK_FAIL); - CASE_RETURN_TEXT(SMP_NUMERIC_COMPAR_FAIL); - CASE_RETURN_TEXT(SMP_BR_PARING_IN_PROGR); - CASE_RETURN_TEXT(SMP_XTRANS_DERIVE_NOT_ALLOW); - CASE_RETURN_TEXT(SMP_PAIR_INTERNAL_ERR); - CASE_RETURN_TEXT(SMP_UNKNOWN_IO_CAP); - CASE_RETURN_TEXT(SMP_BUSY); - CASE_RETURN_TEXT(SMP_ENC_FAIL); - CASE_RETURN_TEXT(SMP_STARTED); - CASE_RETURN_TEXT(SMP_RSP_TIMEOUT); - CASE_RETURN_TEXT(SMP_FAIL); - CASE_RETURN_TEXT(SMP_CONN_TOUT); - default: - return base::StringPrintf("UNKNOWN[%hhu]", status); - } -} -#undef CASE_RETURN_TEXT - /* Device IO capability */ #define SMP_IO_CAP_IO BTM_IO_CAP_IO /* DisplayYesNo */ #define SMP_IO_CAP_KBDISP BTM_IO_CAP_KBDISP /* Keyboard Display */ diff --git a/system/stack/include/smp_status.h b/system/stack/include/smp_status.h new file mode 100644 index 0000000000000000000000000000000000000000..10c6e59483f3d7ca1e5f396e6c7fc6075cb5bfc0 --- /dev/null +++ b/system/stack/include/smp_status.h @@ -0,0 +1,96 @@ +/****************************************************************************** + * + * Copyright 1999-2012 Broadcom Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#pragma once + +#include <base/strings/stringprintf.h> + +#include <cstdint> + +/* pairing failure reason code */ +typedef enum : uint8_t { + SMP_SUCCESS = 0, + SMP_PASSKEY_ENTRY_FAIL = 0x01, + SMP_OOB_FAIL = 0x02, + SMP_PAIR_AUTH_FAIL = 0x03, + SMP_CONFIRM_VALUE_ERR = 0x04, + SMP_PAIR_NOT_SUPPORT = 0x05, + SMP_ENC_KEY_SIZE = 0x06, + SMP_INVALID_CMD = 0x07, + SMP_PAIR_FAIL_UNKNOWN = 0x08, + SMP_REPEATED_ATTEMPTS = 0x09, + SMP_INVALID_PARAMETERS = 0x0A, + SMP_DHKEY_CHK_FAIL = 0x0B, + SMP_NUMERIC_COMPAR_FAIL = 0x0C, + SMP_BR_PARING_IN_PROGR = 0x0D, + SMP_XTRANS_DERIVE_NOT_ALLOW = 0x0E, + SMP_MAX_FAIL_RSN_PER_SPEC = SMP_XTRANS_DERIVE_NOT_ALLOW, + + /* self defined error code */ + SMP_PAIR_INTERNAL_ERR = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x01), /* 0x0F */ + + /* Unknown IO capability, unable to decide association model */ + SMP_UNKNOWN_IO_CAP = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x02), /* 0x10 */ + + SMP_BUSY = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x05), /* 0x13 */ + SMP_ENC_FAIL = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x06), /* 0x14 */ + SMP_STARTED = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x07), /* 0x15 */ + SMP_RSP_TIMEOUT = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x08), /* 0x16 */ + + /* Unspecified failure reason */ + SMP_FAIL = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0A), /* 0x18 */ + + SMP_CONN_TOUT = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0B), /* 0x19 */ +} tSMP_STATUS; + +#ifndef CASE_RETURN_TEXT +#define CASE_RETURN_TEXT(code) \ + case code: \ + return #code +#endif + +inline std::string smp_status_text(const tSMP_STATUS& status) { + switch (status) { + CASE_RETURN_TEXT(SMP_SUCCESS); + CASE_RETURN_TEXT(SMP_PASSKEY_ENTRY_FAIL); + CASE_RETURN_TEXT(SMP_OOB_FAIL); + CASE_RETURN_TEXT(SMP_PAIR_AUTH_FAIL); + CASE_RETURN_TEXT(SMP_CONFIRM_VALUE_ERR); + CASE_RETURN_TEXT(SMP_PAIR_NOT_SUPPORT); + CASE_RETURN_TEXT(SMP_ENC_KEY_SIZE); + CASE_RETURN_TEXT(SMP_INVALID_CMD); + CASE_RETURN_TEXT(SMP_PAIR_FAIL_UNKNOWN); + CASE_RETURN_TEXT(SMP_REPEATED_ATTEMPTS); + CASE_RETURN_TEXT(SMP_INVALID_PARAMETERS); + CASE_RETURN_TEXT(SMP_DHKEY_CHK_FAIL); + CASE_RETURN_TEXT(SMP_NUMERIC_COMPAR_FAIL); + CASE_RETURN_TEXT(SMP_BR_PARING_IN_PROGR); + CASE_RETURN_TEXT(SMP_XTRANS_DERIVE_NOT_ALLOW); + CASE_RETURN_TEXT(SMP_PAIR_INTERNAL_ERR); + CASE_RETURN_TEXT(SMP_UNKNOWN_IO_CAP); + CASE_RETURN_TEXT(SMP_BUSY); + CASE_RETURN_TEXT(SMP_ENC_FAIL); + CASE_RETURN_TEXT(SMP_STARTED); + CASE_RETURN_TEXT(SMP_RSP_TIMEOUT); + CASE_RETURN_TEXT(SMP_FAIL); + CASE_RETURN_TEXT(SMP_CONN_TOUT); + default: + return base::StringPrintf("UNKNOWN[%hhu]", status); + } +} +#undef CASE_RETURN_TEXT diff --git a/system/stack/test/stack_smp_test.cc b/system/stack/test/stack_smp_test.cc index bf44284234609537c6adb8596a4885491a1c3ec1..edd82321b28df65e5c66a83a8b3e9a35ca8073b2 100644 --- a/system/stack/test/stack_smp_test.cc +++ b/system/stack/test/stack_smp_test.cc @@ -28,6 +28,7 @@ #include "stack/include/acl_api.h" #include "stack/include/bt_octets.h" #include "stack/include/smp_api.h" +#include "stack/include/smp_status.h" #include "stack/smp/p_256_ecc_pp.h" #include "stack/smp/smp_int.h" #include "test/common/mock_functions.h" @@ -35,6 +36,8 @@ #include "types/hci_role.h" #include "types/raw_address.h" +using testing::StrEq; + tBTM_CB btm_cb; const std::string kSmpOptions("mock smp options"); @@ -140,8 +143,6 @@ Octet16 smp_gen_p2_4_confirm(tSMP_CB* p_cb, const RawAddress& remote_bda); tSMP_STATUS smp_calculate_comfirm(tSMP_CB* p_cb, const Octet16& rand, Octet16* output); -namespace testing { - void dump_uint128(const Octet16& a, char* buffer) { for (unsigned int i = 0; i < OCTET16_LEN; ++i) { snprintf(buffer, 3, "%02x", a[i]); @@ -174,7 +175,7 @@ Octet16 parse_uint128(const char* input) { return output; } -class SmpCalculateConfirmTest : public Test { +class SmpCalculateConfirmTest : public testing::Test { protected: tSMP_CB p_cb_; // Set random to 0x5783D52156AD6F0E6388274EC6702EE0 @@ -401,4 +402,43 @@ TEST(SmpEccValidationTest, test_invalid_points) { EXPECT_FALSE(ECC_ValidatePoint(p)); } -} // namespace testing + +TEST(SmpStatusText, smp_status_text) { + std::vector<std::pair<tSMP_STATUS, std::string>> status = { + std::make_pair(SMP_SUCCESS, "SMP_SUCCESS"), + std::make_pair(SMP_PASSKEY_ENTRY_FAIL, "SMP_PASSKEY_ENTRY_FAIL"), + std::make_pair(SMP_OOB_FAIL, "SMP_OOB_FAIL"), + std::make_pair(SMP_PAIR_AUTH_FAIL, "SMP_PAIR_AUTH_FAIL"), + std::make_pair(SMP_CONFIRM_VALUE_ERR, "SMP_CONFIRM_VALUE_ERR"), + std::make_pair(SMP_PAIR_NOT_SUPPORT, "SMP_PAIR_NOT_SUPPORT"), + std::make_pair(SMP_ENC_KEY_SIZE, "SMP_ENC_KEY_SIZE"), + std::make_pair(SMP_INVALID_CMD, "SMP_INVALID_CMD"), + std::make_pair(SMP_PAIR_FAIL_UNKNOWN, "SMP_PAIR_FAIL_UNKNOWN"), + std::make_pair(SMP_REPEATED_ATTEMPTS, "SMP_REPEATED_ATTEMPTS"), + std::make_pair(SMP_INVALID_PARAMETERS, "SMP_INVALID_PARAMETERS"), + std::make_pair(SMP_DHKEY_CHK_FAIL, "SMP_DHKEY_CHK_FAIL"), + std::make_pair(SMP_NUMERIC_COMPAR_FAIL, "SMP_NUMERIC_COMPAR_FAIL"), + std::make_pair(SMP_BR_PARING_IN_PROGR, "SMP_BR_PARING_IN_PROGR"), + std::make_pair(SMP_XTRANS_DERIVE_NOT_ALLOW, + "SMP_XTRANS_DERIVE_NOT_ALLOW"), + std::make_pair(SMP_MAX_FAIL_RSN_PER_SPEC, + "SMP_XTRANS_DERIVE_NOT_ALLOW"), // NOTE: Dup + std::make_pair(SMP_PAIR_INTERNAL_ERR, "SMP_PAIR_INTERNAL_ERR"), + std::make_pair(SMP_UNKNOWN_IO_CAP, "SMP_UNKNOWN_IO_CAP"), + std::make_pair(SMP_BUSY, "SMP_BUSY"), + std::make_pair(SMP_ENC_FAIL, "SMP_ENC_FAIL"), + std::make_pair(SMP_STARTED, "SMP_STARTED"), + std::make_pair(SMP_RSP_TIMEOUT, "SMP_RSP_TIMEOUT"), + std::make_pair(SMP_FAIL, "SMP_FAIL"), + std::make_pair(SMP_CONN_TOUT, "SMP_CONN_TOUT"), + }; + for (const auto& stat : status) { + ASSERT_STREQ(stat.second.c_str(), smp_status_text(stat.first).c_str()); + } + auto unknown = + base::StringPrintf("UNKNOWN[%hhu]", std::numeric_limits<uint8_t>::max()); + ASSERT_STREQ(unknown.c_str(), + smp_status_text(static_cast<tSMP_STATUS>( + std::numeric_limits<uint8_t>::max())) + .c_str()); +}