diff --git a/src/add-ons/kernel/network/stack/routes.cpp b/src/add-ons/kernel/network/stack/routes.cpp index 9a2b0041ef..1564b2d7fa 100644 --- a/src/add-ons/kernel/network/stack/routes.cpp +++ b/src/add-ons/kernel/network/stack/routes.cpp @@ -161,6 +161,8 @@ find_route(net_domain *_domain, const sockaddr *address) // find last matching route RouteList::Iterator iterator = domain->routes.GetIterator(); + net_route_private *candidate = NULL; + TRACE(("test address %s for routes...\n", AddressString(domain, address).Data())); // TODO: alternate equal default routes @@ -168,10 +170,6 @@ find_route(net_domain *_domain, const sockaddr *address) while (iterator.HasNext()) { net_route_private *route = iterator.Next(); - // ignore routes that point to devices that have no link - if ((route->interface->device->flags & IFF_LINK) == 0) - continue; - if (route->mask) { sockaddr maskedAddress; domain->address_module->mask_address(address, route->mask, @@ -186,10 +184,16 @@ find_route(net_domain *_domain, const sockaddr *address) TRACE((" found route: %s, flags %lx\n", AddressString(domain, route->destination).Data(), route->flags)); + // neglect routes that point to devices that have no link + if ((route->interface->device->flags & IFF_LINK) == 0) { + candidate = route; + continue; + } + return route; } - return NULL; + return candidate; }