From 9634424d8d142d9bae77b0dc868da1d3bbc8a8ba Mon Sep 17 00:00:00 2001 From: Sean Khan Date: Mon, 30 Sep 2024 21:25:55 -0400 Subject: [PATCH] docs: Update README for NSS specific info Signed-off-by: Sean Khan docs: Add donation links Not obligatory at all. Just adding for folks who appreciate my work, and wanting to contribute. :) --- README.md | 206 +++++++++++++++++++++++++++++++++------------------- cashapp.png | Bin 0 -> 22092 bytes paypal.png | Bin 0 -> 8307 bytes 3 files changed, 133 insertions(+), 73 deletions(-) create mode 100644 cashapp.png create mode 100644 paypal.png diff --git a/README.md b/README.md index 9141b2392d..c10c128f0d 100644 --- a/README.md +++ b/README.md @@ -1,108 +1,168 @@ -![OpenWrt logo](include/logo.png) +# NSS Fork for IPQ807x +| Branch | mac80211 Version | Notes | +|-----------------------------------------------------------------------------------------|------------------|----------------------------------------------------------------------| +| [qualcommax-6.x-nss-wifi](https://github.com/qosmio/openwrt-ipq/tree/qualcommax-6.x-nss-wifi) |6.11|Current with upstream| +| [qualcommax-6.x-nss-mx4300](https://github.com/qosmio/openwrt-ipq/tree/qualcommax-6.x-nss-mx4300) |6.11|Current with upstream. [Supports Linksys MX4300](https://github.com/openwrt/openwrt/pull/16070) | +| [qualcommax-6.x-nss-wifi-6.9](https://github.com/qosmio/openwrt-ipq/tree/qualcommax-6.x-nss-wifi-6.9) |6.9.9|Current with upstream, except older mac80211| +| [qualcommax-6.x-nss-mx4300-6.9](https://github.com/qosmio/openwrt-ipq/tree/qualcommax-6.x-nss-mx4300-6.11) |6.9.9|Current with upstream, except older mac80211. [Supports Linksys MX4300](https://github.com/openwrt/openwrt/pull/16070) | -OpenWrt Project is a Linux operating system targeting embedded devices. Instead -of trying to create a single, static firmware, OpenWrt provides a fully -writable filesystem with package management. This frees you from the -application selection and configuration provided by the vendor and allows you -to customize the device through the use of packages to suit any application. -For developers, OpenWrt is the framework to build an application without having -to build a complete firmware around it; for users this means the ability for -full customization, to use the device in ways never envisioned. +NOTE: The 6.9 branches are meant for folks having issues with the current 6.11.2 version of backports/mac80211. These are mostly just meant as a workaround for the time being. I don't plan on supporting these branches longterm. -Sunshine! +The MX4300 branches will soon be merged in once the PR for MX4300 is approved upstream. -## Download +## Table of Contents +- [Overview](#overview) +- [What's NSS?](#whats-nss) +- [How Does OpenWrt "Offload" Traffic?](#how-does-openwrt-offload-traffic) +- [How Is NSS Different from OpenWrt's Offloading Options?](#how-is-nss-different-from-openwrts-offloading-options) +- [Do I Need NSS?](#do-i-need-nss) +- [OK, I Want NSS. Does My Device Support It?](#ok-i-want-nss-does-my-device-support-it) +- [Quickstart](#quickstart) +- [Important Note](#important-note) +- [Donate](#donate) -Built firmware images are available for many architectures and come with a -package selection to be used as WiFi home router. To quickly find a factory -image usable to migrate from a vendor stock firmware to OpenWrt, try the -*Firmware Selector*. +--- -* [OpenWrt Firmware Selector](https://firmware-selector.openwrt.org/) +## Overview +This repository contains a fork of OpenWrt that integrates Qualcomm's NSS (Network Subsystem) support for the IPQ807x and IPQ6018 series of SoCs. The goal of this project is to provide enhanced network performance and reliability through hardware offloading, leveraging NSS's capabilities to improve throughput and reduce CPU load. -If your device is supported, please follow the **Info** link to see install -instructions or consult the support resources listed below. +--- +#### What's NSS? -## +NSS (**N**etwork **S**ub**s**ystem) is a specialized hardware offloading engine developed by Qualcomm, integrated into their IPQ series SoCs (System-on-Chip), such as the IPQ807x and IPQ6018. NSS is designed to handle high-throughput network tasks like NAT, routing, and even security tasks such as IPsec, without burdening the main CPU cores. -An advanced user may require additional or specific package. (Toolchain, SDK, ...) For everything else than simple firmware download, try the wiki download page: +--- +#### How Does OpenWrt "Offload" Traffic? -* [OpenWrt Wiki Download](https://openwrt.org/downloads) +OpenWrt offers three primary methods for offloading network traffic, each aimed at reducing CPU load and improving throughput: -## Development +1. **Packet Steering**: Distributes network processing across multiple CPU cores. It helps balance the load on multi-core CPUs but still relies on the CPU to handle packet processing. -To build your own firmware you need a GNU/Linux, BSD or macOS system (case -sensitive filesystem required). Cygwin is unsupported because of the lack of a -case sensitive file system. +2. **Software Flow Offloading**: Accelerates traffic processing by using the CPU’s fast path, allowing more efficient handling of routing and NAT (Network Address Translation) by bypassing the kernel's normal slow path. This relies entirely on the CPU to speed up packet forwarding. -### Requirements +3. **Hardware Flow Offloading**: Available only on select devices (e.g., Mediatek), this method offloads packet forwarding directly to the network hardware using kernel-based mechanisms (nftables/iptables) to accelerate traffic. However, this is limited to devices that have hardware acceleration capabilities supported by OpenWrt. -You need the following tools to compile OpenWrt, the package names vary between -distributions. A complete list with distribution specific packages is found in -the [Build System Setup](https://openwrt.org/docs/guide-developer/build-system/install-buildsystem) -documentation. +--- +#### Why Isn't NSS Supported in Vanilla OpenWrt? -``` -binutils bzip2 diff find flex gawk gcc-6+ getopt grep install libc-dev libz-dev -make4.1+ perl python3.7+ rsync subversion unzip which -``` +NSS requires proprietary binaries (NSS firmware) and extensive patches to the Linux kernel and networking stack. Qualcomm does not openly release the necessary firmware or detailed documentation on how to integrate NSS support, making it extremely difficult for the OpenWrt community to maintain. The required patches are invasive and complex, altering significant portions of the network stack, which makes upstream integration into OpenWrt unlikely. Maintaining compatibility with each new kernel version is another barrier, as Qualcomm’s support for these patches is minimal and sporadic. -### Quickstart +--- -1. Run `./scripts/feeds update -a` to obtain all the latest package definitions - defined in feeds.conf / feeds.conf.default +#### How Is NSS Different from OpenWrt's Offloading Options? -2. Run `./scripts/feeds install -a` to install symlinks for all obtained - packages into package/feeds/ +The main difference between NSS and OpenWrt's offloading methods is that NSS provides **hardware acceleration** directly within the SoC, bypassing the CPU almost entirely for certain network tasks. OpenWrt's offloading, on the other hand, relies heavily on the **CPU** to manage and accelerate traffic, either via multi-core CPU distribution (Packet Steering) or kernel-level acceleration (Software/Hardware Flow Offloading). -3. Run `make menuconfig` to select your preferred configuration for the - toolchain, target system & firmware packages. +NSS doesn’t play nice with OpenWrt’s built-in offloading because they conflict in how they handle packets, leading to performance issues or even outright failures. -4. Run `make` to build your firmware. This will download all sources, build the - cross-compile toolchain and then cross-compile the GNU/Linux kernel & all chosen - applications for your target system. +--- -### Related Repositories +#### Key Differences: -The main repository uses multiple sub-repositories to manage packages of -different categories. All packages are installed via the OpenWrt package -manager called `opkg`. If you're looking to develop the web interface or port -packages to OpenWrt, please find the fitting repository below. +- **Packet Steering**: While it redistributes packet processing across multiple CPU cores, it still involves the CPU heavily. With NSS, dedicated hardware cores handle packet processing, so packet steering can interfere by unnecessarily involving the CPU, reducing the benefits of offloading to hardware. -* [LuCI Web Interface](https://github.com/openwrt/luci): Modern and modular - interface to control the device via a web browser. +- **Software Flow Offloading**: This uses kernel-level mechanisms (nftables/iptables) to accelerate packet forwarding by utilizing the CPU’s fast path. NSS, however, bypasses the kernel’s networking stack and offloads these tasks directly to the hardware. If both are enabled, packet handling may be done redundantly in software and hardware, leading to inefficiencies or conflicts. -* [OpenWrt Packages](https://github.com/openwrt/packages): Community repository - of ported packages. +- **Hardware Flow Offloading**: Available only for certain devices like Mediatek, this method offloads packet processing to specific hardware via kernel drivers. However, this hardware-based acceleration is entirely separate from NSS and not as efficient on Qualcomm devices. Using it alongside NSS can lead to unpredictable behavior, as both try to accelerate traffic but in incompatible ways. -* [OpenWrt Routing](https://github.com/openwrt/routing): Packages specifically - focused on (mesh) routing. +--- -* [OpenWrt Video](https://github.com/openwrt/video): Packages specifically - focused on display servers and clients (Xorg and Wayland). +#### Do I Need NSS? -## Support Information +Here are some reasons you might need NSS: -For a list of supported devices see the [OpenWrt Hardware Database](https://openwrt.org/supported_devices) +- You require high network throughput (e.g., gigabit speeds) on devices like the IPQ807x or IPQ6018 series. +- Your router handles resource-intensive tasks like NAT, VPN (IPsec), or other routing-heavy activities that would otherwise overwhelm the CPU. +- You’re seeking better performance than what OpenWrt’s software and hardware offloading options can provide. -### Documentation +However, it’s important to note that **NSS is NOT supported upstream** in OpenWrt. As of now, there are only a few community-driven projects that maintain NSS patches. -* [Quick Start Guide](https://openwrt.org/docs/guide-quick-start/start) -* [User Guide](https://openwrt.org/docs/guide-user/start) -* [Developer Documentation](https://openwrt.org/docs/guide-developer/start) -* [Technical Reference](https://openwrt.org/docs/techref/start) +I personally maintain an NSS fork of OpenWrt [qosmio/openwrt-ipq](https://github.com/qosmio/openwrt-ipq) and the necessary NSS packages [qosmio/nss-packages](https://github.com/qosmio/nss-packages). -### Support Community +--- -* [Forum](https://forum.openwrt.org): For usage, projects, discussions and hardware advise. -* [Support Chat](https://webchat.oftc.net/#openwrt): Channel `#openwrt` on **oftc.net**. +#### OK, I Want NSS. Does My Device Support It? -### Developer Community +NSS is available for most Qualcomm IPQ807x and IPQ6018 devices. If your device is part of this chipset family and supported in OpenWrt, it can run NSS. -* [Bug Reports](https://bugs.openwrt.org): Report bugs in OpenWrt -* [Dev Mailing List](https://lists.openwrt.org/mailman/listinfo/openwrt-devel): Send patches -* [Dev Chat](https://webchat.oftc.net/#openwrt-devel): Channel `#openwrt-devel` on **oftc.net**. +Supported devices include, but are not limited to: +- Devices based on the **IPQ807x** (e.g., some high-end Netgear and TP-Link routers) +- Devices based on the **IPQ6018** (e.g., certain enterprise routers) -## License +--- -OpenWrt is licensed under GPL-2.0 +## Quickstart + +1. Clone this repository: + ```bash + git clone https://github.com/qosmio/openwrt-ipq -b qualcommax-6.x-nss-wifi-6.11 + cd openwrt-ipq + ``` +2. Update feeds: + ```bash + ./scripts/feeds update + ./scripts/feeds install -a + ``` +3. Copy over the seed file + ```bash + cp nss-setup/config-nss.seed .config + ``` +4. Open the `.config` in a text editor, find your device, and remove the "#" and change `"is not set"` to `"=y"` + + Example: + ```diff + -# CONFIG_TARGET_qualcommax_ipq807x_DEVICE_dynalink_dl-wrx36 is not set + +CONFIG_TARGET_qualcommax_ipq807x_DEVICE_dynalink_dl-wrx36=y + ``` +6. Generate the full config + ```bash + make defconfig V=s + ``` +7. Now run full build + ```bash + make download -j$(nproc) V=s + make -j$(nproc) V=s + ``` +--- +### Important Note: + +Many users report issues after enabling Packet Steering or Flow Offloading (Software or Hardware), often because they are used to these options or they get carried over during a sysupgrade. Even if the setup seems to work initially, it is not optimized for NSS offloading, and you are losing the full benefits of hardware acceleration. + +If you plan to use NSS, **start fresh** and **disable all other offloading options**. + +By default OpenWrt's offloading is disabled, but if you ever happen to enable it accidentally, make sure you disable it. + +--- + ```bash + uci set network.@device[0].packet_steering=0 + uci set network.@device[0].flow_offloading=0 + uci set network.@device[0].flow_offloading_hw=0 + uci commit network + ``` +If you have questions or issues, please join the discussion on OpenWrt's forums. +[Qualcomm NSS Build](https://forum.openwrt.org/t/qualcommax-nss-build) + +## Please remember when posting about an issue: + 1. Include your device make and model. + 2. Relevant logs and screenshots. + 3. State clearly and concisely the issue you're having. + > "My router doesn't work", "I'm getting an error" + + Is not something I can help with. + 4. Include the specific commit you're building from. + > "I'm building from latest" + + Also not helpful as I'm always pushing changes... + + 5. Be respectful and mindful. I dedicate my free time to maintain and improve this project, and I do it for the benefit of the community. Remember that I'm not a full-time developer or support team—I'm just an individual sharing my work. Constructive feedback is always welcome, but please refrain from being overly critical or demanding. + +## Support the Project + +I never really thought about setting up donations before, but with so many people being receptive and appreciative and asking how to contribute, I figured, why not? Of course, this project also builds on the incredible work done by the talented devs upstream who put in countless hours into OpenWrt itself. I’ll definitely continue working on this, but if you’d like to support, every bit helps. + +[![Donate with PayPal](./paypal.png)](https://www.paypal.com/donate?business=3V3H2SZFY7DNQ&item_name=Maintaining+NSS+fork+of+OpenWRT+and+NSS+packages.) + + Cashapp + + +Consider donating to the [OpenWrt Foundation](https://openwrt.org/donate) diff --git a/cashapp.png b/cashapp.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2881916cb8533c1832894b6d2b72f50de9cf49 GIT binary patch literal 22092 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 C=q;=O literal 0 HcmV?d00001