Poor upload performance on 24.10 PPPoE

I have normally around 900/900 speeds from my ISP. I set up my EdgeRouter X SFP with latest openWRT, HW offloading is on, Packet Steering is Enabled (all CPUs). My download speeds over cable are as expected, but my upload is somehow capped at around 120 Mbps. I have ISP modem set up with PPPoE passthrough over ethernet cable into eth0 of the edgerouter. I am using MTU 1492 for the port and the pppoe tunnel, since that is what modem has set up too. I don't know what else to try. Any ideas are appreciated. Thank you.

MediaTek MT7621AT

You get 300-400Mbps nat/routing without offloads, 600-900 with sw offload, close to 1800 (full bidirectional gigabit) with hardware offload.

Lets revisit your config.
Do you expect wifi (or wired ti wifi) roaming between LAN ports?

Please connect to your OpenWrt device using ssh and copy the output of the following commands and post it here using the "Preformatted text </> " button:
grafik
Remember to redact passwords, MAC addresses and any public IP addresses you may have:

ubus call system board
cat /etc/config/network
cat /etc/config/dhcp
cat /etc/config/firewall
{
	"kernel": "6.6.93",
	"hostname": "OpenWrt",
	"system": "MediaTek MT7621 ver:1 eco:3",
	"model": "Ubiquiti EdgeRouter X SFP",
	"board_name": "ubnt,edgerouter-x-sfp",
	"rootfs_type": "squashfs",
	"release": {
		"distribution": "OpenWrt",
		"version": "24.10.2",
		"revision": "r28739-d9340319c6",
		"target": "ramips/mt7621",
		"description": "OpenWrt 24.10.2 r28739-d9340319c6",
		"builddate": "1750711236"
	}
}

I actually found the culprit. I was trying out stock firmware, then returning to openWRT 23 and managed to brick the device. I recovered but then I connected the router to the modem without the PPPoE passthrough, so setting wan as DHCP and using the modem as a middleman. I get normal speeds now. How is it possible that over PPPoE upload speeds are suffering this much?

config interface 'loopback'
	option device 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix 'fd36:e867:8616::/48'
	option packet_steering '2'

config device
	option name 'br-lan'
	option type 'bridge'
	list ports 'eth1'
	list ports 'eth2'
	list ports 'eth3'
	list ports 'eth4'
	list ports 'eth5'

config interface 'lan'
	option device 'br-lan'
	option proto 'static'
	option ipaddr '192.168.7.1'
	option netmask '255.255.255.0'
	option ip6assign '60'

config interface 'wan'
	option device 'eth0'
	option proto 'dhcp'

config interface 'wan6'
	option device 'eth0'
	option proto 'dhcpv6'
config dnsmasq
	option domainneeded '1'
	option boguspriv '1'
	option filterwin2k '0'
	option localise_queries '1'
	option rebind_protection '1'
	option rebind_localhost '1'
	option local '/lan/'
	option domain 'lan'
	option expandhosts '1'
	option nonegcache '0'
	option cachesize '1000'
	option authoritative '1'
	option readethers '1'
	option leasefile '/tmp/dhcp.leases'
	option resolvfile '/tmp/resolv.conf.d/resolv.conf.auto'
	option nonwildcard '1'
	option localservice '1'
	option ednspacket_max '1232'
	option filter_aaaa '0'
	option filter_a '0'

config dhcp 'lan'
	option interface 'lan'
	option start '100'
	option limit '150'
	option leasetime '12h'
	option dhcpv4 'server'
	option dhcpv6 'server'
	option ra 'server'
	list ra_flags 'managed-config'
	list ra_flags 'other-config'

config dhcp 'wan'
	option interface 'wan'
	option ignore '1'

config odhcpd 'odhcpd'
	option maindhcp '0'
	option leasefile '/tmp/hosts/odhcpd'
	option leasetrigger '/usr/sbin/odhcpd-update'
	option loglevel '4'

config defaults
	option input 'REJECT'
	option output 'ACCEPT'
	option forward 'REJECT'
	option synflood_protect '1'
	option flow_offloading '1'
	option flow_offloading_hw '1'

config zone
	option name 'lan'
	option input 'ACCEPT'
	option output 'ACCEPT'
	option forward 'ACCEPT'
	list network 'lan'

config zone
	option name 'wan'
	option input 'REJECT'
	option output 'ACCEPT'
	option forward 'REJECT'
	option masq '1'
	option mtu_fix '1'
	list network 'wan'
	list network 'wan6'

