summaryrefslogtreecommitdiff
path: root/src/starter/interfaces.c
diff options
context:
space:
mode:
authorRene Mayrhofer <rene@mayrhofer.eu.org>2010-02-23 10:42:46 +0000
committerRene Mayrhofer <rene@mayrhofer.eu.org>2010-02-23 10:42:46 +0000
commitde6b12502cdf42d5d92118f1c0e38dc31becf7c5 (patch)
tree0edac9c79f5a43e01913dd7f71c7abc487e5727b /src/starter/interfaces.c
parent172642669d4a23e17f1ed411fbc8629dcaa5fb46 (diff)
downloadvyos-strongswan-de6b12502cdf42d5d92118f1c0e38dc31becf7c5.tar.gz
vyos-strongswan-de6b12502cdf42d5d92118f1c0e38dc31becf7c5.zip
Updated to new upstream release. interfaces Patch is not from upstream.
Diffstat (limited to 'src/starter/interfaces.c')
-rw-r--r--src/starter/interfaces.c61
1 files changed, 48 insertions, 13 deletions
diff --git a/src/starter/interfaces.c b/src/starter/interfaces.c
index d12bf0bdf..92b2c74a4 100644
--- a/src/starter/interfaces.c
+++ b/src/starter/interfaces.c
@@ -13,13 +13,6 @@
* for more details.
*/
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <linux/rtnetlink.h>
-#ifdef HAVE_SYS_SOCKIO_H
-#include <sys/sockio.h>
-#endif
-
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -35,6 +28,15 @@
#include "exec.h"
#include "files.h"
+#ifdef START_PLUTO
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <linux/rtnetlink.h>
+#ifdef HAVE_SYS_SOCKIO_H
+#include <sys/sockio.h>
+#endif
+
/*
* Get the default route information via rtnetlink
*/
@@ -130,7 +132,6 @@ get_defaultroute(defaultroute_t *defaultroute)
}
if (metric < best_metric
- && gw.s_addr != INADDR_ANY
&& iface_idx != -1)
{
struct ifreq req;
@@ -139,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];
@@ -171,7 +192,21 @@ get_defaultroute(defaultroute_t *defaultroute)
defaultroute->defined = TRUE;
}
}
+ defaultroute->supported = TRUE;
if (!defaultroute->defined)
plog("no default route - cannot cope with %%defaultroute!!!");
}
+
+#else /* !START_PLUTO */
+
+/**
+ * Pluto disabled, fall back to %any
+ */
+void
+get_defaultroute(defaultroute_t *defaultroute)
+{
+ defaultroute->supported = FALSE;
+}
+#endif /* START_PLUTO */
+