]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
kernel-pfroute: keep some additional PF_ROUTE socket open to receive events pfroute-dummies
authorMartin Willi <martin@revosec.ch>
Fri, 19 Apr 2013 09:44:07 +0000 (11:44 +0200)
committerMartin Willi <martin@revosec.ch>
Mon, 6 May 2013 15:13:47 +0000 (17:13 +0200)
It seems that the OS X kernel does not send us events if we don't have some
additional PF_ROUTE sockets open.

src/libhydra/plugins/kernel_pfroute/kernel_pfroute_net.c

index 6c0b457c5e6331d8d6dbfbc6e86603e1cdead304..009bde78d4447498bbf48aa16a710d21542a1bd5 100644 (file)
 #error Cannot compile this plugin on systems where 'struct sockaddr' has no sa_len member.
 #endif
 
+#ifdef __APPLE__
+/* It seems that the OS X kernel does not send PF_ROUTE event messages reliably
+ * if there is only one PF_ROUTE sockets. Opening some additional PF_ROUTE
+ * sockets seems to help. */
+#define DUMMY_SOCKETS 3
+#endif /* __APPLE__ */
+
 /** delay before firing roam events (ms) */
 #define ROAM_DELAY 100
 
@@ -218,6 +225,13 @@ struct private_kernel_pfroute_net_t
         */
        int socket;
 
+#ifdef DUMMY_SOCKETS
+       /**
+        * Some unused dummy PF_ROUTE socket, required to get event messages
+        */
+       int dummy[DUMMY_SOCKETS];
+#endif /* DUMMY_SOCKETS */
+
        /**
         * sequence number for messages sent to the kernel
         */
@@ -1263,6 +1277,19 @@ METHOD(kernel_net_t, destroy, void,
        {
                close(this->socket);
        }
+#ifdef DUMMY_SOCKETS
+       {
+               int i;
+
+               for (i = 0; i < countof(this->dummy); i++)
+               {
+                       if (this->dummy[i] != -1)
+                       {
+                               close(this->dummy[i]);
+                       }
+               }
+       }
+#endif /* DUMMY_SOCKETS */
        enumerator = this->addrs->create_enumerator(this->addrs);
        while (enumerator->enumerate(enumerator, NULL, (void**)&addr))
        {
@@ -1312,7 +1339,20 @@ kernel_pfroute_net_t *kernel_pfroute_net_create()
                .condvar = condvar_create(CONDVAR_TYPE_DEFAULT),
        );
 
-       /* create a PF_ROUTE socket to communicate with the kernel */
+#ifdef DUMMY_SOCKETS
+       {
+               int i;
+
+               for (i = 0; i < countof(this->dummy); i++)
+               {
+                       this->dummy[i] = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
+                       if (this->dummy[i] != -1)
+                       {
+                               shutdown(this->dummy[i], SHUT_RDWR);
+                       }
+               }
+       }
+#endif /* DUMMY_SOCKETS */
        this->socket = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
        if (this->socket == -1)
        {