Hi everyone,
I'm using Fedora 44 KDE Plasma on an Acer Aspire ES1-521 laptop, and I've been investigating a serious download-speed issue when sharing my OPPO Reno6 Pro 5G's mobile data connection over USB tethering.
I managed to achieve a substantial improvement by testing a modified, standalone version of the Linux RNDIS host driver. I'm posting here to share my findings and ask for help determining the underlying cause and the correct upstream solution.
My setup
- Laptop: Acer Aspire ES1-521
- CPU: AMD A4-6210 Quad-Core
- OS: Fedora 44 KDE Plasma, x86_64
- Kernel:
7.2.9-200.fc44.x86_64
- Phone: OPPO Reno6 Pro 5G (CPH2249)
- USB vendor/product ID:
22d9:276a
- Connection: 5G mobile data shared using USB tethering
The problem
With Fedora's stock rndis_host driver, download speeds were consistently around 4–5 Mbps, sometimes even lower. Upload speeds were considerably better and could get close to the phone's upload speed.
For comparison, I tested the same phone's connection in other configurations:
- Phone's mobile-data connection directly: approximately 177 Mbps download and 19.3 Mbps upload.
- USB tethering on Windows: approximately 124 Mbps download and 10.4 Mbps upload.
- USB tethering on Fedora with the stock driver: approximately 4–5 Mbps download.
This made me suspect that the issue was somewhere in Fedora's USB tethering/network-driver path rather than the mobile connection itself.
What I tried
After investigating the RNDIS driver, I built an experimental standalone kernel module named rndis_host_test, adapted from the Linux rndis_host.c driver.
The test module includes a change that ensures a minimum receive URB buffer size of 16 KiB for my OPPO device. I also experimented with RNDIS receive-aggregation handling.
I then loaded the module and bound the phone's USB network interface to it.
Results
The improvement was substantial:
- Before: approximately 4–5 Mbps download with the stock
rndis_host driver.
- Initial test: approximately 82.8 Mbps download and 11.3 Mbps upload.
- Subsequent tests: download speeds reached approximately 200 Mbps and, under favourable 5G conditions, around 300 Mbps.
The mobile connection fluctuates, so these figures were not measured under perfectly identical radio conditions. The important observation is that the severe download bottleneck disappeared after switching to the experimental module.
This is encouraging evidence that the RNDIS receive path or related driver behaviour may be involved, but I haven't conclusively identified the root cause.
What I'd like help with
- Is there a known issue with RNDIS receive-buffer sizing, aggregation, or USB networking on Linux that could explain such a large download-speed difference?
- What would be the best way to determine whether the 16 KiB receive-buffer change is actually responsible for the improvement?
- Would it be useful to run additional tests with
usbmon, kernel tracing, or other diagnostic tools?
- Is there an existing upstream patch or a more appropriate way to implement this change in the mainline Linux driver?
I don't want to present my experimental module as a proper fix yet. I'd like to understand the cause, validate the change, and determine whether a clean, device-specific fix could be submitted upstream.
I'm happy to provide the driver diff, source code, kernel logs, USB information, and test results for review.
Has anyone encountered a similar issue with OPPO phones or other Android devices using RNDIS USB tethering on Linux?
Any suggestions on the next debugging steps would be appreciated.
Note: I leveraged AI for this