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 PROTECTED]>
> 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 PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
-----------------------------------------------------------------------
Christophe Devriese                                               EURiD
Network Adminstrator / Developer
[EMAIL PROTECTED]
---------------------------- 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);

Reply via email to