From: Jiri Bohac <jbohac@suse.cz>
To: fubar@us.ibm.com
Cc: davem@davemloft.net, netdev@vger.kernel.org
Subject: [PATCH, RFC] bonding: prevent outgoing packets on inactive slaves
Date: Wed, 5 Aug 2009 18:24:29 +0200 [thread overview]
Message-ID: <20090805162429.GD16093@midget.suse.cz> (raw)
Applications exist that broadcast/multicast packets on all
devices in the system (e.g. avahi-mdns).
When a device is an inactive slave of a bond in active-backup
mode, its MAC address may be set identical to other divecies in
the bond. The broadcast/multicast packets may then confuse
switches to direct packets to the inactive slave, rather than the
active one.
This patch makes sure the TX queues on inactive slaves are
deactivated.
Signed-off-by: Jiri Bohac <jbohac@suse.cz>
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h
@@ -20,6 +20,7 @@
#include <linux/if_bonding.h>
#include <linux/kobject.h>
#include <linux/in6.h>
+#include <net/sch_generic.h>
#include "bond_3ad.h"
#include "bond_alb.h"
@@ -291,12 +292,21 @@ static inline void bond_set_slave_inactive_flags(struct slave *slave)
slave->dev->priv_flags |= IFF_SLAVE_INACTIVE;
if (slave_do_arp_validate(bond, slave))
slave->dev->priv_flags |= IFF_SLAVE_NEEDARP;
+
+ /* prevent outgoing frames on inactive slaves from confusing switches */
+ if (bond->params.mode == BOND_MODE_ACTIVEBACKUP)
+ dev_deactivate_tx(slave->dev);
}
static inline void bond_set_slave_active_flags(struct slave *slave)
{
+ struct bonding *bond = netdev_priv(slave->dev->master);
+
slave->state = BOND_STATE_ACTIVE;
slave->dev->priv_flags &= ~(IFF_SLAVE_INACTIVE | IFF_SLAVE_NEEDARP);
+
+ if (bond->params.mode == BOND_MODE_ACTIVEBACKUP)
+ dev_activate_tx(slave->dev);
}
static inline void bond_set_master_3ad_flags(struct bonding *bond)
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index 964ffa0..eee006a 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -296,6 +296,8 @@ extern void dev_init_scheduler(struct net_device *dev);
extern void dev_shutdown(struct net_device *dev);
extern void dev_activate(struct net_device *dev);
extern void dev_deactivate(struct net_device *dev);
+extern void dev_activate_tx(struct net_device *dev);
+extern void dev_deactivate_tx(struct net_device *dev);
extern void qdisc_reset(struct Qdisc *qdisc);
extern void qdisc_destroy(struct Qdisc *qdisc);
extern void qdisc_tree_decrease_qlen(struct Qdisc *qdisc, unsigned int n);
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 27d0381..514c73d 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -628,7 +628,7 @@ static void transition_one_qdisc(struct net_device *dev,
}
}
-void dev_activate(struct net_device *dev)
+void dev_activate_tx(struct net_device *dev)
{
int need_watchdog;
@@ -647,13 +647,19 @@ void dev_activate(struct net_device *dev)
need_watchdog = 0;
netdev_for_each_tx_queue(dev, transition_one_qdisc, &need_watchdog);
- transition_one_qdisc(dev, &dev->rx_queue, NULL);
if (need_watchdog) {
dev->trans_start = jiffies;
dev_watchdog_up(dev);
}
}
+EXPORT_SYMBOL(dev_activate_tx);
+
+void dev_activate(struct net_device *dev)
+{
+ dev_activate_tx(dev);
+ transition_one_qdisc(dev, &dev->rx_queue, NULL);
+}
static void dev_deactivate_queue(struct net_device *dev,
struct netdev_queue *dev_queue,
@@ -703,12 +709,18 @@ static bool some_qdisc_is_busy(struct net_device *dev)
return false;
}
-void dev_deactivate(struct net_device *dev)
+void dev_deactivate_tx(struct net_device *dev)
{
netdev_for_each_tx_queue(dev, dev_deactivate_queue, &noop_qdisc);
- dev_deactivate_queue(dev, &dev->rx_queue, &noop_qdisc);
dev_watchdog_down(dev);
+}
+EXPORT_SYMBOL(dev_deactivate_tx);
+
+void dev_deactivate(struct net_device *dev)
+{
+ dev_deactivate_tx(dev);
+ dev_deactivate_queue(dev, &dev->rx_queue, &noop_qdisc);
/* Wait for outstanding qdisc-less dev_queue_xmit calls. */
synchronize_rcu();
--
Jiri Bohac <jbohac@suse.cz>
SUSE Labs, SUSE CZ
next reply other threads:[~2009-08-05 16:24 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-05 16:24 Jiri Bohac [this message]
2009-08-05 16:57 ` [PATCH, RFC] bonding: prevent outgoing packets on inactive slaves Eric Dumazet
2009-08-06 10:43 ` Jiri Bohac
2009-08-06 12:28 ` Eric Dumazet
2009-08-05 17:01 ` Jay Vosburgh
2009-08-06 22:56 ` Jiri Bohac
[not found] ` <20090819155509.GA11829@midget.suse.cz>
[not found] ` <2495.1250729618@death.nxdomain.ibm.com>
[not found] ` <20090825133701.GC23138@midget.suse.cz>
[not found] ` <10377.1251221782@death.nxdomain.ibm.com>
2009-09-17 11:14 ` Jiri Bohac
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090805162429.GD16093@midget.suse.cz \
--to=jbohac@suse.cz \
--cc=davem@davemloft.net \
--cc=fubar@us.ibm.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).