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:<port_no> For example: hostapd -ddt -g udp:8888 And in the configuration file: ctrl_interface=udp:8877 Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
This commit is contained in:
parent
56885eecf4
commit
b9066c638a
2 changed files with 30 additions and 2 deletions
|
@ -2444,6 +2444,7 @@ int hostapd_ctrl_iface_init(struct hostapd_data *hapd)
|
||||||
#ifdef CONFIG_CTRL_IFACE_UDP
|
#ifdef CONFIG_CTRL_IFACE_UDP
|
||||||
int port = HOSTAPD_CTRL_IFACE_PORT;
|
int port = HOSTAPD_CTRL_IFACE_PORT;
|
||||||
char p[32] = { 0 };
|
char p[32] = { 0 };
|
||||||
|
char *pos;
|
||||||
struct addrinfo hints = { 0 }, *res, *saveres;
|
struct addrinfo hints = { 0 }, *res, *saveres;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
@ -2455,6 +2456,16 @@ int hostapd_ctrl_iface_init(struct hostapd_data *hapd)
|
||||||
if (hapd->conf->ctrl_interface == NULL)
|
if (hapd->conf->ctrl_interface == NULL)
|
||||||
return 0;
|
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);
|
dl_list_init(&hapd->ctrl_dst);
|
||||||
hapd->ctrl_sock = -1;
|
hapd->ctrl_sock = -1;
|
||||||
os_get_random(cookie, COOKIE_LEN);
|
os_get_random(cookie, COOKIE_LEN);
|
||||||
|
@ -2489,7 +2500,7 @@ try_again:
|
||||||
if (bind(hapd->ctrl_sock, res->ai_addr, res->ai_addrlen) < 0) {
|
if (bind(hapd->ctrl_sock, res->ai_addr, res->ai_addrlen) < 0) {
|
||||||
port--;
|
port--;
|
||||||
if ((HOSTAPD_CTRL_IFACE_PORT - port) <
|
if ((HOSTAPD_CTRL_IFACE_PORT - port) <
|
||||||
HOSTAPD_CTRL_IFACE_PORT_LIMIT)
|
HOSTAPD_CTRL_IFACE_PORT_LIMIT && !pos)
|
||||||
goto try_again;
|
goto try_again;
|
||||||
wpa_printf(MSG_ERROR, "bind(AF_INET): %s", strerror(errno));
|
wpa_printf(MSG_ERROR, "bind(AF_INET): %s", strerror(errno));
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -3147,6 +3158,7 @@ int hostapd_global_ctrl_iface_init(struct hapd_interfaces *interface)
|
||||||
#ifdef CONFIG_CTRL_IFACE_UDP
|
#ifdef CONFIG_CTRL_IFACE_UDP
|
||||||
int port = HOSTAPD_GLOBAL_CTRL_IFACE_PORT;
|
int port = HOSTAPD_GLOBAL_CTRL_IFACE_PORT;
|
||||||
char p[32] = { 0 };
|
char p[32] = { 0 };
|
||||||
|
char *pos;
|
||||||
struct addrinfo hints = { 0 }, *res, *saveres;
|
struct addrinfo hints = { 0 }, *res, *saveres;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
@ -3158,6 +3170,16 @@ int hostapd_global_ctrl_iface_init(struct hapd_interfaces *interface)
|
||||||
if (interface->global_iface_path == NULL)
|
if (interface->global_iface_path == NULL)
|
||||||
return 0;
|
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);
|
dl_list_init(&interface->global_ctrl_dst);
|
||||||
interface->global_ctrl_sock = -1;
|
interface->global_ctrl_sock = -1;
|
||||||
os_get_random(gcookie, COOKIE_LEN);
|
os_get_random(gcookie, COOKIE_LEN);
|
||||||
|
@ -3193,7 +3215,7 @@ try_again:
|
||||||
0) {
|
0) {
|
||||||
port++;
|
port++;
|
||||||
if ((port - HOSTAPD_GLOBAL_CTRL_IFACE_PORT) <
|
if ((port - HOSTAPD_GLOBAL_CTRL_IFACE_PORT) <
|
||||||
HOSTAPD_GLOBAL_CTRL_IFACE_PORT_LIMIT)
|
HOSTAPD_GLOBAL_CTRL_IFACE_PORT_LIMIT && !pos)
|
||||||
goto try_again;
|
goto try_again;
|
||||||
wpa_printf(MSG_ERROR, "bind(AF_INET): %s", strerror(errno));
|
wpa_printf(MSG_ERROR, "bind(AF_INET): %s", strerror(errno));
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -484,11 +484,16 @@ static const char * hostapd_msg_ifname_cb(void *ctx)
|
||||||
static int hostapd_get_global_ctrl_iface(struct hapd_interfaces *interfaces,
|
static int hostapd_get_global_ctrl_iface(struct hapd_interfaces *interfaces,
|
||||||
const char *path)
|
const char *path)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_CTRL_IFACE_UDP
|
||||||
char *pos;
|
char *pos;
|
||||||
|
#endif /* !CONFIG_CTRL_IFACE_UDP */
|
||||||
|
|
||||||
os_free(interfaces->global_iface_path);
|
os_free(interfaces->global_iface_path);
|
||||||
interfaces->global_iface_path = os_strdup(path);
|
interfaces->global_iface_path = os_strdup(path);
|
||||||
if (interfaces->global_iface_path == NULL)
|
if (interfaces->global_iface_path == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
#ifndef CONFIG_CTRL_IFACE_UDP
|
||||||
pos = os_strrchr(interfaces->global_iface_path, '/');
|
pos = os_strrchr(interfaces->global_iface_path, '/');
|
||||||
if (pos == NULL) {
|
if (pos == NULL) {
|
||||||
wpa_printf(MSG_ERROR, "No '/' in the global control interface "
|
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';
|
*pos = '\0';
|
||||||
interfaces->global_iface_name = pos + 1;
|
interfaces->global_iface_name = pos + 1;
|
||||||
|
#endif /* !CONFIG_CTRL_IFACE_UDP */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue