syntax = "proto3";

import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";
import "../../weave/common.proto";

package nest.trait.network;

message TelemetryNetworkWpanTrait {
    enum NodeType {
        NODE_TYPE_UNSPECIFIED = 0;
        NODE_TYPE_ROUTER = 1;
        NODE_TYPE_END = 2;
        NODE_TYPE_SLEEPY_END = 3;
        NODE_TYPE_MINIMAL_END = 4;
        NODE_TYPE_OFFLINE = 5;
        NODE_TYPE_DISABLED = 6;
        NODE_TYPE_DETACHED = 7;
        NODE_TYPE_NL_LURKER = 16;
        NODE_TYPE_COMMISSIONER = 32;
        NODE_TYPE_LEADER = 64;
    }

    enum ThreadType {
        THREAD_TYPE_UNSPECIFIED = 0;
        THREAD_TYPE_SILABS = 1;
        THREAD_TYPE_OPENTHREAD = 2;
    }

    enum SrpServerState {
        SRP_SERVER_STATE_UNSPECIFIED = 0;
        SRP_SERVER_STATE_DISABLED = 1;
        SRP_SERVER_STATE_RUNNING = 2;
        SRP_SERVER_STATE_STOPPED = 3;
    }

    enum SrpServerAddressMode {
        SRP_SERVER_ADDRESS_MODE_UNSPECIFIED = 0;
        SRP_SERVER_ADDRESS_MODE_UNICAST = 1;
        SRP_SERVER_ADDRESS_MODE_STATE_ANYCAST = 2;
    }

    enum Nat64State {
        NAT64_STATE_UNSPECIFIED = 0;
        NAT64_STATE_DISABLED = 1;
        NAT64_STATE_NOT_RUNNING = 2;
        NAT64_STATE_IDLE = 3;
        NAT64_STATE_ACTIVE = 4;
    }

    message ChannelUtilization {
        uint32 channel = 1;
        float percentBusy = 2;
    }

    message PerAntennaStats {
        uint32 txSuccessCnt = 1;
        uint32 txFailCnt = 2;
        int32 avgAckRssi = 3;
    }

    message WpanParentLinkEvent {
        int32 rssi = 1;
        uint32 unicastCcaThresholdFailures = 2;
        uint32 unicastMacRetryCount = 3;
    }

    message NetworkWpanStatsEvent {
        int32 phyRx = 1;
        int32 phyTx = 2;
        int32 macUnicastRx = 3;
        int32 macUnicastTx = 4;
        int32 macBroadcastRx = 5;
        int32 macBroadcastTx = 6;
        int32 macTxFailCca = 8;
        int32 macRxFailDecrypt = 12;
        NodeType nodeType = 15;
        uint32 channel = 16;
        int32 radioTxPower = 17;
        ThreadType threadType = 18;
        int32 macRxFailNoFrame = 20;
        int32 macRxFailUnknownNeighbor = 21;
        int32 macRxFailInvalidSrcAddr = 22;
        int32 macRxFailFcs = 23;
        int32 macTxAckReq = 24;
        int32 macTxNoAckReq = 25;
        int32 macTxAcked = 26;
        int32 macTxData = 27;
        int32 macTxDataPoll = 28;
        int32 macTxBeacon = 29;
        int32 macTxBeaconReq = 30;
        int32 macTxOtherPkt = 31;
        int32 macTxRetry = 32;
        int32 macRxData = 33;
        int32 macRxDataPoll = 34;
        int32 macRxBeacon = 35;
        int32 macRxBeaconReq = 36;
        int32 macRxOtherPkt = 37;
        int32 macRxFilterWhitelist = 38;
        int32 macRxFilterDestAddr = 39;
        int32 macRxFailOther = 40;
        int32 ipTxSuccess = 41;
        int32 ipRxSuccess = 42;
        int32 ipTxFailure = 43;
        int32 ipRxFailure = 44;
        google.protobuf.Duration ncpTxTotalTime = 45;
        google.protobuf.Duration ncpRxTotalTime = 46;
        float macCcaFailRate = 47;
    }

    message TopoEntry {
        bytes extAddress = 1;
        uint32 rloc16 = 2;
        uint32 linkQualityIn = 3;
        int32 averageRssi = 4;
        google.protobuf.Duration age = 5;
        bool rxOnWhenIdle = 6;
        bool fullFunction = 7;
        bool secureDataRequest = 8;
        bool fullNetworkData = 9;
        int32 lastRssi = 10;
    }

    message ChildTableEntry {
        TopoEntry topo = 1;
        google.protobuf.Duration timeout = 2;
        uint32 networkDataVersion = 3;
    }

    message NeighborTableEntry {
        TopoEntry topo = 1;
        uint32 linkFrameCounter = 2;
        uint32 mleFrameCounter = 3;
        bool isChild = 4;
    }

    message NetworkWpanTopoMinimalEvent {
        uint32 rloc16 = 1;
        uint32 routerId = 2;
        uint32 leaderRouterId = 3;
        int32 parentAverageRssi = 4;
        int32 parentLastRssi = 5;
        uint32 partitionId = 6;
        bytes extAddress = 7;
        int32 instantRssi = 8;
        uint64 extendedPanId = 9;
    }

    message NetworkWpanTopoFullEvent {
        uint32 rloc16 = 1;
        uint32 routerId = 2;
        uint32 leaderRouterId = 3;
        bytes leaderAddress = 4;
        uint32 leaderWeight = 5;
        uint32 leaderLocalWeight = 6;
        repeated ChildTableEntry deprecatedChildTable = 7;
        repeated NeighborTableEntry deprecatedNeighborTable = 8;
        bytes networkData = 9;
        uint32 networkDataVersion = 10;
        bytes stableNetworkData = 11;
        uint32 stableNetworkDataVersion = 12;
        uint32 preferredRouterId = 13;
        uint32 partitionId = 14;
        bytes extAddress = 15;
        uint32 childTableSize = 16;
        uint32 neighborTableSize = 17;
        int32 instantRssi = 18;
        uint64 extendedPanId = 19;
    }

    message TopoEntryEvent {
        bytes extAddress = 1;
        uint32 rloc16 = 2;
        uint32 linkQualityIn = 3;
        int32 averageRssi = 4;
        google.protobuf.Duration age = 5;
        bool rxOnWhenIdle = 6;
        bool fullFunction = 7;
        bool secureDataRequest = 8;
        bool fullNetworkData = 9;
        int32 lastRssi = 10;
        uint32 linkFrameCounter = 11;
        uint32 mleFrameCounter = 12;
        bool isChild = 13;
        google.protobuf.Duration timeout = 14;
        google.protobuf.UInt32Value networkDataVersion = 15;
        float macFrameErrorRate = 16;
        float ipMessageErrorRate = 17;
        int32 version = 18;
    }

    message WpanChannelmonStatsEvent {
        repeated ChannelUtilization channels = 1;
        uint32 samples = 2;
    }

    message WpanAntennaStatsEvent {
        repeated PerAntennaStats antennaStats = 1;
        uint32 antSwitchCnt = 2;
    }

    message NetworkWpanTopoParentRespEvent {
        uint32 rloc16 = 1;
        int32 rssi = 2;
        int32 priority = 3;
        bytes extAddr = 4;
        uint32 linkQuality3 = 5;
        uint32 linkQuality2 = 6;
        uint32 linkQuality1 = 7;
    }

    message Nat64TrafficCounters {
        int64 ipv4ToIpv6Packets = 1;
        int64 ipv4ToIpv6Bytes = 2;
        int64 ipv6ToIpv4Packets = 3;
        int64 ipv6ToIpv4Bytes = 4;
    }

    message Nat64ProtocolCounters {
        Nat64TrafficCounters tcp = 1;
        Nat64TrafficCounters udp = 2;
        Nat64TrafficCounters icmp = 3;
    }

    message Nat64PacketCounters {
        int64 ipv4ToIpv6Packets = 1;
        int64 ipv6ToIpv4Packets = 2;
    }

    message Nat64ErrorCounters {
        Nat64PacketCounters unknown = 1;
        Nat64PacketCounters illegalPacket = 2;
        Nat64PacketCounters unsupportedProtocol = 3;
        Nat64PacketCounters noMapping = 4;
    }

    message BorderRoutingCounters {
        uint32 raRxCount = 1;
        uint32 raTxCount = 2;
        uint32 rsRxCount = 3;
        uint32 rsTxCount = 4;
        uint32 inboundIpPackets = 5;
        uint32 inboundIpBytes = 6;
        uint32 outboundIpPackets = 7;
        uint32 outboundIpBytes = 8;
        uint32 raTxSuccessCount = 9;
        uint32 raTxFailureCount = 10;
        uint32 rsTxSuccessCount = 11;
        uint32 rsTxFailureCount = 12;
        uint64 inboundUnicastPackets = 13;
        uint64 inboundUnicastBytes = 14;
        uint64 inboundMulticastPackets = 15;
        uint64 inboundMulticastBytes = 16;
        uint64 outboundUnicastPackets = 17;
        uint64 outboundUnicastBytes = 18;
        uint64 outboundMulticastPackets = 19;
        uint64 outboundMulticastBytes = 20;
        Nat64ProtocolCounters nat64ProtocolCounters = 21;
        Nat64ErrorCounters nat64ErrorCounters = 22;
    }

    message SrpServerRegistrationInfo {
        uint32 freshCount = 1;
        uint32 deletedCount = 2;
        uint64 leaseTimeTotal = 3;
        uint64 keyLeaseTimeTotal = 4;
        uint64 remainingLeaseTimeTotal = 5;
        uint64 remainingKeyLeaseTimeTotal = 6;
    }

    message SrpServerResponseCounters {
        uint32 successCount = 1;
        uint32 serverFailureCount = 2;
        uint32 formatErrorCount = 3;
        uint32 nameExistsCount = 4;
        uint32 refusedCount = 5;
        uint32 otherCount = 6;
    }

    message SrpServerInfo {
        SrpServerState state = 1;
        uint32 port = 2;
        SrpServerAddressMode addressMode = 3;
        SrpServerRegistrationInfo hosts = 4;
        SrpServerRegistrationInfo services = 5;
        SrpServerResponseCounters responseCounters = 6;
    }

    message DnsServerResponseCounters {
        uint32 successCount = 1;
        uint32 serverFailureCount = 2;
        uint32 formatErrorCount = 3;
        uint32 nameErrorCount = 4;
        uint32 notImplementedCount = 5;
        uint32 otherCount = 6;
    }

    message DnsServerInfo {
        DnsServerResponseCounters responseCounters = 1;
        uint32 resolvedByLocalSrpCount = 2;
    }

    message MdnsResponseCounters {
        uint32 successCount = 1;
        uint32 notFoundCount = 2;
        uint32 invalidArgsCount = 3;
        uint32 duplicatedCount = 4;
        uint32 notImplementedCount = 5;
        uint32 unknownErrorCount = 6;
        uint32 abortedCount = 7;
        uint32 invalidStateCount = 8;
    }

    message MdnsInfo {
        MdnsResponseCounters hostRegistrationResponses = 1;
        MdnsResponseCounters serviceRegistrationResponses = 2;
        MdnsResponseCounters hostResolutionResponses = 3;
        MdnsResponseCounters serviceResolutionResponses = 4;
        uint32 hostRegistrationEmaLatency = 5;
        uint32 serviceRegistrationEmaLatency = 6;
        uint32 hostResolutionEmaLatency = 7;
        uint32 serviceResolutionEmaLatency = 8;
    }

    message FeatureFlagMetrics {
        int64 countSyncSuccess = 1;
        int64 countSyncFailPushToApply = 2;
        int64 countSyncFailRetrieveFromDcs = 3;
    }

    message BorderRoutingNat64State {
        Nat64State prefixManagerState = 1;
        Nat64State translatorState = 2;
    }

    message Nat64Mapping {
        uint64 mappingId = 1;
        bytes hashedIpv6Address = 2;
        Nat64ProtocolCounters counters = 3;
    }

    message NetworkWpanBorderRouterEvent {
        BorderRoutingCounters borderRoutingCounters = 1;
        SrpServerInfo srpServer = 2;
        DnsServerInfo dnsServer = 3;
        MdnsInfo mdns = 4;
        FeatureFlagMetrics featureFlagMetrics = 5;
        BorderRoutingNat64State nat64State = 6;
        repeated Nat64Mapping nat64Mappings = 7;
        repeated int32 experimentId = 8;
    }

    message DeviceInfoEvent {
        string releaseChannel = 1;
        string softwareVersion = 2;
        string hardwareVersion = 3;
        string otHostVersion = 4;
        string otRcpVersion = 5;
        int32 threadVersion = 6;
        string threadDaemonVersion = 7;
        string regionCode = 8;
        string regionCodeFactory = 9;
    }

    message RcpStabilityStatistics {
        uint32 rcpTimeoutCount = 1;
        uint32 rcpResetCount = 2;
        uint32 rcpRestorationCount = 3;
        uint32 spinelParseErrorCount = 4;
        int32 rcpFirmwareUpdateCount = 5;
        uint32 threadStackUptime = 6;
    }

    message RcpInterfaceStatistics {
        uint32 rcpInterfaceType = 1;
        uint64 transferredFramesCount = 2;
        uint64 transferredValidFramesCount = 3;
        uint64 transferredGarbageFramesCount = 4;
        uint64 rxFramesCount = 5;
        uint64 rxBytesCount = 6;
        uint64 txFramesCount = 7;
        uint64 txBytesCount = 8;
    }

    message NetworkWpanRcpEvent {
        RcpStabilityStatistics rcpStabilityStatistics = 1;
        RcpInterfaceStatistics rcpInterfaceStatistics = 2;
    }

    message ThreadCoexMetricsEvent {
        int64 countTxRequest = 1;
        int64 countTxGrantImmediate = 2;
        int64 countTxGrantWait = 3;
        int64 countTxGrantWaitActivated = 4;
        int64 countTxGrantWaitTimeout = 5;
        int64 countTxGrantDeactivatedDuringRequest = 6;
        int64 txAverageRequestToGrantTime = 7;
        int64 countRxRequest = 8;
        int64 countRxGrantImmediate = 9;
        int64 countRxGrantWait = 10;
        int64 countRxGrantWaitActivated = 11;
        int64 countRxGrantWaitTimeout = 12;
        int64 countRxGrantDeactivatedDuringRequest = 13;
        int64 countRxGrantNone = 14;
        int64 rxAverageRequestToGrantTime = 15;
    }

    message ThreadDataEvent {
        int32 eventType = 1;
        bytes data = 2;
    }
}

