mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-22 01:13:00 +02:00
187 lines
6.4 KiB
Diff
187 lines
6.4 KiB
Diff
From faed56e32dc877474ef30a545e631b05a9cb99e2 Mon Sep 17 00:00:00 2001
|
|
From: Joachim Wiberg <troglobit@gmail.com>
|
|
Date: Thu, 4 Apr 2024 16:36:30 +0200
|
|
Subject: [PATCH 21/30] net: bridge: drop delay for applying strict multicast
|
|
filtering
|
|
|
|
This *local* patch drops the initial delay before applying strict multicast
|
|
filtering, introduced in [1] and recently updated in [2].
|
|
|
|
The main reason for this patch is RFC conformance and customer expectations.
|
|
At power on we assume the querier role by default and are expected to stop
|
|
unknown flooding as soon as we have a membership report in place, not after
|
|
10 seconds.
|
|
|
|
A proper fix for upstreaming could be to add a knob to disable the delay.
|
|
|
|
[1]: https://lore.kernel.org/netdev/1375311980-25575-1-git-send-email-linus.luessing@web.de/
|
|
[2]: https://lore.kernel.org/netdev/20240127175033.9640-1-linus.luessing@c0d3.blue/
|
|
|
|
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
|
|
---
|
|
net/bridge/br_multicast.c | 42 +++++++--------------------------------
|
|
net/bridge/br_private.h | 4 +---
|
|
2 files changed, 8 insertions(+), 38 deletions(-)
|
|
|
|
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
|
|
index 1ae021be0a7b..dd815b0fa8f8 100644
|
|
--- a/net/bridge/br_multicast.c
|
|
+++ b/net/bridge/br_multicast.c
|
|
@@ -1762,10 +1762,6 @@ static void br_ip6_multicast_querier_expired(struct timer_list *t)
|
|
}
|
|
#endif
|
|
|
|
-static void br_multicast_query_delay_expired(struct timer_list *t)
|
|
-{
|
|
-}
|
|
-
|
|
static void br_multicast_select_own_querier(struct net_bridge_mcast *brmctx,
|
|
struct br_ip *ip,
|
|
struct sk_buff *skb)
|
|
@@ -3257,12 +3253,8 @@ int br_multicast_dump_querier_state(struct sk_buff *skb,
|
|
|
|
static void
|
|
br_multicast_update_query_timer(struct net_bridge_mcast *brmctx,
|
|
- struct bridge_mcast_other_query *query,
|
|
- unsigned long max_delay)
|
|
+ struct bridge_mcast_other_query *query)
|
|
{
|
|
- if (!timer_pending(&query->timer))
|
|
- mod_timer(&query->delay_timer, jiffies + max_delay);
|
|
-
|
|
mod_timer(&query->timer, jiffies + brmctx->multicast_querier_interval);
|
|
}
|
|
|
|
@@ -3453,13 +3445,12 @@ static void
|
|
br_ip4_multicast_query_received(struct net_bridge_mcast *brmctx,
|
|
struct net_bridge_mcast_port *pmctx,
|
|
struct bridge_mcast_other_query *query,
|
|
- struct br_ip *saddr,
|
|
- unsigned long max_delay)
|
|
+ struct br_ip *saddr)
|
|
{
|
|
if (!br_multicast_select_querier(brmctx, pmctx, saddr))
|
|
return;
|
|
|
|
- br_multicast_update_query_timer(brmctx, query, max_delay);
|
|
+ br_multicast_update_query_timer(brmctx, query);
|
|
br_ip4_multicast_mark_router(brmctx, pmctx);
|
|
}
|
|
|
|
@@ -3468,13 +3459,12 @@ static void
|
|
br_ip6_multicast_query_received(struct net_bridge_mcast *brmctx,
|
|
struct net_bridge_mcast_port *pmctx,
|
|
struct bridge_mcast_other_query *query,
|
|
- struct br_ip *saddr,
|
|
- unsigned long max_delay)
|
|
+ struct br_ip *saddr)
|
|
{
|
|
if (!br_multicast_select_querier(brmctx, pmctx, saddr))
|
|
return;
|
|
|
|
- br_multicast_update_query_timer(brmctx, query, max_delay);
|
|
+ br_multicast_update_query_timer(brmctx, query);
|
|
br_ip6_multicast_mark_router(brmctx, pmctx);
|
|
}
|
|
#endif
|
|
@@ -3528,7 +3518,7 @@ static void br_ip4_multicast_query(struct net_bridge_mcast *brmctx,
|
|
|
|
br_ip4_multicast_query_received(brmctx, pmctx,
|
|
&brmctx->ip4_other_query,
|
|
- &saddr, max_delay);
|
|
+ &saddr);
|
|
goto out;
|
|
}
|
|
|
|
@@ -3616,7 +3606,7 @@ static int br_ip6_multicast_query(struct net_bridge_mcast *brmctx,
|
|
|
|
br_ip6_multicast_query_received(brmctx, pmctx,
|
|
&brmctx->ip6_other_query,
|
|
- &saddr, max_delay);
|
|
+ &saddr);
|
|
goto out;
|
|
} else if (!group) {
|
|
goto out;
|
|
@@ -4124,8 +4114,6 @@ void br_multicast_ctx_init(struct net_bridge *br,
|
|
br_ip4_multicast_local_router_expired, 0);
|
|
timer_setup(&brmctx->ip4_other_query.timer,
|
|
br_ip4_multicast_querier_expired, 0);
|
|
- timer_setup(&brmctx->ip4_other_query.delay_timer,
|
|
- br_multicast_query_delay_expired, 0);
|
|
timer_setup(&brmctx->ip4_own_query.timer,
|
|
br_ip4_multicast_query_expired, 0);
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
@@ -4133,8 +4121,6 @@ void br_multicast_ctx_init(struct net_bridge *br,
|
|
br_ip6_multicast_local_router_expired, 0);
|
|
timer_setup(&brmctx->ip6_other_query.timer,
|
|
br_ip6_multicast_querier_expired, 0);
|
|
- timer_setup(&brmctx->ip6_other_query.delay_timer,
|
|
- br_multicast_query_delay_expired, 0);
|
|
timer_setup(&brmctx->ip6_own_query.timer,
|
|
br_ip6_multicast_query_expired, 0);
|
|
#endif
|
|
@@ -4269,12 +4255,10 @@ static void __br_multicast_stop(struct net_bridge_mcast *brmctx)
|
|
{
|
|
del_timer_sync(&brmctx->ip4_mc_router_timer);
|
|
del_timer_sync(&brmctx->ip4_other_query.timer);
|
|
- del_timer_sync(&brmctx->ip4_other_query.delay_timer);
|
|
del_timer_sync(&brmctx->ip4_own_query.timer);
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
del_timer_sync(&brmctx->ip6_mc_router_timer);
|
|
del_timer_sync(&brmctx->ip6_other_query.timer);
|
|
- del_timer_sync(&brmctx->ip6_other_query.delay_timer);
|
|
del_timer_sync(&brmctx->ip6_own_query.timer);
|
|
#endif
|
|
}
|
|
@@ -4728,8 +4712,6 @@ EXPORT_SYMBOL_GPL(br_multicast_router);
|
|
|
|
int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val)
|
|
{
|
|
- unsigned long max_delay;
|
|
-
|
|
val = !!val;
|
|
|
|
spin_lock_bh(&brmctx->br->multicast_lock);
|
|
@@ -4740,19 +4722,9 @@ int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val)
|
|
if (!val)
|
|
goto unlock;
|
|
|
|
- max_delay = brmctx->multicast_query_response_interval;
|
|
-
|
|
- if (!timer_pending(&brmctx->ip4_other_query.timer))
|
|
- mod_timer(&brmctx->ip4_other_query.delay_timer,
|
|
- jiffies + max_delay);
|
|
-
|
|
br_multicast_start_querier(brmctx, &brmctx->ip4_own_query);
|
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
- if (!timer_pending(&brmctx->ip6_other_query.timer))
|
|
- mod_timer(&brmctx->ip6_other_query.delay_timer,
|
|
- jiffies + max_delay);
|
|
-
|
|
br_multicast_start_querier(brmctx, &brmctx->ip6_own_query);
|
|
#endif
|
|
|
|
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
|
|
index 76a0fb2c2941..dd36afeaa1a0 100644
|
|
--- a/net/bridge/br_private.h
|
|
+++ b/net/bridge/br_private.h
|
|
@@ -80,7 +80,6 @@ struct bridge_mcast_own_query {
|
|
/* other querier */
|
|
struct bridge_mcast_other_query {
|
|
struct timer_list timer;
|
|
- struct timer_list delay_timer;
|
|
};
|
|
|
|
/* selected querier */
|
|
@@ -1168,8 +1167,7 @@ __br_multicast_querier_exists(struct net_bridge_mcast *brmctx,
|
|
own_querier_enabled = false;
|
|
}
|
|
|
|
- return !timer_pending(&querier->delay_timer) &&
|
|
- (own_querier_enabled || timer_pending(&querier->timer));
|
|
+ return own_querier_enabled || timer_pending(&querier->timer);
|
|
}
|
|
|
|
static inline bool br_multicast_querier_exists(struct net_bridge_mcast *brmctx,
|