Skip to content

Commit 9dc1fc2

Browse files
adigiemaciejbaczmanski
authored andcommitted
[nrf fromtree] Fix and re-enable Zephyr native tests (#37333)
* [nrfconnect] Workaround for Zephyr native link issue Add temporary workaround for Zephyr native link issue. This will be fixed with the next NCS release. Signed-off-by: Adrian Gielniewski <adrian.gielniewski@gmail.com> * [nrfconnect] Fix PSA configuration in tests Signed-off-by: Adrian Gielniewski <adrian.gielniewski@gmail.com> * Add missing PSA initialization in some tests Signed-off-by: Adrian Gielniewski <adrian.gielniewski@gmail.com> * Fix hmac key handle validation when PSA is used Signed-off-by: Adrian Gielniewski <adrian.gielniewski@nordicsemi.no> * Fix heap memory check in TestChipCryptoPAL Wipe all key slots during each test case SetUp to avoid reusing slot previously used by other tests. This affects heap memory usage calculation as when the slot is reused it frees the memory. Signed-off-by: Adrian Gielniewski <adrian.gielniewski@nordicsemi.no> * Fix TestEventLoopHandler for Zephyr native Expect correct sequence for different LayerImplSelect::Signal implementations. When CHIP_SYSTEM_CONFIG_POSIX_LOCKING is not defined, WakeEvent::Notify is called and loop has to spin one more time to process the event. Signed-off-by: Adrian Gielniewski <adrian.gielniewski@gmail.com> --------- Signed-off-by: Adrian Gielniewski <adrian.gielniewski@gmail.com> Signed-off-by: Adrian Gielniewski <adrian.gielniewski@nordicsemi.no> (cherry picked from commit 7786bb639fe8e8778e82668dfbac26698477015e)
1 parent ca2af8c commit 9dc1fc2

File tree

7 files changed

+80
-59
lines changed

7 files changed

+80
-59
lines changed

src/app/icd/server/tests/TestICDMonitoringTable.cpp

+46-43
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
#include <lib/support/DefaultStorageKeyAllocator.h>
2727
#include <lib/support/TestPersistentStorageDelegate.h>
2828

29+
#if CHIP_CRYPTO_PSA
30+
#include <crypto/CHIPCryptoPALPSA.h>
31+
#endif
32+
2933
using namespace chip;
3034
using namespace chip::app::Clusters::IcdManagement;
3135

@@ -65,7 +69,30 @@ constexpr uint8_t kKeyBuffer3a[] = {
6569
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
6670
};
6771

68-
TEST(TestICDMonitoringTable, TestEntryAssignationOverload)
72+
struct TestICDMonitoringTable : public ::testing::Test
73+
{
74+
void SetUp() override
75+
{
76+
#if CHIP_CRYPTO_PSA
77+
ASSERT_EQ(psa_crypto_init(), PSA_SUCCESS);
78+
#endif
79+
}
80+
81+
void ValidateHmac128(const Crypto::Hmac128KeyHandle & saved, const Crypto::Hmac128KeyHandle & loaded)
82+
{
83+
#if CHIP_CRYPTO_PSA
84+
EXPECT_NE(saved.As<psa_key_id_t>(), loaded.As<psa_key_id_t>());
85+
EXPECT_GE(loaded.As<psa_key_id_t>(), to_underlying(Crypto::KeyIdBase::ICDKeyRangeStart));
86+
EXPECT_LE(loaded.As<psa_key_id_t>(), to_underlying(Crypto::KeyIdBase::Maximum));
87+
#else
88+
EXPECT_EQ(memcmp(saved.As<Crypto::Symmetric128BitsKeyByteArray>(), loaded.As<Crypto::Symmetric128BitsKeyByteArray>(),
89+
sizeof(Crypto::Symmetric128BitsKeyByteArray)),
90+
0);
91+
#endif
92+
}
93+
};
94+
95+
TEST_F(TestICDMonitoringTable, TestEntryAssignationOverload)
6996
{
7097
TestSessionKeystoreImpl keystore;
7198
ICDMonitoringEntry entry(&keystore);
@@ -100,7 +127,7 @@ TEST(TestICDMonitoringTable, TestEntryAssignationOverload)
100127
EXPECT_TRUE(entry2.IsKeyEquivalent(ByteSpan(kKeyBuffer1a)));
101128
}
102129

103-
TEST(TestICDMonitoringTable, TestEntryMaximumSize)
130+
TEST_F(TestICDMonitoringTable, TestEntryMaximumSize)
104131
{
105132
TestPersistentStorageDelegate storage;
106133
TestSessionKeystoreImpl keystore;
@@ -114,7 +141,7 @@ TEST(TestICDMonitoringTable, TestEntryMaximumSize)
114141
EXPECT_EQ(CHIP_NO_ERROR, table.Set(0, entry));
115142
}
116143

117-
TEST(TestICDMonitoringTable, TestEntryKeyFunctions)
144+
TEST_F(TestICDMonitoringTable, TestEntryKeyFunctions)
118145
{
119146
TestSessionKeystoreImpl keystore;
120147
ICDMonitoringEntry entry(&keystore);
@@ -140,7 +167,7 @@ TEST(TestICDMonitoringTable, TestEntryKeyFunctions)
140167
EXPECT_EQ(entry.DeleteKey(), CHIP_NO_ERROR);
141168
}
142169

143-
TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
170+
TEST_F(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
144171
{
145172
TestPersistentStorageDelegate storage;
146173
TestSessionKeystoreImpl keystore;
@@ -178,9 +205,7 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
178205
EXPECT_EQ(kClientNodeId12, entry.monitoredSubject);
179206
EXPECT_EQ(ClientTypeEnum::kPermanent, entry.clientType);
180207
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a)));
181-
EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
182-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
183-
0);
208+
ValidateHmac128(entry1.hmacKeyHandle, entry.hmacKeyHandle);
184209

