Archer C6 v3 packet loss at high bandwidth (when streaming VR) on 24.10.2

I remember having this issue back in 2023 (where packet loss increased after flashing OpenWRT), and the instructions to flash stock firmware failed me, so I stopped streaming over WiFi, but started again recently, so I wanted to deal with this, whether by reporting it or by getting assistance in reverting to stock.

It’s known in the Virtual Desktop community (check their discord) that only a select few WiFi 5 routers are stable enough to stream VR at 200Mbps, and that includes the Archer C6 and A6. WiFi AC is stable up to ~200Mbps, AX - up to ~400Mbps, and AXE/BE - up to ~600Mbps. Above those thresholds, packets start dropping. However, on OpenWRT firmware, streaming remains stable (although not perfect) at around 50Mbps on AC, rather than the usual 200Mbps. By the way, I can easily download data at 400Mbps, which proves I’m using a 5GHz 80Mhz channel, but the top speed doesn’t matter here; it’s the stability that matters.

So when I stream VR at 200Mbps, packet loss causes drops to 50Mbps every few seconds. This doesn’t happen on stock firmware on the C6 v4, and I recall that C6 v3 was more stable on stock firmware. I don’t know any ways of easily testing it (without needing a Pico or Quest headset), as this requires testing for packet loss at a high bandwidth. Tests don’t show any packet loss at low bandwidth.

I also have a D-Link DIR-853 R1 running OpenWRT, which exhibits even more packet loss, but I don’t recall if it had this issue on stock firmware. Additionally, I have an Archer C6 v4 on stock firmware that’s pretty stable.

Linux accounts dropped packets (c6v4 is proprietary architecture, no indication of features/speeds, running vxworks, ir completely unrelated device outside the sticker)

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 (red circle; this works best in the 'Markdown' composer view in the blue oval):

Screenshot 2025-10-20 at 8.14.14 PM

Remember to redact passwords, VPN keys, MAC addresses and any public IP addresses you may have:

ubus call system board
cat /etc/config/network
cat /etc/config/wireless
cat /etc/config/dhcp
cat /etc/config/firewall
cat /proc/net/softnet_stat
ethtool -S phyX-apY
cat /proc/net/stat/nf_conntrack 
1 Like

Hi, thanks for replying. I’ll see if I can count dropped packets on my Linux.

OpenWrt 24.10.2, r28739-d9340319c6
 -----------------------------------------------------
root@OpenWrt:~# ubus call system board
{
        "kernel": "6.6.93",
        "hostname": "OpenWrt",
        "system": "MediaTek MT7621 ver:1 eco:3",
        "model": "TP-Link Archer C6 v3",
        "board_name": "tplink,archer-c6-v3",
        "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"
        }
}
root@OpenWrt:~# cat /etc/config/network

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 'fdfa:bcd3:6266::/48'
        option packet_steering '1'

config device
        option name 'br-lan'
        option type 'bridge'
        list ports 'lan1'
        list ports 'lan2'
        list ports 'lan3'
        list ports 'lan4'

config interface 'lan'
        option device 'br-lan'
        option proto 'static'
        option ipaddr '192.168.1.2'
        option netmask '255.255.255.0'
        option ip6assign '60'
        option gateway '192.168.1.3'

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

config interface 'wan6'
        option device 'wan'
        option proto 'dhcpv6'

root@OpenWrt:~# cat /etc/config/wireless

config wifi-device 'radio0'
        option type 'mac80211'
        option path '1e140000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0'
        option band '2g'
        option channel '1'
        option htmode 'HT20'
        option country 'PL'
        option cell_density '0'
        option disabled '1'

config wifi-device 'radio1'
        option type 'mac80211'
        option path '1e140000.pcie/pci0000:00/0000:00:01.0/0000:02:00.0'
        option band '5g'
        option channel '36'
        option cell_density '0'
        option country 'PL'
        option htmode 'VHT80'

config wifi-iface 'wifinet0'
        option device 'radio1'
        option mode 'ap'
        option ssid 'OpenWRT Archer'
        option encryption 'sae'
        option network 'lan'
        option key '[REDACTED]'
        option ocv '0'

root@OpenWrt:~# cat /etc/config/dhcp

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'

root@OpenWrt:~# cat /etc/config/firewall
config defaults
        option syn_flood        1
        option input            REJECT
        option output           ACCEPT
        option forward          REJECT
# Uncomment this line to disable ipv6 rules
#       option disable_ipv6     1

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

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

config forwarding
        option src              lan
        option dest             wan

