/*
 * OS independent remote wl declarations
 *
 * Copyright (C) 2016, Broadcom Corporation
 * 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_remote.h 425230 2013-09-23 10:53:48Z $
 */
#ifndef _wlu_remote_h
#define _wlu_remote_h
#include <wlioctl.h>
/* Remote wl declararions */
#define NO_REMOTE       0
#define REMOTE_SERIAL 	1
#define REMOTE_SOCKET 	2
#define REMOTE_WIFI     3
#define REMOTE_DONGLE   4
#define SHELL_CMD       -1 /* Invalid cmd id for shell */
#define ASD_CMD       	-2 /* Cmd id for ASD command */
#define SERVER_RESPONSE_MAX_BUF_LEN 8192
#define SHELL_RESP_SIZE 1024
#define CTRLC_PACKET 0xDEADBEAF
#define CTRLC_FLAG -4
#define VISTA_CMD	-3 /* cmd id for remote vista */

/* For cross OS support */
/* For autonegotiation to work, these defines should be
 * the same for client and server.
 */
#define UNKNOWN_OS	0
#define LINUX_OS  	1
#define WIN32_OS  	2
#define MAC_OSX		3
#define BACKLOG 	4
#define WINVISTA_OS	5
#define INDONGLE	6
#define INVALID_OS	7	/* Should be last */

/* Used in cdc_ioctl_t.flags field */
#define REMOTE_SET_IOCTL			1
#define REMOTE_GET_IOCTL			2
#define REMOTE_REPLY				4
#define REMOTE_SHELL_CMD			8
#define REMOTE_FINDSERVER_IOCTL		16 /* Find remote server */
#define REMOTE_ASD_CMD				32 /* ASD integration */
#define RDHD_SET_IOCTL			64
#define RDHD_GET_IOCTL			128
#define REMOTE_VISTA_CMD			256 /* for remote vista specific commands */
#define REMOTE_NEGOTIATE_CMD			512 /* for RWL negotiation */
#define NEGOTIATE_GET_OS			0   /* detect remote OS */
#define RWL_WIFI_DEFAULT_TYPE 		0x00
#define RWL_WIFI_DEFAULT_SUBTYPE 	0x00
#define RWL_ACTION_FRAME_DATA_SIZE 	1024	/* fixed size for the wifi frame data */
#define RWL_WIFI_CDC_HEADER_OFFSET 	0
#define RWL_WIFI_FRAG_DATA_SIZE 	960 /* max size of the frag data */
#define RWL_DEFAULT_WIFI_FRAG_COUNT 127 /* maximum fragment count */
#define RWL_WIFI_RETRY				5	/* CMD retry count for wifi */
#define RWL_WIFI_RX_RETRY			20  /* WIFI response rerty count */
#define RWL_WIFI_SEND				5   /* WIFI frame sent count */
#define RWL_WIFI_RETRY_DELAY   		1000 /* wifi specific retry delay  */
#define RWL_WIFI_SEND_DELAY			100  /* delay between two frames */
#define RWL_WIFI_RX_DELAY			250  /*  wait between send and receive */
#define RWL_WIFI_RX_SHELL_DELAY		1000 /* delay added for shell cmd response read */
#define RWL_CHANNEL_RX_SCAN_DELAY	10  /* Delay between findserver rx calls */
#define RWL_CHANNEL_SCAN_WAIT		250 /* Sleep time in between the channel scans */
#define RWL_WIFI_BUF_LEN			64
#define RWL_WIFI_SHELL_CMD			1
#define RWL_WIFI_WL_CMD            	0
#define RWL_WIFI_FIND_SER_CMD 		"findserver"
#define RWL_WIFI_ACTION_CMD   		"wifiaction"
#define RWL_WIFI_GET_ACTION_CMD         "rwlwifivsaction"
#define RWL_DONGLE_SET_CMD			"dongleset"
#define DATA_FRAME_LEN				960
/* wl & shell cmd work fine for 960 (512+256+128+64) */


/*
 * Information about the action frame data fields in the
 * dot11_action_wifi_vendor_specific
 * cdc struct (1 to 16. This does not include status flag. Since this
 * is not directly visible to the driver code we cant use sizeof struct
 * cdc_ioctl_t. Hence Ref MAC address offset starts from byte 17.
 * REF MAC ADDR (6 bytes (MAC Address len) from byte 17 to 22)
 * DUT MAC ADDR (6 bytes after the REF MAC Address byte 23 to 28)
 * unused (byte 29 to 49)
 * REF/Client Channel offset (50)
 * DUT/Server channel offset (51)
 * ---------------------------------------------------------------------------------------
 * cdc struct|REF MAC ADDR|DUT_MAC_ADDR|un used|REF Channel|DUT channel|Action frame Data|
 * 1---------17-----------23-------------------50----------51----------52----------------1040
 * REF MAC addr after CDC struct without status flag (status flag not used by wifi)
 */
#define RWL_ACTION_WIFI_CATEGORY	127  /* Vendor Specific category value for wifi */
#define RWL_REF_MAC_ADDRESS_OFFSET	17
#define RWL_DUT_MAC_ADDRESS_OFFSET	23
#define RWL_WIFI_CLIENT_CHANNEL_OFFSET	50
#define RWL_WIFI_SERVER_CHANNEL_OFFSET	51

#define SUCCESS 					1
#define FAIL   						-1
#define NO_PACKET        			-2
#define SERIAL_PORT_ERR  			-3

#define DEFAULT_SERVER_PORT   		8000

#define WL_MAX_BUF_LEN 				(127 * 1024)
#define MAX_VISTA_ARGC				10
#define HOST_TO_NETWORK				TRUE
#define NETWORK_TO_HOST				FALSE

