hostapd: Add a configuration to set an AP as stationary
Add a configuration option in hostapd.conf and in neighbor report that sets an AP as stationary. To enable this option on the current AP set the config option stationary_ap to 1. To set a neighbor entry to be marked as stationary add the word stat to the SET_NEIGHBOR command. This option tells hostapd to send LCI data even if it is older than requested by max age subelement in RRM request. Signed-off-by: David Spinadel <david.spinadel@intel.com>
This commit is contained in:
parent
5cb59370d5
commit
451a27b1ad
10 changed files with 32 additions and 11 deletions
|
@ -3510,6 +3510,8 @@ static int hostapd_config_fill(struct hostapd_config *conf,
|
||||||
WLAN_RRM_CAPS_NEIGHBOR_REPORT;
|
WLAN_RRM_CAPS_NEIGHBOR_REPORT;
|
||||||
} else if (os_strcmp(buf, "gas_address3") == 0) {
|
} else if (os_strcmp(buf, "gas_address3") == 0) {
|
||||||
bss->gas_address3 = atoi(pos);
|
bss->gas_address3 = atoi(pos);
|
||||||
|
} else if (os_strcmp(buf, "stationary_ap") == 0) {
|
||||||
|
conf->stationary_ap = atoi(pos);
|
||||||
} else if (os_strcmp(buf, "ftm_responder") == 0) {
|
} else if (os_strcmp(buf, "ftm_responder") == 0) {
|
||||||
bss->ftm_responder = atoi(pos);
|
bss->ftm_responder = atoi(pos);
|
||||||
} else if (os_strcmp(buf, "ftm_initiator") == 0) {
|
} else if (os_strcmp(buf, "ftm_initiator") == 0) {
|
||||||
|
|
|
@ -2174,6 +2174,7 @@ static int hostapd_ctrl_iface_set_neighbor(struct hostapd_data *hapd, char *buf)
|
||||||
struct wpa_ssid_value ssid;
|
struct wpa_ssid_value ssid;
|
||||||
u8 bssid[ETH_ALEN];
|
u8 bssid[ETH_ALEN];
|
||||||
struct wpabuf *nr, *lci = NULL, *civic = NULL;
|
struct wpabuf *nr, *lci = NULL, *civic = NULL;
|
||||||
|
int stationary = 0;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -2252,8 +2253,15 @@ static int hostapd_ctrl_iface_set_neighbor(struct hostapd_data *hapd, char *buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!buf)
|
||||||
|
goto set;
|
||||||
|
|
||||||
|
if (os_strstr(buf, "stat"))
|
||||||
|
stationary = 1;
|
||||||
|
|
||||||
set:
|
set:
|
||||||
ret = hostapd_neighbor_set(hapd, bssid, &ssid, nr, lci, civic);
|
ret = hostapd_neighbor_set(hapd, bssid, &ssid, nr, lci, civic,
|
||||||
|
stationary);
|
||||||
|
|
||||||
wpabuf_free(nr);
|
wpabuf_free(nr);
|
||||||
wpabuf_free(lci);
|
wpabuf_free(lci);
|
||||||
|
|
|
@ -1940,6 +1940,12 @@ own_ip_addr=127.0.0.1
|
||||||
# This parameter only controls publishing via Extended Capabilities element.
|
# This parameter only controls publishing via Extended Capabilities element.
|
||||||
# Actual functionality is managed outside hostapd.
|
# Actual functionality is managed outside hostapd.
|
||||||
#ftm_initiator=0
|
#ftm_initiator=0
|
||||||
|
#
|
||||||
|
# Stationary AP config indicates that the AP doesn't move hence location data
|
||||||
|
# can be considered as always up to date. If configured, LCI data will be sent
|
||||||
|
# as a radio measurement even if the request doesn't contain a max age element
|
||||||
|
# that allows sending of such data. Default: 0.
|
||||||
|
#stationary_ap=0
|
||||||
|
|
||||||
##### TESTING OPTIONS #########################################################
|
##### TESTING OPTIONS #########################################################
|
||||||
#
|
#
|
||||||
|
|
|
@ -1255,14 +1255,14 @@ static int hostapd_cli_cmd_set_neighbor(struct wpa_ctrl *ctrl, int argc,
|
||||||
char cmd[2048];
|
char cmd[2048];
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
if (argc < 3 || argc > 5) {
|
if (argc < 3 || argc > 6) {
|
||||||
printf("Invalid set_neighbor command: needs 3-5 arguments\n");
|
printf("Invalid set_neighbor command: needs 3-6 arguments\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = os_snprintf(cmd, sizeof(cmd), "SET_NEIGHBOR %s %s %s %s %s",
|
res = os_snprintf(cmd, sizeof(cmd), "SET_NEIGHBOR %s %s %s %s %s %s",
|
||||||
argv[0], argv[1], argv[2], argc >= 4 ? argv[3] : "",
|
argv[0], argv[1], argv[2], argc >= 4 ? argv[3] : "",
|
||||||
argc == 5 ? argv[4] : "");
|
argc >= 5 ? argv[4] : "", argc == 6 ? argv[5] : "");
|
||||||
if (os_snprintf_error(sizeof(cmd), res)) {
|
if (os_snprintf_error(sizeof(cmd), res)) {
|
||||||
printf("Too long SET_NEIGHBOR command.\n");
|
printf("Too long SET_NEIGHBOR command.\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -713,6 +713,7 @@ struct hostapd_config {
|
||||||
|
|
||||||
struct wpabuf *lci;
|
struct wpabuf *lci;
|
||||||
struct wpabuf *civic;
|
struct wpabuf *civic;
|
||||||
|
int stationary_ap;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1645,7 +1645,7 @@ static void hostapd_set_own_neighbor_report(struct hostapd_data *hapd)
|
||||||
wpabuf_put_u8(nr, center_freq2);
|
wpabuf_put_u8(nr, center_freq2);
|
||||||
|
|
||||||
hostapd_neighbor_set(hapd, hapd->own_addr, &ssid, nr, hapd->iconf->lci,
|
hostapd_neighbor_set(hapd, hapd->own_addr, &ssid, nr, hapd->iconf->lci,
|
||||||
hapd->iconf->civic);
|
hapd->iconf->civic, hapd->iconf->stationary_ap);
|
||||||
|
|
||||||
wpabuf_free(nr);
|
wpabuf_free(nr);
|
||||||
#endif /* NEED_AP_MLME */
|
#endif /* NEED_AP_MLME */
|
||||||
|
|
|
@ -109,6 +109,7 @@ struct hostapd_neighbor_entry {
|
||||||
struct wpabuf *civic;
|
struct wpabuf *civic;
|
||||||
/* LCI update time */
|
/* LCI update time */
|
||||||
struct os_time lci_date;
|
struct os_time lci_date;
|
||||||
|
int stationary;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -43,6 +43,7 @@ static void hostapd_neighbor_clear_entry(struct hostapd_neighbor_entry *nr)
|
||||||
nr->civic = NULL;
|
nr->civic = NULL;
|
||||||
os_memset(nr->bssid, 0, sizeof(nr->bssid));
|
os_memset(nr->bssid, 0, sizeof(nr->bssid));
|
||||||
os_memset(&nr->ssid, 0, sizeof(nr->ssid));
|
os_memset(&nr->ssid, 0, sizeof(nr->ssid));
|
||||||
|
nr->stationary = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -64,7 +65,7 @@ hostapd_neighbor_add(struct hostapd_data *hapd)
|
||||||
int hostapd_neighbor_set(struct hostapd_data *hapd, const u8 *bssid,
|
int hostapd_neighbor_set(struct hostapd_data *hapd, const u8 *bssid,
|
||||||
const struct wpa_ssid_value *ssid,
|
const struct wpa_ssid_value *ssid,
|
||||||
const struct wpabuf *nr, const struct wpabuf *lci,
|
const struct wpabuf *nr, const struct wpabuf *lci,
|
||||||
const struct wpabuf *civic)
|
const struct wpabuf *civic, int stationary)
|
||||||
{
|
{
|
||||||
struct hostapd_neighbor_entry *entry;
|
struct hostapd_neighbor_entry *entry;
|
||||||
|
|
||||||
|
@ -95,6 +96,8 @@ int hostapd_neighbor_set(struct hostapd_data *hapd, const u8 *bssid,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entry->stationary = stationary;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|
|
@ -16,7 +16,7 @@ hostapd_neighbor_get(struct hostapd_data *hapd, const u8 *bssid,
|
||||||
int hostapd_neighbor_set(struct hostapd_data *hapd, const u8 *bssid,
|
int hostapd_neighbor_set(struct hostapd_data *hapd, const u8 *bssid,
|
||||||
const struct wpa_ssid_value *ssid,
|
const struct wpa_ssid_value *ssid,
|
||||||
const struct wpabuf *nr, const struct wpabuf *lci,
|
const struct wpabuf *nr, const struct wpabuf *lci,
|
||||||
const struct wpabuf *civic);
|
const struct wpabuf *civic, int stationary);
|
||||||
int hostapd_neighbor_remove(struct hostapd_data *hapd, const u8 *bssid,
|
int hostapd_neighbor_remove(struct hostapd_data *hapd, const u8 *bssid,
|
||||||
const struct wpa_ssid_value *ssid);
|
const struct wpa_ssid_value *ssid);
|
||||||
void hostpad_free_neighbor_db(struct hostapd_data *hapd);
|
void hostpad_free_neighbor_db(struct hostapd_data *hapd);
|
||||||
|
|
|
@ -129,12 +129,12 @@ static int hostapd_check_lci_age(struct hostapd_neighbor_entry *nr, u16 max_age)
|
||||||
struct os_time curr, diff;
|
struct os_time curr, diff;
|
||||||
unsigned long diff_l;
|
unsigned long diff_l;
|
||||||
|
|
||||||
|
if (nr->stationary || max_age == 0xffff)
|
||||||
|
return 1;
|
||||||
|
|
||||||
if (!max_age)
|
if (!max_age)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (max_age == 0xffff)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (os_get_time(&curr))
|
if (os_get_time(&curr))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue