1/** 2 * Interface for the wlan network scan routines 3 * 4 * Driver interface functions and type declarations for the scan module 5 * implemented in wlan_scan.c. 6 */ 7#ifndef _WLAN_SCAN_H 8#define _WLAN_SCAN_H 9 10#include <net/ieee80211.h> 11#include "hostcmd.h" 12 13/** 14 * @brief Maximum number of channels that can be sent in a setuserscan ioctl 15 * 16 * @sa wlan_ioctl_user_scan_cfg 17 */ 18#define WLAN_IOCTL_USER_SCAN_CHAN_MAX 50 19 20//! Infrastructure BSS scan type in wlan_scan_cmd_config 21#define WLAN_SCAN_BSS_TYPE_BSS 1 22 23//! Adhoc BSS scan type in wlan_scan_cmd_config 24#define WLAN_SCAN_BSS_TYPE_IBSS 2 25 26//! Adhoc or Infrastructure BSS scan type in wlan_scan_cmd_config, no filter 27#define WLAN_SCAN_BSS_TYPE_ANY 3 28 29/** 30 * @brief Structure used internally in the wlan driver to configure a scan. 31 * 32 * Sent to the command processing module to configure the firmware 33 * scan command prepared by libertas_cmd_80211_scan. 34 * 35 * @sa wlan_scan_networks 36 * 37 */ 38struct wlan_scan_cmd_config { 39 /** 40 * @brief BSS type to be sent in the firmware command 41 * 42 * Field can be used to restrict the types of networks returned in the 43 * scan. valid settings are: 44 * 45 * - WLAN_SCAN_BSS_TYPE_BSS (infrastructure) 46 * - WLAN_SCAN_BSS_TYPE_IBSS (adhoc) 47 * - WLAN_SCAN_BSS_TYPE_ANY (unrestricted, adhoc and infrastructure) 48 */ 49 u8 bsstype; 50 51 /** 52 * @brief Specific BSSID used to filter scan results in the firmware 53 */ 54 u8 bssid[ETH_ALEN]; 55 56 /** 57 * @brief length of TLVs sent in command starting at tlvBuffer 58 */ 59 int tlvbufferlen; 60 61 /** 62 * @brief SSID TLV(s) and ChanList TLVs to be sent in the firmware command 63 * 64 * @sa TLV_TYPE_CHANLIST, mrvlietypes_chanlistparamset_t 65 * @sa TLV_TYPE_SSID, mrvlietypes_ssidparamset_t 66 */ 67 u8 tlvbuffer[1]; //!< SSID TLV(s) and ChanList TLVs are stored here 68}; 69 70/** 71 * @brief IOCTL channel sub-structure sent in wlan_ioctl_user_scan_cfg 72 * 73 * Multiple instances of this structure are included in the IOCTL command 74 * to configure a instance of a scan on the specific channel. 75 */ 76struct wlan_ioctl_user_scan_chan { 77 u8 channumber; //!< channel Number to scan 78 u8 radiotype; //!< Radio type: 'B/G' band = 0, 'A' band = 1 79 u8 scantype; //!< Scan type: Active = 0, Passive = 1 80 u16 scantime; //!< Scan duration in milliseconds; if 0 default used 81}; 82 83/** 84 * @brief IOCTL input structure to configure an immediate scan cmd to firmware 85 * 86 * Used in the setuserscan (WLAN_SET_USER_SCAN) private ioctl. Specifies 87 * a number of parameters to be used in general for the scan as well 88 * as a channel list (wlan_ioctl_user_scan_chan) for each scan period 89 * desired. 90 * 91 * @sa libertas_set_user_scan_ioctl 92 */ 93struct wlan_ioctl_user_scan_cfg { 94 /** 95 * @brief BSS type to be sent in the firmware command 96 * 97 * Field can be used to restrict the types of networks returned in the 98 * scan. valid settings are: 99 * 100 * - WLAN_SCAN_BSS_TYPE_BSS (infrastructure) 101 * - WLAN_SCAN_BSS_TYPE_IBSS (adhoc) 102 * - WLAN_SCAN_BSS_TYPE_ANY (unrestricted, adhoc and infrastructure) 103 */ 104 u8 bsstype; 105 106 /** 107 * @brief Configure the number of probe requests for active chan scans 108 */ 109 u8 numprobes; 110 111 /** 112 * @brief BSSID filter sent in the firmware command to limit the results 113 */ 114 u8 bssid[ETH_ALEN]; 115 116 /* Clear existing scan results matching this BSSID */ 117 u8 clear_bssid; 118 119 /** 120 * @brief SSID filter sent in the firmware command to limit the results 121 */ 122 char ssid[IW_ESSID_MAX_SIZE]; 123 u8 ssid_len; 124 125 /* Clear existing scan results matching this SSID */ 126 u8 clear_ssid; 127 128 /** 129 * @brief Variable number (fixed maximum) of channels to scan up 130 */ 131 struct wlan_ioctl_user_scan_chan chanlist[WLAN_IOCTL_USER_SCAN_CHAN_MAX]; 132}; 133 134/** 135 * @brief Structure used to store information for each beacon/probe response 136 */ 137struct bss_descriptor { 138 u8 bssid[ETH_ALEN]; 139 140 u8 ssid[IW_ESSID_MAX_SIZE + 1]; 141 u8 ssid_len; 142 143 /* WEP encryption requirement */ 144 u32 privacy; 145 146 /* receive signal strength in dBm */ 147 long rssi; 148 149 u32 channel; 150 151 u16 beaconperiod; 152 153 u32 atimwindow; 154 155 u8 mode; 156 u8 libertas_supported_rates[WLAN_SUPPORTED_RATES]; 157 158 __le64 timestamp; //!< TSF value included in the beacon/probe response 159 unsigned long last_scanned; 160 161 union ieeetypes_phyparamset phyparamset; 162 union IEEEtypes_ssparamset ssparamset; 163 struct ieeetypes_capinfo cap; 164 u8 datarates[WLAN_SUPPORTED_RATES]; 165 166 u64 networktsf; //!< TSF timestamp from the current firmware TSF 167 168 struct ieeetypes_countryinfofullset countryinfo; 169 170 u8 wpa_ie[MAX_WPA_IE_LEN]; 171 size_t wpa_ie_len; 172 u8 rsn_ie[MAX_WPA_IE_LEN]; 173 size_t rsn_ie_len; 174 175 struct list_head list; 176}; 177 178extern int libertas_ssid_cmp(u8 *ssid1, u8 ssid1_len, u8 *ssid2, u8 ssid2_len); 179 180struct bss_descriptor * libertas_find_ssid_in_list(wlan_adapter * adapter, 181 u8 *ssid, u8 ssid_len, u8 * bssid, u8 mode, 182 int channel); 183 184struct bss_descriptor * libertas_find_best_ssid_in_list(wlan_adapter * adapter, 185 u8 mode); 186 187extern struct bss_descriptor * libertas_find_bssid_in_list(wlan_adapter * adapter, 188 u8 * bssid, u8 mode); 189 190int libertas_find_best_network_ssid(wlan_private * priv, u8 *out_ssid, 191 u8 *out_ssid_len, u8 preferred_mode, u8 *out_mode); 192 193extern int libertas_send_specific_ssid_scan(wlan_private * priv, u8 *ssid, 194 u8 ssid_len, u8 clear_ssid); 195extern int libertas_send_specific_bssid_scan(wlan_private * priv, 196 u8 * bssid, u8 clear_bssid); 197 198extern int libertas_cmd_80211_scan(wlan_private * priv, 199 struct cmd_ds_command *cmd, 200 void *pdata_buf); 201 202extern int libertas_ret_80211_scan(wlan_private * priv, 203 struct cmd_ds_command *resp); 204 205int wlan_scan_networks(wlan_private * priv, 206 const struct wlan_ioctl_user_scan_cfg * puserscanin, 207 int full_scan); 208 209struct ifreq; 210 211struct iw_point; 212struct iw_param; 213struct iw_request_info; 214extern int libertas_get_scan(struct net_device *dev, struct iw_request_info *info, 215 struct iw_point *dwrq, char *extra); 216extern int libertas_set_scan(struct net_device *dev, struct iw_request_info *info, 217 struct iw_param *vwrq, char *extra); 218 219#endif /* _WLAN_SCAN_H */ 220