forked from project-chip/connectedhomeip
-
Notifications
You must be signed in to change notification settings - Fork 0
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
Update Rotating-Id-Generation branch from master #11
Merged
Conversation
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
* Integrate CRMP to messaging layer and enable it by default * Address review comments * Add re-transmition test with dropped sent packets * Use reference to share mContextPool between ReliableMessageManager and ExchangeManager * Use PacketBufferHandle instead of raw PacketBuffer to store message buffer in retransmit table * Retain an extra handle of msgBuf before sending for following rewinding * Retain the buffer within SecureSessionMgr and update the retrans entry * Address the review comments Update src/transport/SecureSessionMgr.h Co-authored-by: Boris Zbarsky <[email protected]> * Take care of various error cases in HandleMessage * Update src/messaging/ExchangeContext.cpp Co-authored-by: Boris Zbarsky <[email protected]> * Update src/messaging/ExchangeContext.cpp Co-authored-by: Boris Zbarsky <[email protected]> * Update src/messaging/ExchangeContext.cpp Co-authored-by: Boris Zbarsky <[email protected]> * Update src/messaging/ExchangeContext.cpp Co-authored-by: Boris Zbarsky <[email protected]> * Update src/messaging/ExchangeContext.cpp Co-authored-by: Boris Zbarsky <[email protected]> * Update src/messaging/ExchangeMgr.cpp Co-authored-by: Boris Zbarsky <[email protected]> * Use initializer to initilize the EncryptedPacketBufferHandle memebers * Simplify sendMessage API for sending encrypted message * Skip re-setting up the packet header when the message is already encrypted. * Add the Unit test for SecureSessionMgr Co-authored-by: Boris Zbarsky <[email protected]>
This PR introduces a folder inside `src/app/zap-templates` to host custom ZCL extensions such as the `MfgSpecificPing` command introduced in #4127 as well as a `Binding Cluster` from #4156. The `Binding Cluster` exposes 2 methods, `Bind` and `Unbind`. The current spec defines `bindings` has an `RW` attribute but an issue has been opened since it does not look very convenient (see CHIP-Specifications/connectedhomeip-spec#627) The `gen/` folders are also updated to reflect the addition of the `Binding Cluster`. Futhermore, the 2 scripts used to generates the `gen/` folders have also been updated to points to the `src/app/zap-templates/zcl/zcl.json` instead of `third_party/zap/repo/zcl-builtin/silabs/zcl.json` since the former is a superset of the later.
In #3879, an `OnOffCluster` class has been introduced. This class has been handrolled to have a base template. This PR generates C++ wrappers for the ZCL clusters from the `all-clusters-app`, which is what has been used to generate the code inside `chip-tool` and `src/app`. Included in this PR are the templates used for generating the wrappers.
Problem We don't have e2e validation for Interaction Model. Summary of Changes -- Add e2e validation test for Interaction Mode in cirque Fixes #4282
This code add a new `Binding Cluster` that contains a `Bind` and `Unbind` method in order to create bindings between devices using the underlying ZCL code. I have added it to be compile in all the `examples/`, similarly to `reporting` even if it is unused now. In fact one may noticed that there it no headers for it. This is because the declarations are going to be generated as part of `gen/callbacks.h`.
* Convert mdns Builder classes to use PacketBufferHandle #### Problem Code should use `PacketBufferHandle` rather than `PacketBuffer` directly. #### Summary of Changes Convert mdns::Minimal::QueryBuilder and mdns::Minimal::ResponseBuilder to take and hold PacketBufferHandle. Part of issue #2707 - Figure out a way to express PacketBuffer ownership in the type system * Review: make QueryBuilder take const& * WIP * Revise to match ResponseBuilder in #4102 * Restyled by clang-format * remove PacketReporter.cpp change Co-authored-by: Restyled.io <[email protected]>
…4177) * Initial definition of an mDNS advertiser * Make chip app server listen on mdns by default * Replace DiscoveryManager with advertiser * Fix compilation, ensure we shutdown before we listen for mDNS server, to make sure multiple start calls work * Always advertise as operational, add some more logging * Register delegates, add some logging, fix PTR records * Remove errand space * Fix crash in ESP code on broadcast * Fix return value: ref return does not work well * Update logging verbosity on ESP32: chip already configures its logging, so mark esp verbosity to verbose * hex format server name * Better logging, fix server discovery * Update registration of names * Restyle fixes * Make ipv4 in minmdns optional * Fix logic error in interface lister * Move Clone into SystemPacketBuffer. Clean up a bit of handle usage in mdns * Make stringbuilder a support class * Restyle fixes * Fix build after merge with master * Use dynamic memory allocation for responders * Update to use dynamic memory for qnames as well * Use clear to reset state * Move Flat allocated qnames in separate file and add unit tests * Add some doccomments * Remove redundant information from srv responder contructor arguments * Order of init fix * Rename Clone to CloneData * Add nullptr setting during clear * Replace minimal-mdns with minimal * Clariy update for interface iteration * Validate qname memory allocation * Restyle fixes * Make doxygen happy * Make doxygen happy * Cleanup doccomments * Minimize template-specific code within minimal mdns memory allocation code - hoping for a size reduction of code
* SystemPacketBuffer.h cleanup #### Problem Code should use `PacketBufferHandle` rather than `PacketBuffer *`. Some existing methods should be removed or made private so that code does not have unnecessary access to the raw pointer. #### Summary of Changes - convert public use of `PacketBufferHandle::Adopt()`. - convert internal use of `Adopt()` to private `Free()`. - renamed `PacketBuffer::Create()` factory to `Adopt()`. - rename private `PacketBuffer::Next()` to `ChainedBuffer()`. - explicity note `PacketBuffer::Next_ForNow()` remaining use in TLV. - make `PacketBuffer::Free()` private. - make `PacketBuffer::Consume()` private. - make `PacketBuffer::AddToEnd_ForNow()` private (still used in tests). - remove `PacketBuffer::FreeHead_ForNow()`. - remove `operator*`. Part of issue #2707 - Figure out a way to express PacketBuffer ownership in the type system * Fix build (crossed paths with #4132) * Remove PacketBufferHandle::Free() * Fixes for #4241
* Disable CRMP if sending over non-UDP transport * Address review comments
nrfconnect platform is based on the Zephyr and in many cases it uses Zephyr specific components implementation. Zephyr specific files should be located in the Zephyr platform. * Moved Zephyr specific modules from the nrfconnect to the Zephyr platform * Moved BLEManagerImpl and ThreadStackManagerImpl implementations from Generic_Zephyr files. * Removed Generic_Zephyr files. * Aligned READMEs for nrfconnect and Zephyr platforms.
* Call Platform::MemoryInit in the setup code parser library. - MemoryInit is required since some setup parsing methods may use Platform::Memory - cleanup the code for parsing: "SuccessOrExit(size == 0)" reads oddly ... it exists when the condition is false. * Remove extra added file
* Some cleanup in secure session manager code * Address review comments * address review comments * review comments * update enum variants
#4219) * Define global attributes ids only once instead of repeating them for all clusters * Update src/app/zap-templates/attribute-id.zapt Co-authored-by: Boris Zbarsky <[email protected]> Co-authored-by: Boris Zbarsky <[email protected]>
…ExchangeManager (#4293)
#### Problem The `CHECK_RETURN_VALUE` macro is conditionally defined to a non-standard attribute that indicates that a function return value should not be ignored. C++17 standardizes this as `[[nodiscard]]` and some compilers also support this attribute in earlier versions. #### Summary of Changes Use `[[nodiscard]]` when it is known to be available. - C++17 or later - gcc 7 or later, per https://gcc.gnu.org/projects/cxx-status.html - clang 4 or later, per https://clang.llvm.org/cxx_status.html
Spec requirement is that device shall require explicit trigger of NFC pairing mode via a physical interaction on the device, while currently NFC tag emulation is started automatically after init. * Moved NFC tag starting method from init to the button handler * Added GetTagState method to the NFCWidget * Aligned samples documentation
* Add Common protocol definations * Rename CommonProtocol.h to Constants.h * Rename secure_channel/SecureChannelProtocol.h to secure_channel/Constants.h
* Add more unit tests for sending pre-encrypted messages * restyled * Fix test compilation * restyled
* Revise CHIPTLV to increase PacketBuffer safety #### Problem CHIPTLV stores pointers to PacketBuffers (and CHIPCircularTLVBuffers) as integers, and its code also uses some unsafe PacketBuffer methods that are used nowhere else and should be removed. #### Summary of Changes - Replace the `int mBufHandle` used to hold pointers in TLV classes, and the associated callbacks, with a TLVBackingStore interface. - Implement the TLVBackingStore interface on CHIPCircularTLVBuffers. - Implement the TLVBackingStore interface for PacketBuffers, and add PacketBufferTLVReader/Writer modelled on CHIPCircularTLVReader/Writer. - Incidentally, move existing interface documentation to CHIPTLV.h. fixes #4163 Revise CHIPTLV for PacketBuffer safety * Fix doxygen * Correct copyright dates * Code review * Remove #pragma GCC diagnostic
* Initial definition of an mDNS advertiser * Make chip app server listen on mdns by default * Replace DiscoveryManager with advertiser * Fix compilation, ensure we shutdown before we listen for mDNS server, to make sure multiple start calls work * Always advertise as operational, add some more logging * Register delegates, add some logging, fix PTR records * Remove errand space * Fix crash in ESP code on broadcast * Fix return value: ref return does not work well * Update logging verbosity on ESP32: chip already configures its logging, so mark esp verbosity to verbose * hex format server name * Better logging, fix server discovery * Update registration of names * Restyle fixes * Make ipv4 in minmdns optional * Fix logic error in interface lister * Move Clone into SystemPacketBuffer. Clean up a bit of handle usage in mdns * Make stringbuilder a support class * Restyle fixes * Fix build after merge with master * Use dynamic memory allocation for responders * Update to use dynamic memory for qnames as well * Use clear to reset state * Move Flat allocated qnames in separate file and add unit tests * Add some doccomments * Remove redundant information from srv responder contructor arguments * Order of init fix * Rename Clone to CloneData * Add nullptr setting during clear * Replace minimal-mdns with minimal * Clariy update for interface iteration * Validate qname memory allocation * Restyle fixes * Make doxygen happy * Make doxygen happy * Cleanup doccomments * Minimize template-specific code within minimal mdns memory allocation code - hoping for a size reduction of code * Add methods for commisionable advertisement in the minmdns advertiser * Create an example advertiser app, that uses the mdns advertiser * Added some documentation, renamed advertiser to exclude minimal since we use the platform advertiser in this example * Added error handling and remove -v option (apparently we auto-use it for version, which seems unfortunate) * Only enable -4 option if ipv4 is configured * Fix ipv4 listening for minmdns * Update parameters to match examples in spec * Vid/pid are 16-bit apparently * Make the example app server advertise operational as well * Rename Commisionable to Commsioning - this is what we actually added. Naming is a bit too close for comfort ... * Restyle fixes * Add back method definition (merge error) * Implement assignment operator in Optional since =default does not work * Replace commisionable with commisioning * Update based on code review feedback * Shorten the advertiser parameters code: do not build everything into one * Fix compilation (missing braces on method call) * Fix crash min minmdns query builder - header buffer assignment is required on reset
* [zephyr] Fix compatibility with newer Zephyr As a result of zephyrproject-rtos/zephyr#29357 BLE indication callback parameter type has changed in recent Zephyr revisions. * Restyled by clang-format Co-authored-by: Restyled.io <[email protected]>
* CHIP Certificate Implementation. -- Implements core logic to load, process, validate CHIP certificates. -- Implements CHIP to X509 certificate conversion functions. -- Implements X509 to CHIP Certificate conversion functions. * Addressed Review Comments. * Addressed Review Comments. * CHIP Certificate Implementation. -- Implements core logic to load, process, validate CHIP certificates. -- Implements CHIP to X509 certificate conversion functions. -- Implements X509 to CHIP Certificate conversion functions. * Apply suggestions from code review Co-authored-by: Boris Zbarsky <[email protected]> * Addressed Review Comments * Fixed compile error Co-authored-by: Boris Zbarsky <[email protected]>
* Add TCP support to chip echo test app * Change argument 'tcp' to '--tcp'
) * Initial support of the Texas Instruments CC13X2 CC26X2 MCU family * Update headers to match repository * Switched License header to Apache 2.0 for SysConfig file. * Replaced C ternary statements with boolean returns. * Replaced Pre-processor include guards with `#pragma once`. * Removed unnecessary forward declarations. * Restyled by whitespace * Restyled by clang-format * Restyled by gn * Restyled by prettier-markdown * fix whitespace (tab) issue from restyled * fix clang-format build issues from restyled Includes for board specific header files need path delimiters. * Restyled by whitespace * revert incorrect changes to m5stack-tft repo * remove common nv driver Revert to using the SDK version of the common nv driver and enable the POSIX-like porting layer. * remove ti sdk files Revert to using the platform support files in the board specific example from the TI SDK. This adds a step to installing the TI SDK to fix-up changes to work with the development version of OpenThread. * Restyled by clang-format * Restyled by gn * Restyled by prettier-markdown * add freertos as a submodule * move openthread platform to simplelink build file * clean up build graph * fix OpenThread configuration to match TI SDK * update lwip config header * Restyled by clang-format * Restyled by gn * remove usage of $HOME This now requires the user to set the absolute locations of the TI SDK and SysConfig tools. * Restyled by prettier-markdown * fix build issues * size sha workspace for the CC13X2 CC26X2 * Restyled by gn * fix gn style and remove commented out code * fix cpp elif in efr32 * re-enable openthread on efr32 and disable on esp32 * align with other platform doxygen disable defines Co-authored-by: Restyled.io <[email protected]>
…eFlag_ from ExFlagValues (#4323)
hnnajh
pushed a commit
that referenced
this pull request
Jul 22, 2022
It's not safe to access line editing state from the IO thread while inside readline() on the main thread. Remove the code that attempts to redraw readline after printing logs. This avoids segfaults during logging at the cost of those logs overwriting the prompt (this is not trivial to fix as readline is a blocking API). ================== WARNING: ThreadSanitizer: data race (pid=63005) Write of size 1 at 0x55f81c7745ff by main thread: #0 InteractiveStartCommand::ParseCommand(char*) ../../examples/chip-tool/commands/interactive/InteractiveCommands.cpp:127 (chip-tool+0x874911) #1 InteractiveStartCommand::RunCommand() ../../examples/chip-tool/commands/interactive/InteractiveCommands.cpp:85 (chip-tool+0x874594) #2 CHIPCommand::StartWaiting(std::chrono::duration<unsigned int, std::ratio<1l, 1000l> >) ../../examples/chip-tool/commands/common/CHIPCommand.cpp:408 (chip-tool+0x83e478) #3 CHIPCommand::Run() ../../examples/chip-tool/commands/common/CHIPCommand.cpp:187 (chip-tool+0x83c839) #4 Commands::RunCommand(int, char**, bool) ../../examples/chip-tool/commands/common/Commands.cpp:147 (chip-tool+0x85d4f7) #5 Commands::Run(int, char**) ../../examples/chip-tool/commands/common/Commands.cpp:51 (chip-tool+0x85c288) #6 main <null> (chip-tool+0x569c0a) Previous read of size 1 at 0x55f81c7745ff by thread T5 (mutexes: write M185): #0 LoggingCallback ../../examples/chip-tool/commands/interactive/InteractiveCommands.cpp:46 (chip-tool+0x874479) #1 chip::Logging::LogV(unsigned char, unsigned char, char const*, __va_list_tag*) ../../src/lib/support/logging/CHIPLogging.cpp:221 (chip-tool+0x8ee4dc) #2 chip::Logging::Log(unsigned char, unsigned char, char const*, ...) ../../src/lib/support/logging/CHIPLogging.cpp:172 (chip-tool+0x8ee30a) #3 chip::app::ReadClient::RefreshLivenessCheckTimer() <null> (chip-tool+0x8b1746) #4 chip::app::ReadClient::ProcessSubscribeResponse(chip::System::PacketBufferHandle&&) ../../src/app/ReadClient.cpp:845 (chip-tool+0x8b20ec) #5 chip::app::ReadClient::OnMessageReceived(chip::Messaging::ExchangeContext*, chip::PayloadHeader const&, chip::System::PacketBufferHandle&&) ../../src/app/ReadClient.cpp:409 (chip-tool+0x8ae2a4) #6 chip::Messaging::ExchangeContext::HandleMessage(unsigned int, chip::PayloadHeader const&, chip::BitFlags<chip::Messaging::MessageFlagValues, unsigned int>, chip::System::PacketBufferHandle&&) <null> (chip-tool+0xa0517a) #7 operator()<chip::Messaging::ExchangeContext> ../../src/messaging/ExchangeMgr.cpp:219 (chip-tool+0xa08c73) #8 Call ../../src/lib/support/Pool.h:126 (chip-tool+0xa0912d) #9 chip::internal::HeapObjectList::ForEachNode(void*, chip::Loop (*)(void*, void*)) ../../src/lib/support/Pool.cpp:127 (chip-tool+0x8ee05a) #10 ForEachActiveObject<chip::Messaging::ExchangeManager::OnMessageReceived(const chip::PacketHeader&, const chip::PayloadHeader&, const chip::SessionHandle&, chip::SessionMessageDelegate::DuplicateMessage, chip::System::PacketBufferHandle&&)::<lambda(auto:2*)> > ../../src/lib/support/Pool.h:396 (chip-tool+0xa08d10) #11 chip::Messaging::ExchangeManager::OnMessageReceived(chip::PacketHeader const&, chip::PayloadHeader const&, chip::SessionHandle const&, chip::SessionMessageDelegate::DuplicateMessage, chip::System::PacketBufferHandle&&) ../../src/messaging/ExchangeMgr.cpp:212 (chip-tool+0xa07e91) #12 chip::SessionManager::SecureUnicastMessageDispatch(chip::PacketHeader const&, chip::Transport::PeerAddress const&, chip::System::PacketBufferHandle&&) ../../src/transport/SessionManager.cpp:616 (chip-tool+0xa1548b) #13 chip::SessionManager::OnMessageReceived(chip::Transport::PeerAddress const&, chip::System::PacketBufferHandle&&) ../../src/transport/SessionManager.cpp:443 (chip-tool+0xa14426) #14 chip::TransportMgrBase::HandleMessageReceived(chip::Transport::PeerAddress const&, chip::System::PacketBufferHandle&&) ../../src/transport/TransportMgrBase.cpp:76 (chip-tool+0xa17dfa) #15 chip::Transport::Base::HandleMessageReceived(chip::Transport::PeerAddress const&, chip::System::PacketBufferHandle&&) ../../src/transport/raw/Base.h:102 (chip-tool+0xb19728) #16 chip::Transport::UDP::OnUdpReceive(chip::Inet::UDPEndPoint*, chip::System::PacketBufferHandle&&, chip::Inet::IPPacketInfo const*) ../../src/transport/raw/UDP.cpp:122 (chip-tool+0xb1a48b) #17 chip::Inet::UDPEndPointImplSockets::HandlePendingIO(chip::BitFlags<chip::System::SocketEventFlags, unsigned char>) ../../src/inet/UDPEndPointImplSockets.cpp:688 (chip-tool+0xb00aa0) #18 chip::Inet::UDPEndPointImplSockets::HandlePendingIO(chip::BitFlags<chip::System::SocketEventFlags, unsigned char>, long) ../../src/inet/UDPEndPointImplSockets.cpp:569 (chip-tool+0xafff89) #19 chip::System::LayerImplSelect::HandleEvents() ../../src/system/SystemLayerImplSelect.cpp:406 (chip-tool+0xb07563) #20 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::_RunEventLoop() ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:181 (chip-tool+0x98a227) #21 chip::DeviceLayer::PlatformManager::RunEventLoop() ../../src/include/platform/PlatformManager.h:362 (chip-tool+0x988f75) #22 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::EventLoopTaskMain(void*) ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:205 (chip-tool+0x98a87c) Location is global '(anonymous namespace)::gIsCommandRunning' of size 1 at 0x55f81c7745ff (chip-tool+0x000000c485ff) Mutex M185 (0x55f81c776180) created at: #0 pthread_mutex_lock ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4240 (libtsan.so.0+0x4f30a) #1 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::_LockChipStack() ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:78 (chip-tool+0x989e90) #2 chip::DeviceLayer::PlatformManager::LockChipStack() ../../src/include/platform/PlatformManager.h:410 (chip-tool+0x988fa5) #3 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::_RunEventLoop() ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:170 (chip-tool+0x98a147) #4 chip::DeviceLayer::PlatformManager::RunEventLoop() ../../src/include/platform/PlatformManager.h:362 (chip-tool+0x988f75) #5 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::EventLoopTaskMain(void*) ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:205 (chip-tool+0x98a87c) Thread T5 (tid=63013, running) created by main thread at: #0 pthread_create ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:969 (libtsan.so.0+0x5ad75) #1 chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX<chip::DeviceLayer::PlatformManagerImpl>::_StartEventLoopTask() ../../src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp:231 (chip-tool+0x98a40a) #2 chip::DeviceLayer::PlatformManager::StartEventLoopTask() ../../src/include/platform/PlatformManager.h:375 (chip-tool+0xaacca2) #3 chip::Controller::DeviceControllerFactory::ServiceEvents() ../../src/controller/CHIPDeviceControllerFactory.cpp:331 (chip-tool+0xab0417) #4 CHIPCommand::StartWaiting(std::chrono::duration<unsigned int, std::ratio<1l, 1000l> >) ../../examples/chip-tool/commands/common/CHIPCommand.cpp:403 (chip-tool+0x83e353) #5 CHIPCommand::Run() ../../examples/chip-tool/commands/common/CHIPCommand.cpp:187 (chip-tool+0x83c839) #6 Commands::RunCommand(int, char**, bool) ../../examples/chip-tool/commands/common/Commands.cpp:147 (chip-tool+0x85d4f7) #7 Commands::Run(int, char**) ../../examples/chip-tool/commands/common/Commands.cpp:51 (chip-tool+0x85c288) #8 main <null> (chip-tool+0x569c0a) SUMMARY: ThreadSanitizer: data race ../../examples/chip-tool/commands/interactive/InteractiveCommands.cpp:127 in InteractiveStartCommand::ParseCommand(char*) ==================
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
<<<<<FILL ME IN - the issue this PR is intended to address>>>>>
Summary of Changes
<<<<<FILL ME IN - what's in this PR>>>>>
Fixes #<<<<<FILL ME IN - issue number(s). If no issue, please create one>>>>>