Set hostapd configuration based on wpa_supplicant AP mode config
authorJouni Malinen <jouni.malinen@atheros.com>
Fri, 27 Mar 2009 14:45:47 +0000 (16:45 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 27 Mar 2009 14:45:47 +0000 (16:45 +0200)
wpa_supplicant/ap.c

index 5ab8557..5a16a73 100644 (file)
@@ -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 *));