| // 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.hardware.network; |
| |
| using zx; |
| using fuchsia.net; |
| |
| /// The address filtering mode supported by MAC devices. |
| // LINT.IfChange |
| @available(added=HEAD) |
| type MacFilterMode = strict enum { |
| /// 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 = 0; |
| /// Device accepts unicast frames addressed to its own unicast address, or |
| /// any multicast frames. |
| MULTICAST_PROMISCUOUS = 1; |
| /// Device accepts all frames. |
| PROMISCUOUS = 2; |
| }; |
| // LINT.ThenChange(/sdk/fidl/fuchsia.hardware.network.driver/network-mac.fidl) |
| @available(added=HEAD) |
| closed protocol MacAddressing { |
| /// Gets the Device's current unicast MAC address. |
| /// |
| /// Implementers of this API do not need to return a uniquely identifiable |
| /// MAC; the unicast address returned is the one that is *currently* in use |
| /// to filter unicast frames, or that identifies the device on a link it's |
| /// *currently* on. Users of this API must not rely on the stability or |
| /// uniqueness of the returned value to identify or disambiguate device |
| /// instances. |
| /// |
| /// - response `address` device's unicast MAC address. |
| strict GetUnicastAddress() -> (struct { |
| address fuchsia.net.MacAddress; |
| }); |
| |
| // TODO(https://fxbug.dev/42120438) enable an API like the one below to be |
| // notified of changes to the Unicast MAC once plumbed through the banjo |
| // protocol as well. WatchUnicastAddress() -> (Mac address); |
| |
| /// Sets requested operating mode of this device to `mode`. |
| /// |
| /// The requested mode is attached to the current client connection to the |
| /// device. Because multiple clients can be attached to the same device at |
| /// once, the mode with the least restrictions is the one actively put into |
| /// effect into the underlying device implementation. |
| /// |
| /// If the device does not support the requested mode, but supports a mode |
| /// that is more open than the requested one, `SetMode` succeeds regardless. |
| /// Otherwise, if the device only supports *more restrictive* modes than the |
| /// one requested, `SetMode` returns `ZX_ERR_NOT_SUPPORTED`. |
| /// |
| /// Clients must be aware that the resource being accessed is shared, and |
| /// that the device may be effectively operating at a more open level than |
| /// the one that was requested (although never at one more restrictive). |
| /// |
| /// + request `mode` request mode to attach to. |
| /// - response `status` `ZX_ERR_NOT_SUPPORTED` it the device only supports |
| /// mode more restrictive than the one requested. |
| strict SetMode(struct { |
| mode MacFilterMode; |
| }) -> (struct { |
| status zx.Status; |
| }); |
| |
| /// Adds multicast address to the list of multicast groups. |
| /// |
| /// The list of multicast addresses kept is untouched by calls to `SetMode`. |
| /// If the device's mode is not `MULTICAST_FILTER`, the list of multicast |
| /// addresses is ignored. |
| /// |
| /// + request `address` multicast address to add to the list. |
| /// - response `status` `ZX_ERR_INVALID_ARGS` if `address` is not a |
| /// multicast address. |
| strict AddMulticastAddress(struct { |
| address fuchsia.net.MacAddress; |
| }) -> (struct { |
| status zx.Status; |
| }); |
| /// Removes multicast address from the list of multicast groups. |
| /// |
| /// + request `address` multicast address to remove from the list. |
| /// - response `status` `ZX_ERR_INVALID_ARGS` if `address` is not a |
| /// multicast address. |
| strict RemoveMulticastAddress(struct { |
| address fuchsia.net.MacAddress; |
| }) -> (struct { |
| status zx.Status; |
| }); |
| }; |