message TelemetryNetworkWifiTrait {
    enum NetworkCondition {
        NETWORK_CONDITION_UNSPECIFIED = 0;
        NETWORK_CONDITION_NO_NETWORK = 1;
        NETWORK_CONDITION_WEAK = 2;
        NETWORK_CONDITION_NORMAL = 3;
        NETWORK_CONDITION_GOOD = 4;
    }

    enum NetworkConditionRequestResponseStatus {
        NETWORK_CONDITION_REQUEST_RESPONSE_STATUS_UNSPECIFIED = 0;
        NETWORK_CONDITION_REQUEST_RESPONSE_STATUS_SUCCESS = 1;
        NETWORK_CONDITION_REQUEST_RESPONSE_STATUS_FAIL = 2;
    }

    message NetworkWiFiStatsEvent {
        int32 rssi = 1;
        uint32 bcnRecvd = 2;
        uint32 bcnLost = 3;
        uint32 pktMcastRx = 4;
        uint32 pktUcastRx = 5;
        uint32 currRxRate = 6;
        uint32 currTxRate = 7;
        uint32 sleepTimePercent = 8;
        uint32 bssid = 9;
        uint32 freq = 10;
        uint32 numOfAp = 11;
    }

    message NetworkWiFiDeauthEvent {
        uint32 reason = 1;
    }

    message NetworkWiFiInvalidKeyEvent {
        uint32 reason = 1;
    }

    message NetworkWiFiConnectionStatusChangeEvent {
        bool isConnected = 1;
        google.protobuf.StringValue lnid = 2;
        google.protobuf.StringValue lnidW = 3;
    }

    message NetworkWiFiApConnectEvent {
        uint64 time = 1;
        uint32 brand = 2;
        uint32 vendor = 3;
        bool isHostOff = 4;
        uint32 channel = 5;
        uint32 bssid = 6;
        uint32 bi = 7;
        uint32 dtim = 8;
        google.protobuf.StringValue bssidHash = 9;
    }

    message RssiBucket {
        uint32 index = 1;
        uint32 count = 2;
    }

    message NetworkWiFiApDisconnectEvent {
        uint64 time = 1;
        uint32 reason = 2;
        uint32 duration = 3;
        bool isHostOff = 4;
        uint32 channel = 5;
        uint32 bssid = 6;
        uint32 bi = 7;
        uint32 dtim = 8;
        int32 rssiMin = 9;
        int32 rssiMax = 10;
        uint32 forceAwakeCnt = 11;
        uint32 bcnRcvPercent = 12;
        google.protobuf.StringValue bssidHash = 13;
        repeated RssiBucket rssiCounts = 14;
    }

    message NetworkWiFiSdioStatsEvent {
        uint32 attachSdioFailCnt = 1;
        uint32 firmwareHangCnt = 2;
        uint32 busHangCnt = 3;
        uint32 fwReloadPhyReinitCnt = 4;
        uint32 fwReloadConnStuckCnt = 5;
        uint32 fwReloadDhcpStuckCnt = 6;
        uint32 emptyScanResultsCnt = 7;
    }

    message DhcpInfoEvent {
        uint32 dhcpLeaseTime = 1;
    }

    message NetworkCheckInfoEvent {
        google.protobuf.Timestamp checkTime = 1;
        uint32 brand = 2;
        uint32 status = 3;
        uint32 triggerSource = 4;
    }

    message NetworkCheckWifiCommonHalEvent {
        uint32 result = 1;
    }

    message NetworkConditionRequest {
    }

    message NetworkConditionRequestResponse {
        NetworkConditionRequestResponseStatus status = 1;
        NetworkCondition networkCondition = 2;
    }
}

