About
Ubiquiti’s Bullet M line includes the Bullet M2HP along with three other devices. The bullet radios (and other Ubiquiti devices) have two different hardware revisions: the older XM and the newer XW (see Choosing the Correct Device Firmware on Ubiquiti Support). This page applies to the Bullet M2HP XW specifically.
Installing OpenWrt 19.07.5
The OpenWrt operating system provides several advantages over the stock Ubiquiti firmware, including more features in the standard distribution, a large set of additional packages that can be installed, and the possibility of a common operating system across different types and models of embedded hardware.
Unfortunately Ubiquiti’s devices use signed firmware which prevents a straightforward installation of alternative firmware such as OpenWrt. However, True Systems has shared two workarounds for this in a GitHub repository. The following steps worked for me with OpenWrt 19.07.5 and a Bullet M2HP XW.
Download the official AirOS XW.v6.1.7.32555.180523.1754.bin firmware from Ubiquiti. Install it using the normal procedure via the web interface.
$ wget 'https://dl.ui.com/firmwares/XW-fw/v6.1.7/XW.v6.1.7.32555.180523.1754.bin' $ sha256sum XW.v6.1.7.32555.180523.1754.bin c6e36003ab82b588936b558dfaf06fd2e54e3bd63b84f17687e023de55f05b23 XW.v6.1.7.32555.180523.1754.binReset the router to factory defaults using the web interface.
Make sure you can ping the router and log in via SSH. The default password is ubnt. If you get no matching host key type found then add the following to your ~/.ssh/config:
Host 192.168.1.20 HostKeyAlgorithms ssh-dss$ ping -c2 192.168.1.20 PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data. 64 bytes from 192.168.1.20: icmp_seq=1 ttl=64 time=0.718 ms 64 bytes from 192.168.1.20: icmp_seq=2 ttl=64 time=0.714 ms --- 192.168.1.20 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 14ms rtt min/avg/max/mdev = 0.714/0.716/0.718/0.002 ms$ ssh ubnt@192.168.1.20 ubnt@192.168.1.20's password: XW.v6.1.7# exitClone the true-systems/ubnt-openwrt-flashing repository and make it your current working directory. Update the username and/or IP address in the Makefile if necessary (it should match the SSH user@hostname destination used in the previous step).
$ git clone https://github.com/true-systems/ubnt-openwrt-flashing $ cd ubnt-openwrt-flashing/ $ git rev-parse HEAD 9a8fb9f0bb131aae6449771ead59190528956c73 $ grep ^REMOTE_UBNT Makefile REMOTE_UBNT ?= ubnt@192.168.1.20Download the OpenWrt 19.07.5 factory image for the device.
$ wget 'https://downloads.openwrt.org/releases/19.07.5/targets/ath79/generic/openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin' $ sha256sum openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin e2784584dc8a0dc8fca775d98ebac4796f94e85bde8f422b944511bb834be3b5 openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.binRun the automated flashing process. A backup of the stock firmware will be saved to firmware-backup.bin—you may want to keep this file in case it is necessary to revert to the stock firmware in the future.
1
$ make flash-factory FW_OWRT=openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin2scp ubnt@192.168.1.20:/sbin/ubntbox ubntbox3ubnt@192.168.1.20's password:4ubntbox 100% 698KB 1.5MB/s 00:005ssh-copy-id ubnt@192.168.1.206/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_rsa.pub"7/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed8/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys9ubnt@192.168.1.20's password:1011Number of key(s) added: 11213Now try logging into the machine, with: "ssh 'ubnt@192.168.1.20'"14and check to make sure that only the key(s) you wanted were added.1516Creating factory firmware backup17ssh ubnt@192.168.1.20 "cat /dev/mtd2 /dev/mtd3" > firmware-backup.bin18ssh ubnt@192.168.1.20 "umount /tmp; mount -t tmpfs tmpfs /tmp"19umount: can't unmount /tmp: Invalid argument20scp ubntbox.patched ubnt@192.168.1.20:/tmp/fwupdate.real21ubntbox.patched 100% 698KB 1.3MB/s 00:0022scp openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin ubnt@192.168.1.20:/tmp23openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw 100% 4096KB 1.3MB/s 00:0324ssh ubnt@192.168.1.20 "/tmp/fwupdate.real -m /tmp/openwrt-19.07.5-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin -d 2>&1" | tee flash-factory.log25Found mtd block: /dev/mtd0(u-boot)26Found mtd block: /dev/mtd1(u-boot-env)27Found mtd block: /dev/mtd2(kernel)28Found mtd block: /dev/mtd3(rootfs)29Found mtd block: /dev/mtd4(cfg)30Found mtd block: /dev/mtd5(EEPROM)31Got U-Boot variable: mtdparts = mtdparts=ath-nor0:256k(u-boot),64k(u-boot-env),1024k(kernel),6528k(rootfs),256k(cfg),64k(EEPROM)32Adding U-Boot partition: u-boot 9F000000 0004000033Adding U-Boot partition: u-boot-env 9F040000 0001000034Adding U-Boot partition: kernel 9F050000 0010000035Adding U-Boot partition: rootfs 9F150000 0066000036Adding U-Boot partition: cfg 9F7B0000 0004000037Adding U-Boot partition: EEPROM 9F7F0000 0001000038Calculating flash size:39Adding block: /dev/mtd0("u-boot") - size: 0004000040Adding block: /dev/mtd1("u-boot-env") - size: 0001000041Adding block: /dev/mtd2("kernel") - size: 0010000042Adding block: /dev/mtd3("rootfs") - size: 0066000043Adding block: /dev/mtd4("cfg") - size: 0004000044Adding block: /dev/mtd5("EEPROM") - size: 0001000045Total flash size: 0080000046Flash start: 9F00000047Flash end: 9F80000048Header MAGIC 'OPEN'49Current: XW.ar934x.v6.1.7.32555.180523.17545051New ver: XW.ar934x.v6.0.4-42.OpenWrt-r11257-5090152ae352Versions: New(393220) 6.0.4, Required(393220) 6.0.453FW Part: "kernel"(1), MAGIC: 'PART', Base: 0x9F050000, DLen: 0x00100000, PLen: 0x0010000054FW Part: "rootfs"(2), MAGIC: 'PART', Base: 0x9F150000, DLen: 0x00300004, PLen: 0x0066000055Signature verified56Signature MAGIC 'END.'57FW Part: "kernel"(1), MAGIC: 'PART', Base: 0x9F050000, DLen: 0x00100000, PLen: 0x0010000058FW Part: "rootfs"(2), MAGIC: 'PART', Base: 0x9F150000, DLen: 0x00300004, PLen: 0x0066000059Adding adjusted FW partition:60name:'kernel'61flash_base:0x9F05000062mem_base:0x8000200063size:0x0010000064entry_point:0x8000200065data_len:0x0010000066desc_cksum:0x0000000067file_cksum:0x0000000068===========================69Adding adjusted FW partition:70name:'rootfs'71flash_base:0x9F15000072mem_base:0xBDBDBDBD73size:0x0066000074entry_point:0xBDBDBDBD75data_len:0x0030000476desc_cksum:0x0000000077file_cksum:0x0000000078===========================79Signature MAGIC 'END.'80Working(1) with block: /dev/mtd081Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F050000 < blk->base: 9F000000 + blk->size: 4000082Copying FIS partition: 0 =>83name:'u-boot'84flash_base:0x9F00000085mem_base:0xBDBDBDBD86size:0x0004000087entry_point:0xBDBDBDBD88data_len:0x0004000089desc_cksum:0xBDBDBDBD90file_cksum:0xBDBDBDBD91===========================92Working(1) with block: /dev/mtd193Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F050000 < blk->base: 9F040000 + blk->size: 1000094Copying FIS partition: 1 =>95name:'u-boot-env'96flash_base:0x9F04000097mem_base:0xBDBDBDBD98size:0x0001000099entry_point:0xBDBDBDBD100data_len:0x00010000101desc_cksum:0xBDBDBDBD102file_cksum:0xBDBDBDBD103===========================104Working(1) with block: /dev/mtd2105Working(2) with block: /dev/mtd2106End check: 9F050000 + 00100000 <= 9F150000107Creating FIS partition: 2 =>108name:'kernel'109flash_base:0x9F050000110mem_base:0x80002000111size:0x00100000112entry_point:0x80002000113data_len:0x00100000114desc_cksum:0x00000000115file_cksum:0x00000000116===========================117Working(1) with block: /dev/mtd2118Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F150000 < blk->base: 9F050000 + blk->size: 100000119Working(1) with block: /dev/mtd3120Working(2) with block: /dev/mtd3121End check: 9F150000 + 00660000 <= 9F7B0000122Creating FIS partition: 3 =>123name:'rootfs'124flash_base:0x9F150000125mem_base:0xBDBDBDBD126size:0x00660000127entry_point:0xBDBDBDBD128data_len:0x00300004129desc_cksum:0x00000000130file_cksum:0x00000000131===========================132Working(3) with block: /dev/mtd4133Copying FIS partition: 4 <=134name:'cfg'135flash_base:0x9F7B0000136mem_base:0xBDBDBDBD137size:0x00040000138entry_point:0xBDBDBDBD139data_len:0x00040000140desc_cksum:0xBDBDBDBD141file_cksum:0xBDBDBDBD142===========================143Working(3) with block: /dev/mtd5144Copying FIS partition: 5 <=145name:'EEPROM'146flash_base:0x9F7F0000147mem_base:0xBDBDBDBD148size:0x00010000149entry_point:0xBDBDBDBD150data_len:0x00010000151desc_cksum:0xBDBDBDBD152file_cksum:0xBDBDBDBD153===========================154New FIS entries count 6155Executing: '/bin/updatefix.sh 393479 393220'156Current ver: 393479157New version: 393220158No need to fix.159'/bin/updatefix.sh 393479 393220' result: 0160Working(1) with block: /dev/mtd0161Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F050000 < blk->base: 9F000000 + blk->size: 40000162Copying FIS partition: 0 =>163name:'u-boot'164flash_base:0x9F000000165mem_base:0xBDBDBDBD166size:0x00040000167entry_point:0xBDBDBDBD168data_len:0x00040000169desc_cksum:0xBDBDBDBD170file_cksum:0xBDBDBDBD171===========================172Working(1) with block: /dev/mtd1173Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F050000 < blk->base: 9F040000 + blk->size: 10000174Copying FIS partition: 1 =>175name:'u-boot-env'176flash_base:0x9F040000177mem_base:0xBDBDBDBD178size:0x00010000179entry_point:0xBDBDBDBD180data_len:0x00010000181desc_cksum:0xBDBDBDBD182file_cksum:0xBDBDBDBD183===========================184Working(1) with block: /dev/mtd2185Working(2) with block: /dev/mtd2186Unlocking /dev/mtd2(kernel) ...187Unlocking device failed: ioctl(MEMUNLOCK): Operation not supported188Writing 'kernel ' to /dev/mtd2(kernel ) ...189Writing: 0x00100000 bytes with offset 0x00000000190[%0 ]191Block on '/dev/mtd2' at 00000000(len: 00010000) has changes. [%6 ]192Block on '/dev/mtd2' at 00010000(len: 00010000) has changes. [%12 ]193Block on '/dev/mtd2' at 00020000(len: 00010000) has changes. [%18 ]194Block on '/dev/mtd2' at 00030000(len: 00010000) has changes. [%25 ]195Block on '/dev/mtd2' at 00040000(len: 00010000) has changes. [%31 ]196Block on '/dev/mtd2' at 00050000(len: 00010000) has changes. [%37 ]197Block on '/dev/mtd2' at 00060000(len: 00010000) has changes. [%43 ]198Block on '/dev/mtd2' at 00070000(len: 00010000) has changes. [%50 ]199Block on '/dev/mtd2' at 00080000(len: 00010000) has changes. [%56 ]200Block on '/dev/mtd2' at 00090000(len: 00010000) has changes. [%62 ]201Block on '/dev/mtd2' at 000A0000(len: 00010000) has changes. [%68 ]202Block on '/dev/mtd2' at 000B0000(len: 00010000) has changes. [%75 ]203Block on '/dev/mtd2' at 000C0000(len: 00010000) has changes. [%81 ]204Block on '/dev/mtd2' at 000D0000(len: 00010000) has changes. [%87 ]205Block on '/dev/mtd2' at 000E0000(len: 00010000) has changes. [%93 ]206Block on '/dev/mtd2' at 000F0000(len: 00010000) has changes. [%100]207208End check: 9F050000 + 00100000 <= 9F150000209Creating FIS partition: 2 =>210name:'kernel'211flash_base:0x9F050000212mem_base:0x80002000213size:0x00100000214entry_point:0x80002000215data_len:0x00100000216desc_cksum:0x00000000217file_cksum:0x00000000218===========================219Working(1) with block: /dev/mtd2220Skipping: artificial: 0, unallocated: 0,writeable: 1024(WRITEABLE: 400, flags: C00), fw.flash_base: 9F150000 < blk->base: 9F050000 + blk->size: 100000221Working(1) with block: /dev/mtd3222Working(2) with block: /dev/mtd3223Unlocking /dev/mtd3(rootfs) ...224Unlocking device failed: ioctl(MEMUNLOCK): Operation not supported225Writing 'rootfs ' to /dev/mtd3(rootfs ) ...226Writing: 0x00300004 bytes with offset 0x00000000227[%0 ]228Block on '/dev/mtd3' at 00000000(len: 00010000) has changes. [%2 ]229Block on '/dev/mtd3' at 00010000(len: 00010000) has changes. [%4 ]230Block on '/dev/mtd3' at 00020000(len: 00010000) has changes. [%6 ]231Block on '/dev/mtd3' at 00030000(len: 00010000) has changes. [%8 ]232Block on '/dev/mtd3' at 00040000(len: 00010000) has changes. [%10 ]233Block on '/dev/mtd3' at 00050000(len: 00010000) has changes. [%12 ]234Block on '/dev/mtd3' at 00060000(len: 00010000) has changes. [%14 ]235Block on '/dev/mtd3' at 00070000(len: 00010000) has changes. [%16 ]236Block on '/dev/mtd3' at 00080000(len: 00010000) has changes. [%18 ]237Block on '/dev/mtd3' at 00090000(len: 00010000) has changes. [%20 ]238Block on '/dev/mtd3' at 000A0000(len: 00010000) has changes. [%22 ]239Block on '/dev/mtd3' at 000B0000(len: 00010000) has changes. [%24 ]240Block on '/dev/mtd3' at 000C0000(len: 00010000) has changes. [%27 ]241Block on '/dev/mtd3' at 000D0000(len: 00010000) has changes. [%29 ]242Block on '/dev/mtd3' at 000E0000(len: 00010000) has changes. [%31 ]243Block on '/dev/mtd3' at 000F0000(len: 00010000) has changes. [%33 ]244Block on '/dev/mtd3' at 00100000(len: 00010000) has changes. [%35 ]245Block on '/dev/mtd3' at 00110000(len: 00010000) has changes. [%37 ]246Block on '/dev/mtd3' at 00120000(len: 00010000) has changes. [%39 ]247Block on '/dev/mtd3' at 00130000(len: 00010000) has changes. [%41 ]248Block on '/dev/mtd3' at 00140000(len: 00010000) has changes. [%43 ]249Block on '/dev/mtd3' at 00150000(len: 00010000) has changes. [%45 ]250Block on '/dev/mtd3' at 00160000(len: 00010000) has changes. [%47 ]251Block on '/dev/mtd3' at 00170000(len: 00010000) has changes. [%49 ]252Block on '/dev/mtd3' at 00180000(len: 00010000) has changes. [%52 ]253Block on '/dev/mtd3' at 00190000(len: 00010000) has changes. [%54 ]254Block on '/dev/mtd3' at 001A0000(len: 00010000) has changes. [%56 ]255Block on '/dev/mtd3' at 001B0000(len: 00010000) has changes. [%58 ]256Block on '/dev/mtd3' at 001C0000(len: 00010000) has changes. [%60 ]257Block on '/dev/mtd3' at 001D0000(len: 00010000) has changes. [%62 ]258Block on '/dev/mtd3' at 001E0000(len: 00010000) has changes. [%64 ]259Block on '/dev/mtd3' at 001F0000(len: 00010000) has changes. [%66 ]260Block on '/dev/mtd3' at 00200000(len: 00010000) has changes. [%68 ]261Block on '/dev/mtd3' at 00210000(len: 00010000) has changes. [%70 ]262Block on '/dev/mtd3' at 00220000(len: 00010000) has changes. [%72 ]263Block on '/dev/mtd3' at 00230000(len: 00010000) has changes. [%74 ]264Block on '/dev/mtd3' at 00240000(len: 00010000) has changes. [%77 ]265Block on '/dev/mtd3' at 00250000(len: 00010000) has changes. [%79 ]266Block on '/dev/mtd3' at 00260000(len: 00010000) has changes. [%81 ]267Block on '/dev/mtd3' at 00270000(len: 00010000) has changes. [%83 ]268Block on '/dev/mtd3' at 00280000(len: 00010000) has changes. [%85 ]269Block on '/dev/mtd3' at 00290000(len: 00010000) has changes. [%87 ]270Block on '/dev/mtd3' at 002A0000(len: 00010000) has changes. [%89 ]271Block on '/dev/mtd3' at 002B0000(len: 00010000) has changes. [%91 ]272Block on '/dev/mtd3' at 002C0000(len: 00010000) has changes. [%93 ]273Block on '/dev/mtd3' at 002D0000(len: 00010000) has changes. [%95 ]274Block on '/dev/mtd3' at 002E0000(len: 00010000) has changes. [%97 ]275Block on '/dev/mtd3' at 002F0000(len: 00010000) has changes. [%99 ]276Block on '/dev/mtd3' at 00300000(len: 00000004) has changes. [%100]277278End check: 9F150000 + 00660000 <= 9F7B0000279Creating FIS partition: 3 =>280name:'rootfs'281flash_base:0x9F150000282mem_base:0xBDBDBDBD283size:0x00660000284entry_point:0xBDBDBDBD285data_len:0x00300004286desc_cksum:0x00000000287file_cksum:0x00000000288===========================289Working(3) with block: /dev/mtd4290Copying FIS partition: 4 <=291name:'cfg'292flash_base:0x9F7B0000293mem_base:0xBDBDBDBD294size:0x00040000295entry_point:0xBDBDBDBD296data_len:0x00040000297desc_cksum:0xBDBDBDBD298file_cksum:0xBDBDBDBD299===========================300Working(3) with block: /dev/mtd5301Copying FIS partition: 5 <=302name:'EEPROM'303flash_base:0x9F7F0000304mem_base:0xBDBDBDBD305size:0x00010000306entry_point:0xBDBDBDBD307data_len:0x00010000308desc_cksum:0xBDBDBDBD309file_cksum:0xBDBDBDBD310===========================311New FIS entries count 6312FIS Change: change in partition entry 'kernel'.313FIS Change: change in partition entry 'rootfs'.314FIS Change: added partition terminator instead of 0xBD.315New partition count: 6, changes: 3316DoneAt this point, or soon after, OpenWrt should be running and accessible at 192.168.1.1. You may need to press Ctrl-C to exit, due to the SSH session not being terminating properly when the final firmware update completes, but make sure you don’t interrupt any part of the flashing process (if in doubt, wait).
Updating OpenWrt
Once OpenWrt has been installed, it can be updated with an OpenWrt sysupgrade image.
An OpenWrt sysupgrade has been tested with OpenWrt 19.07.10 and with r25153-869df9ecdf.
$ sha256sum openwrt-19.07.10-ath79-generic-ubnt_bullet-m-xw-squashfs-sysupgrade.bin
806ddc698b545b97ce3ed9d6cf4830de5c24da9ba31d1f1040be9f3d4e5a4965 openwrt-19.07.10-ath79-generic-ubnt_bullet-m-xw-squashfs-sysupgrade.bin
Using TFTP recovery
If something goes wrong at some point after a successful installation of OpenWrt (for example a failed upgrade or corrupted filesystem) and you need to flash OpenWrt again, you can use TFTP recovery as follows.
Download the OpenWrt factory image to be flashed to the device. Save this file to /tmp/openwrt.bin or a similar location.
$ sha256sum openwrt-19.07.8-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.bin d0f3fbdba489026fab60872f0646f43eb691eb2b27af014a4656c2f2ac69ca24 openwrt-19.07.8-ath79-generic-ubnt_bullet-m-xw-squashfs-factory.binInstall the tftp tool. On Debian GNU/Linux for example, run apt install tftp.
Disconnect power from the device. Use a paperclip to press and hold the reset button (either on the device or on the power-over-Ethernet injector, if it has one). While holding the reset button, connect power. Wait 25 seconds, or until the LED indicates upgrade mode is active; then release the button.
Change to the OpenWrt image location, run tftp, and enter the commands shown here:
$ cd /tmp $ tftp tftp> connect 192.168.1.20 tftp> binary tftp> rexmt 1 tftp> timeout 60 tftp> put openwrt.binThe file should begin transferring. When it completes, you should see Sent 4194716 bytes in 2.5 seconds (for example). The device will flash the firmware and reboot when it is finished (do not reboot it yourself). Once it is finished, you should be able to connect to the router at 192.168.1.1.
Restoring the stock firmware
Before the OpenWrt image is flashed in the previous section, a backup of the AirOS v6.1.7 firmware is written to firmware-backup.bin. To restore this firmware, use the corresponding make target, providing the correct SSH user@hostname destination for the device. See Restore from OpenWrt back to factory image in the true-systems/ubnt-openwrt-flashing README.
This worked for me from OpenWrt 19.07.8.
$ cd ubnt-openwrt-flashing/
$ stat -c "%s bytes" firmware-backup.bin
7733248 bytes
$ sha256sum firmware-backup.bin
b0fb2d237cc689402b0a6d4bb8adf9f5f97748ee23f03c5bc7b4b0a69b30e357 firmware-backup.bin
$ make restore REMOTE_OWRT=root@192.168.1.1
(Your firmware backup may not be the same as the one I tested.)
Credits
OpenWrt is an excellent Linux distribution for embedded devices.
True Systems shared two ways to work around Ubiquiti’s firmware signing, one of which is shown here.
See also
Ubiquiti Bullet M2 / M5 on the OpenWrt wiki
The true-systems/ubnt-openwrt-flashing repository on GitHub
AirMAX M Series Downloads from Ubiquiti
Ubiquiti Bullet versions compared on data-alliance
UniFi - TFTP Recovery for Bricked Access Points on Ubiquiti Support
Changes
2024-02-15: Add details about the Ethernet fix
2024-02-08: Update source repository commit and remove scp -O step that is now unnecessary
2023-10-21: Use AirOS default settings, add temporary SSH host configuration, update source repository commit, add scp -O option, update tested OpenWrt version to 19.07.10
2022-02-24: Updated the warning about OpenWrt 21.02.1
2022-02-12: Updated Restoring the stock firmware section since testing the restore process
2022-01-28: Added the Using TFTP recovery section
2022-01-28: Added a warning about OpenWrt 21.02.1 in the Updating OpenWrt section
2022-01-28: Updated the true-systems/ubnt-openwrt-flashing repository commit (no relevant changes upstream)
2021-04-03: Added the Updating OpenWrt section
Email
LinkedIn
Twitter
Reddit
Facebook