linux: adjust default policy rules
[project/netifd.git] / system-linux.c
index fb2ee29..e45fc69 100644 (file)
@@ -47,6 +47,7 @@
 #include <fcntl.h>
 #include <glob.h>
 #include <time.h>
+#include <unistd.h>
 
 #include <netlink/msg.h>
 #include <netlink/attr.h>
@@ -794,7 +795,7 @@ int system_bridge_addbr(struct device *bridge, struct bridge_config *cfg)
                bridge->ifname, cfg->igmp_snoop ? "1" : "0");
 
        system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/multicast_querier",
-               bridge->ifname, cfg->igmp_snoop ? "1" : "0");
+               bridge->ifname, cfg->multicast_querier ? "1" : "0");
 
        args[0] = BRCTL_SET_BRIDGE_PRIORITY;
        args[1] = cfg->priority;
@@ -1051,14 +1052,43 @@ system_if_get_settings(struct device *dev, struct device_settings *s)
        }
 }
 
+static void
+system_if_set_rps_xps_val(const char *path, int val)
+{
+       char val_buf[8];
+       glob_t gl;
+       int i;
+
+       if (glob(path, 0, NULL, &gl))
+               return;
+
+       snprintf(val_buf, sizeof(val_buf), "%x", val);
+       for (i = 0; i < gl.gl_pathc; i++)
+               system_set_sysctl(gl.gl_pathv[i], val_buf);
+}
+
+static void
+system_if_apply_rps_xps(struct device *dev, struct device_settings *s)
+{
+       long n_cpus = sysconf(_SC_NPROCESSORS_ONLN);
+       int val;
+
+       if (n_cpus < 2)
+               return;
+
+       val = (1 << n_cpus) - 1;
+       snprintf(dev_buf, sizeof(dev_buf), "/sys/class/net/%s/queues/*/rps_cpus", dev->ifname);
+       system_if_set_rps_xps_val(dev_buf, s->rps ? val : 0);
+
+       snprintf(dev_buf, sizeof(dev_buf), "/sys/class/net/%s/queues/*/xps_cpus", dev->ifname);
+       system_if_set_rps_xps_val(dev_buf, s->xps ? val : 0);
+}
+
 void
 system_if_apply_settings(struct device *dev, struct device_settings *s, unsigned int apply_mask)
 {
        struct ifreq ifr;
 
-       if (!apply_mask)
-               return;
-
        memset(&ifr, 0, sizeof(ifr));
        strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name));
        if (s->flags & DEV_OPT_MTU & apply_mask) {
@@ -1112,6 +1142,8 @@ system_if_apply_settings(struct device *dev, struct device_settings *s, unsigned
                snprintf(buf, sizeof(buf), "%d", s->neigh6reachabletime);
                system_set_neigh6reachabletime(dev, buf);
        }
+
+       system_if_apply_rps_xps(dev, s);
 }
 
 int system_if_up(struct device *dev)
@@ -1766,7 +1798,7 @@ int system_flush_iprules(void)
 
        rule.flags = IPRULE_INET4 | IPRULE_PRIORITY | IPRULE_LOOKUP;
 
-       rule.priority = 0;
+       rule.priority = 128;
        rule.lookup = RT_TABLE_LOCAL;
        rv |= system_iprule(&rule, RTM_NEWRULE);
 
@@ -1781,7 +1813,7 @@ int system_flush_iprules(void)
 
        rule.flags = IPRULE_INET6 | IPRULE_PRIORITY | IPRULE_LOOKUP;
 
-       rule.priority = 0;
+       rule.priority = 128;
        rule.lookup = RT_TABLE_LOCAL;
        rv |= system_iprule(&rule, RTM_NEWRULE);