diff --git a/hostapd/Makefile b/hostapd/Makefile index 3a3103408..efa1011f7 100644 --- a/hostapd/Makefile +++ b/hostapd/Makefile @@ -52,6 +52,7 @@ OBJS += ../src/ap/wpa_auth_ie.o OBJS += ../src/ap/preauth_auth.o OBJS += ../src/ap/pmksa_cache_auth.o OBJS += ../src/ap/ieee802_11_shared.o +OBJS += ../src/ap/beacon.o OBJS_c = hostapd_cli.o ../src/common/wpa_ctrl.o ../src/utils/os_$(CONFIG_OS).o @@ -729,7 +730,6 @@ OBJS += ../src/utils/base64.o endif ifdef NEED_AP_MLME -OBJS += ../src/ap/beacon.o OBJS += ../src/ap/wmm.o OBJS += ../src/ap/ap_list.o OBJS += ../src/ap/ieee802_11.o diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index 9751b2908..019c9c859 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -233,74 +233,6 @@ int hostapd_set_drv_ieee8021x(struct hostapd_data *hapd, const char *ifname, } -static int hostapd_set_ap_isolate(struct hostapd_data *hapd, int value) -{ - if (hapd->driver == NULL || hapd->driver->set_intra_bss == NULL) - return 0; - return hapd->driver->set_intra_bss(hapd->drv_priv, !value); -} - - -int hostapd_set_bss_params(struct hostapd_data *hapd, int use_protection) -{ - int ret = 0; - int preamble; -#ifdef CONFIG_IEEE80211N - u8 buf[60], *ht_capab, *ht_oper, *pos; - - pos = buf; - ht_capab = pos; - pos = hostapd_eid_ht_capabilities(hapd, pos); - ht_oper = pos; - pos = hostapd_eid_ht_operation(hapd, pos); - if (pos > ht_oper && ht_oper > ht_capab && - hostapd_set_ht_params(hapd, ht_capab + 2, ht_capab[1], - ht_oper + 2, ht_oper[1])) { - wpa_printf(MSG_ERROR, "Could not set HT capabilities " - "for kernel driver"); - ret = -1; - } - -#endif /* CONFIG_IEEE80211N */ - - if (hostapd_set_cts_protect(hapd, use_protection)) { - wpa_printf(MSG_ERROR, "Failed to set CTS protect in kernel " - "driver"); - ret = -1; - } - - if (hapd->iface->current_mode && - hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G && - hostapd_set_short_slot_time(hapd, - hapd->iface->num_sta_no_short_slot_time - > 0 ? 0 : 1)) { - wpa_printf(MSG_ERROR, "Failed to set Short Slot Time option " - "in kernel driver"); - ret = -1; - } - - if (hapd->iface->num_sta_no_short_preamble == 0 && - hapd->iconf->preamble == SHORT_PREAMBLE) - preamble = SHORT_PREAMBLE; - else - preamble = LONG_PREAMBLE; - if (hostapd_set_preamble(hapd, preamble)) { - wpa_printf(MSG_ERROR, "Could not set preamble for kernel " - "driver"); - ret = -1; - } - - if (hostapd_set_ap_isolate(hapd, hapd->conf->isolate) && - hapd->conf->isolate) { - wpa_printf(MSG_ERROR, "Could not enable AP isolation in " - "kernel driver"); - ret = -1; - } - - return ret; -} - - int hostapd_vlan_if_add(struct hostapd_data *hapd, const char *ifname) { char force_ifname[IFNAMSIZ]; diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h index f27069589..9b9c4bb1c 100644 --- a/src/ap/ap_drv_ops.h +++ b/src/ap/ap_drv_ops.h @@ -34,7 +34,6 @@ int hostapd_set_authorized(struct hostapd_data *hapd, int hostapd_set_sta_flags(struct hostapd_data *hapd, struct sta_info *sta); int hostapd_set_drv_ieee8021x(struct hostapd_data *hapd, const char *ifname, int enabled); -int hostapd_set_bss_params(struct hostapd_data *hapd, int use_protection); int hostapd_vlan_if_add(struct hostapd_data *hapd, const char *ifname); int hostapd_vlan_if_remove(struct hostapd_data *hapd, const char *ifname); int hostapd_set_wds_sta(struct hostapd_data *hapd, const u8 *addr, int aid, diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 4fd403335..b2f321833 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -35,6 +35,8 @@ #include "beacon.h" +#ifdef NEED_AP_MLME + static u8 ieee802_11_erp_info(struct hostapd_data *hapd) { u8 erp = 0; @@ -434,14 +436,88 @@ void handle_probe_req(struct hostapd_data *hapd, } +static int hostapd_set_ap_isolate(struct hostapd_data *hapd, int value) +{ + if (hapd->driver == NULL || hapd->driver->set_intra_bss == NULL) + return 0; + return hapd->driver->set_intra_bss(hapd->drv_priv, !value); +} + + +static int hostapd_set_bss_params(struct hostapd_data *hapd, + int use_protection) +{ + int ret = 0; + int preamble; +#ifdef CONFIG_IEEE80211N + u8 buf[60], *ht_capab, *ht_oper, *pos; + + pos = buf; + ht_capab = pos; + pos = hostapd_eid_ht_capabilities(hapd, pos); + ht_oper = pos; + pos = hostapd_eid_ht_operation(hapd, pos); + if (pos > ht_oper && ht_oper > ht_capab && + hostapd_set_ht_params(hapd, ht_capab + 2, ht_capab[1], + ht_oper + 2, ht_oper[1])) { + wpa_printf(MSG_ERROR, "Could not set HT capabilities " + "for kernel driver"); + ret = -1; + } + +#endif /* CONFIG_IEEE80211N */ + + if (hostapd_set_cts_protect(hapd, use_protection)) { + wpa_printf(MSG_ERROR, "Failed to set CTS protect in kernel " + "driver"); + ret = -1; + } + + if (hapd->iface->current_mode && + hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G && + hostapd_set_short_slot_time(hapd, + hapd->iface->num_sta_no_short_slot_time + > 0 ? 0 : 1)) { + wpa_printf(MSG_ERROR, "Failed to set Short Slot Time option " + "in kernel driver"); + ret = -1; + } + + if (hapd->iface->num_sta_no_short_preamble == 0 && + hapd->iconf->preamble == SHORT_PREAMBLE) + preamble = SHORT_PREAMBLE; + else + preamble = LONG_PREAMBLE; + if (hostapd_set_preamble(hapd, preamble)) { + wpa_printf(MSG_ERROR, "Could not set preamble for kernel " + "driver"); + ret = -1; + } + + if (hostapd_set_ap_isolate(hapd, hapd->conf->isolate) && + hapd->conf->isolate) { + wpa_printf(MSG_ERROR, "Could not enable AP isolation in " + "kernel driver"); + ret = -1; + } + + return ret; +} + +#endif /* NEED_AP_MLME */ + + void ieee802_11_set_beacon(struct hostapd_data *hapd) { - struct ieee80211_mgmt *head; - u8 *pos, *tail, *tailpos; - u16 capab_info; - size_t head_len, tail_len; + struct ieee80211_mgmt *head = NULL; + u8 *tail = NULL; + size_t head_len = 0, tail_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 */ #ifdef CONFIG_P2P if ((hapd->conf->p2p & (P2P_ENABLED | P2P_GROUP_OWNER)) == P2P_ENABLED) @@ -449,6 +525,8 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd) #endif /* CONFIG_P2P */ hapd->beacon_set_done = 1; +#ifdef NEED_AP_MLME + #define BEACON_HEAD_BUF_SIZE 256 #define BEACON_TAIL_BUF_SIZE 512 head = os_zalloc(BEACON_HEAD_BUF_SIZE); @@ -556,6 +634,8 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd) tail_len = tailpos > tail ? tailpos - tail : 0; +#endif /* NEED_AP_MLME */ + os_memset(¶ms, 0, sizeof(params)); params.head = (u8 *) head; params.head_len = head_len; @@ -600,8 +680,10 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd) #ifdef CONFIG_P2P no_beacon: #endif /* CONFIG_P2P */ +#ifdef NEED_AP_MLME hostapd_set_bss_params(hapd, !!(ieee802_11_erp_info(hapd) & ERP_INFO_USE_PROTECTION)); +#endif /* NEED_AP_MLME */ } diff --git a/src/ap/beacon.h b/src/ap/beacon.h index c1510e194..a944f5f35 100644 --- a/src/ap/beacon.h +++ b/src/ap/beacon.h @@ -20,17 +20,7 @@ struct ieee80211_mgmt; void handle_probe_req(struct hostapd_data *hapd, const struct ieee80211_mgmt *mgmt, size_t len); -#ifdef NEED_AP_MLME void ieee802_11_set_beacon(struct hostapd_data *hapd); void ieee802_11_set_beacons(struct hostapd_iface *iface); -#else /* NEED_AP_MLME */ -static inline void ieee802_11_set_beacon(struct hostapd_data *hapd) -{ -} - -static inline void ieee802_11_set_beacons(struct hostapd_iface *iface) -{ -} -#endif /* NEED_AP_MLME */ #endif /* BEACON_H */ diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 0847d37db..79c24f971 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -614,6 +614,9 @@ struct wpa_driver_ap_params { /** * assocresp_ies - WPS IE(s) for (Re)Association Response frames + * + * This is used to add IEs like WPS IE by drivers that reply to + * (Re)Association Request frames internally. */ const struct wpabuf *assocresp_ies; }; @@ -1465,6 +1468,8 @@ struct wpa_driver_ops { * can be left undefined (set to %NULL) if IEEE 802.1X support is * always enabled and the driver uses set_ap() to set WPA/RSN IE * for Beacon frames. + * + * DEPRECATED - use set_ap() instead */ int (*set_ieee8021x)(void *priv, struct wpa_bss_params *params); @@ -1477,6 +1482,8 @@ struct wpa_driver_ops { * This is an optional function to configure privacy field in the * kernel driver for Beacon frames. This can be left undefined (set to * %NULL) if the driver uses the Beacon template from set_ap(). + * + * DEPRECATED - use set_ap() instead */ int (*set_privacy)(void *priv, int enabled); @@ -1519,6 +1526,8 @@ struct wpa_driver_ops { * kernel driver for Beacon and Probe Response frames. This can be left * undefined (set to %NULL) if the driver uses the Beacon template from * set_ap(). + * + * DEPRECATED - use set_ap() instead */ int (*set_generic_elem)(void *priv, const u8 *elem, size_t elem_len); @@ -1602,6 +1611,8 @@ struct wpa_driver_ops { * @buf: SSID * @len: Length of the SSID in octets * Returns: 0 on success, -1 on failure + * + * DEPRECATED - use set_ap() instead */ int (*hapd_set_ssid)(void *priv, const u8 *buf, int len); @@ -1870,6 +1881,8 @@ struct wpa_driver_ops { * also used to provide Probe Response IEs for P2P Listen state * operations for drivers that generate the Probe Response frames * internally. + * + * DEPRECATED - use set_ap() instead */ int (*set_ap_wps_ie)(void *priv, const struct wpabuf *beacon, const struct wpabuf *proberesp, @@ -2383,6 +2396,8 @@ struct wpa_driver_ops { * This function can be used to set authentication algorithms for AP * mode when static WEP is used. If the driver uses user space MLME/SME * implementation, there is no need to implement this function. + * + * DEPRECATED - use set_ap() instead */ int (*set_authmode)(void *priv, int authmode); diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile index db453258c..794b727bb 100644 --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile @@ -681,6 +681,7 @@ OBJS += ../src/ap/ieee802_11_auth.o OBJS += ../src/ap/ieee802_11_shared.o OBJS += ../src/ap/drv_callbacks.o OBJS += ../src/ap/ap_drv_ops.o +OBJS += ../src/ap/beacon.o ifdef CONFIG_IEEE80211N OBJS += ../src/ap/ieee802_11_ht.o endif @@ -698,7 +699,6 @@ CFLAGS += -DCONFIG_IEEE80211N endif ifdef NEED_AP_MLME -OBJS += ../src/ap/beacon.o OBJS += ../src/ap/wmm.o OBJS += ../src/ap/ap_list.o OBJS += ../src/ap/ieee802_11.o