On Fri, 23 Sep 2005, Hal Rosenstock wrote:

> > Is there a better way to enumerate all of the network inferaces? I 
> > believe that is what this for loop is attempting to accomplish.
> 
> Yes. I think that the net_device list from dev_base could be walked
> instead and that would resolve this issue.

Can you help we understand the logic in at.c:resolve_ip()? Here is my 
assumption of what this function does:

 1) consults the IP routing table for an interface 
    device using ip_route_output_key

 2) if the device does not meet certain criteria, return an error

 3) if the device is a loopback device, search for another device 
    that is an INFINIBAND device and is UP.

 4) ...

I've included a small patch below to fix the problem I observed in #3. 
It walks the dev_base list as you described.

However I don't understand why the device returned in step #1 isn't 
always used as I assumpe this is the interface the routing table says 
to use. That makes me think I've misinterpreted the purpose of 
ip_route_output_key. What am I missing?

--
Signed-off-by: James Lentini <[EMAIL PROTECTED]>

Index: core/at.c
===================================================================
--- core/at.c   (revision 3528)
+++ core/at.c   (working copy)
@@ -430,7 +430,7 @@
                        }
                },
        };
-       int i, r;
+       int r;
 
        DEBUG("dst ip %08x src ip %08x tos %d", dst_ip, src_ip, tos);
 
@@ -490,13 +490,15 @@
        src->gw  = rt->rt_gateway;
        src->ip = rt->rt_src;     /* true source IP address */
 
-       if (ipoib_dev->flags & IFF_LOOPBACK)
-               for (i = 1; (ipoib_dev = dev_get_by_index(i)); i++) {
-                       dev_put(ipoib_dev);
+       if (ipoib_dev->flags & IFF_LOOPBACK) {
+               read_lock(&dev_base_lock);
+               for(ipoib_dev = dev_base; ipoib_dev; 
+                   ipoib_dev = ipoib_dev->next)
                        if (ARPHRD_INFINIBAND == ipoib_dev->type &&
                            (ipoib_dev->flags & IFF_UP))
                                break;
-               }
+               read_unlock(&dev_base_lock);
+       }
 
        if (!ipoib_dev) {
                WARN("No device for IB comm <%s:%08x:%08x>",
_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to