#ifndef IFNAMSIZ
#define IFNAMSIZ				16
#endif

/* We don't want the server to allocate bigger buffers for some of the commands
 * like scanresults. Server can still allocate 8K memory and send the response
 * in fragments. This is used in case of Get commands only.
 */
#define SERVER_RESPONSE_MAX_BUF_LEN 8192
/* Used to set the cmds for wifi specific init */
typedef struct remote_wifi_cmds {
	uint32	cmd;		/* common ioctl definition */
	char	*data;		/* max size of the data length */
	int		value;
} remote_wifi_cmds_t;

/* Added for debug utility support */
#define ERR		stderr
#define OUTPUT	stdout

#define DEBUG_DEFAULT	0x0001
#define DEBUG_ERR		0x0001
#define DEBUG_INFO		0x0002
#define DEBUG_DBG		0x0004

/* #ifdef TARGETOS_symbian */
#define DPRINT_ERR	if (defined_debug & DEBUG_ERR) \
			    fprintf
#define DPRINT_INFO	if (defined_debug & DEBUG_INFO) \
			    fprintf
#define DPRINT_DBG	if (defined_debug & DEBUG_DBG) \
			    fprintf
extern unsigned short defined_debug;
#ifdef WIN32
/* Function defined in wlu.c for client and wlu_server_ce.c for server */
extern int wl_atoip(const char *a, struct ipv4_addr *n);
#endif
/* Function defined to do host to network and network to host conversions */
void rwl_swap_header(rem_ioctl_t *rem_ptr, bool host_to_network);

/* Macros to access remote type */
extern int remote_type;
#define rwl_get_remote_type()		(remote_type)
#define rwl_set_remote_type(type)	(remote_type = type)

/* Macros to access server IP and port globals */
extern char *g_rwl_servIP;
#define rwl_get_server_ip()			(g_rwl_servIP)
#define rwl_set_server_ip(ip) 		(g_rwl_servIP = ip)
extern unsigned short g_rwl_servport;
#define rwl_get_server_port()		(g_rwl_servport)
#define rwl_set_server_port(port) 	(g_rwl_servport = port)

extern int rwl_read_serial_port(void* hndle, char* read_buf, uint data_size, uint *numread);
extern int rwl_write_serial_port(void* hndle, char* write_buf, unsigned long size,
unsigned long *numwritten);
extern void rwl_sleep(int delay);
extern void* rwl_open_transport(int remote_type, char *port, int ReadTotalTimeout, int debug);
extern int rwl_close_transport(int remote_type, void * handle);
extern int rwl_poll_serial_buffer(void *hndle);
extern int rwl_serial_handle_timeout(void);
extern void rwl_sync_delay(uint noframes);

#ifdef RWL_SOCKET
extern int rwl_connectsocket(int SocketDes, struct sockaddr* SerAddr, int SizeOfAddr);
extern  int rwl_acceptconnection(int SocketDes, struct sockaddr *ClientAddr, int *SizeOfAddr);
extern int rwl_send_to_streamsocket(int SocketDes, const char* SendBuff, int data_size, int Flag);
extern int rwl_receive_from_streamsocket(int SocketDes, char* RecvBuff, int data_size, int Flag);
extern int rwl_init_server_socket_setup(int argc, char** argv, uint remote_type);
extern int rwl_GetifAddr(char *ifname, struct sockaddr_in* sa);
#endif /* RWL_SOCKET */

extern int set_interface(void *wl, char *intf_name);

/* Win32 specific function wlu_pipe_win32.c */
extern int rwl_init_ws2_32dll(void);
extern int rwl_terminate_ws2_32dll(void);

/* Function definitions for wlu_client_shared.c and wlu_server_shared.c */
extern int rwl_var_getbuf(void *wl, const char *iovar, void *param, int param_len, void **bufptr);
extern int rwl_var_setbuf(void *wl, const char *iovar, void *param, int param_len);
extern int rwl_var_send_vs_actionframe(void* wl, const char* iovar, void* param, int param_len);

/* Function definitions for wlu_ndis.c/wlu_linux.c  and wlu_server_ce.c/wlu_server_linux.c  */
extern int wl_get(void *wl, int cmd, void *buf, int len);
extern int wl_set(void *wl, int cmd, void *buf, int len);
#ifdef RWLASD
typedef unsigned char BYTE;
extern void wfa_dut_init(BYTE **tBuf, BYTE **rBuf, BYTE **paBuf, BYTE **cBuf, struct timeval **);
extern int remote_asd_exec(unsigned char* command, int* cmd_len);
void wfa_dut_deinit(void);
#endif
extern int get_ctrlc_header(void *wl);
extern int remote_tx_response(void *wl, void *buf_ptr, int cmd);
extern rem_ioctl_t *g_rem_ptr;
extern int g_rwl_hndle;
/* Variable to indiate if the server child has completed execution */
extern volatile sig_atomic_t g_sig_chld;

/*
 * Separate paths are defined for android and linux machines
 * / filesystem on android is read only memory
 */
#ifndef WIN32
#ifdef TARGETENV_android
#define SH_PATH "/data/busybox/sh"
#define SHELL_RESP_PATH  "/data/local/RWL/" /* Default path for storing files for shell response */
#define	TEMPLATE         "/data/local/RWL/SyncXXXXXX"
#else
#define SHELL_RESP_PATH  "/tmp/RWL/" /* Default path for storing files for shell response */
#define	TEMPLATE         "/tmp/RWL/SyncXXXXXX"
#define SH_PATH "/bin/sh"
#endif
#endif /* !WIN32 */
#endif /* _wlu_remote_h */
