How to fix choppy voice/video calls over WiFi

Hi all, I have been experiencing choppy voice/video calls over WiFi for a while now and tried different channels and bands with no success. At times I would even go and sit next to the router to see if the signals strength is an issue, but that would only provide a marginal improvement. During my calls I am the only user, so this is not caused by a congestion. I am mostly running the non-CT firmware (the latest), but tried with CT for a few days and did not see any major difference.

I am currently running a few day's old build of 19.07 on a Netgear R7800 router. The line is VDSL2 50M/10M and is always in a perfect shape with ~11ms ping 24/7: wired gaming is awesome.

Could I be missing some configuration/tuning? Are there any troubleshooting steps I could take to isolate the issue?

Are you totally sure that the other end that you are calling to has also a perfect line and the problem is not at his side?

2 Likes

Yes, I think so. When I am in the office myself the quality of calls is very good from all participants. When I am remote, I am having the same choppy audio/video with people in other geographies. It is definitely on my end.

One more thing to add is that dslreport.com/speedtest often fails with too many upload errors message.

okay let's see the configuration for any potential issue:
uci show network; uci show wireless
for a start.
Any VPN you might be using by any chance?

Not using VPN or Samba.

network.loopback=interface
network.loopback.ifname='lo'
network.loopback.proto='static'
network.loopback.ipaddr='127.0.0.1'
network.loopback.netmask='255.0.0.0'

network.globals=globals
network.globals.default_ps='0'

network.lan=interface
network.lan.type='bridge'
network.lan.proto='static'
network.lan.netmask='255.255.255.0'
network.lan.ipaddr='192.168.1.200'
network.lan.ifname='eth1.1'

network.wan=interface
network.wan.ifname='eth0.2'
network.wan.proto='pppoe'
network.wan.ipv6='0'
network.wan.username=<snip>
network.wan.password=<snip>
network.wan.peerdns='0'
network.wan.dns='208.67.222.222 208.67.220.220'

network.@switch[0]=switch
network.@switch[0].name='switch0'
network.@switch[0].reset='1'
network.@switch[0].enable_vlan='1'
network.@switch_vlan[0]=switch_vlan
network.@switch_vlan[0].device='switch0'
network.@switch_vlan[0].vlan='1'
network.@switch_vlan[0].vid='1'
network.@switch_vlan[0].ports='1 6t'
network.@switch_vlan[1]=switch_vlan
network.@switch_vlan[1].device='switch0'
network.@switch_vlan[1].vlan='2'
network.@switch_vlan[1].ports='0t 5'
network.@switch_vlan[1].vid='2'
network.@switch_vlan[2]=switch_vlan
network.@switch_vlan[2].device='switch0'
network.@switch_vlan[2].vlan='3'
network.@switch_vlan[2].ports='3 6t'
network.@switch_vlan[2].vid='222'
network.@switch_vlan[3]=switch_vlan
network.@switch_vlan[3].device='switch0'
network.@switch_vlan[3].vlan='4'
network.@switch_vlan[3].ports='4 6t'
network.@switch_vlan[3].vid='111'
network.@switch_vlan[4]=switch_vlan
network.@switch_vlan[4].device='switch0'
network.@switch_vlan[4].vlan='5'
network.@switch_vlan[4].ports='2 6t'
network.@switch_vlan[4].vid='333'

network.modem=interface
network.modem.proto='static'
network.modem.ifname='eth0.2'
network.modem.netmask='255.255.255.0'
network.modem.ipaddr='192.168.2.158'

network.wifi1=interface
network.wifi1.proto='static'
network.wifi1.ipaddr='192.168.3.200'
network.wifi1.netmask='255.255.255.0'
network.wifi2=interface
network.wifi2.type='bridge'
network.wifi2.proto='static'
network.wifi2.ipaddr='192.168.4.200'
network.wifi2.netmask='255.255.255.0'
network.wifi3=interface
network.wifi3.proto='static'
network.wifi3.ipaddr='192.168.5.200'
network.wifi3.netmask='255.255.255.0'
network.wifi4=interface
network.wifi4.type='bridge'
network.wifi4.proto='static'
network.wifi4.ipaddr='192.168.6.200'
network.wifi4.netmask='255.255.255.0'

