| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "weave_inspector.h" |
| |
| #include <lib/syslog/cpp/macros.h> |
| |
| #include <Weave/DeviceLayer/internal/WeaveDeviceLayerInternal.h> |
| |
| using namespace nl::Weave::Profiles; |
| |
| namespace nl::Weave { |
| |
| // Inspect Node names |
| const std::string kNode_Reason = "reason"; |
| const std::string kNode_State = "state"; |
| const std::string kNode_Time = "@time"; |
| const std::string kNode_Type = "type"; |
| const std::string kNode_TunnelStatus = "tunnel_status"; |
| const std::string kNode_TunnelStatus_TimeTunnelDown = "last_time_tunnel_down"; |
| const std::string kNode_TunnelStatus_TimeTunnelEstablish = "last_time_tunnel_established"; |
| const std::string kNode_WeaveStatus = "weave_status"; |
| const std::string kNode_WeaveStatus_FailsafeState = "failsafe_state"; |
| const std::string kNode_WeaveStatus_PairingState = "pairing_state"; |
| const std::string kNode_WeaveStatus_TunnelState = "tunnel_state"; |
| const std::string kNode_WeaveStatus_TunnelState_IsRestricted = "is_restricted"; |
| const std::string kNode_WeaveStatus_SetupState = "setup_state"; |
| |
| constexpr int kMaxWeaveStatusEntries = 25; |
| |
| // Inspect Node values |
| const WeaveInspector::WeaveStatus_FailSafeReason WeaveInspector::kFailSafeReason_Init = "Init"; |
| const WeaveInspector::WeaveStatus_FailSafeReason WeaveInspector::kFailSafeReason_Nominal = |
| "Nominal"; |
| const WeaveInspector::WeaveStatus_FailSafeReason WeaveInspector::kFailSafeReason_FailsafeArmFailed = |
| "FailsafeArmFailed"; |
| const WeaveInspector::WeaveStatus_FailSafeReason |
| WeaveInspector::kFailSafeReason_FailsafeDisarmFailed = "FailsafeDisarmFailed"; |
| |
| const WeaveInspector::WeaveStatus_FailSafeState WeaveInspector::kFailSafeState_Armed = "Armed"; |
| const WeaveInspector::WeaveStatus_FailSafeState WeaveInspector::kFailSafeState_Disarmed = |
| "Disarmed"; |
| |
| const WeaveInspector::WeaveStatus_PairingState WeaveInspector::kPairingState_Initialized = |
| "Initialized"; |
| const WeaveInspector::WeaveStatus_PairingState WeaveInspector::kPairingState_FabricCreatedOrJoined = |
| "FabricCreatedOrJoined"; |
| const WeaveInspector::WeaveStatus_PairingState |
| WeaveInspector::kPairingState_ThreadNetworkCreatedOrJoined = "ThreadNetworkCreatedOrJoined"; |
| const WeaveInspector::WeaveStatus_PairingState |
| WeaveInspector::kPairingState_RegisterServicePending = "RegisterServicePending"; |
| const WeaveInspector::WeaveStatus_PairingState |
| WeaveInspector::kPairingState_RegisterServiceCompleted = "RegisterServiceCompleted"; |
| const WeaveInspector::WeaveStatus_PairingState WeaveInspector::kPairingState_ServiceConfigUpdated = |
| "ServiceConfigUpdated"; |
| const WeaveInspector::WeaveStatus_PairingState WeaveInspector::kPairingState_LeftFabric = |
| "LeftFabric"; |
| |
| const WeaveInspector::WeaveStatus_SetupState WeaveInspector::kSetupState_Initialized = |
| "Initialized"; |
| const WeaveInspector::WeaveStatus_SetupState WeaveInspector::kSetupState_BLEConnected = |
| "BLEConnected"; |
| const WeaveInspector::WeaveStatus_SetupState WeaveInspector::kSetupState_PASESessionEstablished = |
| "PASESessionEstablished"; |
| const WeaveInspector::WeaveStatus_SetupState WeaveInspector::kSetupState_CASESessionEstablished = |
| "CASESessionEstablished"; |
| |
| const WeaveInspector::WeaveStatus_TunnelState WeaveInspector::kTunnelState_NoTunnel = "NoTunnel"; |
| const WeaveInspector::WeaveStatus_TunnelState WeaveInspector::kTunnelState_PrimaryTunMode = |
| "PrimaryTunMode"; |
| const WeaveInspector::WeaveStatus_TunnelState WeaveInspector::kTunnelState_BkupOnlyTunMode = |
| "BkupOnlyTunMode"; |
| const WeaveInspector::WeaveStatus_TunnelState WeaveInspector::kTunnelState_PrimaryAndBkupTunMode = |
| "PrimaryAndBkupTunMode"; |
| |
| const WeaveInspector::WeaveStatus_TunnelType WeaveInspector::kTunnelType_None = "None"; |
| const WeaveInspector::WeaveStatus_TunnelType WeaveInspector::kTunnelType_Primary = "Primary"; |
| const WeaveInspector::WeaveStatus_TunnelType WeaveInspector::kTunnelType_Backup = "Backup"; |
| const WeaveInspector::WeaveStatus_TunnelType WeaveInspector::kTunnelType_Shortcut = "Shortcut"; |
| |
| WeaveInspector& WeaveInspector::GetWeaveInspector() { |
| static WeaveInspector weave_inspector; |
| return weave_inspector; |
| } |
| |
| WeaveInspector::WeaveInspector(async_dispatcher_t* dispatcher) |
| : inspector_( |
| std::make_unique<inspect::ComponentInspector>(dispatcher, inspect::PublishOptions{})), |
| tunnel_status_(inspector_->root()), |
| weave_status_(inspector_->root()) {} |
| |
| void WeaveInspector::NotifyInit() { |
| weave_status_.LogCurrentStatus(); |
| tunnel_status_.RecordTunnelEstablishedTime(0); |
| tunnel_status_.RecordTunnelDownTime(0); |
| } |
| |
| void WeaveInspector::NotifyPairingStateChange(const WeaveStatus_PairingState& new_state) { |
| weave_status_.RecordPairingStateChange(new_state); |
| } |
| |
| void WeaveInspector::NotifyFailSafeStateChange(const WeaveStatus_FailSafeState& new_state, |
| const WeaveStatus_FailSafeReason& reason) { |
| weave_status_.RecordFailSafeStateChange(new_state, reason); |
| } |
| |
| void WeaveInspector::NotifySetupStateChange(const WeaveStatus_SetupState& new_state) { |
| weave_status_.RecordSetupStateChange(new_state); |
| } |
| |
| void WeaveInspector::NotifyTunnelStateChange(const WeaveStatus_TunnelState& new_state, |
| const WeaveStatus_TunnelType& tunnel_type, |
| const bool is_restricted) { |
| WeaveStatus_TunnelState old_tunnel_state = weave_status_.GetCurrentWeaveStatus().tunnel_state_; |
| weave_status_.RecordTunnelStateChange(new_state, tunnel_type, is_restricted); |
| if (old_tunnel_state == new_state) { |
| return; |
| } |
| if (new_state == kTunnelState_NoTunnel) { |
| tunnel_status_.RecordTunnelDownTime(zx::clock::get_monotonic().get()); |
| return; |
| } |
| tunnel_status_.RecordTunnelEstablishedTime(zx::clock::get_monotonic().get()); |
| } |
| |
| WeaveInspector::WeaveStatusNode::WeaveStatusEntry::WeaveStatusEntry( |
| inspect::Node& parent_node, const WeaveCurrentStatus& current_status) |
| : weave_status_entry_node_(parent_node.CreateChild(parent_node.UniqueName(""))) { |
| setup_state_property_ = weave_status_entry_node_.CreateString(kNode_WeaveStatus_SetupState, |
| current_status.setup_state_); |
| pairing_state_property_ = weave_status_entry_node_.CreateString(kNode_WeaveStatus_PairingState, |
| current_status.pairing_state_); |
| |
| failsafe_state_.state_node_ = |
| weave_status_entry_node_.CreateChild(kNode_WeaveStatus_FailsafeState); |
| failsafe_state_.state_property_ = |
| failsafe_state_.state_node_.CreateString(kNode_State, current_status.failsafe_state_); |
| failsafe_state_.reason_property_ = |
| failsafe_state_.state_node_.CreateString(kNode_Reason, current_status.failsafe_state_reason_); |
| |
| tunnel_state_.state_node_ = weave_status_entry_node_.CreateChild(kNode_WeaveStatus_TunnelState); |
| tunnel_state_.state_property_ = |
| tunnel_state_.state_node_.CreateString(kNode_State, current_status.tunnel_state_); |
| tunnel_state_.type_property_ = |
| tunnel_state_.state_node_.CreateString(kNode_Type, current_status.tunnel_type_); |
| tunnel_state_.is_restricted_property_ = tunnel_state_.state_node_.CreateBool( |
| kNode_WeaveStatus_TunnelState_IsRestricted, current_status.tunnel_restricted_); |
| |
| timestamp_property_ = |
| weave_status_entry_node_.CreateUint(kNode_Time, zx::clock::get_monotonic().get()); |
| } |
| |
| WeaveInspector::WeaveStatusNode::WeaveCurrentStatus::WeaveCurrentStatus() |
| : tunnel_restricted_(false), |
| tunnel_state_(WeaveInspector::kTunnelState_NoTunnel), |
| tunnel_type_(WeaveInspector::kTunnelType_None), |
| failsafe_state_(WeaveInspector::kFailSafeState_Disarmed), |
| failsafe_state_reason_(WeaveInspector::kFailSafeReason_Init), |
| pairing_state_(WeaveInspector::kPairingState_Initialized), |
| setup_state_(WeaveInspector::kSetupState_Initialized) {} |
| |
| WeaveInspector::WeaveStatusNode::WeaveStatusNode(inspect::Node& parent_node) |
| : node_(parent_node.CreateChild(kNode_WeaveStatus)), |
| weave_status_entries_(kMaxWeaveStatusEntries) {} |
| |
| void WeaveInspector::WeaveStatusNode::LogCurrentStatus() { |
| weave_status_entries_.AddEntry(node_, current_status_); |
| } |
| |
| void WeaveInspector::WeaveStatusNode::RecordPairingStateChange( |
| const WeaveInspector::WeaveStatus_PairingState& new_state) { |
| if (current_status_.pairing_state_ == new_state) { |
| return; |
| } |
| current_status_.pairing_state_ = new_state; |
| LogCurrentStatus(); |
| } |
| |
| void WeaveInspector::WeaveStatusNode::RecordFailSafeStateChange( |
| const WeaveInspector::WeaveStatus_FailSafeState& new_state, |
| const WeaveInspector::WeaveStatus_FailSafeReason& reason) { |
| if (current_status_.failsafe_state_ == new_state && |
| current_status_.failsafe_state_reason_ == reason) { |
| return; |
| } |
| current_status_.failsafe_state_ = new_state; |
| current_status_.failsafe_state_reason_ = reason; |
| LogCurrentStatus(); |
| } |
| void WeaveInspector::WeaveStatusNode::RecordSetupStateChange( |
| const WeaveInspector::WeaveStatus_SetupState& new_state) { |
| if (current_status_.setup_state_ == new_state) { |
| return; |
| } |
| current_status_.setup_state_ = new_state; |
| LogCurrentStatus(); |
| } |
| void WeaveInspector::WeaveStatusNode::RecordTunnelStateChange( |
| const WeaveInspector::WeaveStatus_TunnelState& new_state, |
| const WeaveInspector::WeaveStatus_TunnelType& tunnel_type, const bool is_restricted) { |
| if (current_status_.tunnel_state_ == new_state && current_status_.tunnel_type_ == tunnel_type && |
| current_status_.tunnel_restricted_ == is_restricted) { |
| return; |
| } |
| current_status_.tunnel_state_ = new_state; |
| current_status_.tunnel_type_ = tunnel_type; |
| current_status_.tunnel_restricted_ = is_restricted; |
| LogCurrentStatus(); |
| } |
| |
| WeaveInspector::TunnelStatusNode::TunnelStatusNode(inspect::Node& parent_node) |
| : node_(parent_node.CreateChild(kNode_TunnelStatus)) {} |
| |
| void WeaveInspector::TunnelStatusNode::RecordTunnelEstablishedTime(uint64_t time_value) { |
| tunnel_established_time_property_ = |
| node_.CreateUint(kNode_TunnelStatus_TimeTunnelEstablish, time_value); |
| } |
| void WeaveInspector::TunnelStatusNode::RecordTunnelDownTime(uint64_t time_value) { |
| tunnel_down_time_property_ = node_.CreateUint(kNode_TunnelStatus_TimeTunnelDown, time_value); |
| } |
| |
| } // namespace nl::Weave |