Skip to content

Commit 214d051

Browse files
committed
Treat all ADDRMGR entries with empty extAddr as empty
1 parent 11ec842 commit 214d051

File tree

4 files changed

+161
-29
lines changed

4 files changed

+161
-29
lines changed

tests/application/test_startup.py

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
FormedZStack1CC2531,
1818
FormedZStack3CC2531,
1919
FormedLaunchpadCC26X2R1,
20+
load_nvram_json,
2021
)
2122

2223
pytestmark = [pytest.mark.asyncio]
@@ -270,29 +271,25 @@ async def test_auto_form_necessary(device, make_application, mocker):
270271
await app.shutdown()
271272

272273

273-
@pytest.mark.parametrize("device", [FormedZStack1CC2531, FormedZStack3CC2531])
274+
class BadAddrMgrZStack3CC2531(FormedZStack3CC2531):
275+
def __init__(self, *args, **kwargs):
276+
super().__init__(*args, **kwargs)
277+
278+
self._nvram = load_nvram_json("CC2531-ZStack3.bad_addrmgr.json")
279+
280+
281+
@pytest.mark.parametrize("device", [BadAddrMgrZStack3CC2531])
274282
async def test_addrmgr_rewrite_fix(device, make_application, mocker):
275283
app, znp_server = make_application(server_cls=device)
276284

277285
nvram = znp_server._nvram[ExNvIds.LEGACY]
278-
279-
assert (
280-
nvram[OsalNvIds.ADDRMGR].count(const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1.serialize())
281-
> 2
282-
)
283-
nvram[OsalNvIds.ADDRMGR] = nvram[OsalNvIds.ADDRMGR].replace(
284-
const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1.serialize(),
285-
const.EMPTY_ADDR_MGR_ENTRY_ZSTACK3.serialize(),
286-
2,
287-
)
288-
289-
assert const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1.serialize() in nvram[OsalNvIds.ADDRMGR]
290-
assert const.EMPTY_ADDR_MGR_ENTRY_ZSTACK3.serialize() in nvram[OsalNvIds.ADDRMGR]
286+
old_addrmgr = nvram[OsalNvIds.ADDRMGR]
287+
assert old_addrmgr.count(const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1.serialize()) == 0
291288

292289
await app.startup()
293290
await app.shutdown()
294291

