// Copyright 2020 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.test;

using fuchsia.lowpan;

protocol DeviceTest {
    /// Resets this network interface, returning
    /// all volatile state to default values. Any
    /// information stored in non-volatile memory
    /// is preserved. If the interface was attached
    /// to a network, this method will cause the
    /// interface to detach. In that case, once the
    /// interface has finished initialization the
    /// interface will attempt to reattach to the
    /// previous network.
    Reset() -> ();

    /// Returns the version string describing the firmware/stack
    /// version that is in use.
    GetNcpVersion() -> (string:256 version);

    /// Returns the current RSSI measured by the radio.
    GetCurrentRssi() -> (int32 rssi);

    /// Returns the factory-assigned static MAC address.
    GetFactoryMacAddress() -> (bytes:8 address);

    /// Returns the currently used MAC address, which can
    /// differ from the static factory-assigned MAC address.
    GetCurrentMacAddress() -> (bytes:8 address);

    /// Returns the current channel index for the radio.
    GetCurrentChannel() -> (fuchsia.lowpan.ChannelIndex channel_index);

    /// Returns the partition ID of the currently associated
    /// network partition.
    GetPartitionId() -> (uint32 pid);

    GetThreadRloc16() -> (uint16 rloc);

    GetThreadRouterId() -> (uint8 router_id);

    /// Updates the address filter settings.
    ///
    /// Responds once the filter settings have taken effect.
    ReplaceMacAddressFilterSettings(MacAddressFilterSettings settings) -> ();

    /// Returns the current address filter settings.
    GetMacAddressFilterSettings() -> (MacAddressFilterSettings settings);
};

/// LoWPAN MAC address
alias MacAddress = bytes:8;

/// An item in the MAC filter list.
table MacAddressFilterItem {
    /// The MAC address of the item. This field is required.
    1: MacAddress mac_address;

    /// Replacement RSSI value for packets received from this address.
    ///
    /// This field is ignored unless the mode is set to `MacAddressFilterMode::ALLOW`.
    ///
    /// This value is substituted for all received packets. This can affect
    /// what the mesh topology ultimately looks like.
    2: int8 rssi;
};

/// Maximum number of addresses that can be in the address filter list.
const uint16 MAX_FILTERED = 100;

table MacAddressFilterSettings {
    /// Address filter mode.
    ///
    /// This field is required. If this field is absent when passed to
    /// `ReplaceMacAddressFilterSettings`, the channel will be closed with
    /// the epitaph `ZX_ERR_INVALID_ARGUMENT`.
    1: MacAddressFilterMode mode;

    /// Addresses to be filtered.
    ///
    /// If this field is absent it is assumed to be empty.
    2: vector<MacAddressFilterItem>:MAX_FILTERED items;
};

/// Describes the address filtering mode of the interface.
enum MacAddressFilterMode : int32 {
    /// Address filtering is disabled. All packets that are
    /// received are processed normally.
    DISABLED = 0;

    /// Only packets that have addresses matching an address
    /// in the filter list will be allowed to be processed.
    /// All other packets are dropped as if they were never
    /// received.
    ///
    /// Additionally, if an RSSI value was associated
    /// with an item, that value will be substituted for internal
    /// routing considerations.
    ALLOW = 1;

    /// All packets from addresses in the filter list will be
    /// dropped.
    DENY = 2;
};
