| // 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 uint64 MAC_SIZE = 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 uint64 MAX_MAC_FILTER = 64; |
| |
| /// Device MAC filtering modes supported. |
| enum Mode : 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 [`fuchsia.hardware.network.mac/MacAddrImpl.GetFeatures`] |
| struct Features { |
| /// 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 |
| /// [`fuchsia.hardware.network.mac/MAX_MAC_FILTER`]. |
| uint32 multicast_filter_count; |
| /// The filtering operating modes supported by this device. Bitfield of possible |
| /// [`fuchsia.hardware.network.mac/Mode`] values that can be passed to |
| /// [`fuchsia.hardware.network.mac/MacAddrImpl.SetMode`]. |
| uint32 supported_modes; |
| }; |
| |
| [Transport = "Banjo", BanjoLayout = "ddk-protocol"] |
| protocol MacAddrImpl { |
| /// Gets this device's MAC address. |
| // TODO(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() -> (array<uint8>:MAC_SIZE mac); |
| /// Gets this device's features. |
| GetFeatures() -> (Features features); |
| /// Sets this device's operating mode. |
| /// `mode` is one of the variants in [`fuchsia.hardware.network.mac/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(Mode mode, vector<array<uint8>:MAC_SIZE>:MAX_MAC_FILTER multicast_macs) -> (); |
| }; |