From: Janusz Dziedzic Date: Fri, 4 Mar 2016 09:20:25 +0000 (+0100) Subject: hostapd: Allow UDP ctrl_iface configuration to set the UDP port X-Git-Tag: hostap_2_6~748 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b9066c638af5daf74e7ce64bd441aebf8572ee41;p=thirdparty%2Fhostap.git hostapd: Allow UDP ctrl_iface configuration to set the UDP port This allows the UDP port to be set for the per-interface and global control interfaces. The format is: udp: For example: hostapd -ddt -g udp:8888 And in the configuration file: ctrl_interface=udp:8877 Signed-off-by: Janusz Dziedzic --- diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c index 237f02c09..9c388b254 100644 --- a/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c @@ -2444,6 +2444,7 @@ int hostapd_ctrl_iface_init(struct hostapd_data *hapd) #ifdef CONFIG_CTRL_IFACE_UDP int port = HOSTAPD_CTRL_IFACE_PORT; char p[32] = { 0 }; + char *pos; struct addrinfo hints = { 0 }, *res, *saveres; int n; @@ -2455,6 +2456,16 @@ int hostapd_ctrl_iface_init(struct hostapd_data *hapd) if (hapd->conf->ctrl_interface == NULL) return 0; + pos = os_strstr(hapd->conf->ctrl_interface, "udp:"); + if (pos) { + pos += 4; + port = atoi(pos); + if (port <= 0) { + wpa_printf(MSG_ERROR, "Invalid ctrl_iface UDP port"); + goto fail; + } + } + dl_list_init(&hapd->ctrl_dst); hapd->ctrl_sock = -1; os_get_random(cookie, COOKIE_LEN); @@ -2489,7 +2500,7 @@ try_again: if (bind(hapd->ctrl_sock, res->ai_addr, res->ai_addrlen) < 0) { port--; if ((HOSTAPD_CTRL_IFACE_PORT - port) < - HOSTAPD_CTRL_IFACE_PORT_LIMIT) + HOSTAPD_CTRL_IFACE_PORT_LIMIT && !pos) goto try_again; wpa_printf(MSG_ERROR, "bind(AF_INET): %s", strerror(errno)); goto fail; @@ -3147,6 +3158,7 @@ int hostapd_global_ctrl_iface_init(struct hapd_interfaces *interface) #ifdef CONFIG_CTRL_IFACE_UDP int port = HOSTAPD_GLOBAL_CTRL_IFACE_PORT; char p[32] = { 0 }; + char *pos; struct addrinfo hints = { 0 }, *res, *saveres; int n; @@ -3158,6 +3170,16 @@ int hostapd_global_ctrl_iface_init(struct hapd_interfaces *interface) if (interface->global_iface_path == NULL) return 0; + pos = os_strstr(interface->global_iface_path, "udp:"); + if (pos) { + pos += 4; + port = atoi(pos); + if (port <= 0) { + wpa_printf(MSG_ERROR, "Invalid global ctrl UDP port"); + goto fail; + } + } + dl_list_init(&interface->global_ctrl_dst); interface->global_ctrl_sock = -1; os_get_random(gcookie, COOKIE_LEN); @@ -3193,7 +3215,7 @@ try_again: 0) { port++; if ((port - HOSTAPD_GLOBAL_CTRL_IFACE_PORT) < - HOSTAPD_GLOBAL_CTRL_IFACE_PORT_LIMIT) + HOSTAPD_GLOBAL_CTRL_IFACE_PORT_LIMIT && !pos) goto try_again; wpa_printf(MSG_ERROR, "bind(AF_INET): %s", strerror(errno)); goto fail; diff --git a/hostapd/main.c b/hostapd/main.c index 6c4e1957f..06aa4b235 100644 --- a/hostapd/main.c +++ b/hostapd/main.c @@ -484,11 +484,16 @@ static const char * hostapd_msg_ifname_cb(void *ctx) static int hostapd_get_global_ctrl_iface(struct hapd_interfaces *interfaces, const char *path) { +#ifndef CONFIG_CTRL_IFACE_UDP char *pos; +#endif /* !CONFIG_CTRL_IFACE_UDP */ + os_free(interfaces->global_iface_path); interfaces->global_iface_path = os_strdup(path); if (interfaces->global_iface_path == NULL) return -1; + +#ifndef CONFIG_CTRL_IFACE_UDP pos = os_strrchr(interfaces->global_iface_path, '/'); if (pos == NULL) { wpa_printf(MSG_ERROR, "No '/' in the global control interface " @@ -500,6 +505,7 @@ static int hostapd_get_global_ctrl_iface(struct hapd_interfaces *interfaces, *pos = '\0'; interfaces->global_iface_name = pos + 1; +#endif /* !CONFIG_CTRL_IFACE_UDP */ return 0; }