/*
 * Common code for wl command line utility
 *
 * Broadcom Proprietary and Confidential. Copyright (C) 2017,
 * All Rights Reserved.
 * 
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom;
 * the contents of this file may not be disclosed to third parties, copied
 * or duplicated in any form, in whole or in part, without the prior
 * written permission of Broadcom.
 *
 *
 * <<Broadcom-WL-IPTag/Proprietary:>>
 * All Rights Reserved.
 *
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
 * the contents of this file may not be disclosed to third parties, copied or
 * duplicated in any form, in whole or in part, without the prior written
 * permission of Broadcom Corporation.
 *
 * $Id: wlu.h 660248 2016-09-19 21:45:03Z $
 */

#ifndef _wlu_h_
#define _wlu_h_

#include <proto/bcmipv6.h>
#include "wlu_cmd.h"

#if defined(__FreeBSD__)
#define stricmp   strcasecmp
#define strnicmp  strncasecmp
#endif

typedef struct {
	uint value;
	const char *string;
} dbg_msg_t;

typedef struct {
	int8 pwr2p5;
	int8 pwr5;
	int8 pwr10;
	int8 pwr20;
	int8 pwr40;
	int8 pwr20in40;
	int8 pwr80;
	int8 pwr20in80;
	int8 pwr40in80;
	int8 pwr160;
	int8 pwr20in160;
	int8 pwr40in160;
	int8 pwr80in160;
	int8 pwr8080;
	int8 pwr8080chan2;
	int8 pwr20in8080;
	int8 pwr40in8080;
	int8 pwr80in8080;
} txpwr_row_t;

extern const char *wlu_av0;
extern int g_wlc_idx;

struct escan_bss {
	struct escan_bss *next;
	wl_bss_info_t bss[1];
};

/* parse common option */
extern int wl_option(char ***pargv, char **pifname, int *phelp);
extern void wl_cmd_init(void);
extern void wlu_init(void);

/* print usage */
extern void wl_cmd_usage(FILE *fid, cmd_t *cmd);
extern void wl_usage(FILE *fid, cmd_t *port_cmds);
extern void wl_cmds_usage(FILE *fid, cmd_t *port_cmds);

/* print helpers */
extern void wl_printlasterror(void *wl);
extern void wl_printint(int val);

/* pretty print an SSID */
extern int wl_format_ssid(char* buf, uint8* ssid, int ssid_len);

/* pretty hex print a contiguous buffer */
extern void wl_hexdump(uchar *buf, uint nbytes);

/* check driver version */
extern int wl_check(void *wl);

/* returns major version from "wlc_ver" command */
extern int wlc_ver_major(void * wl);

extern int wlu_bssiovar_setbuf(void* wl, const char *iovar, int bssidx,
	void *param, int paramlen, void *bufptr, int buflen);
extern int wlu_var_getbuf(void *wl, const char *iovar,
	void *param, int param_len, void **bufptr);
extern int wlu_var_getbuf_sm(void *wl, const char *iovar,
	void *param, int param_len, void **bufptr);
extern int wlu_var_getbuf_med(void *wl, const char *iovar,
	void *param, int param_len, void **bufptr);
extern int wlu_var_setbuf_sm(void *wl, const char *iovar,
		void *param, int param_len);
extern int wl_parse_ssid_list(char* list_str, wlc_ssid_t* ssid, int idx, int max);
extern void dump_bss_info(wl_bss_info_t *bi);
extern cmd_func_t wl_void;
extern cmd_func_t wl_var_void;
extern cmd_func_t wl_var_setint;
extern cmd_func_t wl_var_get;
extern cmd_func_t wl_var_getandprintstr;
extern cmd_func_t wl_reg;
extern cmd_func_t wl_phy_rate;
extern cmd_func_t wl_ssid;
extern cmd_func_t wl_iov_mac;
extern cmd_func_t wl_sta_info;
extern cmd_func_t wl_seq_start;
extern cmd_func_t wl_seq_stop;
extern cmd_func_t wl_hostip;
extern cmd_func_t wl_hostipv6;
extern cmd_func_t wl_offload_cmpnt;
extern cmd_func_t wl_mkeep_alive;
extern cmd_func_t wl_bsscfg_int;
extern cmd_func_t wlu_srwrite;
extern cmd_func_t wlu_reg2args;
extern cmd_func_t wl_macaddr;
extern cmd_func_t wl_maclist;
extern cmd_func_t wl_bcm_config;