message RadioSignalStrengthTrait {
    enum RadioType {
        RADIO_TYPE_UNSPECIFIED = 0;
        RADIO_TYPE_BLUETOOTH_LE = 1;
    }

    enum SignalStrength {
        SIGNAL_STRENGTH_UNSPECIFIED = 0;
        SIGNAL_STRENGTH_NO_SIGNAL = 1;
        SIGNAL_STRENGTH_WEAK = 2;
        SIGNAL_STRENGTH_STRONG = 3;
    }

    enum StatusCode {
        STATUS_CODE_UNSPECIFIED = 0;
        STATUS_CODE_DEVICE_INVALID = 1;
        STATUS_CODE_RADIO_INVALID = 2;
        STATUS_CODE_RADIO_ERROR = 3;
    }

    message SignalStrengthTestRequest {
        weave.common.ResourceId deviceId = 1;
        RadioType radioType = 2;
        google.protobuf.Duration testDuration = 3;
    }

    message SignalStrengthTestResponse {
        SignalStrength signalStrength = 1;
    }
}

message ThreadInterfaceTrait {
    bool isOnline = 1;
    bytes macAddress = 2;
    repeated bytes ipAddresses = 3;
    bytes extendedPanId = 32;
    ThreadNetworkParameters networkParameters = 33;

    enum ThreadRoutingRole {
        THREAD_ROUTING_ROLE_UNSPECIFIED = 0;
        THREAD_ROUTING_ROLE_END_DEVICE = 1;
        THREAD_ROUTING_ROLE_ELIGIBLE = 2;
        THREAD_ROUTING_ROLE_REGULAR = 3;
        THREAD_ROUTING_ROLE_LEADER = 4;
    }

    message ThreadChannelDescriptor {
        ThreadInterfaceCapabilityTrait.ThreadChannelPage page = 1;
        uint32 index = 2;
        weave.common.StringRef description = 3;
    }

    message ThreadInterfaceRole {
        ThreadRoutingRole routingRole = 1;
        bool isSleepy = 2;
    }

    message ThreadNetworkParameters {
        ThreadInterfaceRole role = 1;
        ThreadChannelDescriptor channel = 2;
        bytes panId = 3;
        bytes networkName = 4;
    }
}

