aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2010-02-05 08:25:00 +0000
committerMartin Willi <martin@strongswan.org>2010-02-05 09:28:31 +0100
commit313a53d4fc65b5da50a2a500cbb323abe8ea8704 (patch)
tree7948aa43daba87e317ff55aa26186ae8da6ea1b6
parent6c9c0baee9b04d84685929744c258ac68e186353 (diff)
downloadstrongswan-313a53d4fc65b5da50a2a500cbb323abe8ea8704.tar.bz2
strongswan-313a53d4fc65b5da50a2a500cbb323abe8ea8704.tar.xz
Use destination address of ppp interfaces as nexthop in starters default route lookup
-rw-r--r--src/starter/interfaces.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/starter/interfaces.c b/src/starter/interfaces.c
index ba16a39f8..92b2c74a4 100644
--- a/src/starter/interfaces.c
+++ b/src/starter/interfaces.c
@@ -132,7 +132,6 @@ get_defaultroute(defaultroute_t *defaultroute)
}
if (metric < best_metric
- && gw.s_addr != INADDR_ANY
&& iface_idx != -1)
{
struct ifreq req;
@@ -141,19 +140,39 @@ get_defaultroute(defaultroute_t *defaultroute)
if (fd < 0)
{
plog("could not open AF_INET socket");
- defaultroute->defined = FALSE;
break;
}
bzero(&req, sizeof(req));
req.ifr_ifindex = iface_idx;
- ioctl(fd, SIOCGIFNAME, &req);
- ioctl(fd, SIOCGIFADDR, &req);
- close(fd);
+ if (ioctl(fd, SIOCGIFNAME, &req) < 0 ||
+ ioctl(fd, SIOCGIFADDR, &req) < 0)
+ {
+ plog("could not read interface data, ignoring route");
+ close(fd);
+ break;
+ }
strncpy(defaultroute->iface, req.ifr_name, IFNAMSIZ);
defaultroute->addr.u.v4 = *((struct sockaddr_in *) &req.ifr_addr);
defaultroute->nexthop.u.v4.sin_family = AF_INET;
- defaultroute->nexthop.u.v4.sin_addr = gw;
+
+ if (gw.s_addr == INADDR_ANY)
+ {
+ if (ioctl(fd, SIOCGIFDSTADDR, &req) < 0 ||
+ ((struct sockaddr_in*) &req.ifr_dstaddr)->sin_addr.s_addr == INADDR_ANY)
+ {
+ DBG_log("Ignoring default route to device %s because we can't get it's destination",
+ req.ifr_name);
+ close(fd);
+ break;
+ }
+
+ defaultroute->nexthop.u.v4 = *((struct sockaddr_in *) &req.ifr_dstaddr);
+ }
+ else
+ defaultroute->nexthop.u.v4.sin_addr = gw;
+
+ close(fd);
DBG(DBG_CONTROL,
char addr[20];