In the K-12 market Chromebooks are the most common devices used in 1:1 programs. If you are designing high density Wi-Fi networks for Chromebook 1:1 programs, it helps to know how to access their Wi-Fi statistics, logs, and networking tools. This knowledge is valuable for troubleshooting day-to-day Chromebook Wi-Fi issues as well.
Despite its simplicity, Chrome OS, the Linux variant that Chromebooks run, does have some useful diagnostics tools that can help troubleshoot Wi-Fi problems. Most of these tools are included in the crosh shell, which you can open by typing Control-Alt-T. Here are some of my go-to crosh networking commands that don’t require an explanation.
ping route tracepath
This command provides some good Wi-Fi stats like retries, MCS index, and also RoamThreshold, which is the SNR at which this Chromebook will attempt to roam to a new BSS. Hopefully, one day we’ll be able to modify this value on enterprise-managed Chromebooks through the Google Apps admin console.
crosh> connectivity show devices /device/wlan0 Address: 485ab6###### BgscanMethod: simple BgscanShortInterval: 30 BgscanSignalThreshold: -50 ForceWakeToScanTimer: false IPConfigs/0: /ipconfig/wlan0_0_dhcp Interface: wlan0 LinkMonitorResponseTime: 3 LinkStatistics/0/AverageReceiveSignalDbm: -61 LinkStatistics/1/InactiveTimeMilliseconds: 8002 LinkStatistics/2/LastReceiveSignalDbm: -62 LinkStatistics/3/PacketReceiveSuccesses: 63919 LinkStatistics/4/PacketTransmitFailures: 25 LinkStatistics/5/PacketTrasmitSuccesses: 34432 LinkStatistics/6/TransmitBitrate: 52.0 MBit/s MCS 11 LinkStatistics/7/TransmitRetries: 60969 Name: wlan0 NetDetectScanPeriodSeconds: 120 Powered: true ReceiveByteCount: 1610461765 RoamThreshold: 18 ScanInterval: 60 Scanning: false SelectedService: /service/5 TransmitByteCount: 133127986 Type: wifi WakeOnWiFiFeaturesEnabled: not_supported WakeToScanPeriodSeconds: 900
This command is very useful in troubleshooting 802.1X issues. It shows more layer 2 details on all the BSS’s that have been discovered. In this case, /service/12 is an 802.1X network that the Chromebook is associated with, and /service/15 an open network also in range.
crosh> connectivity show services /service/12 AutoConnect: true CheckPortal: auto Connectable: true ConnectionId: 2069398120 Country: US DNSAutoFallback: false Device: /device/wlan0 EAP.AnonymousIdentity: anonymous EAP.CACert: EAP.CACertID: EAP.CACertNSS: EAP.CertID: EAP.ClientCert: EAP.EAP: PEAP EAP.Identity: <username> EAP.InnerEAP: auth=MSCHAPV2 EAP.KeyID: EAP.KeyMgmt: WPA-EAP EAP.PIN: EAP.PrivateKey: EAP.RemoteCertification/0: /OU=Domain Control Validated/CN=<cn> EAP.RemoteCertification/1: /C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2 EAP.RemoteCertification/2: /C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2 EAP.RemoteCertification/3: /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority EAP.SubjectMatch: EAP.UseProactiveKeyCaching: false EAP.UseSystemCAs: true Error: Unknown ErrorDetails: GUID: 5137BA48-0424-41B0-B5DE-29A427084925 HTTPProxyPort: 34599 IPConfig: /ipconfig/wlan0_1_dhcp IsActive: true LinkMonitorDisable: false ManagedCredentials: false Mode: managed Name: <SSID name> PassphraseRequired: false PortalDetectionFailedPhase: PortalDetectionFailedStatus: PreviousError: PreviousErrorSerialNumber: 0 Priority: 0 PriorityWithinTechnology: 0 Profile: /profile/chronos/shill ProxyConfig: SaveCredentials: true SavedIP.Address: 192.168.1.20 SavedIP.Gateway: 192.168.1.1 SavedIP.Mtu: 0 SavedIP.NameServers: 192.168.1.1 SavedIP.PeerAddress: SavedIP.Prefixlen: 26 SavedIPConfig/0/Address: 192.168.1.20 SavedIPConfig/1/Gateway: 192.168.1.1 SavedIPConfig/2/Mtu: 0 SavedIPConfig/3/NameServers/0: 192.168.1.1 SavedIPConfig/4/PeerAddress: SavedIPConfig/5/Prefixlen: 26 Security: 802_1x SecurityClass: 802_1x State: online Strength: 35 Tethering: NotDetected Type: wifi UIData: Visible: true WiFi.AuthMode: WiFi.BSSID: 00:11:74:##:##:## WiFi.Frequency: 5240 WiFi.FrequencyList/0: 2412 WiFi.FrequencyList/1: 2462 WiFi.FrequencyList/2: 5240 WiFi.FrequencyList/3: 5320 WiFi.HexSSID: ######## WiFi.HiddenSSID: false WiFi.PhyMode: 7 WiFi.PreferredDevice: WiFi.ProtectedManagementFrameRequired: false WiFi.RoamThreshold: 0 WiFi.VendorInformation/0/OUIList: 00-03-7f /service/15 AutoConnect: false CheckPortal: auto Connectable: true ConnectionId: 0 Country: US DNSAutoFallback: false Device: /device/wlan0 EAP.AnonymousIdentity: EAP.CACert: EAP.CACertID: EAP.CACertNSS: EAP.CertID: EAP.ClientCert: EAP.EAP: EAP.Identity: EAP.InnerEAP: EAP.KeyID: EAP.KeyMgmt: NONE EAP.PIN: EAP.PrivateKey: EAP.SubjectMatch: EAP.UseProactiveKeyCaching: false EAP.UseSystemCAs: true Error: Unknown ErrorDetails: GUID: HTTPProxyPort: 0 IsActive: false LinkMonitorDisable: false ManagedCredentials: false Mode: managed Name: <SSID name> PassphraseRequired: false PortalDetectionFailedPhase: PortalDetectionFailedStatus: PreviousError: PreviousErrorSerialNumber: 0 Priority: 0 PriorityWithinTechnology: 0 Profile: ProxyConfig: SaveCredentials: true Security: none SecurityClass: none State: idle Strength: 44 Tethering: NotDetected Type: wifi UIData: Visible: true WiFi.AuthMode: WiFi.BSSID: 7c:69:f6:##:##:## WiFi.Frequency: 5320 WiFi.FrequencyList/0: 5240 WiFi.FrequencyList/1: 5320 WiFi.HexSSID: ########## WiFi.HiddenSSID: false WiFi.PhyMode: 7 WiFi.PreferredDevice: WiFi.ProtectedManagementFrameRequired: false WiFi.RoamThreshold: 0 WiFi.VendorInformation/0/OUIList: 00-10-18
This command brings up a lot of valuable information including a dump of the latest full channel scan and the Wi-Fi chipset’s capabilities, among other useful data.
crosh> network_diag --wifi iw dev wlan0 survey dump: Survey data from wlan0 frequency: 2412 MHz noise: -92 dBm channel active time: 63 ms channel busy time: 49 ms channel receive time: 45 ms channel transmit time: 0 ms Survey data from wlan0 frequency: 2417 MHz noise: -93 dBm channel active time: 62 ms channel busy time: 47 ms channel receive time: 41 ms channel transmit time: 0 ms Survey data from wlan0 frequency: 2422 MHz noise: -92 dBm channel active time: 63 ms channel busy time: 4 ms channel receive time: 0 ms channel transmit time: 0 ms [truncated] Survey data from wlan0 frequency: 5220 MHz noise: -94 dBm channel active time: 124 ms channel busy time: 0 ms channel receive time: 0 ms channel transmit time: 0 ms Survey data from wlan0 frequency: 5240 MHz [in use] noise: -94 dBm channel active time: 15723 ms channel busy time: 513 ms channel receive time: 185 ms channel transmit time: 3 ms Survey data from wlan0 frequency: 5260 MHz noise: -94 dBm channel active time: 85031 ms channel busy time: 84907 ms channel receive time: 84907 ms channel transmit time: 84907 ms [truncated] iw dev wlan0 station dump: Station 00:11:74:##:##:## (on wlan0) inactive time: 5444 ms rx bytes: 11797197 rx packets: 38419 tx bytes: 1703260 tx packets: 9779 tx retries: 14295 tx failed: 43 signal: -58 dBm signal avg: -60 dBm tx bitrate: 24.0 MBit/s rx bitrate: 300.0 MBit/s MCS 15 40MHz short GI authorized: yes authenticated: yes preamble: long WMM/WME: yes MFP: no TDLS peer: no iw dev wlan0 scan dump: BSS 00:11:74:##:##:##(on wlan0) -- associated TSF: 61418055#### usec (7d, 02:36:20) freq: 5240 beacon interval: 100 TUs capability: ESS Privacy SpectrumMgmt ShortSlotTime (0x0511) signal: -60.00 dBm last seen: 847370 ms ago Information elements from Probe Response frame: Supported rates: 24.0* 36.0 48.0 54.0 DS Parameter set: channel 48 Country: US Environment: Indoor/Outdoor Channels [36 - 36] @ 24 dBm Channels [40 - 40] @ 24 dBm Channels [44 - 44] @ 24 dBm Channels [48 - 48] @ 24 dBm Channels [52 - 52] @ 23 dBm Channels [56 - 56] @ 23 dBm Channels [60 - 60] @ 23 dBm Channels [64 - 64] @ 23 dBm Channels [100 - 100] @ 24 dBm Channels [104 - 104] @ 24 dBm Channels [108 - 108] @ 24 dBm Channels [112 - 112] @ 24 dBm Channels [116 - 116] @ 24 dBm Channels [120 - 120] @ 24 dBm Channels [124 - 124] @ 24 dBm Channels [128 - 128] @ 24 dBm Channels [132 - 132] @ 24 dBm Channels [136 - 136] @ 24 dBm Channels [140 - 140] @ 24 dBm Channels [144 - 144] @ 24 dBm Channels [149 - 149] @ 30 dBm Channels [153 - 153] @ 30 dBm Channels [157 - 157] @ 30 dBm Channels [161 - 161] @ 30 dBm Channels [165 - 165] @ 30 dBm Power constraint: 3 dB BSS Load: * station count: 2 * channel utilisation: 4/255 * available admission capacity: 31250 [*32us] HT capabilities: Capabilities: 0x9ef RX LDPC HT20/HT40 SM Power Save disabled RX HT20 SGI RX HT40 SGI TX STBC RX STBC 1-stream Max AMSDU length: 7935 bytes No DSSS/CCK HT40 Maximum RX AMPDU length 65535 bytes (exponent: 0x003) Minimum RX AMPDU time spacing: 8 usec (0x06) HT TX/RX MCS rate indexes supported: 0-15 HT operation: * primary channel: 48 * secondary channel offset: below * STA channel width: any * RIFS: 1 * HT protection: no * non-GF present: 1 * OBSS non-GF present: 0 * dual beacon: 0 * dual CTS protection: 0 * STBC beacon: 0 * L-SIG TXOP Prot: 0 * PCO active: 0 * PCO phase: 0 VHT capabilities: VHT Capabilities (0x338001b2): Max MPDU length: 11454 Supported Channel Width: neither 160 nor 80+80 RX LDPC short GI (80 MHz) TX STBC RX antenna pattern consistency TX antenna pattern consistency VHT RX MCS set: 1 streams: MCS 0-9 2 streams: MCS 0-9 3 streams: not supported 4 streams: not supported 5 streams: not supported 6 streams: not supported 7 streams: not supported 8 streams: not supported VHT RX highest supported: 0 Mbps VHT TX MCS set: 1 streams: MCS 0-9 2 streams: MCS 0-9 3 streams: not supported 4 streams: not supported 5 streams: not supported 6 streams: not supported 7 streams: not supported 8 streams: not supported VHT TX highest supported: 0 Mbps VHT operation: * channel width: 1 (80 MHz) * center freq segment 1: 42 * center freq segment 2: 0 * VHT basic MCS set: 0xfffc WMM: * Parameter version 1 * u-APSD * BE: CW 15-1023, AIFSN 3 * BK: CW 15-1023, AIFSN 7 * VI: CW 7-15, AIFSN 2, TXOP 3008 usec * VO: CW 3-7, AIFSN 2, TXOP 1504 usec RSN: * Version: 1 * Group cipher: CCMP * Pairwise ciphers: CCMP * Authentication suites: IEEE 802.1X FT/IEEE 802.1X * Capabilities: PreAuth 1-PTKSA-RC 1-GTKSA-RC MFP-capable (0x0081) * 0 PMKIDs * Group mgmt cipher suite: AES-128-CMAC iw dev wlan0 link: Connected to 00:11:74:##:##:## (on wlan0) freq: 5240 RX: 11797197 bytes (38419 packets) TX: 1703260 bytes (9779 packets) signal: -58 dBm tx bitrate: 24.0 MBit/s bss flags: short-slot-time dtim period: 1 beacon int: 100
That’s a lot more Wi-Fi data than most other platforms make natively accessible.
Additionally, to view most of this data without crosh, use this internal Chrome URL. Just enter it into the address bar and hit enter.
Areas of interest for Wi-Fi data:
- network-devices – same output as the “connectivity show devices” crosh command
- network-services – same output as the “connectivity show services” crosh command
- wifi_status – same output as the “network_diag –wifi” crosh command
- lspci – you can see the Wi-Fi chipset hardware here (more on that later)
You can start logging Wi-Fi events using this crosh command.
crosh> network_logging wifi Old flimflam tags:  Current flimflam tags: [device+inet+manager+service+wifi] method return sender=:1.1 -> dest=:1.146 reply_serial=2 Old wpa level: info Current wpa level: msgdump
View the resulting device event logs at this internal Chrome URL: chrome://device-log/
Run this command to view the kernel log, which includes a lot of Wi-Fi events. I wish there was a –follow option, but currently there is not.
A restart will return the Chromebook to normal logging levels.
And if you really want to bury yourself in logs, go to chrome://net-internals/#chromeos, click Wi-Fi to enable debugging on that interface, let the “capturing events” count creep up while you perform a task, then click “Store debug logs” to save a debug-logs_<date>.tgz archive in your Downloads folder. Be warned, the signal to noise ratio is very low with this approach. Google provides a log analyzer that you can upload these files to, but I’ve never had the need to go that far down the road. This is best used if you need to submit logs to the Google Apps Enterprise Support Team or a hardware manufacturer.
Advanced Wi-Fi Analysis with Developer Mode
But wait, there’s more! If you can put a Chromebook into Developer Mode, you can run packet captures and break into the Linux bash shell. Most enterprise-managed Chromebooks will have this mode disabled for obvious reasons, but it’s easy enough to move your test Chromebook into a test OU and disable this and other restrictions for testing purposes. (That’s IT testing, not high-stakes student testing! Make sure your OU’s clearly differentiate the two.)
First, determine which channel’s frequency you’d like to run the capture, and also if channel bonding is in use. The internal URL from above will work for this as well as the “network_diag –wifi” crosh command. The frequency of the currently associated BSS is displayed at the end of that output here.
… iw dev wlan0 link: Connected to 00:11:74:##:##:## (on wlan0) freq: 5240 RX: 11797197 bytes (38419 packets) TX: 1703260 bytes (9779 packets) signal: -58 dBm tx bitrate: 24.0 MBit/s bss flags: short-slot-time dtim period: 1 beacon int: 100
Now turn off the Wi-Fi NIC in the GUI so it can be put into monitor mode.
You can now run the packet capture using the crosh command below.
Optionally, specify a secondary channel above or below the primary if you are doing a 40 MHz 802.11n capture by appending the “–ht-location <above|below>” flag.
crosh> packet_capture --frequency <frequency in MHz> Capturing from phy0_mon. Press Ctrl-C to stop. ^CCapture stored in /home/chronos/user/Downloads/packet_capture_7K08.pcap
You’ll get a pcap file complete with Radiotap headers if the hardware supports it saved in the Downloads folder which you can send to another machine to do analysis. If the Chromebook is all you have available, you can upload the pcap to CloudShark for analysis.
Wi-Fi Troubleshooting in Bash
Once you’ve got Developer Mode enabled, you can use the bash shell and follow the network log (or any other log) as things happen. This is my preferred way to troubleshoot Chromebook Wi-Fi issues in real time.
crosh> shell chronos@localhost / $ tail -f /var/log/net.log
Now go do something to the Wi-Fi connection and watch the log scroll by.
A few Linux networking commands you may already know are available here as well like ifconfig, arp, and netstat.
Wi-Fi Chipset and Driver Information
While you’re in the bash shell, you can also determine the Wi-Fi chipset hardware in use. The output of this lspci command will only show the Wi-Fi adapter and the driver it is using. The basic output of lspci is included in chrome://system, but this method allows you to get more data. Add a -v flag or two to see even more.
crosh> shell chronos@localhost /sys $ sudo lspci -nnk | grep -A2 0280 01:00.0 Network controller : Qualcomm Atheros AR9462 Wireless Network Adapter [168c:0034] (rev 01) Subsystem: Foxconn International, Inc. Device [105b:e058] Kernel driver in use: ath9k
This Acer C720 Chromebook has a Qualcomm Atheros AR9462 and uses the ath9k driver.
Run this command to discover the Wi-Fi chipset driver version. This is helpful if you want to know if the Wi-Fi chipset drivers were updated during a system update.
crosh> shell chronos@localhost / $ sudo ethtool -i wlan0 driver: ath9k version: firmware-version: bus-info: 0000:01:00.0 supports-statistics: no supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no
In this case no version number is reported, perhaps because the OS is using a generic Atheros driver that is packaged with the Linux kernel.
Below is the output of the same commands on an HP Chromebook 11 G4 running Chrome OS 41. This machine has an Intel Wireless-AC 7260 chipset and the driver and firmware-version are listed.
crosh> shell chronos@localhost / $ sudo lspci -nnk | grep -A2 0280 01:00.0 Network controller : Intel Corporation Wireless 7260 [8086:08b1] (rev c3) Subsystem: Intel Corporation Dual Band Wireless-AC 7260 [8086:c070] Kernel driver in use: iwlwifi
crosh> shell chronos@localhost / $ sudo ethtool -i wlan0 driver: iwlwifi version: 3.10.18 firmware-version: 126.96.36.199 bus-info: 0000:01:00.0 supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no
The driver version appears to just be the Linux kernel version. The firmware-version is the chipset driver version.
Interestingly, after updating this HP Chromebook to Chrome OS 50, the Wi-Fi chipset firmware-version changed… but went down.
crosh> shell chronos@localhost / $ sudo ethtool -i wlan0 driver: iwlwifi version: 3.10.18 firmware-version: 16.229726.0 bus-info: 0000:01:00.0 supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no
An inspection of the iwlwifi version history shows that this driver is actually newer than the previous version. Before version 16 it was the third number in the version that indicated what major branch it came from, so version 188.8.131.52 was actually from the version 10 branch. Thankfully, that’s cleared up in newer versions of the driver so that the first number is the version branch.
It’s good to see that Google includes Wi-Fi chipset driver updates with Chrome OS updates. This is especially nice as system updates are downloaded and installed automatically to Chromebooks. Personally, I’ve seen system updates resolve odd Chromebook Wi-Fi problems and it’s possible the newer drivers are the solution.