message WifiInterfaceTrait {
    bool isOnline = 1;
    bytes macAddress = 2;
    repeated bytes ipAddresses = 3;
    int32 rssi = 32;
    string regulatoryDomain = 33;
    string ssid = 34;

    enum ConnectionStrength {
        CONNECTION_STRENGTH_UNSPECIFIED = 0;
        CONNECTION_STRENGTH_NO_SIGNAL = 1;
        CONNECTION_STRENGTH_BAD = 2;
        CONNECTION_STRENGTH_FAIR = 3;
        CONNECTION_STRENGTH_GOOD = 4;
        CONNECTION_STRENGTH_EXCELLENT = 5;
    }

    enum RequestStatusCode {
        REQUEST_STATUS_CODE_UNSPECIFIED = 0;
        REQUEST_STATUS_CODE_SUCCESS = 1;
        REQUEST_STATUS_CODE_FAILED = 2;
    }

    message GetWiFiConnectionStrengthRequest {
    }

    message GetWiFiConnectionStrengthResponse {
        ConnectionStrength connStrength = 1;
    }
}

message NetworkFaultTrait {
    bool asserted = 1;
    repeated NetworkFaultType type = 32;

    enum NetworkFaultType {
        NETWORK_FAULT_TYPE_UNSPECIFIED = 0;
        NETWORK_FAULT_TYPE_LINK_DOWN = 1;
        NETWORK_FAULT_TYPE_HW_FAILURE = 2;
        NETWORK_FAULT_TYPE_JAMMED = 3;
    }

    message NetworkFaultEvent {
        bool asserted = 1;
        repeated NetworkFaultType type = 32;
    }
}