config forwarding
	option src 'lan'
	option dest 'wan'

config rule
	option name 'Allow-DHCP-Renew'
	option src 'wan'
	option proto 'udp'
	option dest_port '68'
	option target 'ACCEPT'
	option family 'ipv4'

config rule
	option name 'Allow-Ping'
	option src 'wan'
	option proto 'icmp'
	option icmp_type 'echo-request'
	option family 'ipv4'
	option target 'ACCEPT'

config rule
	option name 'Allow-IGMP'
	option src 'wan'
	option proto 'igmp'
	option family 'ipv4'
	option target 'ACCEPT'

config rule
	option name 'Allow-DHCPv6'
	option src 'wan'
	option proto 'udp'
	option dest_port '546'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-MLD'
	option src 'wan'
	option proto 'icmp'
	option src_ip 'fe80::/10'
	list icmp_type '130/0'
	list icmp_type '131/0'
	list icmp_type '132/0'
	list icmp_type '143/0'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-ICMPv6-Input'
	option src 'wan'
	option proto 'icmp'
	list icmp_type 'echo-request'
	list icmp_type 'echo-reply'
	list icmp_type 'destination-unreachable'
	list icmp_type 'packet-too-big'
	list icmp_type 'time-exceeded'
	list icmp_type 'bad-header'
	list icmp_type 'unknown-header-type'
	list icmp_type 'router-solicitation'
	list icmp_type 'neighbour-solicitation'
	list icmp_type 'router-advertisement'
	list icmp_type 'neighbour-advertisement'
	option limit '1000/sec'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-ICMPv6-Forward'
	option src 'wan'
	option dest '*'
	option proto 'icmp'
	list icmp_type 'echo-request'
	list icmp_type 'echo-reply'
	list icmp_type 'destination-unreachable'
	list icmp_type 'packet-too-big'
	list icmp_type 'time-exceeded'
	list icmp_type 'bad-header'
	list icmp_type 'unknown-header-type'
	option limit '1000/sec'
	option family 'ipv6'
	option target 'ACCEPT'

config rule
	option name 'Allow-IPSec-ESP'
	option src 'wan'
	option dest 'lan'
	option proto 'esp'
	option target 'ACCEPT'

config rule
	option name 'Allow-ISAKMP'
	option src 'wan'
	option dest 'lan'
	option dest_port '500'
	option proto 'udp'
	option target 'ACCEPT'

I am using DHCP now, but this is my config. When I switch to the PPPoE passthrough I do so via Luci. Just change the eth0 protocol to pppoe and enter authentication.

I forgot to answer this question. It is mainly wired, but I have old wifi router re-purposed on port eth3 acting as AP. Other than that everything is wired with Ethernet cables.

Ok, config seems ok.
Can you try this?

Hello, Sorry for the late reply. I tried patch from https://github.com/openwrt/firewall4/issues/67#issuecomment-3016978777 and it did not change anything. I am starting to think that the EdgeRouter's 2 cores are just not enough.

There are 2 variables changing processing paths
Take this test

  • https://www.waveform.com/tools/bufferbloat
    Run the test with offloading off and packet steering disabled
    Result link A
    Set steering to enabled
    Result link B
    Set steering to enabled-all cores
    Result link C
    Set the best of 3 options (depends - it may be B or C) and enable soft offload
    Result link D
    Now enable hardware offload
    Result link E
    Pick the best. I can squeeze about down/up/sum 800/800/1100 with soft offload + enabled or 900/900/1800 hard offload, any steering setting from RT-AX54
    Latency improves with more offload as the CPU starts breathing easier.

Any filogic device will do gigabit withiut breaking sweat without offloads.

Though I run modded firewall
https://github.com/openwrt/firewall4/pulls
27
31
41
59 + see last comment for less jumpy offloads
64

Hello. Sorry for the very late reply.

I just been running the router in DHCP client mode, but I need to get this running soon.

I have rerun the bufferbloat test several times with settings you requested and I just cannot get even 800/800 out of it, when using PPPoE.

Connected as DHCP client to the modem in router mode - https://www.waveform.com/tools/bufferbloat?test-id=22c7497b-8318-45e8-a11e-0c3053b8c02a ← these are the speeds I am looking for

