[PATCH 3/5] wpa_cli: Implement completion routine for get_network/set_network

Mikael Kanstrup mikael.kanstrup at sonymobile.com
Tue Mar 24 12:10:38 EDT 2015


Add command completion routine for get_network and set_network that guide user
with both network id and network parameters.

Signed-off-by: Mikael Kanstrup <mikael.kanstrup at sonymobile.com>
---
 wpa_supplicant/wpa_cli.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 89 insertions(+), 2 deletions(-)

diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c
index fa943af..57039b9 100644
--- a/wpa_supplicant/wpa_cli.c
+++ b/wpa_supplicant/wpa_cli.c
@@ -1528,6 +1528,93 @@ static int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc,
 	return wpa_cli_cmd(ctrl, "GET_NETWORK", 2, argc, argv);
 }
 
+static char ** wpa_cli_complete_network(const char *str, int pos)
+{
+	int arg = get_cmd_arg_num(str, pos);
+	const char *fields[] = {
+		"ssid", "scan_ssid", "bssid", "bssid_blacklist",
+		"bssid_whitelist", "psk", "proto", "key_mgmt",
+		"bg_scan_period", "pairwise", "group", "auth_alg", "scan_freq",
+		"freq_list",
+#ifdef IEEE8021X_EAPOL
+		"eap", "identity", "anonymous_identity", "password", "ca_cert",
+		"ca_path", "client_cert", "private_key", "private_key_passwd",
+		"dh_file", "subject_match", "altsubject_match",
+		"domain_suffix_match", "domain_match", "ca_cert2", "ca_path2",
+		"client_cert2", "private_key2", "private_key2_passwd",
+		"dh_file2", "subject_match2", "altsubject_match2",
+		"domain_suffix_match2", "domain_match2", "phase1", "phase2",
+		"pcsc", "pin", "engine_id", "key_id", "cert_id", "ca_cert_id",
+		"pin2", "engine2_id", "key2_id", "cert2_id", "ca_cert2_id",
+		"engine", "engine2", "eapol_flags", "sim_num",
+		"openssl_ciphers", "erp",
+#endif /* IEEE8021X_EAPOL */
+		"wep_key0", "wep_key1", "wep_key2", "wep_key3",
+		"wep_tx_keyidx", "priority",
+#ifdef IEEE8021X_EAPOL
+		"eap_workaround", "pac_file", "fragment_size", "ocsp",
+#endif /* IEEE8021X_EAPOL */
+#ifdef CONFIG_MESH
+		"mode", "no_auto_peer",
+#else /* CONFIG_MESH */
+		"mode",
+#endif /* CONFIG_MESH */
+		"proactive_key_caching", "disabled", "id_str",
+#ifdef CONFIG_IEEE80211W
+		"ieee80211w",
+#endif /* CONFIG_IEEE80211W */
+		"peerkey", "mixed_cell", "frequency", "fixed_freq",
+#ifdef CONFIG_MESH
+		"mesh_basic_rates", "dot11MeshMaxRetries",
+		"dot11MeshRetryTimeout", "dot11MeshConfirmTimeout",
+		"dot11MeshHoldingTimeout",
+#endif /* CONFIG_MESH */
+		"wpa_ptk_rekey", "bgscan", "ignore_broadcast_ssid",
+#ifdef CONFIG_P2P
+		"go_p2p_dev_addr", "p2p_client_list", "psk_list",
+#endif /* CONFIG_P2P */
+#ifdef CONFIG_HT_OVERRIDES
+		"disable_ht", "disable_ht40", "disable_sgi", "disable_ldpc",
+		"ht40_intolerant", "disable_max_amsdu", "ampdu_factor",
+		"ampdu_density", "ht_mcs",
+#endif /* CONFIG_HT_OVERRIDES */
+#ifdef CONFIG_VHT_OVERRIDES
+		"disable_vht", "vht_capa", "vht_capa_mask", "vht_rx_mcs_nss_1",
+		"vht_rx_mcs_nss_2", "vht_rx_mcs_nss_3", "vht_rx_mcs_nss_4",
+		"vht_rx_mcs_nss_5", "vht_rx_mcs_nss_6", "vht_rx_mcs_nss_7",
+		"vht_rx_mcs_nss_8", "vht_tx_mcs_nss_1", "vht_tx_mcs_nss_2",
+		"vht_tx_mcs_nss_3", "vht_tx_mcs_nss_4", "vht_tx_mcs_nss_5",
+		"vht_tx_mcs_nss_6", "vht_tx_mcs_nss_7", "vht_tx_mcs_nss_8",
+#endif /* CONFIG_VHT_OVERRIDES */
+		"ap_max_inactivity", "dtim_period", "beacon_int",
+#ifdef CONFIG_MACSEC
+		"macsec_policy",
+#endif /* CONFIG_MACSEC */
+		#ifdef CONFIG_HS20
+		"update_identifier",
+#endif /* CONFIG_HS20 */
+		"mac_addr"
+	};
+	int i, num_fields = ARRAY_SIZE(fields);
+	char** res = NULL;
+
+	switch (arg) {
+	case 1:
+		res = cli_txt_list_array(&networks);
+		break;
+	case 2:
+		res = os_calloc(num_fields + 1, sizeof(char *));
+		if (res == NULL)
+			return NULL;
+		for (i = 0; i < num_fields; i++) {
+			res[i] = os_strdup(fields[i]);
+			if (res[i] == NULL)
+				break;
+		}
+	}
+	return res;
+}
+
 
 static int wpa_cli_cmd_dup_network(struct wpa_ctrl *ctrl, int argc,
 				   char *argv[])
@@ -2801,11 +2888,11 @@ static struct wpa_cli_cmd wpa_cli_commands[] = {
 	{ "remove_network", wpa_cli_cmd_remove_network, NULL,
 	  cli_cmd_flag_none,
 	  "<network id> = remove a network" },
-	{ "set_network", wpa_cli_cmd_set_network, NULL,
+	{ "set_network", wpa_cli_cmd_set_network, wpa_cli_complete_network,
 	  cli_cmd_flag_sensitive,
 	  "<network id> <variable> <value> = set network variables (shows\n"
 	  "  list of variables when run without arguments)" },
-	{ "get_network", wpa_cli_cmd_get_network, NULL,
+	{ "get_network", wpa_cli_cmd_get_network, wpa_cli_complete_network,
 	  cli_cmd_flag_none,
 	  "<network id> <variable> = get network variables" },
 	{ "dup_network", wpa_cli_cmd_dup_network, NULL,
-- 
1.8.2.2



More information about the HostAP mailing list