// 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;

protocol Counters {
    /// Returns a snapshot of the counters without resetting the counters.
    Get() -> (AllCounters counters);

    /// Resets all of the counters to zero returning the counter values
    /// immediately prior.
    Reset() -> (AllCounters counters);
};

/// Table describing all counters.
///
/// May be empty if no counters are supported.
table AllCounters {
    /// MAC Counters for TX
    1: MacCounters mac_tx;

    /// MAC Counters for RX
    2: MacCounters mac_rx;
};

/// Counters associated with the MAC layer.
///
/// Some counters are only valid for RX or TX.
table MacCounters {
    /// The total number of frames
    1: uint32 total;

    /// The total number of unicast frames
    2: uint32 unicast;

    /// The total number of broadcast frames
    3: uint32 broadcast;

    /// The number of frames with ack request
    4: uint32 ack_requested;

    /// The number of frames that were acked
    5: uint32 acked;

    /// The number of frames without ack request
    6: uint32 no_ack_requested;

    /// The number of data frames
    7: uint32 data;

    /// The number of data poll frames
    8: uint32 data_poll;

    /// The number of beacon frames
    9: uint32 beacon;

    /// The number of beacon request frames
    10: uint32 beacon_request;

    /// The number of other types of frames
    11: uint32 other;

    /// The number of frames filtered by address filter (allowlist
    /// or denylist).
    12: uint32 address_filtered;

    /// The number of retransmission attempts.
    /// TX only.
    13: uint32 retries;

    /// The number of expired retransmission retries for direct message.
    /// TX only.
    14: uint32 direct_max_retry_expiry;

    /// The number of expired retransmission retries for indirect message
    /// TX only.
    15: uint32 indirect_max_retry_expiry;

    /// The number of received frames filtered by destination check.
    /// RX only.
    16: uint32 dest_addr_filtered;

    /// The number of received duplicated frames.
    /// RX only.
    17: uint32 duplicated;

    /// The number of received frames with no or malformed content.
    /// RX only.
    18: uint32 err_no_frame;

    /// The number of received frames from unknown neighbor.
    /// RX only.
    19: uint32 err_unknown_neighbor;

    /// The number of received frames whose source address is invalid.
    /// RX only.
    20: uint32 err_invalid_src_addr;

    /// The number of received frames with security error.
    /// RX only.
    21: uint32 err_sec;

    /// The number of received frames with FCS error.
    /// RX only.
    22: uint32 err_fcs;

    /// The number of CCA failures.
    /// TX only.
    23: uint32 err_cca;

    /// The number of frame transmission failures due to abort error.
    /// TX only.
    24: uint32 err_abort;

    /// The number of frames that were dropped due to a busy channel.
    /// TX only.
    25: uint32 err_busy_channel;

    /// The number of frames that encountered some other error.
    26: uint32 err_other;
};
