]> xenbits.xen.org Git - xenclient/kernel.git/commitdiff
imported patch bridge-locate-physical-device.patch privcmd_memop
authort_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:06:04 +0000 (12:06 +0000)
committert_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:06:04 +0000 (12:06 +0000)
include/linux/if_bridge.h
net/bridge/br_if.c

index fd1b6eb94a5f1241a6d27f173892d47ac4628c91..cd7ca30245b56357a40e487393678ebd7ceb88ae 100644 (file)
@@ -108,6 +108,8 @@ extern void brioctl_set(int (*ioctl_hook)(unsigned int, void __user *));
 extern int (*br_handle_frame_hook)(struct net_bridge_port *p, struct sk_buff **pskb);
 extern int (*br_should_route_hook)(struct sk_buff **pskb);
 
+extern struct net_device *br_locate_physical_device(struct net_device *dev);
+
 #endif
 
 #endif
index c80ecedd3aa6ce8acfaed639d3be341550d7443a..1c76d910e37be79f07250c1f9262d07aa9a18c1f 100644 (file)
@@ -15,6 +15,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>
@@ -276,6 +277,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;