/*
* wlantest controller
- * Copyright (c) 2010, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2010-2013, Jouni Malinen <j@w1.fi>
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
*/
#include "utils/includes.h"
if (bssid == NULL)
return NULL;
- res = os_zalloc((len / ETH_ALEN + 1) * sizeof(char *));
+ res = os_calloc(len / ETH_ALEN + 1, sizeof(char *));
if (res == NULL)
return NULL;
for (i = 0; i < len / ETH_ALEN; i++) {
if (addr == NULL)
return NULL;
- res = os_zalloc((len / ETH_ALEN + 1 + add_bcast) * sizeof(char *));
+ res = os_calloc(len / ETH_ALEN + 1 + add_bcast, sizeof(char *));
if (res == NULL)
return NULL;
for (i = 0; i < len / ETH_ALEN; i++) {
{ "assocresp_comeback", WLANTEST_STA_COUNTER_ASSOCRESP_COMEBACK },
{ "reassocresp_comeback", WLANTEST_STA_COUNTER_REASSOCRESP_COMEBACK },
{ "ping_ok_first_assoc", WLANTEST_STA_COUNTER_PING_OK_FIRST_ASSOC },
+ { "valid_deauth_rx_ack", WLANTEST_STA_COUNTER_VALID_DEAUTH_RX_ACK },
+ { "valid_disassoc_rx_ack",
+ WLANTEST_STA_COUNTER_VALID_DISASSOC_RX_ACK },
+ { "invalid_deauth_rx_ack",
+ WLANTEST_STA_COUNTER_INVALID_DEAUTH_RX_ACK },
+ { "invalid_disassoc_rx_ack",
+ WLANTEST_STA_COUNTER_INVALID_DISASSOC_RX_ACK },
+ { "deauth_rx_asleep", WLANTEST_STA_COUNTER_DEAUTH_RX_ASLEEP },
+ { "deauth_rx_awake", WLANTEST_STA_COUNTER_DEAUTH_RX_AWAKE },
+ { "disassoc_rx_asleep", WLANTEST_STA_COUNTER_DISASSOC_RX_ASLEEP },
+ { "disassoc_rx_awake", WLANTEST_STA_COUNTER_DISASSOC_RX_AWAKE },
+ { "prot_data_tx", WLANTEST_STA_COUNTER_PROT_DATA_TX },
+ { "deauth_rx_rc6", WLANTEST_STA_COUNTER_DEAUTH_RX_RC6 },
+ { "deauth_rx_rc7", WLANTEST_STA_COUNTER_DEAUTH_RX_RC7 },
+ { "disassoc_rx_rc6", WLANTEST_STA_COUNTER_DISASSOC_RX_RC6 },
+ { "disassoc_rx_rc7", WLANTEST_STA_COUNTER_DISASSOC_RX_RC7 },
{ NULL, 0 }
};
switch (arg) {
case 1:
/* counter list */
- count = sizeof(sta_counters) / sizeof(sta_counters[0]);
- res = os_zalloc(count * sizeof(char *));
+ count = ARRAY_SIZE(sta_counters);
+ res = os_calloc(count, sizeof(char *));
if (res == NULL)
return NULL;
for (i = 0; sta_counters[i].name; i++) {
{ "missing_bip_mmie", WLANTEST_BSS_COUNTER_MISSING_BIP_MMIE },
{ "bip_deauth", WLANTEST_BSS_COUNTER_BIP_DEAUTH },
{ "bip_disassoc", WLANTEST_BSS_COUNTER_BIP_DISASSOC },
+ { "probe_response", WLANTEST_BSS_COUNTER_PROBE_RESPONSE },
{ NULL, 0 }
};
switch (arg) {
case 1:
/* counter list */
- count = sizeof(bss_counters) / sizeof(bss_counters[0]);
- res = os_zalloc(count * sizeof(char *));
+ count = ARRAY_SIZE(bss_counters);
+ res = os_calloc(count, sizeof(char *));
if (res == NULL)
return NULL;
for (i = 0; bss_counters[i].name; i++) {
}
+static int cmd_relog(int s, int argc, char *argv[])
+{
+ return cmd_simple(s, WLANTEST_CTRL_RELOG);
+}
+
+
struct tdls_counters {
const char *name;
enum wlantest_tdls_counter num;
{ "invalid_direct_link", WLANTEST_TDLS_COUNTER_INVALID_DIRECT_LINK },
{ "valid_ap_path", WLANTEST_TDLS_COUNTER_VALID_AP_PATH },
{ "invalid_ap_path", WLANTEST_TDLS_COUNTER_INVALID_AP_PATH },
+ { "setup_req", WLANTEST_TDLS_COUNTER_SETUP_REQ },
+ { "setup_resp_ok", WLANTEST_TDLS_COUNTER_SETUP_RESP_OK },
+ { "setup_resp_fail", WLANTEST_TDLS_COUNTER_SETUP_RESP_FAIL },
+ { "setup_conf_ok", WLANTEST_TDLS_COUNTER_SETUP_CONF_OK },
+ { "setup_conf_fail", WLANTEST_TDLS_COUNTER_SETUP_CONF_FAIL },
+ { "teardown", WLANTEST_TDLS_COUNTER_TEARDOWN },
{ NULL, 0 }
};
switch (arg) {
case 1:
/* counter list */
- count = sizeof(tdls_counters) / sizeof(tdls_counters[0]);
- res = os_zalloc(count * sizeof(char *));
+ count = ARRAY_SIZE(tdls_counters);
+ res = os_calloc(count, sizeof(char *));
if (res == NULL)
return NULL;
for (i = 0; tdls_counters[i].name; i++) {
switch (arg) {
case 1:
/* frame list */
- count = sizeof(inject_frames) / sizeof(inject_frames[0]);
- res = os_zalloc(count * sizeof(char *));
+ count = ARRAY_SIZE(inject_frames);
+ res = os_calloc(count, sizeof(char *));
if (res == NULL)
break;
for (i = 0; inject_frames[i].name; i++) {
}
break;
case 2:
- res = os_zalloc(5 * sizeof(char *));
+ res = os_calloc(5, sizeof(char *));
if (res == NULL)
break;
res[0] = os_strdup("normal");
break;
break;
case 3:
- res = os_zalloc(3 * sizeof(char *));
+ res = os_calloc(3, sizeof(char *));
if (res == NULL)
break;
res[0] = os_strdup("ap");
switch (arg) {
case 1:
- res = os_zalloc(5 * sizeof(char *));
+ res = os_calloc(5, sizeof(char *));
if (res == NULL)
break;
res[0] = os_strdup("normal");
}
+static int cmd_add_wepkey(int s, int argc, char *argv[])
+{
+ u8 resp[WLANTEST_CTRL_MAX_RESP_LEN];
+ u8 buf[100], *pos, *end;
+ int rlen;
+
+ if (argc < 1) {
+ printf("add_wepkey needs one argument: WEP key\n");
+ return -1;
+ }
+
+ pos = buf;
+ end = buf + sizeof(buf);
+ WPA_PUT_BE32(pos, WLANTEST_CTRL_ADD_PASSPHRASE);
+ pos += 4;
+ pos = attr_add_str(pos, end, WLANTEST_ATTR_WEPKEY, argv[0]);
+
+ rlen = cmd_send_and_recv(s, buf, pos - buf, resp, sizeof(resp));
+ if (rlen < 0)
+ return -1;
+ return 0;
+}
+
+
struct sta_infos {
const char *name;
enum wlantest_sta_info num;
{ "key_mgmt", WLANTEST_STA_INFO_KEY_MGMT },
{ "rsn_capab", WLANTEST_STA_INFO_RSN_CAPAB },
{ "state", WLANTEST_STA_INFO_STATE },
+ { "gtk", WLANTEST_STA_INFO_GTK },
{ NULL, 0 }
};
switch (arg) {
case 1:
/* counter list */
- count = sizeof(sta_infos) / sizeof(sta_infos[0]);
- res = os_zalloc(count * sizeof(char *));
+ count = ARRAY_SIZE(sta_infos);
+ res = os_calloc(count, sizeof(char *));
if (res == NULL)
return NULL;
for (i = 0; sta_infos[i].name; i++) {
switch (arg) {
case 1:
/* counter list */
- count = sizeof(bss_infos) / sizeof(bss_infos[0]);
- res = os_zalloc(count * sizeof(char *));
+ count = ARRAY_SIZE(bss_infos);
+ res = os_calloc(count, sizeof(char *));
if (res == NULL)
return NULL;
for (i = 0; bss_infos[i].name; i++) {
}
+static int cmd_get_tx_tid(int s, int argc, char *argv[])
+{
+ u8 resp[WLANTEST_CTRL_MAX_RESP_LEN];
+ u8 buf[100], *end, *pos;
+ int rlen;
+ size_t len;
+
+ if (argc != 3) {
+ printf("get_tx_tid needs three arguments: "
+ "BSSID, STA address, and TID\n");
+ return -1;
+ }
+
+ pos = buf;
+ end = buf + sizeof(buf);
+ WPA_PUT_BE32(pos, WLANTEST_CTRL_GET_TX_TID);
+ pos += 4;
+
+ pos = attr_hdr_add(pos, end, WLANTEST_ATTR_BSSID, ETH_ALEN);
+ if (hwaddr_aton(argv[0], pos) < 0) {
+ printf("Invalid BSSID '%s'\n", argv[0]);
+ return -1;
+ }
+ pos += ETH_ALEN;
+
+ pos = attr_hdr_add(pos, end, WLANTEST_ATTR_STA_ADDR, ETH_ALEN);
+ if (hwaddr_aton(argv[1], pos) < 0) {
+ printf("Invalid STA address '%s'\n", argv[1]);
+ return -1;
+ }
+ pos += ETH_ALEN;
+
+ pos = attr_add_be32(pos, end, WLANTEST_ATTR_TID, atoi(argv[2]));
+
+ rlen = cmd_send_and_recv(s, buf, pos - buf, resp, sizeof(resp));
+ if (rlen < 0)
+ return -1;
+
+ pos = attr_get(resp + 4, rlen - 4, WLANTEST_ATTR_COUNTER, &len);
+ if (pos == NULL || len != 4)
+ return -1;
+ printf("%u\n", WPA_GET_BE32(pos));
+ return 0;
+}
+
+
+static int cmd_get_rx_tid(int s, int argc, char *argv[])
+{
+ u8 resp[WLANTEST_CTRL_MAX_RESP_LEN];
+ u8 buf[100], *end, *pos;
+ int rlen;
+ size_t len;
+
+ if (argc != 3) {
+ printf("get_tx_tid needs three arguments: "
+ "BSSID, STA address, and TID\n");
+ return -1;
+ }
+
+ pos = buf;
+ end = buf + sizeof(buf);
+ WPA_PUT_BE32(pos, WLANTEST_CTRL_GET_RX_TID);
+ pos += 4;
+
+ pos = attr_hdr_add(pos, end, WLANTEST_ATTR_BSSID, ETH_ALEN);
+ if (hwaddr_aton(argv[0], pos) < 0) {
+ printf("Invalid BSSID '%s'\n", argv[0]);
+ return -1;
+ }
+ pos += ETH_ALEN;
+
+ pos = attr_hdr_add(pos, end, WLANTEST_ATTR_STA_ADDR, ETH_ALEN);
+ if (hwaddr_aton(argv[1], pos) < 0) {
+ printf("Invalid STA address '%s'\n", argv[1]);
+ return -1;
+ }
+ pos += ETH_ALEN;
+
+ pos = attr_add_be32(pos, end, WLANTEST_ATTR_TID, atoi(argv[2]));
+
+ rlen = cmd_send_and_recv(s, buf, pos - buf, resp, sizeof(resp));
+ if (rlen < 0)
+ return -1;
+
+ pos = attr_get(resp + 4, rlen - 4, WLANTEST_ATTR_COUNTER, &len);
+ if (pos == NULL || len != 4)
+ return -1;
+ printf("%u\n", WPA_GET_BE32(pos));
+ return 0;
+}
+
+
+static char ** complete_get_tid(int s, const char *str, int pos)
+{
+ int arg = get_cmd_arg_num(str, pos);
+ char **res = NULL;
+ u8 addr[ETH_ALEN];
+
+ switch (arg) {
+ case 1:
+ res = get_bssid_list(s);
+ break;
+ case 2:
+ if (hwaddr_aton(&str[get_prev_arg_pos(str, pos)], addr) < 0)
+ break;
+ res = get_sta_list(s, addr, 0);
+ break;
+ }
+
+ return res;
+}
+
+
struct wlantest_cli_cmd {
const char *cmd;
int (*handler)(int s, int argc, char *argv[]);
{ "version", cmd_version, "= get wlantest version", NULL },
{ "add_passphrase", cmd_add_passphrase,
"<passphrase> = add a known passphrase", NULL },
+ { "add_wepkey", cmd_add_wepkey,
+ "<WEP key> = add a known WEP key", NULL },
{ "info_sta", cmd_info_sta,
"<field> <BSSID> <STA> = get STA information",
complete_info_sta },
{ "get_bss_counter", cmd_get_bss_counter,
"<counter> <BSSID> = get BSS counter value",
complete_get_bss_counter },
+ { "relog", cmd_relog, "= re-open log-file (allow rolling logs)", NULL },
+ { "get_tx_tid", cmd_get_tx_tid,
+ "<BSSID> <STA> <TID> = get STA TX TID counter value",
+ complete_get_tid },
+ { "get_rx_tid", cmd_get_rx_tid,
+ "<BSSID> <STA> <TID> = get STA RX TID counter value",
+ complete_get_tid },
{ NULL, NULL, NULL, NULL }
};
static char ** wlantest_cli_cmd_list(void)
{
char **res;
- int i, count;
+ int i;
- count = sizeof(wlantest_cli_commands) /
- sizeof(wlantest_cli_commands[0]);
- res = os_zalloc(count * sizeof(char *));
+ res = os_calloc(ARRAY_SIZE(wlantest_cli_commands), sizeof(char *));
if (res == NULL)
return NULL;
cli.s = s;
eloop_register_signal_terminate(wlantest_cli_eloop_terminate, &cli);
edit_init(wlantest_cli_edit_cmd_cb, wlantest_cli_edit_eof_cb,
- wlantest_cli_edit_completion_cb, &cli, hfile);
+ wlantest_cli_edit_completion_cb, &cli, hfile, NULL);
eloop_run();