blob: 3c07472e090bf6fcfb3ccad1b9a850d43267b321 [file] [log] [blame]
// 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.wlan.tap;
using fuchsia.wlan.common;
using fuchsia.wlan.device;
using fuchsia.wlan.ieee80211 as ieee80211;
using zx;
/// Describes the capabilities of the fake wlantap-phy device to be created.
type WlantapPhyConfig = struct {
// TODO(https://fxbug.dev/42143255): wlantap will configure all of its ifaces to use the same MAC address
sta_addr ieee80211.MacAddr;
mac_role fuchsia.wlan.common.WlanMacRole;
supported_phys
vector<fuchsia.wlan.common.WlanPhyType>:fuchsia.wlan.common.MAX_SUPPORTED_PHY_TYPES;
hardware_capability fuchsia.wlan.common.WlanSoftmacHardwareCapability;
bands vector<fuchsia.wlan.device.BandInfo>:8;
name string:32; // Arbitrary maximum size of 32 chosen to satisfy FidlLint
quiet bool;
discovery_support fuchsia.wlan.common.DiscoverySupport;
mac_sublayer_support fuchsia.wlan.common.MacSublayerSupport;
security_support fuchsia.wlan.common.SecuritySupport;
spectrum_management_support fuchsia.wlan.common.SpectrumManagementSupport;
};
/// Instruct the wlantap-ctl device to creates a fake wlantap-phy device based on the
/// `WlantapPhyConfig` passed in. The newly created wlantap-phy device will use the channel to
/// allow a `WlantapPhy` client to observe and control its behavior.
closed protocol WlantapCtl {
strict CreatePhy(resource struct {
config WlantapPhyConfig;
proxy server_end:WlantapPhy;
}) -> (struct {
status zx.Status;
});
};
/// Information pertaining to incoming packets. One WlanRxInfo is associated with each packet.
/// You are encouraged to use the default value in //src/connectivity/wlan/testing/hw-sim/src/lib.rs
/// See wlan_rx_info_t for details about each field.
type WlanRxInfo = struct {
rx_flags uint32;
valid_fields uint32;
phy fuchsia.wlan.common.WlanPhyType;
data_rate uint32;
channel fuchsia.wlan.common.WlanChannel;
mcs uint8;
rssi_dbm int8;
snr_dbh int16;
};
/// Instruction from generic WLAN driver on how to send a packet. One WlanTxInfo per packet.
/// These values are populated by the wlantap driver and should not be specified manually.
/// See wlan_tx_info_t for details about each field.
type WlanTxInfo = struct {
tx_flags uint32;
valid_fields uint32;
tx_vector_idx uint16;
phy fuchsia.wlan.common.WlanPhyType;
cbw uint8;
mcs uint8;
};
/// An outgoing packet that is to be "sent" by the wlantap device. `data` contains the packet
/// in its wire format.
type WlanTxPacket = struct {
data vector<uint8>:MAX;
info WlanTxInfo;
};
/// Configuration pertaining to security keys, often used by RSN and other secure authentication.
/// These values are populated by the wlantap driver and should not be specified manually.
/// See wlan_key_config_t for details about each field.
type WlanKeyConfig = struct {
protection uint8;
cipher_oui array<uint8, 3>;
cipher_type uint8;
key_type uint8;
peer_addr ieee80211.MacAddr;
key_idx uint8;
key vector<uint8>:32;
};
/// Country code the device is to switch to.
/// These values are populated by the wlantap driver and should not be specified manually.
/// See also phy.fidl CountryCode.
type SetCountryArgs = struct {
alpha2 array<uint8, 2>;
};
/// Allow the test program to observe and control the behavior of the wlantap-phy device.
/// A wlantap-phy device is a special vendor device and its driver (Fuchsia being the vendor)
/// used for testing purpose.
/// Implements a subset of `wlan_softmac_ifc_t` and `wlan_softmac_protocol_ops_t` defined in
/// fuchsia.wlan.softmac/softmac.fidl
/// Implements a subset of `WlanPhyImpl` protocol defined in
/// fuchsia.hardware.phyimpl/wlanphy-impl.fidl
closed protocol WlantapPhy {
/// Shutdown the phy device so that it does not respond to any further calls.
/// Once shutdown, there is no way to restart the device.
/// It can only be called at the end of a test.
strict Shutdown() -> ();
// wlan_softmac_ifc_t callbacks
// simulating events happening at the devices side that are passed up to the driver.
/// The device "receives" a frame "over the air" and pass it up to driver.
strict Rx(struct {
data vector<uint8>:MAX;
info WlanRxInfo;
});
/// For rate selection (Minstrel), the device's last frame transmission is a success/failure,
/// with a certain number of retries.
strict ReportTxResult(struct {
txr fuchsia.wlan.common.WlanTxResult;
});
strict ScanComplete(struct {
scan_id uint64;
status zx.Status;
});
// wlan_softmac_protocol_ops_t
// events indicating that the wlan-softmac device received interface request calls from the driver.
/// The device is to send a frame "over the air".
strict -> Tx(struct {
args TxArgs;
});
/// The device created by its parent device (wlantap-phy: wlanphy) is
/// detected and being connected by wlanstack/wlancfg.
/// The device is to enter the "running" state.
strict -> WlanSoftmacStart();
/// The device is to switch to the specified channel.
strict -> SetChannel(struct {
args SetChannelArgs;
});
/// AP: The device is to use args.config as a template for beacon frames.
/// Client: The device is to be configured with this BSS as it peer.
strict -> JoinBss(struct {
args JoinBssArgs;
});
strict -> StartScan(struct {
args StartScanArgs;
});
// TODO: Enable/Disable Beaconing.
/// The device is to install the keys (often coming from RSN, exceptions apply).
strict -> SetKey(struct {
args SetKeyArgs;
});
// WlantaphyImpl (defined in banjo)
// events indicating that the wlanphy device received interface rquest calls from the driver.
/// The device is to change its radio and power settings to conform to the regulation of the
/// specified country.
strict -> SetCountry(struct {
args SetCountryArgs;
});
};
type TxArgs = struct {
wlan_softmac_id uint16;
packet WlanTxPacket;
};
type SetChannelArgs = struct {
wlan_softmac_id uint16;
channel fuchsia.wlan.common.WlanChannel;
};
type JoinBssArgs = struct {
wlan_softmac_id uint16;
config fuchsia.wlan.common.JoinBssRequest;
};
type StartScanArgs = struct {
wlan_softmac_id uint16;
scan_id uint64;
};
type SetKeyArgs = struct {
wlan_softmac_id uint16;
config WlanKeyConfig;
};