diff options
author | Martin Willi <martin@revosec.ch> | 2014-10-24 15:21:11 +0200 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2014-12-16 17:22:28 +0100 |
commit | 6fa203b8d4dfdaad586a3b056cb1ff1318f6e643 (patch) | |
tree | a711b2e02768e10a8b6bdb6eb5406b938e63660a /src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c | |
parent | 1c6188a0c2cd25604fdcc9b1843298286fb34dfc (diff) | |
download | strongswan-6fa203b8d4dfdaad586a3b056cb1ff1318f6e643.tar.bz2 strongswan-6fa203b8d4dfdaad586a3b056cb1ff1318f6e643.tar.xz |
kernel-pfroute: If a new interface appears, slightly delay address enumeration
On OS X 10.10, when installing a virtual IP on a tun device, there is a chance
that a RTM_IFANNOUNCE is sent before the IP is ready on that link when calling
getifaddrs(). As we don't get an RTM_NEWADDR event either, that race lets us
miss the virtual IP install event, failing the add_ip() call.
Diffstat (limited to 'src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c')
-rw-r--r-- | src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c b/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c index 26fae0d6b..0f7802270 100644 --- a/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c +++ b/src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c @@ -830,6 +830,15 @@ static void process_link(private_kernel_pfroute_net_t *this, DBG1(DBG_KNL, "interface %s deactivated", iface->ifname); } } +#ifdef __APPLE__ + /* There seems to be a race condition on 10.10, where we get + * the RTM_IFINFO, but getifaddrs() does not return the virtual + * IP installed on a tun device, but we also don't get a + * RTM_NEWADDR. We therefore could miss the new address, letting + * virtual IP installation fail. Delaying getifaddrs() helps, + * but is obviously not a clean fix. */ + usleep(50000); +#endif iface->flags = msg->ifm_flags; repopulate_iface(this, iface); found = TRUE; |