Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[v1.3-cherrypick] Fix reads on the group key management cluster to handle chunking correctly #37020

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 24 additions & 4 deletions src/app/clusters/group-key-mgmt-server/group-key-mgmt-server.cpp
Original file line number Diff line number Diff line change
@@ -167,6 +167,8 @@ class GroupKeyManagementAttributeAccess : public AttributeAccessInterface
VerifyOrReturnError(nullptr != provider, CHIP_ERROR_INTERNAL);

CHIP_ERROR err = aEncoder.EncodeList([provider](const auto & encoder) -> CHIP_ERROR {
CHIP_ERROR encodeStatus = CHIP_NO_ERROR;

for (auto & fabric : Server::GetInstance().GetFabricTable())
{
auto fabric_index = fabric.GetFabricIndex();
@@ -181,11 +183,19 @@ class GroupKeyManagementAttributeAccess : public AttributeAccessInterface
.groupKeySetID = mapping.keyset_id,
.fabricIndex = fabric_index,
};
encoder.Encode(key);
encodeStatus = encoder.Encode(key);
if (encodeStatus != CHIP_NO_ERROR)
{
break;
}
}
iter->Release();
if (encodeStatus != CHIP_NO_ERROR)
{
break;
}
}
return CHIP_NO_ERROR;
return encodeStatus;
});
return err;
}
@@ -255,6 +265,8 @@ class GroupKeyManagementAttributeAccess : public AttributeAccessInterface
VerifyOrReturnError(nullptr != provider, CHIP_ERROR_INTERNAL);

CHIP_ERROR err = aEncoder.EncodeList([provider](const auto & encoder) -> CHIP_ERROR {
CHIP_ERROR encodeStatus = CHIP_NO_ERROR;

for (auto & fabric : Server::GetInstance().GetFabricTable())
{
auto fabric_index = fabric.GetFabricIndex();
@@ -264,11 +276,19 @@ class GroupKeyManagementAttributeAccess : public AttributeAccessInterface
GroupDataProvider::GroupInfo info;
while (iter->Next(info))
{
encoder.Encode(GroupTableCodec(provider, fabric_index, info));
encodeStatus = encoder.Encode(GroupTableCodec(provider, fabric_index, info));
if (encodeStatus != CHIP_NO_ERROR)
{
break;
}
}
iter->Release();
if (encodeStatus != CHIP_NO_ERROR)
{
break;
}
}
return CHIP_NO_ERROR;
return encodeStatus;
});
return err;
}
402 changes: 402 additions & 0 deletions src/app/tests/suites/TestGroupKeyManagementCluster.yaml
Original file line number Diff line number Diff line change
@@ -60,6 +60,35 @@ tests:
- name: "nodeId"
value: nodeId

- label: "Open Commissioning Window from alpha"
cluster: "Administrator Commissioning"
command: "OpenBasicCommissioningWindow"
timedInteractionTimeoutMs: 10000
arguments:
values:
- name: "CommissioningTimeout"
value: 180

- label: "Commission from gamma"
identity: "gamma"
cluster: "CommissionerCommands"
command: "PairWithCode"
arguments:
values:
- name: "nodeId"
value: nodeId
- name: "payload"
value: payload

- label: "Wait for the commissioned device to be retrieved for gamma"
identity: "gamma"
cluster: "DelayCommands"
command: "WaitForCommissionee"
arguments:
values:
- name: "nodeId"
value: nodeId

- label: "Read maxGroupsPerFabric"
command: "readAttribute"
attribute: "MaxGroupsPerFabric"
@@ -507,6 +536,26 @@ tests:
EpochStartTime2: 2110002,
}

- label: "KeySet Write 4"
identity: "gamma"
command: "KeySetWrite"
arguments:
values:
- name: "GroupKeySet"
value:
{
GroupKeySetID: 0x01a3,
GroupKeySecurityPolicy: 0,
EpochKey0:
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
EpochStartTime0: 2110000,
EpochKey1: "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
EpochStartTime1: 2110001,
EpochKey2:
"\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f",
EpochStartTime2: 2110002,
}

- label: "KeySet Read"
command: "KeySetRead"
arguments:
@@ -894,6 +943,359 @@ tests:
},
]

# Try to add enough groups on fabric gamma that the group table does not fit in a packet.
# TODO: We don't seem to support enough groups to actually manage to fill a packet. To really test this part,
# ReadHandler::GetReportBufferMaxSize needs to be changed to return a much smaller value.

