From: t_jeang Date: Tue, 6 Jan 2009 12:05:58 +0000 (+0000) Subject: imported patch bnx2-cnic-over-bridge X-Git-Tag: bnx2-no-iscsi-constants X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=ede56481fe5509b07365b31b33e19837740049d1;p=xenclient%2Fkernel.git imported patch bnx2-cnic-over-bridge --- diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index b8b641d8..e0937bd6 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c @@ -2561,6 +2561,14 @@ static inline u16 cnic_get_vlan(struct net_device *dev, return 0; } +static inline struct net_device *cnic_get_physical(struct net_device *dev) +{ + extern struct net_device *br_locate_physical_device(struct net_device *dev); + if (dev->priv_flags & IFF_EBRIDGE) + dev = br_locate_physical_device(dev); + return dev; +} + #ifndef __VMKLNX__ static int cnic_get_v4_route(struct sockaddr_in *dst_addr, struct sockaddr_in *src_addr, @@ -2666,7 +2674,7 @@ static struct cnic_dev *cnic_cm_select_dev(struct sockaddr_in *dst_addr, { struct cnic_dev *dev = NULL; struct dst_entry *dst; - struct net_device *netdev = NULL; + struct net_device *dstdev, *netdev = NULL; int err = -ENETUNREACH, found = 0; if (dst_addr->sin_family == AF_INET) @@ -2685,7 +2693,8 @@ static struct cnic_dev *cnic_cm_select_dev(struct sockaddr_in *dst_addr, if (!dst->dev) goto done; - cnic_get_vlan(dst->dev, &netdev); + dstdev = cnic_get_physical(dst->dev); + cnic_get_vlan(dstdev, &netdev); read_lock(&cnic_dev_lock); list_for_each_entry(dev, &cnic_dev_list, list) { @@ -2745,7 +2754,7 @@ static int cnic_get_route(struct cnic_sock *csk, struct cnic_sockaddr *saddr) struct cnic_dev *dev = csk->dev; int is_v6, err; struct dst_entry *dst; - struct net_device *realdev; + struct net_device *dstdev, *realdev; if (saddr->local.v6.sin6_family == AF_INET6 && saddr->remote.v6.sin6_family == AF_INET6) @@ -2804,7 +2813,9 @@ static int cnic_get_route(struct cnic_sock *csk, struct cnic_sockaddr *saddr) } } - csk->vlan_id = cnic_get_vlan(dst->dev, &realdev); + dstdev = cnic_get_physical(dst->dev); + csk->vlan_id = cnic_get_vlan(dstdev, &realdev); + if (realdev != dev->netdev) goto err_out;