]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
imported patch bnx2-cnic-over-bridge bnx2-no-iscsi-constants
authort_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:05:58 +0000 (12:05 +0000)
committert_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:05:58 +0000 (12:05 +0000)
drivers/net/cnic.c

index b8b641d898391eee81a53cf2b0ab521c62fc7acb..e0937bd6f2faaffcde00bd271556f6fc1d5bc447 100644 (file)
@@ -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;