message RadioFaultTrait {
    enum RadioFaultType {
        RADIO_FAULT_TYPE_UNSPECIFIED = 0;
        RADIO_FAULT_TYPE_BROKEN_WIFI = 1;
        RADIO_FAULT_TYPE_BROKEN_CELLULAR = 2;
        RADIO_FAULT_TYPE_BROKEN_15_4 = 3;
        RADIO_FAULT_TYPE_BROKEN_NFC = 4;
        RADIO_FAULT_TYPE_BROKEN_BLE = 5;
    }

    message RadioFaultEvent {
        bool asserted = 1;
        repeated RadioFaultType type = 32;
    }
}

message ThreadInterfaceCapabilityTrait {
    TelemetryNetworkWpanTrait.ThreadType type = 1;
    weave.common.StringRef description = 2;
    bool canSleep = 32;
    bool canRoute = 33;
    repeated ThreadChannelPage channelPages = 34;

    enum ThreadChannelPage {
        THREAD_CHANNEL_PAGE_UNSPECIFIED = 0;
        THREAD_CHANNEL_PAGE_IEEE802_15_4_ISM2_4 = 1;
    }
}

message TelemetryNetworkTrait {
    message NetworkDHCPFailureEvent {
        uint32 reason = 1;
    }
}

message WifiNetworkFaultTrait {
    bool asserted = 1;
    repeated NetworkFaultTrait.NetworkFaultType type = 32;

    message WifiNetworkFaultEvent {
        bool asserted = 1;
        repeated NetworkFaultTrait.NetworkFaultType type = 32;
    }
}