hostapd: add patch for setting 4addr mode in multi_ap
This patch is required to be able to roam from one backhaul AP to another one in the same ESS. Signed-off-by: Daniel Golle <daniel@makrotopia.org> (daniel@makrotopia.org: PKG_REVISION bump and refreshed patches) Signed-off-by: Raphaël Mélotte <raphael.melotte@mind.be>
This commit is contained in:
		 Raphaël Mélotte
					Raphaël Mélotte
				
			
				
					committed by
					
						 Daniel Golle
						Daniel Golle
					
				
			
			
				
	
			
			
			 Daniel Golle
						Daniel Golle
					
				
			
						parent
						
							048131ba3a
						
					
				
				
					commit
					68073e2d46
				
			| @@ -7,7 +7,7 @@ | |||||||
| include $(TOPDIR)/rules.mk | include $(TOPDIR)/rules.mk | ||||||
|  |  | ||||||
| PKG_NAME:=hostapd | PKG_NAME:=hostapd | ||||||
| PKG_RELEASE:=30 | PKG_RELEASE:=31 | ||||||
|  |  | ||||||
| PKG_SOURCE_URL:=http://w1.fi/hostap.git | PKG_SOURCE_URL:=http://w1.fi/hostap.git | ||||||
| PKG_SOURCE_PROTO:=git | PKG_SOURCE_PROTO:=git | ||||||
|   | |||||||
| @@ -26,24 +26,20 @@ Signed-off-by: Raphaël Mélotte <raphael.melotte@mind.be> | |||||||
|  src/common/wpa_ctrl.h |  3 +++ |  src/common/wpa_ctrl.h |  3 +++ | ||||||
|  5 files changed, 36 insertions(+) |  5 files changed, 36 insertions(+) | ||||||
|  |  | ||||||
| diff --git a/hostapd/config_file.c b/hostapd/config_file.c |  | ||||||
| index e09e6e141..6b88ecd17 100644 |  | ||||||
| --- a/hostapd/config_file.c | --- a/hostapd/config_file.c | ||||||
| +++ b/hostapd/config_file.c | +++ b/hostapd/config_file.c | ||||||
| @@ -4323,6 +4323,8 @@ static int hostapd_config_fill(struct hostapd_config *conf, | @@ -4456,6 +4456,8 @@ static int hostapd_config_fill(struct ho | ||||||
|  		bss->multicast_to_unicast = atoi(pos); |  		bss->multicast_to_unicast = atoi(pos); | ||||||
|  	} else if (os_strcmp(buf, "broadcast_deauth") == 0) { |  	} else if (os_strcmp(buf, "broadcast_deauth") == 0) { | ||||||
|  		bss->broadcast_deauth = atoi(pos); |  		bss->broadcast_deauth = atoi(pos); | ||||||
| +	} else if (os_strcmp(buf, "notify_mgmt_frames") == 0) { | +	} else if (os_strcmp(buf, "notify_mgmt_frames") == 0) { | ||||||
| +		conf->notify_mgmt_frames = atoi(pos); | +		conf->notify_mgmt_frames = atoi(pos); | ||||||
|  #ifdef CONFIG_DPP |  #ifdef CONFIG_DPP | ||||||
|  	} else if (os_strcmp(buf, "dpp_connector") == 0) { |  	} else if (os_strcmp(buf, "dpp_name") == 0) { | ||||||
|  		os_free(bss->dpp_connector); |  		os_free(bss->dpp_name); | ||||||
| diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf |  | ||||||
| index ce3ecdddf..28dcd4f57 100644 |  | ||||||
| --- a/hostapd/hostapd.conf | --- a/hostapd/hostapd.conf | ||||||
| +++ b/hostapd/hostapd.conf | +++ b/hostapd/hostapd.conf | ||||||
| @@ -550,6 +550,10 @@ wmm_ac_vo_acm=0 | @@ -571,6 +571,10 @@ wmm_ac_vo_acm=0 | ||||||
|  # Default: 1 (enabled) |  # Default: 1 (enabled) | ||||||
|  #broadcast_deauth=1 |  #broadcast_deauth=1 | ||||||
|   |   | ||||||
| @@ -54,11 +50,9 @@ index ce3ecdddf..28dcd4f57 100644 | |||||||
|  ##### IEEE 802.11n related configuration ###################################### |  ##### IEEE 802.11n related configuration ###################################### | ||||||
|   |   | ||||||
|  # ieee80211n: Whether IEEE 802.11n (HT) is enabled |  # ieee80211n: Whether IEEE 802.11n (HT) is enabled | ||||||
| diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h |  | ||||||
| index ea581a822..2f89d6ab9 100644 |  | ||||||
| --- a/src/ap/ap_config.h | --- a/src/ap/ap_config.h | ||||||
| +++ b/src/ap/ap_config.h | +++ b/src/ap/ap_config.h | ||||||
| @@ -1008,6 +1008,8 @@ struct hostapd_config { | @@ -1060,6 +1060,8 @@ struct hostapd_config { | ||||||
|  	unsigned int airtime_update_interval; |  	unsigned int airtime_update_interval; | ||||||
|  #define AIRTIME_MODE_MAX (__AIRTIME_MODE_MAX - 1) |  #define AIRTIME_MODE_MAX (__AIRTIME_MODE_MAX - 1) | ||||||
|  #endif /* CONFIG_AIRTIME_POLICY */ |  #endif /* CONFIG_AIRTIME_POLICY */ | ||||||
| @@ -67,11 +61,9 @@ index ea581a822..2f89d6ab9 100644 | |||||||
|  }; |  }; | ||||||
|   |   | ||||||
|   |   | ||||||
| diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c |  | ||||||
| index c85a28db4..fc1291024 100644 |  | ||||||
| --- a/src/ap/ieee802_11.c | --- a/src/ap/ieee802_11.c | ||||||
| +++ b/src/ap/ieee802_11.c | +++ b/src/ap/ieee802_11.c | ||||||
| @@ -4591,6 +4591,28 @@ static int handle_action(struct hostapd_data *hapd, | @@ -4878,6 +4878,28 @@ static int handle_action(struct hostapd_ | ||||||
|  	return 1; |  	return 1; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -100,7 +92,7 @@ index c85a28db4..fc1291024 100644 | |||||||
|   |   | ||||||
|  /** |  /** | ||||||
|   * ieee802_11_mgmt - process incoming IEEE 802.11 management frames |   * ieee802_11_mgmt - process incoming IEEE 802.11 management frames | ||||||
| @@ -4665,6 +4687,9 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, | @@ -4969,6 +4991,9 @@ int ieee802_11_mgmt(struct hostapd_data | ||||||
|  	if (hapd->iconf->track_sta_max_num) |  	if (hapd->iconf->track_sta_max_num) | ||||||
|  		sta_track_add(hapd->iface, mgmt->sa, ssi_signal); |  		sta_track_add(hapd->iface, mgmt->sa, ssi_signal); | ||||||
|   |   | ||||||
| @@ -110,13 +102,11 @@ index c85a28db4..fc1291024 100644 | |||||||
|  	switch (stype) { |  	switch (stype) { | ||||||
|  	case WLAN_FC_STYPE_AUTH: |  	case WLAN_FC_STYPE_AUTH: | ||||||
|  		wpa_printf(MSG_DEBUG, "mgmt::auth"); |  		wpa_printf(MSG_DEBUG, "mgmt::auth"); | ||||||
| diff --git a/src/common/wpa_ctrl.h b/src/common/wpa_ctrl.h |  | ||||||
| index b24ae63e5..eeff9fcaa 100644 |  | ||||||
| --- a/src/common/wpa_ctrl.h | --- a/src/common/wpa_ctrl.h | ||||||
| +++ b/src/common/wpa_ctrl.h | +++ b/src/common/wpa_ctrl.h | ||||||
| @@ -375,6 +375,9 @@ extern "C" { | @@ -396,6 +396,9 @@ extern "C" { | ||||||
|  #define WDS_STA_INTERFACE_ADDED "WDS-STA-INTERFACE-ADDED " |  #define BIT(x) (1U << (x)) | ||||||
|  #define WDS_STA_INTERFACE_REMOVED "WDS-STA-INTERFACE-REMOVED " |  #endif | ||||||
|   |   | ||||||
| +/* Event triggered for received management frame */ | +/* Event triggered for received management frame */ | ||||||
| +#define AP_MGMT_FRAME_RECEIVED "AP-MGMT-FRAME-RECEIVED " | +#define AP_MGMT_FRAME_RECEIVED "AP-MGMT-FRAME-RECEIVED " | ||||||
| @@ -124,6 +114,3 @@ index b24ae63e5..eeff9fcaa 100644 | |||||||
|  /* BSS command information masks */ |  /* BSS command information masks */ | ||||||
|   |   | ||||||
|  #define WPA_BSS_MASK_ALL		0xFFFDFFFF |  #define WPA_BSS_MASK_ALL		0xFFFDFFFF | ||||||
| --  |  | ||||||
| 2.28.0 |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,11 +19,9 @@ Signed-off-by: Raphaël Mélotte <raphael.melotte@mind.be> | |||||||
|  src/wps/wps_registrar.c | 29 ++++++++++++++ |  src/wps/wps_registrar.c | 29 ++++++++++++++ | ||||||
|  3 files changed, 118 insertions(+), 3 deletions(-) |  3 files changed, 118 insertions(+), 3 deletions(-) | ||||||
|  |  | ||||||
| diff --git a/src/ap/wps_hostapd.c b/src/ap/wps_hostapd.c |  | ||||||
| index dc8aa8f65..ff942a67b 100644 |  | ||||||
| --- a/src/ap/wps_hostapd.c | --- a/src/ap/wps_hostapd.c | ||||||
| +++ b/src/ap/wps_hostapd.c | +++ b/src/ap/wps_hostapd.c | ||||||
| @@ -1375,6 +1375,43 @@ static void hostapd_wps_nfc_clear(struct wps_context *wps) | @@ -1375,6 +1375,43 @@ static void hostapd_wps_nfc_clear(struct | ||||||
|  #endif /* CONFIG_WPS_NFC */ |  #endif /* CONFIG_WPS_NFC */ | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -67,7 +65,7 @@ index dc8aa8f65..ff942a67b 100644 | |||||||
|   |   | ||||||
|  void hostapd_deinit_wps(struct hostapd_data *hapd) |  void hostapd_deinit_wps(struct hostapd_data *hapd) | ||||||
|  { |  { | ||||||
| @@ -1409,11 +1446,54 @@ void hostapd_update_wps(struct hostapd_data *hapd) | @@ -1409,11 +1446,54 @@ void hostapd_update_wps(struct hostapd_d | ||||||
|  	hapd->wps->upc = hapd->conf->upc; |  	hapd->wps->upc = hapd->conf->upc; | ||||||
|  #endif /* CONFIG_WPS_UPNP */ |  #endif /* CONFIG_WPS_UPNP */ | ||||||
|   |   | ||||||
| @@ -125,11 +123,9 @@ index dc8aa8f65..ff942a67b 100644 | |||||||
|  	else |  	else | ||||||
|  		hostapd_deinit_wps(hapd); |  		hostapd_deinit_wps(hapd); | ||||||
|  } |  } | ||||||
| diff --git a/src/wps/wps.h b/src/wps/wps.h |  | ||||||
| index 93888b011..110e3ea52 100644 |  | ||||||
| --- a/src/wps/wps.h | --- a/src/wps/wps.h | ||||||
| +++ b/src/wps/wps.h | +++ b/src/wps/wps.h | ||||||
| @@ -938,6 +938,12 @@ struct wpabuf * wps_build_nfc_handover_sel_p2p(struct wps_context *ctx, | @@ -938,6 +938,12 @@ struct wpabuf * wps_build_nfc_handover_s | ||||||
|  					       struct wpabuf *nfc_dh_pubkey, |  					       struct wpabuf *nfc_dh_pubkey, | ||||||
|  					       struct wpabuf *nfc_dev_pw); |  					       struct wpabuf *nfc_dev_pw); | ||||||
|   |   | ||||||
| @@ -142,11 +138,9 @@ index 93888b011..110e3ea52 100644 | |||||||
|  /* ndef.c */ |  /* ndef.c */ | ||||||
|  struct wpabuf * ndef_parse_wifi(const struct wpabuf *buf); |  struct wpabuf * ndef_parse_wifi(const struct wpabuf *buf); | ||||||
|  struct wpabuf * ndef_build_wifi(const struct wpabuf *buf); |  struct wpabuf * ndef_build_wifi(const struct wpabuf *buf); | ||||||
| diff --git a/src/wps/wps_registrar.c b/src/wps/wps_registrar.c |  | ||||||
| index 9e1ee36da..d6b27be28 100644 |  | ||||||
| --- a/src/wps/wps_registrar.c | --- a/src/wps/wps_registrar.c | ||||||
| +++ b/src/wps/wps_registrar.c | +++ b/src/wps/wps_registrar.c | ||||||
| @@ -3669,6 +3669,35 @@ int wps_registrar_config_ap(struct wps_registrar *reg, | @@ -3669,6 +3669,35 @@ int wps_registrar_config_ap(struct wps_r | ||||||
|  } |  } | ||||||
|   |   | ||||||
|   |   | ||||||
| @@ -182,6 +176,3 @@ index 9e1ee36da..d6b27be28 100644 | |||||||
|  #ifdef CONFIG_WPS_NFC |  #ifdef CONFIG_WPS_NFC | ||||||
|   |   | ||||||
|  int wps_registrar_add_nfc_pw_token(struct wps_registrar *reg, |  int wps_registrar_add_nfc_pw_token(struct wps_registrar *reg, | ||||||
| --  |  | ||||||
| 2.29.2 |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -0,0 +1,37 @@ | |||||||
|  | From 8a4893dd06eb236460db4937f3c54e246739ad28 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Rapha=C3=ABl=20M=C3=A9lotte?= <raphael.melotte@mind.be> | ||||||
|  | Date: Wed, 3 Feb 2021 14:23:17 +0100 | ||||||
|  | Subject: [PATCH] wpa_supplicant: multi_ap: only enable 4addr mode if not | ||||||
|  |  already enabled | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  |  | ||||||
|  | If 4addr mode is already enabled, the call to enable it a second time | ||||||
|  | may fail. If this happens when roaming, it leads to deauthentication. | ||||||
|  |  | ||||||
|  | Signed-off-by: Raphaël Mélotte <raphael.melotte@mind.be> | ||||||
|  | --- | ||||||
|  |  wpa_supplicant/events.c | 10 ++++++---- | ||||||
|  |  1 file changed, 6 insertions(+), 4 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/wpa_supplicant/events.c | ||||||
|  | +++ b/wpa_supplicant/events.c | ||||||
|  | @@ -2589,11 +2589,13 @@ static void multi_ap_set_4addr_mode(stru | ||||||
|  |  		goto fail; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	if (wpa_drv_set_4addr_mode(wpa_s, 1) < 0) { | ||||||
|  | -		wpa_printf(MSG_ERROR, "Failed to set 4addr mode"); | ||||||
|  | -		goto fail; | ||||||
|  | +	if (wpa_s->enabled_4addr_mode == 0) { | ||||||
|  | +		if (wpa_drv_set_4addr_mode(wpa_s, 1) < 0) { | ||||||
|  | +			wpa_printf(MSG_ERROR, "Failed to set 4addr mode"); | ||||||
|  | +			goto fail; | ||||||
|  | +		} | ||||||
|  | +		wpa_s->enabled_4addr_mode = 1; | ||||||
|  |  	} | ||||||
|  | -	wpa_s->enabled_4addr_mode = 1; | ||||||
|  |  	return; | ||||||
|  |   | ||||||
|  |  fail: | ||||||
| @@ -231,7 +231,7 @@ | |||||||
|  	os_memset(&global, 0, sizeof(global)); |  	os_memset(&global, 0, sizeof(global)); | ||||||
| --- a/wpa_supplicant/events.c | --- a/wpa_supplicant/events.c | ||||||
| +++ b/wpa_supplicant/events.c | +++ b/wpa_supplicant/events.c | ||||||
| @@ -4579,8 +4579,8 @@ static void wpas_event_unprot_beacon(str | @@ -4581,8 +4581,8 @@ static void wpas_event_unprot_beacon(str | ||||||
|  } |  } | ||||||
|   |   | ||||||
|   |   | ||||||
| @@ -242,7 +242,7 @@ | |||||||
|  { |  { | ||||||
|  	struct wpa_supplicant *wpa_s = ctx; |  	struct wpa_supplicant *wpa_s = ctx; | ||||||
|  	int resched; |  	int resched; | ||||||
| @@ -5398,7 +5398,7 @@ void wpa_supplicant_event(void *ctx, enu | @@ -5400,7 +5400,7 @@ void wpa_supplicant_event(void *ctx, enu | ||||||
|  } |  } | ||||||
|   |   | ||||||
|   |   | ||||||
|   | |||||||
| @@ -274,7 +274,7 @@ | |||||||
|  	if (ieee802_11_build_ap_params(hapd, ¶ms) < 0) |  	if (ieee802_11_build_ap_params(hapd, ¶ms) < 0) | ||||||
| --- a/wpa_supplicant/events.c | --- a/wpa_supplicant/events.c | ||||||
| +++ b/wpa_supplicant/events.c | +++ b/wpa_supplicant/events.c | ||||||
| @@ -4579,6 +4579,60 @@ static void wpas_event_unprot_beacon(str | @@ -4581,6 +4581,60 @@ static void wpas_event_unprot_beacon(str | ||||||
|  } |  } | ||||||
|   |   | ||||||
|   |   | ||||||
| @@ -335,7 +335,7 @@ | |||||||
|  void supplicant_event(void *ctx, enum wpa_event_type event, |  void supplicant_event(void *ctx, enum wpa_event_type event, | ||||||
|  		      union wpa_event_data *data) |  		      union wpa_event_data *data) | ||||||
|  { |  { | ||||||
| @@ -4881,8 +4935,10 @@ void supplicant_event(void *ctx, enum wp | @@ -4883,8 +4937,10 @@ void supplicant_event(void *ctx, enum wp | ||||||
|  			channel_width_to_string(data->ch_switch.ch_width), |  			channel_width_to_string(data->ch_switch.ch_width), | ||||||
|  			data->ch_switch.cf1, |  			data->ch_switch.cf1, | ||||||
|  			data->ch_switch.cf2); |  			data->ch_switch.cf2); | ||||||
|   | |||||||
| @@ -20,11 +20,9 @@ Signed-off-by: Jouni Malinen <jouni@codeaurora.org> | |||||||
|  src/p2p/p2p.c | 2 ++ |  src/p2p/p2p.c | 2 ++ | ||||||
|  1 file changed, 2 insertions(+) |  1 file changed, 2 insertions(+) | ||||||
|  |  | ||||||
| diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c |  | ||||||
| index 74b7b52ae05c..5cbfc217fc1f 100644 |  | ||||||
| --- a/src/p2p/p2p.c | --- a/src/p2p/p2p.c | ||||||
| +++ b/src/p2p/p2p.c | +++ b/src/p2p/p2p.c | ||||||
| @@ -453,6 +453,8 @@ static void p2p_copy_client_info(struct p2p_device *dev, | @@ -453,6 +453,8 @@ static void p2p_copy_client_info(struct | ||||||
|  	dev->info.config_methods = cli->config_methods; |  	dev->info.config_methods = cli->config_methods; | ||||||
|  	os_memcpy(dev->info.pri_dev_type, cli->pri_dev_type, 8); |  	os_memcpy(dev->info.pri_dev_type, cli->pri_dev_type, 8); | ||||||
|  	dev->info.wps_sec_dev_type_list_len = 8 * cli->num_sec_dev_types; |  	dev->info.wps_sec_dev_type_list_len = 8 * cli->num_sec_dev_types; | ||||||
| @@ -33,6 +31,3 @@ index 74b7b52ae05c..5cbfc217fc1f 100644 | |||||||
|  	os_memcpy(dev->info.wps_sec_dev_type_list, cli->sec_dev_types, |  	os_memcpy(dev->info.wps_sec_dev_type_list, cli->sec_dev_types, | ||||||
|  		  dev->info.wps_sec_dev_type_list_len); |  		  dev->info.wps_sec_dev_type_list_len); | ||||||
|  } |  } | ||||||
| --  |  | ||||||
| 2.25.1 |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user