netifd: add flow steering mode to the packet steering script master
authorFelix Fietkau <nbd@nbd.name>
Wed, 24 Apr 2024 17:23:11 +0000 (19:23 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 25 Apr 2024 14:13:12 +0000 (16:13 +0200)
This allows directing processing of locally received packets to the CPUs
of the tasks receiving them

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/config/netifd/files/etc/init.d/packet_steering
package/network/config/netifd/files/usr/libexec/network/packet-steering.uc

index d6f6afc2e1b5322cb2d91357e228fcd77552087d..ff4a39073bd2568a32a98333ea984733d9c20b98 100755 (executable)
@@ -15,9 +15,11 @@ service_triggers() {
 
 reload_service() {
        packet_steering="$(uci get "network.@globals[0].packet_steering")"
+       steering_flows="$(uci get "network.@globals[0].steering_flows")"
+       [ "$steering_flows" -gt 0 ] && opts="-l $steering_flows"
        if [ -e "/usr/libexec/platform/packet-steering.sh" ]; then
                /usr/libexec/platform/packet-steering.sh "$packet_steering"
        else
-               /usr/libexec/network/packet-steering.uc "$packet_steering"
+               /usr/libexec/network/packet-steering.uc $opts "$packet_steering"
        fi
 }
index 025532c1c1e7ebe136c21e5669adfd663ea75e09..a578e288791d7d4a3d5bb44a222614af227b419f 100755 (executable)
@@ -10,8 +10,10 @@ let debug = 0, do_nothing = 0;
 let disable;
 let cpus;
 let all_cpus;
+let local_flows = 0;
 
-for (let arg in ARGV) {
+while (length(ARGV) > 0) {
+       let arg = shift(ARGV);
        switch (arg) {
        case "-d":
                debug++;
@@ -25,6 +27,9 @@ for (let arg in ARGV) {
        case '2':
                all_cpus = true;
                break;
+       case '-l':
+               local_flows = +shift(ARGV);
+               break;
        }
 }
 
@@ -71,6 +76,13 @@ function set_netdev_cpu(dev, cpu) {
                if (!do_nothing)
                        writefile(queue, `${val}`);
        }
+       queues = glob(`/sys/class/net/${dev}/queues/rx-*/rps_flow_cnt`);
+       for (let queue in queues) {
+               if (debug || do_nothing)
+                       warn(`echo ${local_flows} > ${queue}\n`);
+               if (!do_nothing)
+                       writefile(queue, `${local_flows}`);
+       }
 }
 
 function task_device_match(name, device)