// Copyright 2019 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.hardware.network.mac;

/// The length of an IEEE 802 MAC Address, in bytes.
const MAC_SIZE uint64 = 6;
/// The maximum number of multicast MAC addresses set to filter.
// NOTE(brunodalbo) this number derived from common defaults for maximum
// multicast membership allowances in established OSes (20-40) rounded up for
// some leeway. It should be noted that typical hardware implementations don't
// keep perfect filtering lists, but rather use a special hash function to
// perform the filtering, where collisions are tolerated since the filtering is
// just a performance feature.
const MAX_MAC_FILTER uint64 = 64;

/// Device MAC filtering modes supported.
type Mode = strict enum : uint32 {
    /// Device accepts only unicast frames addressed to its own unicast address,
    /// or multicast frames that are part of the multicast address filter list.
    MULTICAST_FILTER = 1;
    /// Device accepts unicast frames addressed to its own unicast address, or
    /// any multicast frames.
    MULTICAST_PROMISCUOUS = 2;
    /// Device accepts all frames.
    PROMISCUOUS = 4;
};

/// Device features reported by [`MacAddr.GetFeatures`].
type Features = struct {
    /// The maximum number of multicast filtering entries available on this
    /// device.
    ///
    /// Implementations must set 0 if multicast filtering is not supported.
    /// Values will always be saturated to [`MAX_MAC_FILTER`].
    multicast_filter_count uint32;
    /// The filtering operating modes supported by this device.
    ///
    /// Bitfield of possible [`Mode`] values that can be passed to
    /// [`MacAddr.SetMode`].
    supported_modes uint32;
};

@transport("Banjo")
@banjo_layout("ddk-interface")
protocol MacAddr {
    /// Gets this device's MAC address.
    // TODO(https://fxbug.dev/44065) we need an address changed event (in
    // lockstep with FIDL definition).
    // TODO(brunodalbo) use fuchsia.net.MacAddress here and in SetMode when we
    // can use FIDL types in Banjo.
    GetAddress() -> (struct {
        mac array<uint8, MAC_SIZE>;
    });
    /// Gets this device's features.
    GetFeatures() -> (struct {
        features Features;
    });
    /// Sets this device's operating mode.
    ///
    /// `mode` is one of the variants in [`Mode`], it's guaranteed to be one of
    /// the reported modes in this device's reported features. `multicast_macs`
    /// is only provided (though it can still be empty) when `mode` is
    /// `MULTICAST_FILTER`. `multicast_macs` is always guaranteed to be at most
    /// `multicast_filter_count` entries.
    SetMode(struct {
        mode Mode;
        multicast_macs vector<array<uint8, MAC_SIZE>>:MAX_MAC_FILTER;
    }) -> ();
};
