[PATCH 07/15] supplicant: Allow user-defined defaults for Interworking network blocks.
greearb at candelatech.com
greearb
Wed Mar 5 16:19:52 PST 2014
From: Ben Greear <greearb at candelatech.com>
This way users can still configure the HT over-rides and some other
constraints that Interworking has no interest or ability to configure.
Example config file (to disable HT-40 on an Interworking/HS20 interface):
ctrl_interface=/var/run/wpa_supplicant
fast_reauth=1
interworking=1
auto_interworking=1
access_network_type=0
hs20=1
bss_max_count=2000
network={
interworking_defaults=1
disable_ht=0
disable_ht40=1
disable_sgi=0
ht_mcs=""
disable_max_amsdu=-1
ampdu_factor=-1
ampdu_density=-1
}
cred={
username="client2"
password="lanforge"
ca_cert="/home/lanforge/ca.pem"
private_key="/home/lanforge/client.p12"
private_key_passwd="lanforge"
realm="lanforge.org"
domain="lanforge.org"
eap=TLS
}
Signed-off-by: Ben Greear <greearb at candelatech.com>
---
src/utils/common.c | 3 +
wpa_supplicant/config.c | 73 ++++++++++++++++++++++++++++++++++++
wpa_supplicant/config.h | 1 +
wpa_supplicant/config_ssid.h | 7 +++
wpa_supplicant/interworking.c | 3 +
wpa_supplicant/scan.h | 2 +
wpa_supplicant/wpa_supplicant.conf | 10 +++++
7 files changed, 99 insertions(+), 0 deletions(-)
diff --git a/src/utils/common.c b/src/utils/common.c
index 39751d4..54ab60f 100644
--- a/src/utils/common.c
+++ b/src/utils/common.c
@@ -754,6 +754,9 @@ void int_array_concat(int **res, const int *a)
reslen = int_array_len(*res);
alen = int_array_len(a);
+ if (alen == 0)
+ return; /* nothing to concat */
+
n = os_realloc_array(*res, reslen + alen + 1, sizeof(int));
if (n == NULL) {
os_free(*res);
diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c
index 1df9213..dfc9bae 100644
--- a/wpa_supplicant/config.c
+++ b/wpa_supplicant/config.c
@@ -1730,6 +1730,7 @@ static const struct parse_data ssid_fields[] = {
{ INT(ap_max_inactivity) },
{ INT(dtim_period) },
{ INT(beacon_int) },
+ { INT_RANGE(interworking_defaults, 0, 1) },
};
#undef OFFSET
@@ -2138,6 +2139,77 @@ int wpa_config_remove_network(struct wpa_config *config, int id)
/**
+ * wpa_set_user_network_defalts - Configure ssid with network defaults.
+ * @config: Configuration data from wpa_config_read()
+ * @ssid: The SSID to configure.
+ * Looks for first wpa_ssid that has interworking_defaults=1. If found,
+ * select values are applied to the ssid. In this way one may configure
+ * options not explicitly dealt with by interworking, such as
+ * disable_ht=0
+ * disable_ht40=0
+ * etc.
+ * If no ssid is found, no action is taken.
+ */
+void wpa_config_set_user_network_defaults(struct wpa_config *config, struct wpa_ssid *ssid)
+{
+ struct wpa_ssid *s = config->ssid;
+ int i;
+
+ while (s) {
+ if (s->interworking_defaults) {
+ os_free(ssid->scan_freq);
+ ssid->scan_freq = NULL;
+ int_array_concat(&ssid->scan_freq, s->scan_freq);
+
+ os_free(ssid->freq_list);
+ ssid->freq_list = NULL;
+ int_array_concat(&ssid->freq_list, s->freq_list);
+
+ ssid->bg_scan_period = s->bg_scan_period;
+#ifdef CONFIG_HT_OVERRIDES
+ ssid->disable_ht = s->disable_ht;
+ ssid->disable_ht40 = s->disable_ht40;
+ ssid->disable_sgi = s->disable_sgi;
+ ssid->disable_max_amsdu = s->disable_max_amsdu;
+ ssid->ampdu_factor = s->ampdu_factor;
+ ssid->ampdu_density = s->ampdu_density;
+
+ os_free(ssid->ht_mcs);
+ ssid->ht_mcs = NULL;
+ if (s->ht_mcs) {
+ ssid->ht_mcs = strdup(s->ht_mcs);
+ }
+#endif
+#ifdef CONFIG_VHT_OVERRIDES
+ ssid->disable_vht = s->disable_vht;
+ ssid->vht_capa = s->vht_capa;
+ ssid->vht_capa_mask = s->vht_capa_mask;
+ ssid->vht_rx_mcs_nss_1 = s->vht_rx_mcs_nss_1;
+ ssid->vht_rx_mcs_nss_2 = s->vht_rx_mcs_nss_2;
+ ssid->vht_rx_mcs_nss_3 = s->vht_rx_mcs_nss_3;
+ ssid->vht_rx_mcs_nss_4 = s->vht_rx_mcs_nss_4;
+ ssid->vht_rx_mcs_nss_5 = s->vht_rx_mcs_nss_5;
+ ssid->vht_rx_mcs_nss_6 = s->vht_rx_mcs_nss_6;
+ ssid->vht_rx_mcs_nss_7 = s->vht_rx_mcs_nss_7;
+ ssid->vht_rx_mcs_nss_8 = s->vht_rx_mcs_nss_8;
+ ssid->vht_tx_mcs_nss_1 = s->vht_tx_mcs_nss_1;
+ ssid->vht_tx_mcs_nss_2 = s->vht_tx_mcs_nss_2;
+ ssid->vht_tx_mcs_nss_3 = s->vht_tx_mcs_nss_3;
+ ssid->vht_tx_mcs_nss_4 = s->vht_tx_mcs_nss_4;
+ ssid->vht_tx_mcs_nss_5 = s->vht_tx_mcs_nss_5;
+ ssid->vht_tx_mcs_nss_6 = s->vht_tx_mcs_nss_6;
+ ssid->vht_tx_mcs_nss_7 = s->vht_tx_mcs_nss_7;
+ ssid->vht_tx_mcs_nss_8 = s->vht_tx_mcs_nss_8;
+#endif /* CONFIG_VHT_OVERRIDES */
+ return;
+ }
+ else {
+ ssid = ssid->next;
+ }
+ }
+} /* wpa_set_user_network_defaults */
+
+/**
* wpa_config_set_network_defaults - Set network default values
* @ssid: Pointer to network configuration data
*/
@@ -2183,6 +2255,7 @@ void wpa_config_set_network_defaults(struct wpa_ssid *ssid)
#ifdef CONFIG_IEEE80211W
ssid->ieee80211w = MGMT_FRAME_PROTECTION_DEFAULT;
#endif /* CONFIG_IEEE80211W */
+ ssid->interworking_defaults = DEFAULT_INTERWORKING_DEFAULTS;
}
diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h
index 690bfde..ffb8a5f 100644
--- a/wpa_supplicant/config.h
+++ b/wpa_supplicant/config.h
@@ -1039,6 +1039,7 @@ struct wpa_ssid * wpa_config_get_network(struct wpa_config *config, int id);
struct wpa_ssid * wpa_config_add_network(struct wpa_config *config);
int wpa_config_remove_network(struct wpa_config *config, int id);
void wpa_config_set_network_defaults(struct wpa_ssid *ssid);
+void wpa_config_set_user_network_defaults(struct wpa_config *config, struct wpa_ssid *ssid);
int wpa_config_set(struct wpa_ssid *ssid, const char *var, const char *value,
int line);
int wpa_config_set_quoted(struct wpa_ssid *ssid, const char *var,
diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h
index d515030..4aaf0f1 100644
--- a/wpa_supplicant/config_ssid.h
+++ b/wpa_supplicant/config_ssid.h
@@ -33,6 +33,7 @@
#define DEFAULT_DISABLE_MAX_AMSDU -1 /* no change */
#define DEFAULT_AMPDU_FACTOR -1 /* no change */
#define DEFAULT_AMPDU_DENSITY -1 /* no change */
+#define DEFAULT_INTERWORKING_DEFAULTS 0
struct psk_list_entry {
struct dl_list list;
@@ -492,6 +493,12 @@ struct wpa_ssid {
int temporary;
/**
+ * interworking_defaults - Whether this network block should be used for
+ * network defaults when creating temporary interworking network blocks.
+ */
+ int interworking_defaults;
+
+ /**
* export_keys - Whether keys may be exported
*
* This attribute will be set when keys are determined through
diff --git a/wpa_supplicant/interworking.c b/wpa_supplicant/interworking.c
index def8f1a..025dcf5 100644
--- a/wpa_supplicant/interworking.c
+++ b/wpa_supplicant/interworking.c
@@ -916,6 +916,7 @@ static int interworking_connect_3gpp(struct wpa_supplicant *wpa_s,
wpas_notify_network_added(wpa_s, ssid);
wpa_config_set_network_defaults(ssid);
+ wpa_config_set_user_network_defaults(wpa_s->conf, ssid);
ssid->priority = cred->priority;
ssid->temporary = 1;
ssid->ssid = os_zalloc(bss->ssid_len + 1);
@@ -1451,6 +1452,7 @@ static int interworking_connect_roaming_consortium(
ssid->parent_cred = cred;
wpas_notify_network_added(wpa_s, ssid);
wpa_config_set_network_defaults(ssid);
+ wpa_config_set_user_network_defaults(wpa_s->conf, ssid);
ssid->priority = cred->priority;
ssid->temporary = 1;
ssid->ssid = os_zalloc(bss->ssid_len + 1);
@@ -1649,6 +1651,7 @@ static int interworking_connect_helper(struct wpa_supplicant *wpa_s,
ssid->parent_cred = cred;
wpas_notify_network_added(wpa_s, ssid);
wpa_config_set_network_defaults(ssid);
+ wpa_config_set_user_network_defaults(wpa_s->conf, ssid);
ssid->priority = cred->priority;
ssid->temporary = 1;
ssid->ssid = os_zalloc(bss->ssid_len + 1);
diff --git a/wpa_supplicant/scan.h b/wpa_supplicant/scan.h
index 59a1cff..052ef21 100644
--- a/wpa_supplicant/scan.h
+++ b/wpa_supplicant/scan.h
@@ -48,4 +48,6 @@ struct wpa_driver_scan_params *
wpa_scan_clone_params(const struct wpa_driver_scan_params *src);
void wpa_scan_free_params(struct wpa_driver_scan_params *params);
+void int_array_concat(int **res, const int *a);
+
#endif /* SCAN_H */
diff --git a/wpa_supplicant/wpa_supplicant.conf b/wpa_supplicant/wpa_supplicant.conf
index 03c6f5f..6cea0ac 100644
--- a/wpa_supplicant/wpa_supplicant.conf
+++ b/wpa_supplicant/wpa_supplicant.conf
@@ -935,6 +935,16 @@ fast_reauth=1
# Beacon interval (default: 100 TU)
#beacon_int=100
+# interworking_defaults: Should this network block's values be used as
+# defaults for automatically-created interworking network blocks?
+# Not all values will be propagated, but the HT and VHT overrides,
+# and a few other values will be. This will only be used if
+# Interworking is active. Only the first interworking_defaults=1
+# network block will be used, so users should only set this value
+# in a single network block.
+# 0 = Not used (default)
+# 1 = Use this network block's values.
+
# disable_ht: Whether HT (802.11n) should be disabled.
# 0 = HT enabled (if AP supports it)
# 1 = HT disabled
--
1.7.3.4
More information about the Hostap
mailing list