PPPoE no offload, no steering - https://www.waveform.com/tools/bufferbloat?test-id=01fbd7e5-b972-4cf8-a503-38d7c03d0cda
PPPoE no offload, steering enabled - https://www.waveform.com/tools/bufferbloat?test-id=67e83009-0fd2-41b2-b657-1cd2bfd8715e
PPPoE no offload, steering enabled (all cores) - https://www.waveform.com/tools/bufferbloat?test-id=7bd088c9-28c7-486a-9e99-2a04d3527f25
PPPoE SW offload and Packet steering (all cores) - https://www.waveform.com/tools/bufferbloat?test-id=dc86e9b5-32ca-4789-9485-d78b34f84878
PPPoE HW offload and Packet steering (all cores) - https://www.waveform.com/tools/bufferbloat?test-id=193a9a90-e2f5-4580-87f8-2bf019912f78

Any ideas? Or is there no way to full speeds with this device? (MediaTek MT7621AT - EdgeRouter ER-X SFP)

It looks like pause frame pushback…

ethtool wan
:pause frames are negotiated and enabled
ethtool -a wan 
:rx on
:tx on
:autoneg on
ethtool -A wan rx off tx off
ethtool -r wan
ethtool wan
: now no pause frames should be negotiated, you have to repeat this for all physical ports.
root@OpenWrt:~# ethtool -a eth0
Pause parameters for eth0:
Autonegotiate:	on
RX:		off
TX:		off
RX negotiated: on
TX negotiated: on

root@OpenWrt:~# ethtool -a eth1
Pause parameters for eth1:
Autonegotiate:	on
RX:		off
TX:		off
RX negotiated: on
TX negotiated: on

root@OpenWrt:~# ethtool -a eth2
Pause parameters for eth2:
Autonegotiate:	on
RX:		off
TX:		off
RX negotiated: on
TX negotiated: off

root@OpenWrt:~# ethtool -a eth3
Pause parameters for eth3:
Autonegotiate:	on
RX:		off
TX:		off
RX negotiated: on
TX negotiated: on

root@OpenWrt:~# ethtool -a eth4
Pause parameters for eth4:
Autonegotiate:	on
RX:		off
TX:		off
RX negotiated: off
TX negotiated: off

root@OpenWrt:~# ethtool -a eth5
Pause parameters for eth5:
Autonegotiate:	on
RX:		off
TX:		off

these options were already set, although I do not remember manually setting them.

RX negotiated: on
TX negotiated: on

Is this with cable? If it is ordered to be off it may never negotiate pause / flow control…

I am not sure what you are asking me. Ports eth0 to eth4 are physical Ethernet ports. Port eth5 is an SFP port that I am not using for this setup. The PPPoE interface is at port eth0. Should the RX/TX negotiated be all on?

The problem is that announce bits are set while they should be off and no flow control negotiated.

ethtool eth0 should confirm that extra time.

Settings for wan:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Supported pause frame use: Symmetric Receive-only
        Supports auto-negotiation: Yes <- hw ability
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Advertised pause frame use: Symmetric Receive-only
        Advertised auto-negotiation: Yes <- we advertise it even not configured
        Advertised FEC modes: Not reported
        Link partner advertised link modes:  10baseT/Half 10baseT/Full 
                                             100baseT/Half 100baseT/Full 
                                             1000baseT/Full 
        Link partner advertised pause frame use: No <- they dont, thanks
        Link partner advertised auto-negotiation: Yes
        Link partner advertised FEC modes: Not reported

for me (on port eth0) it advertises as Symmetric, other than that it looks identical to yours

Advertised pause frame use: Symmetric
Link partner advertised pause frame use: Symmetric

I manually went and enabled rx and tx for each of the physical ports to correspond to the negotiated. Then restarted each of the ports. It made no difference https://www.waveform.com/tools/bufferbloat?test-id=e7f47d4b-d63c-4a6c-aa4a-f1f6ac6004f1.

Sorry, yeah I think I understand now. It does show Link partner advertised pause frame use: No if the tx and rx are set to off. That is my bad.

However forcing these values on or off has no effect on bufferbloat test.

You need to disable autoneg because I suspect the ethtool a/A is not projected to all outer ports properly….

no difference with all tx/rx/autoneg set to off, https://www.waveform.com/tools/bufferbloat?test-id=6573cda2-3f41-4630-8e11-c2308250462b

You have to -r re-detect and confirm (no params just iface name) that pause frames are off.