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);