spec: set CONFIG_LOCALVERSION
[platform/kernel/linux-rpi.git] / net / bridge / br_multicast.c
index f3d7511..db4f264 100644 (file)
@@ -82,6 +82,9 @@ static void br_multicast_find_del_pg(struct net_bridge *br,
                                     struct net_bridge_port_group *pg);
 static void __br_multicast_stop(struct net_bridge_mcast *brmctx);
 
+static int br_mc_disabled_update(struct net_device *dev, bool value,
+                                struct netlink_ext_ack *extack);
+
 static struct net_bridge_port_group *
 br_sg_port_find(struct net_bridge *br,
                struct net_bridge_port_group_sg_key *sg_p)
@@ -1156,6 +1159,7 @@ struct net_bridge_mdb_entry *br_multicast_new_group(struct net_bridge *br,
                return mp;
 
        if (atomic_read(&br->mdb_hash_tbl.nelems) >= br->hash_max) {
+               br_mc_disabled_update(br->dev, false, NULL);
                br_opt_toggle(br, BROPT_MULTICAST_ENABLED, false);
                return ERR_PTR(-E2BIG);
        }
@@ -4522,6 +4526,38 @@ int br_multicast_set_mld_version(struct net_bridge_mcast *brmctx,
 }
 #endif
 
+void br_multicast_set_query_intvl(struct net_bridge_mcast *brmctx,
+                                 unsigned long val)
+{
+       unsigned long intvl_jiffies = clock_t_to_jiffies(val);
+
+       if (intvl_jiffies < BR_MULTICAST_QUERY_INTVL_MIN) {
+               br_info(brmctx->br,
+                       "trying to set multicast query interval below minimum, setting to %lu (%ums)\n",
+                       jiffies_to_clock_t(BR_MULTICAST_QUERY_INTVL_MIN),
+                       jiffies_to_msecs(BR_MULTICAST_QUERY_INTVL_MIN));
+               intvl_jiffies = BR_MULTICAST_QUERY_INTVL_MIN;
+       }
+
+       brmctx->multicast_query_interval = intvl_jiffies;
+}
+
+void br_multicast_set_startup_query_intvl(struct net_bridge_mcast *brmctx,
+                                         unsigned long val)
+{
+       unsigned long intvl_jiffies = clock_t_to_jiffies(val);
+
+       if (intvl_jiffies < BR_MULTICAST_STARTUP_QUERY_INTVL_MIN) {
+               br_info(brmctx->br,
+                       "trying to set multicast startup query interval below minimum, setting to %lu (%ums)\n",
+                       jiffies_to_clock_t(BR_MULTICAST_STARTUP_QUERY_INTVL_MIN),
+                       jiffies_to_msecs(BR_MULTICAST_STARTUP_QUERY_INTVL_MIN));
+               intvl_jiffies = BR_MULTICAST_STARTUP_QUERY_INTVL_MIN;
+       }
+
+       brmctx->multicast_startup_query_interval = intvl_jiffies;
+}
+
 /**
  * br_multicast_list_adjacent - Returns snooped multicast addresses
  * @dev:       The bridge port adjacent to which to retrieve addresses