/*
* have_route_to - determine if the system has any route to
* a given IP address.
+ * For demand mode to work properly, we have to ignore routes
+ * through our own interface.
*/
int have_route_to(u_int32_t addr)
{
return -1; /* don't know */
while (read_route_table(&rt)) {
- if ((rt.rt_flags & RTF_UP) == 0)
+ if ((rt.rt_flags & RTF_UP) == 0 || strcmp(rt.rt_dev, ifname) == 0)
continue;
if ((addr & ((struct sockaddr_in *)&rt.rt_genmask)->sin_addr.s_addr)
== ((struct sockaddr_in *)&rt.rt_genmask)->sin_addr.s_addr) {
*/
#ifndef lint
-static char rcsid[] = "$Id: sys-svr4.c,v 1.20 1999/02/26 10:35:34 paulus Exp $";
+static char rcsid[] = "$Id: sys-svr4.c,v 1.21 1999/03/08 01:46:49 paulus Exp $";
#endif
#include <limits.h>
static char tty_modules[NMODULES][FMNAMESZ+1];
static int if_is_up; /* Interface has been marked up */
+static u_int32_t remote_addr; /* IP address of peer */
static u_int32_t default_route_gateway; /* Gateway for default route added */
static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */
}
#endif
+ remote_addr = h;
return ret;
}
ipmuxid = -1;
}
#endif
+ remote_addr = 0;
return 1;
}
/*
* have_route_to - determine if the system has a route to the specified
* IP address. Returns 0 if not, 1 if so, -1 if we can't tell.
+ * For demand mode to work properly, we have to ignore routes
+ * through our own interface.
*/
#ifndef T_CURRENT /* needed for Solaris 2.5 */
#define T_CURRENT MI_T_CURRENT
syslog(LOG_DEBUG, "have_route_to: dest=%x gw=%x mask=%x\n",
rp->ipRouteDest, rp->ipRouteNextHop,
rp->ipRouteMask);
- if (((addr ^ rp->ipRouteDest) && rp->ipRouteMask) == 0)
+ if (((addr ^ rp->ipRouteDest) && rp->ipRouteMask) == 0
+ && rp->ipRouteNextHop != remote_addr)
return 1;
}
}