OpenWRT not responding to router solicitations

I have an IPv6 LAN interface with router advertisements enabled. Devices that connect to it are unable to assign themselves an IP address because they can't receive an RA in time; the router only periodically broadcasts RA messages but does not do so immediately in response to a router solicitation.

I can change the min and max RA intervals to 1 and 10 respectively so that an RA is sent out very frequently, allowing devices to receive an RA in time even without a router solicitation. This fixes the issue and allows connected device to receive router solicitations.

However, this doesn't address the root cause of the issue which is that the router doesn't respond to solicitations. I'm not sure what the problem is here. Any suggestions/areas to look into? I have a firewall rule configured to allow all ICMPv6 requests sent to the router from the LAN firewall zone.

I'm on 25.12.0-rc3 but had the same issue on 24.10.

Try issuing the following command in a terminal window and see if it fixes the problem:
echo 5 > /proc/sys/net/ipv6/conf/$device/router_solicitations
where $device is set to your bridge interface eg br-lan. It will have immediate effect.

This won't survive a reboot, so is safe. If it works there is a config that can be set that should do the same...

It didn't work (bridging is handled by an external device in my setup so I directly used my ethernet device which is attached to the interface without a bridge). The original value was -1 and I changed it to 5 but after increasing the unsolicited RA time devices are again unable to connect as before.

And you wonder why you have problems?

In a router with no bridge, you have to have at least two ethernet interfaces, either physical or switch ports.

What value of $device did you use?

A value of -1 means an error state if I remember correctly. The default would normally be 0 or '1'

It would be useful to show the outputs of:
cat /etc/board.json

uci show network

and

ip addr

I used eth0 which is a port on my router connected to an external WiFi router in bridge mode (the external router is not the problem; my config worked fine a long time ago with this same router and I'm not sure what changed in between). This is because my router is an amd64 PC (or technically a VM on one with the NIC PCIe-passthrough'd) and doesn't come with sufficient ethernet ports to connect multiple devices to LAN or an AP-capable WiFi card.

/etc/board.json:

{
	"model": {
		"id": "qemu-standard-pc-q35-ich9-2009",
		"name": "QEMU Standard PC (Q35 + ICH9, 2009)"
	},
	"network": {
		"lan": {
			"device": "eth0",
			"protocol": "static"
		},
		"wan": {
			"device": "eth1",
			"protocol": "dhcp"
		}
	}
}

uci show network:

etwork.loopback=interface
network.loopback.device='lo'
network.loopback.proto='static'
network.loopback.ipaddr='127.0.0.1'
network.loopback.netmask='255.0.0.0'
network.globals=globals
network.globals.ula_prefix='fdXX:XXXX:XXXX::/48'
network.globals.packet_steering='1'
network.globals.dhcp_default_duid='<redacted>'
network.lan=interface
network.lan.device='eth3'
network.lan.proto='static'
network.lan.ipaddr='10.88.111.1'
network.lan.netmask='255.255.255.0'
network.lan.delegate='0'
network.lan.dns='XXX.XXX.XXX.XXX' 'XXX.XXX.XXX.XXX'
network.lan.defaultroute='0'
network.@device[0]=device
network.@device[0].name='eth0'
network.@device[0].ipv6='1'
network.wan6=interface
network.wan6.proto='6in4'
network.wan6.peeraddr='XXX.XXX.XXX.XXX'
network.wan6.ip6addr='2XXX:XXXX:XXXX:XXXX::2/64'
network.wan6.mtu='1480'
network.wan6.dns='2606:4700:4700::1111' '2606:4700:4700::1001'
network.wan6.ip6prefix='2XXX:XXXX:XXXX::/48'
network.wan6.force_link='1'
network.lan6=interface
network.lan6.proto='static'
network.lan6.ip6assign='64'
network.lan6.ip6class='wan6'
network.lan6.delegate='0'
network.lan6.defaultroute='0'
network.lan6.dns='2620:10a:80bb::10' '2620:10a:80bc::10'
network.lan6.device='eth0'
network.lan6.ip6hint='XXXX'
network.wan=interface
network.wan.proto='dhcp'
network.wan.device='eth2'
network.wan.delegate='0'
network.wan.norelease='1'
network.@device[1]=device
network.@device[1].name='eth1'
network.@device[1].ipv6='0'
network.@device[2]=device
network.@device[2].type='8021q'
network.@device[2].ifname='eth1'
network.@device[2].vid='1'
network.@device[2].name='eth1.1'
network.eth1vl1=interface
network.eth1vl1.proto='static'
network.eth1vl1.device='eth1.1'
network.eth1vl1.defaultroute='0'
network.eth1vl1.delegate='0'
network.eth1vl1.ip6assign='64'
network.eth1vl1.ip6class='wan6'
network.eth1vl1.ip6hint='XXXX'
network.eth1vl1.ip6ifaceid='::1:2'
network.@device[3]=device
network.@device[3].type='8021q'
network.@device[3].ifname='eth1'
network.@device[3].vid='3'
network.@device[3].name='eth1.3'
network.eth1vl3=interface
network.eth1vl3.proto='static'
network.eth1vl3.device='eth1.3'
network.eth1vl3.defaultroute='0'
network.eth1vl3.dns='2606:4700:4700::1111' '2606:4700:4700::1001'
network.eth1vl3.delegate='0'
network.eth1vl3.ip6assign='64'
network.eth1vl3.ip6hint='XXXX'
network.eth1vl3.ip6class='wan6'
network.eth1vl3.ip6ifaceid='::1:2'
network.@device[4]=device
network.@device[4].type='8021q'
network.@device[4].ifname='eth1'
network.@device[4].vid='4'
network.@device[4].name='eth1.4'
network.eth1vl4=interface
network.eth1vl4.proto='static'
network.eth1vl4.device='eth1.4'
network.eth1vl4.defaultroute='0'
network.eth1vl4.delegate='0'
network.eth1vl4.ip6assign='64'
network.eth1vl4.ip6hint='XXXX'
network.eth1vl4.ip6class='wan6'
network.eth1vl4.ip6ifaceid='::1:2'
network.wan4_2=interface
network.wan4_2.proto='ipip'
network.wan4_2.peeraddr='XXX.XXX.XXX.XXX'
network.wan4_2.delegate='0'
network.wan4_2.mtu='1452'
network.wan4_2.ip4table='pstun'
network.wan4_2.defaultroute='0'
network.ps46=interface
network.ps46.proto='ipip6'
network.ps46.force_link='1'
network.ps46.peeraddr='2XXX:XXXX:XXXX:XXXX:5054:ff:fXXX:XXXX'
network.ps46.ip4ifaddr='XXX.XXX.XXX.XXX'
network.ps46.ip6addr='2XXX:XXXX:XXXX:XXXX::1:2'
network.ps46.encaplimit='ignore'
network.ps46.ip4table='pstun'
network.ps46.defaultroute='0'
network.@route[0]=route
network.@route[0].interface='ps46'
network.@route[0].target='XXX.XXX.XXX.XXX/32'
network.@route[0].table='pstun'
network.@route[0].gateway='XXX.XXX.XXX.XXX'
network.@route[1]=route
network.@route[1].interface='wan4_2'
network.@route[1].target='0.0.0.0/0'
network.@route[1].table='pstun'
network.@route[1].gateway='0.0.0.0'
network.@rule[0]=rule
network.@rule[0].lookup='pstun'
network.@rule[0].in='wan4_2'
network.@rule[0].priority='0'
network.@rule[1]=rule
network.@rule[1].lookup='pstun'
network.@rule[1].in='ps46'
network.@rule[1].priority='0'
network.@device[5]=device
network.@device[5].type='8021q'
network.@device[5].ifname='eth1'
network.@device[5].vid='2'
network.@device[5].name='eth1.2'
network.eth1vl2=interface
network.eth1vl2.proto='static'
network.eth1vl2.device='eth1.2'
network.eth1vl2.defaultroute='0'
network.eth1vl2.dns='2620:10a:80bb::10' '2620:10a:80bc::10'
network.eth1vl2.delegate='0'
network.eth1vl2.ip6assign='64'
network.eth1vl2.ip6hint='XXXX'
network.eth1vl2.ip6class='wan6'
network.eth1vl2.ip6ifaceid='::1:2'

