IAPP: Set SO_REUSEADDR on listening socket
authorPetko Bordjukov <bordjukov@gmail.com>
Mon, 8 Aug 2016 15:46:28 +0000 (18:46 +0300)
committerJouni Malinen <j@w1.fi>
Thu, 18 Aug 2016 17:01:48 +0000 (20:01 +0300)
Make it possible for several instances of hostapd to listen on the same
network interface.

Signed-off-by: Petko Bordjukov <bordjukov@gmail.com>
src/ap/iapp.c

index 07672ce..2556da3 100644 (file)
@@ -381,6 +381,7 @@ struct iapp_data * iapp_init(struct hostapd_data *hapd, const char *iface)
        struct sockaddr_in *paddr, uaddr;
        struct iapp_data *iapp;
        struct ip_mreqn mreq;
+       int reuseaddr = 1;
 
        iapp = os_zalloc(sizeof(*iapp));
        if (iapp == NULL)
@@ -443,6 +444,18 @@ struct iapp_data * iapp_init(struct hostapd_data *hapd, const char *iface)
        os_memset(&uaddr, 0, sizeof(uaddr));
        uaddr.sin_family = AF_INET;
        uaddr.sin_port = htons(IAPP_UDP_PORT);
+
+       if (setsockopt(iapp->udp_sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,
+                      sizeof(reuseaddr)) < 0) {
+               wpa_printf(MSG_INFO,
+                          "iapp_init - setsockopt[UDP,SO_REUSEADDR]: %s",
+                          strerror(errno));
+               /*
+                * Ignore this and try to continue. This is fine for single
+                * BSS cases, but may fail if multiple BSSes enable IAPP.
+                */
+       }
+
        if (bind(iapp->udp_sock, (struct sockaddr *) &uaddr,
                 sizeof(uaddr)) < 0) {
                wpa_printf(MSG_INFO, "iapp_init - bind[UDP]: %s",