extern int ARGCNT(char **argv);

/* return global ioctl_version */
extern int wl_get_ioctl_version(void);
/* return the address of bufstruct_wlu, global buf */
extern char *wl_get_buf(void);

extern int wl_cfg_option(char **argv, const char *fn_name, int *bsscfg_idx, int *consumed);
extern int wl_scan_prep(void *wl, cmd_t *cmd, char **argv,
	wl_scan_params_t *params, int *params_size);
extern chanspec_t wl_chspec_to_driver(chanspec_t chanspec);
extern chanspec_t wl_chspec_from_driver(chanspec_t chanspec);
extern uint32 wl_chspec32_to_driver(chanspec_t chanspec);
extern chanspec_t wl_chspec32_from_driver(uint32 chanspec32);
extern int wl_parse_channel_list(char* list_str, uint16* channel_list, int channel_num);
/* return TRUE if all the values in the array are uniformly the same */
extern int wl_array_uniform(uint8 *pwr, int start, int count);
extern void wl_txpwr_print_header(int8 channel_bandwidth, bool verbose);
extern void wl_txpwr_print_row(const char *label, uint8 chains, txpwr_row_t powers,
	int8 unsupported_rate, int8 channel_bandwidth, bool verbose);
extern int get_ie_data(uchar *data_str, uchar *ie_data, int len);
extern int get_oui_bytes(uchar *oui_str, uchar *oui);


/* Format a ratespec for output of any of the wl_rate() iovars */
extern char* wl_rate_print(char *rate_buf, uint32 rspec);
/* convert rate string in Mbit/s format, like "11", "5.5", to internal 500 Kbit/s units */
extern int rate_string2int(char *s);
/* convert rate internal 500 Kbits/s units to string in Mbits/s format, like "11", "5.5" */
extern char* rate_int2string(char *rate_buf, int val);
extern void wl_print_mcsset(char *mcsset);

extern int wl_parse_chanspec_list(char* list_str, chanspec_t *chanspec_list, int chanspec_num);
extern int hexstr2hex(char *str);
extern char* find_pattern(char **argv, const char *pattern, uint *val);
extern char* find_pattern2(char **argv, const char *pattern, uint *val, int vnum);
extern int wl_atoipv6(const char *a, struct ipv6_addr *n);
extern char * wl_ipv6toa(const void *ipv6);
extern int wlu_reg3args(void *wl, cmd_t *cmd, char **argv);
extern int parse_wep(char **argv, wl_wsec_key_t *key, bool options);

/* Convert user's input in hex pattern to byte-size mask */
extern int wl_pattern_atoh(char *src, char *dst);

/* register commands for a module */
extern void wl_module_cmds_register(cmd_t *cmds);

extern cmd_t *wlu_find_cmd(char *name);

/* wluc_module init functions */
extern void wluc_phy_module_init(void);
extern void wluc_wnm_module_init(void);
extern void wluc_cac_module_init(void);
extern void wluc_rmc_module_init(void);
extern void wluc_rrm_module_init(void);
extern void wluc_wowl_module_init(void);
extern void wluc_nan_module_init(void);
extern void wluc_ap_module_init(void);
extern void wluc_ampdu_module_init(void);
extern void wluc_ampdu_cmn_module_init(void);
extern void wluc_bmac_module_init(void);
extern void wluc_ht_module_init(void);
extern void wluc_wds_module_init(void);
extern void wluc_keymgmt_module_init(void);
extern void wluc_scan_module_init(void);
extern void wluc_obss_module_init(void);
extern void wluc_prot_obss_module_init(void);
extern void wluc_lq_module_init(void);
extern void wluc_seq_cmds_module_init(void);
extern void wluc_btcx_module_init(void);
extern void wluc_led_module_init(void);
extern void wluc_interfere_module_init(void);
extern void wluc_ltecx_module_init(void);
extern void wluc_extlog_module_init(void);
extern void wluc_pkt_filter_module_init(void);
extern void wluc_mfp_module_init(void);
extern void wluc_ota_module_init(void);
extern void wluc_bssload_module_init(void);
extern void wluc_sdio_module_init(void);
extern void wluc_stf_module_init(void);
extern void wluc_offloads_module_init(void);
extern void wluc_tpc_module_init(void);
extern void wluc_toe_module_init(void);
extern void wluc_arpoe_module_init(void);
extern void wluc_ndoe_module_init(void);
extern void wluc_keep_alive_module_init(void);
extern void wluc_pfn_module_init(void);
extern void wluc_tbow_module_init(void);
extern void wluc_p2p_module_init(void);
extern void wluc_tdls_module_init(void);
extern void wluc_trf_mgmt_module_init(void);
extern void wluc_proxd_module_init(void);
extern void wluc_p2po_module_init(void);
extern void wluc_anqpo_module_init(void);
extern void wluc_btcdyn_module_init(void);
extern void wluc_mesh_module_init(void);
extern void wluc_msch_module_init(void);
extern void wluc_bdo_module_init(void);
extern void wluc_randmac_module_init(void);
extern void wluc_tko_module_init(void);
extern void wluc_natoe_module_init(void);
extern void wluc_rsdb_module_init(void);
extern void wluc_he_module_init(void);
extern void wluc_mbo_module_init(void);
extern void wluc_hoffload_module_init(void);

extern void wluc_ecounters_module_init(void);
extern int hexstrtobitvec(const char *cp, uchar *bitvec, int veclen);

extern int get_counter_offset(char *name, uint32 *offset, uint8 counter_ver);
extern int print_counter_help(uint8 counter_ver);

/* wl functions used by the ndis wl. */
extern void dump_rateset(uint8 *rates, uint count);
extern uint freq2channel(uint freq);
extern int wl_ether_atoe(const char *a, struct ether_addr *n);
extern char *wl_ether_etoa(const struct ether_addr *n);
struct ipv4_addr;	/* forward declaration */
extern int wl_atoip(const char *a, struct ipv4_addr *n);
extern char *wl_iptoa(const struct ipv4_addr *n);
extern cmd_func_t wl_int;
extern cmd_func_t wl_varint;
extern void wl_dump_raw_ie(bcm_tlv_t *ie, uint len);
extern int wl_mk_ie_setbuf(const char *command, uint32 pktflag_ok, char **argv,
	vndr_ie_setbuf_t **buf, int *buf_len);
extern cmd_func_t wl_list_ie;

extern void wl_printlasterror(void *wl);
extern bool wc_cmd_check(const char *cmd);

#if defined(WL_NAN)
extern int wl_nan_do_get_ioctl(void *wl, void *nanioc, uint16 iocsz);
#endif

#define WL_IOV_BATCH_DELIMITER		"+"


/* functions for downloading firmware to a device via serial or other transport */
#ifdef SERDOWNLOAD
extern int dhd_init(void *dhd, cmd_t *cmd, char **argv);
extern int dhd_download(void *dhd, cmd_t *cmd, char **argv);
extern int rwl_download(void *dhd, cmd_t *cmd, char **argv);
#endif /* SERDOWNLOAD */

#ifdef BCMDLL
#ifdef LOCAL
extern FILE *dll_fd;
#else
extern void * dll_fd_out;
extern void * dll_fd_in;
#endif
#undef printf
#undef fprintf
#define printf printf_to_fprintf	/* printf to stdout */
#define fprintf fprintf_to_fprintf	/* fprintf to stderr */
extern void fprintf_to_fprintf(FILE * stderror, const char *fmt, ...);
extern void printf_to_fprintf(const char *fmt, ...);
extern void raw_puts(const char *buf, void *dll_fd_out);
#define	fputs(buf, stdout) raw_puts(buf, dll_fd_out)
#endif /* BCMDLL */

#define	PRNL()		pbuf += sprintf(pbuf, "\n")

#define RAM_SIZE_4325  0x60000
#define RAM_SIZE_4329  0x48000
#define RAM_SIZE_43291 0x60000
#define RAM_SIZE_4330_a1  0x3c000
#define RAM_SIZE_4330_b0  0x48000

#define SROM_PAVAR		21

/* useful macros */
#ifndef ARRAYSIZE
#define ARRAYSIZE(a)  (sizeof(a)/sizeof(a[0]))
#endif /* ARRAYSIZE */

/* buffer length needed for wl_format_ssid
 * 32 SSID chars, max of 4 chars for each SSID char "\xFF", plus NULL
 */
#ifndef SSID_FMT_BUF_LEN
#define SSID_FMT_BUF_LEN (4*32+1)	/* Length for SSID format string */
#endif

/* some OSes (FC4) have trouble allocating (kmalloc) 128KB worth of memory,
 * hence keeping WL_DUMP_BUF_LEN below that
 */
#if !defined(WL_DUMP_BUF_LEN)
#if defined(BWL_SMALL_WLU_DUMP_BUF)
#define WL_DUMP_BUF_LEN (4 * 1024)
#else
#define WL_DUMP_BUF_LEN (127 * 1024)
#endif 
#endif /* WL_DUMP_BUF_LEN */

#ifdef linux
#define ESCAN_EVENTS_BUFFER_SIZE 2048
#endif /* linux */

#define CMDLINESZ		80
#define USAGE_ERROR  -1		/* Error code for Usage */
#define CMD_DEPRECATED -4 /* Commands that are functionally deprecated or don't provide
			   * a useful value to a specific OS port of wl
			   */

/* integer output format */
#define INT_FMT_DEC	0	/* signed integer */
#define INT_FMT_UINT	1	/* unsigned integer */
#define INT_FMT_HEX	2	/* hexdecimal */

#define DIV_QUO(num, div) ((num)/div)  /* Return the quotient of division to avoid floats */
#define DIV_REM(num, div) (((num%div) * 100)/div) /* Return the remainder of division */

/* command line argument usage */
#define CMD_ERR	-1	/* Error for command */
#define CMD_OPT	0	/* a command line option */
#define CMD_WL	1	/* the start of a wl command */

#define LED_MAX_INDEX	16	/* index limitation for cmd ledbh */

#define SCAN_USAGE	"" \
"\tDefault to an active scan across all channels for any SSID.\n" \
"\tOptional arg: SSIDs, list of [up to 10] SSIDs to scan (comma or space separated).\n" \
"\tOptions:\n" \
"\t-s S, --ssid=S\t\tSSIDs to scan\n" \
"\t-t ST, --scan_type=ST\t[active|passive|prohibit|offchan|hotspot] scan type\n" \
"\t--bss_type=BT\t\t[bss/infra|ibss/adhoc] bss type to scan\n" \
"\t-b MAC, --bssid=MAC\tparticular BSSID MAC address to scan, xx:xx:xx:xx:xx:xx\n" \
"\t-n N, --nprobes=N\tnumber of probes per scanned channel\n" \
"\t-a N, --active=N\tdwell time per channel for active scanning\n" \
"\t-p N, --passive=N\tdwell time per channel for passive scanning\n" \
"\t-h N, --home=N\t\tdwell time for the home channel between channel scans\n" \
"\t-c L, --chanspecs=L\tcomma or space separated list of chanspecs to scan" \

#define WL_EVENT_TIMEOUT 10 /* Timeout in second for event from driver */
#define MAX_SUBCOUNTER_SUPPORTED	64 /* Max subcounters supported. */

#define DINGO_FW_REV 0x9000000

int wl_wait_for_event(void *wl, char **argv, uint event_id, uint evbuf_size,
	void (*event_cb_fn)(int event_type, bcm_event_t *bcm_event));

#endif /* _wlu_h_ */
