There are several topics similar to this one, but none of the answers provided there solved my problem.
Summary: IPv6 works fine, both DHCPv6 and SLAAC, for all devices on my LAN except Android devices. I'm using dnsmasq for IPv4 and odhcpd for IPv6.
IPv6 on the same Android devices works on other networks. It used to work on those Android devices, and either a change to Android, OpenWRT, or my settings broke it. I know Android has the SLAAC only IPv6 setup, so I have confirmed that IPv6 works with other devices when I force them to use SLAAC.
My ISP gives me a /60, and my OpenWRT router picks a /64 for LAN and uses that to hand addresses out to various devices. All sensible and normal.
Android devices receive two GUA addresses and a ULA address, but cannot use IPv6. This seems to be because no default IPv6 route is set.
Android routes when IPv6 does NOT work
Route: fe80::/64 -> :: wlan1 mtu 0
Route: 2001:db8:6500:ae97::/60 -> fe80::f6f2:6dff:fe70:3132 wlan1 mtu 0
Route: 2001:db8:6500:ae97::/64 -> :: wlan1 mtu 0
Route: 192.168.1.0/24 -> 0.0.0.0 wlan1 mtu 0
Route: 0.0.0.0/0 -> 192.168.1.6 wlan1 mtu 0
Gateway: 192.168.1.6
Android routes when IPv6 does work
Route: fe80::/64 -> :: wlan1 mtu 0
Route: ::/0 -> fe80::9258:51ff:febb:b19c wlan1 mtu 0
Route: 2001:db8:4650:08dc::/64 -> :: wlan1 mtu 0
Route: 10.0.0.0/24 -> 0.0.0.0 wlan1 mtu 0
Route: 0.0.0.0/0 -> 10.0.0.1 wlan1 mtu 0
Gateway: 10.0.0.1
The missing ::/0
route probably explains why Android can't use IPv6, but why is the route missing?
Here are the relevant configuration sections from my router:
/etc/config/network
config interface 'lan'
option proto 'static'
option ipaddr '192.168.169.6'
option netmask '255.255.255.0'
option ip6assign '64'
option stp '1'
option device 'br-lan'
option delegate '0'
config interface 'wan6'
option proto 'dhcpv6'
list dns '2606:4700:4700::1111'
list dns '2606:4700:4700::1001'
option reqaddress 'try'
option peerdns '0'
option reqprefix 'auto'
option device 'eth0.2'
/etc/config/dhcp
config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '1h'
option ra 'server'
option dhcpv6 'server'
list ra_flags 'managed-config'
list ra_flags 'other-config'
option ra_maxinterval '600'
option ra_mininterval '200'
option ra_lifetime '1800'
option ra_mtu '1500'
option ra_hoplimit '64'
config odhcpd 'odhcpd'
option maindhcp '0'
option leasefile '/tmp/hosts/odhcpd'
option leasetrigger '/usr/sbin/odhcpd-update'
option loglevel '6'
Anything obviously wrong? Tips to debug this? Solutions?