# We need to accept udp packets on port 68,
# see https://dev.openwrt.org/ticket/4108
config rule
        option name             Allow-DHCP-Renew
        option src              wan
        option proto            udp
        option dest_port        68
        option target           ACCEPT
        option family           ipv4

# Allow IPv4 ping
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

# Allow DHCPv6 replies
# see https://github.com/openwrt/openwrt/issues/5066
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

# Allow essential incoming IPv6 ICMP traffic
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

# Allow essential forwarded IPv6 ICMP traffic
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


### EXAMPLE CONFIG SECTIONS
# do not allow a specific ip to access wan
#config rule
#       option src              lan
#       option src_ip   [REDACTED]
#       option dest             wan
#       option proto    tcp
#       option target   REJECT

# block a specific mac on wan
#config rule
#       option dest             wan
#       option src_mac  00:11:22:33:44:66
#       option target   REJECT

# block incoming ICMP traffic on a zone
#config rule
#       option src              lan
#       option proto    ICMP
#       option target   DROP

# port redirect port coming in on wan to lan
#config redirect
#       option src                      wan
#       option src_dport        80
#       option dest                     lan
#       option dest_ip          [REDACTED]
#       option dest_port        80
#       option proto            tcp

# port redirect of remapped ssh port (22001) on wan
#config redirect
#       option src              wan
#       option src_dport        22001
#       option dest             lan
#       option dest_port        22
#       option proto            tcp

### FULL CONFIG SECTIONS
#config rule
#       option src              lan
#       option src_ip   [REDACTED]
#       option src_mac  00:11:22:33:44:55
#       option src_port 80
#       option dest             wan
#       option dest_ip  [REDACTED]
#       option dest_port        120
#       option proto    tcp
#       option target   REJECT

#config redirect
#       option src              lan
#       option src_ip   [REDACTED]
#       option src_mac  00:11:22:33:44:55
#       option src_port         1024
#       option src_dport        80
#       option dest_ip  [REDACTED]
#       option dest_port        120
#       option proto    tcp
root@OpenWrt:~# cat /proc/net/softnet_stat
0000fa28 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0000fbcf 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000
cd136a93 00000000 0003091d 00000000 00000000 00000000 00000000 00000000 00000000 1edbf063 00000000 00000000 00000002 00000000 00000000
016e4fc7 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000003 00000000 00000000
root@OpenWrt:~# ethtool -S phyX-apY
-ash: ethtool: not found
root@OpenWrt:~# cat /proc/net/stat/nf_conntrack

You have to show ethtool output. Install any of available package options. Also the nf_conntrack is missing (I am looking for very high "invalid" and "error" numbers, like in percents.)

Interrupts are not very well balanced.
Are you using some "performance script" or whatever that all network processing goes to 3rd core?
Try other packaet steering options. (Luci/Network/Interfaces/global options) and measure.

That disbalance/overburdening one core causes RX drops in network stack.

If the problem still persists after trafffic is .5/2x balanced between first and last 2 cores follow on with this:
Increase netdev budget as in redhat guidance

Maybe upgrading to 24.10.4 will help?

Next week 25.12 might see the daylight, who knows what that brings

This is contrary to normal 7621 workings with irqs on CPU0 or irqbalanced (that works sometimes) moving half of traffic to CPU2 (ie between the "heads" of SMT)
Normall would be +/-20% balance between cpu0/cpu2

root@OpenWrt:~# cat /proc/net/softnet_stat
total txdrop(txqueuelen) rxdrop(netdev_wght)
0000fa28 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0000fbcf 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000
cd136a93 00000000 0003091d 00000000 00000000 00000000 00000000 00000000 00000000 1edbf063 00000000 00000000 00000002 00000000 00000000
016e4fc7 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000003 00000000 00000000

You have to show ethtool output. Install any of available package options. Also the nf_conntrack is missing

root@OpenWrt:~# ethtool -S phyX-apY
Cannot get stats strings information: No such device
root@OpenWrt:~# cat /proc/net/stat/nf_conntrack 
entries  clashres found new invalid ignore delete chainlength insert insert_failed drop early_drop icmp_error  expect_new expect_create expect_delete search_restart
0000001b  00000000 00000000 00000000 000001b9 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000
0000001b  00000000 00000000 00000000 00000153 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001  00000000 00000000 00000000 00000000
0000001b  00000000 00000000 00000000 0000010d 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000
0000001b  00000000 00000000 00000000 0000009c 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000

Are you using some "performance script" or whatever that all network processing goes to 3rd core?

