802.3ad LACP between 22.03 and Zyxel switch

Hi everyone,
I have a zyxel XGS2210 switch and wanted to set up LACP to a Belkin RT3200 (Linksys E8450) running OpenWrt 22.03.1 r19777-2853b6d652 / LuCI openwrt-22.03 branch git-22.245.77528-487e58a.

The LACP seem to negotiate the link correctly, but the troughput I get is basically none - the web GUI of the switch, very basic, times out most of the time - when it doesn't every page loads few minutes.

Current config on openwrt:

root@openwrt:~# uci show network.bond0
network.bond0=interface
network.bond0.proto='bonding'
network.bond0.ipaddr='172.16.1.1'
network.bond0.netmask='255.255.255.0'
network.bond0.slaves='lan1' 'lan2'
network.bond0.bonding_policy='802.3ad'
network.bond0.min_links='0'
network.bond0.ad_actor_sys_prio='65535'
network.bond0.ad_select='stable'
network.bond0.lacp_rate='slow'
network.bond0.xmit_hash_policy='layer2+3'
network.bond0.all_slaves_active='0'
network.bond0.link_monitoring='off'
network.bond0.delegate='0'

Luci does not seem to allow not to set an IP on the bond, however bond is added to br-lan along with rest of the ports:

network.@device[0]=device
network.@device[0].name='br-lan'
network.@device[0].type='bridge'
network.@device[0].ipv6='0'
network.@device[0].priority='4096'
network.@device[0].ports='bond-bond0' 'lan3' 'lan4'
...
network.lan.device='br-lan'
network.lan.proto='static'
network.lan.ipaddr='192.168.1.1'

So it should be fine, right?

The lacp seem to work - please correct me if I misunderstand the output:

 cat /proc/net/bonding/bond-bond0
Ethernet Channel Bonding Driver: v5.10.146

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2+3 (2)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Peer Notification Delay (ms): 0

802.3ad info
LACP rate: slow
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: d8:ec:5e:44:09:97
Active Aggregator Info:
        Aggregator ID: 2
        Number of ports: 2
        Actor Key: 9
        Partner Key: 1
        Partner Mac Address: 60:31:97:7a:c2:d7

Slave Interface: lan1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: d8:ec:5e:44:09:97
Slave queue ID: 0
Aggregator ID: 2
Actor Churn State: monitoring
Partner Churn State: monitoring
Actor Churned Count: 0
Partner Churned Count: 0
details actor lacp pdu:
    system priority: 65535
    system mac address: d8:ec:5e:44:09:97
    port key: 9
    port priority: 255
    port number: 1
    port state: 61
details partner lacp pdu:
    system priority: 65535
    system mac address: 60:31:97:7a:c2:d7
    oper key: 1
    port priority: 1
    port number: 2
    port state: 61

Slave Interface: lan2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: d8:ec:5e:44:09:97
Slave queue ID: 0
Aggregator ID: 2
Actor Churn State: monitoring
Partner Churn State: monitoring
Actor Churned Count: 0
Partner Churned Count: 0
details actor lacp pdu:
    system priority: 65535
    system mac address: d8:ec:5e:44:09:97
    port key: 9
    port priority: 255
    port number: 2
    port state: 61
details partner lacp pdu:
    system priority: 65535
    system mac address: 60:31:97:7a:c2:d7
    oper key: 1
    port priority: 1
    port number: 1
    port state: 61

I can ping switch IP from the openwrt just fine and curl is snappy, forwarding me to the login page:

ping 192.168.2.232
PING 192.168.2.232 (192.168.2.232): 56 data bytes
64 bytes from 192.168.2.232: seq=0 ttl=254 time=1.081 ms
64 bytes from 192.168.2.232: seq=1 ttl=254 time=0.563 ms
64 bytes from 192.168.2.232: seq=2 ttl=254 time=0.541 ms
64 bytes from 192.168.2.232: seq=3 ttl=254 time=0.578 ms
64 bytes from 192.168.2.232: seq=4 ttl=254 time=0.592 ms

curl -v http://192.168.2.232
> GET / HTTP/1.1
> Host: 192.168.2.232
> User-Agent: curl/7.85.0
> Accept: */*
>
< HTTP/1.1 303 See Other
< Location: http://192.168.2.232/login.html
< Content-Length: 0
< Server: Allegro-Software-RomPager (lol)
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< Connection: close
<

I am unable to reach the http or ping from the local network (other hosts connected to the dumb switch connected to the port in the same br-lan as the bond0)

ubuntu@test:~$ ping 192.168.2.232
PING 192.168.2.232 (192.168.2.232) 56(84) bytes of data.
^C
--- 192.168.2.232 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2034ms

ubuntu@test:~$ curl -v http://192.168.2.232
*   Trying 192.168.2.232:80...
* connect to 192.168.2.232 port 80 from 192.168.1.23 port 53784 failed: No route to host
* Failed to connect to 192.168.2.232 port 80 after 3085 ms: Couldn't connect to server
* Closing connection
curl: (7) Failed to connect to 192.168.2.232 port 80 after 3085 ms: Couldn't connect to server
                                                                     My traceroute  [v0.95]
transmission (192.168.1.23) -> 192.168.2.232 (192.168.2.232)                                                                           2025-06-08T12:44:57+0000
Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                                                                                                       Packets               Pings
 Host                                                                                                                Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. (no route to host)

Any ideas what am I doing wrong? Is my routing broken?

You need 24.10 for proper lacp operation.
before that fake ip address prevents bond0 acting as a bridge member.

And when upgrading, read the E8450/RT3200 wiki page 1st, it's not a matter of simply uploading the sysupgrade image.

2 Likes

Thanks for the advice @frollic - I was dreading this upgrade xD

1 Like