3 * Copyright (c) 2021 Project CHIP Authors
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 // THIS FILE IS GENERATED BY ZAP
22 #include "af-structs.h"
23 #include "app/util/util.h"
24 #include "call-command-handler.h"
26 #include "cluster-id.h"
27 #include "command-id.h"
31 EmberAfStatus emberAfBasicClusterServerCommandParse(EmberAfClusterCommand * cmd);
32 EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd);
33 EmberAfStatus emberAfTemperatureMeasurementClusterServerCommandParse(EmberAfClusterCommand * cmd);
35 static EmberAfStatus status(bool wasHandled, bool clusterExists, bool mfgSpecific)
39 return EMBER_ZCL_STATUS_SUCCESS;
43 return EMBER_ZCL_STATUS_UNSUP_MANUF_CLUSTER_COMMAND;
45 else if (clusterExists)
47 return EMBER_ZCL_STATUS_UNSUP_COMMAND;
51 return EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER;
55 // Main command parsing controller.
56 EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
58 EmberAfStatus result = status(false, false, cmd->mfgSpecific);
59 if (cmd->direction == (uint8_t) ZCL_DIRECTION_SERVER_TO_CLIENT &&
60 emberAfContainsClientWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
62 switch (cmd->apsFrame->clusterId)
65 // Unrecognized cluster ID, error status will apply.
69 else if (cmd->direction == (uint8_t) ZCL_DIRECTION_CLIENT_TO_SERVER &&
70 emberAfContainsServerWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
72 switch (cmd->apsFrame->clusterId)
74 case ZCL_BASIC_CLUSTER_ID:
75 // No commands are enabled for cluster Basic
76 result = status(false, true, cmd->mfgSpecific);
78 case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
79 result = emberAfNetworkCommissioningClusterServerCommandParse(cmd);
81 case ZCL_TEMP_MEASUREMENT_CLUSTER_ID:
82 // No commands are enabled for cluster Temperature Measurement
83 result = status(false, true, cmd->mfgSpecific);
86 // Unrecognized cluster ID, error status will apply.
93 // Cluster specific command parsing
95 EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd)
97 bool wasHandled = false;
99 if (!cmd->mfgSpecific)
101 switch (cmd->commandId)
103 case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
104 uint16_t payloadOffset = cmd->payloadStartIndex;
105 chip::ByteSpan operationalDataset;
109 if (cmd->bufLen < payloadOffset + 1u)
111 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
114 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
115 operationalDataset = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
117 payloadOffset = static_cast<uint16_t>(payloadOffset + operationalDataset.size() + 1u);
118 if (cmd->bufLen < payloadOffset + 8)
120 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
122 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
123 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
124 if (cmd->bufLen < payloadOffset + 4)
126 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
128 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
130 wasHandled = emberAfNetworkCommissioningClusterAddThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
133 case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
134 uint16_t payloadOffset = cmd->payloadStartIndex;
136 chip::ByteSpan credentials;
140 if (cmd->bufLen < payloadOffset + 1u)
142 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
145 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
146 ssid = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
148 payloadOffset = static_cast<uint16_t>(payloadOffset + ssid.size() + 1u);
149 if (cmd->bufLen < payloadOffset + 1u)
151 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
154 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
155 credentials = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
157 payloadOffset = static_cast<uint16_t>(payloadOffset + credentials.size() + 1u);
158 if (cmd->bufLen < payloadOffset + 8)
160 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
162 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
163 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
164 if (cmd->bufLen < payloadOffset + 4)
166 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
168 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
170 wasHandled = emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
173 case ZCL_DISABLE_NETWORK_COMMAND_ID: {
174 uint16_t payloadOffset = cmd->payloadStartIndex;
175 chip::ByteSpan networkID;
179 if (cmd->bufLen < payloadOffset + 1u)
181 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
184 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
185 networkID = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
187 payloadOffset = static_cast<uint16_t>(payloadOffset + networkID.size() + 1u);
188 if (cmd->bufLen < payloadOffset + 8)
190 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
192 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
193 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
194 if (cmd->bufLen < payloadOffset + 4)
196 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
198 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
200 wasHandled = emberAfNetworkCommissioningClusterDisableNetworkCallback(networkID, breadcrumb, timeoutMs);
203 case ZCL_ENABLE_NETWORK_COMMAND_ID: {
204 uint16_t payloadOffset = cmd->payloadStartIndex;
205 chip::ByteSpan networkID;
209 if (cmd->bufLen < payloadOffset + 1u)
211 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
214 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
215 networkID = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
217 payloadOffset = static_cast<uint16_t>(payloadOffset + networkID.size() + 1u);
218 if (cmd->bufLen < payloadOffset + 8)
220 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
222 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
223 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
224 if (cmd->bufLen < payloadOffset + 4)
226 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
228 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
230 wasHandled = emberAfNetworkCommissioningClusterEnableNetworkCallback(networkID, breadcrumb, timeoutMs);
233 case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
234 uint16_t payloadOffset = cmd->payloadStartIndex;
237 if (cmd->bufLen < payloadOffset + 4)
239 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
241 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
243 wasHandled = emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
246 case ZCL_REMOVE_NETWORK_COMMAND_ID: {
247 uint16_t payloadOffset = cmd->payloadStartIndex;
248 chip::ByteSpan NetworkID;
252 if (cmd->bufLen < payloadOffset + 1u)
254 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
257 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
258 NetworkID = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
260 payloadOffset = static_cast<uint16_t>(payloadOffset + NetworkID.size() + 1u);
261 if (cmd->bufLen < payloadOffset + 8)
263 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
265 Breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
266 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
267 if (cmd->bufLen < payloadOffset + 4)
269 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
271 TimeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
273 wasHandled = emberAfNetworkCommissioningClusterRemoveNetworkCallback(NetworkID, Breadcrumb, TimeoutMs);
276 case ZCL_SCAN_NETWORKS_COMMAND_ID: {
277 uint16_t payloadOffset = cmd->payloadStartIndex;
282 if (cmd->bufLen < payloadOffset + 1u)
284 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
287 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
288 ssid = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
290 payloadOffset = static_cast<uint16_t>(payloadOffset + ssid.size() + 1u);
291 if (cmd->bufLen < payloadOffset + 8)
293 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
295 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
296 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
297 if (cmd->bufLen < payloadOffset + 4)
299 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
301 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
303 wasHandled = emberAfNetworkCommissioningClusterScanNetworksCallback(ssid, breadcrumb, timeoutMs);
306 case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
307 uint16_t payloadOffset = cmd->payloadStartIndex;
308 chip::ByteSpan operationalDataset;
312 if (cmd->bufLen < payloadOffset + 1u)
314 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
317 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
318 operationalDataset = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
320 payloadOffset = static_cast<uint16_t>(payloadOffset + operationalDataset.size() + 1u);
321 if (cmd->bufLen < payloadOffset + 8)
323 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
325 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
326 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
327 if (cmd->bufLen < payloadOffset + 4)
329 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
331 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
333 wasHandled = emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
336 case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
337 uint16_t payloadOffset = cmd->payloadStartIndex;
339 chip::ByteSpan credentials;
343 if (cmd->bufLen < payloadOffset + 1u)
345 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
348 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
349 ssid = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
351 payloadOffset = static_cast<uint16_t>(payloadOffset + ssid.size() + 1u);
352 if (cmd->bufLen < payloadOffset + 1u)
354 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
357 uint8_t * rawData = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
358 credentials = chip::ByteSpan(rawData + 1u, emberAfStringLength(rawData));
360 payloadOffset = static_cast<uint16_t>(payloadOffset + credentials.size() + 1u);
361 if (cmd->bufLen < payloadOffset + 8)
363 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
365 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
366 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
367 if (cmd->bufLen < payloadOffset + 4)
369 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
371 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
373 wasHandled = emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
377 // Unrecognized command ID, error status will apply.
382 return status(wasHandled, true, cmd->mfgSpecific);