Set hostapd configuration based on wpa_supplicant AP mode config
This commit is contained in:
parent
c813b69546
commit
07f117edb5
1 changed files with 65 additions and 0 deletions
|
@ -97,6 +97,65 @@ struct hapd_driver_ops *hostapd_drivers[] =
|
|||
NULL
|
||||
};
|
||||
|
||||
|
||||
static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
|
||||
struct wpa_ssid *ssid,
|
||||
struct hostapd_config *conf)
|
||||
{
|
||||
struct hostapd_bss_config *bss = &conf->bss[0];
|
||||
|
||||
os_strlcpy(bss->iface, wpa_s->ifname, sizeof(bss->iface));
|
||||
|
||||
if (ssid->frequency == 0) {
|
||||
/* default channel 11 */
|
||||
conf->hw_mode = HOSTAPD_MODE_IEEE80211G;
|
||||
conf->channel = 11;
|
||||
} else if (ssid->frequency >= 2412 && ssid->frequency <= 2472) {
|
||||
conf->hw_mode = HOSTAPD_MODE_IEEE80211G;
|
||||
conf->channel = (ssid->frequency - 2407) / 5;
|
||||
} else if ((ssid->frequency >= 5180 && ssid->frequency <= 5240) ||
|
||||
(ssid->frequency >= 5745 && ssid->frequency <= 5825)) {
|
||||
conf->hw_mode = HOSTAPD_MODE_IEEE80211G;
|
||||
conf->channel = (ssid->frequency - 5000) / 5;
|
||||
} else {
|
||||
wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: %d MHz",
|
||||
ssid->frequency);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* TODO: enable HT if driver supports it;
|
||||
* drop to 11b if driver does not support 11g */
|
||||
|
||||
if (ssid->ssid_len == 0) {
|
||||
wpa_printf(MSG_ERROR, "No SSID configured for AP mode");
|
||||
return -1;
|
||||
}
|
||||
os_memcpy(bss->ssid.ssid, ssid->ssid, ssid->ssid_len);
|
||||
bss->ssid.ssid[ssid->ssid_len] = '\0';
|
||||
bss->ssid.ssid_len = ssid->ssid_len;
|
||||
bss->ssid.ssid_set = 1;
|
||||
|
||||
if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt))
|
||||
bss->wpa = ssid->proto;
|
||||
bss->wpa_key_mgmt = ssid->key_mgmt;
|
||||
bss->wpa_pairwise = ssid->pairwise_cipher;
|
||||
if (ssid->passphrase) {
|
||||
bss->ssid.wpa_passphrase = os_strdup(ssid->passphrase);
|
||||
if (hostapd_setup_wpa_psk(bss))
|
||||
return -1;
|
||||
} else if (ssid->psk_set) {
|
||||
os_free(bss->ssid.wpa_psk);
|
||||
bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk));
|
||||
if (bss->ssid.wpa_psk == NULL)
|
||||
return -1;
|
||||
os_memcpy(bss->ssid.wpa_psk->psk, ssid->psk, PMK_LEN);
|
||||
bss->ssid.wpa_psk->group = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
|
||||
struct wpa_ssid *ssid)
|
||||
{
|
||||
|
@ -121,6 +180,12 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (wpa_supplicant_conf_ap(wpa_s, ssid, conf)) {
|
||||
wpa_printf(MSG_ERROR, "Failed to create AP configuration");
|
||||
wpa_supplicant_ap_deinit(wpa_s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
hapd_iface->num_bss = conf->num_bss;
|
||||
hapd_iface->bss = os_zalloc(conf->num_bss *
|
||||
sizeof(struct hostapd_data *));
|
||||
|
|
Loading…
Reference in a new issue