From: Veaceslav Falico <vfalico@redhat.com>
To: Jay Vosburgh <fubar@us.ibm.com>
Cc: netdev@vger.kernel.org, Andy Gospodarek <andy@greyhouse.net>,
"David S. Miller" <davem@davemloft.net>
Subject: Re: [PATCH net-next 0/6] bonding: only rely on arp packets if arp monitor is used
Date: Fri, 17 Jan 2014 07:57:18 +0100 [thread overview]
Message-ID: <20140117065718.GA5699@redhat.com> (raw)
In-Reply-To: <21868.1389911939@death.nxdomain>
On Thu, Jan 16, 2014 at 02:38:59PM -0800, Jay Vosburgh wrote:
...snip...
> I think the bottom line here is pretty simple:
>
> Using the ARP monitor with the loadbalance modes is not a common
>configuration in my experience, and making it work is tricky. However,
>anyone using it today will be relying on the current behavior, which we
>therefore must not change.
Yep, agreed. It might be against the documentation, these use cases might
be weird/illogical - but they (kind of) work, and we both agree that this
change might break them, so it's definitely a no go.
OTOH, I'd still like to help people who have some kind of broadcast traffic
(STP, CDP, some routing etc.) running over network and keeping their slaves
up (and those that cannot/don't want to use arp_validate=3).
What do you think about this*? It's on top of this series, extends
arp_validate to (not) filter out ARPs on not-validated slaves and permits
it to be used in non-AB mode (also, we don't need that bond->lock, we're
always under RCU).
*:
diff --git a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt
index a4d925e..7223ef4 100644
--- a/Documentation/networking/bonding.txt
+++ b/Documentation/networking/bonding.txt
@@ -279,19 +279,45 @@ arp_validate
none or 0
- No validation is performed. This is the default.
+ No validation is performed. This is the default. Any arriving
+ traffic (arp or non-arp) is considered a proof that the slave
+ is up.
active or 1
- Validation is performed only for the active slave.
+ Validation is performed only for the active slave. Only ARPs
+ that arrive from any arp_ip_target are considered legit. The
+ backup slave still does no validation (as if arp_validate=0).
backup or 2
- Validation is performed only for backup slaves.
+ Validation is performed only for backup slaves. Only ARPs
+ that arrive from any arp_ip_target are considered legit. The
+ active slave still has no validation (as if arp_validate=0).
all or 3
- Validation is performed for all slaves.
+ Validation is performed for all slaves. Only ARPs
+ that arrive from any arp_ip_target are considered legit.
+
+ arp or 4
+
+ Any arp packet is accepted as a proof that any slave is up,
+ but no IP-based validation is made.
+
+ active_arp or 5
+
+ Validation is performed only for the active slave. Only ARPs
+ that arrive from any arp_ip_target are considered legit. The
+ backup slave validates only arp packets, but doesn't check the
+ source (as if arp_validate=4).
+
+ backup_any or 6
+
+ Validation is performed only for backup slaves. Only ARPs
+ that arrive from any arp_ip_target are considered legit. The
+ active slave validates only arp packets, but doesn't check the
+ source (as if arp_validate=4).
For the active slave, the validation checks ARP replies to
confirm that they were generated by an arp_ip_target. Since
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 0f613ae..2ef1d5a 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -246,6 +246,9 @@ const struct bond_parm_tbl arp_validate_tbl[] = {
{ "active", BOND_ARP_VALIDATE_ACTIVE},
{ "backup", BOND_ARP_VALIDATE_BACKUP},
{ "all", BOND_ARP_VALIDATE_ALL},
+{ "arp", BOND_ARP_VALIDATE_ARP},
+{ "active_arp", BOND_ARP_VALIDATE_ACTIVE_ARP},
+{ "backup_arp", BOND_ARP_VALIDATE_BACKUP_ARP},
{ NULL, -1},
};
@@ -2284,16 +2287,15 @@ int bond_arp_rcv(const struct sk_buff *skb, struct bonding *bond,
struct arphdr *arp = (struct arphdr *)skb->data;
unsigned char *arp_ptr;
__be32 sip, tip;
- int alen;
-
- if (skb->protocol != __cpu_to_be16(ETH_P_ARP))
- return RX_HANDLER_ANOTHER;
-
- read_lock(&bond->lock);
+ int alen, is_arp = skb->protocol == __cpu_to_be16(ETH_P_ARP);
if (!slave_do_arp_validate(bond, slave)) {
- slave->last_arp_rx = jiffies;
- goto out_unlock;
+ if ((slave_do_arp_validate_only(bond, slave) && is_arp) ||
+ !slave_do_arp_validate_only(bond, slave))
+ slave->last_arp_rx = jiffies;
+ return RX_HANDLER_ANOTHER;
+ } else if (!is_arp) {
+ return RX_HANDLER_ANOTHER;
}
alen = arp_hdr_len(bond->dev);
@@ -2349,7 +2351,6 @@ int bond_arp_rcv(const struct sk_buff *skb, struct bonding *bond,
bond_validate_arp(bond, slave, tip, sip);
out_unlock:
- read_unlock(&bond->lock);
if (arp != (struct arphdr *)skb->data)
kfree(arp);
return RX_HANDLER_ANOTHER;
@@ -4181,10 +4182,6 @@ static int bond_check_params(struct bond_params *params)
}
if (arp_validate) {
- if (bond_mode != BOND_MODE_ACTIVEBACKUP) {
- pr_err("arp_validate only supported in active-backup mode\n");
- return -EINVAL;
- }
if (!arp_interval) {
pr_err("arp_validate requires arp_interval\n");
return -EINVAL;
diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c
index 1bab20e..9d6d231 100644
--- a/drivers/net/bonding/bond_options.c
+++ b/drivers/net/bonding/bond_options.c
@@ -434,12 +434,6 @@ int bond_option_arp_validate_set(struct bonding *bond, int arp_validate)
return -EINVAL;
}
- if (bond->params.mode != BOND_MODE_ACTIVEBACKUP) {
- pr_err("%s: arp_validate only supported in active-backup mode.\n",
- bond->dev->name);
- return -EINVAL;
- }
-
pr_info("%s: setting arp_validate to %s (%d).\n",
bond->dev->name, arp_validate_tbl[arp_validate].modename,
arp_validate);
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
index 9f07af1..19eb023 100644
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h
@@ -319,6 +319,11 @@ static inline bool bond_is_active_slave(struct slave *slave)
#define BOND_ARP_VALIDATE_BACKUP (1 << BOND_STATE_BACKUP)
#define BOND_ARP_VALIDATE_ALL (BOND_ARP_VALIDATE_ACTIVE | \
BOND_ARP_VALIDATE_BACKUP)
+#define BOND_ARP_VALIDATE_ARP (BOND_ARP_VALIDATE_ALL + 1) /* бля... */
+#define BOND_ARP_VALIDATE_ACTIVE_ARP (BOND_ARP_VALIDATE_ACTIVE | \
+ BOND_ARP_VALIDATE_ARP)
+#define BOND_ARP_VALIDATE_BACKUP_ARP (BOND_ARP_VALIDATE_BACKUP | \
+ BOND_ARP_VALIDATE_ARP)
static inline int slave_do_arp_validate(struct bonding *bond,
struct slave *slave)
@@ -326,6 +331,12 @@ static inline int slave_do_arp_validate(struct bonding *bond,
return bond->params.arp_validate & (1 << bond_slave_state(slave));
}
+static inline int slave_do_arp_validate_only(struct bonding *bond,
+ struct slave *slave)
+{
+ return bond->params.arp_validate & BOND_ARP_VALIDATE_ARP;
+}
+
/* Get the oldest arp which we've received on this slave for bond's
* arp_targets.
*/
>
> -J
next prev parent reply other threads:[~2014-01-17 7:00 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-16 2:05 [PATCH net-next 0/6] bonding: only rely on arp packets if arp monitor is used Veaceslav Falico
2014-01-16 2:05 ` [PATCH net-next 1/6] bonding: always update last_arp_rx on arp recieve Veaceslav Falico
2014-01-16 2:05 ` [PATCH net-next 2/6] bonding: always set recv_probe to bond_arp_rcv in arp monitor Veaceslav Falico
2014-01-16 2:05 ` [PATCH net-next 3/6] bonding: use last_arp_rx in slave_last_rx() Veaceslav Falico
2014-01-16 2:05 ` [PATCH net-next 4/6] bonding: rename slave_last_rx() to slave_last_arp_rx() Veaceslav Falico
2014-01-16 2:05 ` [PATCH net-next 5/6] bonding: use last_arp_rx in bond_loadbalance_arp_mon() Veaceslav Falico
2014-01-16 2:05 ` [PATCH net-next 6/6] bonding: remove useless updating of slave->dev->last_rx Veaceslav Falico
2014-01-16 5:09 ` [PATCH net-next 0/6] bonding: only rely on arp packets if arp monitor is used Jay Vosburgh
2014-01-16 6:01 ` David Miller
2014-01-17 8:02 ` Veaceslav Falico
2014-01-16 8:41 ` Veaceslav Falico
2014-01-16 22:38 ` Jay Vosburgh
2014-01-17 6:57 ` Veaceslav Falico [this message]
2014-01-17 17:07 ` Veaceslav Falico
2014-01-16 5:53 ` David Miller
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=20140117065718.GA5699@redhat.com \
--to=vfalico@redhat.com \
--cc=andy@greyhouse.net \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.