diff --git a/src/lib/spinel/radio_spinel.cpp b/src/lib/spinel/radio_spinel.cpp index 285409bf2..71a441d51 100644 --- a/src/lib/spinel/radio_spinel.cpp +++ b/src/lib/spinel/radio_spinel.cpp @@ -2188,12 +2188,16 @@ void RadioSpinel::RestoreProperties(void) otLinkGetFrameCounter(mInstance) + kFrameCounterGuard)); } + SuccessOrDie(Set(SPINEL_PROP_MAC_SRC_MATCH_SHORT_ADDRESSES, nullptr)); + for (int i = 0; i < mSrcMatchShortEntryCount; ++i) { SuccessOrDie( Insert(SPINEL_PROP_MAC_SRC_MATCH_SHORT_ADDRESSES, SPINEL_DATATYPE_UINT16_S, mSrcMatchShortEntries[i])); } + SuccessOrDie(Set(SPINEL_PROP_MAC_SRC_MATCH_EXTENDED_ADDRESSES, nullptr)); + for (int i = 0; i < mSrcMatchExtEntryCount; ++i) { SuccessOrDie( diff --git a/tests/gtest/radio_spinel_rcp_test.cpp b/tests/gtest/radio_spinel_rcp_test.cpp index 1851b0656..9370c1072 100644 --- a/tests/gtest/radio_spinel_rcp_test.cpp +++ b/tests/gtest/radio_spinel_rcp_test.cpp @@ -490,3 +490,31 @@ TEST(RadioSpinelSrcMatch, shouldBeAbleToClearAllRadioSrcMatchExtEntres) ASSERT_EQ(platform.SrcMatchCountExtEntries(), 0); } + +TEST(RadioSpinelSrcMatch, shouldNotDuplicateSrcMatchEntriesOnRestoreProperties) +{ + constexpr uint16_t kTestShortAddr = 0x1234; + constexpr otExtAddress kTestExtAddr{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; + constexpr otExtAddress kTestExtAddrReversed{0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11}; + FakeCoprocessorPlatform platform; + + ASSERT_EQ(platform.mRadioSpinel.Enable(FakePlatform::CurrentInstance()), kErrorNone); + + ASSERT_EQ(platform.mRadioSpinel.AddSrcMatchShortEntry(kTestShortAddr), kErrorNone); + ASSERT_EQ(platform.mRadioSpinel.AddSrcMatchExtEntry(kTestExtAddr), kErrorNone); + + ASSERT_EQ(platform.SrcMatchCountShortEntries(), 1); + ASSERT_EQ(platform.SrcMatchCountExtEntries(), 1); + ASSERT_EQ(platform.SrcMatchHasShortEntry(kTestShortAddr), 1); + ASSERT_EQ(platform.SrcMatchHasExtEntry(kTestExtAddrReversed), 1); + + // Simulate RCP recovery by calling RestoreProperties multiple times. + // Without clearing entries first, this would create duplicates. + platform.mRadioSpinel.RestoreProperties(); + platform.mRadioSpinel.RestoreProperties(); + + ASSERT_EQ(platform.SrcMatchCountShortEntries(), 1); + ASSERT_EQ(platform.SrcMatchCountExtEntries(), 1); + ASSERT_EQ(platform.SrcMatchHasShortEntry(kTestShortAddr), 1); + ASSERT_EQ(platform.SrcMatchHasExtEntry(kTestExtAddrReversed), 1); +}