185210
// Retrieve second entry
186211
EXPECT_EQ(CHIP_NO_ERROR, loading.Get(1, entry));
@@ -189,9 +214,7 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
189214
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
190215
EXPECT_EQ(ClientTypeEnum::kEphemeral, entry.clientType);
191216
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a)));
192-
EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
193-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
194-
0);
217+
ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle);
195218

196219
// No more entries
197220
EXPECT_EQ(CHIP_ERROR_NOT_FOUND, loading.Get(2, entry));
@@ -213,9 +236,7 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
213236
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
214237
EXPECT_EQ(ClientTypeEnum::kEphemeral, entry.clientType);
215238
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a)));
216-
EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
217-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
218-
0);
239+
ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle);
219240

220241
// Retrieve second entry
221242
EXPECT_EQ(CHIP_NO_ERROR, loading.Get(1, entry));
@@ -224,12 +245,10 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
224245
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
225246
EXPECT_EQ(ClientTypeEnum::kPermanent, entry.clientType);
226247
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b)));
227-
EXPECT_EQ(memcmp(entry4.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
228-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
229-
0);
248+
ValidateHmac128(entry4.hmacKeyHandle, entry.hmacKeyHandle);
230249
}
231250

232-
TEST(TestICDMonitoringTable, TestSaveAllInvalidRegistrationValues)
251+
TEST_F(TestICDMonitoringTable, TestSaveAllInvalidRegistrationValues)
233252
{
234253
TestPersistentStorageDelegate storage;
235254
TestSessionKeystoreImpl keystore;
@@ -271,7 +290,7 @@ TEST(TestICDMonitoringTable, TestSaveAllInvalidRegistrationValues)
271290
EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, table.Set(0, entry5));
272291
}
273292

274-
TEST(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics)
293+
TEST_F(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics)
275294
{
276295
TestPersistentStorageDelegate storage;
277296
TestSessionKeystoreImpl keystore;
@@ -314,32 +333,26 @@ TEST(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics)
314333
EXPECT_EQ(kClientNodeId11, entry.checkInNodeID);
315334
EXPECT_EQ(kClientNodeId12, entry.monitoredSubject);
316335
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a)));
317-
EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
318-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
319-
0);
336+
ValidateHmac128(entry1.hmacKeyHandle, entry.hmacKeyHandle);
320337

321338
// Retrieve fabric1, second entry
322339
EXPECT_EQ(CHIP_NO_ERROR, table1.Get(1, entry));
323340
EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex);
324341
EXPECT_EQ(kClientNodeId12, entry.checkInNodeID);
325342
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
326343
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b)));
327-
EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
328-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
329-
0);
344+
ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle);
330345

