Skip to content

Commit ddf79f6

Browse files
committed
Fix joining error with firmware versions >= 20210708
1 parent c9cb576 commit ddf79f6

File tree

3 files changed

+36
-38
lines changed

3 files changed

+36
-38
lines changed

tests/application/test_joining.py

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,25 @@
99
import zigpy_znp.types as t
1010
import zigpy_znp.commands as c
1111

12-
from ..conftest import FORMED_DEVICES, FORMED_ZSTACK3_DEVICES, CoroutineMock
12+
from ..conftest import (
13+
FORMED_DEVICES,
14+
FORMED_ZSTACK3_DEVICES,
15+
CoroutineMock,
16+
FormedLaunchpadCC26X2R1,
17+
)
1318

1419
pytestmark = [pytest.mark.asyncio]
1520

1621

17-
@pytest.mark.parametrize("device", FORMED_DEVICES)
18-
async def test_permit_join(device, make_application):
19-
app, znp_server = make_application(server_cls=device)
20-
21-
# Handle the startup permit join clear
22-
znp_server.reply_once_to(
23-
request=c.ZDO.MgmtPermitJoinReq.Req(
24-
AddrMode=t.AddrMode.NWK, Dst=0x0000, Duration=0, partial=True
25-
),
26-
responses=[
27-
c.ZDO.MgmtPermitJoinReq.Rsp(Status=t.Status.SUCCESS),
28-
c.ZDO.MgmtPermitJoinRsp.Callback(Src=0x0000, Status=t.ZDOStatus.SUCCESS),
29-
],
30-
override=True,
31-
)
22+
@pytest.mark.parametrize(
23+
"device,fixed_joining_bug",
24+
[(d, False) for d in FORMED_DEVICES] + [(FormedLaunchpadCC26X2R1, True)],
25+
)
26+
async def test_permit_join(device, fixed_joining_bug, mocker, make_application):
27+
if fixed_joining_bug:
28+
mocker.patch.object(device, "code_revision", 20210708)
3229

33-
znp_server.reply_once_to(
34-
request=c.ZDO.MgmtPermitJoinReq.Req(
35-
AddrMode=t.AddrMode.Broadcast, Dst=0xFFFC, Duration=0, partial=True
36-
),
37-
responses=[
38-
c.ZDO.MgmtPermitJoinReq.Rsp(Status=t.Status.SUCCESS),
39-
c.ZDO.MgmtPermitJoinRsp.Callback(Src=0x0000, Status=t.ZDOStatus.SUCCESS),
40-
],
41-
)
30+
app, znp_server = make_application(server_cls=device)
4231

4332
# Handle us opening joins on the coordinator
4433
permit_join_coordinator = znp_server.reply_once_to(
@@ -65,8 +54,14 @@ async def test_permit_join(device, make_application):
6554
await app.startup(auto_form=False)
6655
await app.permit(time_s=10)
6756

68-
await permit_join_coordinator
69-
await permit_join_broadcast
57+
if fixed_joining_bug:
58+
await permit_join_broadcast
59+
60+
# Joins should not have been opened on the coordinator
61+
assert not permit_join_coordinator.done()
62+
else:
63+
await permit_join_coordinator
64+
await permit_join_broadcast
7065

7166
await app.shutdown()
7267

tests/conftest.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,7 @@ def zdo_route_check(self, request):
722722
class BaseZStack1CC2531(BaseZStackDevice):
723723
align_structs = False
724724
version = 1.2
725+
code_revision = 20190608
725726

726727
@reply_to(c.SYS.OSALNVRead.Req(partial=True))
727728
@reply_to(c.SYS.OSALNVReadExt.Req(partial=True))
@@ -766,7 +767,7 @@ def version_replier(self, request):
766767
MajorRel=2,
767768
MinorRel=6,
768769
MaintRel=3,
769-
CodeRevision=20190608,
770+
CodeRevision=self.code_revision,
770771
BootloaderBuildType=c.sys.BootloaderBuildType.BUILT_AS_BIN,
771772
BootloaderRevision=0,
772773
)
@@ -963,6 +964,7 @@ def connection_made(self):
963964
class BaseLaunchpadCC26X2R1(BaseZStack3Device):
964965
version = 3.30
965966
align_structs = True
967+
code_revision = 20200805
966968

967969
def create_nib(self, _=None):
968970
super().create_nib()
@@ -1034,7 +1036,7 @@ def version_replier(self, request):
10341036
MajorRel=2,
10351037
MinorRel=7,
10361038
MaintRel=1,
1037-
CodeRevision=20200805,
1039+
CodeRevision=self.code_revision,
10381040
BootloaderBuildType=c.sys.BootloaderBuildType.NON_BOOTLOADER_BUILD,
10391041
BootloaderRevision=0xFFFFFFFF,
10401042
)
@@ -1070,6 +1072,7 @@ def led_responder(self, req):
10701072
class BaseZStack3CC2531(BaseZStack3Device):
10711073
version = 3.0
10721074
align_structs = False
1075+
code_revision = 20190425
10731076

10741077
def create_nib(self, _=None):
10751078
super().create_nib()
@@ -1100,7 +1103,7 @@ def version_replier(self, request):
11001103
MajorRel=2,
11011104
MinorRel=7,
11021105
MaintRel=2,
1103-
CodeRevision=20190425,
1106+
CodeRevision=self.code_revision,
11041107
BootloaderBuildType=c.sys.BootloaderBuildType.BUILT_AS_BIN,
11051108
BootloaderRevision=0,
11061109
)

zigpy_znp/zigbee/application.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -699,12 +699,12 @@ async def permit(self, time_s=60, node=None):
699699

700700
LOGGER.info("Permitting joins for %d seconds", time_s)
701701

702+
# If joins were permitted through a specific router, older Z-Stack builds
703+
# did not allow the key to be distributed unless the coordinator itself was
704+
# also permitting joins.
705+
#
706+
# Fixed in https://github.com/Koenkk/Z-Stack-firmware/commit/efac5ee46b9b437
702707
if time_s == 0 or self._version_rsp.CodeRevision < 20210708:
703-
# If joins were permitted through a specific router, older Z-Stack builds
704-
# did not allow the key to be distributed unless the coordinator itself was
705-
# also permitting joins.
706-
#
707-
# Fixed in https://github.com/Koenkk/Z-Stack-firmware/commit/efac5ee46b9b437
708708
response = await self._znp.request_callback_rsp(
709709
request=c.ZDO.MgmtPermitJoinReq.Req(
710710
AddrMode=t.AddrMode.NWK,
@@ -716,10 +716,10 @@ async def permit(self, time_s=60, node=None):
716716
callback=c.ZDO.MgmtPermitJoinRsp.Callback(Src=0x0000, partial=True),
717717
)
718718

719-
if response.Status != t.Status.SUCCESS:
720-
raise RuntimeError(f"Failed to permit joins on the coordinator: {response}")
719+
if response.Status != t.Status.SUCCESS:
720+
raise RuntimeError(f"Failed to permit joins on coordinator: {response}")
721721

722-
return await super().permit(time_s=time_s, node=node)
722+
await super().permit(time_s=time_s, node=node)
723723

724724
async def permit_ncp(self, time_s: int) -> None:
725725
"""

0 commit comments

Comments
 (0)