network.lan0=interface
network.lan0.proto='static'
network.lan0.ifname='eth1.111'
network.lan0.ipaddr='192.168.7.200'
network.lan0.netmask='255.255.255.0'
network.lan1=interface
network.lan1.proto='static'
network.lan1.ifname='eth1.222'
network.lan1.ipaddr='192.168.8.200'
network.lan1.netmask='255.255.255.0'
network.lan2=interface
network.lan2.proto='static'
network.lan2.ifname='eth1.333'
network.lan2.ipaddr='192.168.9.200'
network.lan2.netmask='255.255.255.0'
wireless.radio0=wifi-device
wireless.radio0.type='mac80211'
wireless.radio0.hwmode='11a'
wireless.radio0.path='soc/1b500000.pci/pci0000:00/0000:00:00.0/0000:01:00.0'
wireless.radio0.legacy_rates='0'
wireless.radio0.country='US'
wireless.radio0.channel='157'
wireless.radio0.short_preamble='1'
wireless.radio0.htmode='VHT40'
wireless.radio0.txpower='23'
wireless.radio0.noscan='1'
wireless.radio1=wifi-device
wireless.radio1.type='mac80211'
wireless.radio1.hwmode='11g'
wireless.radio1.path='soc/1b700000.pci/pci0001:00/0001:00:00.0/0001:01:00.0'
wireless.radio1.htmode='HT20'
wireless.radio1.country='US'
wireless.radio1.legacy_rates='0'
wireless.radio1.channel='11'
wireless.radio1.short_preamble='1'
wireless.radio1.txpower='22'
wireless.radio1.noscan='1'

wireless.@wifi-iface[0]=wifi-iface
wireless.@wifi-iface[0].device='radio1'
wireless.@wifi-iface[0].mode='ap'
wireless.@wifi-iface[0].ssid=<snip>
wireless.@wifi-iface[0].encryption='psk2+ccmp'
wireless.@wifi-iface[0].key=<snip>
wireless.@wifi-iface[0].isolate='1'
wireless.@wifi-iface[0].wpa_group_rekey='86400'
wireless.@wifi-iface[0].wpa_strict_rekey='1'
wireless.@wifi-iface[0].wpa_disable_eapol_key_retries='1'
wireless.@wifi-iface[0].wps_pushbutton='0'
wireless.@wifi-iface[0].ieee80211w='2'
wireless.@wifi-iface[0].disassoc_low_ack='0'
wireless.@wifi-iface[0].network='wifi2'
wireless.@wifi-iface[0].macfilter='allow'
wireless.@wifi-iface[0].maclist=<snip>

wireless.@wifi-iface[1]=wifi-iface
wireless.@wifi-iface[1].device='radio0'
wireless.@wifi-iface[1].mode='ap'
wireless.@wifi-iface[1].ssid=<snip>
wireless.@wifi-iface[1].encryption='psk2+ccmp'
wireless.@wifi-iface[1].key=<snip>
wireless.@wifi-iface[1].isolate='1'
wireless.@wifi-iface[1].wpa_group_rekey='86400'
wireless.@wifi-iface[1].wpa_strict_rekey='1'
wireless.@wifi-iface[1].wpa_disable_eapol_key_retries='1'
wireless.@wifi-iface[1].wps_pushbutton='0'
wireless.@wifi-iface[1].ieee80211w='2'
wireless.@wifi-iface[1].disassoc_low_ack='0'
wireless.@wifi-iface[1].network='wifi2'
wireless.@wifi-iface[1].macfilter='allow'
wireless.@wifi-iface[1].maclist=<snip>

wireless.@wifi-iface[2]=wifi-iface
wireless.@wifi-iface[2].device='radio1'
wireless.@wifi-iface[2].mode='ap'
wireless.@wifi-iface[2].ssid=<snip>
wireless.@wifi-iface[2].encryption='psk2+ccmp'
wireless.@wifi-iface[2].key=<snip>
wireless.@wifi-iface[2].isolate='1'
wireless.@wifi-iface[2].wpa_group_rekey='86400'
wireless.@wifi-iface[2].wpa_strict_rekey='1'
wireless.@wifi-iface[2].wpa_disable_eapol_key_retries='1'
wireless.@wifi-iface[2].wps_pushbutton='0'
wireless.@wifi-iface[2].ieee80211w='1'
wireless.@wifi-iface[2].disassoc_low_ack='0'
wireless.@wifi-iface[2].network='wifi4'
wireless.@wifi-iface[2].macfilter='allow'
wireless.@wifi-iface[2].maclist=<snip>

wireless.@wifi-iface[3]=wifi-iface
wireless.@wifi-iface[3].device='radio0'
wireless.@wifi-iface[3].mode='ap'
wireless.@wifi-iface[3].ssid=<snip>
wireless.@wifi-iface[3].encryption='psk2+ccmp'
wireless.@wifi-iface[3].key=<snip>
wireless.@wifi-iface[3].isolate='1'
wireless.@wifi-iface[3].wpa_group_rekey='86400'
wireless.@wifi-iface[3].wpa_strict_rekey='1'
wireless.@wifi-iface[3].wpa_disable_eapol_key_retries='1'
wireless.@wifi-iface[3].wps_pushbutton='0'
wireless.@wifi-iface[3].ieee80211w='1'
wireless.@wifi-iface[3].disassoc_low_ack='0'
wireless.@wifi-iface[3].network='wifi4'
wireless.@wifi-iface[3].macfilter='allow'
wireless.@wifi-iface[3].maclist=<snip>