295-
assert const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1.serialize() in nvram[OsalNvIds.ADDRMGR]
296-
assert (
297-
const.EMPTY_ADDR_MGR_ENTRY_ZSTACK3.serialize() not in nvram[OsalNvIds.ADDRMGR]
298-
)
292+
new_addrmgr = nvram[OsalNvIds.ADDRMGR]
293+
294+
assert old_addrmgr != new_addrmgr
295+
assert new_addrmgr.count(const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1.serialize()) != 0
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
{
2+
"LEGACY": {
3+
"HAS_CONFIGURED_ZSTACK3": "55",
4+
"EXTADDR": "7766554433221100",
5+
"STARTUP_OPTION": "00",
6+
"START_DELAY": "0a",
7+
"NIB": "e80502101410001e0000000105018f070002051e00001400000000000000000000cdab08000010000f0f0400010000000100000000eacdabdebceacdab010000000000000000000000000000000000000000000000000000000000000000000000003c030001780a010000000000",
8+
"DEVICE_LIST": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
9+
"ADDRMGR": "02dd0b111b8ddf5931126f02742940043e6247cd1d420101a8c897b1d162b767c202db97cf963755cd161d1c025bb8bb217ff94a66409302fca7a796a690d38a8c4502a2623d4eb5a7607ee97c02e78dd30941b1bf371f7f026821ae2c6ad764c650560210b83589802b85e2881402f4a4bf4d2a401be35f800297a576e82c1cd5c5737c02c35a1ffe1a3026764d7c02c9910356212e600e0c7d0210958db2f88e38b874cd0235c2770d5bfcbc636a07025f1999c1403334d82af50256bd3f61b7a1442dc73302b485b96b65f1be414326024dbda3ca242c8a1a485701beecbec077c4b1b7d745013f6014185a7e8564b0de01c8714a76f1cfe55bc05d014acbd45ff18555e3c3b801a732c2264b3fba5d344701092ebd0da62d16489033014eb1e8d6e2eeac22442b01ae87094f53d54601161e01cd1a387d64515907911401cd552ba3f223143bff3901ea0d572dc8cd1057d62d01f6141a2550c47c3a253901c129d94fb3f23839afa40131cbe89872585c6823c60226230237f796c9b1a3af01e745c44b6a6976e7f84e02784299aae6f9a7dcd22e02f8c195d4e6ddc67dbf270284bcbae2e24f9610535202f1f1aaf59de3af4fdb1d0234b1fe2245ce187d543e01b2b010e6680ed0330d0d026bfca00e9dd422e7e309ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
10+
"POLL_RATE_OLD16": "e803",
11+
"QUEUED_POLL_RATE": "6400",
12+
"RESPONSE_POLL_RATE": "6400",
13+
"REJOIN_POLL_RATE": "b801",
14+
"DATA_RETRIES": "02",
15+
"POLL_FAILURE_RETRIES": "02",
16+
"STACK_PROFILE": "02",
17+
"INDIRECT_MSG_TIMEOUT": "07",
18+
"ROUTE_EXPIRY_TIME": "1e",
19+
"EXTENDED_PAN_ID": "eacdabdebceacdab",
20+
"BCAST_RETRIES": "02",
21+
"PASSIVE_ACK_TIMEOUT": "05",
22+
"BCAST_DELIVERY_TIME": "1e",
23+
"NWK_MODE": "02",
24+
"CONCENTRATOR_ENABLE": "01",
25+
"CONCENTRATOR_DISCOVERY": "78",
26+
"CONCENTRATOR_RADIUS": "0a",
27+
"POLL_RATE": "e8030000",
28+
"CONCENTRATOR_RC": "01",
29+
"NWK_MGR_MODE": "01",
30+
"SRC_RTG_EXPIRY_TIME": "ff",
31+
"ROUTE_DISCOVERY_TIME": "05",
32+
"NWK_ACTIVE_KEY_INFO": "009ff3fa6d89b5c31cfc2a42bfed719921",
33+
"NWK_ALTERN_KEY_INFO": "009ff3fa6d89b5c31cfc2a42bfed719921",
34+
"ROUTER_OFF_ASSOC_CLEANUP": "00",
35+
"NWK_LEAVE_REQ_ALLOWED": "01",
36+
"NWK_CHILD_AGE_ENABLE": "00",
37+
"DEVICE_LIST_KA_TIMEOUT": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
38+
"BINDING_TABLE": "0000ffffffffffffffffffffffffffff",
39+
"GROUP_TABLE": "0000ffffffffffffffffffffffffffffffffffffff",
40+
"APS_FRAME_RETRIES": "03",
41+
"APS_ACK_WAIT_DURATION": "b80b",
42+
"APS_ACK_WAIT_MULTIPLIER": "02",
43+
"BINDING_TIME": "803e",
44+
"APS_USE_EXT_PANID": "eacdabdebceacdab",
45+
"APS_USE_INSECURE_JOIN": "01",
46+
"COMMISSIONED_NWK_ADDR": "feff",
47+
"APS_NONMEMBER_RADIUS": "02",
48+
"APS_LINK_KEY_TABLE": "1900000001020101000202010300030201",
49+
"APS_DUPREJ_TIMEOUT_INC": "e803",
50+
"APS_DUPREJ_TIMEOUT_COUNT": "0a",
51+
"APS_DUPREJ_TABLE_SIZE": "0500",
52+
"NWK_PARENT_INFO": "01",
53+
"NWK_ENDDEV_TIMEOUT_DEF": "08",
54+
"END_DEV_TIMEOUT_VALUE": "08",
55+
"END_DEV_CONFIGURATION": "00",
56+
"BDBNODEISONANETWORK": "01",
57+
"PRECFGKEY": "9ff3fa6d89b5c31cfc2a42bfed719921",
58+
"PRECFGKEYS_ENABLE": "00",
59+
"SECURITY_MODE": "04",
60+
"SECURE_PERMIT_JOIN": "01",
61+
"APS_LINK_KEY_TYPE": "01",
62+
"APS_ALLOW_R19_SECURITY": "00",
63+
"USE_DEFAULT_TCLK": "01",
64+
"TRUSTCENTER_ADDR": "0000000000000000",
65+
"LEGACY_NWK_SEC_MATERIAL_TABLE_START+0": "ca464c00eacdabdebceacdab",
66+
"LEGACY_NWK_SEC_MATERIAL_TABLE_START+1": "000000000000000000000000",
67+
"USERDESC": "0000000000000000000000000000000000",
68+
"NWKKEY": "009ff3fa6d89b5c31cfc2a42bfed719921ca464c00",
69+
"PANID": "cdab",
70+
"CHANLIST": "00001000",
71+
"LEAVE_CTRL": "00",
72+
"SCAN_DURATION": "04",
73+
"LOGICAL_TYPE": "00",
74+
"NWKMGR_MIN_TX": "14",
75+
"ZDO_DIRECT_CB": "01",
76+
"SAPI_ENDPOINT": "e0",
77+
"TCLK_SEED": "f88e42a4737b64e3eb29ce1e5668bcee",
78+
"LEGACY_TCLK_TABLE_START+0": "818e0000dde20000bae2e24f96105352020000",
79+
"LEGACY_TCLK_TABLE_START+1": "16000000000000000000000000000000ff0000",
80+
"LEGACY_TCLK_TABLE_START+2": "16000000000000000000000000000000ff0000",
81+
"LEGACY_TCLK_TABLE_START+3": "16000000000000000000000000000000ff0000",
82+
"LEGACY_TCLK_TABLE_START+4": "16000000000000000000000000000000ff0000",
83+
"LEGACY_TCLK_TABLE_START+5": "16000000000000000000000000000000ff0000",
84+
"LEGACY_TCLK_TABLE_START+6": "16000000000000000000000000000000ff0000",
85+
"LEGACY_TCLK_TABLE_START+7": "16000000000000000000000000000000ff0000",
86+
"LEGACY_TCLK_TABLE_START+8": "16000000000000000000000000000000ff0000",
87+
"LEGACY_TCLK_TABLE_START+9": "16000000000000000000000000000000ff0000",
88+
"LEGACY_TCLK_TABLE_START+10": "16000000000000000000000000000000ff0000",
89+
"LEGACY_TCLK_TABLE_START+11": "16000000000000000000000000000000ff0000",
90+
"LEGACY_TCLK_TABLE_START+12": "16000000000000000000000000000000ff0000",
91+
"LEGACY_TCLK_TABLE_START+13": "16000000000000000000000000000000ff0000",
92+
"LEGACY_TCLK_TABLE_START+14": "16000000000000000000000000000000ff0000",
93+
"LEGACY_TCLK_TABLE_START+15": "16000000000000000000000000000000ff0000",
94+
"LEGACY_TCLK_TABLE_START+16": "16000000000000000000000000000000ff0000",
95+
"LEGACY_TCLK_TABLE_START+17": "16000000000000000000000000000000ff0000",
96+
"LEGACY_TCLK_TABLE_START+18": "16000000000000000000000000000000ff0000",
97+
"LEGACY_TCLK_TABLE_START+19": "16000000000000000000000000000000ff0000",
98+
"LEGACY_TCLK_TABLE_START+20": "16000000000000000000000000000000ff0000",
99+
"LEGACY_TCLK_TABLE_START+21": "16000000000000000000000000000000ff0000",
100+
"LEGACY_TCLK_TABLE_START+22": "16000000000000000000000000000000ff0000",
101+
"LEGACY_TCLK_TABLE_START+23": "16000000000000000000000000000000ff0000",
102+
"LEGACY_TCLK_TABLE_START+24": "16000000000000000000000000000000ff0000",
103+
"LEGACY_TCLK_TABLE_START+25": "16000000000000000000000000000000ff0000",
104+
"LEGACY_TCLK_TABLE_START+26": "16000000000000000000000000000000ff0000",
105+
"LEGACY_TCLK_TABLE_START+27": "16000000000000000000000000000000ff0000",
106+
"LEGACY_TCLK_TABLE_START+28": "16000000000000000000000000000000ff0000",
107+
"LEGACY_TCLK_TABLE_START+29": "16000000000000000000000000000000ff0000",
108+
"LEGACY_TCLK_TABLE_START+30": "16000000000000000000000000000000ff0000",
109+
"LEGACY_TCLK_TABLE_START+31": "16000000000000000000000000000000ff0000",
110+
"LEGACY_TCLK_TABLE_START+32": "16000000000000000000000000000000ff0000",
111+
"LEGACY_TCLK_TABLE_START+33": "16000000000000000000000000000000ff0000",
112+
"LEGACY_TCLK_TABLE_START+34": "16000000000000000000000000000000ff0000",
113+
"LEGACY_TCLK_TABLE_START+35": "16000000000000000000000000000000ff0000",
114+
"LEGACY_TCLK_TABLE_START+36": "16000000000000000000000000000000ff0000",
115+
"LEGACY_TCLK_TABLE_START+37": "16000000000000000000000000000000ff0000",
116+
"LEGACY_TCLK_TABLE_START+38": "16000000000000000000000000000000ff0000",
117+
"LEGACY_TCLK_TABLE_START+39": "16000000000000000000000000000000ff0000",
118+
"LEGACY_APS_LINK_KEY_DATA_START+0": "2161202683c8e3bab5d96e1afadf81cc569a000078050000",
119+
"LEGACY_APS_LINK_KEY_DATA_START+1": "dc08d028e4f9a780133dc52dd63e08c0c24d000000000000",
120+
"LEGACY_APS_LINK_KEY_DATA_START+2": "cb308155c8aa15a26de52560a9fe6ca8c24d000000000000",
121+
"APP_ITEM_1": "ffff",
122+
"APP_ITEM_2": "ffff",
123+
"APP_ITEM_3": "ffff",
124+
"APP_ITEM_4": "ffff",
125+
"APP_ITEM_5": "ffffffffffffffffffffffffffffffff",
126+
"APP_ITEM_6": "ffffffffffffffffffffffffffffffff",
127+
"RF_TEST_PARMS": "00000000"
128+
}
129+
}