I’m not using any custom performance scripts. AFAIK, all I’ve changed was Wi-Fi configuration.

Try other packaet steering options. (Luci/Network/Interfaces/global options) and measure.

I’ve tried, and haven’t noticed a significant difference.

The result I sent you first was for Enabled. Here’s one for Enabled on all CPUs:

root@OpenWrt:~# cat /proc/net/softnet_stat
000d3e05 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00003279 00000000 00000000 00000000 00000000 00000000
0019bd13 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000000 000d5aed 00000000 00000000 00000001 00000000 00000000
00007009 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000270 00000000 00000000 00000002 00000000 00000000
010b1596 00000000 0000b294 00000000 00000000 00000000 00000000 00000000 00000000 001402a4 00000000 00000000 00000003 00000000 00000000

Reading this feels like reading green numbers on a monitor in The Matrix.

If the problem still persists after trafffic is .5/2x balanced between first and last 2 cores follow on with this:
Increase netdev budget as in redhat guidance

It says:

To determine whether tuning the net.core.netdev_budget parameter is needed, display the counters in the /proc/net/softnet_stat file:

Well, the decimal output suggests there are no dropped packets:

00004f6a 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0000475a 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000
0000774a 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000002 00000000 00000000
00007757 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000003 00000000 00000000
009fc45b 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000004 00000000 00000000
0000800b 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000005 00000000 00000000
00007c5c 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000006 00000000 00000000
00007494 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000007 00000000 00000000

That is your 8-core desktop, not the router.

Ok, so with RPS, the packets are equally distributed between CPU 0, 1 and 2. But the speed still drops to 50 Mbps when I physically move the receiving device quickly. It happens even with Hardware Flow Offloading. Where the stock Archer would drop from 150 Mbps to 100 Mbps, the OpenWRT Archer drops to 40-50 Mbps.

Result after enabling RPS:

Core Processed Dropped Squeezed
CPU0 : 33302445 0 0
CPU1 : 54935281 0 1525
CPU2 : 18208959 0 61
CPU3 : 85272497 0 1747

Contrary to what the Redhat guide says, the values in the column aren’t raising anymore, even when bandwidth drops, so there’s no reason to make the changes they’re suggesting.

Do not enable it for any tests, it adds its own class of incompatibility.
Wifi beamforming is designed to work at walking speeds....

Oh, so Hardware Offloading enables beamforming? Nice to know. However, enabling/disabling it makes no difference in my case.

Anyway, looking at the debugging info, it seems that the issue isn’t dropped packets, but another kind of signal loss, mainly caused by movement (such as when ducking). Is there anything else I can try or should I wait for an update and hope for the best?

Hi,

Hardware offloading doesn’t get involved on beamforming (only helps with downloading at 500+ Mbps speed from the Internet). On VR streaming, I assume that all the traffic is generated from your local network, and HW offload doesn’t work here.

Archer C6 v3 uses MT7621 SoC (well supported) but uses MT7613BE chip for Wi-Fi 5 duty. Personally, I am inclined to believe that the latter is the culprit. The open source mt76 driver has not been given much importance to mt7613/mt7663 and its support needs a lot of refinement (even basic features such as DFS are not yet supported).

I am not very familiar with the use of VR headsets, but consider trying Wireshark on your PC to identify what type of traffic is being used. Is it TCP or UDP? Are there multiple connections, or just one? What is the general size of the packets?

I have several routers with MT7613BE including a lot of C6 V3, and with that data I might be able to reproduce the error on my own.

You are wrong here. No relation between beamforming and offload. Beamforming works at limited movement speeds and has any effecr 25-30m or more away from AP and you need at least wifi5 client.
This is not a chatbot race, provide config files and describe the client to get any help.

You said

Do not enable it for any tests, it adds its own class of incompatibility.
Wifi beamforming is designed to work at walking speeds....

As beamforming hadn’t been mentioned before, but you put it right after a sentence advising against using hardware flow offloading, I inferred that the offloading enables beamforming. But now you said there’s no relation between those two. Can you explain then why you mentioned beamforming in the first place? Is it because a router can miss the beam if the receiver is moving too quickly?

Also, sorry for the slow replies. I accepted the issue as normal a while ago. I’m used to having multiple issues at any given time, especially on Linux.

I’ll check if WiVRn (the VR streaming app) uses TCP or UDP, any other details, and if it can be changed.

Yes, but after you work out the issue of weird load balancing. It should be +/10% most load on cores 0 and 2 or all cores depending on setting.