OSDN Git Service

Accumulative patch from commit d5b559b6418c2bd09663e0d09e93a6592357fdce
[android-x86/external-wpa_supplicant_8.git] / wpa_supplicant / ap.c
index 85ee6cb..d9e1f82 100644 (file)
@@ -55,21 +55,14 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
                /* 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_IEEE80211A;
-               conf->channel = (ssid->frequency - 5000) / 5;
-       } else if (ssid->frequency >= 56160 + 2160 * 1 &&
-                  ssid->frequency <= 56160 + 2160 * 4) {
-               conf->hw_mode = HOSTAPD_MODE_IEEE80211AD;
-               conf->channel = (ssid->frequency - 56160) / 2160;
        } else {
-               wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: %d MHz",
-                          ssid->frequency);
-               return -1;
+               conf->hw_mode = ieee80211_freq_to_chan(ssid->frequency,
+                                                      &conf->channel);
+               if (conf->hw_mode == NUM_HOSTAPD_MODES) {
+                       wpa_printf(MSG_ERROR, "Unsupported AP mode frequency: "
+                                  "%d MHz", ssid->frequency);
+                       return -1;
+               }
        }
 
        /* TODO: enable HT40 if driver supports it;
@@ -209,6 +202,13 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
 
        if (ssid->dtim_period)
                bss->dtim_period = ssid->dtim_period;
+       else if (wpa_s->conf->dtim_period)
+               bss->dtim_period = wpa_s->conf->dtim_period;
+
+       if (ssid->beacon_int)
+               conf->beacon_int = ssid->beacon_int;
+       else if (wpa_s->conf->beacon_int)
+               conf->beacon_int = wpa_s->conf->beacon_int;
 
        if ((bss->wpa & 2) && bss->rsn_pairwise == 0)
                bss->rsn_pairwise = bss->wpa_pairwise;
@@ -244,6 +244,16 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
                bss->rsn_pairwise = WPA_CIPHER_NONE;
        }
 
+       if (bss->wpa_group_rekey < 86400 && (bss->wpa & 2) &&
+           (bss->wpa_group == WPA_CIPHER_CCMP ||
+            bss->wpa_group == WPA_CIPHER_GCMP)) {
+               /*
+                * Strong ciphers do not need frequent rekeying, so increase
+                * the default GTK rekeying period to 24 hours.
+                */
+               bss->wpa_group_rekey = 86400;
+       }
+
 #ifdef CONFIG_WPS
        /*
         * Enable WPS by default for open and WPA/WPA2-Personal network, but
@@ -298,6 +308,11 @@ no_wps:
 
        bss->disassoc_low_ack = wpa_s->conf->disassoc_low_ack;
 
+       if (wpa_s->conf->ap_vendor_elements) {
+               bss->vendor_elements =
+                       wpabuf_dup(wpa_s->conf->ap_vendor_elements);
+       }
+
        return 0;
 }
 
@@ -486,6 +501,9 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
        hapd_iface->owner = wpa_s;
        hapd_iface->drv_flags = wpa_s->drv_flags;
        hapd_iface->probe_resp_offloads = wpa_s->probe_resp_offloads;
+       hapd_iface->extended_capa = wpa_s->extended_capa;
+       hapd_iface->extended_capa_mask = wpa_s->extended_capa_mask;
+       hapd_iface->extended_capa_len = wpa_s->extended_capa_len;
 
        wpa_s->ap_iface->conf = conf = hostapd_config_defaults();
        if (conf == NULL) {
@@ -848,6 +866,34 @@ void wpa_supplicant_ap_pwd_auth_fail(struct wpa_supplicant *wpa_s)
        hapd->conf->ap_pin = NULL;
 }
 
+
+#ifdef CONFIG_WPS_NFC
+
+struct wpabuf * wpas_ap_wps_nfc_config_token(struct wpa_supplicant *wpa_s,
+                                            int ndef)
+{
+       struct hostapd_data *hapd;
+
+       if (wpa_s->ap_iface == NULL)
+               return NULL;
+       hapd = wpa_s->ap_iface->bss[0];
+       return hostapd_wps_nfc_config_token(hapd, ndef);
+}
+
+
+struct wpabuf * wpas_ap_wps_nfc_handover_sel(struct wpa_supplicant *wpa_s,
+                                            int ndef)
+{
+       struct hostapd_data *hapd;
+
+       if (wpa_s->ap_iface == NULL)
+               return NULL;
+       hapd = wpa_s->ap_iface->bss[0];
+       return hostapd_wps_nfc_hs_cr(hapd, ndef);
+}
+
+#endif /* CONFIG_WPS_NFC */
+
 #endif /* CONFIG_WPS */