diff options
author | Rene Mayrhofer <rene@mayrhofer.eu.org> | 2010-02-23 10:42:46 +0000 |
---|---|---|
committer | Rene Mayrhofer <rene@mayrhofer.eu.org> | 2010-02-23 10:42:46 +0000 |
commit | de6b12502cdf42d5d92118f1c0e38dc31becf7c5 (patch) | |
tree | 0edac9c79f5a43e01913dd7f71c7abc487e5727b /src/starter/interfaces.c | |
parent | 172642669d4a23e17f1ed411fbc8629dcaa5fb46 (diff) | |
download | vyos-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.c | 61 |
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 */ + |