OpenWrt on Google Wifi
Overview
Google Wifi (AC-1304) is a 2x2 802.11ac access point with a Qualcomm IPQ4019 SoC, 512 MB RAM, and 4 GB eMMC storage. It runs a ChromeOS-based firmware called Gale and can be configured to boot unsigned firmware like OpenWrt by enabling Developer Mode.
Installation
The high level steps to install OpenWrt on Google Wifi are as follows:
- Flash the official firmware to the device.
- Flash OpenWrt to the device’s eMMC.
- Flash the sysupgrade image to the device.
Shoutout to this post by papdee. This guide is based on their instructions.
Hardware Requirements
Obviously, you’ll need a Google Wifi AC-1304.
You’ll also need the following:
- USB-C hub with power delivery (PD)
I used an Anker 341 USB-C Hub (7-in-1). The important thing is that it has a USB-C PD port for power and data passthrough to the puck, as well as a USB-A port for the USB drive.
- USB-C power supply
I used a 30W USB-C charger from an iPad.
- USB-C cable
I used the cable that came with my iPhone.
- 2 USB 3.0 flash drives
I used a pair of 32 GB USB 3.0 drives from Micro Center. It’s strongly recommended that you use drives with activity LEDs to monitor the flashing process.
- Phillips PH0 screwdriver
The puck’s bottom cover is held on by a single screw.
- Plastic spudger or flat-head screwdriver
To pry off the bottom cover.
Prepare the Official Firmware USB Drive
- Install the OnHub Recovery Utility in Chrome.
- Select “Google” as the manufacturer and “Google Wifi” as the model.
- Write the latest official Google Wifi firmware to a USB drive.
Flash the Official Firmware
- Connect the USB-C hub to power but do not plug it into the puck yet.
- Insert the firmware USB drive into the hub.
- Hold the external reset button on the puck.
- Plug in the USB-C hub while continuing to hold the button.
- After ~10 seconds, the LED will turn amber.
- Release the button and wait ~5 minutes for the process to complete.
- When the LED glows solid blue, the firmware has been installed.
Prepare the OpenWrt USB Drive
- Download the latest OpenWrt “factory” image for Google Wifi from the OpenWrt website.
- Use the OnHub Recovery Utility to write this image to a second USB drive.
- Open the utility, click the gear icon, select “Use local image,” and choose the OpenWrt factory image.
Open the Puck and Locate SW7
- Disconnect power from the puck.
- Remove the bottom cover by unscrewing the Phillips screw and prying it off.
- Locate the internal switch labeled “SW7.”
Boot OpenWrt
- Insert the OpenWrt USB drive into the powered USB-C hub.
- Hold the external reset button while plugging in the USB-C hub.
- After ~10 seconds, the LED will turn amber.
- Press SW7 inside the device. The LED will blink purple, then reboot.
- When the LED blinks purple again, press SW7 once more to trigger USB boot.
- If the device successfully boots OpenWrt, you should be able to ping
192.168.1.1
from a computer connected via Ethernet.
If the puck continues blinking purple, try pressing SW7 again or check the USB drive.
Flash OpenWrt to eMMC
-
Transfer the OpenWrt factory image to
/tmp
on the puck using SCP:console $ scp -O openwrt-23.05.5-ipq40xx-chromium-google_wifi-squashfs-factory.bin root@192.168.1.1:/tmp/
-
SSH into the puck:
console $ ssh root@192.168.1.1
-
Write the firmware to eMMC:
console # dd if=/dev/zero bs=512 seek=7634911 of=/dev/mmcblk0 count=33 # dd if=/tmp/openwrt-23.05.5-ipq40xx-chromium-google_wifi-squashfs-factory.bin of=/dev/mmcblk0
-
Reboot the device:
console # reboot
-
Remove the USB drive. The puck will now boot OpenWrt from eMMC.
Flash the Sysupgrade Image
-
Download the latest OpenWrt “sysupgrade” image from the OpenWrt website.
-
Access the puck’s web interface at http://192.168.1.1.
-
Navigate to
System > Backup/Flash Firmware > Flash new firmware image
. -
Upload the sysupgrade image and confirm.
-
The puck will reboot automatically.
Notes
-
If OpenWrt fails to boot from USB, try a different flash drive.
-
If the puck remains in a purple-blink loop, ensure SW7 is pressed at the correct moment.
-
The default OpenWrt user is
root
with no password. Set a password usingpasswd
or in the web interface. -
If installation repeatedly fails, consider re-flashing the official firmware before retrying OpenWrt.
Configuration
Next, we’ll do some basic configuration of OpenWrt. We’ll be setting up three pucks (ada
, fez
, and rio
) in a mesh network with DAWN.
Base Configuration
Initial Access
SSH into the puck using its default IP:
$ ssh root@192.168.1.1
Base Configuration for First Puck (ada)
First, set a root password:
# passwd
Configure the hostname:
# uci set system.@system[0].hostname='ada'
# uci commit system
Set the LAN IP address:
# uci set network.lan.ipaddr='192.168.1.1'
# uci commit network
Reboot:
# reboot
SSH back in using the new IP:
$ ssh root@192.168.1.1
Plug the WAN port into your existing network and verify connectivity:
# ping openwrt.org
Configure the 2.4GHz radio:
# uci set wireless.radio0.disabled='0'
# uci set wireless.radio0.country='US'
# uci set wireless.default_radio0.ssid='S'
# uci set wireless.default_radio0.encryption='psk2'
# uci set wireless.default_radio0.key='topsecret'
Configure the 5GHz radio:
# uci set wireless.radio1.disabled='0'
# uci set wireless.radio1.country='US'
# uci set wireless.radio1.htmode='VHT80'
# uci set wireless.default_radio1.ssid='S'
# uci set wireless.default_radio1.encryption='psk2'
# uci set wireless.default_radio1.key='topsecret'
Install DAWN and its dependencies:
# opkg update
# opkg remove wpad-basic-mbedtls
# opkg install wpad-wolfssl dawn luci-app-dawn
Enable 802.11k and band steering features:
# uci set wireless.default_radio0.ieee80211k='1'
# uci set wireless.default_radio0.bss_transition='1'
# uci set wireless.default_radio1.ieee80211k='1'
# uci set wireless.default_radio1.bss_transition='1'
Configure DAWN:
# uci add dawn dawn
# uci set dawn.@dawn[0].rssi_weight='2'
# uci set dawn.@dawn[0].rssi_center='-65'
# uci set dawn.@dawn[0].kick_method='1'
# uci set dawn.@dawn[0].update_client='10'
Commit all changes and start services:
# uci commit wifi
# /etc/init.d/dawn enable
# /etc/init.d/dawn start
# /etc/init.d/network restart
Reboot:
# reboot
Second Puck (fez)
Follow all steps above, but use these settings instead for hostname and IP:
# uci set system.@system[0].hostname='fez'
# uci set network.lan.ipaddr='192.168.1.2'
# uci commit
Third Puck (rio)
Follow all steps above, but use these settings instead for hostname and IP:
# uci set system.@system[0].hostname='rio'
# uci set network.lan.ipaddr='192.168.1.3'
# uci commit
Disable WAN Port on fez
and rio
# uci set network.wan.disabled='1'
# uci commit network
# /etc/init.d/network restart
Disable Mesh Point Functionality
Since we’ll be using ethernet backhaul, we can disable mesh point functionality on all the pucks.
# uci set wireless.default_radio0.mode='ap'
# uci set wireless.default_radio1.mode='ap'
# uci commit wireless
# wifi