(WireGuard tunnel removed)

ip address:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet6 2XXX:XXXX:XXXX:XXXX::1/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fXXX:XXXX/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
4: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
    link/tunnel6 :: brd :: permaddr XXXX:XXXX:XXXX::
5: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
6: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
7: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet XXX.XXX.XXX.XXX/25 brd XXX.XXX.XXX.127 scope global eth2
       valid_lft forever preferred_lft forever
    inet6 fe80::XXXX:XXXX:XXXX:XXXX/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
8: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 10.88.111.1/24 brd 10.88.111.255 scope global eth3
       valid_lft forever preferred_lft forever
    inet6 fe80::XXXX:XXXX:XXXX:XXXX/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
9: eth1.1@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet6 2XXX:XXXX:XXXX:XXXX::1:2/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fXXX:XXXX/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
10: eth1.2@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet6 2XXX:XXXX:XXXX:XXXX::1:2/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fXXX:XXXX/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
11: eth1.3@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet6 2XXX:XXXX:XXXX:XXXX::1:2/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fXXX:XXXX/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
12: eth1.4@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet6 2XXX:XXXX:XXXX:XXXX::1:2/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fXXX:XXXX/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
13: wglan6: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet6 2XXX:XXXX:XXXX:XXXX::1/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
14: 6in4-wan6@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
    link/sit XXX.XXX.XXX.XXX peer XXX.XXX.XXX.XXX
    inet6 2XXX:XXXX:XXXX:XXXX::2/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::XXXX:XXXX/64 scope link 
       valid_lft forever preferred_lft forever
15: ipip-wan4_2@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ipip XXX.XXX.XXX.XXX peer XXX.XXX.XXX.XXX
    inet6 fe80::XXXX:XXXX:XXXX:XXXX/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
16: ipip6-ps46@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1280 qdisc noqueue state UNKNOWN group default qlen 1000
    link/tunnel6 2XXX:XXXX:XXXX:XXXX::1:2 peer XXXX:XXXX:XXXX:XXXX:5054:ff:fXXX:XXXX permaddr XXXX:XXXX:XXXX::
    inet XXX.XXX.XXX.XXX/32 brd 255.255.255.255 scope global ipip6-ps46
       valid_lft forever preferred_lft forever
    inet6 fe80::XXXX:XXXX:XXXX:XXXX/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

Running OpenWrt on a VM on limited hardware is a nice hobby project but seriously is not suitable for long term "production" use, particularly when you can get a purpose designed router with more than ample network ports, cpu power, ram and storage for $doublefigures.

That aside, your config seems very unusual and immensely complex even for a wireguard system.
If you say it worked previously, it is not that I don't believe you, but more that I am not at all surprised it does not work now.

It would take a great deal of effort to unravel what you are trying to do and in my opinion it is the wrong direction to be going in entirely. So I will bow out on this one, sorry.

1 Like

Did you set the sysctl accept_ra?

Edit. Ups forget it. I misread your post. Sorry.