From: t_jeang Date: Tue, 6 Jan 2009 12:06:04 +0000 (+0000) Subject: imported patch bridge-locate-physical-device.patch X-Git-Tag: privcmd_memop X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=cf4bc50bf92c2f12429f7e1ae1f9c548a2c3de6a;p=xenclient%2Fkernel.git imported patch bridge-locate-physical-device.patch --- diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h index fd1b6eb9..cd7ca302 100644 --- a/include/linux/if_bridge.h +++ b/include/linux/if_bridge.h @@ -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 diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index c80ecedd..1c76d910 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -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;