331346
// Retrieve fabric2, first entry
332347
EXPECT_EQ(CHIP_NO_ERROR, table2.Get(0, entry));
333348
EXPECT_EQ(kTestFabricIndex2, entry.fabricIndex);
334349
EXPECT_EQ(kClientNodeId21, entry.checkInNodeID);
335350
EXPECT_EQ(kClientNodeId22, entry.monitoredSubject);
336351
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a)));
337-
EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
338-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
339-
0);
352+
ValidateHmac128(entry3.hmacKeyHandle, entry.hmacKeyHandle);
340353
}
341354

342-
TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage)
355+
TEST_F(TestICDMonitoringTable, TestDeleteValidEntryFromStorage)
343356
{
344357
TestPersistentStorageDelegate storage;
345358
TestSessionKeystoreImpl keystore;
@@ -379,19 +392,15 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage)
379392
EXPECT_EQ(kClientNodeId11, entry.checkInNodeID);
380393
EXPECT_EQ(kClientNodeId12, entry.monitoredSubject);
381394
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a)));
382-
EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
383-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
384-
0);
395+
ValidateHmac128(entry1.hmacKeyHandle, entry.hmacKeyHandle);
385396

386397
// Retrieve second entry (not modified)
387398
EXPECT_EQ(CHIP_NO_ERROR, table1.Get(1, entry));
388399
EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex);
389400
EXPECT_EQ(kClientNodeId12, entry.checkInNodeID);
390401
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
391402
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a)));
392-
EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
393-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
394-
0);
403+
ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle);
395404

396405
// Remove (existing)
397406
EXPECT_EQ(CHIP_NO_ERROR, table1.Remove(0));
@@ -405,19 +414,15 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage)
405414
EXPECT_EQ(kClientNodeId12, entry.checkInNodeID);
406415
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
407416
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a)));
408-
EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
409-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
410-
0);
417+
ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle);
411418

412419
// Retrieve fabric2, first entry
413420
EXPECT_EQ(CHIP_NO_ERROR, table2.Get(0, entry));
414421
EXPECT_EQ(kTestFabricIndex2, entry.fabricIndex);
415422
EXPECT_EQ(kClientNodeId21, entry.checkInNodeID);
416423
EXPECT_EQ(kClientNodeId22, entry.monitoredSubject);
417424
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b)));
418-
EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
419-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
420-
0);
425+
ValidateHmac128(entry3.hmacKeyHandle, entry.hmacKeyHandle);
421426

422427
// Remove all (fabric 1)
423428
EXPECT_EQ(CHIP_NO_ERROR, table1.RemoveAll());
@@ -429,9 +434,7 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage)
429434
EXPECT_EQ(kClientNodeId21, entry.checkInNodeID);
430435
EXPECT_EQ(kClientNodeId22, entry.monitoredSubject);
431436
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b)));
432-
EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
433-
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
434-
0);
437+
ValidateHmac128(entry3.hmacKeyHandle, entry.hmacKeyHandle);
435438

436439
// Remove all (fabric 2)
437440
EXPECT_EQ(CHIP_NO_ERROR, table2.RemoveAll());

src/credentials/tests/TestFabricTable.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,9 @@ struct TestFabricTable : public ::testing::Test
203203
{
204204
DeviceLayer::SetConfigurationMgr(&DeviceLayer::ConfigurationManagerImpl::GetDefaultInstance());
205205
ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR);
206+
#if CHIP_CRYPTO_PSA
207+
ASSERT_EQ(psa_crypto_init(), PSA_SUCCESS);
208+
#endif
206209
}
207210
static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); }
208211
};

src/crypto/tests/TestChipCryptoPAL.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@
7373

7474
#if CHIP_CRYPTO_PSA
7575
#include <psa/crypto.h>
76+
extern "C" {
77+
psa_status_t psa_initialize_key_slots(void);
78+
void psa_wipe_all_key_slots(void);
79+
}
7680
#endif
7781

7882
using namespace chip;
@@ -287,14 +291,17 @@ static void TestAES_CTR_128_Decrypt(const AesCtrTestEntry * vector)
287291

