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 emberAfBasicClusterServerCommandParse(EmberAfClusterCommand * cmd);
32 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd);
33 EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd);
34 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd);
36 static EmberAfStatus status(bool wasHandled, bool clusterExists, bool mfgSpecific)
40 return EMBER_ZCL_STATUS_SUCCESS;
44 return EMBER_ZCL_STATUS_UNSUP_MANUF_CLUSTER_COMMAND;
46 else if (clusterExists)
48 return EMBER_ZCL_STATUS_UNSUP_COMMAND;
52 return EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER;
56 // Main command parsing controller.
57 EmberAfStatus emberAfClusterSpecificCommandParse(EmberAfClusterCommand * cmd)
59 EmberAfStatus result = status(false, false, cmd->mfgSpecific);
60 if (cmd->direction == (uint8_t) ZCL_DIRECTION_SERVER_TO_CLIENT &&
61 emberAfContainsClientWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
63 switch (cmd->apsFrame->clusterId)
66 // Unrecognized cluster ID, error status will apply.
70 else if (cmd->direction == (uint8_t) ZCL_DIRECTION_CLIENT_TO_SERVER &&
71 emberAfContainsServerWithMfgCode(cmd->apsFrame->destinationEndpoint, cmd->apsFrame->clusterId, cmd->mfgCode))
73 switch (cmd->apsFrame->clusterId)
75 case ZCL_BASIC_CLUSTER_ID:
76 // No commands are enabled for cluster Basic
77 result = status(false, true, cmd->mfgSpecific);
79 case ZCL_LEVEL_CONTROL_CLUSTER_ID:
80 result = emberAfLevelControlClusterServerCommandParse(cmd);
82 case ZCL_NETWORK_COMMISSIONING_CLUSTER_ID:
83 result = emberAfNetworkCommissioningClusterServerCommandParse(cmd);
85 case ZCL_ON_OFF_CLUSTER_ID:
86 result = emberAfOnOffClusterServerCommandParse(cmd);
89 // Unrecognized cluster ID, error status will apply.
96 // Cluster specific command parsing
98 EmberAfStatus emberAfLevelControlClusterServerCommandParse(EmberAfClusterCommand * cmd)
100 bool wasHandled = false;
102 if (!cmd->mfgSpecific)
104 switch (cmd->commandId)
106 case ZCL_MOVE_COMMAND_ID: {
107 uint16_t payloadOffset = cmd->payloadStartIndex;
111 uint8_t optionOverride;
113 if (cmd->bufLen < payloadOffset + 1)
115 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
117 moveMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
118 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
119 if (cmd->bufLen < payloadOffset + 1)
121 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
123 rate = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
124 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
125 if (cmd->bufLen < payloadOffset + 1)
127 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
129 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
130 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
131 if (cmd->bufLen < payloadOffset + 1)
133 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
135 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
137 wasHandled = emberAfLevelControlClusterMoveCallback(moveMode, rate, optionMask, optionOverride);
140 case ZCL_MOVE_TO_LEVEL_COMMAND_ID: {
141 uint16_t payloadOffset = cmd->payloadStartIndex;
143 uint16_t transitionTime;
145 uint8_t optionOverride;
147 if (cmd->bufLen < payloadOffset + 1)
149 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
151 level = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
152 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
153 if (cmd->bufLen < payloadOffset + 2)
155 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
157 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
158 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
159 if (cmd->bufLen < payloadOffset + 1)
161 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
163 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
164 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
165 if (cmd->bufLen < payloadOffset + 1)
167 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
169 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
171 wasHandled = emberAfLevelControlClusterMoveToLevelCallback(level, transitionTime, optionMask, optionOverride);
174 case ZCL_MOVE_TO_LEVEL_WITH_ON_OFF_COMMAND_ID: {
175 uint16_t payloadOffset = cmd->payloadStartIndex;
177 uint16_t transitionTime;
179 if (cmd->bufLen < payloadOffset + 1)
181 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
183 level = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
184 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
185 if (cmd->bufLen < payloadOffset + 2)
187 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
189 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
191 wasHandled = emberAfLevelControlClusterMoveToLevelWithOnOffCallback(level, transitionTime);
194 case ZCL_MOVE_WITH_ON_OFF_COMMAND_ID: {
195 uint16_t payloadOffset = cmd->payloadStartIndex;
199 if (cmd->bufLen < payloadOffset + 1)
201 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
203 moveMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
204 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
205 if (cmd->bufLen < payloadOffset + 1)
207 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
209 rate = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
211 wasHandled = emberAfLevelControlClusterMoveWithOnOffCallback(moveMode, rate);
214 case ZCL_STEP_COMMAND_ID: {
215 uint16_t payloadOffset = cmd->payloadStartIndex;
218 uint16_t transitionTime;
220 uint8_t optionOverride;
222 if (cmd->bufLen < payloadOffset + 1)
224 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
226 stepMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
227 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
228 if (cmd->bufLen < payloadOffset + 1)
230 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
232 stepSize = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
233 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
234 if (cmd->bufLen < payloadOffset + 2)
236 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
238 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
239 payloadOffset = static_cast<uint16_t>(payloadOffset + 2);
240 if (cmd->bufLen < payloadOffset + 1)
242 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
244 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
245 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
246 if (cmd->bufLen < payloadOffset + 1)
248 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
250 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
252 wasHandled = emberAfLevelControlClusterStepCallback(stepMode, stepSize, transitionTime, optionMask, optionOverride);
255 case ZCL_STEP_WITH_ON_OFF_COMMAND_ID: {
256 uint16_t payloadOffset = cmd->payloadStartIndex;
259 uint16_t transitionTime;
261 if (cmd->bufLen < payloadOffset + 1)
263 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
265 stepMode = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
266 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
267 if (cmd->bufLen < payloadOffset + 1)
269 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
271 stepSize = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
272 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
273 if (cmd->bufLen < payloadOffset + 2)
275 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
277 transitionTime = emberAfGetInt16u(cmd->buffer, payloadOffset, cmd->bufLen);
279 wasHandled = emberAfLevelControlClusterStepWithOnOffCallback(stepMode, stepSize, transitionTime);
282 case ZCL_STOP_COMMAND_ID: {
283 uint16_t payloadOffset = cmd->payloadStartIndex;
285 uint8_t optionOverride;
287 if (cmd->bufLen < payloadOffset + 1)
289 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
291 optionMask = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
292 payloadOffset = static_cast<uint16_t>(payloadOffset + 1);
293 if (cmd->bufLen < payloadOffset + 1)
295 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
297 optionOverride = emberAfGetInt8u(cmd->buffer, payloadOffset, cmd->bufLen);
299 wasHandled = emberAfLevelControlClusterStopCallback(optionMask, optionOverride);
302 case ZCL_STOP_WITH_ON_OFF_COMMAND_ID: {
303 wasHandled = emberAfLevelControlClusterStopWithOnOffCallback();
307 // Unrecognized command ID, error status will apply.
312 return status(wasHandled, true, cmd->mfgSpecific);
314 EmberAfStatus emberAfNetworkCommissioningClusterServerCommandParse(EmberAfClusterCommand * cmd)
316 bool wasHandled = false;
318 if (!cmd->mfgSpecific)
320 switch (cmd->commandId)
322 case ZCL_ADD_THREAD_NETWORK_COMMAND_ID: {
323 uint16_t payloadOffset = cmd->payloadStartIndex;
324 uint8_t * operationalDataset;
328 if (cmd->bufLen < payloadOffset + 1u)
330 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
332 operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
333 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
334 if (cmd->bufLen < payloadOffset + 8)
336 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
338 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
339 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
340 if (cmd->bufLen < payloadOffset + 4)
342 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
344 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
346 wasHandled = emberAfNetworkCommissioningClusterAddThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
349 case ZCL_ADD_WI_FI_NETWORK_COMMAND_ID: {
350 uint16_t payloadOffset = cmd->payloadStartIndex;
352 uint8_t * credentials;
356 if (cmd->bufLen < payloadOffset + 1u)
358 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
360 ssid = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
361 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
362 if (cmd->bufLen < payloadOffset + 1u)
364 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
366 credentials = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
367 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
368 if (cmd->bufLen < payloadOffset + 8)
370 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
372 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
373 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
374 if (cmd->bufLen < payloadOffset + 4)
376 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
378 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
380 wasHandled = emberAfNetworkCommissioningClusterAddWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
383 case ZCL_DISABLE_NETWORK_COMMAND_ID: {
384 uint16_t payloadOffset = cmd->payloadStartIndex;
389 if (cmd->bufLen < payloadOffset + 1u)
391 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
393 networkID = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
394 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
395 if (cmd->bufLen < payloadOffset + 8)
397 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
399 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
400 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
401 if (cmd->bufLen < payloadOffset + 4)
403 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
405 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
407 wasHandled = emberAfNetworkCommissioningClusterDisableNetworkCallback(networkID, breadcrumb, timeoutMs);
410 case ZCL_ENABLE_NETWORK_COMMAND_ID: {
411 uint16_t payloadOffset = cmd->payloadStartIndex;
416 if (cmd->bufLen < payloadOffset + 1u)
418 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
420 networkID = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
421 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(networkID) + 1u);
422 if (cmd->bufLen < payloadOffset + 8)
424 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
426 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
427 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
428 if (cmd->bufLen < payloadOffset + 4)
430 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
432 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
434 wasHandled = emberAfNetworkCommissioningClusterEnableNetworkCallback(networkID, breadcrumb, timeoutMs);
437 case ZCL_GET_LAST_NETWORK_COMMISSIONING_RESULT_COMMAND_ID: {
438 uint16_t payloadOffset = cmd->payloadStartIndex;
441 if (cmd->bufLen < payloadOffset + 4)
443 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
445 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
447 wasHandled = emberAfNetworkCommissioningClusterGetLastNetworkCommissioningResultCallback(timeoutMs);
450 case ZCL_REMOVE_NETWORK_COMMAND_ID: {
451 uint16_t payloadOffset = cmd->payloadStartIndex;
456 if (cmd->bufLen < payloadOffset + 1u)
458 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
460 NetworkID = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
461 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(NetworkID) + 1u);
462 if (cmd->bufLen < payloadOffset + 8)
464 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
466 Breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
467 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
468 if (cmd->bufLen < payloadOffset + 4)
470 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
472 TimeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
474 wasHandled = emberAfNetworkCommissioningClusterRemoveNetworkCallback(NetworkID, Breadcrumb, TimeoutMs);
477 case ZCL_SCAN_NETWORKS_COMMAND_ID: {
478 uint16_t payloadOffset = cmd->payloadStartIndex;
483 if (cmd->bufLen < payloadOffset + 1u)
485 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
487 ssid = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
488 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
489 if (cmd->bufLen < payloadOffset + 8)
491 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
493 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
494 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
495 if (cmd->bufLen < payloadOffset + 4)
497 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
499 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
501 wasHandled = emberAfNetworkCommissioningClusterScanNetworksCallback(ssid, breadcrumb, timeoutMs);
504 case ZCL_UPDATE_THREAD_NETWORK_COMMAND_ID: {
505 uint16_t payloadOffset = cmd->payloadStartIndex;
506 uint8_t * operationalDataset;
510 if (cmd->bufLen < payloadOffset + 1u)
512 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
514 operationalDataset = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
515 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(operationalDataset) + 1u);
516 if (cmd->bufLen < payloadOffset + 8)
518 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
520 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
521 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
522 if (cmd->bufLen < payloadOffset + 4)
524 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
526 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
528 wasHandled = emberAfNetworkCommissioningClusterUpdateThreadNetworkCallback(operationalDataset, breadcrumb, timeoutMs);
531 case ZCL_UPDATE_WI_FI_NETWORK_COMMAND_ID: {
532 uint16_t payloadOffset = cmd->payloadStartIndex;
534 uint8_t * credentials;
538 if (cmd->bufLen < payloadOffset + 1u)
540 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
542 ssid = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
543 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(ssid) + 1u);
544 if (cmd->bufLen < payloadOffset + 1u)
546 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
548 credentials = emberAfGetString(cmd->buffer, payloadOffset, cmd->bufLen);
549 payloadOffset = static_cast<uint16_t>(payloadOffset + emberAfStringLength(credentials) + 1u);
550 if (cmd->bufLen < payloadOffset + 8)
552 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
554 breadcrumb = emberAfGetInt64u(cmd->buffer, payloadOffset, cmd->bufLen);
555 payloadOffset = static_cast<uint16_t>(payloadOffset + 8);
556 if (cmd->bufLen < payloadOffset + 4)
558 return EMBER_ZCL_STATUS_MALFORMED_COMMAND;
560 timeoutMs = emberAfGetInt32u(cmd->buffer, payloadOffset, cmd->bufLen);
562 wasHandled = emberAfNetworkCommissioningClusterUpdateWiFiNetworkCallback(ssid, credentials, breadcrumb, timeoutMs);
566 // Unrecognized command ID, error status will apply.
571 return status(wasHandled, true, cmd->mfgSpecific);
573 EmberAfStatus emberAfOnOffClusterServerCommandParse(EmberAfClusterCommand * cmd)
575 bool wasHandled = false;
577 if (!cmd->mfgSpecific)
579 switch (cmd->commandId)
581 case ZCL_OFF_COMMAND_ID: {
582 wasHandled = emberAfOnOffClusterOffCallback();
585 case ZCL_ON_COMMAND_ID: {
586 wasHandled = emberAfOnOffClusterOnCallback();
589 case ZCL_TOGGLE_COMMAND_ID: {
590 wasHandled = emberAfOnOffClusterToggleCallback();
594 // Unrecognized command ID, error status will apply.
599 return status(wasHandled, true, cmd->mfgSpecific);