-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Problems: Interaction Model spec has introduced status reponse message and used it for IM Read/Subscribe. Currently IM read/subscribe code still use status report from secure channel, we need to update it with status reponse. Summary of Changes: -- Add status reponse message builder and parser and test -- Replace status report with status response message for IM read/subscribe -- Move protocol code type from uint16_t to uint32_t. For status code change in other IM message, we will do it in another PR.
- Loading branch information
1 parent
e71f2d7
commit 3a96af1
Showing
25 changed files
with
450 additions
and
100 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/** | ||
* | ||
* Copyright (c) 2021 Project CHIP Authors | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#include <app/MessageDef/MessageDefHelper.h> | ||
#include <app/MessageDef/StatusResponse.h> | ||
|
||
namespace chip { | ||
namespace app { | ||
CHIP_ERROR StatusResponse::Parser::Init(const TLV::TLVReader & aReader) | ||
{ | ||
// make a copy of the reader here | ||
mReader.Init(aReader); | ||
VerifyOrReturnLogError(TLV::kTLVType_Structure == mReader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); | ||
ReturnLogErrorOnFailure(mReader.EnterContainer(mOuterContainerType)); | ||
return CHIP_NO_ERROR; | ||
} | ||
|
||
#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK | ||
CHIP_ERROR StatusResponse::Parser::CheckSchemaValidity() const | ||
{ | ||
CHIP_ERROR err = CHIP_NO_ERROR; | ||
uint16_t TagPresenceMask = 0; | ||
TLV::TLVReader reader; | ||
PRETTY_PRINT("StatusResponse ="); | ||
PRETTY_PRINT("{"); | ||
|
||
// make a copy of the reader | ||
reader.Init(mReader); | ||
|
||
while (CHIP_NO_ERROR == (err = reader.Next())) | ||
{ | ||
VerifyOrReturnLogError(TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG); | ||
switch (TLV::TagNumFromTag(reader.GetTag())) | ||
{ | ||
case kCsTag_Status: | ||
VerifyOrReturnLogError(!(TagPresenceMask & (1 << kCsTag_Status)), CHIP_ERROR_INVALID_TLV_TAG); | ||
TagPresenceMask |= (1 << kCsTag_Status); | ||
VerifyOrReturnLogError(TLV::kTLVType_UnsignedInteger == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); | ||
#if CHIP_DETAIL_LOGGING | ||
{ | ||
uint32_t status; | ||
ReturnLogErrorOnFailure(reader.Get(status)); | ||
PRETTY_PRINT("\tStatus = 0x%" PRIx32 ",", status); | ||
} | ||
#endif // CHIP_DETAIL_LOGGING | ||
break; | ||
default: | ||
ReturnLogErrorOnFailure(CHIP_ERROR_INVALID_TLV_TAG); | ||
} | ||
} | ||
PRETTY_PRINT("}"); | ||
PRETTY_PRINT(""); | ||
|
||
if (CHIP_END_OF_TLV == err) | ||
{ | ||
const uint16_t RequiredFields = (1 << kCsTag_Status); | ||
|
||
if ((TagPresenceMask & RequiredFields) == RequiredFields) | ||
{ | ||
err = CHIP_NO_ERROR; | ||
} | ||
} | ||
ReturnLogErrorOnFailure(err); | ||
return reader.ExitContainer(mOuterContainerType); | ||
} | ||
#endif // CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK | ||
|
||
CHIP_ERROR StatusResponse::Parser::GetStatus(uint32_t * const apStatus) const | ||
{ | ||
return GetUnsignedInteger(kCsTag_Status, apStatus); | ||
} | ||
|
||
CHIP_ERROR StatusResponse::Builder::Init(TLV::TLVWriter * const apWriter) | ||
{ | ||
return InitAnonymousStructure(apWriter); | ||
} | ||
|
||
StatusResponse::Builder & StatusResponse::Builder::Status(const uint32_t aStatus) | ||
{ | ||
// skip if error has already been set | ||
if (mError == CHIP_NO_ERROR) | ||
{ | ||
mError = mpWriter->Put(TLV::ContextTag(kCsTag_Status), aStatus); | ||
} | ||
EndOfContainer(); | ||
return *this; | ||
} | ||
|
||
} // namespace app | ||
} // namespace chip |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
/** | ||
* | ||
* Copyright (c) 2021 Project CHIP Authors | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#pragma once | ||
#include "Builder.h" | ||
#include "Parser.h" | ||
#include <app/AppBuildConfig.h> | ||
#include <app/util/basic-types.h> | ||
#include <lib/core/CHIPCore.h> | ||
#include <lib/core/CHIPTLV.h> | ||
#include <lib/support/CodeUtils.h> | ||
#include <lib/support/logging/CHIPLogging.h> | ||
|
||
namespace chip { | ||
namespace app { | ||
namespace StatusResponse { | ||
enum | ||
{ | ||
kCsTag_Status = 0, | ||
}; | ||
|
||
class Parser : public app::Parser | ||
{ | ||
public: | ||
/** | ||
* @param [in] aReader A pointer to a TLVReader, which should point to the beginning of this response | ||
*/ | ||
CHIP_ERROR Init(const TLV::TLVReader & aReader); | ||
#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK | ||
/** | ||
* @brief Roughly verify the message is correctly formed | ||
* 1) all mandatory tags are present | ||
* 2) all elements have expected data type | ||
* 3) any tag can only appear once | ||
* 4) At the top level of the structure, unknown tags are ignored for forward compatibility | ||
* @note The main use of this function is to print out what we're | ||
* receiving during protocol development and debugging. | ||
* The encoding rule has changed in IM encoding spec so this | ||
* check is only "roughly" conformant now. | ||
* | ||
* @return #CHIP_NO_ERROR on success | ||
*/ | ||
CHIP_ERROR CheckSchemaValidity() const; | ||
#endif | ||
|
||
/** | ||
* @brief Get Status. Next() must be called before accessing them. | ||
* | ||
* @return #CHIP_NO_ERROR on success | ||
* #CHIP_END_OF_TLV if there is no such element | ||
*/ | ||
CHIP_ERROR GetStatus(uint32_t * const apStatus) const; | ||
}; | ||
|
||
class Builder : public app::Builder | ||
{ | ||
public: | ||
CHIP_ERROR Init(TLV::TLVWriter * const apWriter); | ||
StatusResponse::Builder & Status(const uint32_t aStatus); | ||
}; | ||
} // namespace StatusResponse | ||
} // namespace app | ||
} // namespace chip |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.