/* * Copyright 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.hardware.wifi@1.0; import IWifiIface; import IWifiStaIfaceEventCallback; /** * Interface used to represent a single STA iface. */ interface IWifiStaIface extends IWifiIface { /** * Mask of capabilities suported by this Iface. */ enum StaIfaceCapabilityMask : uint32_t { /** * If set indicates that the APF APIs are supported. * APF (Android Packet Filter) is a BPF like packet filtering * bytecode executed by the firmware. */ APF = 1 << 0, /** * If set indicates that the Background Scan APIs are supported. * Background scan allow the host to send a number of buckets down to the * firmware. Each bucket contains a set of channels, a period, and some * parameters about how and when to report results. */ BACKGROUND_SCAN = 1 << 1, /** * If set indicates that the link layer stats APIs are supported. */ LINK_LAYER_STATS = 1 << 2, /** * If set indicates that the RSSI monitor APIs are supported. */ RSSI_MONITOR = 1 << 3, /** * If set indicates that the roaming API's are supported. */ CONTROL_ROAMING = 1 << 4, /** * If set indicates support for Probe IE white listing. */ PROBE_IE_WHITELIST = 1 << 5, /** * If set indicates support for MAC & Probe Sequence Number randomization. */ SCAN_RAND = 1 << 6, /** * Support for 5 GHz Band. */ STA_5G = 1 << 7, /** * Support for GAS/ANQP queries. */ HOTSPOT = 1 << 8, /** * Support for Preferred Network Offload. */ PNO = 1 << 9, /** * Support for Tunneled Direct Link Setup. */ TDLS = 1 << 10, /** * Support for Tunneled Direct Link Setup off channel. */ TDLS_OFFCHANNEL = 1 << 11, /** * Support for neighbour discovery offload. */ ND_OFFLOAD = 1 << 12, /** * Support for keep alive packet offload. */ KEEP_ALIVE = 1 << 13, /** * Support for tracking connection packets' fate. */ DEBUG_PACKET_FATE = 1 << 14 }; /** * Requests notifications of significant events on this iface. Multiple calls * to this must register multiple callbacks each of which must receive all * events. * * @param callback An instance of the |IWifiStaIfaceEventCallback| HIDL interface * object. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID| */ registerEventCallback(IWifiStaIfaceEventCallback callback) generates (WifiStatus status); /** * Get the capabilities supported by this STA iface. * * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| * @return capabilities Bitset of |StaIfaceCapabilityMask| values. */ getCapabilities() generates (WifiStatus status, bitfield<StaIfaceCapabilityMask> capabilities); /** * Used to query additional information about the chip's APF capabilities. * Must fail if |StaIfaceCapabilityMask.APF| is not set. * * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| * @return capabilities Instance of |StaApfPacketFilterCapabilities|. */ getApfPacketFilterCapabilities() generates (WifiStatus status, StaApfPacketFilterCapabilities capabilities); /** * Installs an APF program on this iface, replacing an existing * program if present. * Must fail if |StaIfaceCapabilityMask.APF| is not set. * * APF docs * ========================================================================== * APF functionality, instructions and bytecode/binary format is described in: * http://android.googlesource.com/platform/hardware/google/apf/ * +/b75c9f3714cfae3dad3d976958e063150781437e/apf.h * * The interpreter API is described here: * http://android.googlesource.com/platform/hardware/google/apf/+/ * b75c9f3714cfae3dad3d976958e063150781437e/apf_interpreter.h#32 * * The assembler/generator API is described in javadocs here: * http://android.googlesource.com/platform/frameworks/base/+/ * 4456f33a958a7f09e608399da83c4d12b2e7d191/services/net/java/android/net/ * apf/ApfGenerator.java * * Disassembler usage is described here: * http://android.googlesource.com/platform/hardware/google/apf/+/ * b75c9f3714cfae3dad3d976958e063150781437e/apf_disassembler.c#65 * * The BPF to APF translator usage is described here: * http://android.googlesource.com/platform/frameworks/base/+/ * 4456f33a958a7f09e608399da83c4d12b2e7d191/tests/net/java/android/net/ * apf/Bpf2Apf.java * ========================================================================== * * @param cmdId command Id to use for this invocation. * @param APF Program to be set. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_INVALID_ARGS|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| */ installApfPacketFilter(CommandId cmdId, vec<uint8_t> program) generates (WifiStatus status); /** * Used to query additional information about the chip's Background Scan capabilities. * Must fail if |StaIfaceCapabilityMask.BACKGROUND_SCAN| is not set. * * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| * @return capabilities Instance of |StaBackgroundScanCapabilities|. */ getBackgroundScanCapabilities() generates (WifiStatus status, StaBackgroundScanCapabilities capabilities); /** * Used to query the list of valid frequencies (depending on country code set) * for the provided band. These channels may be specifed in the * |BackgroundScanBucketParameters.frequenciesInMhz| for a background scan * request. * * @param band Band for which the frequency list is being generated. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| * @return frequencies vector of valid frequencies for the provided band. */ getValidFrequenciesForBand(WifiBand band) generates (WifiStatus status, vec<WifiChannelInMhz> frequencies); /** * Start a background scan using the given cmdId as an identifier. Only one * active background scan need be supported. * Must fail if |StaIfaceCapabilityMask.BACKGROUND_SCAN| is not set. * * When this is called all requested buckets must be scanned, starting the * beginning of the cycle. * * For example: * If there are two buckets specified * - Bucket 1: period=10s * - Bucket 2: period=20s * - Bucket 3: period=30s * Then the following scans must occur * - t=0 buckets 1, 2, and 3 are scanned * - t=10 bucket 1 is scanned * - t=20 bucket 1 and 2 are scanned * - t=30 bucket 1 and 3 are scanned * - t=40 bucket 1 and 2 are scanned * - t=50 bucket 1 is scanned * - t=60 buckets 1, 2, and 3 are scanned * - and the patter repeats * * If any scan does not occur or is incomplete (error, interrupted, etc) then * a cached scan result must still be recorded with the * WIFI_SCAN_FLAG_INTERRUPTED flag set. * * @param cmdId command Id to use for this invocation. * @params Background scan parameters. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_INVALID_ARGS|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| */ startBackgroundScan(CommandId cmdId, StaBackgroundScanParameters params) generates (WifiStatus status); /** * Stop the background scan started. * Must fail if |StaIfaceCapabilityMask.BACKGROUND_SCAN| is not set. * * @param cmdId command Id corresponding to the request. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_STARTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| */ stopBackgroundScan(CommandId cmdId) generates (WifiStatus status); /** * Enable link layer stats collection. * Must fail if |StaIfaceCapabilityMask.LINK_LAYER_STATS| is not set. * * Radio statistics (once started) must not stop until disabled. * Iface statistics (once started) reset and start afresh after each * connection until disabled. * * @param debug Set for field debug mode. Driver must collect all * statistics regardless of performance impact. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| */ enableLinkLayerStatsCollection(bool debug) generates (WifiStatus status); /** * Disable link layer stats collection. * Must fail if |StaIfaceCapabilityMask.LINK_LAYER_STATS| is not set. * * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_STARTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| */ disableLinkLayerStatsCollection() generates (WifiStatus status); /** * Retrieve the latest link layer stats. * Must fail if |StaIfaceCapabilityMask.LINK_LAYER_STATS| is not set or if * link layer stats collection hasn't been explicitly enabled. * * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_STARTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| * @return stats Instance of |LinkLayerStats|. */ getLinkLayerStats() generates (WifiStatus status, StaLinkLayerStats stats); /** * Start RSSI monitoring on the currently connected access point. * Once the monitoring is enabled, * |IWifiStaIfaceEventCallback.onRssiThresholdBreached| callback must be * invoked to indicate if the RSSI goes above |maxRssi| or below |minRssi|. * Must fail if |StaIfaceCapabilityMask.RSSI_MONITOR| is not set. * * @param cmdId command Id to use for this invocation. * @param maxRssi Maximum RSSI threshold. * @param minRssi Minimum RSSI threshold. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_ARGS_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| */ startRssiMonitoring(CommandId cmdId, Rssi maxRssi, Rssi minRssi) generates (WifiStatus status); /** * Stop RSSI monitoring. * Must fail if |StaIfaceCapabilityMask.RSSI_MONITOR| is not set. * * @param cmdId command Id corresponding to the request. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_STARTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| */ stopRssiMonitoring(CommandId cmdId) generates (WifiStatus status); /** * Get roaming control capabilities. * Must fail if |StaIfaceCapabilityMask.CONTROL_ROAMING| is not set. * * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_UNKNOWN| * @return caps Instance of |StaRoamingCapabilities|. */ getRoamingCapabilities() generates (WifiStatus status, StaRoamingCapabilities caps); /** * Configure roaming control parameters. * Must fail if |StaIfaceCapabilityMask.CONTROL_ROAMING| is not set. * * @param config Instance of |StaRoamingConfig|. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_UNKNOWN| */ configureRoaming(StaRoamingConfig config) generates (WifiStatus status); /** * Set the roaming control state with the parameters configured * using |configureRoaming|. Depending on the roaming state set, the * driver/firmware would enable/disable control over roaming decisions. * Must fail if |StaIfaceCapabilityMask.CONTROL_ROAMING| is not set. * * @param state State of the roaming control. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_BUSY|, * |WifiStatusCode.ERROR_UNKNOWN| */ setRoamingState(StaRoamingState state) generates (WifiStatus status); /** * Enable/Disable Neighbour discovery offload functionality in the firmware. * * @param enable true to enable, false to disable. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_UNKNOWN| */ enableNdOffload(bool enable) generates (WifiStatus status); /** * Start sending the specified keep alive packets periodically. * * @param cmdId command Id to use for this invocation. * @param ipPacketData IP packet contents to be transmitted. * @param etherType 16 bit ether type to be set in the ethernet frame * transmitted. * @param srcAddress Source MAC address of the packet. * @param dstAddress Destination MAC address of the packet. * @param periodInMs Interval at which this packet must be transmitted. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| */ startSendingKeepAlivePackets( CommandId cmdId, vec<uint8_t> ipPacketData, uint16_t etherType, MacAddress srcAddress, MacAddress dstAddress, uint32_t periodInMs) generates (WifiStatus status); /** * Stop sending the specified keep alive packets. * * @param cmdId command Id corresponding to the request. * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| */ stopSendingKeepAlivePackets(CommandId cmdId) generates (WifiStatus status); /** * Set the MAC OUI during scanning. * An OUI {Organizationally Unique Identifier} is a 24-bit number that * uniquely identifies a vendor or manufacturer. * * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_UNKNOWN| */ setScanningMacOui(uint8_t[3] oui) generates (WifiStatus status); /** * API to start packet fate monitoring. * - Once started, monitoring must remain active until HAL is stopped or the * chip is reconfigured. * - When HAL is unloaded, all packet fate buffers must be cleared. * - The packet fates are used to monitor the state of packets transmitted/ * received during association. * * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| */ startDebugPacketFateMonitoring() generates (WifiStatus status); /** * API to retrieve fates of outbound packets. * - HAL implementation must return the fates of * all the frames transmitted for the most recent association. * The fate reports must follow the same order as their respective * packets. * - HAL implementation may choose (but is not required) to include * reports for management frames. * - Packets reported by firmware, but not recognized by driver, * must be included. However, the ordering of the corresponding * reports is at the discretion of HAL implementation. * - Framework must be able to call this API multiple times for the same * association. * * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_STARTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| * @return fates Vector of |WifiDebugTxPacketFateReport| instances corresponding * to the packet fates. */ getDebugTxPacketFates() generates (WifiStatus status, vec<WifiDebugTxPacketFateReport> fates); /** * API to retrieve fates of inbound packets. * - HAL implementation must return the fates of * all the frames received for the most recent association. * The fate reports must follow the same order as their respective * packets. * - HAL implementation may choose (but is not required) to include * reports for management frames. * - Packets reported by firmware, but not recognized by driver, * must be included. However, the ordering of the corresponding * reports is at the discretion of HAL implementation. * - Framework must be able to call this API multiple times for the same * association. * * @return status WifiStatus of the operation. * Possible status codes: * |WifiStatusCode.SUCCESS|, * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, * |WifiStatusCode.ERROR_NOT_SUPPORTED|, * |WifiStatusCode.ERROR_NOT_STARTED|, * |WifiStatusCode.ERROR_NOT_AVAILABLE|, * |WifiStatusCode.ERROR_UNKNOWN| * @return fates Vector of |WifiDebugRxPacketFateReport| instances corresponding * to the packet fates. */ getDebugRxPacketFates() generates (WifiStatus status, vec<WifiDebugRxPacketFateReport> fates); };