288292
struct TestChipCryptoPAL : public ::testing::Test
289293
{
290-
static void SetUpTestSuite()
294+
static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); }
295+
static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); }
296+
297+
void SetUp() override
291298
{
292-
ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR);
293299
#if CHIP_CRYPTO_PSA
294300
psa_crypto_init();
301+
psa_wipe_all_key_slots();
302+
psa_initialize_key_slots();
295303
#endif
296304
}
297-
static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); }
298305
};
299306

300307
TEST_F(TestChipCryptoPAL, TestAES_CTR_128CryptTestVectors)

src/system/tests/TestEventLoopHandler.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,12 @@ TEST_F(TestEventLoopHandler, EventLoopHandlerSequence)
108108
});
109109

110110
chip::DeviceLayer::PlatformMgr().RunEventLoop();
111+
112+
#if CHIP_SYSTEM_CONFIG_POSIX_LOCKING
111113
EXPECT_EQ(loopHandler.trace, std::string("1AP2HP3R4"));
114+
#else
115+
EXPECT_EQ(loopHandler.trace, std::string("1APHP2HPHP3R4"));
116+
#endif
112117
}
113118

114119
TEST_F(TestEventLoopHandler, EventLoopHandlerWake)

src/test_driver/nrfconnect/main/include/CHIPProjectConfig.h

+3
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,7 @@
3333
// Enable unit-test only features
3434
#define CONFIG_BUILD_FOR_HOST_UNIT_TEST 1
3535

36+
// Increase max. lambda event size
37+
#define CHIP_CONFIG_LAMBDA_EVENT_SIZE 32
38+
3639
#endif // CHIP_PROJECT_CONFIG_H

src/test_driver/nrfconnect/main/include/app_mbedtls_config.h

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
*/
1818

1919
// Enable cryptographic functions needed by CHIP which can't be enabled via Kconfig
20-
#define MBEDTLS_HKDF_C
2120
#define MBEDTLS_X509_CREATE_C
2221
#define MBEDTLS_X509_CSR_PARSE_C
2322
#define MBEDTLS_X509_CSR_WRITE_C

src/test_driver/nrfconnect/prj.conf

+13-12
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,24 @@ CONFIG_MBEDTLS_HEAP_SIZE=65536
4343
CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=768
4444
CONFIG_MBEDTLS_USER_CONFIG_ENABLE=y
4545
CONFIG_MBEDTLS_USER_CONFIG_FILE="app_mbedtls_config.h"
46-
CONFIG_MBEDTLS_ZEPHYR_ENTROPY=y
47-
CONFIG_MBEDTLS_ENTROPY_ENABLED=y
48-
CONFIG_MBEDTLS_CTR_DRBG_ENABLED=y
49-
CONFIG_MBEDTLS_CIPHER_CCM_ENABLED=y
50-
CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
46+
CONFIG_MBEDTLS_ENTROPY_POLL_ZEPHYR=y
5147
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED=y
52-
CONFIG_MBEDTLS_ECDH_C=y
53-
CONFIG_MBEDTLS_ECDSA_C=y
54-
CONFIG_MBEDTLS_ECP_C=y
55-
CONFIG_MBEDTLS_PK_WRITE_C=y
56-
CONFIG_MBEDTLS_PKCS5_C=y
5748
CONFIG_MBEDTLS_PSA_CRYPTO_C=y
5849
CONFIG_MBEDTLS_MEMORY_DEBUG=y
5950
CONFIG_MBEDTLS_DEBUG=y
6051

61-
# Enable entropy
62-
CONFIG_ENTROPY_GENERATOR=y
52+
# PSA Crypto configuration
53+
CONFIG_PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY=y
54+
CONFIG_PSA_WANT_ALG_HMAC=y
55+
CONFIG_PSA_WANT_ALG_HKDF=y
56+
CONFIG_PSA_WANT_ALG_ECDSA=y
57+
CONFIG_PSA_WANT_ALG_ECDH=y
58+
CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE=y
59+
CONFIG_PSA_WANT_KEY_TYPE_AES=y
60+
CONFIG_PSA_WANT_ALG_CCM=y
61+
CONFIG_PSA_WANT_ALG_ECB_NO_PADDING=y
62+
CONFIG_PSA_WANT_ALG_SHA_1=y
63+
CONFIG_PSA_WANT_ECC_SECP_R1_256=y
6364

6465
# Disable OpenThread
6566
CONFIG_NET_L2_OPENTHREAD=n

0 commit comments

Comments
 (0)