https://bugzilla.redhat.com/show_bug.cgi?id=926954 https://bugzilla.redhat.com/show_bug.cgi?id=880035
Original patches backported https://git.kernel.org/cgit/linux/kernel/git/davem/net-next.git/commit/net/bridge?id=9f00b2e7cf241fa389733d41b615efdaa2cb0f5b https://git.kernel.org/cgit/linux/kernel/git/davem/net-next.git/commit/net/bridge?id=6b7df111ece130fa979a0c4f58e53674c1e47d3e The first patch form the series in not yet included. (cisco bug fix) https://git.kernel.org/cgit/linux/kernel/git/davem/net-next.git/commit/net/bridge?id=1c8ad5bfa2be5025b0c81e3c2decd0574d453ab1 Signed-off-by: Alexandre Derumier <[email protected]> --- ...-expire-the-mdb-entry-when-query-is-recei.patch | 144 ++++++++++++++++++++ ...e-send-query-as-soon-as-leave-is-received.patch | 58 ++++++++ Makefile | 2 + 3 files changed, 204 insertions(+) create mode 100644 0001-bridge-only-expire-the-mdb-entry-when-query-is-recei.patch create mode 100644 0002-bridge-send-query-as-soon-as-leave-is-received.patch diff --git a/0001-bridge-only-expire-the-mdb-entry-when-query-is-recei.patch b/0001-bridge-only-expire-the-mdb-entry-when-query-is-recei.patch new file mode 100644 index 0000000..cd357b4 --- /dev/null +++ b/0001-bridge-only-expire-the-mdb-entry-when-query-is-recei.patch @@ -0,0 +1,144 @@ +From 88654a86563317f36c38a279ea47e7aa09892192 Mon Sep 17 00:00:00 2001 +From: Alexandre Derumier <[email protected]> +Date: Mon, 3 Jun 2013 17:26:49 +0200 +Subject: [PATCH 1/2] bridge: only expire the mdb entry when query is received + +Currently we arm the expire timer when the mdb entry is added, however, +this causes problem when there is no querier sent +out after that. + +So we should only arm the timer when a corresponding query is received, as suggested by Herbert. +And he also mentioned "if there is no querier then group subscriptions shouldn't expire. +There has to be at least one querier in the network for this thing to work. +Otherwise it just degenerates into a non-snooping switch, which is OK." + +Signed-off-by: Alexandre Derumier <[email protected]> +--- + net/bridge/br_multicast.c | 37 +++++++++++-------------------------- + net/bridge/br_private.h | 1 + + 2 files changed, 12 insertions(+), 26 deletions(-) + +diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c +index 97b06de..ceb364a 100644 +--- a/net/bridge/br_multicast.c ++++ b/net/bridge/br_multicast.c +@@ -677,8 +677,6 @@ rehash: + + mp->br = br; + mp->addr = *group; +- setup_timer(&mp->timer, br_multicast_group_expired, +- (unsigned long)mp); + setup_timer(&mp->query_timer, br_multicast_group_query_expired, + (unsigned long)mp); + +@@ -696,7 +694,6 @@ static int br_multicast_add_group(struct net_bridge *br, + struct net_bridge_mdb_entry *mp; + struct net_bridge_port_group *p; + struct net_bridge_port_group **pp; +- unsigned long now = jiffies; + int err; + + spin_lock(&br->multicast_lock); +@@ -712,13 +709,12 @@ static int br_multicast_add_group(struct net_bridge *br, + if (!port) { + if (hlist_unhashed(&mp->mglist)) + hlist_add_head(&mp->mglist, &br->mglist); +- mod_timer(&mp->timer, now + br->multicast_membership_interval); + goto out; + } + + for (pp = &mp->ports; (p = *pp); pp = &p->next) { + if (p->port == port) +- goto found; ++ goto out; + if ((unsigned long)p->port < (unsigned long)port) + break; + } +@@ -739,8 +735,6 @@ static int br_multicast_add_group(struct net_bridge *br, + + rcu_assign_pointer(*pp, p); + +-found: +- mod_timer(&p->timer, now + br->multicast_membership_interval); + out: + err = 0; + +@@ -1151,6 +1145,10 @@ static int br_ip4_multicast_query(struct net_bridge *br, + if (!mp) + goto out; + ++ setup_timer(&mp->timer, br_multicast_group_expired, (unsigned long)mp); ++ mod_timer(&mp->timer, now + br->multicast_membership_interval); ++ mp->timer_armed = true; ++ + max_delay *= br->multicast_last_member_count; + + if (!hlist_unhashed(&mp->mglist) && +@@ -1220,6 +1218,10 @@ static int br_ip6_multicast_query(struct net_bridge *br, + if (!mp) + goto out; + ++ setup_timer(&mp->timer, br_multicast_group_expired, (unsigned long)mp); ++ mod_timer(&mp->timer, now + br->multicast_membership_interval); ++ mp->timer_armed = true; ++ + max_delay *= br->multicast_last_member_count; + if (!hlist_unhashed(&mp->mglist) && + (timer_pending(&mp->timer) ? +@@ -1266,7 +1268,7 @@ static void br_multicast_leave_group(struct net_bridge *br, + br->multicast_last_member_interval; + + if (!port) { +- if (!hlist_unhashed(&mp->mglist) && ++ if (!hlist_unhashed(&mp->mglist) && mp->timer_armed && + (timer_pending(&mp->timer) ? + time_after(mp->timer.expires, time) : + try_to_del_timer_sync(&mp->timer) >= 0)) { +@@ -1276,24 +1278,6 @@ static void br_multicast_leave_group(struct net_bridge *br, + mod_timer(&mp->query_timer, now); + } + +- goto out; +- } +- +- for (p = mp->ports; p; p = p->next) { +- if (p->port != port) +- continue; +- +- if (!hlist_unhashed(&p->mglist) && +- (timer_pending(&p->timer) ? +- time_after(p->timer.expires, time) : +- try_to_del_timer_sync(&p->timer) >= 0)) { +- mod_timer(&p->timer, time); +- +- p->queries_sent = 0; +- mod_timer(&p->query_timer, now); +- } +- +- break; + } + + out: +@@ -1650,6 +1634,7 @@ void br_multicast_stop(struct net_bridge *br) + hlist_for_each_entry_safe(mp, p, n, &mdb->mhash[i], + hlist[ver]) { + del_timer(&mp->timer); ++ mp->timer_armed = false; + del_timer(&mp->query_timer); + call_rcu_bh(&mp->rcu, br_multicast_free_group); + } +diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h +index 03a4afc..e8ecef1 100644 +--- a/net/bridge/br_private.h ++++ b/net/bridge/br_private.h +@@ -91,6 +91,7 @@ struct net_bridge_mdb_entry + struct timer_list query_timer; + struct br_ip addr; + u32 queries_sent; ++ bool timer_armed; + }; + + struct net_bridge_mdb_htable +-- +1.7.10.4 + diff --git a/0002-bridge-send-query-as-soon-as-leave-is-received.patch b/0002-bridge-send-query-as-soon-as-leave-is-received.patch new file mode 100644 index 0000000..6ba5e46 --- /dev/null +++ b/0002-bridge-send-query-as-soon-as-leave-is-received.patch @@ -0,0 +1,58 @@ +From fa6209a8834a92dc83dd31451738cb6a46c18126 Mon Sep 17 00:00:00 2001 +From: Alexandre Derumier <[email protected]> +Date: Mon, 3 Jun 2013 17:35:42 +0200 +Subject: [PATCH 2/2] bridge: send query as soon as leave is received + +Continue sending queries when leave is received if the user marks it as a querier. + +Signed-off-by: Alexandre Derumier <[email protected]> +--- + net/bridge/br_multicast.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c +index ceb364a..cb308ff 100644 +--- a/net/bridge/br_multicast.c ++++ b/net/bridge/br_multicast.c +@@ -1249,6 +1249,8 @@ static void br_multicast_leave_group(struct net_bridge *br, + struct net_bridge_mdb_htable *mdb; + struct net_bridge_mdb_entry *mp; + struct net_bridge_port_group *p; ++ struct net_bridge_port_group **pp; ++ + unsigned long now; + unsigned long time; + +@@ -1263,6 +1265,29 @@ static void br_multicast_leave_group(struct net_bridge *br, + if (!mp) + goto out; + ++ if (br->multicast_querier && ++ !timer_pending(&br->multicast_querier_timer)) { ++ __br_multicast_send_query(br, port, &mp->addr); ++ ++ time = jiffies + br->multicast_last_member_count * ++ br->multicast_last_member_interval; ++ mod_timer(port ? &port->multicast_query_timer : ++ &br->multicast_query_timer, time); ++ ++ for (pp = &mp->ports; (p = *pp); pp = &p->next) { ++ if (p->port != port) ++ continue; ++ ++ if (!hlist_unhashed(&p->mglist) && ++ (timer_pending(&p->timer) ? ++ time_after(p->timer.expires, time) : ++ try_to_del_timer_sync(&p->timer) >= 0)) { ++ mod_timer(&p->timer, time); ++ } ++ ++ break; ++ } ++ } + now = jiffies; + time = now + br->multicast_last_member_count * + br->multicast_last_member_interval; +-- +1.7.10.4 + diff --git a/Makefile b/Makefile index b302edd..f528014 100644 --- a/Makefile +++ b/Makefile @@ -149,6 +149,8 @@ ${KERNEL_SRC}/README: ${KERNEL_SRC}.org/README cd ${KERNEL_SRC}; patch -p1 <../0003-bridge-disable-querier.patch cd ${KERNEL_SRC}; patch -p1 <../0004-bridge-disable-querier.patch cd ${KERNEL_SRC}; patch -p1 <../0005-bridge-disable-querier.patch + cd ${KERNEL_SRC}; patch -p1 <../0001-bridge-only-expire-the-mdb-entry-when-query-is-recei.patch + cd ${KERNEL_SRC}; patch -p1 <../0002-bridge-send-query-as-soon-as-leave-is-received.patch cd ${KERNEL_SRC}; patch -p1 <../fix-aspm-policy.patch cd ${KERNEL_SRC}; patch -p1 <../kbuild-generate-mudules-builtin.patch cd ${KERNEL_SRC}; patch -p1 <../add-tiocgdev-ioctl.patch -- 1.7.10.4 _______________________________________________ pve-devel mailing list [email protected] http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