wireless.@wifi-iface[4]=wifi-iface
wireless.@wifi-iface[4].device='radio0'
wireless.@wifi-iface[4].mode='ap'
wireless.@wifi-iface[4].ssid=<snip>
wireless.@wifi-iface[4].encryption='psk2+ccmp'
wireless.@wifi-iface[4].key=<snip>
wireless.@wifi-iface[4].wpa_group_rekey='86400'
wireless.@wifi-iface[4].wpa_strict_rekey='1'
wireless.@wifi-iface[4].wpa_disable_eapol_key_retries='1'
wireless.@wifi-iface[4].wps_pushbutton='0'
wireless.@wifi-iface[4].ieee80211w='1'
wireless.@wifi-iface[4].disassoc_low_ack='0'
wireless.@wifi-iface[4].network='wifi3'
wireless.@wifi-iface[4].macfilter='allow'
wireless.@wifi-iface[4].maclist=<snip>

wireless.@wifi-iface[5]=wifi-iface
wireless.@wifi-iface[5].device='radio1'
wireless.@wifi-iface[5].mode='ap'
wireless.@wifi-iface[5].ssid=<snip>
wireless.@wifi-iface[5].encryption='psk2+ccmp'
wireless.@wifi-iface[5].isolate='1'
wireless.@wifi-iface[5].wpa_group_rekey='86400'
wireless.@wifi-iface[5].wpa_strict_rekey='1'
wireless.@wifi-iface[5].wpa_disable_eapol_key_retries='1'
wireless.@wifi-iface[5].wps_pushbutton='0'
wireless.@wifi-iface[5].ieee80211w='1'
wireless.@wifi-iface[5].disassoc_low_ack='0'
wireless.@wifi-iface[5].network='wifi1'
wireless.@wifi-iface[5].macfilter='deny'
wireless.@wifi-iface[5].maclist=<snip>
wireless.@wifi-iface[5].key=<snip>

wireless.@wifi-iface[6]=wifi-iface
wireless.@wifi-iface[6].device='radio1'
wireless.@wifi-iface[6].mode='ap'
wireless.@wifi-iface[6].ssid=<snip>
wireless.@wifi-iface[6].encryption='psk2+ccmp'
wireless.@wifi-iface[6].key=<snip>
wireless.@wifi-iface[6].wpa_group_rekey='86400'
wireless.@wifi-iface[6].wpa_strict_rekey='1'
wireless.@wifi-iface[6].wpa_disable_eapol_key_retries='1'
wireless.@wifi-iface[6].wps_pushbutton='0'
wireless.@wifi-iface[6].ieee80211w='2'
wireless.@wifi-iface[6].disassoc_low_ack='0'
wireless.@wifi-iface[6].network='lan'
wireless.@wifi-iface[6].macfilter='allow'
wireless.@wifi-iface[6].maclist=<snip>

wireless.@wifi-iface[7]=wifi-iface
wireless.@wifi-iface[7].device='radio0'
wireless.@wifi-iface[7].mode='ap'
wireless.@wifi-iface[7].ssid=<snip>
wireless.@wifi-iface[7].encryption='psk2+ccmp'
wireless.@wifi-iface[7].key=<snip>
wireless.@wifi-iface[7].wpa_group_rekey='86400'
wireless.@wifi-iface[7].wpa_strict_rekey='1'
wireless.@wifi-iface[7].wpa_disable_eapol_key_retries='1'
wireless.@wifi-iface[7].wps_pushbutton='0'
wireless.@wifi-iface[7].ieee80211w='2'
wireless.@wifi-iface[7].disassoc_low_ack='0'
wireless.@wifi-iface[7].network='lan'
wireless.@wifi-iface[7].macfilter='allow'
wireless.@wifi-iface[7].maclist=<snip>

might be intresting to fire up $ noping -i.05 8.8.8.8 on a wifi device an see how that fares.
the combination of a wired-wireless bridge and a lot of ssid's might indicate a lot of "background-traffic noise" on your wifi-channel.

1 Like

Google search shows that noping is some kind of game tunnelling technology. I am probably not finding the right tool: canyon share a link?

Just try ping, the interval is too small though try ping -i .2 8.8.8.8

Also what neighboring stations are there? Do you have tens of hundreds of nearby SSIDs from nearby apartment neighbors?

