aboutsummaryrefslogtreecommitdiffstats
path: root/packages/dreamplug-uaputl/uaputl.c
diff options
context:
space:
mode:
authorArturo FilastoĢ€ <hellais@torproject.org>2011-08-19 10:51:07 +0200
committerArturo FilastoĢ€ <hellais@torproject.org>2011-08-19 10:51:07 +0200
commit11aaab578cc13910aca7a32d87072781056f30df (patch)
tree01c8473754e676d08b16b300c5889cfc8cfc9d19 /packages/dreamplug-uaputl/uaputl.c
parentdfe11c74fe59ceaa68778d80ce6a8a16227350f9 (diff)
parente3327c32629717ee81283b9813e5764e6fda2c2e (diff)
downloadtorouter-11aaab578cc13910aca7a32d87072781056f30df.tar.gz
torouter-11aaab578cc13910aca7a32d87072781056f30df.zip
Merge branch 'master' of ssh://git-rw.torproject.org/torouter
Diffstat (limited to 'packages/dreamplug-uaputl/uaputl.c')
-rw-r--r--packages/dreamplug-uaputl/uaputl.c5565
1 files changed, 0 insertions, 5565 deletions
diff --git a/packages/dreamplug-uaputl/uaputl.c b/packages/dreamplug-uaputl/uaputl.c
deleted file mode 100644
index 8337f2b..0000000
--- a/packages/dreamplug-uaputl/uaputl.c
+++ /dev/null
@@ -1,5565 +0,0 @@
-/** @file uaputl.c
- *
- * @brief Program to send AP commands to the driver/firmware of the uAP
- * driver.
- *
- * Copyright (C) 2008-2009, Marvell International Ltd.
- *
- * This software file (the "File") is distributed by Marvell International
- * Ltd. under the terms of the GNU General Public License Version 2, June 1991
- * (the "License"). You may use, redistribute and/or modify this File in
- * accordance with the terms and conditions of the License, a copy of which
- * is available along with the File in the gpl.txt file or by writing to
- * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307 or on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
- *
- * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
- * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
- * this warranty disclaimer.
- *
- */
-/****************************************************************************
-Change log:
- 03/01/08: Initial creation
-****************************************************************************/
-
-/****************************************************************************
- Header files
-****************************************************************************/
-#include <stdarg.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <sys/socket.h>
-#include <sys/select.h>
-#include <stdio.h>
-#include <getopt.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <linux/if.h>
-#include <sys/ioctl.h>
-#include <errno.h>
-#include "uaputl.h"
-#include "uapcmd.h"
-
-/****************************************************************************
- Definitions
-****************************************************************************/
-/** Default debug level */
-int debug_level = MSG_NONE;
-
-/** Enable or disable debug outputs */
-#define DEBUG 1
-
-/** Convert character to integer */
-#define CHAR2INT(x) (((x) >= 'A') ? ((x) - 'A' + 10) : ((x) - '0'))
-
-/****************************************************************************
- Global variables
-****************************************************************************/
-/** Device name */
-static char dev_name[IFNAMSIZ + 1];
-/** option for cmd */
-struct option cmd_options[] = {
- {"help", 0, 0, 'h'},
- {0, 0, 0, 0}
-};
-
-/****************************************************************************
- Local functions
-****************************************************************************/
-/**
- * @brief convert char to hex integer
- *
- * @param chr char
- * @return hex integer
- */
-unsigned char
-hexc2bin(char chr)
-{
- if (chr >= '0' && chr <= '9')
- chr -= '0';
- else if (chr >= 'A' && chr <= 'F')
- chr -= ('A' - 10);
- else if (chr >= 'a' && chr <= 'f')
- chr -= ('a' - 10);
-
- return chr;
-}
-
-/**
- * @brief check protocol is valid or not
- *
- * @param protocol protocol
- *
- * @return UAP_SUCCESS or UAP_FAILURE
- */
-int
-is_protocol_valid(int protocol)
-{
- int ret = UAP_FAILURE;
- switch (protocol) {
- case PROTOCOL_NO_SECURITY:
- case PROTOCOL_STATIC_WEP:
- case PROTOCOL_WPA:
- case PROTOCOL_WPA2:
- case PROTOCOL_WPA2_MIXED:
- ret = UAP_SUCCESS;
- break;
- default:
- printf("ERR: Invalid Protocol: %d\n", protocol);
- break;
- }
- return ret;
-}
-
-/**
- * @brief Function to check valid rate
- *
- *
- * @param rate rate to verify
- *
- * return UAP_SUCCESS or UAP_FAILURE
- **/
-int
-is_rate_valid(int rate)
-{
- int ret = UAP_SUCCESS;
- switch (rate) {
- case 2:
- case 4:
- case 11:
- case 22:
- case 12:
- case 18:
- case 24:
- case 48:
- case 72:
- case 96:
- case 108:
- case 36:
- break;
- default:
- ret = UAP_FAILURE;
- break;
- }
- return ret;
-}
-
-/**
- * @brief detects duplicates rate in array of strings
- * Note that 0x82 and 0x2 are same for rate
- *
- * @param argc number of elements
- * @param argv array of strings
- * @return UAP_FAILURE or UAP_SUCCESS
- */
-inline int
-has_dup_rate(int argc, char *argv[])
-{
- int i, j;
- /* Check for duplicate */
- for (i = 0; i < (argc - 1); i++) {
- for (j = i + 1; j < argc; j++) {
- if ((A2HEXDECIMAL(argv[i]) & ~BASIC_RATE_SET_BIT) ==
- (A2HEXDECIMAL(argv[j]) & ~BASIC_RATE_SET_BIT)) {
- return UAP_FAILURE;
- }
- }
- }
- return UAP_SUCCESS;
-}
-
-/**
- * @brief Check for mandatory rates
- *
- *
- * 2, 4, 11, 22 must be present
- *
- * 6 12 and 24 must be present for ofdm
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return UAP_FAILURE or UAP_SUCCESS
- *
- */
-int
-check_mandatory_rates(int argc, char **argv)
-{
- int i;
- int tmp;
- u32 rate_bitmap = 0;
- int ofdm_enable = 0;
-#define BITMAP_RATE_1M 0x01
-#define BITMAP_RATE_2M 0x02
-#define BITMAP_RATE_5_5M 0x04
-#define BITMAP_RATE_11M 0x8
-#define B_RATE_MANDATORY 0x0f
-#define BITMAP_RATE_6M 0x10
-#define BITMAP_RATE_12M 0x20
-#define BITMAP_RATE_24M 0x40
-#define G_RATE_MANDATORY 0x70
- for (i = 0; i < argc; i++) {
- tmp = (A2HEXDECIMAL(argv[i]) & ~BASIC_RATE_SET_BIT);
- switch (tmp) {
- case 2:
- rate_bitmap |= BITMAP_RATE_1M;
- break;
- case 4:
- rate_bitmap |= BITMAP_RATE_2M;
- break;
- case 11:
- rate_bitmap |= BITMAP_RATE_5_5M;
- break;
- case 22:
- rate_bitmap |= BITMAP_RATE_11M;
- break;
- case 12:
- ofdm_enable = 1;
- rate_bitmap |= BITMAP_RATE_6M;
- break;
- case 24:
- ofdm_enable = 1;
- rate_bitmap |= BITMAP_RATE_12M;
- break;
- case 48:
- ofdm_enable = 1;
- rate_bitmap |= BITMAP_RATE_24M;
- break;
- case 18:
- case 36:
- case 72:
- case 96:
- case 108:
- ofdm_enable = 1;
- break;
- }
- }
- if ((rate_bitmap & B_RATE_MANDATORY) != B_RATE_MANDATORY) {
- printf("Basic Rates 2, 4, 11 and 22 (500K units) \n"
- "must be present in basic or non-basic rates\n");
- return UAP_FAILURE;
- }
- if (ofdm_enable && ((rate_bitmap & G_RATE_MANDATORY) != G_RATE_MANDATORY)) {
- printf("OFDM Rates 12, 24 and 48 ( 500Kb units)\n"
- "must be present in basic or non-basic rates\n");
- return UAP_FAILURE;
- }
- return UAP_SUCCESS;
-}
-
-/**
- * @brief detects duplicates channel in array of strings
- *
- * @param argc number of elements
- * @param argv array of strings
- * @return UAP_FAILURE or UAP_SUCCESS
- */
-inline int
-has_dup_channel(int argc, char *argv[])
-{
- int i, j;
- /* Check for duplicate */
- for (i = 0; i < (argc - 1); i++) {
- for (j = i + 1; j < argc; j++) {
- if (atoi(argv[i]) == atoi(argv[j])) {
- return UAP_FAILURE;
- }
- }
- }
- return UAP_SUCCESS;
-}
-
-/**
- * @brief convert string to hex integer
- *
- * @param s A pointer string buffer
- * @return hex integer
- */
-unsigned int
-a2hex(char *s)
-{
- unsigned int val = 0;
- if (!strncasecmp("0x", s, 2)) {
- s += 2;
- }
- while (*s && isxdigit(*s)) {
- val = (val << 4) + hexc2bin(*s++);
- }
- return val;
-}
-
-/**
- * @brief Dump hex data
- *
- * @param prompt A pointer prompt buffer
- * @param p A pointer to data buffer
- * @param len the len of data buffer
- * @param delim delim char
- * @return None
- */
-void
-hexdump_data(char *prompt, void *p, int len, char delim)
-{
- int i;
- unsigned char *s = p;
-
- if (prompt) {
- printf("%s: len=%d\n", prompt, (int) len);
- }
- for (i = 0; i < len; i++) {
- if (i != len - 1)
- printf("%02x%c", *s++, delim);
- else
- printf("%02x\n", *s);
- if ((i + 1) % 16 == 0)
- printf("\n");
- }
- printf("\n");
-}
-
-#if DEBUG
-/**
- * @brief conditional printf
- *
- * @param level severity level of the message
- * @param fmt printf format string, followed by optional arguments
- */
-void
-uap_printf(int level, char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- if (level <= debug_level) {
- vprintf(fmt, ap);
- }
- va_end(ap);
-}
-
-/**
- * @brief Dump hex data
- *
- * @param prompt A pointer prompt buffer
- * @param p A pointer to data buffer
- * @param len the len of data buffer
- * @param delim delim char
- * @return None
- */
-void
-hexdump(char *prompt, void *p, int len, char delim)
-{
- if (debug_level < MSG_ALL)
- return;
- hexdump_data(prompt, p, len, delim);
-}
-#endif
-
-/**
- * @brief Hex to number
- *
- * @param c Hex value
- * @return Integer value or -1
- */
-int
-hex2num(char c)
-{
- if (c >= '0' && c <= '9')
- return c - '0';
- if (c >= 'a' && c <= 'f')
- return c - 'a' + 10;
- if (c >= 'A' && c <= 'F')
- return c - 'A' + 10;
-
- return -1;
-}
-
-/**
- * @brief Show usage information for the sys_info command
- *
- * $return N/A
- */
-void
-print_sys_info_usage(void)
-{
- printf("\nUsage : sys_info\n");
- return;
-}
-
-/**
- * @brief Parse domain file for country information
- *
- * @param country Country name
- * @param sub_bands band information
- * @return number of band/ UAP_FAILURE
- */
-u8
-parse_domain_file(char *country, IEEEtypes_SubbandSet_t * sub_bands)
-{
- FILE *fp;
- char str[64];
- char domain_name[40];
- int cflag = 0;
- int dflag = 0;
- int found = 0;
- int j = -1, reset_j = 0;
- u8 no_of_sub_band = 0;
- char third;
- char country2[3];
-
- fp = fopen("80211d_domain.conf", "r");
- if (fp == NULL) {
- printf("File opening Error\n");
- return UAP_FAILURE;
- }
-
- strncpy((char *) country2, country, 2);
- country2[2] = '\0';
- third = country[2];
-
- /**
- * Search specific domain name
- */
- while (!feof(fp)) {
- fscanf(fp, "%s", str);
- if (cflag) {
- strcpy(domain_name, str);
- cflag = 0;
- }
- if (!strcmp(str, "COUNTRY:")) {
- /** store next string to domain_name */
- cflag = 1;
- }
-
- if (!strcmp(str, country2)) {
- /** Country is matched ;)*/
- if (third && !((third == 'I') || (third == 'O') || (third == ' ')))
- found = 0;
- else
- found = 1;
- break;
- }
- }
-
- if (!found) {
- printf("No match found for Country = %s in the 80211d_domain.conf \n",
- country);
- fclose(fp);
- found = 0;
- return UAP_FAILURE;
- }
-
- /**
- * Search domain specific information
- */
- while (!feof(fp)) {
- fscanf(fp, "%s", str);
-
- if (feof(fp) || (dflag && !strcmp(str, "DOMAIN:"))) {
- break;
- }
-
- if (dflag) {
- j++;
- if (strchr(str, ','))
- reset_j = 1;
-
- strcpy(str, strtok(str, ", "));
-
- if (str == NULL) {
- if (reset_j) {
- j = -1;
- reset_j = 0;
- }
- continue;
- }
-
- if (IS_HEX_OR_DIGIT(str) == UAP_FAILURE) {
- printf("ERR: Only Number values are allowed\n");
- fclose(fp);
- return UAP_FAILURE;
- }
-
- switch (j) {
- case 0:
- sub_bands[no_of_sub_band].FirstChan = (u8) A2HEXDECIMAL(str);
- break;
- case 1:
- sub_bands[no_of_sub_band].NoOfChan = (u8) A2HEXDECIMAL(str);
- break;
- case 2:
- sub_bands[no_of_sub_band++].MaxTxPwr = (u8) A2HEXDECIMAL(str);
- break;
- default:
- printf("ERR: Incorrect 80211d_domain.conf file\n");
- fclose(fp);
- return UAP_FAILURE;
- }
-
- if (reset_j) {
- j = -1;
- reset_j = 0;
- }
- }
-
- if (cflag && !strcmp(str, domain_name)) {
- /* Followed will be the band details */
- cflag = 0;
- dflag = 1;
- }
- if (!dflag && !strcmp(str, "DOMAIN:")) {
- cflag = 1;
- }
- }
- fclose(fp);
- return (no_of_sub_band);
-
-}
-
-/**
- *
- * @brief Set/Get SNMP MIB
- *
- * @param action 0-GET 1-SET
- * @param oid oid
- * @param size size of oid value
- * @param oid_buf oid value
- * @return UAP_FAILURE or UAP_SUCCESS
- *
- */
-int
-sg_snmp_mib(u16 action, u16 oid, u16 size, u8 * oid_buf)
-{
- APCMDBUF_SNMP_MIB *cmd_buf = NULL;
- TLVBUF_HEADER *tlv = NULL;
- int ret = UAP_FAILURE;
- u8 *buf = NULL;
- u16 buf_len;
- u16 cmd_len;
- int i;
-
- buf_len = sizeof(APCMDBUF_SNMP_MIB) + sizeof(TLVBUF_HEADER) + size;
- buf = (u8 *) malloc(buf_len);
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- return ret;
- }
- bzero((char *) buf, buf_len);
-
- /* Locate Headers */
- cmd_buf = (APCMDBUF_SNMP_MIB *) buf;
- tlv = (TLVBUF_HEADER *) (buf + sizeof(APCMDBUF_SNMP_MIB));
- cmd_buf->Size = buf_len - BUF_HEADER_SIZE;
- cmd_buf->Result = 0;
- cmd_buf->SeqNum = 0;
- cmd_buf->CmdCode = HostCmd_SNMP_MIB;
-
- tlv->Type = uap_cpu_to_le16(oid);
- tlv->Len = uap_cpu_to_le16(size);
- for (i = 0; action && (i < size); i++) {
- tlv->Data[i] = oid_buf[i];
- }
-
- cmd_buf->Action = uap_cpu_to_le16(action);
- cmd_len = buf_len;
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, buf_len);
- if (ret == UAP_SUCCESS) {
- if (cmd_buf->Result == CMD_SUCCESS) {
- if (!action) {
- /** Reloacte the headers */
- tlv =
- (TLVBUF_HEADER *) ((u8 *) cmd_buf +
- sizeof(APCMDBUF_SNMP_MIB));
- for (i = 0; i < MIN(uap_le16_to_cpu(tlv->Len), size); i++) {
- oid_buf[i] = tlv->Data[i];
- }
- }
- ret = UAP_SUCCESS;
- } else {
- printf("ERR:Command Response incorrect!\n");
- ret = UAP_FAILURE;
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- free(buf);
- return ret;
-}
-
-/**
- * @brief Creates a sys_info request and sends to the driver
- *
- * Usage: "sys_info"
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_sys_info(int argc, char *argv[])
-{
- APCMDBUF_SYS_INFO_REQUEST *cmd_buf = NULL;
- APCMDBUF_SYS_INFO_RESPONSE *response_buf = NULL;
- u8 *buf = NULL;
- u16 cmd_len;
- u16 buf_len;
- int ret = UAP_FAILURE;
- int opt;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_sys_info_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- /* Check arguments */
- if (argc != 0) {
- printf("ERR:Too many arguments.\n");
- print_sys_info_usage();
- return;
- }
-
- buf_len =
- (sizeof(APCMDBUF_SYS_INFO_REQUEST) >=
- sizeof(APCMDBUF_SYS_INFO_RESPONSE)) ? sizeof(APCMDBUF_SYS_INFO_REQUEST)
- : sizeof(APCMDBUF_SYS_INFO_RESPONSE);
-
- /* alloc buf for command */
- buf = (u8 *) malloc(buf_len);
-
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- return;
- }
- bzero((char *) buf, buf_len);
-
- /* Locate headers */
- cmd_len = sizeof(APCMDBUF_SYS_INFO_REQUEST);
- cmd_buf = (APCMDBUF_SYS_INFO_REQUEST *) buf;
- response_buf = (APCMDBUF_SYS_INFO_RESPONSE *) buf;
-
- /* Fill the command buffer */
- cmd_buf->CmdCode = APCMD_SYS_INFO;
- cmd_buf->Size = cmd_len;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, buf_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- /* Verify response */
- if (response_buf->CmdCode != (APCMD_SYS_INFO | APCMD_RESP_CHECK)) {
- printf("ERR:Corrupted response!\n");
- free(buf);
- return;
- }
- /* Print response */
- if (response_buf->Result == CMD_SUCCESS) {
- printf("System information = %s\n", response_buf->SysInfo);
- } else {
- printf("ERR:Could not retrieve system information!\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
-
- free(buf);
- return;
-}
-
-/**
- * @brief Show usage information for the powermode command
- *
- * $return N/A
- */
-void
-print_power_mode_usage(void)
-{
- printf
- ("\nUsage : powermode [MODE] [SLEEP_PARAM=1 CTRL MIN_SLEEP MAX_SLEEP]");
- printf("\n [INACT_PARAM=2 INACTTO MIN_AWAKE MAX_AWAKE]");
- printf("\nOptions: MODE : 0 - disable power mode");
- printf("\n 1 - periodic DTIM power save mode");
- printf("\n 2 - inactivity based power save mode");
- printf("\n SLEEP_PARAM:");
- printf
- ("\n CTRL: 0 - disable CTS2Self protection frame Tx before PS");
- printf
- ("\n 1 - enable CTS2Self protection frame Tx before PS");
- printf("\n MIN_SLEEP: Minimum sleep duration in microseconds");
- printf("\n MAX_SLEEP: Maximum sleep duration in miroseconds");
- printf("\n INACT_PARAM: (only for inactivity based power save mode)");
- printf("\n INACTTO: Inactivity timeout in miroseconds");
- printf("\n MIN_AWAKE: Minimum awake duration in microseconds");
- printf("\n MAX_AWAKE: Maximum awake duration in microseconds");
- printf("\n empty - get current power mode\n");
- return;
-}
-
-/**
- * @brief Set/get power mode
- *
- * @param pm A pointer to ps_mgmt structure
- * @return N/A
- */
-void
-send_power_mode_ioctl(ps_mgmt * pm)
-{
- struct ifreq ifr;
- s32 sockfd;
-
- /* Open socket */
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- printf("ERR:Cannot open socket\n");
- return;
- }
- /* Initialize the ifr structure */
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_ifrn.ifrn_name, dev_name, strlen(dev_name));
- ifr.ifr_ifru.ifru_data = (void *) pm;
- /* Perform ioctl */
- errno = 0;
- if (ioctl(sockfd, UAP_POWER_MODE, &ifr)) {
- perror("");
- printf("ERR:UAP_POWER_MODE is not supported by %s\n", dev_name);
- return;
- }
- switch (pm->ps_mode) {
- case 0:
- printf("power mode = Disabled\n");
- break;
- case 1:
- printf("power mode = Periodic DTIM PS\n");
- break;
- case 2:
- printf("power mode = Inactivity based PS \n");
- break;
- }
- if (pm->flags & PS_FLAG_SLEEP_PARAM) {
- printf("Sleep param:\n");
- printf("\tctrl_bitmap=%d\n", (int) pm->sleep_param.ctrl_bitmap);
- printf("\tmin_sleep=%d us\n", (int) pm->sleep_param.min_sleep);
- printf("\tmax_sleep=%d us\n", (int) pm->sleep_param.max_sleep);
- }
- if (pm->flags & PS_FLAG_INACT_SLEEP_PARAM) {
- printf("Inactivity sleep param:\n");
- printf("\tinactivity_to=%d us\n", (int) pm->inact_param.inactivity_to);
- printf("\tmin_awake=%d us\n", (int) pm->inact_param.min_awake);
- printf("\tmax_awake=%d us\n", (int) pm->inact_param.max_awake);
- }
- /* Close socket */
- close(sockfd);
- return;
-}
-
-/**
- * @brief Creates power mode request and send to driver
- * and sends to the driver
- *
- * Usage: "Usage : powermode [MODE]"
- *
- * Options: MODE : 0 - disable power mode
- * 1 - enable power mode
- * 2 - get current power mode
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_power_mode(int argc, char *argv[])
-{
- int opt;
- ps_mgmt pm;
- int type = 0;
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_power_mode_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- memset(&pm, 0, sizeof(ps_mgmt));
- /* Check arguments */
- if ((argc > 9) ||
- ((argc != 0) && (argc != 1) && (argc != 5) && (argc != 9))) {
- printf("ERR:wrong arguments.\n");
- print_power_mode_usage();
- return;
- }
-
- if (argc) {
- if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) < 0) ||
- (atoi(argv[0]) > 2)) {
- printf
- ("ERR:Illegal power mode %s. Must be either '0' '1' or '2'.\n",
- argv[0]);
- print_power_mode_usage();
- return;
- }
- pm.flags = PS_FLAG_PS_MODE;
- pm.ps_mode = atoi(argv[0]);
- if ((pm.ps_mode == PS_MODE_DISABLE) && (argc > 1)) {
- printf("ERR: Illegal parameter for disable power mode\n");
- print_power_mode_usage();
- return;
- }
- if ((pm.ps_mode != PS_MODE_INACTIVITY) && (argc > 5)) {
- printf("ERR: Illegal parameter\n");
- print_power_mode_usage();
- return;
- }
- if (argc >= 5) {
- if ((ISDIGIT(argv[1]) == 0) || (atoi(argv[1]) < 1) ||
- (atoi(argv[1]) > 2)) {
- printf
- ("ERR:Illegal parameter type %s. Must be either '1' or '2'.\n",
- argv[1]);
- print_power_mode_usage();
- return;
- }
- type = atoi(argv[1]);
- if ((type == INACTIVITY_SLEEP_PARAMETER) &&
- (pm.ps_mode != PS_MODE_INACTIVITY)) {
- printf
- ("ERR: inactivity sleep parameter only valid for inactivity power save mode\n");
- print_power_mode_usage();
- return;
- }
- if (type == SLEEP_PARAMETER) {
- if ((ISDIGIT(argv[2]) == 0) || (atoi(argv[2]) < 0) ||
- (atoi(argv[2]) > 1)) {
- printf
- ("ERR:Illegal ctrl bitmap = %s. Must be either '0' or '1'.\n",
- argv[2]);
- print_power_mode_usage();
- return;
- }
- pm.flags |= PS_FLAG_SLEEP_PARAM;
- pm.sleep_param.ctrl_bitmap = atoi(argv[2]);
- if ((ISDIGIT(argv[3]) == 0) || (ISDIGIT(argv[4]) == 0)) {
- printf("ERR:Illegal parameter\n");
- print_power_mode_usage();
- return;
- }
- pm.sleep_param.min_sleep = atoi(argv[3]);
- pm.sleep_param.max_sleep = atoi(argv[4]);
- if (pm.sleep_param.min_sleep > pm.sleep_param.max_sleep) {
- printf
- ("ERR: MIN_SLEEP value should be less than or equal to MAX_SLEEP\n");
- return;
- }
- if (pm.sleep_param.min_sleep < PS_SLEEP_PARAM_MIN ||
- ((pm.sleep_param.max_sleep > PS_SLEEP_PARAM_MAX) &&
- pm.sleep_param.ctrl_bitmap)) {
- printf
- ("ERR: Incorrect value of sleep period. Please check README\n");
- return;
- }
- } else {
- if ((ISDIGIT(argv[2]) == 0) || (ISDIGIT(argv[3]) == 0) ||
- (ISDIGIT(argv[4]) == 0)) {
- printf("ERR:Illegal parameter\n");
- print_power_mode_usage();
- return;
- }
- pm.flags |= PS_FLAG_INACT_SLEEP_PARAM;
- pm.inact_param.inactivity_to = atoi(argv[2]);
- pm.inact_param.min_awake = atoi(argv[3]);
- pm.inact_param.max_awake = atoi(argv[4]);
- if (pm.inact_param.min_awake > pm.inact_param.max_awake) {
- printf
- ("ERR: MIN_AWAKE value should be less than or equal to MAX_AWAKE\n");
- return;
- }
- if (pm.inact_param.min_awake < PS_AWAKE_PERIOD_MIN) {
- printf("ERR: Incorrect value of MIN_AWAKE period.\n");
- return;
- }
- }
- }
- if (argc == 9) {
- if ((ISDIGIT(argv[5]) == 0) || (atoi(argv[5]) < 1) ||
- (atoi(argv[5]) > 2)) {
- printf
- ("ERR:Illegal parameter type %s. Must be either '1' or '2'.\n",
- argv[5]);
- print_power_mode_usage();
- return;
- }
- if (type == atoi(argv[5])) {
- printf("ERR: Duplicate parameter type %s.\n", argv[5]);
- print_power_mode_usage();
- return;
- }
- type = atoi(argv[5]);
- if (type == SLEEP_PARAMETER) {
- if ((ISDIGIT(argv[6]) == 0) || (atoi(argv[6]) < 0) ||
- (atoi(argv[6]) > 1)) {
- printf
- ("ERR:Illegal ctrl bitmap = %s. Must be either '0' or '1'.\n",
- argv[6]);
- print_power_mode_usage();
- return;
- }
- pm.flags |= PS_FLAG_SLEEP_PARAM;
- pm.sleep_param.ctrl_bitmap = atoi(argv[6]);
- if ((ISDIGIT(argv[7]) == 0) || (ISDIGIT(argv[8]) == 0)) {
- printf("ERR:Illegal parameter\n");
- print_power_mode_usage();
- return;
- }
- pm.sleep_param.min_sleep = atoi(argv[7]);
- pm.sleep_param.max_sleep = atoi(argv[8]);
- if (pm.sleep_param.min_sleep > pm.sleep_param.max_sleep) {
- printf
- ("ERR: MIN_SLEEP value should be less than or equal to MAX_SLEEP\n");
- return;
- }
- if (pm.sleep_param.min_sleep < PS_SLEEP_PARAM_MIN ||
- ((pm.sleep_param.max_sleep > PS_SLEEP_PARAM_MAX) &&
- pm.sleep_param.ctrl_bitmap)) {
- printf
- ("ERR: Incorrect value of sleep period. Please check README\n");
- return;
- }
- } else {
- if ((ISDIGIT(argv[6]) == 0) || (ISDIGIT(argv[7]) == 0) ||
- (ISDIGIT(argv[8]) == 0)) {
- printf("ERR:Illegal parameter\n");
- print_power_mode_usage();
- return;
- }
- pm.flags |= PS_FLAG_INACT_SLEEP_PARAM;
- pm.inact_param.inactivity_to = atoi(argv[6]);
- pm.inact_param.min_awake = atoi(argv[7]);
- pm.inact_param.max_awake = atoi(argv[8]);
- if (pm.inact_param.min_awake > pm.inact_param.max_awake) {
- printf
- ("ERR: MIN_AWAKE value should be less than or equal to MAX_AWAKE\n");
- return;
- }
- if (pm.inact_param.min_awake < PS_AWAKE_PERIOD_MIN) {
- printf("ERR: Incorrect value of MIN_AWAKE period.\n");
- return;
- }
- }
- }
- }
- send_power_mode_ioctl(&pm);
- return;
-}
-
-/**
- * @brief Show usage information for the sys_reset command
- *
- * $return N/A
- */
-void
-print_sys_reset_usage(void)
-{
- printf("\nUsage : sys_reset\n");
- return;
-}
-
-/**
- * @brief Creates a sys_reset request and sends to the driver
- *
- * Usage: "sys_reset"
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_sys_reset(int argc, char *argv[])
-{
- APCMDBUF_SYS_RESET *cmd_buf = NULL;
- u8 *buffer = NULL;
- u16 cmd_len;
- int ret = UAP_FAILURE;
- int opt;
- ps_mgmt pm;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_sys_reset_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- /* Check arguments */
- if (argc != 0) {
- printf("ERR:Too many arguments.\n");
- print_sys_reset_usage();
- return;
- }
-
- memset(&pm, 0, sizeof(ps_mgmt));
- pm.flags = PS_FLAG_PS_MODE;
- pm.ps_mode = PS_MODE_DISABLE;
- send_power_mode_ioctl(&pm);
-
- /* Initialize the command length */
- cmd_len = sizeof(APCMDBUF_SYS_RESET);
-
- /* Initialize the command buffer */
- buffer = (u8 *) malloc(cmd_len);
-
- if (!buffer) {
- printf("ERR:Cannot allocate buffer for command!\n");
- return;
- }
- bzero((char *) buffer, cmd_len);
-
- /* Locate headers */
- cmd_buf = (APCMDBUF_SYS_RESET *) buffer;
-
- /* Fill the command buffer */
- cmd_buf->CmdCode = APCMD_SYS_RESET;
- cmd_buf->Size = cmd_len;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, cmd_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- /* Verify response */
- if (cmd_buf->CmdCode != (APCMD_SYS_RESET | APCMD_RESP_CHECK)) {
- printf("ERR:Corrupted response!\n");
- free(buffer);
- return;
- }
- /* Print response */
- if (cmd_buf->Result == CMD_SUCCESS) {
- printf("System reset successful!\n");
- } else {
- printf("ERR:Could not reset system!\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- if (buffer)
- free(buffer);
- return;
-}
-
-/**
- * @brief Show usage information for the bss_start command
- *
- * $return N/A
- */
-void
-print_bss_start_usage(void)
-{
- printf("\nUsage : bss_start\n");
- return;
-}
-
-/**
- * @brief Creates a BSS start request and sends to the driver
- *
- * Usage: "bss_start"
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_bss_start(int argc, char *argv[])
-{
- APCMDBUF_BSS_START *cmd_buf = NULL;
- u8 *buffer = NULL;
- u16 cmd_len;
- int ret = UAP_FAILURE;
- int opt;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_bss_start_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- /* Check arguments */
- if (argc != 0) {
- printf("ERR:Too many arguments.\n");
- print_bss_start_usage();
- return;
- }
-
- /* Initialize the command length */
- cmd_len = sizeof(APCMDBUF_BSS_START);
-
- /* Initialize the command buffer */
- buffer = (u8 *) malloc(cmd_len);
-
- if (!buffer) {
- printf("ERR:Cannot allocate buffer for command!\n");
- return;
- }
- bzero((char *) buffer, cmd_len);
-
- /* Locate headers */
- cmd_buf = (APCMDBUF_BSS_START *) buffer;
-
- /* Fill the command buffer */
- cmd_buf->CmdCode = APCMD_BSS_START;
- cmd_buf->Size = cmd_len;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, cmd_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- /* Verify response */
- if (cmd_buf->CmdCode != (APCMD_BSS_START | APCMD_RESP_CHECK)) {
- printf("ERR:Corrupted response!\n");
- free(buffer);
- return;
- }
-
- /* Print response */
- if (cmd_buf->Result == CMD_SUCCESS) {
- printf("BSS started!\n");
- } else if (cmd_buf->Result == BSS_FAILURE_START_INVAL) {
- printf("ERR:Could not start BSS! Invalid BSS parameters.\n");
- } else if (cmd_buf->Result == BSS_FAILURE_START_REDUNDANT) {
- printf("ERR:Could not start BSS! BSS already started.\n");
- } else {
- printf("ERR:Could not start BSS!\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- if (buffer)
- free(buffer);
- return;
-}
-
-/**
- * @brief Show usage information for the bss_stop command
- *
- * $return N/A
- */
-void
-print_bss_stop_usage(void)
-{
- printf("\nUsage : bss_stop\n");
- return;
-}
-
-/**
- * @brief Creates a BSS stop request and sends to the driver
- *
- * Usage: "bss_stop"
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_bss_stop(int argc, char *argv[])
-{
- APCMDBUF_BSS_STOP *cmd_buf = NULL;
- u8 *buffer = NULL;
- u16 cmd_len;
- int ret = UAP_FAILURE;
- int opt;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_bss_stop_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind; /* Check arguments */
-
- if (argc != 0) {
- printf("ERR:Too many arguments.\n");
- print_bss_stop_usage();
- }
-
- /* Initialize the command length */
- cmd_len = sizeof(APCMDBUF_BSS_STOP);
-
- /* Initialize the command buffer */
- buffer = (u8 *) malloc(cmd_len);
-
- if (!buffer) {
- printf("ERR:Cannot allocate buffer for command!\n");
- return;
- }
- bzero((char *) buffer, cmd_len);
-
- /* Locate headers */
- cmd_buf = (APCMDBUF_BSS_STOP *) buffer;
-
- /* Fill the command buffer */
- cmd_buf->CmdCode = APCMD_BSS_STOP;
- cmd_buf->Size = cmd_len;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, cmd_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- /* Verify response */
- if (cmd_buf->CmdCode != (APCMD_BSS_STOP | APCMD_RESP_CHECK)) {
- printf("ERR:Corrupted response!\n");
- free(buffer);
- return;
- }
-
- /* Print response */
- if (cmd_buf->Result == CMD_SUCCESS) {
- printf("BSS stopped!\n");
- } else if (cmd_buf->Result == BSS_FAILURE_STOP_REDUNDANT) {
- printf("ERR:Could not stop BSS! BSS already stopped.\n");
- } else if (cmd_buf->Result == BSS_FAILURE_STOP_INVAL) {
- printf("ERR:Could not stop BSS! No active BSS.\n");
- } else {
- printf("ERR:Could not stop BSS!\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- if (buffer)
- free(buffer);
- return;
-}
-
-/**
- * @brief Show usage information for the sta_list command
- *
- * $return N/A
- */
-void
-print_sta_list_usage(void)
-{
- printf("\nUsage : sta_list\n");
- return;
-}
-
-/**
- * @brief Creates a STA list request and sends to the driver
- *
- * Usage: "sta_list"
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_sta_list(int argc, char *argv[])
-{
- APCMDBUF_STA_LIST_REQUEST *cmd_buf = NULL;
- APCMDBUF_STA_LIST_RESPONSE *response_buf = NULL;
- u8 *buf = NULL;
- u16 buf_len;
- TLVBUF_STA_INFO *tlv = NULL;
- u16 cmd_len;
- u16 response_len;
- int ret = UAP_FAILURE;
- int i = 0;
- int opt;
- int rssi = 0;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_sta_list_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- /* Check arguments */
- if (argc != 0) {
- printf("ERR:Too many arguments.\n");
- print_sta_list_usage();
- return;
- }
- response_len =
- sizeof(APCMDBUF_STA_LIST_RESPONSE) +
- (MAX_NUM_CLIENTS * sizeof(TLVBUF_STA_INFO));
- if (response_len > sizeof(APCMDBUF_STA_LIST_REQUEST))
- buf_len = response_len;
- else
- buf_len = sizeof(APCMDBUF_STA_LIST_REQUEST);
-
- /* Initialize the command length */
- cmd_len = sizeof(APCMDBUF_STA_LIST_REQUEST);
-
- /* Initialize the command buffer */
- buf = (u8 *) malloc(buf_len);
-
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- return;
- }
- bzero((char *) buf, buf_len);
-
- /* Locate headers */
- cmd_buf = (APCMDBUF_STA_LIST_REQUEST *) buf;
- response_buf = (APCMDBUF_STA_LIST_RESPONSE *) buf;
-
- /* Fill the command buffer */
- cmd_buf->CmdCode = APCMD_STA_LIST;
- cmd_buf->Size = cmd_len;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, buf_len);
- response_buf->StaCount = uap_le16_to_cpu(response_buf->StaCount);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- /* Verify response */
- if (response_buf->CmdCode != (APCMD_STA_LIST | APCMD_RESP_CHECK)) {
- printf("ERR:Corrupted response!\n");
- free(buf);
- return;
- }
-
- /* Print response */
- if (response_buf->Result == CMD_SUCCESS) {
- printf("Number of STA = %d\n\n", response_buf->StaCount);
- for (i = 0; i < response_buf->StaCount; i++) {
- tlv = (TLVBUF_STA_INFO *) (&response_buf->StaList[i]);
- endian_convert_tlv_header_in(tlv);
- if (tlv) {
- if (tlv->Tag != MRVL_STA_INFO_TLV_ID) {
- printf("STA %d information corrupted.\n", i + 1);
- continue;
- }
- printf("STA %d information:\n", i + 1);
- printf("=====================\n");
- printf("MAC Address: ");
- print_mac(tlv->MacAddress);
- printf("\nPower mfg status: %s\n",
- (tlv->PowerMfgStatus ==
- 0) ? "active" : "power save");
- /** On some platform, s8 is same as unsigned char*/
- rssi = (int) tlv->Rssi;
- if (rssi > 0x7f)
- rssi = -(256 - rssi);
- printf("Rssi : %d dBm\n\n", rssi);
- } else {
- printf("ERR:Unable to find information for STA %d\n\n",
- i + 1);
- }
- }
- } else {
- printf("ERR:Could not get STA list!\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- free(buf);
- return;
-}
-
-/**
- * @brief Show usage information for the sta_deauth command
- *
- * $return N/A
- */
-void
-print_sta_deauth_usage(void)
-{
- printf("\nUsage : sta_deauth <STA_MAC_ADDRESS> [REASON_CODE]\n");
- return;
-}
-
-/**
- * @brief Creates a STA deauth request and sends to the driver
- *
- * Usage: "sta_deauth <STA_MAC_ADDRESS>"
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_sta_deauth(int argc, char *argv[])
-{
- APCMDBUF_STA_DEAUTH *cmd_buf = NULL;
- u8 *buffer = NULL;
- u16 cmd_len;
- int ret = UAP_FAILURE;
- int opt;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_sta_deauth_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- /* Check arguments */
- if (argc != 1 && argc != 2) {
- printf("ERR:wrong arguments! Must provide STA_MAC_ADDRESS.\n");
- printf("\t\t with optional REASON_CODE.\n");
- print_sta_deauth_usage();
- return;
- }
-
- /* Check Reason Code */
- if (argc == 2) {
- if (IS_HEX_OR_DIGIT(argv[1]) == UAP_FAILURE) {
- printf("ERR: Invalid input for reason code\n");
- print_sta_deauth_usage();
- return;
- }
- }
-
- /* Initialize the command length */
- cmd_len = sizeof(APCMDBUF_STA_DEAUTH);
-
- /* Initialize the command buffer */
- buffer = (u8 *) malloc(cmd_len);
- if (!buffer) {
- printf("ERR:Cannot allocate buffer for command!\n");
- return;
- }
- bzero((char *) buffer, cmd_len);
-
- /* Locate headers */
- cmd_buf = (APCMDBUF_STA_DEAUTH *) buffer;
-
- /* Fill the command buffer */
- cmd_buf->CmdCode = APCMD_STA_DEAUTH;
- cmd_buf->Size = cmd_len - BUF_HEADER_SIZE;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
- if ((ret = mac2raw(argv[0], cmd_buf->StaMacAddress)) != UAP_SUCCESS) {
- printf("ERR: %s Address\n", ret == UAP_FAILURE ? "Invalid MAC" :
- ret == UAP_RET_MAC_BROADCAST ? "Broadcast" : "Multicast");
- free(buffer);
- return;
- }
- if (argc == 2) {
- cmd_buf->ReasonCode = uap_cpu_to_le16((u16) A2HEXDECIMAL(argv[1]));
- }
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, cmd_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- /* Verify response */
- if (cmd_buf->CmdCode != (APCMD_STA_DEAUTH | APCMD_RESP_CHECK)) {
- printf("ERR:Corrupted response!\n");
- free(buffer);
- return;
- }
-
- /* Print response */
- if (cmd_buf->Result == CMD_SUCCESS) {
- printf("Deauthentication successful!\n");
- } else {
- printf("ERR:Deauthentication unsuccessful!\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- if (buffer)
- free(buffer);
- return;
-}
-
-/**
- * @brief Show usage information for the coex_config command
- *
- * $return N/A
- */
-void
-print_coex_config_usage(void)
-{
- printf("\nUsage : coex_config [CONFIG_FILE]\n");
- printf
- ("\nIf CONFIG_FILE is provided, a 'set' is performed, else a 'get' is performed.\n");
- return;
-}
-
-/**
- * @brief Creates a coex_config request and sends to the driver
- *
- * Usage: "Usage : coex_config [CONFIG_FILE]"
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return UAP_SUCCESS or UAP_FAILURE
- */
-void
-apcmd_coex_config(int argc, char *argv[])
-{
- apcmdbuf_coex_config *cmd_buf = NULL;
- tlvbuf_coex_common_cfg *coex_common_tlv;
- tlvbuf_coex_sco_cfg *coex_sco_tlv;
- tlvbuf_coex_acl_cfg *coex_acl_tlv;
- tlvbuf_coex_stats *coex_stats_tlv;
- u8 *buf = NULL;
- u16 cmd_len;
- int ret = UAP_FAILURE;
- int opt;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_coex_config_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- /* Check arguments */
- if (argc > 1) {
- printf("ERR:Too many arguments.\n");
- print_coex_config_usage();
- return;
- }
- if (argc == 1) {
- /* Read profile and send command to firmware */
- apcmd_coex_config_profile(argc, argv);
- return;
- }
-
- /* fixed command length */
- cmd_len = sizeof(apcmdbuf_coex_config) + sizeof(tlvbuf_coex_common_cfg)
- + sizeof(tlvbuf_coex_sco_cfg) + sizeof(tlvbuf_coex_acl_cfg)
- + sizeof(tlvbuf_coex_stats);
- /* alloc buf for command */
- buf = (u8 *) malloc(cmd_len);
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- return;
- }
- bzero((char *) buf, cmd_len);
-
- cmd_buf = (apcmdbuf_coex_config *) buf;
-
- coex_common_tlv = (tlvbuf_coex_common_cfg *) cmd_buf->tlv_buffer;
- coex_common_tlv->Tag = MRVL_BT_COEX_COMMON_CFG_TLV_ID;
- coex_common_tlv->Length =
- sizeof(tlvbuf_coex_common_cfg) - sizeof(TLVBUF_HEADER);
- endian_convert_tlv_header_out(coex_common_tlv);
-
- coex_sco_tlv = (tlvbuf_coex_sco_cfg *) (cmd_buf->tlv_buffer +
- sizeof(tlvbuf_coex_common_cfg));
- coex_sco_tlv->Tag = MRVL_BT_COEX_SCO_CFG_TLV_ID;
- coex_sco_tlv->Length = sizeof(tlvbuf_coex_sco_cfg) - sizeof(TLVBUF_HEADER);
- endian_convert_tlv_header_out(coex_sco_tlv);
-
- coex_acl_tlv = (tlvbuf_coex_acl_cfg *) (cmd_buf->tlv_buffer +
- sizeof(tlvbuf_coex_common_cfg) +
- sizeof(tlvbuf_coex_sco_cfg));
- coex_acl_tlv->Tag = MRVL_BT_COEX_ACL_CFG_TLV_ID;
- coex_acl_tlv->Length = sizeof(tlvbuf_coex_acl_cfg) - sizeof(TLVBUF_HEADER);
- endian_convert_tlv_header_out(coex_acl_tlv);
-
- coex_stats_tlv = (tlvbuf_coex_stats *) (cmd_buf->tlv_buffer +
- sizeof(tlvbuf_coex_common_cfg) +
- sizeof(tlvbuf_coex_sco_cfg)
- + sizeof(tlvbuf_coex_acl_cfg));
- coex_stats_tlv->Tag = MRVL_BT_COEX_STATS_TLV_ID;
- coex_stats_tlv->Length = sizeof(tlvbuf_coex_stats) - sizeof(TLVBUF_HEADER);
- endian_convert_tlv_header_out(coex_stats_tlv);
-
- /* Fill the command buffer */
- cmd_buf->CmdCode = HostCmd_ROBUST_COEX;
- cmd_buf->Size = cmd_len - BUF_HEADER_SIZE;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
- cmd_buf->action = uap_cpu_to_le16(ACTION_GET);
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, cmd_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- /* Verify response */
- if (cmd_buf->CmdCode != (HostCmd_ROBUST_COEX | APCMD_RESP_CHECK)) {
- printf("ERR:Corrupted response!\n");
- free(buf);
- return;
- }
- /* Print response */
- if (cmd_buf->Result == CMD_SUCCESS) {
- printf("BT Coex settings:\n");
- print_tlv(buf + sizeof(apcmdbuf_coex_config),
- cmd_buf->Size - sizeof(apcmdbuf_coex_config) +
- BUF_HEADER_SIZE);
- } else {
- printf("ERR:Could not retrieve coex configuration.\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- free(buf);
- return;
-}
-
-/**
- * @brief Show usage information for the sys_config command
- *
- * $return N/A
- */
-void
-print_sys_config_usage(void)
-{
- printf("\nUsage : sys_config [CONFIG_FILE]\n");
- printf
- ("\nIf CONFIG_FILE is provided, a 'set' is performed, else a 'get' is performed.\n");
- printf("CONFIG_FILE is file contain all the Micro AP settings.\n");
- return;
-}
-
-/**
- * @brief Show usage information for the rdeeprom command
- *
- * $return N/A
- */
-void
-print_apcmd_read_eeprom_usage(void)
-{
- printf("\nUsage: rdeeprom <offset> <bytecount>\n");
- printf(" offset : 0,4,8,..., multiple of 4\n");
- printf(" bytecount : 4-20, multiple of 4\n");
- return;
-}
-
-/**
- * @brief Show protocol tlv
- *
- * @param tlv Poniter to protocol tlv
- *
- * $return N/A
- */
-void
-print_protocol(TLVBUF_PROTOCOL * tlv)
-{
- switch (tlv->Protocol) {
- case 0:
- case PROTOCOL_NO_SECURITY:
- printf("PROTOCOL = No security\n");
- break;
- case PROTOCOL_STATIC_WEP:
- printf("PROTOCOL = Static WEP\n");
- break;
- case PROTOCOL_WPA:
- printf("PROTOCOL = WPA \n");
- break;
- case PROTOCOL_WPA2:
- printf("PROTOCOL = WPA2 \n");
- break;
- case PROTOCOL_WPA | PROTOCOL_WPA2:
- printf("PROTOCOL = WPA/WPA2 \n");
- break;
- default:
- printf("Unknown PROTOCOL: 0x%x \n", tlv->Protocol);
- break;
- }
-}
-
-/**
- * @brief Show wep tlv
- *
- * @param tlv Poniter to wep tlv
- *
- * $return N/A
- */
-void
-print_wep_key(TLVBUF_WEP_KEY * tlv)
-{
- int i;
- if (tlv->Length <= 2) {
- printf("wrong wep_key tlv: length=%d\n", tlv->Length);
- return;
- }
- printf("WEP KEY_%d = ", tlv->KeyIndex);
- for (i = 0; i < tlv->Length - 2; i++)
- printf("%02x ", tlv->Key[i]);
- if (tlv->IsDefault)
- printf("\nDefault WEP Key = %d\n", tlv->KeyIndex);
- else
- printf("\n");
-}
-
-/**
- * @brief Parses a command line
- *
- * @param line The line to parse
- * @param args Pointer to the argument buffer to be filled in
- * @return Number of arguments in the line or EOF
- */
-static int
-parse_line(char *line, char *args[])
-{
- int arg_num = 0;
- int is_start = 0;
- int is_quote = 0;
- int length = 0;
- int i = 0;
-
- arg_num = 0;
- length = strlen(line);
- /* Process line */
-
- /* Find number of arguments */
- is_start = 0;
- is_quote = 0;
- for (i = 0; i < length; i++) {
- /* Ignore leading spaces */
- if (is_start == 0) {
- if (line[i] == ' ') {
- continue;
- } else if (line[i] == '\t') {
- continue;
- } else if (line[i] == '\n') {
- break;
- } else {
- is_start = 1;
- args[arg_num] = &line[i];
- arg_num++;
- }
- }
- if (is_start == 1) {
- /* Ignore comments */
- if (line[i] == '#') {
- line[i] = '\0';
- arg_num--;
- break;
- }
- /* Separate by '=' */
- if (line[i] == '=') {
- line[i] = '\0';
- is_start = 0;
- continue;
- }
- /* Separate by ',' */
- if (line[i] == ',') {
- line[i] = '\0';
- is_start = 0;
- continue;
- }
- /* Change ',' to ' ', but not inside quotes */
- if ((line[i] == ',') && (is_quote == 0)) {
- line[i] = ' ';
- continue;
- }
- }
- /* Remove newlines */
- if (line[i] == '\n') {
- line[i] = '\0';
- }
- /* Check for quotes */
- if (line[i] == '"') {
- is_quote = (is_quote == 1) ? 0 : 1;
- continue;
- }
- if (((line[i] == ' ') || (line[i] == '\t')) && (is_quote == 0)) {
- line[i] = '\0';
- is_start = 0;
- continue;
- }
- }
- return arg_num;
-}
-
-/**
- * @brief Parse function for a configuration line
- *
- * @param s Storage buffer for data
- * @param size Maximum size of data
- * @param stream File stream pointer
- * @param line Pointer to current line within the file
- * @param _pos Output string or NULL
- * @return String or NULL
- */
-static char *
-config_get_line(char *s, int size, FILE * stream, int *line, char **_pos)
-{
- char *pos, *end, *sstart;
- while (fgets(s, size, stream)) {
- (*line)++;
- s[size - 1] = '\0';
- pos = s;
- /* Skip white space from the beginning of line. */
- while (*pos == ' ' || *pos == '\t' || *pos == '\r')
- pos++;
- /* Skip comment lines and empty lines */
- if (*pos == '#' || *pos == '\n' || *pos == '\0')
- continue;
- /*
- * Remove # comments unless they are within a double quoted
- * string.
- */
- sstart = strchr(pos, '"');
- if (sstart)
- sstart = strrchr(sstart + 1, '"');
- if (!sstart)
- sstart = pos;
- end = strchr(sstart, '#');
- if (end)
- *end-- = '\0';
- else
- end = pos + strlen(pos) - 1;
- /* Remove trailing white space. */
- while (end > pos &&
- (*end == '\n' || *end == ' ' || *end == '\t' || *end == '\r'))
- *end-- = '\0';
- if (*pos == '\0')
- continue;
- if (_pos)
- *_pos = pos;
- return pos;
- }
-
- if (_pos)
- *_pos = NULL;
- return NULL;
-}
-
-/**
- * @brief Read the profile and sends to the driver
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return UAP_SUCCESS or UAP_FAILURE
- */
-void
-apcmd_coex_config_profile(int argc, char *argv[])
-{
- FILE *config_file = NULL;
- char *line = NULL;
- int i, ret, index, li = 0;
- char *pos = NULL;
- int arg_num = 0;
- char *args[30];
- int is_coex_config = 0;
- int is_coex_common_config = 0;
- int is_coex_sco_config = 0;
- int is_coex_acl_config = 0;
- u8 *buf = NULL;
- apcmdbuf_coex_config *cmd_buf = NULL;
- tlvbuf_coex_common_cfg *coex_common_tlv;
- tlvbuf_coex_sco_cfg *coex_sco_tlv;
- tlvbuf_coex_acl_cfg *coex_acl_tlv;
- u16 acl_enabled = 0;
- u32 conf_bitmap = 0;
- u16 cmd_len = 0, tlv_len = 0;
- u16 sco_prot_qtime[4] = { 0, 0, 0, 0 }, sco_prot_rate = 0, sco_acl_freq = 0;
- u16 acl_bt_time = 0, acl_wlan_time = 0, acl_prot_rate = 0;
-
- /* Check if file exists */
- config_file = fopen(argv[0], "r");
- if (config_file == NULL) {
- printf("\nERR:Config file can not open.\n");
- return;
- }
- line = (char *) malloc(MAX_CONFIG_LINE);
- if (!line) {
- printf("ERR:Cannot allocate memory for line\n");
- goto done;
- }
- bzero(line, MAX_CONFIG_LINE);
-
- /* fixed command length */
- cmd_len = sizeof(apcmdbuf_coex_config) + sizeof(tlvbuf_coex_common_cfg)
- + sizeof(tlvbuf_coex_sco_cfg) + sizeof(tlvbuf_coex_acl_cfg);
- /* alloc buf for command */
- buf = (u8 *) malloc(cmd_len);
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- goto done;
- }
- bzero((char *) buf, cmd_len);
-
- cmd_buf = (apcmdbuf_coex_config *) buf;
-
- /* Fill the command buffer */
- cmd_buf->CmdCode = HostCmd_ROBUST_COEX;
- cmd_buf->Size = cmd_len - BUF_HEADER_SIZE;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
- cmd_buf->action = uap_cpu_to_le16(ACTION_SET);
-
- /* Parse file and process */
- while (config_get_line(line, MAX_CONFIG_LINE, config_file, &li, &pos)) {
-#if DEBUG
- uap_printf(MSG_DEBUG, "DBG:Received config line (%d) = %s\n", li, line);
-#endif
- arg_num = parse_line(line, args);
-#if DEBUG
- uap_printf(MSG_DEBUG, "DBG:Number of arguments = %d\n", arg_num);
- for (i = 0; i < arg_num; i++) {
- uap_printf(MSG_DEBUG, "\tDBG:Argument %d. %s\n", i + 1, args[i]);
- }
-#endif
- /* Check for end of Coex configurations */
- if (is_coex_acl_config == 1) {
- if (strcmp(args[0], "}") == 0) {
- coex_acl_tlv =
- (tlvbuf_coex_acl_cfg *) (cmd_buf->tlv_buffer + tlv_len);
- coex_acl_tlv->Tag = MRVL_BT_COEX_ACL_CFG_TLV_ID;
- coex_acl_tlv->Length =
- sizeof(tlvbuf_coex_acl_cfg) - sizeof(TLVBUF_HEADER);
- endian_convert_tlv_header_out(coex_acl_tlv);
- coex_acl_tlv->enabled = uap_cpu_to_le16(acl_enabled);
- coex_acl_tlv->bt_time = uap_cpu_to_le16(acl_bt_time);
- coex_acl_tlv->wlan_time = uap_cpu_to_le16(acl_wlan_time);
- coex_acl_tlv->protection_rate = uap_cpu_to_le16(acl_prot_rate);
- tlv_len += sizeof(tlvbuf_coex_acl_cfg);
- is_coex_acl_config = 0;
- }
- } else if (is_coex_sco_config == 1) {
- if (strcmp(args[0], "}") == 0) {
- coex_sco_tlv =
- (tlvbuf_coex_sco_cfg *) (cmd_buf->tlv_buffer + tlv_len);
- coex_sco_tlv->Tag = MRVL_BT_COEX_SCO_CFG_TLV_ID;
- coex_sco_tlv->Length =
- sizeof(tlvbuf_coex_sco_cfg) - sizeof(TLVBUF_HEADER);
- endian_convert_tlv_header_out(coex_sco_tlv);
- for (i = 0; i < 4; i++)
- coex_sco_tlv->protection_qtime[i] =
- uap_cpu_to_le16(sco_prot_qtime[i]);
- coex_sco_tlv->protection_rate = uap_cpu_to_le16(sco_prot_rate);
- coex_sco_tlv->acl_frequency = uap_cpu_to_le16(sco_acl_freq);
- tlv_len += sizeof(tlvbuf_coex_sco_cfg);
- is_coex_sco_config = 0;
- }
- } else if (is_coex_common_config == 1) {
- if (strcmp(args[0], "}") == 0) {
- coex_common_tlv =
- (tlvbuf_coex_common_cfg *) (cmd_buf->tlv_buffer + tlv_len);
- coex_common_tlv->Tag = MRVL_BT_COEX_COMMON_CFG_TLV_ID;
- coex_common_tlv->Length =
- sizeof(tlvbuf_coex_common_cfg) - sizeof(TLVBUF_HEADER);
- endian_convert_tlv_header_out(coex_common_tlv);
- coex_common_tlv->config_bitmap = uap_cpu_to_le32(conf_bitmap);
- tlv_len += sizeof(tlvbuf_coex_common_cfg);
- is_coex_common_config = 0;
- }
- } else if (is_coex_config == 1) {
- if (strcmp(args[0], "}") == 0)
- is_coex_config = 0;
- }
- if (strcmp(args[0], "coex_config") == 0) {
- is_coex_config = 1;
- } else if (strcmp(args[0], "common_config") == 0) {
- is_coex_common_config = 1;
- } else if (strcmp(args[0], "sco_config") == 0) {
- is_coex_sco_config = 1;
- } else if (strcmp(args[0], "acl_config") == 0) {
- is_coex_acl_config = 1;
- }
- if ((strcmp(args[0], "bitmap") == 0) && is_coex_common_config) {
- if (is_input_valid(COEX_COMM_BITMAP, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- conf_bitmap = (u32) A2HEXDECIMAL(args[1]);
- } else if ((strncmp(args[0], "protectionFromQTime", 19) == 0) &&
- is_coex_sco_config) {
- index = atoi(args[0] + strlen("protectionFromQTime"));
- if (index < 0 || index > 3) {
- printf("ERR:Incorrect index %d.\n", index);
- goto done;
- }
- if (is_input_valid(COEX_PROTECTION, arg_num, args) != UAP_SUCCESS) {
- goto done;
- }
- sco_prot_qtime[index] = (u16) atoi(args[1]);
- } else if ((strcmp(args[0], "scoProtectionFromRate") == 0) &&
- is_coex_sco_config) {
- if (is_input_valid(COEX_PROTECTION, arg_num, args) != UAP_SUCCESS) {
- goto done;
- }
- sco_prot_rate = (u16) atoi(args[1]);
- } else if ((strcmp(args[0], "aclFrequency") == 0) && is_coex_sco_config) {
- if (is_input_valid(COEX_SCO_ACL_FREQ, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- sco_acl_freq = (u16) atoi(args[1]);
- } else if ((strcmp(args[0], "enabled") == 0) && is_coex_acl_config) {
- if (is_input_valid(COEX_ACL_ENABLED, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- acl_enabled = (u16) atoi(args[1]);
- } else if ((strcmp(args[0], "btTime") == 0) && is_coex_acl_config) {
- if (is_input_valid(COEX_ACL_BT_TIME, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- acl_bt_time = (u16) atoi(args[1]);
- } else if ((strcmp(args[0], "wlanTime") == 0) && is_coex_acl_config) {
- if (is_input_valid(COEX_ACL_WLAN_TIME, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- acl_wlan_time = (u16) atoi(args[1]);
- } else if ((strcmp(args[0], "aclProtectionFromRate") == 0) &&
- is_coex_acl_config) {
- if (is_input_valid(COEX_PROTECTION, arg_num, args) != UAP_SUCCESS) {
- goto done;
- }
- acl_prot_rate = (u16) atoi(args[1]);
- }
- }
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, cmd_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- /* Verify response */
- if (cmd_buf->CmdCode != (HostCmd_ROBUST_COEX | APCMD_RESP_CHECK)) {
- printf("ERR:Corrupted response!\n");
- goto done;
- }
- /* Print response */
- if (cmd_buf->Result == CMD_SUCCESS) {
- printf("BT Coex settings sucessfully set.\n");
- } else {
- printf("ERR:Could not set coex configuration.\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- done:
- fclose(config_file);
- if (buf)
- free(buf);
- if (line)
- free(line);
-}
-
-/**
- * @brief Read the profile and sends to the driver
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return UAP_SUCCESS or UAP_FAILURE
- */
-void
-apcmd_sys_config_profile(int argc, char *argv[])
-{
- FILE *config_file = NULL;
- char *line = NULL;
- int li = 0;
- char *pos = NULL;
- int arg_num = 0;
- char *args[30];
- int i;
- int is_ap_config = 0;
- int is_custom_ie_config = 0;
- int is_ap_mac_filter = 0;
- APCMDBUF_SYS_CONFIGURE *cmd_buf = NULL;
- u8 *buffer = NULL;
- u16 cmd_len = 0;
- u16 tlv_len = 0;
- u16 ie_len = 0;
- u16 ie_buf_len = 0;
- u16 mask_ie_index = 0;
- int keyindex = -1;
- int pairwisecipher = -1;
- int groupcipher = -1;
- TLVBUF_STA_MAC_ADDR_FILTER *filter_tlv = NULL;
- tlvbuf_custom_ie *custom_ie_tlv_head = NULL;
- tlvbuf_custom_ie *custom_ie_tlv = NULL;
- custom_ie *custom_ie_ptr = NULL;
- int custom_ie_tlv_len = 0;
- int custom_mask_count = 0;
- int custom_buf_count = 0;
- int filter_mac_count = -1;
- int tx_data_rate = -1;
- int mcbc_data_rate = -1;
- u8 rate[MAX_RATES];
- int found = 0;
- char country_80211d[4];
- u8 state_80211d;
- int flag_80211d = 0;
-
- memset(rate, 0, MAX_RATES);
- /* Check if file exists */
- config_file = fopen(argv[0], "r");
- if (config_file == NULL) {
- printf("\nERR:Config file can not open.\n");
- return;
- }
- line = (char *) malloc(MAX_CONFIG_LINE);
- if (!line) {
- printf("ERR:Cannot allocate memory for line\n");
- goto done;
- }
- bzero(line, MAX_CONFIG_LINE);
-
- /* Parse file and process */
- while (config_get_line(line, MAX_CONFIG_LINE, config_file, &li, &pos)) {
-#if DEBUG
- uap_printf(MSG_DEBUG, "DBG:Received config line (%d) = %s\n", li, line);
-#endif
- arg_num = parse_line(line, args);
-#if DEBUG
- uap_printf(MSG_DEBUG, "DBG:Number of arguments = %d\n", arg_num);
- for (i = 0; i < arg_num; i++) {
- uap_printf(MSG_DEBUG, "\tDBG:Argument %d. %s\n", i + 1, args[i]);
- }
-#endif
- /* Check for end of AP configurations */
- if (is_ap_config == 1) {
- if (strcmp(args[0], "}") == 0) {
- is_ap_config = 0;
- if (tx_data_rate != -1) {
- if ((!rate[0]) && (tx_data_rate) &&
- (is_tx_rate_valid((u8) tx_data_rate) != UAP_SUCCESS)) {
- printf("ERR: Invalid Tx Data Rate \n");
- goto done;
- }
- if (rate[0] && tx_data_rate) {
- for (i = 0; rate[i] != 0; i++) {
- if ((rate[i] & ~BASIC_RATE_SET_BIT) == tx_data_rate) {
- found = 1;
- break;
- }
- }
- if (!found) {
- printf("ERR: Invalid Tx Data Rate \n");
- goto done;
- }
- }
-
- /* Append a new TLV */
- TLVBUF_TX_DATA_RATE *tlv = NULL;
- tlv_len = sizeof(TLVBUF_TX_DATA_RATE);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append tx data rate TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_TX_DATA_RATE *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_TX_DATA_RATE_TLV_ID;
- tlv->Length = 2;
- tlv->TxDataRate = tx_data_rate;
- endian_convert_tlv_header_out(tlv);
- tlv->TxDataRate = uap_cpu_to_le16(tlv->TxDataRate);
- }
- if (mcbc_data_rate != -1) {
- if ((!rate[0]) && (mcbc_data_rate) &&
- (is_mcbc_rate_valid((u8) mcbc_data_rate) !=
- UAP_SUCCESS)) {
- printf("ERR: Invalid Tx Data Rate \n");
- goto done;
- }
- if (rate[0] && mcbc_data_rate) {
- for (i = 0; rate[i] != 0; i++) {
- if (rate[i] & BASIC_RATE_SET_BIT) {
- if ((rate[i] & ~BASIC_RATE_SET_BIT) ==
- mcbc_data_rate) {
- found = 1;
- break;
- }
- }
- }
- if (!found) {
- printf("ERR: Invalid MCBC Data Rate \n");
- goto done;
- }
- }
-
- /* Append a new TLV */
- TLVBUF_MCBC_DATA_RATE *tlv = NULL;
- tlv_len = sizeof(TLVBUF_MCBC_DATA_RATE);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append tx data rate TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_MCBC_DATA_RATE *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_MCBC_DATA_RATE_TLV_ID;
- tlv->Length = 2;
- tlv->MCBCdatarate = mcbc_data_rate;
- endian_convert_tlv_header_out(tlv);
- tlv->MCBCdatarate = uap_cpu_to_le16(tlv->MCBCdatarate);
- }
-
- if ((pairwisecipher >= 0) && (groupcipher >= 0)) {
- if (is_cipher_valid(pairwisecipher, groupcipher) !=
- UAP_SUCCESS) {
- printf
- ("ERR:Wrong group and pair cipher combination!\n");
- goto done;
- }
- TLVBUF_CIPHER *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_CIPHER);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append cipher TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_CIPHER *) (buffer + cmd_len);
- bzero((char *) tlv, tlv_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_CIPHER_TLV_ID;
- tlv->Length = 2;
- tlv->PairwiseCipher = pairwisecipher;
- tlv->GroupCipher = groupcipher;
- endian_convert_tlv_header_out(tlv);
- }
- cmd_buf->Size = cmd_len;
- /* Send collective command */
- uap_ioctl((u8 *) cmd_buf, &cmd_len, cmd_len);
- cmd_len = 0;
- if (buffer) {
- free(buffer);
- buffer = NULL;
- }
- continue;
- }
- }
-
- /* Check for beginning of AP configurations */
- if (strcmp(args[0], "ap_config") == 0) {
- is_ap_config = 1;
- cmd_len = sizeof(APCMDBUF_SYS_CONFIGURE);
- if (buffer) {
- free(buffer);
- buffer = NULL;
- }
- buffer = (u8 *) malloc(cmd_len);
- if (!buffer) {
- printf("ERR:Cannot allocate memory!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- cmd_buf->CmdCode = APCMD_SYS_CONFIGURE;
- cmd_buf->Size = cmd_len;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
- cmd_buf->Action = ACTION_SET;
- continue;
- }
-
- /* Check for end of AP MAC address filter configurations */
- if (is_ap_mac_filter == 1) {
- if (strcmp(args[0], "}") == 0) {
- is_ap_mac_filter = 0;
- if (filter_tlv->Count != filter_mac_count) {
- printf
- ("ERR:Number of MAC address provided does not match 'Count'\n");
- goto done;
- }
- if (filter_tlv->FilterMode && (filter_tlv->Count == 0)) {
- printf
- ("ERR:Filter list can not be empty for %s Filter mode\n",
- (filter_tlv->FilterMode == 1) ? "'Allow'" : "'Block'");
- goto done;
- }
- filter_tlv->Length = (filter_tlv->Count * ETH_ALEN) + 2;
- cmd_len -=
- (MAX_MAC_ONESHOT_FILTER - filter_mac_count) * ETH_ALEN;
- cmd_buf->Size = cmd_len;
- endian_convert_tlv_header_out(filter_tlv);
- uap_ioctl((u8 *) cmd_buf, &cmd_len, cmd_len);
- cmd_len = 0;
- if (buffer) {
- free(buffer);
- buffer = NULL;
- }
- continue;
- }
- }
-
- /* Check for end of custom IE configurations */
- if (is_custom_ie_config == 1) {
- if (strcmp(args[0], "}") == 0) {
- if (custom_mask_count != custom_buf_count) {
- printf
- ("ERR:custom IE mask count and buffer count does not match\n");
- goto done;
- }
- is_custom_ie_config = 0;
- custom_ie_tlv_head->Length = custom_ie_tlv_len;
- cmd_len -=
- (MAX_IE_BUFFER_LEN * MAX_CUSTOM_IE_COUNT) -
- custom_ie_tlv_len;
- cmd_len -= sizeof(custom_ie) * MAX_CUSTOM_IE_COUNT;
- cmd_buf->Size = cmd_len;
- endian_convert_tlv_header_out(custom_ie_tlv_head);
- uap_ioctl((u8 *) cmd_buf, &cmd_len, cmd_len);
- cmd_len = 0;
- if (buffer) {
- free(buffer);
- buffer = NULL;
- }
- continue;
- }
- }
-
- if (flag_80211d && (strcmp(args[0], "11d_enable") == 0)) {
- if (IS_HEX_OR_DIGIT(args[1]) == UAP_FAILURE) {
- printf("ERR: valid input for state are 0 or 1\n");
- goto done;
- }
- state_80211d = (u8) A2HEXDECIMAL(args[1]);
-
- if ((state_80211d != 0) && (state_80211d != 1)) {
- printf("ERR: valid input for state are 0 or 1 \n");
- goto done;
- }
- if (sg_snmp_mib
- (ACTION_SET, OID_80211D_ENABLE, sizeof(state_80211d),
- &state_80211d)
- == UAP_FAILURE) {
- goto done;
- }
- }
-
- if (strcmp(args[0], "country") == 0) {
- APCMDBUF_CFG_80211D *cmd_buf = NULL;
- IEEEtypes_SubbandSet_t sub_bands[MAX_SUB_BANDS];
- u8 no_of_sub_band = 0;
- u16 buf_len;
- u16 cmdlen;
- u8 *buf = NULL;
-
- if ((strlen(args[1]) > 3) || (strlen(args[1]) < 0)) {
- printf("In-correct country input\n");
- goto done;
- }
- strcpy(country_80211d, args[1]);
- for (i = 0; i < strlen(country_80211d); i++) {
- if ((country_80211d[i] < 'A') || (country_80211d[i] > 'z')) {
- printf("Invalid Country Code\n");
- goto done;
- }
- if (country_80211d[i] > 'Z')
- country_80211d[i] = country_80211d[i] - 'a' + 'A';
- }
- no_of_sub_band = parse_domain_file(country_80211d, sub_bands);
- if (no_of_sub_band == UAP_FAILURE) {
- printf("Parsing Failed\n");
- goto done;
- }
- buf_len = sizeof(APCMDBUF_CFG_80211D);
- buf_len += no_of_sub_band * sizeof(IEEEtypes_SubbandSet_t);
- buf = (u8 *) malloc(buf_len);
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- goto done;
- }
- bzero((char *) buf, buf_len);
- cmd_buf = (APCMDBUF_CFG_80211D *) buf;
- cmdlen = buf_len;
- cmd_buf->Size = cmdlen - BUF_HEADER_SIZE;
- cmd_buf->Result = 0;
- cmd_buf->SeqNum = 0;
- cmd_buf->Action = uap_cpu_to_le16(ACTION_SET);
- cmd_buf->CmdCode = HostCmd_CMD_802_11D_DOMAIN_INFO;
- cmd_buf->Domain.Tag = uap_cpu_to_le16(TLV_TYPE_DOMAIN);
- cmd_buf->Domain.Length = uap_cpu_to_le16(sizeof(domain_param_t)
- - BUF_HEADER_SIZE
- +
- (no_of_sub_band *
- sizeof
- (IEEEtypes_SubbandSet_t)));
-
- memset(cmd_buf->Domain.CountryCode, ' ',
- sizeof(cmd_buf->Domain.CountryCode));
- memcpy(cmd_buf->Domain.CountryCode, country_80211d,
- strlen(country_80211d));
- memcpy(cmd_buf->Domain.Subband, sub_bands,
- no_of_sub_band * sizeof(IEEEtypes_SubbandSet_t));
-
- /* Send the command */
- uap_ioctl((u8 *) cmd_buf, &cmdlen, buf_len);
- if (buf)
- free(buf);
- }
-
- /* Check for beginning of AP MAC address filter configurations */
- if (strcmp(args[0], "ap_mac_filter") == 0) {
- is_ap_mac_filter = 1;
- cmd_len =
- sizeof(APCMDBUF_SYS_CONFIGURE) +
- sizeof(TLVBUF_STA_MAC_ADDR_FILTER) +
- (MAX_MAC_ONESHOT_FILTER * ETH_ALEN);
- if (buffer) {
- free(buffer);
- buffer = NULL;
- }
- buffer = (u8 *) malloc(cmd_len);
- if (!buffer) {
- printf("ERR:Cannot allocate memory!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- cmd_buf->CmdCode = APCMD_SYS_CONFIGURE;
- cmd_buf->Size = cmd_len;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
- cmd_buf->Action = ACTION_SET;
- filter_tlv =
- (TLVBUF_STA_MAC_ADDR_FILTER *) (buffer +
- sizeof(APCMDBUF_SYS_CONFIGURE));
- filter_tlv->Tag = MRVL_STA_MAC_ADDR_FILTER_TLV_ID;
- filter_tlv->Length = 2;
- filter_tlv->Count = 0;
- filter_mac_count = 0;
- continue;
- }
-
- /* Check for beginning of custom IE configurations */
- if (strcmp(args[0], "custom_ie_config") == 0) {
- is_custom_ie_config = 1;
- cmd_len = sizeof(APCMDBUF_SYS_CONFIGURE) + sizeof(tlvbuf_custom_ie)
- +
- ((MAX_IE_BUFFER_LEN + sizeof(custom_ie)) * MAX_CUSTOM_IE_COUNT);
- if (buffer) {
- free(buffer);
- buffer = NULL;
- }
- buffer = (u8 *) malloc(cmd_len);
- if (!buffer) {
- printf("ERR:Cannot allocate memory!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- cmd_buf->CmdCode = APCMD_SYS_CONFIGURE;
- cmd_buf->Size = cmd_len;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
- cmd_buf->Action = ACTION_SET;
- custom_ie_tlv =
- (tlvbuf_custom_ie *) (buffer + sizeof(APCMDBUF_SYS_CONFIGURE));
- custom_ie_ptr = (custom_ie *) (custom_ie_tlv->ie_data);
- custom_ie_tlv_head = custom_ie_tlv;
- custom_ie_tlv_head->Tag = MRVL_MGMT_IE_LIST_TLV_ID;
- continue;
- }
-
- if ((strcmp(args[0], "FilterMode") == 0) && is_ap_mac_filter) {
- if ((ISDIGIT(args[1]) == 0) || (atoi(args[1]) < 0) ||
- (atoi(args[1]) > 2)) {
- printf
- ("ERR:Illegal FilterMode paramter %d. Must be either '0', '1', or '2'.\n",
- atoi(args[1]));
- goto done;
- }
- filter_tlv->FilterMode = atoi(args[1]);
- continue;
- }
- if ((strcmp(args[0], "Count") == 0) && is_ap_mac_filter) {
- filter_tlv->Count = atoi(args[1]);
- if ((ISDIGIT(args[1]) == 0) ||
- (filter_tlv->Count > MAX_MAC_ONESHOT_FILTER)) {
- printf("ERR: Illegal Count parameter.\n");
- goto done;
- }
- }
- if ((strncmp(args[0], "mac_", 4) == 0) && is_ap_mac_filter) {
- if (filter_mac_count < MAX_MAC_ONESHOT_FILTER) {
- if (mac2raw
- (args[1],
- &filter_tlv->MacAddress[filter_mac_count * ETH_ALEN]) !=
- UAP_SUCCESS) {
- printf("ERR: Invalid MAC address %s \n", args[1]);
- goto done;
- }
- filter_mac_count++;
- } else {
- printf
- ("ERR: Filter table can not have more than %d MAC addresses\n",
- MAX_MAC_ONESHOT_FILTER);
- goto done;
- }
- }
-
- /* custom ie configuration parameters */
- if ((strncmp(args[0], "MgmtSubtypeMask_", 16) == 0) &&
- is_custom_ie_config) {
- if (UAP_FAILURE == ishexstring(args[1])) {
- printf("ERR:Illegal MgmtSubtypeMask %s.\n", args[1]);
- goto done;
- }
- mask_ie_index = (u16) atoi(args[0] + strlen("MgmtSubtypeMask_"));
- if (mask_ie_index > 3) {
- printf("ERR:Incorrect index %d.\n", mask_ie_index);
- goto done;
- }
- custom_ie_ptr->ie_index = uap_cpu_to_le16(mask_ie_index);
- custom_ie_ptr->mgmt_subtype_mask = (u16) A2HEXDECIMAL(args[1]);
- custom_ie_ptr->mgmt_subtype_mask = uap_cpu_to_le16
- (custom_ie_ptr->mgmt_subtype_mask);
- custom_mask_count++;
- continue;
- }
- if ((strncmp(args[0], "IEBuffer_", 9) == 0) && is_custom_ie_config) {
- if (UAP_FAILURE == ishexstring(args[1])) {
- printf("ERR:Only hex digits are allowed\n");
- goto done;
- }
- ie_buf_len = strlen(args[1]);
- if (!strncasecmp("0x", args[1], 2)) {
- ie_len = (ie_buf_len - 2 + 1) / 2;
- args[1] += 2;
- } else
- ie_len = (ie_buf_len + 1) / 2;
-
- if (ie_len > MAX_IE_BUFFER_LEN) {
- printf("ERR:Incorrect IE length %d\n", ie_buf_len);
- goto done;
- }
-
- custom_ie_ptr->ie_index = (u16) atoi(args[0] + strlen("IEBuffer_"));
- if (custom_ie_ptr->ie_index != mask_ie_index) {
- printf("ERR:IE buffer%d should follow MgmtSubtypeMask%d\n",
- mask_ie_index, mask_ie_index);
- goto done;
- }
- custom_ie_ptr->ie_index = uap_cpu_to_le16(custom_ie_ptr->ie_index);
- string2raw(args[1], custom_ie_ptr->ie_buffer);
- custom_ie_ptr->ie_length = uap_cpu_to_le16(ie_len);
- custom_ie_tlv_len += sizeof(custom_ie) + ie_len;
- custom_ie_tlv = (tlvbuf_custom_ie *) ((u8 *) custom_ie_tlv
- + sizeof(custom_ie) + ie_len);
- custom_ie_ptr = (custom_ie *) (custom_ie_tlv->ie_data);
- custom_buf_count++;
- continue;
- }
- if (strcmp(args[0], "SSID") == 0) {
- if (arg_num == 1) {
- printf("ERR:SSID field is blank!\n");
- goto done;
- } else {
- TLVBUF_SSID *tlv = NULL;
- if (args[1][0] == '"') {
- args[1]++;
- }
- if (args[1][strlen(args[1]) - 1] == '"') {
- args[1][strlen(args[1]) - 1] = '\0';
- }
- if ((strlen(args[1]) > MAX_SSID_LENGTH) ||
- (strlen(args[1]) == 0)) {
- printf("ERR:SSID length out of range (%d to %d).\n",
- MIN_SSID_LENGTH, MAX_SSID_LENGTH);
- goto done;
- }
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_SSID) + strlen(args[1]);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot realloc SSID TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_SSID *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_SSID_TLV_ID;
- tlv->Length = strlen(args[1]);
- memcpy(tlv->Ssid, args[1], tlv->Length);
- endian_convert_tlv_header_out(tlv);
- }
- }
- if (strcmp(args[0], "BeaconPeriod") == 0) {
- if (is_input_valid(BEACONPERIOD, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_BEACON_PERIOD *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_BEACON_PERIOD);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot realloc beacon period TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_BEACON_PERIOD *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_BEACON_PERIOD_TLV_ID;
- tlv->Length = 2;
- tlv->BeaconPeriod_ms = (u16) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- tlv->BeaconPeriod_ms = uap_cpu_to_le16(tlv->BeaconPeriod_ms);
- }
- if (strcmp(args[0], "ChanList") == 0) {
- if (is_input_valid(SCANCHANNELS, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
-
- TLVBUF_CHANNEL_LIST *tlv = NULL;
- CHANNEL_LIST *pChanList = NULL;
- /* Append a new TLV */
- tlv_len =
- sizeof(TLVBUF_CHANNEL_LIST) +
- ((arg_num - 1) * sizeof(CHANNEL_LIST));
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append channel list TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_CHANNEL_LIST *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_CHANNELLIST_TLV_ID;
- tlv->Length = sizeof(CHANNEL_LIST) * (arg_num - 1);
- pChanList = (CHANNEL_LIST *) tlv->ChanList;
- for (i = 0; i < (arg_num - 1); i++) {
- pChanList->ChanNumber = (u8) atoi(args[i + 1]);
- pChanList->BandConfigType = 0;
- pChanList++;
- }
- endian_convert_tlv_header_out(tlv);
- }
- if (strcmp(args[0], "Channel") == 0) {
- if (is_input_valid(CHANNEL, arg_num - 1, args + 1) != UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_CHANNEL_CONFIG *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_CHANNEL_CONFIG);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append channel TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_CHANNEL_CONFIG *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_CHANNELCONFIG_TLV_ID;
- tlv->Length = 2;
- tlv->ChanNumber = (u8) atoi(args[1]);
- if ((arg_num - 1) == 2)
- tlv->BandConfigType = atoi(args[2]) ? BAND_CONFIG_ACS_MODE : 0;
- else
- tlv->BandConfigType = 0;
- endian_convert_tlv_header_out(tlv);
- }
- if (strcmp(args[0], "AP_MAC") == 0) {
- int ret;
- TLVBUF_AP_MAC_ADDRESS *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_AP_MAC_ADDRESS);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append channel TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_AP_MAC_ADDRESS *) (buffer + cmd_len);
- cmd_len += tlv_len;
- cmd_buf->Action = ACTION_SET;
- tlv->Tag = MRVL_AP_MAC_ADDRESS_TLV_ID;
- tlv->Length = ETH_ALEN;
- if ((ret = mac2raw(args[1], tlv->ApMacAddr)) != UAP_SUCCESS) {
- printf("ERR: %s Address \n",
- ret == UAP_FAILURE ? "Invalid MAC" : ret ==
- UAP_RET_MAC_BROADCAST ? "Broadcast" : "Multicast");
- goto done;
- }
- endian_convert_tlv_header_out(tlv);
- }
-
- if (strcmp(args[0], "RxAntenna") == 0) {
- if ((ISDIGIT(args[1]) != UAP_SUCCESS) || (atoi(args[1]) < 0) ||
- (atoi(args[1]) > 1)) {
- printf("ERR: Invalid Antenna value\n");
- goto done;
- }
- TLVBUF_ANTENNA_CTL *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_ANTENNA_CTL);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append channel TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_ANTENNA_CTL *) (buffer + cmd_len);
- cmd_len += tlv_len;
- cmd_buf->Action = ACTION_SET;
- tlv->Tag = MRVL_ANTENNA_CTL_TLV_ID;
- tlv->Length = 2;
- tlv->WhichAntenna = 0;
- tlv->AntennaMode = atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- }
-
- if (strcmp(args[0], "TxAntenna") == 0) {
- if ((ISDIGIT(args[1]) != UAP_SUCCESS) || (atoi(args[1]) < 0) ||
- (atoi(args[1]) > 1)) {
- printf("ERR: Invalid Antenna value\n");
- goto done;
- }
- TLVBUF_ANTENNA_CTL *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_ANTENNA_CTL);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append channel TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_ANTENNA_CTL *) (buffer + cmd_len);
- cmd_len += tlv_len;
- cmd_buf->Action = ACTION_SET;
- tlv->Tag = MRVL_ANTENNA_CTL_TLV_ID;
- tlv->Length = 2;
- tlv->WhichAntenna = 1;
- tlv->AntennaMode = atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- }
- if (strcmp(args[0], "Rate") == 0) {
- if (is_input_valid(RATE, arg_num - 1, args + 1) != UAP_SUCCESS) {
- printf("ERR: Invalid Rate input\n");
- goto done;
- }
- TLVBUF_RATES *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_RATES) + arg_num - 1;
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append rates TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_RATES *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_RATES_TLV_ID;
- tlv->Length = arg_num - 1;
- for (i = 0; i < tlv->Length; i++) {
- rate[i] = tlv->OperationalRates[i] =
- (u8) A2HEXDECIMAL(args[i + 1]);
- }
- endian_convert_tlv_header_out(tlv);
- }
- if (strcmp(args[0], "TxPowerLevel") == 0) {
- if (is_input_valid(TXPOWER, arg_num - 1, args + 1) != UAP_SUCCESS) {
- printf("ERR:Invalid TxPowerLevel \n");
- goto done;
- } else {
- TLVBUF_TX_POWER *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_TX_POWER);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append tx power level TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_TX_POWER *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_TX_POWER_TLV_ID;
- tlv->Length = 1;
- tlv->TxPower_dBm = (u8) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- }
- }
- if (strcmp(args[0], "BroadcastSSID") == 0) {
- if (is_input_valid(BROADCASTSSID, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_BCAST_SSID_CTL *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_BCAST_SSID_CTL);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append SSID broadcast control TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_BCAST_SSID_CTL *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_BCAST_SSID_CTL_TLV_ID;
- tlv->Length = 1;
- tlv->BcastSsidCtl = (u8) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- }
- if (strcmp(args[0], "RTSThreshold") == 0) {
- if (is_input_valid(RTSTHRESH, arg_num - 1, args + 1) != UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_RTS_THRESHOLD *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_RTS_THRESHOLD);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append RTS threshold TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_RTS_THRESHOLD *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_RTS_THRESHOLD_TLV_ID;
- tlv->Length = 2;
- tlv->RtsThreshold = (u16) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- tlv->RtsThreshold = uap_cpu_to_le16(tlv->RtsThreshold);
- }
- if (strcmp(args[0], "FragThreshold") == 0) {
- if (is_input_valid(FRAGTHRESH, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_FRAG_THRESHOLD *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_FRAG_THRESHOLD);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append Fragmentation threshold TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_FRAG_THRESHOLD *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_FRAG_THRESHOLD_TLV_ID;
- tlv->Length = 2;
- tlv->FragThreshold = (u16) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- tlv->FragThreshold = uap_cpu_to_le16(tlv->FragThreshold);
- }
- if (strcmp(args[0], "DTIMPeriod") == 0) {
- if (is_input_valid(DTIMPERIOD, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_DTIM_PERIOD *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_DTIM_PERIOD);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append DTIM period TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_DTIM_PERIOD *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_DTIM_PERIOD_TLV_ID;
- tlv->Length = 1;
- tlv->DtimPeriod = (u8) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- }
- if (strcmp(args[0], "RadioControl") == 0) {
- if (is_input_valid(RADIOCONTROL, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_RADIO_CTL *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_RADIO_CTL);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append radio control TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_RADIO_CTL *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_RADIO_CTL_TLV_ID;
- tlv->Length = 1;
- tlv->RadioCtl = (u8) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- }
- if (strcmp(args[0], "RSNReplayProtection") == 0) {
- if (is_input_valid(RSNREPLAYPROT, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- tlvbuf_rsn_replay_prot *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(tlvbuf_rsn_replay_prot);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append RSN replay protection TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (tlvbuf_rsn_replay_prot *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_RSN_REPLAY_PROT_TLV_ID;
- tlv->Length = 1;
- tlv->rsn_replay_prot = (u8) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- }
- if (strcmp(args[0], "TxDataRate") == 0) {
- if (is_input_valid(TXDATARATE, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- tx_data_rate = (u16) A2HEXDECIMAL(args[1]);
- }
- if (strcmp(args[0], "MCBCdataRate") == 0) {
- if (is_input_valid(MCBCDATARATE, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- mcbc_data_rate = (u16) A2HEXDECIMAL(args[1]);
- }
- if (strcmp(args[0], "PktFwdCtl") == 0) {
- if (is_input_valid(PKTFWD, arg_num - 1, args + 1) != UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_PKT_FWD_CTL *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_PKT_FWD_CTL);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append packet forwarding control TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_PKT_FWD_CTL *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_PKT_FWD_CTL_TLV_ID;
- tlv->Length = 1;
- tlv->PktFwdCtl = (u8) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- }
- if (strcmp(args[0], "StaAgeoutTimer") == 0) {
- if (is_input_valid(STAAGEOUTTIMER, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_STA_AGEOUT_TIMER *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_STA_AGEOUT_TIMER);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append STA ageout timer TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_STA_AGEOUT_TIMER *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_STA_AGEOUT_TIMER_TLV_ID;
- tlv->Length = 4;
- tlv->StaAgeoutTimer_ms = (u32) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- tlv->StaAgeoutTimer_ms = uap_cpu_to_le32(tlv->StaAgeoutTimer_ms);
- }
- if (strcmp(args[0], "AuthMode") == 0) {
- if (is_input_valid(AUTHMODE, arg_num - 1, args + 1) != UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_AUTH_MODE *tlv = NULL;
- if ((atoi(args[1]) < 0) || (atoi(args[1]) > 1)) {
- printf
- ("ERR:Illegal AuthMode parameter. Must be either '0' or '1'.\n");
- goto done;
- }
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_AUTH_MODE);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append auth mode TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_AUTH_MODE *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_AUTH_TLV_ID;
- tlv->Length = 1;
- tlv->AuthMode = (u8) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- }
- if (strcmp(args[0], "KeyIndex") == 0) {
- if (arg_num == 1) {
- printf("KeyIndex is blank!\n");
- goto done;
- } else {
- if (ISDIGIT(args[1]) == 0) {
- printf
- ("ERR:Illegal KeyIndex parameter. Must be either '0', '1', '2', or '3'.\n");
- goto done;
- }
- keyindex = atoi(args[1]);
- if ((keyindex < 0) || (keyindex > 3)) {
- printf
- ("ERR:Illegal KeyIndex parameter. Must be either '0', '1', '2', or '3'.\n");
- goto done;
- }
- }
- }
- if (strncmp(args[0], "Key_", 4) == 0) {
- if (arg_num == 1) {
- printf("ERR:%s is blank!\n", args[0]);
- goto done;
- } else {
- TLVBUF_WEP_KEY *tlv = NULL;
- int key_len = 0;
- if (args[1][0] == '"') {
- if ((strlen(args[1]) != 2) && (strlen(args[1]) != 7) &&
- (strlen(args[1]) != 15)) {
- printf("ERR:Wrong key length!\n");
- goto done;
- }
- key_len = strlen(args[1]) - 2;
- } else {
- if ((strlen(args[1]) != 0) && (strlen(args[1]) != 10) &&
- (strlen(args[1]) != 26)) {
- printf("ERR:Wrong key length!\n");
- goto done;
- }
- if (UAP_FAILURE == ishexstring(args[1])) {
- printf
- ("ERR:Only hex digits are allowed when key length is 10 or 26\n");
- goto done;
- }
- key_len = strlen(args[1]) / 2;
- }
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_WEP_KEY) + key_len;
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append WEP key configurations TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_WEP_KEY *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_WEP_KEY_TLV_ID;
- tlv->Length = key_len + 2;
- if (strcmp(args[0], "Key_0") == 0) {
- tlv->KeyIndex = 0;
- } else if (strcmp(args[0], "Key_1") == 0) {
- tlv->KeyIndex = 1;
- } else if (strcmp(args[0], "Key_2") == 0) {
- tlv->KeyIndex = 2;
- } else if (strcmp(args[0], "Key_3") == 0) {
- tlv->KeyIndex = 3;
- }
- if (keyindex == tlv->KeyIndex) {
- tlv->IsDefault = 1;
- } else {
- tlv->IsDefault = 0;
- }
- if (args[1][0] == '"') {
- memcpy(tlv->Key, &args[1][1], strlen(args[1]) - 2);
- } else {
- string2raw(args[1], tlv->Key);
- }
- endian_convert_tlv_header_out(tlv);
- }
- }
- if (strcmp(args[0], "PSK") == 0) {
- if (arg_num == 1) {
- printf("ERR:PSK is blank!\n");
- goto done;
- } else {
- TLVBUF_WPA_PASSPHRASE *tlv = NULL;
- if (args[1][0] == '"') {
- args[1]++;
- }
- if (args[1][strlen(args[1]) - 1] == '"') {
- args[1][strlen(args[1]) - 1] = '\0';
- }
- tlv_len = sizeof(TLVBUF_WPA_PASSPHRASE) + strlen(args[1]);
- if (strlen(args[1]) > MAX_WPA_PASSPHRASE_LENGTH) {
- printf("ERR:PSK too long.\n");
- goto done;
- }
- if (strlen(args[1]) < MIN_WPA_PASSPHRASE_LENGTH) {
- printf("ERR:PSK too short.\n");
- goto done;
- }
- if (strlen(args[1]) == MAX_WPA_PASSPHRASE_LENGTH) {
- if (UAP_FAILURE == ishexstring(args[1])) {
- printf
- ("ERR:Only hex digits are allowed when passphrase's length is 64\n");
- goto done;
- }
- }
- /* Append a new TLV */
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append WPA passphrase TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_WPA_PASSPHRASE *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_WPA_PASSPHRASE_TLV_ID;
- tlv->Length = strlen(args[1]);
- memcpy(tlv->Passphrase, args[1], tlv->Length);
- endian_convert_tlv_header_out(tlv);
- }
- }
- if (strcmp(args[0], "Protocol") == 0) {
- if (is_input_valid(PROTOCOL, arg_num - 1, args + 1) != UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_PROTOCOL *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_PROTOCOL);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append protocol TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_PROTOCOL *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_PROTOCOL_TLV_ID;
- tlv->Length = 2;
- tlv->Protocol = (u16) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- tlv->Protocol = uap_cpu_to_le16(tlv->Protocol);
- if (atoi(args[1]) & (PROTOCOL_WPA | PROTOCOL_WPA2)) {
- TLVBUF_AKMP *tlv = NULL;
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_AKMP);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append AKMP TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_AKMP *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_AKMP_TLV_ID;
- tlv->Length = 2;
- tlv->KeyMgmt = KEY_MGMT_PSK;
- endian_convert_tlv_header_out(tlv);
- tlv->KeyMgmt = uap_cpu_to_le16(tlv->KeyMgmt);
- }
- }
- if (strcmp(args[0], "PairwiseCipher") == 0) {
- if (arg_num == 1) {
- printf("ERR:PairwiseCipher is blank!\n");
- goto done;
- } else {
- if (ISDIGIT(args[1]) == 0) {
- printf
- ("ERR:Illegal PairwiseCipher parameter. Must be either bit '2' or '3'.\n");
- goto done;
- }
- pairwisecipher = atoi(args[1]);
- if (pairwisecipher & ~CIPHER_BITMAP) {
- printf
- ("ERR:Illegal PairwiseCipher parameter. Must be either bit '2' or '3'.\n");
- goto done;
- }
- }
- }
- if (strcmp(args[0], "GroupCipher") == 0) {
- if (arg_num == 1) {
- printf("ERR:GroupCipher is blank!\n");
- goto done;
- } else {
- if (ISDIGIT(args[1]) == 0) {
- printf
- ("ERR:Illegal GroupCipher parameter. Must be either bit '2' or '3'.\n");
- goto done;
- }
- groupcipher = atoi(args[1]);
- if (groupcipher & ~CIPHER_BITMAP) {
- printf
- ("ERR:Illegal GroupCipher parameter. Must be either bit '2' or '3'.\n");
- goto done;
- }
- }
- }
- if (strcmp(args[0], "GroupRekeyTime") == 0) {
- if (is_input_valid(GROUPREKEYTIMER, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_GROUP_REKEY_TIMER *tlv = NULL;
-
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_GROUP_REKEY_TIMER);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot append protocol TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_GROUP_REKEY_TIMER *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_GRP_REKEY_TIME_TLV_ID;
- tlv->Length = 4;
- tlv->GroupRekeyTime_sec = (u32) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- tlv->GroupRekeyTime_sec = uap_cpu_to_le32(tlv->GroupRekeyTime_sec);
- }
- if (strcmp(args[0], "MaxStaNum") == 0) {
- if (is_input_valid(MAXSTANUM, arg_num - 1, args + 1) != UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_MAX_STA_NUM *tlv = NULL;
-
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_MAX_STA_NUM);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot realloc max station number TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_MAX_STA_NUM *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_MAX_STA_CNT_TLV_ID;
- tlv->Length = 2;
- tlv->Max_sta_num = (u16) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- tlv->Max_sta_num = uap_cpu_to_le16(tlv->Max_sta_num);
- }
- if (strcmp(args[0], "Retrylimit") == 0) {
- if (is_input_valid(RETRYLIMIT, arg_num - 1, args + 1) !=
- UAP_SUCCESS) {
- goto done;
- }
- TLVBUF_RETRY_LIMIT *tlv = NULL;
-
- /* Append a new TLV */
- tlv_len = sizeof(TLVBUF_RETRY_LIMIT);
- buffer = realloc(buffer, cmd_len + tlv_len);
- if (!buffer) {
- printf("ERR:Cannot realloc retry limit TLV!\n");
- goto done;
- }
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buffer;
- tlv = (TLVBUF_RETRY_LIMIT *) (buffer + cmd_len);
- cmd_len += tlv_len;
- /* Set TLV fields */
- tlv->Tag = MRVL_RETRY_LIMIT_TLV_ID;
- tlv->Length = 1;
- tlv->retry_limit = (u8) atoi(args[1]);
- endian_convert_tlv_header_out(tlv);
- }
-#if DEBUG
- if (cmd_len != 0) {
- hexdump("Command Buffer", (void *) cmd_buf, cmd_len, ' ');
- }
-#endif
- }
- done:
- fclose(config_file);
- if (buffer)
- free(buffer);
- if (line)
- free(line);
-}
-
-/**
- * @brief Show usage information for the cfg_80211d command
- *
- * $return N/A
- */
-void
-print_apcmd_cfg_80211d_usage(void)
-{
- printf("\nUsage: cfg_80211d <state 0/1> <country Country_code> \n");
- return;
-}
-
-/**
- * @brief Show usage information for the uap_stats command
- *
- * $return N/A
- */
-void
-print_apcmd_uap_stats(void)
-{
- printf("Usage: uap_stats \n");
- return;
-}
-
-/**
- * SNMP MIB OIDs Table
- */
-static oids_table snmp_oids[] = {
- {0x0b, 4, "dot11LocalTKIPMICFailures"},
- {0x0c, 4, "dot11CCMPDecryptErrors"},
- {0x0d, 4, "dot11WEPUndecryptableCount"},
- {0x0e, 4, "dot11WEPICVErrorCount"},
- {0x0f, 4, "dot11DecryptFailureCount"},
- {0x12, 4, "dot11FailedCount"},
- {0x13, 4, "dot11RetryCount"},
- {0x14, 4, "dot11MultipleRetryCount"},
- {0x15, 4, "dot11FrameDuplicateCount"},
- {0x16, 4, "dot11RTSSuccessCount"},
- {0x17, 4, "dot11RTSFailureCount"},
- {0x18, 4, "dot11ACKFailureCount"},
- {0x19, 4, "dot11ReceivedFragmentCount"},
- {0x1a, 4, "dot11MulticastReceivedFrameCount"},
- {0x1b, 4, "dot11FCSErrorCount"},
- {0x1c, 4, "dot11TransmittedFrameCount"},
- {0x1d, 4, "dot11RSNATKIPCounterMeasuresInvoked"},
- {0x1e, 4, "dot11RSNA4WayHandshakeFailures"},
- {0x1f, 4, "dot11MulticastTransmittedFrameCount"}
-};
-
-/**
- * @brief Get uAP stats
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- *
- * @return NA
- */
-void
-apcmd_uap_stats(int argc, char *argv[])
-{
- u8 no_of_oids = sizeof(snmp_oids) / sizeof(snmp_oids[0]);
- u16 i, j;
- int size;
- APCMDBUF_SNMP_MIB *cmd_buf = NULL;
- u8 *buf = NULL;
- TLVBUF_HEADER *tlv = NULL;
- u16 cmd_len = 0;
- u16 buf_len = 0;
- u8 ret;
- int opt;
- u16 oid_size;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_apcmd_uap_stats();
- return;
- }
- }
-
- argc -= optind;
- argv += optind;
- if (argc) {
- printf("Error: Invalid Input\n");
- print_apcmd_uap_stats();
- return;
- }
-
- /** Command Header */
- buf_len += sizeof(APCMDBUF_SNMP_MIB);
-
- for (i = 0; i < no_of_oids; i++) {
- /**
- * size of Oid + Oid_value + Oid_size
- */
- buf_len += snmp_oids[i].len + sizeof(TLVBUF_HEADER);
- }
- buf = (u8 *) malloc(buf_len);
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- return;
- }
- bzero((char *) buf, buf_len);
-
- /* Locate Headers */
- cmd_buf = (APCMDBUF_SNMP_MIB *) buf;
- cmd_buf->Size = buf_len - BUF_HEADER_SIZE;
- cmd_buf->Result = 0;
- cmd_buf->SeqNum = 0;
- cmd_buf->CmdCode = HostCmd_SNMP_MIB;
- cmd_buf->Action = uap_cpu_to_le16(ACTION_GET);
-
- tlv = (TLVBUF_HEADER *) ((u8 *) cmd_buf + sizeof(APCMDBUF_SNMP_MIB));
- /* Add oid, oid_size and oid_value for each OID */
- for (i = 0; i < no_of_oids; i++) {
- /** Copy Index as Oid */
- tlv->Type = uap_cpu_to_le16(snmp_oids[i].type);
- /** Copy its size */
- tlv->Len = uap_cpu_to_le16(snmp_oids[i].len);
- /** Next TLV */
- tlv = (TLVBUF_HEADER *) & (tlv->Data[snmp_oids[i].len]);
- }
- cmd_len = buf_len;
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, buf_len);
- if (ret == UAP_SUCCESS) {
- if (cmd_buf->Result == CMD_SUCCESS) {
- tlv =
- (TLVBUF_HEADER *) ((u8 *) cmd_buf + sizeof(APCMDBUF_SNMP_MIB));
-
- size =
- cmd_buf->Size - (sizeof(APCMDBUF_SNMP_MIB) - BUF_HEADER_SIZE);
-
- while (size >= sizeof(TLVBUF_HEADER)) {
- tlv->Type = uap_le16_to_cpu(tlv->Type);
- for (i = 0; i < no_of_oids; i++) {
- if (snmp_oids[i].type == tlv->Type) {
- printf("%s: ", snmp_oids[i].name);
- break;
- }
- }
- oid_size = uap_le16_to_cpu(tlv->Len);
- switch (oid_size) {
- case 1:
- printf("%d", (unsigned int) tlv->Data[0]);
- break;
- case 2:
- printf("%d",
- (unsigned int) uap_le16_to_cpu(*(u16 *) tlv->Data));
- break;
- case 4:
- printf("%ld",
- (unsigned long) uap_le32_to_cpu(*(u32 *) tlv->Data));
- break;
- default:
- for (j = 0; j < oid_size; j++) {
- printf("%d ", (u8) tlv->Data[i]);
- }
- break;
- }
- /** Next TLV */
- tlv = (TLVBUF_HEADER *) & (tlv->Data[oid_size]);
- size -= (sizeof(TLVBUF_HEADER) + oid_size);
- size = (size > 0) ? size : 0;
- printf("\n");
- }
-
- } else {
- printf("ERR:Command Response incorrect!\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- free(buf);
-}
-
-/**
- * @brief parser for sys_cfg_80211d input
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @param output stores indexes for "state, country"
- * arguments
- *
- * @return NA
- *
- */
-void
-parse_input_80211d(int argc, char **argv, int output[2][2])
-{
- int i, j, k = 0;
- char *keywords[2] = { "state", "country" };
-
- for (i = 0; i < 2; i++)
- output[i][0] = -1;
-
- for (i = 0; i < argc; i++) {
- for (j = 0; j < 2; j++) {
- if (strcmp(argv[i], keywords[j]) == 0) {
- output[j][1] = output[j][0] = i;
- k = j;
- break;
- }
- }
- output[k][1] += 1;
- }
-}
-
-/**
- * @brief Set/Get 802.11D country information
- *
- * Usage: cfg_80211d state country_code
- *
- * State 0 or 1
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_cfg_80211d(int argc, char *argv[])
-{
- APCMDBUF_CFG_80211D *cmd_buf = NULL;
- IEEEtypes_SubbandSet_t *subband = NULL;
- u8 *buf = NULL;
- u16 cmd_len;
- u16 buf_len;
- int output[2][2];
- int ret = UAP_FAILURE;
- int opt;
- int i, j;
- u8 state = 0;
- char country[4] = { ' ', ' ', 0, 0 };
- u8 sflag = 0, cflag = 0;
- IEEEtypes_SubbandSet_t sub_bands[MAX_SUB_BANDS];
- u8 no_of_sub_band = 0;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_apcmd_cfg_80211d_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc) {
- /** SET */
- parse_input_80211d(argc, argv, output);
-
- /** state */
- if ((output[0][0] != -1) && (output[0][1] > output[0][0])) {
- if ((output[0][1] - output[0][0]) != 2) {
- printf("ERR: Invalid state inputs\n");
- print_apcmd_cfg_80211d_usage();
- return;
- }
-
- if (IS_HEX_OR_DIGIT(argv[output[0][0] + 1]) == UAP_FAILURE) {
- printf("ERR: valid input for state are 0 or 1\n");
- print_apcmd_cfg_80211d_usage();
- return;
- }
- state = (u8) A2HEXDECIMAL(argv[output[0][0] + 1]);
-
- if ((state != 0) && (state != 1)) {
- printf("ERR: valid input for state are 0 or 1 \n");
- print_apcmd_cfg_80211d_usage();
- return;
- }
- sflag = 1;
- }
-
- /** country */
- if ((output[1][0] != -1) && (output[1][1] > output[1][0])) {
- if ((output[1][1] - output[1][0]) > 2) {
- printf("ERR: Invalid country inputs\n");
- print_apcmd_cfg_80211d_usage();
- return;
- }
- if ((strlen(argv[output[1][0] + 1]) > 3) ||
- (strlen(argv[output[1][0] + 1]) < 0)) {
- print_apcmd_cfg_80211d_usage();
- return;
- }
-
- strcpy(country, argv[output[1][0] + 1]);
-
- for (i = 0; i < strlen(country); i++) {
- if ((country[i] < 'A') || (country[i] > 'z')) {
- printf("Invalid Country Code\n");
- print_apcmd_cfg_80211d_usage();
- return;
- }
- if (country[i] > 'Z')
- country[i] = country[i] - 'a' + 'A';
- }
-
- cflag = 1;
-
- /** Get domain information from the file */
- no_of_sub_band = parse_domain_file(country, sub_bands);
- if (no_of_sub_band == UAP_FAILURE) {
- printf("Parsing Failed\n");
- return;
- }
- }
- }
-
- if (argc && !cflag && !sflag) {
- printf("ERR: Invalid input\n");
- print_apcmd_cfg_80211d_usage();
- return;
- }
-
- if (sflag && !cflag) {
- /**
- * Update MIB only and return
- */
- if (sg_snmp_mib(ACTION_SET, OID_80211D_ENABLE, sizeof(state), &state) ==
- UAP_SUCCESS) {
- printf("802.11d %sd \n", state ? "enable" : "disable");
- }
- return;
- }
-
- buf_len = sizeof(APCMDBUF_CFG_80211D);
-
- if (cflag) {
- buf_len += no_of_sub_band * sizeof(IEEEtypes_SubbandSet_t);
- } else { /** Get */
- buf_len += MAX_SUB_BANDS * sizeof(IEEEtypes_SubbandSet_t);
- }
-
- buf = (u8 *) malloc(buf_len);
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- return;
- }
- bzero((char *) buf, buf_len);
- /* Locate headers */
- cmd_buf = (APCMDBUF_CFG_80211D *) buf;
- cmd_len = argc ? buf_len :
- /** set */
- (sizeof(APCMDBUF_CFG_80211D) - sizeof(domain_param_t)); /** Get */
-
- cmd_buf->Size = cmd_len - BUF_HEADER_SIZE;
- cmd_buf->Result = 0;
- cmd_buf->SeqNum = 0;
- cmd_buf->Action = argc ? ACTION_SET : ACTION_GET;
- cmd_buf->Action = uap_cpu_to_le16(cmd_buf->Action);
- cmd_buf->CmdCode = HostCmd_CMD_802_11D_DOMAIN_INFO;
-
- if (cflag) {
- cmd_buf->Domain.Tag = uap_cpu_to_le16(TLV_TYPE_DOMAIN);
- cmd_buf->Domain.Length = uap_cpu_to_le16(sizeof(domain_param_t)
- - BUF_HEADER_SIZE
- +
- (no_of_sub_band *
- sizeof
- (IEEEtypes_SubbandSet_t)));
-
- memset(cmd_buf->Domain.CountryCode, ' ',
- sizeof(cmd_buf->Domain.CountryCode));
- memcpy(cmd_buf->Domain.CountryCode, country, strlen(country));
- memcpy(cmd_buf->Domain.Subband, sub_bands,
- no_of_sub_band * sizeof(IEEEtypes_SubbandSet_t));
- }
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, buf_len);
- if (ret == UAP_SUCCESS) {
- if (cmd_buf->Result == CMD_SUCCESS) {
- if (argc) {
- printf("Set executed successfully\n");
- if (sflag) {
- if (sg_snmp_mib
- (ACTION_SET, OID_80211D_ENABLE, sizeof(state),
- &state) == UAP_SUCCESS) {
- printf("802.11d %sd \n", state ? "enable" : "disable");
- }
- }
- } else {
- j = uap_le16_to_cpu(cmd_buf->Domain.Length);
- if (sg_snmp_mib
- (ACTION_GET, OID_80211D_ENABLE, sizeof(state), &state)
- == UAP_SUCCESS) {
- printf("State = %sd\n", state ? "enable" : "disable");
- }
-
- if (!(cmd_buf->Domain.CountryCode[0] |
- cmd_buf->Domain.CountryCode[1] |
- cmd_buf->Domain.CountryCode[2])) {
- printf("Dot11d = country code is not set.\n");
- } else {
- printf("Country string = %c%c%c",
- cmd_buf->Domain.CountryCode[0],
- cmd_buf->Domain.CountryCode[1],
- cmd_buf->Domain.CountryCode[2]);
- j -= sizeof(cmd_buf->Domain.CountryCode);
- subband =
- (IEEEtypes_SubbandSet_t *) cmd_buf->Domain.Subband;
- printf("\nSub-band info=");
- // printf("\n\t\t(First Channel, Number of Channels,
- // Maximum TX Power) \n");
- printf("\t(1st, #chan, MAX-power) \n");
- for (i = 0; i < (j / 3); i++) {
- printf("\t\t(%d, \t%d, \t%d dbm)\n", subband->FirstChan,
- subband->NoOfChan, subband->MaxTxPwr);
- subband++;
- }
- }
- }
- } else {
- printf("ERR:Command Response incorrect!\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- free(buf);
- return;
-}
-
-/**
- * @brief Creates a sys_config request and sends to the driver
- *
- * Usage: "Usage : sys_config [CONFIG_FILE]"
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return UAP_SUCCESS or UAP_FAILURE
- */
-void
-apcmd_sys_config(int argc, char *argv[])
-{
- APCMDBUF_SYS_CONFIGURE *cmd_buf = NULL;
- u8 *buf = NULL;
- u16 cmd_len;
- u16 buf_len;
- int ret = UAP_FAILURE;
- int opt;
- char **argv_dummy;
- ps_mgmt pm;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_sys_config_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- /* Check arguments */
- if (argc > 1) {
- printf("ERR:Too many arguments.\n");
- print_sys_config_usage();
- return;
- }
- if (argc == 1) {
- /* Read profile and send command to firmware */
- apcmd_sys_config_profile(argc, argv);
- return;
- }
-
- /** Query AP's setting */
- buf_len = MRVDRV_SIZE_OF_CMD_BUFFER;
-
- /* alloc buf for command */
- buf = (u8 *) malloc(buf_len);
-
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- return;
- }
- bzero((char *) buf, buf_len);
-
- /* Locate headers */
- cmd_len = sizeof(APCMDBUF_SYS_CONFIGURE);
- cmd_buf = (APCMDBUF_SYS_CONFIGURE *) buf;
-
- /* Fill the command buffer */
- cmd_buf->CmdCode = APCMD_SYS_CONFIGURE;
- cmd_buf->Size = cmd_len - BUF_HEADER_SIZE;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, buf_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- /* Verify response */
- if (cmd_buf->CmdCode != (APCMD_SYS_CONFIGURE | APCMD_RESP_CHECK)) {
- printf("ERR:Corrupted response!\n");
- free(buf);
- return;
- }
- /* Print response */
- if (cmd_buf->Result == CMD_SUCCESS) {
- printf("AP settings:\n");
- print_tlv(buf + sizeof(APCMDBUF_SYS_CONFIGURE),
- cmd_buf->Size - sizeof(APCMDBUF_SYS_CONFIGURE) +
- BUF_HEADER_SIZE);
- printf("\n802.11D setting:\n");
- apcmd_cfg_80211d(1, argv_dummy);
- } else {
- printf("ERR:Could not retrieve system configure\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- free(buf);
- memset(&pm, 0, sizeof(ps_mgmt));
- send_power_mode_ioctl(&pm);
- return;
-}
-
-/**
- * @brief Send read/write command along with register details to the driver
- * @param reg reg type
- * @param offset pointer to register offset string
- * @param strvalue pointer to value string
- * @return UAP_SUCCESS or UAP_FAILURE
- */
-int
-apcmd_regrdwr_process(int reg, s8 * offset, s8 * strvalue)
-{
- APCMDBUF_REG_RDWR *cmd_buf = NULL;
- u8 *buf = NULL;
- u16 cmd_len;
- u16 buf_len;
- int ret = UAP_FAILURE;
- s8 *whichreg;
-
- buf_len = sizeof(APCMDBUF_REG_RDWR);
-
- /* alloc buf for command */
- buf = (u8 *) malloc(buf_len);
-
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- return UAP_FAILURE;
- }
- bzero((char *) buf, buf_len);
-
- /* Locate headers */
- cmd_len = sizeof(APCMDBUF_REG_RDWR);
- cmd_buf = (APCMDBUF_REG_RDWR *) buf;
-
- /* Fill the command buffer */
- cmd_buf->Size = cmd_len - BUF_HEADER_SIZE;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
-
- switch (reg) {
- case CMD_MAC:
- whichreg = "MAC";
- cmd_buf->CmdCode = HostCmd_CMD_MAC_REG_ACCESS;
- break;
- case CMD_BBP:
- whichreg = "BBP";
- cmd_buf->CmdCode = HostCmd_CMD_BBP_REG_ACCESS;
- break;
- case CMD_RF:
- cmd_buf->CmdCode = HostCmd_CMD_RF_REG_ACCESS;
- whichreg = "RF";
- break;
- default:
- printf("Invalid register set specified.\n");
- free(buf);
- return UAP_FAILURE;
- }
- if (strvalue) {
- cmd_buf->Action = 1; // WRITE
- } else {
- cmd_buf->Action = 0; // READ
- }
- cmd_buf->Action = uap_cpu_to_le16(cmd_buf->Action);
- cmd_buf->Offset = A2HEXDECIMAL(offset);
- cmd_buf->Offset = uap_cpu_to_le16(cmd_buf->Offset);
- if (strvalue) {
- cmd_buf->Value = A2HEXDECIMAL(strvalue);
- cmd_buf->Value = uap_cpu_to_le32(cmd_buf->Value);
- }
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, buf_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- if (cmd_buf->Result == CMD_SUCCESS) {
- printf("Successfully executed the command\n");
- printf("%s[0x%04hx] = 0x%08lx\n",
- whichreg, uap_le16_to_cpu(cmd_buf->Offset),
- uap_le32_to_cpu(cmd_buf->Value));
- } else {
- printf("ERR:Command sending failed!\n");
- free(buf);
- return UAP_FAILURE;
- }
- } else {
- printf("ERR:Command sending failed!\n");
- free(buf);
- return UAP_FAILURE;
- }
-
- free(buf);
- return UAP_SUCCESS;
-}
-
-/**
- * @brief Send read command for EEPROM
- *
- * Usage: "Usage : rdeeprom <offset> <byteCount>"
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_read_eeprom(int argc, char *argv[])
-{
- APCMDBUF_EEPROM_ACCESS *cmd_buf = NULL;
- u8 *buf = NULL;
- u16 cmd_len;
- u16 buf_len;
- u16 byteCount, offset;
- int ret = UAP_FAILURE;
- int opt;
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_apcmd_read_eeprom_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- /* Check arguments */
- if (!argc || (argc && is_input_valid(RDEEPROM, argc, argv) != UAP_SUCCESS)) {
- print_apcmd_read_eeprom_usage();
- return;
- }
- offset = A2HEXDECIMAL(argv[0]);
- byteCount = A2HEXDECIMAL(argv[1]);
-
- buf_len = sizeof(APCMDBUF_EEPROM_ACCESS) + MAX_EEPROM_LEN;
- buf = (u8 *) malloc(buf_len);
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- return;
- }
- bzero((char *) buf, buf_len);
-
- /* Locate headers */
- cmd_buf = (APCMDBUF_EEPROM_ACCESS *) buf;
- cmd_len = sizeof(APCMDBUF_EEPROM_ACCESS);
-
- cmd_buf->Size = sizeof(APCMDBUF_EEPROM_ACCESS) - BUF_HEADER_SIZE;
- cmd_buf->Result = 0;
- cmd_buf->SeqNum = 0;
- cmd_buf->Action = 0;
-
- cmd_buf->CmdCode = HostCmd_EEPROM_ACCESS;
- cmd_buf->Offset = uap_cpu_to_le16(offset);
- cmd_buf->ByteCount = uap_cpu_to_le16(byteCount);
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, buf_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- if (cmd_buf->Result == CMD_SUCCESS) {
- printf("Successfully executed the command\n");
- byteCount = uap_le16_to_cpu(cmd_buf->ByteCount);
- offset = uap_le16_to_cpu(cmd_buf->Offset);
- hexdump_data("EEPROM", (void *) cmd_buf->Value, byteCount, ' ');
- } else {
- printf("ERR:Command Response incorrect!\n");
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
-
- free(buf);
- return;
-}
-
-/**
- * @brief Show usage information for the regrdwr command
- * command
- *
- * $return N/A
- */
-void
-print_regrdwr_usage(void)
-{
- printf("\nUsage : uaputl.exe regrdwr <TYPE> <OFFSET> [value]\n");
- printf("\nTYPE Options: 0 - read/write MAC register");
- printf("\n 1 - read/write BBP register");
- printf("\n 2 - read/write RF register");
- printf("\n");
- return;
-
-}
-
-/**
- * @brief Provides interface to perform read/write operations on regsiters
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_regrdwr(int argc, char *argv[])
-{
- int opt;
- s32 reg;
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_regrdwr_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- /* Check arguments */
- if ((argc < 2) || (argc > 3)) {
- printf("ERR:wrong arguments.\n");
- print_regrdwr_usage();
- return;
- }
- if ((atoi(argv[0]) != 0) && (atoi(argv[0]) != 1) && (atoi(argv[0]) != 2)) {
- printf("ERR:Illegal register type %s. Must be either '0','1' or '2'.\n",
- argv[0]);
- print_regrdwr_usage();
- return;
- }
- reg = atoi(argv[0]);
- apcmd_regrdwr_process(reg, argv[1], argc > 2 ? argv[2] : NULL);
- return;
-}
-
-/**
- * @brief Show usage information for the memaccess command
- * command
- *
- * $return N/A
- */
-void
-print_memaccess_usage(void)
-{
- printf("\nUsage : uaputl.exe memaccess <ADDRESS> [value]\n");
- printf("\nRead/Write memory location");
- printf("\nADDRESS: Address of the memory location to be read/written");
- printf("\nValue : Value to be written at that address\n");
- return;
-}
-
-/**
- * @brief Provides interface to perform read/write memory location
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_memaccess(int argc, char *argv[])
-{
- int opt;
- APCMDBUF_MEM_ACCESS *cmd_buf = NULL;
- u8 *buf = NULL;
- u16 cmd_len;
- u16 buf_len;
- int ret = UAP_FAILURE;
- s8 *address = NULL;
- s8 *value = NULL;
-
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_memaccess_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
-
- /* Check arguments */
- if ((argc < 1) || (argc > 2)) {
- printf("ERR:wrong arguments.\n");
- print_memaccess_usage();
- return;
- }
-
- address = argv[0];
- if (argc == 2)
- value = argv[1];
-
- buf_len = sizeof(APCMDBUF_MEM_ACCESS);
-
- /* alloc buf for command */
- buf = (u8 *) malloc(buf_len);
-
- if (!buf) {
- printf("ERR:Cannot allocate buffer from command!\n");
- return;
- }
- bzero((char *) buf, buf_len);
- /* Locate headers */
- cmd_len = sizeof(APCMDBUF_MEM_ACCESS);
- cmd_buf = (APCMDBUF_MEM_ACCESS *) buf;
-
- /* Fill the command buffer */
- cmd_buf->Size = cmd_len - BUF_HEADER_SIZE;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
- cmd_buf->CmdCode = HostCmd_CMD_MEM_ACCESS;
-
- if (value)
- cmd_buf->Action = 1; // WRITE
- else
- cmd_buf->Action = 0; // READ
-
- cmd_buf->Action = uap_cpu_to_le16(cmd_buf->Action);
- cmd_buf->Address = A2HEXDECIMAL(address);
- cmd_buf->Address = uap_cpu_to_le32(cmd_buf->Address);
-
- if (value) {
- cmd_buf->Value = A2HEXDECIMAL(value);
- cmd_buf->Value = uap_cpu_to_le32(cmd_buf->Value);
- }
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, buf_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- if (cmd_buf->Result == CMD_SUCCESS) {
- printf("Successfully executed the command\n");
- printf("[0x%04lx] = 0x%08lx\n",
- uap_le32_to_cpu(cmd_buf->Address),
- uap_le32_to_cpu(cmd_buf->Value));
- } else {
- printf("ERR:Command sending failed!\n");
- free(buf);
- return;
- }
- } else {
- printf("ERR:Command sending failed!\n");
- free(buf);
- return;
- }
- free(buf);
- return;
-}
-
-/**
- * @brief Show usage information for sys_debug command
- * command
- *
- * $return N/A
- */
-void
-print_sys_debug_usage(void)
-{
- printf("\nUsage : uaputl.exe sys_debug <subcmd> [parameter]\n");
- printf("\nSet/Get debug parameter");
- printf("\nsubcmd: used to set/get debug parameters or set user scan");
- printf("\nparameter : parameters for specific subcmd");
- printf("\n If no [parameter] are given, it return");
- printf("\n debug parameters for selected subcmd");
- printf("\n\n");
- return;
-}
-
-/**
- * @brief Creates a sys_debug request and sends to the driver
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return N/A
- */
-void
-apcmd_sys_debug(int argc, char *argv[])
-{
- APCMDBUF_SYS_DEBUG *cmd_buf = NULL;
- u8 *buffer = NULL;
- u16 cmd_len;
- u16 buf_len;
- u32 subcmd = 0;
- int ret = UAP_FAILURE;
- int opt;
- s8 *value = NULL;
- u32 parameter = 0;
- while ((opt = getopt_long(argc, argv, "+", cmd_options, NULL)) != -1) {
- switch (opt) {
- default:
- print_sys_debug_usage();
- return;
- }
- }
- argc -= optind;
- argv += optind;
- /* Check arguments */
- if ((argc == 0) || (argc > 2)) {
- printf("ERR:wrong arguments.\n");
- print_sys_debug_usage();
- return;
- } else {
- if (argc == 2) {
- value = argv[1];
- parameter = A2HEXDECIMAL(value);
- }
- }
- subcmd = atoi(argv[0]);
- /* Initialize the command length */
- if (subcmd == DEBUG_SUBCOMMAND_CHANNEL_SCAN) {
- buf_len =
- sizeof(APCMDBUF_SYS_DEBUG) +
- MAX_CHANNELS * sizeof(CHANNEL_SCAN_ENTRY_T);
- cmd_len = sizeof(APCMDBUF_SYS_DEBUG) - sizeof(debugConfig_t);
- } else {
- cmd_len = sizeof(APCMDBUF_SYS_DEBUG);
- buf_len = cmd_len;
- }
-
- /* Initialize the command buffer */
- buffer = (u8 *) malloc(buf_len);
- if (!buffer) {
- printf("ERR:Cannot allocate buffer for command!\n");
- return;
- }
- bzero((char *) buffer, buf_len);
-
- /* Locate headers */
- cmd_buf = (APCMDBUF_SYS_DEBUG *) buffer;
-
- /* Fill the command buffer */
- cmd_buf->CmdCode = APCMD_SYS_DEBUG;
- cmd_buf->Size = cmd_len - BUF_HEADER_SIZE;
- cmd_buf->SeqNum = 0;
- cmd_buf->Result = 0;
- cmd_buf->subcmd = subcmd;
- if (subcmd == DEBUG_SUBCOMMAND_CHANNEL_SCAN) {
- cmd_buf->Action = ACTION_SET;
- } else {
- if (argc == 1) {
- cmd_buf->Action = ACTION_GET;
- } else {
- cmd_buf->Action = ACTION_SET;
- if (subcmd == DEBUG_SUBCOMMAND_GMODE)
- cmd_buf->debugConfig.globalDebugMode = (u8) parameter;
- else if (subcmd == DEBUG_SUBCOMMAND_MAJOREVTMASK) {
- cmd_buf->debugConfig.debugMajorIdMask = parameter;
- cmd_buf->debugConfig.debugMajorIdMask =
- uap_cpu_to_le32(cmd_buf->debugConfig.debugMajorIdMask);
- } else {
- cmd_buf->debugConfig.value = uap_cpu_to_le32(parameter);
- }
- }
- }
- cmd_buf->Action = uap_cpu_to_le16(cmd_buf->Action);
- cmd_buf->subcmd = uap_cpu_to_le32(cmd_buf->subcmd);
-
- /* Send the command */
- ret = uap_ioctl((u8 *) cmd_buf, &cmd_len, buf_len);
-
- /* Process response */
- if (ret == UAP_SUCCESS) {
- /* Verify response */
- if (cmd_buf->CmdCode != (APCMD_SYS_DEBUG | APCMD_RESP_CHECK)) {
- printf("ERR:Corrupted response! CmdCode=%x\n", cmd_buf->CmdCode);
- free(buffer);
- return;
- }
- /* Print response */
- if (cmd_buf->Result == CMD_SUCCESS) {
- if (subcmd == DEBUG_SUBCOMMAND_CHANNEL_SCAN) {
- int i = 0;
- CHANNEL_SCAN_ENTRY_T *cst = NULL;
- if (cmd_buf->Size <
- (sizeof(APCMDBUF_SYS_DEBUG) - BUF_HEADER_SIZE)) {
- printf
- ("ERR: Invalid command response size, cmd_buf->Size = %x\n",
- cmd_buf->Size);
- free(buffer);
- return;
- }
- for (i = 0; i < cmd_buf->debugConfig.cs_entry.numChannels; i++) {
- if (i == 0) {
- printf
- ("\n------------------------------------------------------");
- printf("\nChan\tNumAPs\tCCA_Count\tDuration\tWeight");
- printf
- ("\n------------------------------------------------------");
- cst = cmd_buf->debugConfig.cs_entry.cst;
- }
- printf("\n%d\t%d\t%ld\t\t%ld\t\t%ld", cst->chan_num,
- cst->num_of_aps,
- cst->CCA_count, cst->duration, cst->channel_weight);
- cst++;
- }
- printf
- ("\n------------------------------------------------------\n");
- } else {
- if (argc == 1) {
- if (subcmd == DEBUG_SUBCOMMAND_GMODE) {
- printf("globalDebugmode=%d\n",
- cmd_buf->debugConfig.globalDebugMode);
- } else if (subcmd == DEBUG_SUBCOMMAND_MAJOREVTMASK) {
- printf("MajorId mask=0x%08lx\n",
- uap_le32_to_cpu(cmd_buf->debugConfig.
- debugMajorIdMask));
- } else {
- printf("Value = %ld\n",
- uap_le32_to_cpu(cmd_buf->debugConfig.value));
- }
- } else {
- printf("set debug parameter successful\n");
- }
- }
- } else {
- if (argc == 1) {
- printf("ERR:Could not get debug parameter!\n");
- } else {
- printf("ERR:Could not set debug parameter!\n");
- }
- }
- } else {
- printf("ERR:Command sending failed!\n");
- }
- if (buffer)
- free(buffer);
- return;
-}
-
-/** structure of command table*/
-typedef struct
-{
- /** command name */
- char *cmd;
- /** command function pointer */
- void (*func) (int argc, char *argv[]);
- /**command usuage */
- char *help;
-} command_table;
-
-/** ap command table */
-static command_table ap_command[] = {
- {"sys_config", apcmd_sys_config, "\tSet/get uAP's profile"},
- {"sys_info", apcmd_sys_info, "\tDisplay system info"},
- {"sys_reset", apcmd_sys_reset, "\tReset uAP"},
- {"bss_start", apcmd_bss_start, "\tStart the BSS"},
- {"bss_stop", apcmd_bss_stop, "\tStop the BSS"},
- {"sta_deauth", apcmd_sta_deauth, "\tDeauth client"},
- {"sta_list", apcmd_sta_list, "\tDisplay list of clients"},
- {"sys_cfg_ap_mac_address", apcmd_sys_cfg_ap_mac_address,
- "Set/get uAP mac address"},
- {"sys_cfg_ssid", apcmd_sys_cfg_ssid, "\tSet/get uAP ssid"},
- {"sys_cfg_beacon_period", apcmd_sys_cfg_beacon_period,
- "Set/get uAP beacon period"},
- {"sys_cfg_dtim_period", apcmd_sys_cfg_dtim_period,
- "Set/get uAP dtim period"},
- {"sys_cfg_channel", apcmd_sys_cfg_channel, "\tSet/get uAP radio channel"},
- {"sys_cfg_scan_channels", apcmd_sys_cfg_scan_channels,
- "Set/get uAP radio channel list"},
- {"sys_cfg_rates", apcmd_sys_cfg_rates, "\tSet/get uAP rates"},
- {"sys_cfg_rates_ext", apcmd_sys_cfg_rates_ext,
- "Set/get uAP rates (extended)"},
- {"sys_cfg_tx_power", apcmd_sys_cfg_tx_power, "Set/get uAP tx power"},
- {"sys_cfg_bcast_ssid_ctl", apcmd_sys_cfg_bcast_ssid_ctl,
- "Set/get uAP broadcast ssid"},
- {"sys_cfg_preamble_ctl", apcmd_sys_cfg_preamble_ctl, "Get uAP preamble"},
- {"sys_cfg_antenna_ctl", apcmd_sys_cfg_antenna_ctl,
- "Set/get uAP tx/rx antenna"},
- {"sys_cfg_rts_threshold", apcmd_sys_cfg_rts_threshold,
- "Set/get uAP rts threshold"},
- {"sys_cfg_frag_threshold", apcmd_sys_cfg_frag_threshold,
- "Set/get uAP frag threshold"},
- {"sys_cfg_radio_ctl", apcmd_sys_cfg_radio_ctl, "Set/get uAP radio on/off"},
- {"sys_cfg_tx_data_rate", apcmd_sys_cfg_tx_data_rate, "Set/get uAP tx rate"},
- {"sys_cfg_mcbc_data_rate", apcmd_sys_cfg_mcbc_data_rate,
- "Set/get uAP MCBC rate"},
- {"sys_cfg_rsn_replay_prot", apcmd_sys_cfg_rsn_replay_prot,
- "Set/get RSN replay protection"},
- {"sys_cfg_pkt_fwd_ctl", apcmd_sys_cfg_pkt_fwd_ctl,
- "Set/get uAP packet forwarding"},
- {"sys_cfg_sta_ageout_timer", apcmd_sys_cfg_sta_ageout_timer,
- "Set/get station ageout timer"},
- {"sys_cfg_auth", apcmd_sys_cfg_auth, "\tSet/get uAP authentication mode"},
- {"sys_cfg_protocol", apcmd_sys_cfg_protocol,
- "Set/get uAP security protocol"},
- {"sys_cfg_wep_key", apcmd_sys_cfg_wep_key, "\tSet/get uAP wep key"},
- {"sys_cfg_cipher", apcmd_sys_cfg_cipher, "\tSet/get uAP WPA/WPA cipher"},
- {"sys_cfg_wpa_passphrase", apcmd_sys_cfg_wpa_passphrase,
- "Set/get uAP WPA or WPA2 passphrase"},
- {"sys_cfg_group_rekey_timer", apcmd_sys_cfg_group_rekey_timer,
- "Set/get uAP group re-key time"},
- {"sys_cfg_max_sta_num", apcmd_sys_cfg_max_sta_num,
- "Set/get uAP max station number"},
- {"sys_cfg_retry_limit", apcmd_sys_cfg_retry_limit,
- "Set/get uAP retry limit number"},
- {"sys_cfg_custom_ie", apcmd_sys_cfg_custom_ie,
- "\tSet/get custom IE configuration"},
- {"sta_filter_table", apcmd_sta_filter_table, "Set/get uAP mac filter"},
- {"regrdwr", apcmd_regrdwr, "\t\tRead/Write register command"},
- {"memaccess", apcmd_memaccess, "\tRead/Write to a memory address command"},
- {"rdeeprom", apcmd_read_eeprom, "\tRead EEPROM "},
- {"cfg_data", apcmd_cfg_data,
- "\tGet/Set configuration file from/to firmware"},
- {"sys_debug", apcmd_sys_debug, "\tSet/Get debug parameter"},
- {"sys_cfg_80211d", apcmd_cfg_80211d, "\tSet/Get 802.11D info"},
- {"uap_stats", apcmd_uap_stats, "\tGet uAP stats"},
- {"powermode", apcmd_power_mode, "\tSet/get uAP power mode"},
- {"coex_config", apcmd_coex_config, "\tSet/get uAP BT coex configuration"},
- {NULL, NULL, 0}
-};
-
-/**
- * @brief Prints usage information of uaputl
- *
- * @return N/A
- */
-static void
-print_tool_usage(void)
-{
- int i;
- printf("uaputl.exe - uAP utility ver %s\n", UAP_VERSION);
- printf("Usage:\n"
- "\tuaputl.exe [options] <command> [command parameters]\n");
- printf("Options:\n"
- "\t--help\tDisplay help\n"
- "\t-v\tDisplay version\n"
- "\t-i <interface>\n" "\t-d <debug_level=0|1|2>\n");
- printf("Commands:\n");
- for (i = 0; ap_command[i].cmd; i++)
- printf("\t%-4s\t\t%s\n", ap_command[i].cmd, ap_command[i].help);
- printf("\n"
- "For more information on the usage of each command use:\n"
- "\tuaputl.exe <command> --help\n");
-}
-
-/****************************************************************************
- Global functions
-****************************************************************************/
-/** option parameter*/
-static struct option ap_options[] = {
- {"help", 0, NULL, 'h'},
- {"interface", 1, NULL, 'i'},
- {"debug", 1, NULL, 'd'},
- {"version", 0, NULL, 'v'},
- {NULL, 0, NULL, '\0'}
-};
-
-/**
- * @brief isdigit for String.
- *
- * @param x char string
- * @return UAP_FAILURE for non-digit.
- * UAP_SUCCESS for digit
- */
-inline int
-ISDIGIT(char *x)
-{
- int i;
- for (i = 0; i < strlen(x); i++)
- if (isdigit(x[i]) == 0)
- return UAP_FAILURE;
- return UAP_SUCCESS;
-}
-
-/**
- * @brief Checkes a particular input for validatation.
- *
- * @param cmd Type of input
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return UAP_SUCCESS or UAP_FAILURE
- */
-int
-is_input_valid(valid_inputs cmd, int argc, char *argv[])
-{
- int i;
- int ret = UAP_SUCCESS;
- if (argc == 0)
- return UAP_FAILURE;
- switch (cmd) {
- case RDEEPROM:
- if (argc != 2) {
- printf(" ERR: Argument count mismatch\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) || (ISDIGIT(argv[1]) == 0) ||
- (A2HEXDECIMAL(argv[0]) & 0x03) ||
- (A2HEXDECIMAL(argv[0]) < 0) ||
- (A2HEXDECIMAL(argv[1]) & 0x03) ||
- (A2HEXDECIMAL(argv[1]) < 4) || (A2HEXDECIMAL(argv[1]) > 20)) {
- printf(" ERR: Invalid inputs for Read EEPROM\n");
- ret = UAP_FAILURE;
- }
- }
- break;
- case SCANCHANNELS:
- if (argc > MAX_CHANNELS) {
- printf("ERR: Invalid List of Channels\n");
- ret = UAP_FAILURE;
- } else {
- for (i = 0; i < argc; i++) {
- if ((ISDIGIT(argv[i]) == 0) || (atoi(argv[i]) < 1) ||
- (atoi(argv[i]) > MAX_CHANNELS)) {
- printf("ERR: Channel must be in the range of 1 to %d\n",
- MAX_CHANNELS);
- ret = UAP_FAILURE;
- break;
- }
- }
- if ((ret != UAP_FAILURE) &&
- (has_dup_channel(argc, argv) != UAP_SUCCESS)) {
- printf("ERR: Duplicate channel values entered\n");
- ret = UAP_FAILURE;
- }
- }
- break;
- case TXPOWER:
- if ((argc > 1) || (ISDIGIT(argv[0]) == 0)) {
- printf("ERR:Invalid Transmit power\n");
- ret = UAP_FAILURE;
- } else {
- if ((atoi(argv[0]) < MIN_TX_POWER) ||
- (atoi(argv[0]) > MAX_TX_POWER)) {
- printf("ERR: TX Powar must be in the rage of %d to %d. \n",
- MIN_TX_POWER, MAX_TX_POWER);
- ret = UAP_FAILURE;
- }
- }
- break;
- case PROTOCOL:
- if ((argc > 1) || (ISDIGIT(argv[0]) == 0)) {
- printf("ERR:Invalid Protocol\n");
- ret = UAP_FAILURE;
- } else
- ret = is_protocol_valid(atoi(argv[0]));
- break;
- case CHANNEL:
- if ((argc != 1) && (argc != 2)) {
- printf("ERR: Incorrect arguments for channel.\n");
- ret = UAP_FAILURE;
- } else {
- if (argc == 2) {
- if ((ISDIGIT(argv[1]) == 0) || (atoi(argv[1]) < 0) ||
- (atoi(argv[1]) > 1)) {
- printf("ERR: MODE must be either 0 or 1\n");
- ret = UAP_FAILURE;
- }
- if ((atoi(argv[1]) == 1) && (atoi(argv[0]) != 0)) {
- printf("ERR: Channel must be 0 for ACS; MODE = 1.\n");
- ret = UAP_FAILURE;
- }
- }
- if ((argc == 1) || (atoi(argv[1]) == 0)) {
- if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) < 1) ||
- (atoi(argv[0]) > MAX_CHANNELS)) {
- printf("ERR: Channel must be in the range of 1 to %d\n",
- MAX_CHANNELS);
- ret = UAP_FAILURE;
- }
- }
- }
- break;
- case RATE:
- if (argc > MAX_RATES) {
- printf("ERR: Incorrect number of RATES arguments.\n");
- ret = UAP_FAILURE;
- } else {
- for (i = 0; i < argc; i++) {
- if ((IS_HEX_OR_DIGIT(argv[i]) == UAP_FAILURE) ||
- (is_rate_valid(A2HEXDECIMAL(argv[i]) & ~BASIC_RATE_SET_BIT)
- != UAP_SUCCESS)) {
- printf("ERR:Unsupported rate.\n");
- ret = UAP_FAILURE;
- break;
- }
- }
- if ((ret != UAP_FAILURE) &&
- (has_dup_rate(argc, argv) != UAP_SUCCESS)) {
- printf("ERR: Duplicate rate values entered\n");
- ret = UAP_FAILURE;
- }
- if (check_mandatory_rates(argc, argv) != UAP_SUCCESS) {
- ret = UAP_FAILURE;
- }
- }
- break;
- case BROADCASTSSID:
- if (argc != 1) {
- printf("ERR:wrong BROADCASTSSID arguments.\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) ||
- ((atoi(argv[0]) != 0) && (atoi(argv[0]) != 1))) {
- printf
- ("ERR:Illegal parameter %s for BROADCASTSSID. Must be either '0' or '1'.\n",
- argv[0]);
- ret = UAP_FAILURE;
- }
- }
- break;
- case RTSTHRESH:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for RTSTHRESHOLD\n");
- ret = UAP_FAILURE;
- } else if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) < 0) ||
- (atoi(argv[0]) > MAX_RTS_THRESHOLD)) {
- printf
- ("ERR:Illegal RTSTHRESHOLD %s. The value must between 0 and %d\n",
- argv[0], MAX_RTS_THRESHOLD);
- ret = UAP_FAILURE;
- }
- break;
- case FRAGTHRESH:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for FRAGTHRESH\n");
- ret = UAP_FAILURE;
- } else if ((ISDIGIT(argv[0]) == 0) ||
- (atoi(argv[0]) < MIN_FRAG_THRESHOLD) ||
- (atoi(argv[0]) > MAX_FRAG_THRESHOLD)) {
- printf
- ("ERR:Illegal FRAGTHRESH %s. The value must between %d and %d\n",
- argv[0], MIN_FRAG_THRESHOLD, MAX_FRAG_THRESHOLD);
- ret = UAP_FAILURE;
- }
- break;
- case DTIMPERIOD:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for DTIMPERIOD\n");
- ret = UAP_FAILURE;
- } else if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) < 1) ||
- (atoi(argv[0]) > MAX_DTIM_PERIOD)) {
- printf("ERR: DTIMPERIOD Value must be in range of 1 to %d\n",
- MAX_DTIM_PERIOD);
- ret = UAP_FAILURE;
- }
- break;
- case RADIOCONTROL:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for RADIOCONTROL\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) < 0) ||
- (atoi(argv[0]) > 1)) {
- printf
- ("ERR:Illegal RADIOCONTROL parameter %s. Must be either '0' or '1'.\n",
- argv[0]);
- ret = UAP_FAILURE;
- }
- }
- break;
- case RSNREPLAYPROT:
- if (argc != 1) {
- printf("ERR:wrong RSNREPLAYPROT arguments.\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) ||
- ((atoi(argv[0]) != 0) && (atoi(argv[0]) != 1))) {
- printf
- ("ERR:Illegal parameter %s for RSNREPLAYPROT. Must be either '0' or '1'.\n",
- argv[0]);
- ret = UAP_FAILURE;
- }
- }
- break;
- case MCBCDATARATE:
- case TXDATARATE:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for DATARATE\n");
- ret = UAP_FAILURE;
- } else {
- if (IS_HEX_OR_DIGIT(argv[0]) == UAP_FAILURE) {
- printf("ERR: invalid data rate\n");
- ret = UAP_FAILURE;
- } else if ((A2HEXDECIMAL(argv[0]) != 0) &&
- (is_rate_valid
- (A2HEXDECIMAL(argv[0]) & ~BASIC_RATE_SET_BIT) !=
- UAP_SUCCESS)) {
- printf("ERR: invalid data rate\n");
- ret = UAP_FAILURE;
- }
- }
- break;
- case PKTFWD:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for PKTFWD.\n");
- ret = UAP_FAILURE;
- } else if ((ISDIGIT(argv[0]) == 0) ||
- ((atoi(argv[0]) != 0) && (atoi(argv[0]) != 1))) {
- printf
- ("ERR:Illegal PKTFWD parameter %s. Must be either '0' or '1'.\n",
- argv[0]);
- ret = UAP_FAILURE;
- }
- break;
- case STAAGEOUTTIMER:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for STAAGEOUTTIMER.\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) || ((atoi(argv[0]) != 0) &&
- ((atoi(argv[0]) <
- MIN_STAGE_OUT_TIME) ||
- (atoi(argv[0]) >
- MAX_STAGE_OUT_TIME)))) {
- printf
- ("ERR:Illegal STAAGEOUTTIMER %s. Must be between %d and %d.\n",
- argv[0], MIN_STAGE_OUT_TIME, MAX_STAGE_OUT_TIME);
- ret = UAP_FAILURE;
- }
- }
- break;
- case AUTHMODE:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for AUTHMODE\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) < 0) ||
- (atoi(argv[0]) > 1)) {
- printf
- ("ERR:Illegal AUTHMODE parameter %s. Must be either '0', or '1'.\n",
- argv[0]);
- ret = UAP_FAILURE;
- }
- }
- break;
- case GROUPREKEYTIMER:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for GROUPREKEYTIMER.\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) < 0) ||
- (atoi(argv[0]) > MAX_GRP_TIMER)) {
- printf("ERR: GROUPREKEYTIMER range is [0:%d] (0 for disable)\n",
- MAX_GRP_TIMER);
- ret = UAP_FAILURE;
- }
- }
- break;
- case MAXSTANUM:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for MAXSTANUM\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) > 8) ||
- (atoi(argv[0]) < 0)) {
- printf("ERR:STA_NUM must be in the range of [0:8] %s.\n",
- argv[0]);
- ret = UAP_FAILURE;
- }
- }
- break;
- case BEACONPERIOD:
- if (argc != 1) {
- printf("ERR:Incorrect number of argument for BEACONPERIOD.\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) < MIN_BEACON_PERIOD)
- || (atoi(argv[0]) > MAX_BEACON_PERIOD)) {
- printf("ERR: BEACONPERIOD must be in range of %d to %d.\n",
- MIN_BEACON_PERIOD, MAX_BEACON_PERIOD);
- ret = UAP_FAILURE;
- }
- }
- break;
- case RETRYLIMIT:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for RETRY LIMIT\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) > MAX_RETRY_LIMIT) ||
- (atoi(argv[0]) < 0)) {
- printf
- ("ERR:RETRY_LIMIT must be in the range of [0:%d]. The input was %s.\n",
- MAX_RETRY_LIMIT, argv[0]);
- ret = UAP_FAILURE;
- }
- }
- break;
- case COEX_COMM_BITMAP:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for Bitmap.\n");
- ret = UAP_FAILURE;
- } else {
- /* Only bit 0 is supported now, hence check for 1 or 0 */
- if ((IS_HEX_OR_DIGIT(argv[0]) == 0) || (atoi(argv[0]) < 0) ||
- (atoi(argv[0]) > 1)) {
- printf("ERR: Bitmap must have value of 1 or 0.\n");
- ret = UAP_FAILURE;
- }
- }
- break;
- case COEX_SCO_ACL_FREQ:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for aclFrequency.\n");
- ret = UAP_FAILURE;
- } else {
- if (ISDIGIT(argv[0]) == 0) {
- printf("ERR: Incorrect value for aclFrequency.\n");
- ret = UAP_FAILURE;
- }
- }
- break;
- case COEX_ACL_ENABLED:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for (acl) enabled.\n");
- ret = UAP_FAILURE;
- } else {
- if ((ISDIGIT(argv[0]) == 0) || (atoi(argv[0]) < 0) ||
- (atoi(argv[0]) > 1)) {
- printf("ERR: (acl) enabled must have value of 1 or 0.\n");
- ret = UAP_FAILURE;
- }
- }
- break;
- case COEX_ACL_BT_TIME:
- case COEX_ACL_WLAN_TIME:
- if (argc != 1) {
- printf("ERR:Incorrect number of arguments for bt/wlan time.\n");
- ret = UAP_FAILURE;
- } else {
- if (ISDIGIT(argv[0]) == 0) {
- printf("ERR: Incorrect value for bt/wlan time.\n");
- ret = UAP_FAILURE;
- }
- }
- break;
- case COEX_PROTECTION:
- if (argc != 2) {
- printf("ERR:Incorrect number of arguments for %s.\n", argv[0]);
- ret = UAP_FAILURE;
- } else {
- if (ISDIGIT(argv[1]) == 0) {
- printf("ERR: Incorrect value for %s.\n", argv[0]);
- ret = UAP_FAILURE;
- }
- }
- break;
- default:
- ret = UAP_FAILURE;
- break;
- }
- return ret;
-}
-
-/**
- * @brief Converts colon separated MAC address to hex value
- *
- * @param mac A pointer to the colon separated MAC string
- * @param raw A pointer to the hex data buffer
- * @return UAP_SUCCESS or UAP_FAILURE
- * UAP_RET_MAC_BROADCAST - if broadcast mac
- * UAP_RET_MAC_MULTICAST - if multicast mac
- */
-int
-mac2raw(char *mac, u8 * raw)
-{
- unsigned int temp_raw[ETH_ALEN];
- int num_tokens = 0;
- int i;
- if (strlen(mac) != ((2 * ETH_ALEN) + (ETH_ALEN - 1))) {
- return UAP_FAILURE;
- }
- num_tokens = sscanf(mac, "%2x:%2x:%2x:%2x:%2x:%2x",
- temp_raw + 0, temp_raw + 1, temp_raw + 2, temp_raw + 3,
- temp_raw + 4, temp_raw + 5);
- if (num_tokens != ETH_ALEN) {
- return UAP_FAILURE;
- }
- for (i = 0; i < num_tokens; i++)
- raw[i] = (u8) temp_raw[i];
-
- if (memcmp(raw, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0) {
- return UAP_RET_MAC_BROADCAST;
- } else if (raw[0] & 0x01) {
- return UAP_RET_MAC_MULTICAST;
- }
- return UAP_SUCCESS;
-}
-
-/**
- * @brief Converts a string to hex value
- *
- * @param str A pointer to the string
- * @param raw A pointer to the raw data buffer
- * @return Number of bytes read
- */
-int
-string2raw(char *str, unsigned char *raw)
-{
- int len = (strlen(str) + 1) / 2;
-
- do {
- if (!isxdigit(*str)) {
- return -1;
- }
- *str = toupper(*str);
- *raw = CHAR2INT(*str) << 4;
- ++str;
- *str = toupper(*str);
- if (*str == '\0')
- break;
- *raw |= CHAR2INT(*str);
- ++raw;
- } while (*++str != '\0');
- return len;
-}
-
-/**
- * @brief Prints a MAC address in colon separated form from hex data
- *
- * @param raw A pointer to the hex data buffer
- * @return N/A
- */
-void
-print_mac(u8 * raw)
-{
- printf("%02x:%02x:%02x:%02x:%02x:%02x", (unsigned int) raw[0],
- (unsigned int) raw[1], (unsigned int) raw[2], (unsigned int) raw[3],
- (unsigned int) raw[4], (unsigned int) raw[5]);
- return;
-}
-
-/**
- * @brief check hex string
- *
- * @param hex A pointer to hex string
- * @return UAP_SUCCESS or UAP_FAILURE
- */
-int
-ishexstring(void *hex)
-{
- int i, a;
- char *p = hex;
- int len = strlen(p);
- if (!strncasecmp("0x", p, 2)) {
- p += 2;
- len -= 2;
- }
- for (i = 0; i < len; i++) {
- a = hex2num(*p);
- if (a < 0)
- return UAP_FAILURE;
- p++;
- }
- return UAP_SUCCESS;
-}
-
-/**
- * @brief Show auth tlv
- *
- * @param tlv Poniter to auth tlv
- *
- * $return N/A
- */
-void
-print_auth(TLVBUF_AUTH_MODE * tlv)
-{
- switch (tlv->AuthMode) {
- case 0:
- printf("AUTHMODE = Open authentication\n");
- break;
- case 1:
- printf("AUTHMODE = Shared key authentication\n");
- break;
- case 2:
- printf("AUTHMODE = Auto (open and shared key)\n");
- break;
- default:
- printf("ERR: Invalid authmode=%d\n", tlv->AuthMode);
- break;
- }
-}
-
-/**
- *
- * @brief Show cipher tlv
- *
- * @param tlv Poniter to cipher tlv
- *
- * $return N/A
- */
-void
-print_cipher(TLVBUF_CIPHER * tlv)
-{
- switch (tlv->PairwiseCipher) {
- case CIPHER_TKIP:
- printf("PairwiseCipher = TKIP\n");
- break;
- case CIPHER_AES_CCMP:
- printf("PairwiseCipher = AES CCMP\n");
- break;
- case CIPHER_TKIP | CIPHER_AES_CCMP:
- printf("PairwiseCipher = TKIP + AES CCMP\n");
- break;
- case CIPHER_NONE:
- printf("PairwiseCipher = None\n");
- break;
- default:
- printf("Unknown Pairwise cipher 0x%x\n", tlv->PairwiseCipher);
- break;
- }
- switch (tlv->GroupCipher) {
- case CIPHER_TKIP:
- printf("GroupCipher = TKIP\n");
- break;
- case CIPHER_AES_CCMP:
- printf("GroupCipher = AES CCMP\n");
- break;
- case CIPHER_NONE:
- printf("GroupCipher = None\n");
- break;
- default:
- printf("Unknown Group cipher 0x%x\n", tlv->GroupCipher);
- break;
- }
-}
-
-/**
- * @brief Show mac filter tlv
- *
- * @param tlv Poniter to filter tlv
- *
- * $return N/A
- */
-void
-print_mac_filter(TLVBUF_STA_MAC_ADDR_FILTER * tlv)
-{
- int i;
- switch (tlv->FilterMode) {
- case 0:
- printf("Filter Mode = Filter table is disabled\n");
- return;
- case 1:
- printf
- ("Filter Mode = Allow mac address specified in the allwed list\n");
- break;
- case 2:
- printf
- ("Filter Mode = Block MAC addresses specified in the banned list\n");
- break;
- }
- for (i = 0; i < tlv->Count; i++) {
- printf("MAC_%d = ", i);
- print_mac(&tlv->MacAddress[i * ETH_ALEN]);
- printf("\n");
- }
-}
-
-/**
- * @brief Show rate tlv
- *
- * @param tlv Poniter to rate tlv
- *
- * $return N/A
- */
-void
-print_rate(TLVBUF_RATES * tlv)
-{
- int flag = 0;
- int i;
- printf("Basic Rates =");
- for (i = 0; i < tlv->Length; i++) {
- if (tlv->OperationalRates[i] > (BASIC_RATE_SET_BIT - 1)) {
- flag = flag ? : 1;
- printf(" 0x%x", tlv->OperationalRates[i]);
- }
- }
- printf("%s\nNon-Basic Rates =", flag ? "" : " ( none ) ");
- for (flag = 0, i = 0; i < tlv->Length; i++) {
- if (tlv->OperationalRates[i] < BASIC_RATE_SET_BIT) {
- flag = flag ? : 1;
- printf(" 0x%x", tlv->OperationalRates[i]);
- }
- }
- printf("%s\n", flag ? "" : " ( none ) ");
-}
-
-/**
- * @brief Show all the tlv in the buf
- *
- * @param buf Poniter to tlv buffer
- * @param len tlv buffer len
- *
- * $return N/A
- */
-void
-print_tlv(u8 * buf, u16 len)
-{
- TLVBUF_HEADER *pCurrentTlv = (TLVBUF_HEADER *) buf;
- int tlvBufLeft = len;
- u16 tlvType;
- u16 tlvLen;
- u16 custom_ie_len;
- u8 ssid[33];
- int i = 0;
- TLVBUF_AP_MAC_ADDRESS *mac_tlv;
- TLVBUF_SSID *ssid_tlv;
- TLVBUF_BEACON_PERIOD *beacon_tlv;
- TLVBUF_DTIM_PERIOD *dtim_tlv;
- TLVBUF_RATES *rates_tlv;
- TLVBUF_TX_POWER *txpower_tlv;
- TLVBUF_BCAST_SSID_CTL *bcast_tlv;
- TLVBUF_PREAMBLE_CTL *preamble_tlv;
- TLVBUF_ANTENNA_CTL *antenna_tlv;
- TLVBUF_RTS_THRESHOLD *rts_tlv;
- TLVBUF_RADIO_CTL *radio_tlv;
- TLVBUF_TX_DATA_RATE *txrate_tlv;
- TLVBUF_MCBC_DATA_RATE *mcbcrate_tlv;
- TLVBUF_PKT_FWD_CTL *pkt_fwd_tlv;
- TLVBUF_STA_AGEOUT_TIMER *ageout_tlv;
- TLVBUF_AUTH_MODE *auth_tlv;
- TLVBUF_PROTOCOL *proto_tlv;
- TLVBUF_AKMP *akmp_tlv;
- TLVBUF_CIPHER *cipher_tlv;
- TLVBUF_GROUP_REKEY_TIMER *rekey_tlv;
- TLVBUF_WPA_PASSPHRASE *psk_tlv;
- TLVBUF_WEP_KEY *wep_tlv;
- TLVBUF_FRAG_THRESHOLD *frag_tlv;
- TLVBUF_STA_MAC_ADDR_FILTER *filter_tlv;
- TLVBUF_MAX_STA_NUM *max_sta_tlv;
- TLVBUF_RETRY_LIMIT *retry_limit_tlv;
- TLVBUF_CHANNEL_CONFIG *channel_tlv;
- TLVBUF_CHANNEL_LIST *chnlist_tlv;
- tlvbuf_custom_ie *custom_ie_tlv;
- custom_ie *custom_ie_ptr;
- tlvbuf_coex_common_cfg *coex_common_tlv;
- tlvbuf_coex_sco_cfg *coex_sco_tlv;
- tlvbuf_coex_acl_cfg *coex_acl_tlv;
- tlvbuf_coex_stats *coex_stats_tlv;
- CHANNEL_LIST *pChanList;
-#ifdef DEBUG
- uap_printf(MSG_DEBUG, "tlv total len=%d\n", len);
-#endif
- while (tlvBufLeft >= (int) sizeof(TLVBUF_HEADER)) {
- tlvType = uap_le16_to_cpu(pCurrentTlv->Type);
- tlvLen = uap_le16_to_cpu(pCurrentTlv->Len);
- if ((sizeof(TLVBUF_HEADER) + tlvLen) > tlvBufLeft) {
- printf("wrong tlv: tlvLen=%d, tlvBufLeft=%d\n", tlvLen, tlvBufLeft);
- break;
- }
- switch (tlvType) {
- case MRVL_AP_MAC_ADDRESS_TLV_ID:
- mac_tlv = (TLVBUF_AP_MAC_ADDRESS *) pCurrentTlv;
- printf("AP MAC address = ");
- print_mac(mac_tlv->ApMacAddr);
- printf("\n");
- break;
- case MRVL_SSID_TLV_ID:
- memset(ssid, 0, sizeof(ssid));
- ssid_tlv = (TLVBUF_SSID *) pCurrentTlv;
- memcpy(ssid, ssid_tlv->Ssid, ssid_tlv->Length);
- printf("SSID = %s\n", ssid);
- break;
- case MRVL_BEACON_PERIOD_TLV_ID:
- beacon_tlv = (TLVBUF_BEACON_PERIOD *) pCurrentTlv;
- beacon_tlv->BeaconPeriod_ms =
- uap_le16_to_cpu(beacon_tlv->BeaconPeriod_ms);
- printf("Beacon period = %d\n", beacon_tlv->BeaconPeriod_ms);
- break;
- case MRVL_DTIM_PERIOD_TLV_ID:
- dtim_tlv = (TLVBUF_DTIM_PERIOD *) pCurrentTlv;
- printf("DTIM period = %d\n", dtim_tlv->DtimPeriod);
- break;
- case MRVL_CHANNELCONFIG_TLV_ID:
- channel_tlv = (TLVBUF_CHANNEL_CONFIG *) pCurrentTlv;
- printf("Channel = %d\n", channel_tlv->ChanNumber);
- printf("Channel Select Mode = %s\n",
- (channel_tlv->BandConfigType == 0) ? "Manual" : "ACS");
- break;
- case MRVL_CHANNELLIST_TLV_ID:
- chnlist_tlv = (TLVBUF_CHANNEL_LIST *) pCurrentTlv;
- printf("Channels List = ");
- pChanList = (CHANNEL_LIST *) & (chnlist_tlv->ChanList);
- if (chnlist_tlv->Length % sizeof(CHANNEL_LIST)) {
- break;
- }
- for (i = 0; i < (chnlist_tlv->Length / sizeof(CHANNEL_LIST)); i++) {
- printf("%d ", pChanList->ChanNumber);
- pChanList++;
- }
- printf("\n");
- break;
- case MRVL_RATES_TLV_ID:
- rates_tlv = (TLVBUF_RATES *) pCurrentTlv;
- print_rate(rates_tlv);
- break;
- case MRVL_TX_POWER_TLV_ID:
- txpower_tlv = (TLVBUF_TX_POWER *) pCurrentTlv;
- printf("Tx power = %d dBm\n", txpower_tlv->TxPower_dBm);
- break;
- case MRVL_BCAST_SSID_CTL_TLV_ID:
- bcast_tlv = (TLVBUF_BCAST_SSID_CTL *) pCurrentTlv;
- printf("SSID broadcast = %s\n",
- (bcast_tlv->BcastSsidCtl == 1) ? "enabled" : "disabled");
- break;
- case MRVL_PREAMBLE_CTL_TLV_ID:
- preamble_tlv = (TLVBUF_PREAMBLE_CTL *) pCurrentTlv;
- printf("Preamble type = %s\n", (preamble_tlv->PreambleType == 0) ?
- "auto" : ((preamble_tlv->PreambleType == 1) ? "short" :
- "long"));
- break;
- case MRVL_ANTENNA_CTL_TLV_ID:
- antenna_tlv = (TLVBUF_ANTENNA_CTL *) pCurrentTlv;
- printf("%s antenna = %s\n", (antenna_tlv->WhichAntenna == 0) ?
- "Rx" : "Tx", (antenna_tlv->AntennaMode == 0) ? "A" : "B");
- break;
- case MRVL_RTS_THRESHOLD_TLV_ID:
- rts_tlv = (TLVBUF_RTS_THRESHOLD *) pCurrentTlv;
- rts_tlv->RtsThreshold = uap_le16_to_cpu(rts_tlv->RtsThreshold);
- printf("RTS threshold = %d\n", rts_tlv->RtsThreshold);
- break;
- case MRVL_FRAG_THRESHOLD_TLV_ID:
- frag_tlv = (TLVBUF_FRAG_THRESHOLD *) pCurrentTlv;
- frag_tlv->FragThreshold = uap_le16_to_cpu(frag_tlv->FragThreshold);
- printf("Fragmentation threshold = %d\n", frag_tlv->FragThreshold);
- break;
- case MRVL_RADIO_CTL_TLV_ID:
- radio_tlv = (TLVBUF_RADIO_CTL *) pCurrentTlv;
- printf("Radio = %s\n", (radio_tlv->RadioCtl == 0) ? "on" : "off");
- break;
- case MRVL_TX_DATA_RATE_TLV_ID:
- txrate_tlv = (TLVBUF_TX_DATA_RATE *) pCurrentTlv;
- txrate_tlv->TxDataRate = uap_le16_to_cpu(txrate_tlv->TxDataRate);
- if (txrate_tlv->TxDataRate == 0)
- printf("Tx data rate = auto\n");
- else
- printf("Tx data rate = 0x%x\n", txrate_tlv->TxDataRate);
- break;
- case MRVL_MCBC_DATA_RATE_TLV_ID:
- mcbcrate_tlv = (TLVBUF_MCBC_DATA_RATE *) pCurrentTlv;
- mcbcrate_tlv->MCBCdatarate =
- uap_le16_to_cpu(mcbcrate_tlv->MCBCdatarate);
- if (mcbcrate_tlv->MCBCdatarate == 0)
- printf("MCBC data rate = auto\n");
- else
- printf("MCBC data rate = 0x%x\n", mcbcrate_tlv->MCBCdatarate);
- break;
- case MRVL_PKT_FWD_CTL_TLV_ID:
- pkt_fwd_tlv = (TLVBUF_PKT_FWD_CTL *) pCurrentTlv;
- printf("Firmware = %s\n", (pkt_fwd_tlv->PktFwdCtl == 0) ?
- "forwards all packets to the host" :
- "handles intra-BSS packets");
- break;
- case MRVL_STA_AGEOUT_TIMER_TLV_ID:
- ageout_tlv = (TLVBUF_STA_AGEOUT_TIMER *) pCurrentTlv;
- ageout_tlv->StaAgeoutTimer_ms =
- uap_le32_to_cpu(ageout_tlv->StaAgeoutTimer_ms);
- printf("STA ageout timer = %d\n",
- (int) ageout_tlv->StaAgeoutTimer_ms);
- break;
- case MRVL_AUTH_TLV_ID:
- auth_tlv = (TLVBUF_AUTH_MODE *) pCurrentTlv;
- print_auth(auth_tlv);
- break;
- case MRVL_PROTOCOL_TLV_ID:
- proto_tlv = (TLVBUF_PROTOCOL *) pCurrentTlv;
- proto_tlv->Protocol = uap_le16_to_cpu(proto_tlv->Protocol);
- print_protocol(proto_tlv);
- break;
- case MRVL_AKMP_TLV_ID:
- akmp_tlv = (TLVBUF_AKMP *) pCurrentTlv;
- if (uap_le16_to_cpu(akmp_tlv->KeyMgmt) == KEY_MGMT_PSK)
- printf("KeyMgmt = PSK\n");
- else
- printf("KeyMgmt = NONE\n");
- break;
- case MRVL_CIPHER_TLV_ID:
- cipher_tlv = (TLVBUF_CIPHER *) pCurrentTlv;
- print_cipher(cipher_tlv);
- break;
- case MRVL_GRP_REKEY_TIME_TLV_ID:
- rekey_tlv = (TLVBUF_GROUP_REKEY_TIMER *) pCurrentTlv;
- if (rekey_tlv->GroupRekeyTime_sec == 0)
- printf("Group re-key time = disabled\n");
- else
- printf("Group re-key time = %ld second\n",
- uap_le32_to_cpu(rekey_tlv->GroupRekeyTime_sec));
- break;
- case MRVL_WPA_PASSPHRASE_TLV_ID:
- psk_tlv = (TLVBUF_WPA_PASSPHRASE *) pCurrentTlv;
- if (psk_tlv->Length > 0) {
- printf("WPA passphrase = ");
- for (i = 0; i < psk_tlv->Length; i++)
- printf("%c", psk_tlv->Passphrase[i]);
- printf("\n");
- } else
- printf("WPA passphrase = None\n");
- break;
- case MRVL_WEP_KEY_TLV_ID:
- wep_tlv = (TLVBUF_WEP_KEY *) pCurrentTlv;
- print_wep_key(wep_tlv);
- break;
- case MRVL_STA_MAC_ADDR_FILTER_TLV_ID:
- filter_tlv = (TLVBUF_STA_MAC_ADDR_FILTER *) pCurrentTlv;
- print_mac_filter(filter_tlv);
- break;
- case MRVL_MAX_STA_CNT_TLV_ID:
- max_sta_tlv = (TLVBUF_MAX_STA_NUM *) pCurrentTlv;
- printf("Max Station Number = %d\n", max_sta_tlv->Max_sta_num);
- break;
- case MRVL_RETRY_LIMIT_TLV_ID:
- retry_limit_tlv = (TLVBUF_RETRY_LIMIT *) pCurrentTlv;
- printf("Retry Limit = %d\n", retry_limit_tlv->retry_limit);
- break;
- case MRVL_MGMT_IE_LIST_TLV_ID:
- custom_ie_tlv = (tlvbuf_custom_ie *) pCurrentTlv;
- custom_ie_len = tlvLen;
- custom_ie_ptr = (custom_ie *) (custom_ie_tlv->ie_data);
- while (custom_ie_len >= sizeof(custom_ie)) {
- printf("Index [%d]\n",
- uap_le16_to_cpu(custom_ie_ptr->ie_index));
- printf("Management Subtype Mask = 0x%02x\n",
- uap_le16_to_cpu(custom_ie_ptr->mgmt_subtype_mask));
- hexdump_data("IE Buffer", (void *) custom_ie_ptr->ie_buffer,
- uap_le16_to_cpu(custom_ie_ptr->ie_length), ' ');
- custom_ie_len -=
- sizeof(custom_ie) +
- uap_le16_to_cpu(custom_ie_ptr->ie_length);
- custom_ie_ptr =
- (custom_ie *) ((u8 *) custom_ie_ptr + sizeof(custom_ie) +
- uap_le16_to_cpu(custom_ie_ptr->ie_length));
- }
- break;
- case MRVL_BT_COEX_COMMON_CFG_TLV_ID:
- printf("Coex common configuration:\n");
- coex_common_tlv = (tlvbuf_coex_common_cfg *) pCurrentTlv;
- printf("\tConfig Bitmap = 0x%02lx\n",
- uap_le32_to_cpu(coex_common_tlv->config_bitmap));
- break;
-
- case MRVL_BT_COEX_SCO_CFG_TLV_ID:
- printf("Coex sco configuration:\n");
- coex_sco_tlv = (tlvbuf_coex_sco_cfg *) pCurrentTlv;
- for (i = 0; i < 4; i++)
- printf("\tQtime protection [%d] = %d usecs\n", i,
- uap_le16_to_cpu(coex_sco_tlv->protection_qtime[i]));
- printf("\tProtection frame rate = %d\n",
- uap_le16_to_cpu(coex_sco_tlv->protection_rate));
- printf("\tACL frequency = %d\n",
- uap_le16_to_cpu(coex_sco_tlv->acl_frequency));
- break;
-
- case MRVL_BT_COEX_ACL_CFG_TLV_ID:
- printf("Coex acl configuration: ");
- coex_acl_tlv = (tlvbuf_coex_acl_cfg *) pCurrentTlv;
- coex_acl_tlv->enabled = uap_le16_to_cpu(coex_acl_tlv->enabled);
- printf("%s\n", (coex_acl_tlv->enabled) ? "enabled" : "disabled");
- if (coex_acl_tlv->enabled) {
- printf("\tBT time = %d usecs\n",
- uap_le16_to_cpu(coex_acl_tlv->bt_time));
- printf("\tWLan time = %d usecs\n",
- uap_le16_to_cpu(coex_acl_tlv->wlan_time));
- printf("\tProtection frame rate = %d\n",
- uap_le16_to_cpu(coex_acl_tlv->protection_rate));
- }
- break;
-
- case MRVL_BT_COEX_STATS_TLV_ID:
- printf("Coex statistics: \n");
- coex_stats_tlv = (tlvbuf_coex_stats *) pCurrentTlv;
- printf("\tNull not sent = %ld\n",
- uap_le32_to_cpu(coex_stats_tlv->null_not_sent));
- printf("\tNull queued = %ld\n",
- uap_le32_to_cpu(coex_stats_tlv->null_queued));
- printf("\tNull not queued = %ld\n",
- uap_le32_to_cpu(coex_stats_tlv->null_not_queued));
- printf("\tCF End queued = %ld\n",
- uap_le32_to_cpu(coex_stats_tlv->cf_end_queued));
- printf("\tCF End not queued = %ld\n",
- uap_le32_to_cpu(coex_stats_tlv->cf_end_not_queued));
- printf("\tNull allocation failures = %ld\n",
- uap_le32_to_cpu(coex_stats_tlv->null_alloc_fail));
- printf("\tCF End allocation failures = %ld\n",
- uap_le32_to_cpu(coex_stats_tlv->cf_end_alloc_fail));
- break;
- default:
- break;
- }
- tlvBufLeft -= (sizeof(TLVBUF_HEADER) + tlvLen);
- pCurrentTlv = (TLVBUF_HEADER *) (pCurrentTlv->Data + tlvLen);
- }
- return;
-}
-
-/**
- * @brief Performs the ioctl operation to send the command to
- * the driver.
- *
- * @param cmd Pointer to the command buffer
- * @param size Pointer to the command size. This value is
- * overwritten by the function with the size of the
- * received response.
- * @param buf_size Size of the allocated command buffer
- * @return UAP_SUCCESS or UAP_FAILURE
- */
-int
-uap_ioctl(u8 * cmd, u16 * size, u16 buf_size)
-{
- struct ifreq ifr;
- APCMDBUF *header = NULL;
- s32 sockfd;
-
- if (buf_size < *size) {
- printf("buf_size should not less than cmd buffer size\n");
- return UAP_FAILURE;
- }
-
- /* Open socket */
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- printf("ERR:Cannot open socket\n");
- return UAP_FAILURE;
- }
- *(u32 *) cmd = buf_size - BUF_HEADER_SIZE;
-
- /* Initialize the ifr structure */
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_ifrn.ifrn_name, dev_name, strlen(dev_name));
- ifr.ifr_ifru.ifru_data = (void *) cmd;
- header = (APCMDBUF *) cmd;
- header->Size = *size - BUF_HEADER_SIZE;
- if (header->CmdCode == APCMD_SYS_CONFIGURE) {
- APCMDBUF_SYS_CONFIGURE *sys_cfg;
- sys_cfg = (APCMDBUF_SYS_CONFIGURE *) cmd;
- sys_cfg->Action = uap_cpu_to_le16(sys_cfg->Action);
- }
- endian_convert_request_header(header);
-#if DEBUG
- /* Dump request buffer */
- hexdump("Request buffer", (void *) cmd, *size, ' ');
-#endif
- /* Perform ioctl */
- errno = 0;
- if (ioctl(sockfd, UAPHOSTCMD, &ifr)) {
- perror("");
- printf("ERR:UAPHOSTCMD is not supported by %s\n", dev_name);
- close(sockfd);
- return UAP_FAILURE;
- }
- endian_convert_response_header(header);
- header->CmdCode &= HostCmd_CMD_ID_MASK;
- header->CmdCode |= APCMD_RESP_CHECK;
- *size = header->Size;
-
- /* Validate response size */
- if (*size > (buf_size - BUF_HEADER_SIZE)) {
- printf
- ("ERR:Response size (%d) greater than buffer size (%d)! Aborting!\n",
- *size, buf_size);
- close(sockfd);
- return UAP_FAILURE;
- }
-#if DEBUG
- /* Dump respond buffer */
- hexdump("Respond buffer", (void *) header, header->Size + BUF_HEADER_SIZE,
- ' ');
-#endif
-
- /* Close socket */
- close(sockfd);
- return UAP_SUCCESS;
-}
-
-/**
- * @brief check cipher is valid or not
- *
- * @param pairwisecipher pairwise cipher
- * @param groupcipher group cipher
- * @return UAP_SUCCESS or UAP_FAILURE
- */
-int
-is_cipher_valid(int pairwisecipher, int groupcipher)
-{
- if ((pairwisecipher == CIPHER_NONE) && (groupcipher == CIPHER_NONE))
- return UAP_SUCCESS;
- if ((pairwisecipher == CIPHER_TKIP) && (groupcipher == CIPHER_TKIP))
- return UAP_SUCCESS;
- if ((pairwisecipher == CIPHER_AES_CCMP) && (groupcipher == CIPHER_AES_CCMP))
- return UAP_SUCCESS;
- if ((pairwisecipher == CIPHER_BITMAP) && (groupcipher == CIPHER_TKIP))
- return UAP_SUCCESS;
- return UAP_FAILURE;
-}
-
-/**
- * @brief The main function
- *
- * @param argc Number of arguments
- * @param argv Pointer to the arguments
- * @return 0 or 1
- */
-int
-main(int argc, char *argv[])
-{
- int opt, i;
- memset(dev_name, 0, sizeof(dev_name));
- strcpy(dev_name, DEFAULT_DEV_NAME);
-
- /* parse arguments */
- while ((opt = getopt_long(argc, argv, "+hi:d:v", ap_options, NULL)) != -1) {
- switch (opt) {
- case 'i':
- if (strlen(optarg) < IFNAMSIZ) {
- memset(dev_name, 0, sizeof(dev_name));
- strncpy(dev_name, optarg, strlen(optarg));
- }
- printf("dev_name:%s\n", dev_name);
- break;
- case 'v':
- printf("uaputl.exe - uAP utility ver %s\n", UAP_VERSION);
- exit(0);
- case 'd':
- debug_level = strtoul(optarg, NULL, 10);
- uap_printf(MSG_DEBUG, "debug_level=%x\n", debug_level);
- break;
- case 'h':
- default:
- print_tool_usage();
- exit(0);
- }
- }
-
- argc -= optind;
- argv += optind;
- optind = 0;
-
- if (argc < 1) {
- print_tool_usage();
- exit(1);
- }
-
- /* process command */
- for (i = 0; ap_command[i].cmd; i++) {
- if (strncmp(ap_command[i].cmd, argv[0], strlen(ap_command[i].cmd)))
- continue;
- if (strlen(ap_command[i].cmd) != strlen(argv[0]))
- continue;
- ap_command[i].func(argc, argv);
- break;
- }
- if (!ap_command[i].cmd) {
- printf("ERR: %s is not supported\n", argv[0]);
- exit(1);
- }
- return 0;
-}