diff --git a/hostapd_wave/Makefile b/hostapd_wave/Makefile index 0bffdf046cc3349e1d361fc2d2c960661bda2ee5..1bc0e16cb645a6c9057f7f97a7e35507319708d5 100644 --- a/hostapd_wave/Makefile +++ b/hostapd_wave/Makefile @@ -42,6 +42,8 @@ endif PKG_BUILD_DIR_HAPD:=$(PKG_BUILD_DIR)/hostapd PKG_BUILD_DIR_WPAS:=$(PKG_BUILD_DIR)/wpa_supplicant +PKG_BUILD_DEPENDS:=libopenssl libnl librt PACKAGE_hostapd_2_3_wave_5_1_1:hostapd_2_3_wave_5_1_1 + PKG_CONFIG_DEPENDS:=\ CONFIG_WIRELESS_STA diff --git a/hostapd_wave/patches/0322-hostapd-add-radar-detected-event.patch b/hostapd_wave/patches/0322-hostapd-add-radar-detected-event.patch index e48623ef4e215c39a2d57d5c5424d88257fa0f9f..a8b926d5b5b90da4b768e24b9020812168989665 100644 --- a/hostapd_wave/patches/0322-hostapd-add-radar-detected-event.patch +++ b/hostapd_wave/patches/0322-hostapd-add-radar-detected-event.patch @@ -1,6 +1,22 @@ +From 73893ce48a45769a8ed5cd0e9a1741ca0c5182a7 Mon Sep 17 00:00:00 2001 +From: vulsmike <mikelis.vuls@intel.com> +Date: Fri, 23 Nov 2018 15:23:03 +0200 +Subject: [PATCH] hostapd-add-radar-detected-event + +--- + src/ap/drv_callbacks.c | 19 +++++++++++++++++++ + src/common/ltq-vendor.h | 1 + + src/common/wpa_ctrl.h | 1 + + src/drivers/driver.h | 20 ++++++++++++++++++++ + src/drivers/driver_common.c | 1 + + src/drivers/driver_nl80211_event.c | 16 ++++++++++++++++ + 6 files changed, 58 insertions(+) + +diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c +index a355da0..ce2b220 100644 --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c -@@ -1443,6 +1443,22 @@ static void hostapd_event_ltq_wds_discon +@@ -1441,6 +1441,22 @@ static void hostapd_event_ltq_wds_disconnect_rx(struct hostapd_data *hapd, hostapd_notif_disassoc(hapd, wds_sta->mac_addr); } @@ -23,7 +39,7 @@ struct hostapd_channel_data * hostapd_get_mode_channel( struct hostapd_iface *iface, unsigned int freq) { -@@ -1742,6 +1758,9 @@ void wpa_supplicant_event(void *ctx, enu +@@ -1740,6 +1756,9 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, data->ltq_wds_sta_info_data.data, data->ltq_wds_sta_info_data.data_len); break; @@ -33,9 +49,35 @@ case EVENT_ASSOC: if (!data) return; +diff --git a/src/common/ltq-vendor.h b/src/common/ltq-vendor.h +index 2bad35b..d310c07 100644 +--- a/src/common/ltq-vendor.h ++++ b/src/common/ltq-vendor.h +@@ -59,6 +59,7 @@ enum ltq_nl80211_vendor_events { + LTQ_NL80211_VENDOR_EVENT_WDS_CONNECT = 4, + LTQ_NL80211_VENDOR_EVENT_WDS_DISCONNECT = 5, + LTQ_NL80211_VENDOR_EVENT_CSA_RECEIVED = 6, ++ LTQ_NL80211_VENDOR_EVENT_RADAR_DETECTED = 7, + }; + + #endif /* LTQ_VENDOR_H */ +diff --git a/src/common/wpa_ctrl.h b/src/common/wpa_ctrl.h +index 5becfec..9260b0a 100644 +--- a/src/common/wpa_ctrl.h ++++ b/src/common/wpa_ctrl.h +@@ -318,6 +318,7 @@ extern "C" { + #define HOSTAPD_DISCONNECTED "HOSTAPD-DISCONNECTED" + #define UNCONNECTED_STA_RSSI "UNCONNECTED-STA-RSSI " + #define CSA_RECEIVED "CSA-RECEIVED " ++#define LTQ_RADAR "LTQ-DFS-RADAR-DETECTED " + + #define AP_STA_WNM_NOTIF "AP-STA-WNM-NOTIF " + +diff --git a/src/drivers/driver.h b/src/drivers/driver.h +index 2cee364..a7d654e 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h -@@ -4494,6 +4494,7 @@ enum wpa_event_type { +@@ -4457,6 +4457,7 @@ enum wpa_event_type { EVENT_LTQ_WDS_CONNECT, EVENT_LTQ_WDS_DISCONNECT, EVENT_LTQ_CSA_RECEIVED, @@ -43,7 +85,7 @@ /** * EVENT_SIGNAL_CHANGE - Indicate change in signal strength -@@ -5311,6 +5312,17 @@ union wpa_event_data { +@@ -5274,6 +5275,17 @@ union wpa_event_data { } ltq_csa_received; /** @@ -61,7 +103,7 @@ * signal_change - Data for EVENT_SIGNAL_CHANGE events */ struct wpa_signal_info signal_change; -@@ -5634,6 +5646,14 @@ static inline void drv_event_ltq_csa_rec +@@ -5597,6 +5609,14 @@ static inline void drv_event_ltq_csa_received (void *ctx, const u8 *data, size_t wpa_supplicant_event(ctx, EVENT_LTQ_CSA_RECEIVED, &event); } @@ -76,9 +118,23 @@ /* driver_common.c */ void wpa_scan_results_free(struct wpa_scan_results *res); +diff --git a/src/drivers/driver_common.c b/src/drivers/driver_common.c +index 047715c..840f460 100644 +--- a/src/drivers/driver_common.c ++++ b/src/drivers/driver_common.c +@@ -59,6 +59,7 @@ const char * event_to_string(enum wpa_event_type event) + E2S(LTQ_WDS_CONNECT); + E2S(LTQ_WDS_DISCONNECT); + E2S(LTQ_CSA_RECEIVED); ++ E2S(LTQ_RADAR); + E2S(SIGNAL_CHANGE); + E2S(INTERFACE_ENABLED); + E2S(INTERFACE_DISABLED); +diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c +index 6d530a4..fb0880d 100644 --- a/src/drivers/driver_nl80211_event.c +++ b/src/drivers/driver_nl80211_event.c -@@ -2027,6 +2027,19 @@ static void ltq_nl80211_handle_csa_recei +@@ -2027,6 +2027,19 @@ static void ltq_nl80211_handle_csa_received (struct wpa_driver_nl80211_data *drv drv_event_ltq_csa_received(drv->ctx, data, len); } @@ -98,7 +154,7 @@ static void nl80211_vendor_event_ltq(struct wpa_driver_nl80211_data *drv, u32 subcmd, u8 *data, size_t len) { -@@ -2052,6 +2065,9 @@ static void nl80211_vendor_event_ltq(str +@@ -2052,6 +2065,9 @@ static void nl80211_vendor_event_ltq(struct wpa_driver_nl80211_data *drv, case LTQ_NL80211_VENDOR_EVENT_CSA_RECEIVED: ltq_nl80211_handle_csa_received(drv, data, len); break; @@ -108,33 +164,6 @@ default: wpa_printf(MSG_DEBUG, "nl80211: Ignore unsupported LTQ vendor event %u", subcmd); break; ---- a/src/common/ltq-vendor.h -+++ b/src/common/ltq-vendor.h -@@ -61,6 +61,7 @@ enum ltq_nl80211_vendor_events { - LTQ_NL80211_VENDOR_EVENT_WDS_CONNECT = 4, - LTQ_NL80211_VENDOR_EVENT_WDS_DISCONNECT = 5, - LTQ_NL80211_VENDOR_EVENT_CSA_RECEIVED = 6, -+ LTQ_NL80211_VENDOR_EVENT_RADAR_DETECTED = 7, - }; - - #endif /* LTQ_VENDOR_H */ ---- a/src/common/wpa_ctrl.h -+++ b/src/common/wpa_ctrl.h -@@ -320,6 +320,7 @@ extern "C" { - #define HOSTAPD_DISCONNECTED "HOSTAPD-DISCONNECTED" - #define UNCONNECTED_STA_RSSI "UNCONNECTED-STA-RSSI " - #define CSA_RECEIVED "CSA-RECEIVED " -+#define LTQ_RADAR "LTQ-DFS-RADAR-DETECTED " - - #define AP_STA_WNM_NOTIF "AP-STA-WNM-NOTIF " - ---- a/src/drivers/driver_common.c -+++ b/src/drivers/driver_common.c -@@ -59,6 +59,7 @@ const char * event_to_string(enum wpa_ev - E2S(LTQ_WDS_CONNECT); - E2S(LTQ_WDS_DISCONNECT); - E2S(LTQ_CSA_RECEIVED); -+ E2S(LTQ_RADAR); - E2S(SIGNAL_CHANGE); - E2S(INTERFACE_ENABLED); - E2S(INTERFACE_DISABLED); +-- +2.10.1 + diff --git a/hostapd_wave/patches/0413-hostapd-try-restart-if-init-failed.patch b/hostapd_wave/patches/0413-hostapd-try-restart-if-init-failed.patch new file mode 100644 index 0000000000000000000000000000000000000000..251a78c53c7d0ba1dd9e22db141cb25cc26e8317 --- /dev/null +++ b/hostapd_wave/patches/0413-hostapd-try-restart-if-init-failed.patch @@ -0,0 +1,95 @@ +From 3b94687bd48aa863a1882a4ffc66af1003282ba0 Mon Sep 17 00:00:00 2001 +From: vulsmike <mikelis.vuls@intel.com> +Date: Fri, 23 Nov 2018 15:23:03 +0200 +Subject: [PATCH] hostapd-try-restart-if-init-failed + +--- + src/ap/dfs.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 49 insertions(+), 9 deletions(-) + +diff --git a/src/ap/dfs.c b/src/ap/dfs.c +index 7bbd20f..0df3cfb 100644 +--- a/src/ap/dfs.c ++++ b/src/ap/dfs.c +@@ -10,6 +10,7 @@ + #include "utils/includes.h" + + #include "utils/common.h" ++#include "utils/eloop.h" + #include "common/ieee802_11_defs.h" + #include "common/hw_features_common.h" + #include "common/wpa_ctrl.h" +@@ -823,6 +824,37 @@ int chan_width_enum_to_freq(enum chan_width width) + } + } + ++static void hostapd_cac_finish_iface_restart (struct hostapd_iface *iface) ++{ ++ struct hostapd_channel_data *channel = NULL; ++ int secondary_channel; ++ u8 vht_oper_centr_freq_seg0_idx; ++ u8 vht_oper_centr_freq_seg1_idx; ++ ++ channel = dfs_get_valid_channel(iface, &secondary_channel, ++ &vht_oper_centr_freq_seg0_idx, ++ &vht_oper_centr_freq_seg1_idx, ++ 1); ++ ++ if (!channel) { ++ wpa_printf(MSG_ERROR, "No Valid non-DFS channel available"); ++ eloop_terminate(); ++ return; ++ } ++ ++ iface->freq = channel->freq; ++ iface->conf->channel = channel->chan; ++ iface->conf->secondary_channel = secondary_channel; ++ iface->conf->vht_oper_centr_freq_seg0_idx = ++ vht_oper_centr_freq_seg0_idx; ++ iface->conf->vht_oper_centr_freq_seg1_idx = ++ vht_oper_centr_freq_seg1_idx; ++ ++ hostapd_disable_iface(iface); ++ hostapd_enable_iface(iface); ++ return; ++} ++ + int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq, + int ht_enabled, int chan_offset, int chan_width, + int cf1, int cf2) +@@ -896,15 +928,23 @@ int hostapd_dfs_complete_cac(struct hostapd_iface *iface, int success, int freq, + cf2); + #endif + if (iface->cac_started && +- freq_params.freq == freq && +- freq_params.bandwidth == chan_width_enum_to_freq(chan_width) && +- freq_params.center_freq1 == cf1 && +- freq_params.center_freq2 == cf2) { +- iface->cac_started = 0; +- if (!iface->block_tx) { +- printf("CAC hostapd_setup_interface_complete\n"); +- hostapd_setup_interface_complete(iface, 0); +- } ++ freq_params.freq == freq && ++ freq_params.bandwidth == chan_width_enum_to_freq(chan_width) && ++ freq_params.center_freq1 == cf1 && ++ freq_params.center_freq2 == cf2) { ++ iface->cac_started = 0; ++ if (!iface->block_tx) { ++ int res; ++ size_t tmp_terminate_on_error = iface->interfaces->terminate_on_error; ++ /* Implemented to catch one known rare racing, when radar detected immediately ++ * after CAC Finished. (beacon set failed) In this case try to restart iface internally */ ++ iface->interfaces->terminate_on_error = 0; ++ res = hostapd_setup_interface_complete(iface, 0); ++ iface->interfaces->terminate_on_error = tmp_terminate_on_error; ++ if (res) ++ hostapd_cac_finish_iface_restart(iface); ++ ++ } + } + } + } +-- +2.10.1 + diff --git a/hostapd_wave/patches/0414-WLANRTSYS-6509.patch b/hostapd_wave/patches/0414-WLANRTSYS-6509.patch new file mode 100644 index 0000000000000000000000000000000000000000..2cb4aa508ece67b40debac04cfcb66d6ce256f4e --- /dev/null +++ b/hostapd_wave/patches/0414-WLANRTSYS-6509.patch @@ -0,0 +1,33 @@ +From fb0a8d26944e090f188bf8487f89e1bc73039c71 Mon Sep 17 00:00:00 2001 +From: pukitis <martins.pukitis@intel.com> +Date: Tue, 27 Nov 2018 15:27:00 +0200 +Subject: [PATCH] WLANRTSYS-6509 + +--- + src/ap/hostapd.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c +index c2d00d8..4d85978 100644 +--- a/src/ap/hostapd.c ++++ b/src/ap/hostapd.c +@@ -1137,8 +1137,6 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first) + } + #endif /* CONFIG_NO_RADIUS */ + +- dl_list_init(&hapd->multi_ap_blacklist); +- + if (hostapd_acl_init(hapd)) { + wpa_printf(MSG_ERROR, "ACL initialization failed."); + return -1; +@@ -2198,6 +2196,7 @@ hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface, + hapd->ctrl_sock = -1; + dl_list_init(&hapd->ctrl_dst); + dl_list_init(&hapd->nr_db); ++ dl_list_init(&hapd->multi_ap_blacklist); + + return hapd; + } +-- +2.10.1 + diff --git a/hostapd_wave/patches/0415-hostapd-remove-csa-to-40-intoler-sta.patch b/hostapd_wave/patches/0415-hostapd-remove-csa-to-40-intoler-sta.patch new file mode 100644 index 0000000000000000000000000000000000000000..4556913583627cbf5d95ed3a9a3cb9ea31a2c2b1 --- /dev/null +++ b/hostapd_wave/patches/0415-hostapd-remove-csa-to-40-intoler-sta.patch @@ -0,0 +1,395 @@ +From 07c06b460a9ee9d03f54b5fd67f9f1b8a007da3b Mon Sep 17 00:00:00 2001 +From: Gal Savion <Gal.Savion@intel.com> +Date: Wed, 12 Dec 2018 13:38:19 +0200 +Subject: [PATCH] hostapd-remove-csa-to-40-intoler-sta + +--- + src/ap/acs.c | 26 +------- + src/ap/acs.h | 2 - + src/ap/hostapd.c | 2 - + src/ap/hostapd.h | 1 - + src/ap/hw_features.c | 7 --- + src/ap/ieee802_11.h | 3 - + src/ap/ieee802_11_ht.c | 166 ++++--------------------------------------------- + src/drivers/driver.h | 2 - + 8 files changed, 14 insertions(+), 195 deletions(-) + +diff --git a/src/ap/acs.c b/src/ap/acs.c +index c0e4212..4cf0567 100644 +--- a/src/ap/acs.c ++++ b/src/ap/acs.c +@@ -2500,11 +2500,9 @@ void acs_print_info_legend(FILE *fp) + + const char *sw_reasons[] = { + "initial scan", +- "intolerant", + "radar", + "background scan", + "periodic update", +- "intolerant expired" + }; + + +@@ -2535,7 +2533,7 @@ int acs_set_new_chan_if_ok(struct hostapd_iface *iface, int min_rank_cand_idx, i + /* got previous, now check threshold */ + if ((mode->selected_candidate < 0) || /* if previously selected candidate is not known - switch */ + (mode->candidates[min_rank_cand_idx].width > actual_width) || /* If previously selected candidates width is less */ +- (switch_reason == SWR_INTOLERANT) || (switch_reason == SWR_RADAR) || (switch_reason == SWR_INITIAL) || /* in these cases, switch regardless of threshold */ ++ (switch_reason == SWR_RADAR) || (switch_reason == SWR_INITIAL) || /* in these cases, switch regardless of threshold */ + (mode->candidates[mode->selected_candidate].rank == -1) || /* If previously selected candidates rank is now invalid, switch regardless of threshold*/ + ((mode->selected_candidate != min_rank_cand_idx) && + (mode->candidates[min_rank_cand_idx].rank < mode->candidates[mode->selected_candidate].rank * (100 - iface->conf->acs_switch_thresh) / 100))) +@@ -3152,28 +3150,6 @@ void acs_update_intolerant_channels(struct hostapd_iface *iface, u8 chan) + } + } + +-void acs_switch_intolerant(struct hostapd_iface *iface) +-{ +- if (acs_recalc_ranks_and_set_chan(iface, SWR_INTOLERANT)) +- acs_do_switch_channel(iface, 1); +- else +- wpa_printf(MSG_ERROR, "Must switch, intolerant !"); +-} +- +-void acs_switch_intolerant_expired(struct hostapd_iface *iface) +-{ +- int res; +- +- res = acs_recalc_ranks_and_set_chan(iface, SWR_INTOLERANT_EXPIRED); +- if (res == TRUE) { +- if (acs_do_switch_channel(iface, 0) == TRUE && !iface->conf->secondary_channel) +- /* reschedule timer if we didn't switch to 40 MHz bandwidth */ +- hostapd_restart_ap_ht2040_timer(iface); +- } else +- /* reschedule timer if we didn't switch at all */ +- hostapd_restart_ap_ht2040_timer(iface); +-} +- + void acs_update_radar(struct hostapd_iface *iface) + { + struct hostapd_hw_modes *mode = iface->current_mode; +diff --git a/src/ap/acs.h b/src/ap/acs.h +index a47b4aa..9b75676 100644 +--- a/src/ap/acs.h ++++ b/src/ap/acs.h +@@ -15,8 +15,6 @@ + enum hostapd_chan_status acs_init(struct hostapd_iface *iface); + int acs_recalc_ranks_and_set_chan(struct hostapd_iface *iface, int switch_reason); + void acs_update_intolerant_channels(struct hostapd_iface *iface, u8 chan); +-void acs_switch_intolerant(struct hostapd_iface *iface); +-void acs_switch_intolerant_expired(struct hostapd_iface *iface); + void acs_update_radar(struct hostapd_iface *iface); + void acs_radar_switch(struct hostapd_iface *iface); + int acs_do_switch_channel(struct hostapd_iface *iface, int block_tx); +diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c +index c2d00d8..220218a 100644 +--- a/src/ap/hostapd.c ++++ b/src/ap/hostapd.c +@@ -3230,8 +3230,6 @@ const char * hostapd_channel_switch_text(enum hostapd_channel_switch_reason s) + return "UNKNOWN"; + case HAPD_CHAN_SWITCH_RADAR_DETECTED: + return "RADAR"; +- case HAPD_CHAN_SWITCH_20_40_COEX: +- return "20/40_COEXISTANCE"; + } + + return "UNKNOWN"; +diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h +index 74d01b2..651b269 100644 +--- a/src/ap/hostapd.h ++++ b/src/ap/hostapd.h +@@ -502,7 +502,6 @@ struct hostapd_iface { + enum hostapd_channel_switch_reason { + HAPD_CHAN_SWITCH_OTHER, + HAPD_CHAN_SWITCH_RADAR_DETECTED, +- HAPD_CHAN_SWITCH_20_40_COEX + } chan_switch_reason; + struct hostapd_failsafe_freq_params failsafe; + +diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c +index e6cbe30..5a546db 100644 +--- a/src/ap/hw_features.c ++++ b/src/ap/hw_features.c +@@ -568,13 +568,6 @@ static void ieee80211n_check_scan(struct hostapd_iface *iface) + + iface->secondary_ch = iface->conf->secondary_channel; + if (!oper40) { +-#ifdef CONFIG_ACS +- if ((iface->conf->acs_algo == ACS_ALGO_SMART) && iface->conf->acs_init_done) { +- acs_update_intolerant_channels(iface, iface->conf->channel); +- acs_switch_intolerant(iface); +- return; +- } +-#endif + wpa_printf(MSG_INFO, "20/40 MHz operation not permitted on " + "channel pri=%d sec=%d based on overlapping BSSes", + iface->conf->channel, +diff --git a/src/ap/ieee802_11.h b/src/ap/ieee802_11.h +index 69dcd27..985ddc9 100644 +--- a/src/ap/ieee802_11.h ++++ b/src/ap/ieee802_11.h +@@ -148,9 +148,6 @@ u8 * hostapd_eid_multi_ap(struct hostapd_data *hapd, u8 *eid, size_t len); + void ap_copy_sta_supp_op_classes(struct sta_info *sta, + const u8 *supp_op_classes, + size_t supp_op_classes_len); +-#ifdef CONFIG_ACS +-void hostapd_restart_ap_ht2040_timer(struct hostapd_iface *iface); +-#endif + + void ieee802_11_check_4addr_sta_elems(struct ieee802_11_elems *elems, struct sta_info *sta); + +diff --git a/src/ap/ieee802_11_ht.c b/src/ap/ieee802_11_ht.c +index 1f8e26c..f00934f 100644 +--- a/src/ap/ieee802_11_ht.c ++++ b/src/ap/ieee802_11_ht.c +@@ -24,8 +24,6 @@ + #include "acs.h" + + +-static void hostapd_switch_csa(struct hostapd_iface *iface); +- + /* special case for ASSOC RESP: + mask out RX MCS Set as a workoaround for some STA vendors*/ + u8 * hostapd_eid_ht_capabilities_assoc_resp(struct hostapd_data *hapd, u8 *eid, +@@ -291,20 +289,6 @@ static int is_40_allowed(struct hostapd_iface *iface, int channel) + } + + +-#ifdef CONFIG_ACS +-void hostapd_restart_ap_ht2040_timer(struct hostapd_iface *iface) +-{ +- if (!iface->num_sta_ht40_intolerant) { +- unsigned int delay_time; +- delay_time = OVERLAPPING_BSS_TRANS_DELAY_FACTOR * +- iface->conf->obss_interval; +- eloop_cancel_timeout(ap_ht2040_timeout, iface, NULL); +- eloop_register_timeout(delay_time, 0, ap_ht2040_timeout, iface, NULL); +- } +-} +-#endif +- +- + void hostapd_2040_coex_action(struct hostapd_data *hapd, + const struct ieee80211_mgmt *mgmt, size_t len) + { +@@ -380,8 +364,8 @@ void hostapd_2040_coex_action(struct hostapd_data *hapd, + u8 chan = ic_report->variable[i]; + + #ifdef CONFIG_ACS +- if ((iface->conf->acs_algo == ACS_ALGO_SMART) && iface->conf->acs_init_done) +- acs_update_intolerant_channels(iface, chan); ++ if ((iface->conf->acs_algo == ACS_ALGO_SMART) && iface->conf->acs_init_done) ++ acs_update_intolerant_channels(iface, chan); + #endif + if (is_40_allowed(iface, chan)) + continue; +@@ -398,24 +382,12 @@ void hostapd_2040_coex_action(struct hostapd_data *hapd, + + if (!is_ht40_allowed && + (iface->drv_flags & WPA_DRIVER_FLAGS_HT_2040_COEX)) { +-#ifdef CONFIG_ACS +- if ((iface->conf->acs_algo == ACS_ALGO_SMART) && iface->conf->acs_init_done) { +- acs_update_intolerant_channels(iface, iface->conf->channel); +- acs_switch_intolerant(iface); +- if (iface->conf->obss_interval && !iface->conf->secondary_channel) +- /* If switched to 20 MHz channel, restart timer */ +- hostapd_restart_ap_ht2040_timer(iface); +- return; +- } +-#endif + if (iface->conf->secondary_channel) { + hostapd_logger(hapd, mgmt->sa, + HOSTAPD_MODULE_IEEE80211, + HOSTAPD_LEVEL_INFO, + "Switching to 20 MHz operation"); + iface->conf->secondary_channel = 0; +- +- iface->chan_switch_reason = HAPD_CHAN_SWITCH_20_40_COEX; + ieee802_11_set_beacons(iface); + } + if (!iface->num_sta_ht40_intolerant && +@@ -439,53 +411,12 @@ static void hostapd_switch_to_20mhz(struct hostapd_data *hapd, + { + if (iface->drv_flags & WPA_DRIVER_FLAGS_HT_2040_COEX) { + if (iface->conf->secondary_channel) { +- struct csa_settings csa_settings; +- unsigned int i; +- int err = 1; +- + hostapd_logger(hapd, mgmt->sa, +- HOSTAPD_MODULE_IEEE80211, +- HOSTAPD_LEVEL_INFO, +- "Switching to 20 MHz operation due to OBSS beacon reception at rssi %d", signal); ++ HOSTAPD_MODULE_IEEE80211, ++ HOSTAPD_LEVEL_INFO, ++ "Switching to 20 MHz operation due to OBSS beacon reception at rssi %d", signal); + iface->conf->secondary_channel = 0; +- +- /* Check if CSA in progress */ +- if (hostapd_csa_in_progress(iface)) { +- wpa_printf(MSG_DEBUG, "will NOT switch to a new channel - CSA already in progress"); +- return; +- } +- +- /* Check if active CAC */ +- if (iface->cac_started) return; +- +- /* Setup CSA request */ +- os_memset(&csa_settings, 0, sizeof(csa_settings)); +- csa_settings.cs_count = 5; +- csa_settings.block_tx = 0; +- +- err = hostapd_set_freq_params(&csa_settings.freq_params, +- iface->conf->hw_mode, +- acs_chan_to_freq(iface->conf->channel), +- iface->conf->channel, +- iface->conf->ieee80211n, +- iface->conf->ieee80211ac, +- iface->conf->secondary_channel, +- iface->conf->vht_oper_chwidth, +- iface->conf->vht_oper_centr_freq_seg0_idx, +- iface->conf->vht_oper_centr_freq_seg1_idx, +- iface->current_mode->vht_capab); +- +- if (err) { +- wpa_printf(MSG_ERROR, "failed to calculate CSA freq params"); +- /* possibly recover actual iface params */ +- hostapd_disable_iface(iface); +- return; +- } +- +- for (i = 0; i < iface->num_bss; i++) { +- err = hostapd_switch_channel(iface->bss[i], &csa_settings); +- if (err) return; +- } ++ ieee802_11_set_beacons(iface); + } + + if (!iface->num_sta_ht40_intolerant) { +@@ -522,18 +453,10 @@ void hostapd_obss_beacon(struct hostapd_data *hapd, + if (le_to_host16(ht_cap->ht_capabilities_info) & + HT_CAP_INFO_40MHZ_INTOLERANT) { + #ifdef CONFIG_ACS +- if ((iface->conf->acs_algo == ACS_ALGO_SMART) && iface->conf->acs_init_done) { +- acs_update_intolerant_channels(iface, iface->conf->channel); +- if (iface->conf->secondary_channel) { +- acs_switch_intolerant(iface); +- if (!iface->conf->secondary_channel) +- /* If switched to 20 MHz channel, restart timer */ +- hostapd_restart_ap_ht2040_timer(iface); +- } +- } +- else ++ if ((iface->conf->acs_algo == ACS_ALGO_SMART) && iface->conf->acs_init_done) ++ acs_update_intolerant_channels(iface, iface->conf->channel); + #endif +- hostapd_switch_to_20mhz(hapd, iface, mgmt, rssi_level); ++ hostapd_switch_to_20mhz(hapd, iface, mgmt, rssi_level); + } + } + } +@@ -590,18 +513,10 @@ void ht40_intolerant_add(struct hostapd_iface *iface, struct sta_info *sta) + iface->num_sta_ht40_intolerant++; + eloop_cancel_timeout(ap_ht2040_timeout, iface, NULL); + +-#ifdef CONFIG_ACS +- if ((iface->conf->acs_algo == ACS_ALGO_SMART) && iface->conf->acs_init_done) { +- acs_update_intolerant_channels(iface, iface->conf->channel); +- acs_switch_intolerant(iface); +- return; +- } +-#endif +- + if (iface->conf->secondary_channel && + (iface->drv_flags & WPA_DRIVER_FLAGS_HT_2040_COEX)) { + iface->conf->secondary_channel = 0; +- hostapd_switch_csa(iface); ++ ieee802_11_set_beacons(iface); + } + } + +@@ -736,62 +651,7 @@ void ap_ht2040_timeout(void *eloop_data, void *user_data) + { + struct hostapd_iface *iface = eloop_data; + +-#ifdef CONFIG_ACS +- if ((iface->conf->acs_algo == ACS_ALGO_SMART) && iface->conf->acs_init_done) { +- acs_switch_intolerant_expired(iface); +- } else +-#endif +- { +- wpa_printf(MSG_INFO, "Switching to 40 MHz operation"); +- +- iface->conf->secondary_channel = iface->secondary_ch; +- +- iface->chan_switch_reason = HAPD_CHAN_SWITCH_20_40_COEX; +- hostapd_switch_csa(iface); +- } +-} +- +-static void hostapd_switch_csa(struct hostapd_iface *iface) +-{ +- struct csa_settings csa_settings; +- unsigned int i; +- int err = 1; +- +- /* Check if CSA in progress */ +- if (hostapd_csa_in_progress(iface)) { +- wpa_printf(MSG_DEBUG, "will NOT switch to a new channel - CSA already in progress"); +- return; +- } +- +- /* Check if active CAC */ +- if (iface->cac_started) return; +- +- /* Setup CSA request */ +- os_memset(&csa_settings, 0, sizeof(csa_settings)); +- csa_settings.cs_count = 5; +- csa_settings.block_tx = 0; +- +- err = hostapd_set_freq_params(&csa_settings.freq_params, +- iface->conf->hw_mode, +- acs_chan_to_freq(iface->conf->channel), +- iface->conf->channel, +- iface->conf->ieee80211n, +- iface->conf->ieee80211ac, +- iface->conf->secondary_channel, +- iface->conf->vht_oper_chwidth, +- iface->conf->vht_oper_centr_freq_seg0_idx, +- iface->conf->vht_oper_centr_freq_seg1_idx, +- iface->current_mode->vht_capab); +- +- if (err) { +- wpa_printf(MSG_ERROR, "failed to calculate CSA freq params"); +- /* possibly recover actual iface params */ +- hostapd_disable_iface(iface); +- return; +- } +- +- for (i = 0; i < iface->num_bss; i++) { +- err = hostapd_switch_channel(iface->bss[i], &csa_settings); +- if (err) return; +- } ++ wpa_printf(MSG_INFO, "Switching to 40 MHz operation"); ++ iface->conf->secondary_channel = iface->secondary_ch; ++ ieee802_11_set_beacons(iface); + } +diff --git a/src/drivers/driver.h b/src/drivers/driver.h +index 301e706..0de8f93 100644 +--- a/src/drivers/driver.h ++++ b/src/drivers/driver.h +@@ -284,11 +284,9 @@ enum { + + enum { + SWR_INITIAL, +- SWR_INTOLERANT, + SWR_RADAR, + SWR_BG_SCAN, + SWR_UPDATE, +- SWR_INTOLERANT_EXPIRED, + SWR_LAST + }; + +-- +2.10.1 + diff --git a/hostapd_wave/patches/0416-hostapd-owl-configurable.patch b/hostapd_wave/patches/0416-hostapd-owl-configurable.patch new file mode 100644 index 0000000000000000000000000000000000000000..4ed20cfec259b00b4cb0ccc35a889826738efc95 --- /dev/null +++ b/hostapd_wave/patches/0416-hostapd-owl-configurable.patch @@ -0,0 +1,54 @@ +From 14c8bbecdb879af47e4f667657a381e44db543c2 Mon Sep 17 00:00:00 2001 +From: vulsmike <mikelis.vuls@intel.coim> +Date: Mon, 18 Feb 2019 12:45:17 +0200 +Subject: [PATCH] hostapd-owl-configurable + +--- + hostapd/config_file.c | 3 +++ + src/ap/ap_config.h | 1 + + src/ap/beacon.c | 3 ++- + 3 files changed, 6 insertions(+), 1 deletion(-) + +diff --git a/hostapd/config_file.c b/hostapd/config_file.c +index 57eb6d4..2074261 100644 +--- a/hostapd/config_file.c ++++ b/hostapd/config_file.c +@@ -3259,6 +3259,9 @@ static int hostapd_config_fill(struct hostapd_config *conf, + } + } + bss->mesh_mode = val; ++ } ++ else if (os_strcmp(buf, "owl") == 0) { ++ conf->owl = atoi(pos); + #ifdef CONFIG_IEEE80211W + } else if (os_strcmp(buf, "ieee80211w") == 0) { + bss->ieee80211w = atoi(pos); +diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h +index 3af7b03..9dadfbf 100644 +--- a/src/ap/ap_config.h ++++ b/src/ap/ap_config.h +@@ -795,6 +795,7 @@ struct hostapd_config { + + char *atf_config_file; /* Air Time Fairness configuration filename */ + struct atf_config atf_cfg; /* Air Time Fairness configuration */ ++ u8 owl; /* Forwarding incoming probe reqests to upper layers */ + }; + + #ifdef CONFIG_ACS +diff --git a/src/ap/beacon.c b/src/ap/beacon.c +index 5f5253e..1e6579c 100644 +--- a/src/ap/beacon.c ++++ b/src/ap/beacon.c +@@ -729,7 +729,8 @@ void handle_probe_req(struct hostapd_data *hapd, + if (len < IEEE80211_HDRLEN) + return; + +- _notify_probe_req(hapd, (const u8 *)mgmt, len); ++ if (hapd->iconf->owl) ++ _notify_probe_req(hapd, (const u8 *)mgmt, len); + + ie = ((const u8 *) mgmt) + IEEE80211_HDRLEN; + if (hapd->iconf->track_sta_max_num) +-- +2.10.1 + diff --git a/hostapd_wave/patches/0417-rebased-v2.6-0001-WPA-Ignore-unauthenticated-encrypted-EAPOL-Key-data.patch b/hostapd_wave/patches/0417-rebased-v2.6-0001-WPA-Ignore-unauthenticated-encrypted-EAPOL-Key-data.patch new file mode 100644 index 0000000000000000000000000000000000000000..a62b52c6b9a83576a52943b08c50fa86eb146df6 --- /dev/null +++ b/hostapd_wave/patches/0417-rebased-v2.6-0001-WPA-Ignore-unauthenticated-encrypted-EAPOL-Key-data.patch @@ -0,0 +1,44 @@ +From 3e34cfdff6b192fe337c6fb3f487f73e96582961 Mon Sep 17 00:00:00 2001 +From: Mathy Vanhoef <Mathy.Vanhoef@cs.kuleuven.be> +Date: Sun, 15 Jul 2018 01:25:53 +0200 +Subject: [PATCH] WPA: Ignore unauthenticated encrypted EAPOL-Key data + +Ignore unauthenticated encrypted EAPOL-Key data in supplicant +processing. When using WPA2, these are frames that have the Encrypted +flag set, but not the MIC flag. + +When using WPA2, EAPOL-Key frames that had the Encrypted flag set but +not the MIC flag, had their data field decrypted without first verifying +the MIC. In case the data field was encrypted using RC4 (i.e., when +negotiating TKIP as the pairwise cipher), this meant that +unauthenticated but decrypted data would then be processed. An adversary +could abuse this as a decryption oracle to recover sensitive information +in the data field of EAPOL-Key messages (e.g., the group key). +(CVE-2018-14526) + +Signed-off-by: Mathy Vanhoef <Mathy.Vanhoef@cs.kuleuven.be> +--- + src/rsn_supp/wpa.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff -upr wpa_supplicant-2.6.orig/src/rsn_supp/wpa.c wpa_supplicant-2.6/src/rsn_supp/wpa.c +--- wpa_supplicant-2.6.orig/src/rsn_supp/wpa.c 2016-10-02 21:51:11.000000000 +0300 ++++ wpa_supplicant-2.6/src/rsn_supp/wpa.c 2018-08-08 16:55:11.506831029 +0300 +@@ -2016,6 +2016,17 @@ int wpa_sm_rx_eapol(struct wpa_sm *sm, c + + if ((sm->proto == WPA_PROTO_RSN || sm->proto == WPA_PROTO_OSEN) && + (key_info & WPA_KEY_INFO_ENCR_KEY_DATA)) { ++ /* ++ * Only decrypt the Key Data field if the frame's authenticity ++ * was verified. When using AES-SIV (FILS), the MIC flag is not ++ * set, so this check should only be performed if mic_len != 0 ++ * which is the case in this code branch. ++ */ ++ if (!(key_info & WPA_KEY_INFO_MIC)) { ++ wpa_msg(sm->ctx->msg_ctx, MSG_WARNING, ++ "WPA: Ignore EAPOL-Key with encrypted but unauthenticated data"); ++ goto out; ++ } + if (wpa_supplicant_decrypt_key_data(sm, key, ver, key_data, + &key_data_len)) + goto out; diff --git a/hostapd_wave/patches/0418-hostapd-atf-unauthorized-sta-fix.patch b/hostapd_wave/patches/0418-hostapd-atf-unauthorized-sta-fix.patch new file mode 100644 index 0000000000000000000000000000000000000000..31391f383faf3d37704d32fdf8e8f6a414983cf1 --- /dev/null +++ b/hostapd_wave/patches/0418-hostapd-atf-unauthorized-sta-fix.patch @@ -0,0 +1,28 @@ +From 8ca083bd42270e8083493082cd7d73b990a65dc2 Mon Sep 17 00:00:00 2001 +From: vulsmike <mikelis.vuls@intel.coim> +Date: Mon, 4 Mar 2019 16:20:44 +0200 +Subject: [PATCH] hostapd-atf-unauthorized-sta-fix + +--- + src/ap/atf.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/src/ap/atf.c b/src/ap/atf.c +index 7ede0e0..c9131cc 100644 +--- a/src/ap/atf.c ++++ b/src/ap/atf.c +@@ -355,9 +355,8 @@ static int update_atf_active_status_for_station (struct sta_info* sta, + + if ((sta_has_quota[idx] & bit) == 0) { + /* STA does not have ATF quota yet. Shall we give it?*/ +- /* Give quota if STA is in Driver and it has an 'authorized' flag. */ +- if ((sta_in_driver[idx] & bit) != 0 && +- (sta->flags & WLAN_STA_AUTHORIZED) != 0) { ++ /* Give quota if STA is in Driver */ ++ if ((sta_in_driver[idx] & bit) != 0) { + sta_has_quota[idx] |= bit; + return 1; /* Station changed its status */ + } +-- +2.10.1 +