Move AP parameter filling into a helper function
Signed-hostap: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
This commit is contained in:
parent
1c4ffa8746
commit
e44a384b68
3 changed files with 77 additions and 53 deletions
121
src/ap/beacon.c
121
src/ap/beacon.c
|
@ -588,23 +588,17 @@ static u8 * hostapd_probe_resp_offloads(struct hostapd_data *hapd,
|
||||||
#endif /* NEED_AP_MLME */
|
#endif /* NEED_AP_MLME */
|
||||||
|
|
||||||
|
|
||||||
void ieee802_11_set_beacon(struct hostapd_data *hapd)
|
int ieee802_11_build_ap_params(struct hostapd_data *hapd,
|
||||||
|
struct wpa_driver_ap_params *params)
|
||||||
{
|
{
|
||||||
struct ieee80211_mgmt *head = NULL;
|
struct ieee80211_mgmt *head = NULL;
|
||||||
u8 *tail = NULL;
|
u8 *tail = NULL;
|
||||||
size_t head_len = 0, tail_len = 0;
|
size_t head_len = 0, tail_len = 0;
|
||||||
u8 *resp = NULL;
|
u8 *resp = NULL;
|
||||||
size_t resp_len = 0;
|
size_t resp_len = 0;
|
||||||
struct wpa_driver_ap_params params;
|
|
||||||
struct wpabuf *beacon, *proberesp, *assocresp;
|
|
||||||
#ifdef NEED_AP_MLME
|
#ifdef NEED_AP_MLME
|
||||||
u16 capab_info;
|
u16 capab_info;
|
||||||
u8 *pos, *tailpos;
|
u8 *pos, *tailpos;
|
||||||
#endif /* NEED_AP_MLME */
|
|
||||||
|
|
||||||
hapd->beacon_set_done = 1;
|
|
||||||
|
|
||||||
#ifdef NEED_AP_MLME
|
|
||||||
|
|
||||||
#define BEACON_HEAD_BUF_SIZE 256
|
#define BEACON_HEAD_BUF_SIZE 256
|
||||||
#define BEACON_TAIL_BUF_SIZE 512
|
#define BEACON_TAIL_BUF_SIZE 512
|
||||||
|
@ -625,7 +619,7 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
|
||||||
wpa_printf(MSG_ERROR, "Failed to set beacon data");
|
wpa_printf(MSG_ERROR, "Failed to set beacon data");
|
||||||
os_free(head);
|
os_free(head);
|
||||||
os_free(tail);
|
os_free(tail);
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
head->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
|
head->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
|
||||||
|
@ -744,76 +738,103 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
|
||||||
resp = hostapd_probe_resp_offloads(hapd, &resp_len);
|
resp = hostapd_probe_resp_offloads(hapd, &resp_len);
|
||||||
#endif /* NEED_AP_MLME */
|
#endif /* NEED_AP_MLME */
|
||||||
|
|
||||||
os_memset(¶ms, 0, sizeof(params));
|
os_memset(params, 0, sizeof(*params));
|
||||||
params.head = (u8 *) head;
|
params->head = (u8 *) head;
|
||||||
params.head_len = head_len;
|
params->head_len = head_len;
|
||||||
params.tail = tail;
|
params->tail = tail;
|
||||||
params.tail_len = tail_len;
|
params->tail_len = tail_len;
|
||||||
params.proberesp = resp;
|
params->proberesp = resp;
|
||||||
params.proberesp_len = resp_len;
|
params->proberesp_len = resp_len;
|
||||||
params.dtim_period = hapd->conf->dtim_period;
|
params->dtim_period = hapd->conf->dtim_period;
|
||||||
params.beacon_int = hapd->iconf->beacon_int;
|
params->beacon_int = hapd->iconf->beacon_int;
|
||||||
params.basic_rates = hapd->iface->basic_rates;
|
params->basic_rates = hapd->iface->basic_rates;
|
||||||
params.ssid = hapd->conf->ssid.ssid;
|
params->ssid = hapd->conf->ssid.ssid;
|
||||||
params.ssid_len = hapd->conf->ssid.ssid_len;
|
params->ssid_len = hapd->conf->ssid.ssid_len;
|
||||||
params.pairwise_ciphers = hapd->conf->rsn_pairwise ?
|
params->pairwise_ciphers = hapd->conf->rsn_pairwise ?
|
||||||
hapd->conf->rsn_pairwise : hapd->conf->wpa_pairwise;
|
hapd->conf->rsn_pairwise : hapd->conf->wpa_pairwise;
|
||||||
params.group_cipher = hapd->conf->wpa_group;
|
params->group_cipher = hapd->conf->wpa_group;
|
||||||
params.key_mgmt_suites = hapd->conf->wpa_key_mgmt;
|
params->key_mgmt_suites = hapd->conf->wpa_key_mgmt;
|
||||||
params.auth_algs = hapd->conf->auth_algs;
|
params->auth_algs = hapd->conf->auth_algs;
|
||||||
params.wpa_version = hapd->conf->wpa;
|
params->wpa_version = hapd->conf->wpa;
|
||||||
params.privacy = hapd->conf->ssid.wep.keys_set || hapd->conf->wpa ||
|
params->privacy = hapd->conf->ssid.wep.keys_set || hapd->conf->wpa ||
|
||||||
(hapd->conf->ieee802_1x &&
|
(hapd->conf->ieee802_1x &&
|
||||||
(hapd->conf->default_wep_key_len ||
|
(hapd->conf->default_wep_key_len ||
|
||||||
hapd->conf->individual_wep_key_len));
|
hapd->conf->individual_wep_key_len));
|
||||||
switch (hapd->conf->ignore_broadcast_ssid) {
|
switch (hapd->conf->ignore_broadcast_ssid) {
|
||||||
case 0:
|
case 0:
|
||||||
params.hide_ssid = NO_SSID_HIDING;
|
params->hide_ssid = NO_SSID_HIDING;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
params.hide_ssid = HIDDEN_SSID_ZERO_LEN;
|
params->hide_ssid = HIDDEN_SSID_ZERO_LEN;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
params.hide_ssid = HIDDEN_SSID_ZERO_CONTENTS;
|
params->hide_ssid = HIDDEN_SSID_ZERO_CONTENTS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
hostapd_build_ap_extra_ies(hapd, &beacon, &proberesp, &assocresp);
|
params->isolate = hapd->conf->isolate;
|
||||||
params.beacon_ies = beacon;
|
|
||||||
params.proberesp_ies = proberesp;
|
|
||||||
params.assocresp_ies = assocresp;
|
|
||||||
params.isolate = hapd->conf->isolate;
|
|
||||||
#ifdef NEED_AP_MLME
|
#ifdef NEED_AP_MLME
|
||||||
params.cts_protect = !!(ieee802_11_erp_info(hapd) &
|
params->cts_protect = !!(ieee802_11_erp_info(hapd) &
|
||||||
ERP_INFO_USE_PROTECTION);
|
ERP_INFO_USE_PROTECTION);
|
||||||
params.preamble = hapd->iface->num_sta_no_short_preamble == 0 &&
|
params->preamble = hapd->iface->num_sta_no_short_preamble == 0 &&
|
||||||
hapd->iconf->preamble == SHORT_PREAMBLE;
|
hapd->iconf->preamble == SHORT_PREAMBLE;
|
||||||
if (hapd->iface->current_mode &&
|
if (hapd->iface->current_mode &&
|
||||||
hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G)
|
hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G)
|
||||||
params.short_slot_time =
|
params->short_slot_time =
|
||||||
hapd->iface->num_sta_no_short_slot_time > 0 ? 0 : 1;
|
hapd->iface->num_sta_no_short_slot_time > 0 ? 0 : 1;
|
||||||
else
|
else
|
||||||
params.short_slot_time = -1;
|
params->short_slot_time = -1;
|
||||||
if (!hapd->iconf->ieee80211n || hapd->conf->disable_11n)
|
if (!hapd->iconf->ieee80211n || hapd->conf->disable_11n)
|
||||||
params.ht_opmode = -1;
|
params->ht_opmode = -1;
|
||||||
else
|
else
|
||||||
params.ht_opmode = hapd->iface->ht_op_mode;
|
params->ht_opmode = hapd->iface->ht_op_mode;
|
||||||
#endif /* NEED_AP_MLME */
|
#endif /* NEED_AP_MLME */
|
||||||
params.interworking = hapd->conf->interworking;
|
params->interworking = hapd->conf->interworking;
|
||||||
if (hapd->conf->interworking &&
|
if (hapd->conf->interworking &&
|
||||||
!is_zero_ether_addr(hapd->conf->hessid))
|
!is_zero_ether_addr(hapd->conf->hessid))
|
||||||
params.hessid = hapd->conf->hessid;
|
params->hessid = hapd->conf->hessid;
|
||||||
params.access_network_type = hapd->conf->access_network_type;
|
params->access_network_type = hapd->conf->access_network_type;
|
||||||
params.ap_max_inactivity = hapd->conf->ap_max_inactivity;
|
params->ap_max_inactivity = hapd->conf->ap_max_inactivity;
|
||||||
#ifdef CONFIG_HS20
|
#ifdef CONFIG_HS20
|
||||||
params.disable_dgaf = hapd->conf->disable_dgaf;
|
params->disable_dgaf = hapd->conf->disable_dgaf;
|
||||||
#endif /* CONFIG_HS20 */
|
#endif /* CONFIG_HS20 */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ieee802_11_free_ap_params(struct wpa_driver_ap_params *params)
|
||||||
|
{
|
||||||
|
os_free(params->tail);
|
||||||
|
params->tail = NULL;
|
||||||
|
os_free(params->head);
|
||||||
|
params->head = NULL;
|
||||||
|
os_free(params->proberesp);
|
||||||
|
params->proberesp = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ieee802_11_set_beacon(struct hostapd_data *hapd)
|
||||||
|
{
|
||||||
|
struct wpa_driver_ap_params params;
|
||||||
|
struct wpabuf *beacon, *proberesp, *assocresp;
|
||||||
|
|
||||||
|
hapd->beacon_set_done = 1;
|
||||||
|
|
||||||
|
if (ieee802_11_build_ap_params(hapd, ¶ms) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (hostapd_build_ap_extra_ies(hapd, &beacon, &proberesp, &assocresp) <
|
||||||
|
0)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
params.beacon_ies = beacon;
|
||||||
|
params.proberesp_ies = proberesp;
|
||||||
|
params.assocresp_ies = assocresp;
|
||||||
|
|
||||||
if (hostapd_drv_set_ap(hapd, ¶ms))
|
if (hostapd_drv_set_ap(hapd, ¶ms))
|
||||||
wpa_printf(MSG_ERROR, "Failed to set beacon parameters");
|
wpa_printf(MSG_ERROR, "Failed to set beacon parameters");
|
||||||
hostapd_free_ap_extra_ies(hapd, beacon, proberesp, assocresp);
|
hostapd_free_ap_extra_ies(hapd, beacon, proberesp, assocresp);
|
||||||
|
fail:
|
||||||
os_free(tail);
|
ieee802_11_free_ap_params(¶ms);
|
||||||
os_free(head);
|
|
||||||
os_free(resp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,5 +24,8 @@ void handle_probe_req(struct hostapd_data *hapd,
|
||||||
void ieee802_11_set_beacon(struct hostapd_data *hapd);
|
void ieee802_11_set_beacon(struct hostapd_data *hapd);
|
||||||
void ieee802_11_set_beacons(struct hostapd_iface *iface);
|
void ieee802_11_set_beacons(struct hostapd_iface *iface);
|
||||||
void ieee802_11_update_beacons(struct hostapd_iface *iface);
|
void ieee802_11_update_beacons(struct hostapd_iface *iface);
|
||||||
|
int ieee802_11_build_ap_params(struct hostapd_data *hapd,
|
||||||
|
struct wpa_driver_ap_params *params);
|
||||||
|
void ieee802_11_free_ap_params(struct wpa_driver_ap_params *params);
|
||||||
|
|
||||||
#endif /* BEACON_H */
|
#endif /* BEACON_H */
|
||||||
|
|
|
@ -634,7 +634,7 @@ struct wpa_driver_ap_params {
|
||||||
/**
|
/**
|
||||||
* head - Beacon head from IEEE 802.11 header to IEs before TIM IE
|
* head - Beacon head from IEEE 802.11 header to IEs before TIM IE
|
||||||
*/
|
*/
|
||||||
const u8 *head;
|
u8 *head;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* head_len - Length of the head buffer in octets
|
* head_len - Length of the head buffer in octets
|
||||||
|
@ -644,7 +644,7 @@ struct wpa_driver_ap_params {
|
||||||
/**
|
/**
|
||||||
* tail - Beacon tail following TIM IE
|
* tail - Beacon tail following TIM IE
|
||||||
*/
|
*/
|
||||||
const u8 *tail;
|
u8 *tail;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tail_len - Length of the tail buffer in octets
|
* tail_len - Length of the tail buffer in octets
|
||||||
|
@ -675,7 +675,7 @@ struct wpa_driver_ap_params {
|
||||||
* This is used by drivers that reply to Probe Requests internally in
|
* This is used by drivers that reply to Probe Requests internally in
|
||||||
* AP mode and require the full Probe Response template.
|
* AP mode and require the full Probe Response template.
|
||||||
*/
|
*/
|
||||||
const u8 *proberesp;
|
u8 *proberesp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* proberesp_len - Length of the proberesp buffer in octets
|
* proberesp_len - Length of the proberesp buffer in octets
|
||||||
|
|
Loading…
Reference in a new issue