]> xenbits.xensource.com Git - people/ssmith/nc2-2.6.27.git/commitdiff
patch bridge-locate-physical-device.patch
authorSteven Smith <ssmith@weybridge.uk.xensource.com>
Tue, 30 Jun 2009 11:55:47 +0000 (12:55 +0100)
committerSteven Smith <ssmith@weybridge.uk.xensource.com>
Tue, 30 Jun 2009 11:55:47 +0000 (12:55 +0100)
include/linux/if_bridge.h
net/bridge/br_if.c

index 6badb3e2c4e4d2bc2910557a522296577f617bf9..cf3296da6bbc249502e94acd565be401803cc36b 100644 (file)
@@ -109,6 +109,8 @@ extern struct sk_buff *(*br_handle_frame_hook)(struct net_bridge_port *p,
                                               struct sk_buff *skb);
 extern int (*br_should_route_hook)(struct sk_buff *skb);
 
+extern struct net_device *br_locate_physical_device(struct net_device *dev);
+
 #endif
 
 #endif
index da2e096b7deadcb239f8d9e133e5390445d3ac97..63633c5a0401143233fa4a8ca1bca29b533d3467 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
+#include <linux/etherdevice.h>
 #include <linux/ethtool.h>
 #include <linux/if_arp.h>
 #include <linux/module.h>
@@ -262,6 +263,24 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br,
        return p;
 }
 
+struct net_device *br_locate_physical_device(struct net_device *dev)
+{
+       struct net_bridge *br;
+       const struct net_bridge_port *p;
+
+       if (!(dev->priv_flags & IFF_EBRIDGE))
+               return dev;
+
+       br = netdev_priv(dev);
+
+       list_for_each_entry(p, &br->port_list, list) {
+               if (!compare_ether_addr(dev->dev_addr, p->dev->dev_addr))
+                       return p->dev;
+       }
+       return dev;
+}
+EXPORT_SYMBOL(br_locate_physical_device);
+
 int br_add_bridge(const char *name)
 {
        struct net_device *dev;