Browse Source

IBSS: Add fixed_freq network parameter

Add fixed_freq=<0/1> network block parameter and pass it to the driver
when starting or joining an IBSS. If this flag is set, IBSS should not
try to look for other IBSS networks to merge with on different channels.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
Janusz Dziedzic 10 years ago
parent
commit
4d9e6fba2a

+ 8 - 0
src/drivers/driver.h

@@ -766,6 +766,14 @@ struct wpa_driver_associate_params {
 	 */
 	int fixed_bssid;
 
+	/**
+	 * fixed_freq - Fix control channel in IBSS mode
+	 * 0 = don't fix control channel (default)
+	 * 1 = fix control channel; this prevents IBSS merging with another
+	 *	channel
+	 */
+	int fixed_freq;
+
 	/**
 	 * disable_ht - Disable HT (IEEE 802.11n) for this connection
 	 */

+ 6 - 0
src/drivers/driver_nl80211.c

@@ -4378,6 +4378,12 @@ retry:
 			goto fail;
 	}
 
+	if (params->fixed_freq) {
+		wpa_printf(MSG_DEBUG, "  * fixed_freq");
+		if (nla_put_flag(msg, NL80211_ATTR_FREQ_FIXED))
+			goto fail;
+	}
+
 	if (params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X ||
 	    params->key_mgmt_suite == WPA_KEY_MGMT_PSK ||
 	    params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 ||

+ 1 - 0
wpa_supplicant/config.c

@@ -1896,6 +1896,7 @@ static const struct parse_data ssid_fields[] = {
 	{ INT_RANGE(peerkey, 0, 1) },
 	{ INT_RANGE(mixed_cell, 0, 1) },
 	{ INT_RANGE(frequency, 0, 65000) },
+	{ INT_RANGE(fixed_freq, 0, 1) },
 #ifdef CONFIG_MESH
 	{ FUNC(mesh_basic_rates) },
 	{ INT(dot11MeshMaxRetries) },

+ 1 - 0
wpa_supplicant/config_file.c

@@ -736,6 +736,7 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
 #endif /* IEEE8021X_EAPOL */
 	INT(mode);
 	INT(frequency);
+	INT(fixed_freq);
 	write_int(f, "proactive_key_caching", ssid->proactive_key_caching, -1);
 	INT(disabled);
 	INT(peerkey);

+ 5 - 0
wpa_supplicant/config_ssid.h

@@ -419,6 +419,11 @@ struct wpa_ssid {
 	 */
 	int frequency;
 
+	/**
+	 * fixed_freq - Use fixed frequency for IBSS
+	 */
+	int fixed_freq;
+
 	/**
 	 * mesh_basic_rates - BSS Basic rate set for mesh network
 	 *

+ 1 - 0
wpa_supplicant/wpa_supplicant.c

@@ -2122,6 +2122,7 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
 		ibss_mesh_setup_freq(wpa_s, ssid, &params.freq);
 
 	if (ssid->mode == WPAS_MODE_IBSS) {
+		params.fixed_freq = ssid->fixed_freq;
 		if (ssid->beacon_int)
 			params.beacon_int = ssid->beacon_int;
 		else