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 "call-command-handler.h"
25 #include "cluster-id.h"
26 #include "command-id.h"
31 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd);
32 EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd);
33 EmberAfStatus emberAfOnOffClusterServerCommandParse(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_LEVEL_CONTROL_CLUSTER_ID:
75 result = emberAfLevelControlClusterServerCommandParse(cmd);
77 case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
78 result = emberAfNetworkCommissioningClusterServerCommandParse(cmd);
80 case ZCL_ON_OFF_CLUSTER_ID:
81 result = emberAfOnOffClusterServerCommandParse(cmd);
84 // Unrecognized cluster ID, error status will apply.
91 // Cluster specific command parsing
93 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd)
95 bool wasHandled = false;
97 if (!cmd->mfgSpecific)
99 switch (cmd->commandId)
101 case ZCL_MOVE_COMMAND_ID: {
102 uint16_t payloadOffset = cmd->payloadStartIndex;
106 uint8_t optionOverride;
108 if (cmd->bufLen < payloadOffset + 1)
110 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
112 moveMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
113 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
114 if (cmd->bufLen < payloadOffset + 1)
116 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
118 rate = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
119 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
120 if (cmd->bufLen < payloadOffset + 1)
122 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
124 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
125 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
126 if (cmd->bufLen < payloadOffset + 1)
128 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
130 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
132 wasHandled = emberAfLevelControlClusterMoveCallback(moveMode, rate, optionMask, optionOverride);
135 case ZCL_MOVE_TO_LEVEL_COMMAND_ID: {
136 uint16_t payloadOffset = cmd->payloadStartIndex;
138 uint16_t transitionTime;
140 uint8_t optionOverride;
142 if (cmd->bufLen < payloadOffset + 1)
144 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
146 level = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
147 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
148 if (cmd->bufLen < payloadOffset + 2)
150 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
152 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
153 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
154 if (cmd->bufLen < payloadOffset + 1)
156 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
158 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
159 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
160 if (cmd->bufLen < payloadOffset + 1)
162 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
164 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
166 wasHandled = emberAfLevelControlClusterMoveToLevelCallback(level, transitionTime, optionMask, optionOverride);
169 case ZCL_MOVE_TO_LEVEL_WITH_ON_OFF_COMMAND_ID: {
170 uint16_t payloadOffset = cmd->payloadStartIndex;
172 uint16_t transitionTime;
174 if (cmd->bufLen < payloadOffset + 1)
176 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
178 level = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
179 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
180 if (cmd->bufLen < payloadOffset + 2)
182 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
184 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
186 wasHandled = emberAfLevelControlClusterMoveToLevelWithOnOffCallback(level, transitionTime);
189 case ZCL_MOVE_WITH_ON_OFF_COMMAND_ID: {
190 uint16_t payloadOffset = cmd->payloadStartIndex;
194 if (cmd->bufLen < payloadOffset + 1)
196 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
198 moveMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
199 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
200 if (cmd->bufLen < payloadOffset + 1)
202 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
204 rate = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
206 wasHandled = emberAfLevelControlClusterMoveWithOnOffCallback(moveMode, rate);
209 case ZCL_STEP_COMMAND_ID: {
210 uint16_t payloadOffset = cmd->payloadStartIndex;
213 uint16_t transitionTime;
215 uint8_t optionOverride;
217 if (cmd->bufLen < payloadOffset + 1)
219 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
221 stepMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
222 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
223 if (cmd->bufLen < payloadOffset + 1)
225 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
227 stepSize = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
228 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
229 if (cmd->bufLen < payloadOffset + 2)
231 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
233 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
234 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
235 if (cmd->bufLen < payloadOffset + 1)
237 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
239 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
240 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
241 if (cmd->bufLen < payloadOffset + 1)
243 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
245 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
247 wasHandled = emberAfLevelControlClusterStepCallback(stepMode, stepSize, transitionTime, optionMask, optionOverride);
250 case ZCL_STEP_WITH_ON_OFF_COMMAND_ID: {
251 uint16_t payloadOffset = cmd->payloadStartIndex;
254 uint16_t transitionTime;
256 if (cmd->bufLen < payloadOffset + 1)
258 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
260 stepMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
261 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
262 if (cmd->bufLen < payloadOffset + 1)
264 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
266 stepSize = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
267 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
268 if (cmd->bufLen < payloadOffset + 2)
270 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
272 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
274 wasHandled = emberAfLevelControlClusterStepWithOnOffCallback(stepMode, stepSize, transitionTime);
277 case ZCL_STOP_COMMAND_ID: {
278 uint16_t payloadOffset = cmd->payloadStartIndex;
280 uint8_t optionOverride;
282 if (cmd->bufLen < payloadOffset + 1)
284 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
286 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
287 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
288 if (cmd->bufLen < payloadOffset + 1)
290 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
292 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
294 wasHandled = emberAfLevelControlClusterStopCallback(optionMask, optionOverride);
297 case ZCL_STOP_WITH_ON_OFF_COMMAND_ID: {
298 wasHandled = emberAfLevelControlClusterStopWithOnOffCallback();
302 // Unrecognized command ID, error status will apply.
307 return status(wasHandled, true, cmd->mfgSpecific);
309 EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd)
311 bool wasHandled = false;
313 if (!cmd->mfgSpecific)
315 switch (cmd->commandId)
317 case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
318 uint16_t payloadOffset = cmd->payloadStartIndex;
319 uint8_t * operationalDataset;
323 if (cmd->bufLen < payloadOffset + 1u)
325 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
327 operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
328 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
329 if (cmd->bufLen < payloadOffset + 8)
331 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
333 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
334 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
335 if (cmd->bufLen < payloadOffset + 4)
337 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
339 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
341 wasHandled = emberAfNetworkCommissioningClusterAddThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
344 case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
345 uint16_t payloadOffset = cmd->payloadStartIndex;
347 uint8_t * credentials;
351 if (cmd->bufLen < payloadOffset + 1u)
353 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
355 ssid = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
356 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
357 if (cmd->bufLen < payloadOffset + 1u)
359 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
361 credentials = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
362 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
363 if (cmd->bufLen < payloadOffset + 8)
365 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
367 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
368 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
369 if (cmd->bufLen < payloadOffset + 4)
371 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
373 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
375 wasHandled = emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
378 case ZCL_DISABLE_NETWORK_COMMAND_ID: {
379 uint16_t payloadOffset = cmd->payloadStartIndex;
384 if (cmd->bufLen < payloadOffset + 1u)
386 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
388 networkID = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
389 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
390 if (cmd->bufLen < payloadOffset + 8)
392 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
394 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
395 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
396 if (cmd->bufLen < payloadOffset + 4)
398 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
400 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
402 wasHandled = emberAfNetworkCommissioningClusterDisableNetworkCallback(networkID, breadcrumb, timeoutMs);
405 case ZCL_ENABLE_NETWORK_COMMAND_ID: {
406 uint16_t payloadOffset = cmd->payloadStartIndex;
411 if (cmd->bufLen < payloadOffset + 1u)
413 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
415 networkID = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
416 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
417 if (cmd->bufLen < payloadOffset + 8)
419 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
421 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
422 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
423 if (cmd->bufLen < payloadOffset + 4)
425 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
427 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
429 wasHandled = emberAfNetworkCommissioningClusterEnableNetworkCallback(networkID, breadcrumb, timeoutMs);
432 case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
433 uint16_t payloadOffset = cmd->payloadStartIndex;
436 if (cmd->bufLen < payloadOffset + 4)
438 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
440 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
442 wasHandled = emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
445 case ZCL_REMOVE_NETWORK_COMMAND_ID: {
446 uint16_t payloadOffset = cmd->payloadStartIndex;
451 if (cmd->bufLen < payloadOffset + 1u)
453 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
455 NetworkID = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
456 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(NetworkID) + 1u);
457 if (cmd->bufLen < payloadOffset + 8)
459 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
461 Breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
462 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
463 if (cmd->bufLen < payloadOffset + 4)
465 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
467 TimeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
469 wasHandled = emberAfNetworkCommissioningClusterRemoveNetworkCallback(NetworkID, Breadcrumb, TimeoutMs);
472 case ZCL_SCAN_NETWORKS_COMMAND_ID: {
473 uint16_t payloadOffset = cmd->payloadStartIndex;
478 if (cmd->bufLen < payloadOffset + 1u)
480 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
482 ssid = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
483 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
484 if (cmd->bufLen < payloadOffset + 8)
486 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
488 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
489 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
490 if (cmd->bufLen < payloadOffset + 4)
492 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
494 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
496 wasHandled = emberAfNetworkCommissioningClusterScanNetworksCallback(ssid, breadcrumb, timeoutMs);
499 case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
500 uint16_t payloadOffset = cmd->payloadStartIndex;
501 uint8_t * operationalDataset;
505 if (cmd->bufLen < payloadOffset + 1u)
507 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
509 operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
510 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
511 if (cmd->bufLen < payloadOffset + 8)
513 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
515 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
516 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
517 if (cmd->bufLen < payloadOffset + 4)
519 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
521 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
523 wasHandled = emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
526 case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
527 uint16_t payloadOffset = cmd->payloadStartIndex;
529 uint8_t * credentials;
533 if (cmd->bufLen < payloadOffset + 1u)
535 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
537 ssid = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
538 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
539 if (cmd->bufLen < payloadOffset + 1u)
541 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
543 credentials = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
544 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
545 if (cmd->bufLen < payloadOffset + 8)
547 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
549 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
550 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
551 if (cmd->bufLen < payloadOffset + 4)
553 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
555 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
557 wasHandled = emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
561 // Unrecognized command ID, error status will apply.
566 return status(wasHandled, true, cmd->mfgSpecific);
568 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd)
570 bool wasHandled = false;
572 if (!cmd->mfgSpecific)
574 switch (cmd->commandId)
576 case ZCL_OFF_COMMAND_ID: {
577 wasHandled = emberAfOnOffClusterOffCallback();
580 case ZCL_ON_COMMAND_ID: {
581 wasHandled = emberAfOnOffClusterOnCallback();
584 case ZCL_TOGGLE_COMMAND_ID: {
585 wasHandled = emberAfOnOffClusterToggleCallback();
589 // Unrecognized command ID, error status will apply.
594 return status(wasHandled, true, cmd->mfgSpecific);