netdev
[Top] [All Lists]

[patch] (0/8) Adding 802.3ad support to bonding

To: Bonding Developement list <bonding-devel@xxxxxxxxxxxxxxxxxxxxx>, Bonding Announce list <bonding-announce@xxxxxxxxxxxxxxxxxxxxx>, Linux Net Mailing list <linux-net@xxxxxxxxxxxxxxx>, Linux Kernel Mailing list <linux-kernel@xxxxxxxxxxxxxxx>, Oss SGI Netdev list <netdev@xxxxxxxxxxx>, Jeff Garzik <jgarzik@xxxxxxxxx>
Subject: [patch] (0/8) Adding 802.3ad support to bonding
From: Shmulik Hen <hshmulik@xxxxxxxxx>
Date: Thu, 20 Mar 2003 17:14:09 +0200 (IST)
Sender: netdev-bounce@xxxxxxxxxxx
This patch adds support for point to point protocols (e.g. 802.3ad) 
over bonding that need to know the physical device the skb came on. It 
saves the real device in a new field in skbuff before overwriting it with 
the virtual interface device in skb_bond() and __vlan_hwaccel_rx().

This patch is against 2.4.21-pre5 kernel.



diff -Nuarp linux-2.4.21-pre5-orig/include/linux/if_vlan.h 
linux-2.4.21-pre5-new/include/linux/if_vlan.h
--- linux-2.4.21-pre5-orig/include/linux/if_vlan.h      2002-11-29 
01:53:15.000000000 +0200
+++ linux-2.4.21-pre5-new/include/linux/if_vlan.h       2003-03-04 
14:01:56.000000000 +0200
@@ -148,6 +148,9 @@ static inline int __vlan_hwaccel_rx(stru
 {
        struct net_device_stats *stats;
 
+#ifdef BOND_POINT_TO_POINT_PROT
+       skb->real_dev = skb->dev;
+#endif //BOND_POINT_TO_POINT_PROT
        skb->dev = grp->vlan_devices[vlan_tag & VLAN_VID_MASK];
        if (skb->dev == NULL) {
                kfree_skb(skb);
diff -Nuarp linux-2.4.21-pre5-orig/include/linux/skbuff.h 
linux-2.4.21-pre5-new/include/linux/skbuff.h
--- linux-2.4.21-pre5-orig/include/linux/skbuff.h       2003-03-04 
13:43:27.000000000 +0200
+++ linux-2.4.21-pre5-new/include/linux/skbuff.h        2003-03-04 
14:13:25.000000000 +0200
@@ -135,6 +135,11 @@ struct sk_buff {
        struct sock     *sk;                    /* Socket we are owned by       
                */
        struct timeval  stamp;                  /* Time we arrived              
                */
        struct net_device       *dev;           /* Device we arrived on/are 
leaving by          */
+#define BOND_POINT_TO_POINT_PROT
+       struct net_device       *real_dev;      /* For support of point to 
point protocols 
+                                                  (e.g. 802.3ad) over bonding, 
we must save the
+                                                  physical device that got the 
packet before
+                                                  replacing skb->dev with the 
virtual device.  */
 
        /* Transport layer header */
        union
diff -Nuarp linux-2.4.21-pre5-orig/net/core/dev.c 
linux-2.4.21-pre5-new/net/core/dev.c
--- linux-2.4.21-pre5-orig/net/core/dev.c       2003-03-04 13:43:28.000000000 
+0200
+++ linux-2.4.21-pre5-new/net/core/dev.c        2003-03-04 14:14:56.000000000 
+0200
@@ -1328,8 +1328,12 @@ static __inline__ void skb_bond(struct s
 {
        struct net_device *dev = skb->dev;
 
-       if (dev->master)
-               skb->dev = dev->master;
+       if (dev->master) {
+#ifdef BOND_POINT_TO_POINT_PROT
+               skb->real_dev = skb->dev;
+#endif //BOND_POINT_TO_POINT_PROT
+               skb->dev = dev->master;
+       }
 }
 
 static void net_tx_action(struct softirq_action *h)
diff -Nuarp linux-2.4.21-pre5-orig/net/core/skbuff.c 
linux-2.4.21-pre5-new/net/core/skbuff.c
--- linux-2.4.21-pre5-orig/net/core/skbuff.c    2003-03-04 13:43:28.000000000 
+0200
+++ linux-2.4.21-pre5-new/net/core/skbuff.c     2003-03-04 14:17:44.000000000 
+0200
@@ -231,6 +231,9 @@ static inline void skb_headerinit(void *
        skb->sk = NULL;
        skb->stamp.tv_sec=0;    /* No idea about time */
        skb->dev = NULL;
+#ifdef BOND_POINT_TO_POINT_PROT
+       skb->real_dev = NULL;
+#endif //BOND_POINT_TO_POINT_PROT
        skb->dst = NULL;
        memset(skb->cb, 0, sizeof(skb->cb));
        skb->pkt_type = PACKET_HOST;    /* Default type */
@@ -362,6 +365,9 @@ struct sk_buff *skb_clone(struct sk_buff
        n->sk = NULL;
        C(stamp);
        C(dev);
+#ifdef BOND_POINT_TO_POINT_PROT
+       C(real_dev);
+#endif //BOND_POINT_TO_POINT_PROT
        C(h);
        C(nh);
        C(mac);
@@ -417,6 +423,9 @@ static void copy_skb_header(struct sk_bu
        new->list=NULL;
        new->sk=NULL;
        new->dev=old->dev;
+#ifdef BOND_POINT_TO_POINT_PROT
+       new->real_dev=old->real_dev;
+#endif //BOND_POINT_TO_POINT_PROT
        new->priority=old->priority;
        new->protocol=old->protocol;
        new->dst=dst_clone(old->dst);

-- 
| Shmulik Hen                                    |
| Israel Design Center (Jerusalem)               |
| LAN Access Division                            |
| Intel Communications Group, Intel corp.        |
|                                                |
| Anti-Spam: shmulik dot hen at intel dot com    |







<Prev in Thread] Current Thread [Next in Thread>