- label: "Write Group Keys on gamma"
identity: "gamma"
command: "writeAttribute"
attribute: "GroupKeyMap"
arguments:
value: [
# Note: the FabricIndex here does not matter; it's not sent on the wire.
{ FabricIndex: 1, GroupId: 0x0101, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x0102, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x0103, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x0104, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x0105, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x0106, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x0107, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x0108, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x0109, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x010a, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x010b, GroupKeySetID: 0x01a3 },
{ FabricIndex: 1, GroupId: 0x010c, GroupKeySetID: 0x01a3 },
]

- label: "Add Group 1 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x0101
- name: "GroupName"
value: "Group #1"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x0101

- label: "Add Group 2 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x0102
- name: "GroupName"
value: "Group #2"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x0102

- label: "Add Group 3 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x0103
- name: "GroupName"
value: "Group #3"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x0103

- label: "Add Group 4 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x0104
- name: "GroupName"
value: "Group #4"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x0104

- label: "Add Group 5 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x0105
- name: "GroupName"
value: "Group #5"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x0105

- label: "Add Group 6 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x0106
- name: "GroupName"
value: "Group #6"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x0106

- label: "Add Group 7 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x0107
- name: "GroupName"
value: "Group #7"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x0107

- label: "Add Group 8 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x0108
- name: "GroupName"
value: "Group #8"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x0108

- label: "Add Group 9 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x0109
- name: "GroupName"
value: "Group #9"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x0109

- label: "Add Group 10 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x010a
- name: "GroupName"
value: "Group #10"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x010a

- label: "Add Group 11 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x010b
- name: "GroupName"
value: "Group #11"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x010b

- label: "Add Group 12 on gamma"
identity: "gamma"
cluster: "Groups"
endpoint: 1
command: "AddGroup"
arguments:
values:
- name: "GroupID"
value: 0x010c
- name: "GroupName"
value: "Group #12"
response:
values:
- name: "Status"
value: 0
- name: "GroupID"
value: 0x010c

- label: "Read GroupTable from gamma without fabric filtering"
identity: "gamma"
command: "readAttribute"
attribute: "GroupTable"
fabricFiltered: false
response:
value:
[
{
FabricIndex: 1,
GroupId: 0x0101,
Endpoints: [1],
GroupName: "Group #1",
},
{
FabricIndex: 1,
GroupId: 0x0102,
Endpoints: [1],
GroupName: "Group #2",
},
{
FabricIndex: 1,
GroupId: 0x0103,
Endpoints: [1],
GroupName: "Group #3",
},
{
FabricIndex: 1,
GroupId: 0x0104,
Endpoints: [1],
GroupName: "Group #4",
},
{
FabricIndex: 2,
GroupId: 0x0105,
Endpoints: [1],
GroupName: "Group #5",
},
{
FabricIndex: 3,
GroupId: 0x0101,
Endpoints: [1],
GroupName: "Group #1",
},
{
FabricIndex: 3,
GroupId: 0x0102,
Endpoints: [1],
GroupName: "Group #2",
},
{
FabricIndex: 3,
GroupId: 0x0103,
Endpoints: [1],
GroupName: "Group #3",
},
{
FabricIndex: 3,
GroupId: 0x0104,
Endpoints: [1],
GroupName: "Group #4",
},
{
FabricIndex: 3,
GroupId: 0x0105,
Endpoints: [1],
GroupName: "Group #5",
},
{
FabricIndex: 3,
GroupId: 0x0106,
Endpoints: [1],
GroupName: "Group #6",
},
{
FabricIndex: 3,
GroupId: 0x0107,
Endpoints: [1],
GroupName: "Group #7",
},
{
FabricIndex: 3,
GroupId: 0x0108,
Endpoints: [1],
GroupName: "Group #8",
},
{
FabricIndex: 3,
GroupId: 0x0109,
Endpoints: [1],
GroupName: "Group #9",
},
{
FabricIndex: 3,
GroupId: 0x010a,
Endpoints: [1],
GroupName: "Group #10",
},
{
FabricIndex: 3,
GroupId: 0x010b,
Endpoints: [1],
GroupName: "Group #11",
},
{
FabricIndex: 3,
GroupId: 0x010c,
Endpoints: [1],
GroupName: "Group #12",
},
]

- label: "KeySet Remove 1"
command: "KeySetRemove"
arguments: