I compiled from source a custom firmware image for the WRX36. I'm pretty happy with how it is performing, and figured Id share it.
LINK to firmware (hosted on github)
The firmware images are in the targets/qualcommax/ipq807x folder. There are also a whole bunch of "extra" .ipk packages that I built but didnt install (including most of the possible kernel modules).
If you have any comments / suggestions / bug-reports let me know. I hope some of you will find this useful.
It is worth mentioning that this firmware is a bit different from a "standard" build in several ways. Refer to the extras folder for the exact .config files and custom configuration files that went into the build, but I'll highlight a few key differences here:
1. DNS/DHCP
It uses unbound
(with DNSSEC) + odhcpd
for DNS/DHCP (note: dnsmasq
isnt installed). Adblock is also included, which integrates automatically with unbound. This should all be set up and ready to go on the first bootup.
Note: unbound has been compiled with everything optional (except python support) compiled in. It is set up to default to be a validating recursive resolver, with settings more aggressive than the "max" openwrt preset.
2. Compiler optimizations
It was compiled with -03 -march=cortex-a53+crc+crypto
optimization flags with link time optimization (LTO) + dead code elimination using mold
as the linker
3. Full software suite
It probably has more than you'll really need/want (the firmware image is ~50 mb), but i figure that Im better off compiling everything I might want to use at some point into the squashfs image (where it takes up a quarter of the space) than installing it on the overlay later on.
It includes (but isnt limited to):
- full versions of several network utilities (wpan, ip, iw, ethtool),
- ksmbd support + code to easily run an on-router plex media server + drivers/kmods for usb-attached storage
- bash + vim + other miscellanious useful cli programs
- support for various network protocols and ffile transfer protocols: SNMP, TFTP, full-featured wget and curl
4. Custom kernel
Kernel settings were tweaked in a number of ways: enabling only cortex-a53 erratum, enabling better multithreading support, enabling memory compaction, enabling crypto functions that use armv8 crypto extensions, fixing a bug where the assembler 's -march
and the -DASM_ARM_ARCH flag were being incorrectly set to armv8.5-a`, etc. (note: i didnt fool with the "network" or "drivers" sections of the kernel config)
One last noteworthy kernel tweak is that I made the kernel fully preemptable and set it to use a 1000 Hz timer. This may have dropped the total throughput of the kernel slightly, but it can still handle my 1000/500 fiber connection and has done wonders for latency jitter. a few speedtests are provided in the repo's "extras" folder, but to give an example: running
ping -c 100 -U -A gstatic.com
the overall statistics for the set of all 100 pings was
--- gstatic.com ping statistics ---
100 packets transmitted, 100 received, 0% packet loss, time 2295ms
rtt min/avg/max/mdev = 21.851/21.974/22.120/0.060 ms, ipg/ewma 23.177/21.955 ms
The overall spread for all 100 pings was about 1/4 of a second, and the std deviation was only 60 ms.
speedtest-petperf.sh
was giving me results like
Download: 900.25 Mbps
Latency: [in msec, 31 pings, 0.00% packet loss]
Min: 21.900
10pct: 22.000
Median: 22.700
Avg: 24.352
90pct: 28.900
Max: 31.000
Indicating at 90% saturation of my connection my pings were on average about 2.5 ms and at worse about 9ms. Not bad.
The