zigpy_znp/api.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,10 @@ async def write_network_info(
191191

192192
from zigpy_znp.znp import security
193193

194-
# Delete any existing HAS_CONFIGURED_ZSTACK* NV items. One (or both) may fail.
194+
# Delete any existing NV items that store formation state
195195
await self.nvram.osal_delete(OsalNvIds.HAS_CONFIGURED_ZSTACK1)
196196
await self.nvram.osal_delete(OsalNvIds.HAS_CONFIGURED_ZSTACK3)
197+
await self.nvram.osal_delete(OsalNvIds.ZIGPY_ZNP_MIGRATION_ID)
197198
await self.nvram.osal_delete(OsalNvIds.BDBNODEISONANETWORK)
198199

199200
# Instruct Z-Stack to reset everything on the next boot

zigpy_znp/zigbee/application.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -946,7 +946,12 @@ async def _migrate_nvram(self):
946946

947947
initial_migration_id = migration_id
948948

949-
# Migration 1: empty `ADDRMGR` entries are version-dependent
949+
# Migration 1: empty `ADDRMGR` entries are version-dependent and were improperly
950+
# written for CC253x devices.
951+
#
952+
# This migration is stateless and can safely be run more than once:
953+
# the only downside is that startup times increase by 10s on newer
954+
# coordinators, which is why the migration ID is persisted.
950955
if migration_id < 1:
951956
try:
952957
entries = await security.read_addr_manager_entries(self._znp)
@@ -956,27 +961,27 @@ async def _migrate_nvram(self):
956961
fixed_entries = []
957962

958963
for entry in entries:
959-
if entry not in (
960-
const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1,
961-
const.EMPTY_ADDR_MGR_ENTRY_ZSTACK3,
962-
):
964+
if entry.extAddr != t.EUI64.convert("FF:FF:FF:FF:FF:FF:FF:FF"):
963965
fixed_entries.append(entry)
964966
elif self._znp.version == 3.30:
965967
fixed_entries.append(const.EMPTY_ADDR_MGR_ENTRY_ZSTACK3)
966968
else:
967969
fixed_entries.append(const.EMPTY_ADDR_MGR_ENTRY_ZSTACK1)
968970

969971
if entries != fixed_entries:
970-
LOGGER.warning("Fixing broken address manager entries")
972+
LOGGER.warning(
973+
"Repairing %d invalid empty address manager entries (total %d)",
974+
sum(i != j for i, j in zip(entries, fixed_entries)),
975+
len(entries),
976+
)
971977
await security.write_addr_manager_entries(self._znp, fixed_entries)
972978

973979
migration_id = 1
974980

975-
await self._znp.nvram.osal_write(
976-
OsalNvIds.ZIGPY_ZNP_MIGRATION_ID, t.uint8_t(migration_id), create=True
977-
)
978-
979981
if initial_migration_id != migration_id:
982+
await self._znp.nvram.osal_write(
983+
OsalNvIds.ZIGPY_ZNP_MIGRATION_ID, t.uint8_t(migration_id), create=True
984+
)
980985
await self._znp.reset()
981986

982987
async def _write_stack_settings(self, *, reset_if_changed: bool) -> None:

0 commit comments

Comments
 (0)