Przeglądaj źródła

hostapd: fix SIGHUP for multi-bss

SVN-Revision: 23601
Felix Fietkau 15 lat temu
rodzic
commit
0fbff7de83
1 zmienionych plików z 89 dodań i 0 usunięć
  1. 89 0
      package/hostapd/patches/440-mbss_reload_fix.patch

+ 89 - 0
package/hostapd/patches/440-mbss_reload_fix.patch

@@ -0,0 +1,89 @@
+--- a/src/ap/hostapd.c
++++ b/src/ap/hostapd.c
+@@ -42,37 +42,8 @@ static int hostapd_setup_encryption(char
+ 
+ extern int wpa_debug_level;
+ 
+-
+-int hostapd_reload_config(struct hostapd_iface *iface)
++static int hostapd_reload_bss(struct hostapd_data *hapd)
+ {
+-	struct hostapd_data *hapd = iface->bss[0];
+-	struct hostapd_config *newconf, *oldconf;
+-	size_t j;
+-
+-	if (iface->config_read_cb == NULL)
+-		return -1;
+-	newconf = iface->config_read_cb(iface->config_fname);
+-	if (newconf == NULL)
+-		return -1;
+-
+-	/*
+-	 * Deauthenticate all stations since the new configuration may not
+-	 * allow them to use the BSS anymore.
+-	 */
+-	for (j = 0; j < iface->num_bss; j++)
+-		hostapd_flush_old_stations(iface->bss[j]);
+-
+-#ifndef CONFIG_NO_RADIUS
+-	/* TODO: update dynamic data based on changed configuration
+-	 * items (e.g., open/close sockets, etc.) */
+-	radius_client_flush(hapd->radius, 0);
+-#endif /* CONFIG_NO_RADIUS */
+-
+-	oldconf = hapd->iconf;
+-	hapd->iconf = newconf;
+-	hapd->conf = &newconf->bss[0];
+-	iface->conf = newconf;
+-
+ 	if (hostapd_setup_wpa_psk(hapd->conf)) {
+ 		wpa_printf(MSG_ERROR, "Failed to re-configure WPA PSK "
+ 			   "after reloading configuration");
+@@ -110,10 +81,46 @@ int hostapd_reload_config(struct hostapd
+ 		wpa_printf(MSG_ERROR, "Could not set SSID for kernel driver");
+ 		/* try to continue */
+ 	}
++	wpa_printf(MSG_DEBUG, "Reconfigured interface %s", hapd->conf->iface);
++}
++
++int hostapd_reload_config(struct hostapd_iface *iface)
++{
++	struct hostapd_data *hapd = iface->bss[0];
++	struct hostapd_config *newconf, *oldconf;
++	size_t j;
++
++	if (iface->config_read_cb == NULL)
++		return -1;
++	newconf = iface->config_read_cb(iface->config_fname);
++	if (newconf == NULL)
++		return -1;
++
++	/*
++	 * Deauthenticate all stations since the new configuration may not
++	 * allow them to use the BSS anymore.
++	 */
++	for (j = 0; j < iface->num_bss; j++)
++		hostapd_flush_old_stations(iface->bss[j]);
++
++#ifndef CONFIG_NO_RADIUS
++	/* TODO: update dynamic data based on changed configuration
++	 * items (e.g., open/close sockets, etc.) */
++	radius_client_flush(hapd->radius, 0);
++#endif /* CONFIG_NO_RADIUS */
++
++	oldconf = hapd->iconf;
++	iface->conf = newconf;
++
++	for (j = 0; j < iface->num_bss; j++) {
++		hapd = iface->bss[j];
++		hapd->iconf = newconf;
++		hapd->conf = &newconf->bss[j];
++		hostapd_reload_bss(hapd);
++	}
+ 
+ 	hostapd_config_free(oldconf);
+ 
+-	wpa_printf(MSG_DEBUG, "Reconfigured interface %s", hapd->conf->iface);
+ 
+ 	return 0;
+ }