static void hostapd_reconfig_bss(struct hostapd_data *hapd,
				 struct hostapd_bss_config *newbss,
				 struct hostapd_bss_config *oldbss,
				 struct hostapd_config *oldconf,
				 int beacon_changed)
{
	struct hostapd_config_change change;
	int encr_changed = 0;
	struct radius_client_data *old_radius;

	radius_client_flush(hapd->radius, 0);

	if (hostapd_set_dtim_period(hapd, newbss->dtim_period))
		printf("Could not set DTIM period for kernel driver\n");

	if (newbss->ssid.ssid_len != oldbss->ssid.ssid_len ||
	    memcmp(newbss->ssid.ssid, oldbss->ssid.ssid,
		   newbss->ssid.ssid_len) != 0) {
		if (hostapd_set_ssid(hapd, (u8 *) newbss->ssid.ssid,
				     newbss->ssid.ssid_len))
			printf("Could not set SSID for kernel driver\n");
		beacon_changed++;
	}

	if (newbss->ignore_broadcast_ssid != oldbss->ignore_broadcast_ssid)
		beacon_changed++;

	if (hostapd_wep_key_cmp(&newbss->ssid.wep, &oldbss->ssid.wep)) {
		encr_changed++;
		beacon_changed++;
	}

	vlan_reconfig(hapd, oldconf, oldbss);

	if (beacon_changed) {
		HOSTAPD_DEBUG(HOSTAPD_DEBUG_MINIMAL, "Updating beacon frame "
			      "information\n");
		ieee802_11_set_beacon(hapd);
	}

	change.hapd = hapd;
	change.oldconf = oldconf;
	change.newconf = hapd->iconf;
	change.oldbss = oldbss;
	change.newbss = newbss;
	change.mac_acl_changed = hostapd_acl_diff(newbss, oldbss);
	if (newbss->max_num_sta != oldbss->max_num_sta &&
	    newbss->max_num_sta < hapd->num_sta) {
		change.num_sta_remove = hapd->num_sta - newbss->max_num_sta;
	} else
		change.num_sta_remove = 0;
	ap_for_each_sta(hapd, hostapd_config_reload_sta, &change);

	old_radius = hapd->radius;
	hapd->radius = radius_client_reconfig(hapd->radius, hapd,
					      oldbss->radius, newbss->radius);
	hapd->radius_client_reconfigured = old_radius != hapd->radius ||
		hostapd_ip_diff(&newbss->own_ip_addr, &oldbss->own_ip_addr);

	ieee802_1x_reconfig(hapd, oldconf, oldbss);
	iapp_reconfig(hapd, oldconf, oldbss);

	hostapd_acl_reconfig(hapd, oldconf);
	accounting_reconfig(hapd, oldconf);
}
Exemplo n.º 2
0
static void asd_reconfig_bss(struct asd_data *wasd,
				 struct asd_bss_config *newbss,
				 struct asd_bss_config *oldbss,
				 struct asd_config *oldconf,
				 int beacon_changed)
{
	struct asd_config_change change;
	int encr_changed = 0;
	struct radius_client_data *old_radius;

	//radius_client_flush(wasd->radius, 0);

	if (asd_set_dtim_period(wasd, newbss->dtim_period))
		asd_printf(ASD_DEFAULT,MSG_DEBUG,"Could not set DTIM period for kernel driver\n");

	if (newbss->ssid.ssid_len != oldbss->ssid.ssid_len ||
	    os_memcmp(newbss->ssid.ssid, oldbss->ssid.ssid,
		      newbss->ssid.ssid_len) != 0) {
		if (asd_set_ssid(wasd, (u8 *) newbss->ssid.ssid,
				     newbss->ssid.ssid_len))
			asd_printf(ASD_DEFAULT,MSG_DEBUG,"Could not set SSID for kernel driver\n");
		beacon_changed++;
	}

	if (newbss->ignore_broadcast_ssid != oldbss->ignore_broadcast_ssid)
		beacon_changed++;

	if (asd_wep_key_cmp(&newbss->ssid.wep, &oldbss->ssid.wep)) {
		encr_changed++;
		beacon_changed++;
	}

	vlan_reconfig(wasd, oldconf, oldbss);

	if (beacon_changed) {
		asd_printf(ASD_DEFAULT,MSG_DEBUG, "Updating beacon frame information");
		ieee802_11_set_beacon(wasd);
	}

	change.wasd = wasd;
	change.oldconf = oldconf;
	change.newconf = wasd->iconf;
	change.oldbss = oldbss;
	change.newbss = newbss;
	change.mac_acl_changed = asd_acl_diff(newbss, oldbss);
	if (newbss->max_num_sta != oldbss->max_num_sta &&
	    newbss->max_num_sta < wasd->num_sta) {
		change.num_sta_remove = wasd->num_sta - newbss->max_num_sta;
	} else
		change.num_sta_remove = 0;
	ap_for_each_sta(wasd, asd_config_reload_sta, &change);

	old_radius = wasd->radius;
	wasd->radius = radius_client_reconfig(wasd->radius, wasd,
					      oldbss->radius, newbss->radius);
	wasd->radius_client_reconfigured = old_radius != wasd->radius ||
		asd_ip_diff(&newbss->own_ip_addr, &oldbss->own_ip_addr);

	ieee802_1x_reconfig(wasd, oldconf, oldbss);
	iapp_reconfig(wasd, oldconf, oldbss);

	asd_acl_reconfig(wasd, oldconf);
	accounting_reconfig(wasd, oldconf);
}