Subject: Re: PATCH Fix bonding active-backup behavior for VLAN interfaces

From: Christophe Devriese <[email-masked]>
Date: Fri, 28 Jul 2006 23:50:32 +0200

I basically move the skb_bond method into if_bonding.h, include that file
in if_vlan ( and call it from the vlan forwarding path, and the netif_rx
routine ). 

Somehow this patch is very incomplete. Let me try again.

sorry for the trouble. (I'm new at this)

Regards,

Christophe 

> Christophe Devriese wrote:
> >diff -rU3 linux-2.6.17.7/net/core/dev.c 
> >linux-2.6.17.7-wapper/net/core/dev.c
> >--- linux-2.6.17.7/net/core/dev.c       2006-07-25 05:36:01.000000000 +0200
> >+++ linux-2.6.17.7-wapper/net/core/dev.c        2006-07-27 
> >20:16:36.000000000 +0200
> >@@ -88,6 +88,7 @@
> > #include <linux/sockios.h>
> > #include <linux/errno.h>
> > #include <linux/interrupt.h>
> >+#include <linux/if_bonding.h>
> > #include <linux/if_ether.h>
> > #include <linux/netdevice.h>
> > #include <linux/etherdevice.h>
> >@@ -1518,37 +1519,6 @@
> >
> > EXPORT_SYMBOL(netif_rx_ni);
> >
> >-static inline struct net_device *skb_bond(struct sk_buff *skb)
> >-{
> >-       struct net_device *dev = skb->dev;
> >-
> >-       if (dev->master) {
> >-               /*
> >-                * On bonding slaves other than the currently active
> >-                * slave, suppress duplicates except for 802.3ad
> >-                * ETH_P_SLOW and alb non-mcast/bcast.
> >-                */
> >-               if (dev->priv_flags & IFF_SLAVE_INACTIVE) {
> >-                       if (dev->master->priv_flags & IFF_MASTER_ALB) {
> >-                               if (skb->pkt_type != PACKET_BROADCAST &&
> >-                                   skb->pkt_type != PACKET_MULTICAST)
> >-                                       goto keep;
> >-                       }
> >-
> >-                       if (dev->master->priv_flags & IFF_MASTER_8023AD &&
> >-                           skb->protocol == __constant_htons(ETH_P_SLOW))
> >-                               goto keep;
> >-
> >-                       kfree_skb(skb);
> >-                       return NULL;
> >-               }
> >-keep:
> >-               skb->dev = dev->master;
> >-       }
> >-
> >-       return dev;
> >-}
> >-
> > static void net_tx_action(struct softirq_action *h)
> > {
> >        struct softnet_data *sd = &__get_cpu_var(softnet_data);
> >
> 
> 
> -- 
> Ben Greear <[email-masked]>
> Candela Technologies Inc  http://www.candelatech.com
> 
> -
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to [email-masked]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
-----------------------------------------------------------------------
Christophe Devriese                                               EURiD
Network Adminstrator / Developer
[email-masked]
---------------------------- http://www.eth1.org ----------------------

diff -rU3 linux-2.6.17.7/include/linux/if_bonding.h linux-2.6.17.7-wapper/include/linux/if_bonding.h
--- linux-2.6.17.7/include/linux/if_bonding.h	2006-07-25 05:36:01.000000000 +0200
+++ linux-2.6.17.7-wapper/include/linux/if_bonding.h	2006-07-27 21:17:25.000000000 +0200
@@ -46,6 +46,7 @@
 #include <linux/if.h>
 #include <linux/types.h>
 #include <linux/if_ether.h>
+#include <linux/netdevice.h>
 
 /* userland - kernel ABI version (2003/05/08) */
 #define BOND_ABI_VERSION 2
@@ -110,6 +111,37 @@
 	__u8 partner_system[ETH_ALEN];
 };
 
+static inline struct net_device *skb_bond(struct sk_buff *skb)
+{
+	struct net_device *dev = skb->dev;
+
+	if (dev->master) {
+		/*
+		 * On bonding slaves other than the currently active
+		 * slave, suppress duplicates except for 802.3ad
+		 * ETH_P_SLOW and alb non-mcast/bcast.
+		 */
+		if (dev->priv_flags & IFF_SLAVE_INACTIVE) {
+			if (dev->master->priv_flags & IFF_MASTER_ALB) {
+				if (skb->pkt_type != PACKET_BROADCAST &&
+				    skb->pkt_type != PACKET_MULTICAST)
+					goto keep;
+			}
+
+			if (dev->master->priv_flags & IFF_MASTER_8023AD &&
+			    skb->protocol == __constant_htons(ETH_P_SLOW))
+				goto keep;
+		
+			kfree_skb(skb);
+			return NULL;
+		}
+keep:
+		skb->dev = dev->master;
+	}
+
+	return dev;
+}
+
 #endif /* _LINUX_IF_BONDING_H */
 
 /*
diff -rU3 linux-2.6.17.7/include/linux/if_vlan.h linux-2.6.17.7-wapper/include/linux/if_vlan.h
--- linux-2.6.17.7/include/linux/if_vlan.h	2006-07-25 05:36:01.000000000 +0200
+++ linux-2.6.17.7-wapper/include/linux/if_vlan.h	2006-07-27 20:16:36.000000000 +0200
@@ -24,6 +24,7 @@
 struct hlist_node;
 
 #include <linux/proc_fs.h> /* for proc_dir_entry */
+#include <linux/if_bonding.h> /* for skb_bond */
 #include <linux/netdevice.h>
 
 #define VLAN_HLEN	4		/* The additional bytes (on top of the Ethernet header)
@@ -154,6 +155,12 @@
 				    unsigned short vlan_tag, int polling)
 {
 	struct net_device_stats *stats;
+	struct net_device *orig_dev;
+
+	orig_dev = skb_bond(skb);
+
+	if (!orig_dev) 
+		return NET_RX_DROP;
 
 	skb->dev = grp->vlan_devices[vlan_tag & VLAN_VID_MASK];
 	if (skb->dev == NULL) {
diff -rU3 linux-2.6.17.7/net/core/dev.c linux-2.6.17.7-wapper/net/core/dev.c
--- linux-2.6.17.7/net/core/dev.c	2006-07-25 05:36:01.000000000 +0200
+++ linux-2.6.17.7-wapper/net/core/dev.c	2006-07-27 20:16:36.000000000 +0200
@@ -88,6 +88,7 @@
 #include <linux/sockios.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
+#include <linux/if_bonding.h>
 #include <linux/if_ether.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
@@ -1518,37 +1519,6 @@
 
 EXPORT_SYMBOL(netif_rx_ni);
 
-static inline struct net_device *skb_bond(struct sk_buff *skb)
-{
-	struct net_device *dev = skb->dev;
-
-	if (dev->master) {
-		/*
-		 * On bonding slaves other than the currently active
-		 * slave, suppress duplicates except for 802.3ad
-		 * ETH_P_SLOW and alb non-mcast/bcast.
-		 */
-		if (dev->priv_flags & IFF_SLAVE_INACTIVE) {
-			if (dev->master->priv_flags & IFF_MASTER_ALB) {
-				if (skb->pkt_type != PACKET_BROADCAST &&
-				    skb->pkt_type != PACKET_MULTICAST)
-					goto keep;
-			}
-
-			if (dev->master->priv_flags & IFF_MASTER_8023AD &&
-			    skb->protocol == __constant_htons(ETH_P_SLOW))
-				goto keep;
-		
-			kfree_skb(skb);
-			return NULL;
-		}
-keep:
-		skb->dev = dev->master;
-	}
-
-	return dev;
-}
-
 static void net_tx_action(struct softirq_action *h)
 {
 	struct softnet_data *sd = &__get_cpu_var(softnet_data);