|  | // Copyright 2021 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. | 
|  | library fuchsia.lowpan.device; | 
|  |  | 
|  | using fuchsia.lowpan; | 
|  |  | 
|  | /// Protocol for connecting to [`Counters`] on a LoWPAN | 
|  | /// interface. | 
|  | @discoverable | 
|  | closed protocol CountersConnector { | 
|  | /// Connects to the [`DeviceCounters`] protocol on the | 
|  | /// named LoWPAN interface. | 
|  | /// | 
|  | /// The name of the interface can be learned by calling | 
|  | /// [`fuchsia.lowpan/Lookup.GetDevices]. | 
|  | /// | 
|  | /// If there is an error in processing this request | 
|  | /// the given channel is closed and an epitaph code used | 
|  | /// to describe the reason for the failure: | 
|  | /// | 
|  | /// * `ZX_ERR_INVALID_ARGUMENT`: The given interface name | 
|  | ///   was not formatted correctly or otherwise invalid. | 
|  | /// * `ZX_ERR_NOT_FOUND`: No interface was found with the | 
|  | ///   given name. | 
|  | /// * `ZX_ERR_NOT_SUPPORTED`: The interface exists but | 
|  | ///   does not support this protocol. | 
|  | strict Connect(resource struct { | 
|  | name fuchsia.lowpan.InterfaceName; | 
|  | server_end server_end:Counters; | 
|  | }); | 
|  | }; | 
|  |  | 
|  | closed protocol Counters { | 
|  | /// Returns a snapshot of the counters without resetting the counters. | 
|  | strict Get() -> (struct { | 
|  | counters AllCounters; | 
|  | }); | 
|  |  | 
|  | /// Resets all of the counters to zero returning the counter values | 
|  | /// immediately prior. | 
|  | strict Reset() -> (struct { | 
|  | counters AllCounters; | 
|  | }); | 
|  | }; | 
|  |  | 
|  | /// Describes all counters. | 
|  | /// | 
|  | /// May be empty if no counters are supported. | 
|  | type AllCounters = table { | 
|  | /// MAC Counters for TX | 
|  | 1: mac_tx MacCounters; | 
|  |  | 
|  | /// MAC Counters for RX | 
|  | 2: mac_rx MacCounters; | 
|  |  | 
|  | /// Coex Counters for TX | 
|  | 3: coex_tx CoexCounters; | 
|  |  | 
|  | /// Coex Counters for RX | 
|  | 4: coex_rx CoexCounters; | 
|  |  | 
|  | /// Coex stats may be incorrect due to internal counter overflow. | 
|  | /// | 
|  | /// Reset the counters to clear this flag. | 
|  | 5: coex_saturated bool; | 
|  |  | 
|  | /// IP Counters for TX. | 
|  | @available(added=8) | 
|  | 6: ip_tx IpCounters; | 
|  |  | 
|  | /// IP Counters for RX. | 
|  | @available(added=8) | 
|  | 7: ip_rx IpCounters; | 
|  | }; | 
|  |  | 
|  | /// Counters associated with the MAC layer. | 
|  | /// | 
|  | /// Some counters are only valid for RX or TX. | 
|  | type MacCounters = table { | 
|  | /// The total number of frames | 
|  | 1: total uint32; | 
|  |  | 
|  | /// The total number of unicast frames | 
|  | 2: unicast uint32; | 
|  |  | 
|  | /// The total number of broadcast frames | 
|  | 3: broadcast uint32; | 
|  |  | 
|  | /// The number of frames with ack request | 
|  | 4: ack_requested uint32; | 
|  |  | 
|  | /// The number of frames that were acked | 
|  | 5: acked uint32; | 
|  |  | 
|  | /// The number of frames without ack request | 
|  | 6: no_ack_requested uint32; | 
|  |  | 
|  | /// The number of data frames | 
|  | 7: data uint32; | 
|  |  | 
|  | /// The number of data poll frames | 
|  | 8: data_poll uint32; | 
|  |  | 
|  | /// The number of beacon frames | 
|  | 9: beacon uint32; | 
|  |  | 
|  | /// The number of beacon request frames | 
|  | 10: beacon_request uint32; | 
|  |  | 
|  | /// The number of other types of frames | 
|  | 11: other uint32; | 
|  |  | 
|  | /// The number of frames filtered by address filter (allowlist | 
|  | /// or denylist). | 
|  | 12: address_filtered uint32; | 
|  |  | 
|  | /// The number of retransmission attempts. | 
|  | /// TX only. | 
|  | 13: retries uint32; | 
|  |  | 
|  | /// The number of expired retransmission retries for direct message. | 
|  | /// TX only. | 
|  | 14: direct_max_retry_expiry uint32; | 
|  |  | 
|  | /// The number of expired retransmission retries for indirect message | 
|  | /// TX only. | 
|  | 15: indirect_max_retry_expiry uint32; | 
|  |  | 
|  | /// The number of received frames filtered by destination check. | 
|  | /// RX only. | 
|  | 16: dest_addr_filtered uint32; | 
|  |  | 
|  | /// The number of received duplicated frames. | 
|  | /// RX only. | 
|  | 17: duplicated uint32; | 
|  |  | 
|  | /// The number of received frames with no or malformed content. | 
|  | /// RX only. | 
|  | 18: err_no_frame uint32; | 
|  |  | 
|  | /// The number of received frames from unknown neighbor. | 
|  | /// RX only. | 
|  | 19: err_unknown_neighbor uint32; | 
|  |  | 
|  | /// The number of received frames whose source address is invalid. | 
|  | /// RX only. | 
|  | 20: err_invalid_src_addr uint32; | 
|  |  | 
|  | /// The number of received frames with security error. | 
|  | /// RX only. | 
|  | 21: err_sec uint32; | 
|  |  | 
|  | /// The number of received frames with FCS error. | 
|  | /// RX only. | 
|  | 22: err_fcs uint32; | 
|  |  | 
|  | /// The number of CCA failures. | 
|  | /// TX only. | 
|  | 23: err_cca uint32; | 
|  |  | 
|  | /// The number of frame transmission failures due to abort error. | 
|  | /// TX only. | 
|  | 24: err_abort uint32; | 
|  |  | 
|  | /// The number of frames that were dropped due to a busy channel. | 
|  | /// TX only. | 
|  | 25: err_busy_channel uint32; | 
|  |  | 
|  | /// The number of frames that encountered some other error. | 
|  | 26: err_other uint32; | 
|  | }; | 
|  |  | 
|  | /// Counters associated with RF Coexistance. | 
|  | /// | 
|  | /// Some counters are only valid for RX or TX. See [this][1] for more info. | 
|  | /// | 
|  | /// [1]: https://github.com/openthread/wpantund/blob/4ae4619/third_party/openthread/src/ncp/spinel.h#L1738-L1775 | 
|  | type CoexCounters = table { | 
|  | /// The number of requests | 
|  | 1: requests uint64; | 
|  |  | 
|  | /// The number of requests while grant was active | 
|  | 2: grant_immediate uint64; | 
|  |  | 
|  | /// The number of requests while grant was inactive | 
|  | 3: grant_wait uint64; | 
|  |  | 
|  | /// The number of requests while grant was inactive that were | 
|  | /// ultimately granted | 
|  | 4: grant_wait_activated uint64; | 
|  |  | 
|  | /// The number of requests while grant was inactive that timed out | 
|  | 5: grant_wait_timeout uint64; | 
|  |  | 
|  | /// The number of requests that were in progress when grant was | 
|  | /// deactivated | 
|  | 6: grant_deactivated_during_request uint64; | 
|  |  | 
|  | /// The number of requests that were not granted within 50µs | 
|  | 7: delayed_grant uint64; | 
|  |  | 
|  | /// The average time in µsec from request to grant | 
|  | 8: avg_delay_request_to_grant_usec uint32; | 
|  |  | 
|  | /// The number of requests that completed without receiving grant. | 
|  | /// | 
|  | /// Receive only. | 
|  | 9: grant_none uint64; | 
|  | }; | 
|  |  | 
|  | /// Counters associated with the IP layer. | 
|  | @available(added=8) | 
|  | type IpCounters = table { | 
|  | /// The number of IPv6 packets successfully transmitted/received. | 
|  | 1: success uint32; | 
|  |  | 
|  | /// The number of IPv6 packets failed to transmit/receive. | 
|  | 2: failure uint32; | 
|  | }; |