Move AP parameter filling into a helper function
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>
Thu, 14 Nov 2013 10:28:31 +0000 (12:28 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 17 Nov 2013 15:12:58 +0000 (17:12 +0200)
Signed-hostap: Andrei Otcheretianski <andrei.otcheretianski@intel.com>

src/ap/beacon.c
src/ap/beacon.h
src/drivers/driver.h

index 6c8b78f..4b75a75 100644 (file)
@@ -588,23 +588,17 @@ static u8 * hostapd_probe_resp_offloads(struct hostapd_data *hapd,
 #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;
        u8 *tail = NULL;
        size_t head_len = 0, tail_len = 0;
        u8 *resp = NULL;
        size_t resp_len = 0;
-       struct wpa_driver_ap_params params;
-       struct wpabuf *beacon, *proberesp, *assocresp;
 #ifdef NEED_AP_MLME
        u16 capab_info;
        u8 *pos, *tailpos;
-#endif /* NEED_AP_MLME */
-
-       hapd->beacon_set_done = 1;
-
-#ifdef NEED_AP_MLME
 
 #define BEACON_HEAD_BUF_SIZE 256
 #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");
                os_free(head);
                os_free(tail);
-               return;
+               return -1;
        }
 
        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);
 #endif /* NEED_AP_MLME */
 
-       os_memset(&params, 0, sizeof(params));
-       params.head = (u8 *) head;
-       params.head_len = head_len;
-       params.tail = tail;
-       params.tail_len = tail_len;
-       params.proberesp = resp;
-       params.proberesp_len = resp_len;
-       params.dtim_period = hapd->conf->dtim_period;
-       params.beacon_int = hapd->iconf->beacon_int;
-       params.basic_rates = hapd->iface->basic_rates;
-       params.ssid = hapd->conf->ssid.ssid;
-       params.ssid_len = hapd->conf->ssid.ssid_len;
-       params.pairwise_ciphers = hapd->conf->rsn_pairwise ?
+       os_memset(params, 0, sizeof(*params));
+       params->head = (u8 *) head;
+       params->head_len = head_len;
+       params->tail = tail;
+       params->tail_len = tail_len;
+       params->proberesp = resp;
+       params->proberesp_len = resp_len;
+       params->dtim_period = hapd->conf->dtim_period;
+       params->beacon_int = hapd->iconf->beacon_int;
+       params->basic_rates = hapd->iface->basic_rates;
+       params->ssid = hapd->conf->ssid.ssid;
+       params->ssid_len = hapd->conf->ssid.ssid_len;
+       params->pairwise_ciphers = hapd->conf->rsn_pairwise ?
                hapd->conf->rsn_pairwise : hapd->conf->wpa_pairwise;
-       params.group_cipher = hapd->conf->wpa_group;
-       params.key_mgmt_suites = hapd->conf->wpa_key_mgmt;
-       params.auth_algs = hapd->conf->auth_algs;
-       params.wpa_version = hapd->conf->wpa;
-       params.privacy = hapd->conf->ssid.wep.keys_set || hapd->conf->wpa ||
+       params->group_cipher = hapd->conf->wpa_group;
+       params->key_mgmt_suites = hapd->conf->wpa_key_mgmt;
+       params->auth_algs = hapd->conf->auth_algs;
+       params->wpa_version = hapd->conf->wpa;
+       params->privacy = hapd->conf->ssid.wep.keys_set || hapd->conf->wpa ||
                (hapd->conf->ieee802_1x &&
                 (hapd->conf->default_wep_key_len ||
                  hapd->conf->individual_wep_key_len));
        switch (hapd->conf->ignore_broadcast_ssid) {
        case 0:
-               params.hide_ssid = NO_SSID_HIDING;
+               params->hide_ssid = NO_SSID_HIDING;
                break;
        case 1:
-               params.hide_ssid = HIDDEN_SSID_ZERO_LEN;
+               params->hide_ssid = HIDDEN_SSID_ZERO_LEN;
                break;
        case 2:
-               params.hide_ssid = HIDDEN_SSID_ZERO_CONTENTS;
+               params->hide_ssid = HIDDEN_SSID_ZERO_CONTENTS;
                break;
        }
-       hostapd_build_ap_extra_ies(hapd, &beacon, &proberesp, &assocresp);
-       params.beacon_ies = beacon;
-       params.proberesp_ies = proberesp;
-       params.assocresp_ies = assocresp;
-       params.isolate = hapd->conf->isolate;
+       params->isolate = hapd->conf->isolate;
 #ifdef NEED_AP_MLME
-       params.cts_protect = !!(ieee802_11_erp_info(hapd) &
+       params->cts_protect = !!(ieee802_11_erp_info(hapd) &
                                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;
        if (hapd->iface->current_mode &&
            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;
        else
-               params.short_slot_time = -1;
+               params->short_slot_time = -1;
        if (!hapd->iconf->ieee80211n || hapd->conf->disable_11n)
-               params.ht_opmode = -1;
+               params->ht_opmode = -1;
        else
-               params.ht_opmode = hapd->iface->ht_op_mode;
+               params->ht_opmode = hapd->iface->ht_op_mode;
 #endif /* NEED_AP_MLME */
-       params.interworking = hapd->conf->interworking;
+       params->interworking = hapd->conf->interworking;
        if (hapd->conf->interworking &&
            !is_zero_ether_addr(hapd->conf->hessid))
-               params.hessid = hapd->conf->hessid;
-       params.access_network_type = hapd->conf->access_network_type;
-       params.ap_max_inactivity = hapd->conf->ap_max_inactivity;
+               params->hessid = hapd->conf->hessid;
+       params->access_network_type = hapd->conf->access_network_type;
+       params->ap_max_inactivity = hapd->conf->ap_max_inactivity;
 #ifdef CONFIG_HS20
-       params.disable_dgaf = hapd->conf->disable_dgaf;
+       params->disable_dgaf = hapd->conf->disable_dgaf;
 #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, &params) < 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, &params))
                wpa_printf(MSG_ERROR, "Failed to set beacon parameters");
        hostapd_free_ap_extra_ies(hapd, beacon, proberesp, assocresp);
-
-       os_free(tail);
-       os_free(head);
-       os_free(resp);
+fail:
+       ieee802_11_free_ap_params(&params);
 }
 
 
index 37f10d2..a04a829 100644 (file)
@@ -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_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 */
index 55b344d..2a80419 100644 (file)
@@ -634,7 +634,7 @@ struct wpa_driver_ap_params {
        /**
         * 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
@@ -644,7 +644,7 @@ struct wpa_driver_ap_params {
        /**
         * tail - Beacon tail following TIM IE
         */
-       const u8 *tail;
+       u8 *tail;
 
        /**
         * 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
         * AP mode and require the full Probe Response template.
         */
-       const u8 *proberesp;
+       u8 *proberesp;
 
        /**
         * proberesp_len - Length of the proberesp buffer in octets