[DECNET]: Fix for routing bug
authorPatrick Caulfield <patrick@tykepenguin.com>
Wed, 2 Aug 2006 21:14:44 +0000 (14:14 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 2 Aug 2006 21:14:44 +0000 (14:14 -0700)
This patch fixes a bug in the DECnet routing code where we were
selecting a loopback device in preference to an outward facing device
even when the destination was known non-local. This patch should fix
the problem.

Signed-off-by: Patrick Caulfield <patrick@tykepenguin.com>
Signed-off-by: Steven Whitehouse <steve@chygwyn.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/decnet/dn_route.c

index 1355614ec11b90567f50d0073555a0aa1d57c185..743e9fcf7c5ae2f4697f5a796be7e69e319868ae 100644 (file)
@@ -925,8 +925,13 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
                for(dev_out = dev_base; dev_out; dev_out = dev_out->next) {
                        if (!dev_out->dn_ptr)
                                continue;
-                       if (dn_dev_islocal(dev_out, oldflp->fld_src))
-                               break;
+                       if (!dn_dev_islocal(dev_out, oldflp->fld_src))
+                               continue;
+                       if ((dev_out->flags & IFF_LOOPBACK) &&
+                           oldflp->fld_dst &&
+                           !dn_dev_islocal(dev_out, oldflp->fld_dst))
+                               continue;
+                       break;
                }
                read_unlock(&dev_base_lock);
                if (dev_out == NULL)