# Running WiFi tests Most WiFi tests specify `DEPENDENCIES = 'wificell'` in their control file, which means they require not only an autotest server and a DUT, but also a special test-enabled Access Point (AP). Additionally, some tests require a packet capture (pcap) device or a signal attenuator. The basics of running a wificell autotest are the same as any other, except that autotest also needs to know where to find your test AP. For some configurations, this is sufficient: ```bash # Run a 5HT40 test with DUT at 'my-host' and AP at 'my-host-router'. test_that my-host network_WiFi_SimpleConnect.wifi_check5HT40 ```` This works for most of the Chrome OS lab WiFi cells, where we configure DNS to pair a DUT at address `${HOST}` with its companion AP at an address `${HOST}-router`. See below for more info on addressing your test AP. ## What is a test AP? A test AP can come in various forms, but as of this writing, it is typically a Chrome OS based router / access point such as Whirlwind or Gale, running a testbed-ap variant of a Chrome OS test image in Developer Mode. We have previously supported other consumer routers, running OpenWRT. Setting up a test AP is not in the scope for this document. The key purpose of a test AP is to run a variety of [hostapd] instances, such that we can test our DUTs using different PHY, cipher, etc., configurations. In autotest, a test AP is represented by a `LinuxRouter` object, in [site\_linux\_router]. ## What suites should I run? There are a variety of WiFi-related suites, but developers are commonly interested in the functionality (`wifi_matfunc`) and performance (`wifi_perf`) suites. ## Configuring DNS entries for test APs Autotest assumes that if you have a DUT at address `${HOST}`, then your AP is at an address `${HOST}-router` (see [dnsname\_mangler]). This is configured automatically by the lab team for most Chrome OS lab WiFi setups. For custom/local testing without modifying your DNS server, one can accomplish this by adding entries to your `/etc/hosts` file. Alternatively, you can supply the `router_addr=` and `pcap_addr=` arguments to autotest. For example: ```bash # DUT at 'my-host', AP at 'my-other-router', and PCAP at 'my-other-pcap' test_that --args="router_addr=my-other-router pcap_addr=my-other-pcap" \ my-host suite:wifi_matfunc ``` If the test is using [Tast](https://chromium.googlesource.com/chromiumos/platform/tast/) instead of autotest, you can pass the `router` and `pcap` arguments to `tast run` instead: ```bash # DUT at 'my-host', AP at 'my-other-router', and PCAP at 'my-other-pcap' tast run -var="router=my-other-router" -var="pcap=my-other-pcap" my-host \ wifi.ChannelHop ``` Also, note that if a pcap device isn't found at `${HOST}-pcap`, then we often can utilize the test AP to capture packets as well. The test framework does this by creating one or more monitor-mode interfaces in addition to the AP-mode interface(s) normally used for tests. Note that 802.11 radios cannot both transmit and receive at the same time, so this mode operates with slightly degraded functionality. In particular, while a typical mac80211-based AP driver can capture many aspects of its own transmitted frames (e.g., 802.11 headers are constructed in software), it cannot monitor how those frames really look over the air, so it will likely be missing most physical-layer information (e.g., bitrates, modulation, frequency) or firmware-controlled behaviors (e.g., 802.11 ACKs). For example, consider the following AP + monitor capture, filtered for [AP-transmitted frames](https://screenshot.googleplex.com/DWSaResO583) and [AP-received frames](https://screenshot.googleplex.com/5EsZvbBpKEc) (links are Google-internal). While the AP-transmitted frames contain 802.11 header information like MAC-layer addresses and sequence numbers, only the received frames contain information like frequency and bitrate. As such, if you need this sort of information for debugging your tests, ensure you are using a dedicated pcap device. Note that all supported tests should support running in either configuration. [dnsname\_mangler]: ../server/cros/dnsname_mangler.py [hostapd]: https://w1.fi/hostapd/ [site\_linux\_router]: ../server/site_linux_router.py