debian/ubuntu have pkg named oping...

ping as user will not go below .2s but as root it will. noping will do everything as user and give live stats and graph for better overview.
.2s = 5Hz is probaly not realistic for simulating voip. 0.1 - 0.01 (100Hz) moreso

This is not an apartment building and I see 12 APs on 5GHz band and over 50 on 2Ghz, but at least 2/3 of them are reported as 50% signal and lower.

In the mean time, I have dropped SQM up/down limits from 95% to 90%. I also found an old thread of mine where it was suggested to me to disable offloads and flow control on the interfaces (SQM might not be handling packets of several hundred kilobytes in size very well). So far I have had two video calls over the last two days of great quality.
I do not know if those changes have fixed the issue or it is just a coincidence. I will monitor for now.

Thx, I will run this test later if things get worse again.

These are way too many already. And while the signal from them might not look much, if a client is closer to you than his access point, it may cause interference that is hard to detect.

1 Like

Please look for something that is called channel utilization. It some kind of measure for the capacity left on your WiFi and measures energy (?).
Then I'm at home I can look for a script.

Or install horst and make a screenshot. :slight_smile:

Most targets won't respond to 100Hz ping, firewalls will rate limit... But maybe it would work for 8.8.8.8, I don't know

those with config defaults from the 90's maybe, but anything "2k19 internet scale" wont care for 100pps of 64byte icmp traffic. (watching a youtube video will incur in the order of 500pps 100byte+ http-acks).

it most certainly works :slight_smile:

Well, they should still do. It's not just about whether the beefy machine can handle it, it's more about whether the beefy machine can be used as a reflector for enormous quantities of spoofed traffic from disseminated botnets etc.

Imagine if 1 million hacked IP cameras are sending 100Hz ping floods with spoofed sources... Suddenly corporation X is getting 100 million pings per second from their DNS provider...

Of course, a site like 8.8.8.8 might just limit the total ping output... in which case one guy asking for 100Hz would be ok... but as soon as you're up to 2000 ping packets per second, the rest are dropped on the floor. That'd be a decent strategy.

I have done this so far with sudo ping -i 0.01 8.8.8.8. It does not seem to look too-too terrible, but I have not had big video/voice issues in the last several days.
This is with today's build of 19.07 (I use the image builder, so my build is a little behind GitHub sources) and the latest and greatest non-CT firmware (I package the latest board-2.bin and firmware-5.bin from kvalo).
2.4GHz, channel 11 / 20 MHz width, RSSI -65 dBm (5GHz band does not reach this location very well).

--- 8.8.8.8 ping statistics ---
100000 packets transmitted, 99918 packets received, 0.1% packet loss
round-trip min/avg/max/stddev = 11.089/15.630/248.881/7.584 ms

--- 8.8.8.8 ping statistics ---
10000 packets transmitted, 9993 packets received, 0.1% packet loss
round-trip min/avg/max/stddev = 11.244/14.949/137.560/5.539 ms

--- 8.8.8.8 ping statistics ---
10000 packets transmitted, 9998 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 11.064/15.022/99.108/5.142 ms

yea, but the ping amplification factor of 1 isn't going to scare anyone (compared with dns(-sec) or various db's ...) we are talking about 100*64byte=6,4Kbyte/s ...
also
TIL: neither ping-program will send out pings in parallel, so they're capped at 1000ms/rtt=pps (100Hz@10ms)

@fantom-x your stats dont look too bad.
would be interested to see measurements from when your problem manifests again.

True, it's always way worse when the amplification factor is greater than 1. But if Google DNS is sending you a reflected ping flood, then how well is your entire corporate network going to work when it relies on being able to look up DNS entries from google?

In any case, it's easy to cap ping responses in aggregate rather than per host, and that's a reasonable strategy, if Google's entire local server farm is limited to a total of 2000 pings/second leaving the site, it probably doesn't affect anything google legitimately needs to do, and it's a good way to avoid any serious flooding.

Yep, get some basics covered...

I always tell people to check their neighborhood and pick the clearest channel, the autoselect often seems to do a lousy job of managing this.

Try going narrower vs wider in bandwith, it lowers your interference footprint. In some cases you might get better thruput despite the lower max speed. Disabling legacy rates might help a bit as well.

I like this one as an analyzer app.

Finding your sweet spot in SQM settings is good, too. Sounds like backing the rate down did sonething for you. The more advanced tuning instructions are worth checking out.

Lastly, if you're not using it already, the DSLReports Speedtest test, with the high res bufferbloat and suggested settings turned on, (a thread here I dont have handy has them) is instructive with hi res graphs of latency to help with your tuning efforts.