#include <fcntl.h>
#include <glob.h>
#include <time.h>
+#include <unistd.h>
#include <netlink/msg.h>
#include <netlink/attr.h>
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;
}
}
+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) {
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)
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);
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);