blob: 5c17be3486bbdd9abdf121ac4b26da159810de68 [file] [log] [blame]
/******************************************************************************
*
* Copyright (c) 2012 - 2017 Samsung Electronics Co., Ltd and its Licensors.
* All rights reserved.
*
*****************************************************************************/
#ifndef __UNIFIIO_H__
#define __UNIFIIO_H__
#include <linux/types.h>
/* The following include of linux/if.h is needed to get IFNAMSIZ.
* The conditional include before it is necessary to get the linux/if.h
* include to compile...
*/
#ifdef __KERNEL__
#include <linux/socket.h>
#include <linux/types.h>
#else
#include <sys/socket.h>
#include <stdbool.h>
#endif
#include <linux/if.h>
#ifdef __cplusplus
extern "C" {
#endif
#define UNIFI_GET_UDI_ENABLE _IOR('u', 1, int)
#define UNIFI_SET_UDI_ENABLE _IOW('u', 2, int)
/* Values for UDI_ENABLE */
#define UDI_ENABLE_DATA 0x1
#define UDI_ENABLE_CONTROL 0x2
/* MIB set/get. Arg is a pointer to a varbind */
#define UNIFI_GET_MIB _IOWR('u', 3, unsigned char)
#define UNIFI_SET_MIB _IOW('u', 4, unsigned char)
#define MAX_MIB_DATA_LENGTH 2048
/* Private IOCTLs */
#define SIOCIWS80211POWERSAVEPRIV SIOCIWFIRSTPRIV
#define SIOCIWG80211POWERSAVEPRIV (SIOCIWFIRSTPRIV + 1)
#define SIOCIWS80211RELOADDEFAULTSPRIV (SIOCIWFIRSTPRIV + 2)
#define SIOCIWSCONFWAPIPRIV (SIOCIWFIRSTPRIV + 4)
#define SIOCIWSWAPIKEYPRIV (SIOCIWFIRSTPRIV + 6)
#define SIOCIWSSMEDEBUGPRIV (SIOCIWFIRSTPRIV + 8)
#define SIOCIWSAPCFGPRIV (SIOCIWFIRSTPRIV + 10)
#define SIOCIWSAPSTARTPRIV (SIOCIWFIRSTPRIV + 12)
#define SIOCIWSAPSTOPPRIV (SIOCIWFIRSTPRIV + 14)
#define SIOCIWSFWRELOADPRIV (SIOCIWFIRSTPRIV + 16)
#define SIOCIWSSTACKSTART (SIOCIWFIRSTPRIV + 18)
#define SIOCIWSSTACKSTOP (SIOCIWFIRSTPRIV + 20)
#define IWPRIV_POWER_SAVE_MAX_STRING 32
#define IWPRIV_SME_DEBUG_MAX_STRING 32
#define IWPRIV_SME_MAX_STRING 120
/* Private configuration commands */
#define UNIFI_CFG _IOWR('u', 5, unsigned char[4])
/**
* <------------------ Read/Write Buffer -------------------->
* _____________________________________________________________
* | Cmd | Arg | ... Buffer (opt) ... |
* -------------------------------------------------------------
* <-- uint --><-- uint --><----- unsigned char buffer ------>
*
* Cmd: A enum unifi_cfg_command command.
* Arg: Out:Length if Cmd==UNIFI_CFG_GET
* In:PowerOnOff if Cmd==UNIFI_CFG_POWER
* In:PowerMode if Cmd==UNIFI_CFG_POWERSAVE
* In:Length if Cmd==UNIFI_CFG_FILTER
* In:WMM Qos Info if Cmd==UNIFI_CFG_WMM_QOS_INFO
* Buffer: Out:Data if Cmd==UNIFI_CFG_GET
* NULL if Cmd==UNIFI_CFG_POWER
* NULL if Cmd==UNIFI_CFG_POWERSAVE
* In:Filters if Cmd==UNIFI_CFG_FILTER
*
* where Filters is a struct uf_cfg_bcast_packet_filter structure
* followed by 0 - n struct tclas structures. The length of the struct tclas
* structures is obtained by struct uf_cfg_bcast_packet_filter::tclas_ies_length.
*/
#define UNIFI_BUILD_TYPE _IOWR('u', 7, unsigned char)
#define UNIFI_BUILD_NME 1
#define UNIFI_BUILD_WEXT 2
#define UNIFI_BUILD_AP 3
/* debugging */
#define UNIFI_SET_DEBUG _IO('u', 0x11)
#define UNIFI_SET_TRACE _IO('u', 0x12)
#define UNIFI_GET_INIT_STATUS _IOR('u', 0x15, int)
#define UNIFI_SET_UDI_LOG_CONFIG _IOR('u', 0x16, struct unifiio_udi_config_t)
#define UNIFI_SET_UDI_LOG_MASK _IOR('u', 0x18, struct unifiio_filter_t)
#define UNIFI_INIT_HW _IOR('u', 0x13, unsigned char)
#define UNIFI_INIT_NETDEV _IOW('u', 0x14, unsigned char[6])
#define UNIFI_SME_PRESENT _IOW('u', 0x19, int)
#define UNIFI_CFG_PERIOD_TRAFFIC _IOW('u', 0x21, unsigned char[4])
#define UNIFI_CFG_UAPSD_TRAFFIC _IOW('u', 0x22, unsigned char)
#define UNIFI_SOFTMAC_CFG _IOWR('u', 0x30, unsigned char[4])
#define UNIFI_NETDEV_CFG _IOWR('u', 0x31, struct unifiio_netdev_cfg_t)
#define UNIFI_STREAM_CFG _IOWR('u', 0x32, struct unifiio_stream_cfg_t)
#define UNIFI_AMSDU_CFG _IOWR('u', 0x33, struct unifiio_amsdu_cfg_t)
#define UNIFI_BA_CFG _IOWR('u', 0x34, struct unifiio_ba_cfg_t)
#define UNIFI_SUSPEND_RESUME_CFG _IOWR('u', 0x35, struct unifiio_suspend_resume_cfg_t)
#define UNIFI_SRC_SINK_IOCTL _IOWR('u', 0x41, struct unifiio_src_sink_arg_t)
#define src_sink_action uint16_t
#define SRC_SINK_ACTION_NONE ((src_sink_action)0x0000)
#define SRC_SINK_ACTION_ENABLE_BA ((src_sink_action)0x0001)
#define SRC_SINK_ACTION_SINK_START ((src_sink_action)0x0002)
#define SRC_SINK_ACTION_SINK_STOP ((src_sink_action)0x0003)
#define SRC_SINK_ACTION_GEN_START ((src_sink_action)0x0004)
#define SRC_SINK_ACTION_GEN_STOP ((src_sink_action)0x0005)
#define SRC_SINK_ACTION_SINK_REPORT ((src_sink_action)0x0006)
#define SRC_SINK_ACTION_GEN_REPORT ((src_sink_action)0x0007)
#define SRC_SINK_ACTION_SINK_REPORT_CACHED ((src_sink_action)0x0008)
#define SRC_SINK_ACTION_GEN_REPORT_CACHED ((src_sink_action)0x0009)
#define SRC_SINK_ACTION_LOOPBACK_START ((src_sink_action)0x000A)
#define SRC_SINK_ACTION_LOOPBACK_STOP ((src_sink_action)0x000B)
#define src_sink_direction uint16_t
#define SRC_SINK_DIRECTION_TX ((src_sink_direction)0x0000)
#define SRC_SINK_DIRECTION_RX ((src_sink_direction)0x0001)
#define src_sink_endpoint uint16_t
#define SRC_SINK_ENDPOINT_HOSTIO ((src_sink_endpoint)0x0000)
#define SRC_SINK_ENDPOINT_MACRAME ((src_sink_endpoint)0x0001)
struct unifiio_src_sink_report {
/* total reporting time requested by the user in seconds*/
uint32_t time;
/* requested report interval in microseconds */
uint32_t interval;
/* timestamp [jiffies in millisec] for each report returned by the driver */
uint32_t timestamp;
/* actual interval used for the report calculations from the firmware */
uint32_t duration;
/* number of packets during the above duration */
uint32_t count;
/* number of octets during the above duration */
uint32_t octet;
/* throughput in kbps */
uint32_t kbps;
/* CPU idle ratios */
uint16_t idle_ratio;
uint16_t interrupt_latency;
uint16_t free_kbytes;
/* only relevant for SRC a.k.a GEN mode */
uint32_t failed_count;
};
/* fields specific to SRC a.k.a GEN <CONFIG> IOCTLs */
struct unifiio_src_sink_gen_config {
uint16_t size;
uint16_t use_streaming;
uint16_t pkts_per_intr;
uint32_t ipv4_dest;
};
/* fields specific to SRC/SINK CONFIG IOCTLs */
struct unifiio_src_sink_config {
uint32_t interval;
uint16_t pkts_per_int;
union {
struct unifiio_src_sink_gen_config gen;
} u;
};
/* fields common to <ALL> SRC/SINK IOCTLs */
struct unifiio_src_sink_common {
/* one of SRC_SINK_ACTION_* for driver IOCTL */
src_sink_action action;
uint16_t vif;
src_sink_direction direction;
src_sink_endpoint endpoint;
};
struct unifiio_src_sink_arg_t {
/* arg in */
struct unifiio_src_sink_common common;
union {
struct unifiio_src_sink_config config;
struct unifiio_src_sink_report report;
} u;
};
/* Structure of data read from the unifi device. */
struct udi_msg_t {
/* Length (in bytes) of entire structure including appended bulk data */
int length;
/* System time (in milliseconds) that signal was transferred */
int timestamp;
/* Direction in which signal was transferred. */
int direction;
#define UDI_FROM_HOST 0
#define UDI_TO_HOST 1
#define UDI_CONFIG_IND 2
/* The length of the signal (in bytes) not including bulk data */
int signal_length;
/* Signal body follows, then any bulk data */
};
/* Add these to the filter signal_ids to enable partial filtering of the MA_UNITDATA Data
* the top bit is set to indicate this is not a HIP Signal ID but a special Filter
*/
#define UDI_MA_UNITDATA_FILTER_ALLOW_MASK 0x8000 /* Filter MA_UNITDATA_REQ and MA_UNITDATA_IND */
#define UDI_MA_UNITDATA_FILTER_ALLOW_MGT_ID 0x8001 /* Filter MA_UNITDATA_REQ and MA_UNITDATA_IND but Log management Frames */
#define UDI_MA_UNITDATA_FILTER_ALLOW_KEY_ID 0x8002 /* Filter MA_UNITDATA_REQ and MA_UNITDATA_IND but Log Key Data Frames (Arp, Eapol, Dhcp etc) */
#define UDI_MA_UNITDATA_FILTER_ALLOW_CFM_ERROR_ID 0x8004 /* Filter MA_UNITDATA_CFM but MA_UNITDATA_CFM(error) */
#define UDI_MA_UNITDATA_FILTER_ALLOW_EAPOL_ID 0x8008 /* Filter MA_UNITDATA_REQ and MA_UNITDATA_IND but Log Eapol data */
/**
* Signals used to indicate to user space that the kernel module has been
* unloaded. The user space applications can based on this indication determine
* if they should unregister from the char device.
*/
#define UDI_DRV_UNLOAD_IND 0x8010
#define UDI_DRV_DROPPED_FRAMES 0x8011
#define UDI_DRV_DROPPED_DATA_FRAMES 0x8012
#define UDI_DRV_SUSPEND_IND 0x8013
#define UDI_DRV_RESUME_IND 0x8014
struct unifiio_udi_config_t {
uint16_t ma_unitdata_size_limit; /* if non-zero, the MA_UNITDATA_REQ and MA_UNITDATA_IND are capped by this size */
};
struct unifiio_filter_t {
uint16_t log_listed_flag; /* if non-zero, log listed sigs and ignore others (otherwise vice versa) */
uint16_t signal_ids_n; /* Number of elements in signal_ids[] */
uint16_t signal_ids[5]; /* list of the signals to log */
};
#define unifi_cfg_command uint32_t
#define UNIFI_CFG_GET ((unifi_cfg_command)0)
#define UNIFI_CFG_POWER ((unifi_cfg_command)1)
#define UNIFI_CFG_POWERSAVE ((unifi_cfg_command)2)
#define UNIFI_CFG_FILTER ((unifi_cfg_command)3)
#define UNIFI_CFG_POWERSUPPLY ((unifi_cfg_command)4)
#define UNIFI_CFG_WMM_QOSINFO ((unifi_cfg_command)5)
#define UNIFI_CFG_WMM_ADDTS ((unifi_cfg_command)6)
#define UNIFI_CFG_WMM_DELTS ((unifi_cfg_command)7)
#define UNIFI_CFG_STRICT_DRAFT_N ((unifi_cfg_command)8)
#define UNIFI_CFG_SET_AP_CONFIG ((unifi_cfg_command)9)
#define UNIFI_CFG_CORE_DUMP ((unifi_cfg_command)10)
#define unifi_cfg_power uint32_t
#define UNIFI_CFG_POWER_UNSPECIFIED ((unifi_cfg_power)0)
#define UNIFI_CFG_POWER_OFF ((unifi_cfg_power)1)
#define UNIFI_CFG_POWER_ON ((unifi_cfg_power)2)
#define unifi_cfg_powersupply uint32_t
#define UNIFI_CFG_POWERSUPPLY_UNSPECIFIED ((unifi_cfg_powersupply)0)
#define UNIFI_CFG_POWERSUPPLY_MAINS ((unifi_cfg_powersupply)1)
#define UNIFI_CFG_POWERSUPPLY_BATTERIES ((unifi_cfg_powersupply)2)
#define unifi_cfg_powersave uint32_t
#define UNIFI_CFG_POWERSAVE_UNSPECIFIED ((unifi_cfg_powersave)0)
#define UNIFI_CFG_POWERSAVE_NONE ((unifi_cfg_powersave)1)
#define UNIFI_CFG_POWERSAVE_FAST ((unifi_cfg_powersave)2)
#define UNIFI_CFG_POWERSAVE_FULL ((unifi_cfg_powersave)3)
#define UNIFI_CFG_POWERSAVE_AUTO ((unifi_cfg_powersave)4)
#define unifi_cfg_get uint32_t
#define UNIFI_CFG_GET_COEX ((unifi_cfg_get)0)
#define UNIFI_CFG_GET_POWER_MODE ((unifi_cfg_get)1)
#define UNIFI_CFG_GET_VERSIONS ((unifi_cfg_get)2)
#define UNIFI_CFG_GET_POWER_SUPPLY ((unifi_cfg_get)3)
#define UNIFI_CFG_GET_INSTANCE ((unifi_cfg_get)4)
#define UNIFI_CFG_GET_AP_CONFIG ((unifi_cfg_get)5)
#define UNIFI_CFG_FILTER_NONE 0x0000
#define UNIFI_CFG_FILTER_DHCP 0x0001
#define UNIFI_CFG_FILTER_ARP 0x0002
#define UNIFI_CFG_FILTER_NBNS 0x0004
#define UNIFI_CFG_FILTER_NBDS 0x0008
#define UNIFI_CFG_FILTER_CUPS 0x0010
#define UNIFI_CFG_FILTER_ALL 0xFFFF
#define uf_cfg_packet_filter_type uint32_t
#define UNIFI_CFG_FILTER_TYPE_NONE ((uf_cfg_packet_filter_type)0)
#define UNIFI_CFG_FILTER_TYPE_ACTIVE_HOST ((uf_cfg_packet_filter_type)1)
#define UNIFI_CFG_FILTER_TYPE_SUSPENDED_HOST ((uf_cfg_packet_filter_type)2)
struct uf_cfg_bcast_packet_filter {
unsigned long filter_mode; /* as defined by HIP protocol */
uf_cfg_packet_filter_type packet_filter_type;
unsigned char arp_filter;
unsigned char dhcp_filter;
unsigned long tclas_ies_length; /* length of tclas_ies in bytes */
unsigned char tclas_ies[1]; /* variable length depending on above field */
};
struct uf_cfg_ap_config {
uint8_t phySupportedBitmap;
uint8_t channel;
uint16_t beaconInterval;
uint8_t dtimPeriod;
bool wmmEnabled;
uint8_t shortSlotTimeEnabled;
uint16_t groupkeyTimeout;
bool strictGtkRekeyEnabled;
uint16_t gmkTimeout;
uint16_t responseTimeout;
uint8_t retransLimit;
uint8_t rxStbc;
bool rifsModeAllowed;
uint8_t dualCtsProtection;
uint8_t ctsProtectionType;
uint16_t maxListenInterval;
};
struct csr_wifi_cfg_coex_info {
bool hasTrafficData;
uint8_t currentTrafficType;
uint16_t currentPeriodMs;
uint8_t currentPowerSave;
uint16_t currentCoexPeriodMs;
uint16_t currentCoexLatencyMs;
bool hasBtDevice;
uint32_t currentBlackOutDurationUs;
uint32_t currentBlackOutPeriodUs;
uint8_t currentCoexScheme;
};
struct tcpip_clsfr {
__u8 cls_fr_type;
__u8 cls_fr_mask;
__u8 version;
__u8 source_ip_addr[4];
__u8 dest_ip_addr[4];
__u16 source_port;
__u16 dest_port;
__u8 dscp;
__u8 protocol;
__u8 reserved;
} __packed;
#define tcpip_clsfr_t struct tcpip_clsfr
struct tclas {
__u8 element_id;
__u8 length;
__u8 user_priority;
tcpip_clsfr_t tcp_ip_cls_fr;
} __packed;
#define CONFIG_IND_ERROR 0x01
#define CONFIG_IND_EXIT 0x02
#define CONFIG_SME_NOT_PRESENT 0x10
#define CONFIG_SME_PRESENT 0x20
/* This is used by the UNIFI_NETDEV_CFG ioctl which is a Multi-netdev replacement for
* UNIFI_INIT_NETDEV. The all netdev are created statically and can be mapped/registered
* to a particular vif_index/MAC address/interface mode dynamically using this call.
*
* Configure operations (operation == 0):
*
* Attempting to operate on a negative interfaceTag is an attempt to
* create a NEW netdevice.A valid vif_index and macaddr must be supplied.
* interfaceMode will not be checked. The new interfaceTag and name will be
* copied back on success.
*
* Using an interfaceTag >=0 attempts to reconfigure an existing netdevice. The new
* vif_index, macaddr and interfaceMode will be applied if all is valid. Setting a
* vif_index of zero causes the given netdevice to be unregistered instead.
* The contents of the name[] field will be ignored as input, and the existing
* interface name copied back as output.
*
* Query operations (operation == 1):
*
* The first identifying field with a potentially valid value will be used to
* identify an interface, and if a match is found its values will be copied back
* into the structure and returned to the user. The fields are checked in this order:
*
* interfaceTag (valid if >= 0)
* vif_index (valid if non-zero)
* name (valid if first byte non-zero)
* macaddr (valid if not broadcast)
*/
struct unifiio_netdev_cfg_t {
uint8_t operation; /* 0 = configure, 1 = query */
/* All other fields potentially bidirectional */
int interfaceTag; /* <0 => create new, >=0 => reconfigure existing */
uint8_t vif_index; /* VIF index to use (0 => remove netdev) */
uint8_t interfaceMode; /* Values defined in csr_wifi_router_ctrl_prim.h */
unsigned char macaddr[6]; /* MAC address */
char name[IFNAMSIZ]; /* Interface name */
unsigned char peer_macaddr[6]; /* peer MAC address */
uint16_t association_id; /* Associate ID used for the peer */
};
#define unifiio_stream_cfg_operation_type uint32_t
#define UNIFI_CFG_STREAM_OPERATION_TYPE_NONE ((unifiio_stream_cfg_operation_type)0)
#define UNIFI_CFG_STREAM_OPERATION_TYPE_CREATE ((unifiio_stream_cfg_operation_type)1)
#define UNIFI_CFG_STREAM_OPERATION_TYPE_STOP ((unifiio_stream_cfg_operation_type)2)
#define UNIFI_CFG_STREAM_OPERATION_TYPE_DELETE ((unifiio_stream_cfg_operation_type)3)
struct unifiio_stream_cfg_t {
unifiio_stream_cfg_operation_type operation;
int interfaceTag; /* A valid interface tag */
unsigned char peer_macaddr[6]; /* Peer STA MAC address */
uint16_t tId; /* Traffic identifier user priority */
uint16_t handle; /* Handle as indicated in MA-stream.indication */
uint16_t size; /* Size as indicated in MA-stream.indication */
};
#define unifiio_amsdu_cfg_operation_type uint32_t
#define UNIFI_CFG_AMSDU_OPERATION_TYPE_SET_MAX_SIZE ((unifiio_amsdu_cfg_operation_type)0)
struct unifiio_amsdu_cfg_t {
unifiio_amsdu_cfg_operation_type operation;
int interfaceTag; /* A valid interface tag */
unsigned char peer_macaddr[6]; /* Peer STA MAC address */
uint16_t size; /* Maximum A-MSDU length for peer obtained from HT element */
};
#define unifiio_ba_cfg_operation_type uint32_t
#define UNIFI_CFG_BA_SESSION_STOP ((unifiio_ba_cfg_operation_type)0)
#define UNIFI_CFG_BA_SESSION_START ((unifiio_ba_cfg_operation_type)1)
struct unifiio_ba_cfg_t {
unifiio_ba_cfg_operation_type operation;
int interfaceTag; /* A valid interface tag */
unsigned char peer_macaddr[6]; /* Peer STA MAC address */
uint16_t tId; /* Traffic identifier */
uint8_t role; /* Role - 0: originator, 1 - recipient */
uint16_t window_size; /* Window size as negotiated in BA establish */
uint16_t ssn; /* Starting sequence number as negotiated in BA establish */
};
#define unifiio_suspend_resume_cfg_operation_type uint32_t
#define UNIFI_CFG_SUSPEND ((unifiio_suspend_resume_cfg_operation_type)0)
#define UNIFI_CFG_RESUME ((unifiio_suspend_resume_cfg_operation_type)1)
#define UNIFI_CFG_WAIT_FOR_RESUME ((unifiio_suspend_resume_cfg_operation_type)2)
struct unifiio_suspend_resume_cfg_t {
unifiio_suspend_resume_cfg_operation_type operation;
unsigned timeout_ms; /* used with UNIFI_CFG_WAIT_FOR_RESUME only */
};
#ifdef __cplusplus
}
#endif
#endif /* __UNIFIIO_H__ */