From: Eric Dumazet <dada1@cosmosbay.com>
To: Jiri Pirko <jpirko@redhat.com>
Cc: fubar@us.ibm.com, netdev@vger.kernel.org,
bridge@lists.linux-foundation.org, mschmidt@redhat.com,
bonding-devel@lists.sourceforge.net, jgarzik@pobox.com,
davem@davemloft.net
Subject: Re: [Bridge] [PATCH net-next] bonding: allow bond in mode balance-alb to work properly in bridge -try4.1
Date: Tue, 26 May 2009 18:59:53 +0200 [thread overview]
Message-ID: <4A1C2009.4010507@cosmosbay.com> (raw)
In-Reply-To: <20090526151717.GB11147@psychotron.englab.brq.redhat.com>
Jiri Pirko a écrit :
> [PATCH net-next] bonding: allow bond in mode balance-alb to work properly in bridge -try4.1
>
> Hi all.
>
> The problem is described in following bugzilla:
> https://bugzilla.redhat.com/show_bug.cgi?id=487763
>
> Basically here's what's going on. In every mode, bonding interface uses the same
> mac address for all enslaved devices (except fail_over_mac). Only balance-alb
> will simultaneously use multiple MAC addresses across different slaves. When you
> put this kind of bond device into a bridge it will only add one of mac adresses
> into a hash list of mac addresses, say X. This mac address is marked as local.
> But this bonding interface also has mac address Y. Now then packet arrives with
> destination address Y, this address is not marked as local and the packed looks
> like it needs to be forwarded. This packet is then lost which is wrong.
>
> Notice that interfaces can be added and removed from bond while it is in bridge.
>
> ***
> When the multiple addresses for bridge port approach failed to solve this issue
> due to STP I started to think other way to solve this. I returned to previous
> solution but tweaked one.
>
> This patch solves the situation in the bonding without touching bridge code.
> For every incoming frame to bonding the destination address is compared to
> current address of the slave device from which tha packet came. If these two
> match destination address is replaced by mac address of the master. This address
> is known by bridge so it is delivered properly.
>
> I experimentally tried that this works as good as searching through the slave
> list (v4 of this patch).
>
> I was forced to create a new header because I need to use
> compare_ether_addr_64bits() (defined in linux/etherdevice.h) in
> linux/netdevice.h. I've hit some cross include issues. I think that it's good
> to have skb_bond_should_drop() in a separate file anyway.
>
> Jirka
>
>
> Signed-off-by: Jiri Pirko <jpirko@redhat.com>
>
> diff --git a/include/linux/bonding.h b/include/linux/bonding.h
> new file mode 100644
> index 0000000..3081ddb
> --- /dev/null
> +++ b/include/linux/bonding.h
> @@ -0,0 +1,78 @@
> +/*
> + * include/linux/bonding.h
> + *
> + * Copyright (C) 2009 Jiri Pirko <jpirko@redhat.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2
> + * as published by the Free Software Foundation.
> + *
> + * Bonding device helpers.
> + */
> +
> +#ifndef _LINUX_BONDING_H
> +#define _LINUX_BONDING_H
> +
> +#ifdef __KERNEL__
> +
> +#include <linux/skbuff.h>
> +#include <linux/netdevice.h>
> +#include <linux/if.h>
> +#include <linux/etherdevice.h>
> +#include <linux/if_ether.h>
> +
> +static inline void skb_bond_set_mac_by_master(struct sk_buff *skb,
> + struct net_device *dev,
> + struct net_device *master)
> +{
> + unsigned char *dest = eth_hdr(skb)->h_dest;
> +
> + if (compare_ether_addr_64bits(dest, master->dev_addr) &&
> + !compare_ether_addr_64bits(dest, dev->dev_addr))
> + memcpy(dest, master->dev_addr, ETH_ALEN);
But couldnt we test skb->pkt_type == PACKET_HOST instead,
Or eth_type_trans() not yet called at this point ?
I would suggest :
if (skb->pkt_type == PACKET_HOST)
memcpy(dest, master->dev_addr, ETH_ALEN);
> +}
> +
> +/* On bonding slaves other than the currently active slave, suppress
> + * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and
> + * ARP on active-backup slaves with arp_validate enabled.
> + */
> +static inline int skb_bond_should_drop(struct sk_buff *skb)
> +{
> + struct net_device *dev = skb->dev;
> + struct net_device *master = dev->master;
> +
> + if (master) {
> + if (master->priv_flags & IFF_MASTER_ARPMON)
> + dev->last_rx = jiffies;
> +
> + if ((master->priv_flags & IFF_MASTER_ALB) && master->br_port) {
> + /* Do address unmangle. The local destination address
> + * will be always the one master has. Provides the right
> + * functionality in a bridge.
> + */
> + skb_bond_set_mac_by_master(skb, dev, master);
> + }
> +
> + if (dev->priv_flags & IFF_SLAVE_INACTIVE) {
> + if ((dev->priv_flags & IFF_SLAVE_NEEDARP) &&
> + skb->protocol == __cpu_to_be16(ETH_P_ARP))
> + return 0;
> +
> + if (master->priv_flags & IFF_MASTER_ALB) {
> + if (skb->pkt_type != PACKET_BROADCAST &&
> + skb->pkt_type != PACKET_MULTICAST)
> + return 0;
> + }
> + if (master->priv_flags & IFF_MASTER_8023AD &&
> + skb->protocol == __cpu_to_be16(ETH_P_SLOW))
> + return 0;
> +
> + return 1;
> + }
> + }
> + return 0;
> +}
> +
> +#endif /* __KERNEL__ */
> +
> +#endif /* _LINUX_BONDING_H */
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index ae3c209..06e24ae 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -1897,39 +1897,6 @@ static inline void netif_set_gso_max_size(struct net_device *dev,
> dev->gso_max_size = size;
> }
>
> -/* On bonding slaves other than the currently active slave, suppress
> - * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and
> - * ARP on active-backup slaves with arp_validate enabled.
> - */
> -static inline int skb_bond_should_drop(struct sk_buff *skb)
> -{
> - struct net_device *dev = skb->dev;
> - struct net_device *master = dev->master;
> -
> - if (master) {
> - if (master->priv_flags & IFF_MASTER_ARPMON)
> - dev->last_rx = jiffies;
> -
> - if (dev->priv_flags & IFF_SLAVE_INACTIVE) {
> - if ((dev->priv_flags & IFF_SLAVE_NEEDARP) &&
> - skb->protocol == __cpu_to_be16(ETH_P_ARP))
> - return 0;
> -
> - if (master->priv_flags & IFF_MASTER_ALB) {
> - if (skb->pkt_type != PACKET_BROADCAST &&
> - skb->pkt_type != PACKET_MULTICAST)
> - return 0;
> - }
> - if (master->priv_flags & IFF_MASTER_8023AD &&
> - skb->protocol == __cpu_to_be16(ETH_P_SLOW))
> - return 0;
> -
> - return 1;
> - }
> - }
> - return 0;
> -}
> -
> extern struct pernet_operations __net_initdata loopback_net_ops;
>
> static inline int dev_ethtool_get_settings(struct net_device *dev,
> diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
> index 7f7de1a..c6eae40 100644
> --- a/net/8021q/vlan_core.c
> +++ b/net/8021q/vlan_core.c
> @@ -2,6 +2,7 @@
> #include <linux/netdevice.h>
> #include <linux/if_vlan.h>
> #include <linux/netpoll.h>
> +#include <linux/bonding.h>
> #include "vlan.h"
>
> /* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */
> diff --git a/net/core/dev.c b/net/core/dev.c
> index 241613f..221b43f 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -127,6 +127,7 @@
> #include <linux/jhash.h>
> #include <linux/random.h>
> #include <trace/napi.h>
> +#include <linux/bonding.h>
>
> #include "net-sysfs.h"
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
next prev parent reply other threads:[~2009-05-26 16:59 UTC|newest]
Thread overview: 198+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-13 18:33 [Bridge] [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge Jiri Pirko
2009-03-13 18:33 ` Jiri Pirko
2009-03-14 5:39 ` [Bridge] " Stephen Hemminger
2009-03-14 5:39 ` Stephen Hemminger
2009-03-14 9:49 ` [Bridge] " Jiri Pirko
2009-03-14 9:49 ` Jiri Pirko
2009-03-15 23:12 ` [Bridge] " Stephen Hemminger
2009-03-15 23:12 ` Stephen Hemminger
2009-03-16 11:11 ` [Bridge] " Jiri Pirko
2009-03-16 11:11 ` Jiri Pirko
2009-03-19 6:20 ` [Bridge] " David Miller
2009-03-19 6:20 ` David Miller
2009-03-19 8:44 ` [Bridge] " Jiri Pirko
2009-03-19 8:44 ` Jiri Pirko
2009-03-19 10:21 ` [Bridge] " David Miller
2009-03-19 10:21 ` David Miller
2009-03-19 11:19 ` [Bridge] " Jiri Pirko
2009-03-19 11:19 ` Jiri Pirko
2009-03-19 8:50 ` [Bridge] " Patrick McHardy
2009-03-19 8:50 ` Patrick McHardy
2009-03-19 16:31 ` [Bridge] " Jiri Pirko
2009-03-19 16:31 ` Jiri Pirko
2009-03-25 13:04 ` [Bridge] [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge -try2 Jiri Pirko
2009-03-25 13:04 ` Jiri Pirko
2009-03-25 13:40 ` [Bridge] " Eric Dumazet
2009-03-25 13:40 ` Eric Dumazet
2009-03-25 14:39 ` [Bridge] " Jiri Pirko
2009-03-25 14:39 ` Jiri Pirko
2009-03-25 15:19 ` [Bridge] [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge -try3 Jiri Pirko
2009-03-25 15:19 ` Jiri Pirko
2009-03-25 16:31 ` [Bridge] " Jay Vosburgh
2009-03-25 16:31 ` Jay Vosburgh
2009-03-25 17:44 ` [Bridge] " Jiri Pirko
2009-03-25 17:44 ` Jiri Pirko
2009-03-26 0:24 ` [Bridge] " David Miller
2009-03-26 0:24 ` David Miller
2009-03-26 0:34 ` [Bridge] " Jay Vosburgh
2009-03-26 0:34 ` Jay Vosburgh
2009-03-26 11:12 ` [Bridge] " Jiri Pirko
2009-03-26 11:12 ` Jiri Pirko
2009-03-26 15:52 ` [Bridge] [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge -try4 Jiri Pirko
2009-03-26 15:52 ` Jiri Pirko
2009-03-27 7:38 ` [Bridge] " David Miller
2009-03-27 7:38 ` David Miller
2009-03-27 7:46 ` [Bridge] " Jiri Pirko
2009-03-27 7:46 ` Jiri Pirko
2009-03-27 7:53 ` [Bridge] " Patrick McHardy
2009-03-27 7:53 ` Patrick McHardy
2009-03-27 8:41 ` [Bridge] " Jiri Pirko
2009-03-27 8:41 ` Jiri Pirko
2009-03-27 8:55 ` [Bridge] " Patrick McHardy
2009-03-27 8:55 ` Patrick McHardy
2009-03-27 9:47 ` [Bridge] " Jiri Pirko
2009-03-27 9:47 ` Jiri Pirko
2009-03-29 20:53 ` [Bridge] " David Miller
2009-03-29 20:53 ` David Miller
2009-03-30 12:04 ` [Bridge] " Patrick McHardy
2009-03-30 12:04 ` Patrick McHardy
2009-03-30 12:40 ` [Bridge] " Jiri Pirko
2009-03-30 12:40 ` Jiri Pirko
2009-03-30 12:47 ` [Bridge] " Patrick McHardy
2009-03-30 12:47 ` Patrick McHardy
2009-03-30 12:52 ` [Bridge] " Jiri Pirko
2009-03-30 12:52 ` Jiri Pirko
2009-03-30 12:58 ` [Bridge] " Patrick McHardy
2009-03-30 12:58 ` Patrick McHardy
2009-05-26 15:17 ` [Bridge] [PATCH net-next] bonding: allow bond in mode balance-alb to work properly in bridge -try4.1 Jiri Pirko
2009-05-26 16:32 ` Andy Gospodarek
2009-05-27 8:25 ` Jiri Pirko
2009-05-26 16:59 ` Eric Dumazet [this message]
2009-05-27 8:42 ` Jiri Pirko
2009-05-27 13:53 ` [Bridge] [PATCH net-next] bonding: allow bond in mode balance-alb to work properly in bridge -try4.2 Jiri Pirko
2009-05-27 14:39 ` Eric Dumazet
2009-05-28 9:57 ` Jiri Pirko
2009-05-28 11:05 ` [Bridge] [PATCH net-next] bonding: allow bond in mode balance-alb to work properly in bridge -try4.3 Jiri Pirko
2009-05-28 11:41 ` Eric Dumazet
2009-05-29 8:52 ` David Miller
2009-05-28 12:11 ` Andy Gospodarek
2009-04-13 8:37 ` [Bridge] [PATCH 0/4] bonding: allow bond in mode balance-alb to work properly in bridge -try5 Jiri Pirko
2009-04-13 8:37 ` Jiri Pirko
2009-04-13 8:38 ` [Bridge] [PATCH 1/4] net: introduce dev_mac_address_changed Jiri Pirko
2009-04-13 8:38 ` Jiri Pirko
2009-04-13 14:58 ` [Bridge] " Stephen Hemminger
2009-04-13 14:58 ` Stephen Hemminger
2009-04-13 8:42 ` [Bridge] [PATCH 2/4] net: introduce a list of device addresses dev_addr_list Jiri Pirko
2009-04-13 8:42 ` Jiri Pirko
2009-04-13 14:49 ` [Bridge] " Stephen Hemminger
2009-04-13 14:49 ` Stephen Hemminger
2009-04-13 22:54 ` [Bridge] " David Miller
2009-04-13 22:54 ` David Miller
2009-04-13 22:53 ` [Bridge] " David Miller
2009-04-13 22:53 ` David Miller
2009-04-13 8:44 ` [Bridge] [PATCH 3/4] net: bridge: use device address list instead of dev_addr Jiri Pirko
2009-04-13 8:44 ` Jiri Pirko
2009-04-13 14:54 ` [Bridge] " Stephen Hemminger
2009-04-13 14:54 ` Stephen Hemminger
2009-04-14 10:15 ` [Bridge] " Jiri Pirko
2009-04-14 10:15 ` Jiri Pirko
2009-04-13 22:54 ` [Bridge] " David Miller
2009-04-13 22:54 ` David Miller
2009-04-13 8:46 ` [Bridge] [PATCH 4/4] net: bonding: add slave device addresses in mode alb Jiri Pirko
2009-04-13 8:46 ` Jiri Pirko
2009-04-13 14:56 ` [Bridge] " Stephen Hemminger
2009-04-13 14:56 ` Stephen Hemminger
2009-04-15 8:17 ` [Bridge] [PATCH 0/3] bonding: allow bond in mode balance-alb to work properly in bridge -try6 Jiri Pirko
2009-04-15 8:17 ` Jiri Pirko
2009-04-15 8:18 ` [Bridge] [PATCH 1/3] net: introduce a list of device addresses dev_addr_list Jiri Pirko
2009-04-15 8:18 ` Jiri Pirko
2009-04-15 8:26 ` [Bridge] " Li Zefan
2009-04-15 8:26 ` Li Zefan
2009-04-15 8:29 ` [Bridge] " Jiri Pirko
2009-04-15 8:29 ` Jiri Pirko
2009-04-15 8:32 ` [Bridge] " Jiri Pirko
2009-04-15 8:32 ` Jiri Pirko
2009-04-15 9:21 ` [Bridge] " David Miller
2009-04-15 9:21 ` David Miller
2009-04-15 9:27 ` [Bridge] " Eric Dumazet
2009-04-15 9:27 ` Eric Dumazet
2009-04-15 9:31 ` [Bridge] " David Miller
2009-04-15 9:31 ` David Miller
2009-04-15 10:13 ` [Bridge] " Patrick McHardy
2009-04-15 10:13 ` Patrick McHardy
2009-04-15 10:15 ` [Bridge] " David Miller
2009-04-15 10:15 ` David Miller
2009-04-15 10:41 ` [Bridge] " Patrick McHardy
2009-04-15 10:41 ` Patrick McHardy
2009-04-15 10:45 ` [Bridge] " David Miller
2009-04-15 10:45 ` David Miller
2009-04-15 10:47 ` [Bridge] " Patrick McHardy
2009-04-15 10:47 ` Patrick McHardy
2009-04-15 14:42 ` [Bridge] " Jiri Pirko
2009-04-15 14:42 ` Jiri Pirko
2009-04-15 11:17 ` [Bridge] " Jiri Pirko
2009-04-15 11:17 ` Jiri Pirko
2009-04-15 11:22 ` [Bridge] " Patrick McHardy
2009-04-15 11:22 ` Patrick McHardy
2009-04-15 11:28 ` [Bridge] " Jiri Pirko
2009-04-15 11:28 ` Jiri Pirko
2009-04-15 12:28 ` [Bridge] " Eric Dumazet
2009-04-15 12:28 ` Eric Dumazet
2009-04-15 18:02 ` [Bridge] [PATCH 1/3] net: introduce a list of device addresses dev_addr_list (v2) Jiri Pirko
2009-04-15 18:02 ` Jiri Pirko
2009-04-15 18:54 ` [Bridge] " Eric Dumazet
2009-04-15 18:54 ` Eric Dumazet
2009-04-16 8:46 ` [Bridge] " Jiri Pirko
2009-04-16 8:46 ` Jiri Pirko
2009-04-17 11:57 ` [Bridge] [PATCH 1/3] net: introduce a list of device addresses dev_addr_list (v3) Jiri Pirko
2009-04-17 11:57 ` Jiri Pirko
2009-04-17 15:33 ` [Bridge] " Stephen Hemminger
2009-04-17 15:33 ` Stephen Hemminger
2009-04-18 7:01 ` [Bridge] " Jiri Pirko
2009-04-18 7:01 ` Jiri Pirko
2009-04-18 7:35 ` [Bridge] " Eric Dumazet
2009-04-18 7:35 ` Eric Dumazet
2009-04-18 7:44 ` [Bridge] " Jiri Pirko
2009-04-18 7:44 ` Jiri Pirko
2009-04-18 8:06 ` [Bridge] " Eric Dumazet
2009-04-18 8:06 ` Eric Dumazet
2009-04-18 8:58 ` [Bridge] [PATCH 1/3] net: introduce a list of device addresses dev_addr_list (v4) Jiri Pirko
2009-04-18 8:58 ` Jiri Pirko
2009-04-20 16:11 ` [Bridge] " Jiri Pirko
2009-04-20 16:11 ` Jiri Pirko
2009-04-23 8:09 ` [Bridge] " Jiri Pirko
2009-04-23 8:09 ` Jiri Pirko
2009-04-23 15:58 ` [Bridge] [Bonding-devel] " Stephen Hemminger
2009-04-24 21:26 ` Jiri Pirko
2009-05-04 11:14 ` [Bridge] [PATCH] net: introduce a list of device addresses dev_addr_list (v5) Jiri Pirko
2009-05-04 11:14 ` Jiri Pirko
2009-05-05 4:37 ` [Bridge] " David Miller
2009-05-05 4:37 ` David Miller
2009-05-05 6:37 ` [Bridge] " Jiri Pirko
2009-05-05 6:37 ` Jiri Pirko
2009-05-05 12:48 ` [Bridge] [PATCH] net: introduce a list of device addresses dev_addr_list (v6) Jiri Pirko
2009-05-05 12:48 ` Jiri Pirko
2009-05-05 19:27 ` [Bridge] " David Miller
2009-05-05 19:27 ` David Miller
2009-05-08 22:38 ` [Bridge] " Stephen Hemminger
2009-05-08 22:38 ` Stephen Hemminger
2009-05-08 23:00 ` [Bridge] " David Miller
2009-05-08 23:00 ` David Miller
2009-05-08 23:12 ` [Bridge] " Stephen Hemminger
2009-05-08 23:12 ` Stephen Hemminger
2009-05-08 23:25 ` [Bridge] " David Miller
2009-05-08 23:25 ` David Miller
2009-05-08 23:29 ` [Bridge] " Stephen Hemminger
2009-05-08 23:29 ` Stephen Hemminger
2009-04-15 8:21 ` [Bridge] [PATCH 2/3] net: bridge: use device address list instead of dev_addr Jiri Pirko
2009-04-15 8:21 ` Jiri Pirko
2009-05-06 14:46 ` [Bridge] [PATCH net-next] net: bridge: use device address list instead of dev_addr (repost) Jiri Pirko
2009-05-06 14:46 ` Jiri Pirko
2009-05-06 15:08 ` [Bridge] " Eric Dumazet
2009-05-06 15:08 ` Eric Dumazet
2009-05-06 19:26 ` [Bridge] " Stephen Hemminger
2009-05-06 19:26 ` Stephen Hemminger
2009-05-07 22:03 ` [Bridge] " David Miller
2009-05-07 22:03 ` David Miller
2009-04-15 8:22 ` [Bridge] [PATCH 3/3] net: bonding: add slave device addresses in mode alb Jiri Pirko
2009-04-15 8:22 ` Jiri Pirko
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=4A1C2009.4010507@cosmosbay.com \
--to=dada1@cosmosbay.com \
--cc=bonding-devel@lists.sourceforge.net \
--cc=bridge@lists.linux-foundation.org \
--cc=davem@davemloft.net \
--cc=fubar@us.ibm.com \
--cc=jgarzik@pobox.com \
--cc=jpirko@redhat.com \
--cc=mschmidt@redhat.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.