+static void system_bridge_conf_multicast_deps(struct device *bridge,
+ struct bridge_config *cfg,
+ char *buf,
+ int buf_len)
+{
+ int val;
+
+ if (cfg->flags & BRIDGE_OPT_ROBUSTNESS ||
+ cfg->flags & BRIDGE_OPT_QUERY_INTERVAL ||
+ cfg->flags & BRIDGE_OPT_QUERY_RESPONSE_INTERVAL) {
+ val = cfg->robustness * cfg->query_interval +
+ cfg->query_response_interval;
+
+ snprintf(buf, buf_len, "%i", val);
+ system_bridge_set_membership_interval(bridge, buf);
+
+ val = cfg->robustness * cfg->query_interval +
+ cfg->query_response_interval / 2;
+
+ snprintf(buf, buf_len, "%i", val);
+ system_bridge_set_other_querier_timeout(bridge, buf);
+ }
+
+ if (cfg->flags & BRIDGE_OPT_QUERY_INTERVAL) {
+ val = cfg->query_interval / 4;
+
+ snprintf(buf, buf_len, "%i", val);
+ system_bridge_set_startup_query_interval(bridge, buf);
+ }
+}
+
+static void system_bridge_conf_multicast(struct device *bridge,
+ struct bridge_config *cfg,
+ char *buf,
+ int buf_len)
+{
+ system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/multicast_snooping",
+ bridge->ifname, cfg->igmp_snoop ? "1" : "0");
+
+ system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/multicast_querier",
+ bridge->ifname, cfg->multicast_querier ? "1" : "0");
+
+ snprintf(buf, buf_len, "%i", cfg->hash_max);
+ system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/hash_max",
+ bridge->ifname, buf);
+
+ if (bridge->settings.flags & DEV_OPT_MULTICAST_ROUTER) {
+ snprintf(buf, buf_len, "%i", bridge->settings.multicast_router);
+ system_bridge_set_multicast_router(bridge, buf, true);
+ }
+
+ if (cfg->flags & BRIDGE_OPT_ROBUSTNESS) {
+ snprintf(buf, buf_len, "%i", cfg->robustness);
+ system_bridge_set_robustness(bridge, buf);
+ }
+
+ if (cfg->flags & BRIDGE_OPT_QUERY_INTERVAL) {
+ snprintf(buf, buf_len, "%i", cfg->query_interval);
+ system_bridge_set_query_interval(bridge, buf);
+ }
+
+ if (cfg->flags & BRIDGE_OPT_QUERY_RESPONSE_INTERVAL) {
+ snprintf(buf, buf_len, "%i", cfg->query_response_interval);
+ system_bridge_set_query_response_interval(bridge, buf);
+ }
+
+ if (cfg->flags & BRIDGE_OPT_LAST_MEMBER_INTERVAL) {
+ snprintf(buf, buf_len, "%i", cfg->last_member_interval);
+ system_bridge_set_last_member_interval(bridge, buf);
+ }
+
+ system_bridge_conf_multicast_deps(bridge, cfg, buf, buf_len);
+}
+