1 2 #include "wifi_hal.h" 3 4 #ifndef __WIFI_HAL_COMMON_H__ 5 #define __WIFI_HAL_COMMON_H__ 6 7 #define LOG_TAG "WifiHAL" 8 9 #include <utils/Log.h> 10 #include "nl80211_copy.h" 11 #include "sync.h" 12 13 #define SOCKET_BUFFER_SIZE (32768U) 14 #define RECV_BUF_SIZE (4096) 15 #define DEFAULT_EVENT_CB_SIZE (64) 16 #define DEFAULT_CMD_SIZE (64) 17 #define DOT11_OUI_LEN 3 18 19 /* 20 Vendor OUI - This is a unique identifier that identifies organization. Lets 21 code Android specific functions with Google OUI; although vendors can do more 22 with their own OUI's as well. 23 */ 24 25 const uint32_t GOOGLE_OUI = 0x001A11; 26 /* TODO: define vendor OUI here */ 27 28 29 /* 30 This enum defines ranges for various commands; commands themselves 31 can be defined in respective feature headers; i.e. find gscan command 32 definitions in gscan.cpp 33 */ 34 35 typedef enum { 36 /* don't use 0 as a valid subcommand */ 37 VENDOR_NL80211_SUBCMD_UNSPECIFIED, 38 39 /* define all vendor startup commands between 0x0 and 0x0FFF */ 40 VENDOR_NL80211_SUBCMD_RANGE_START = 0x0001, 41 VENDOR_NL80211_SUBCMD_RANGE_END = 0x0FFF, 42 43 /* define all GScan related commands between 0x1000 and 0x10FF */ 44 ANDROID_NL80211_SUBCMD_GSCAN_RANGE_START = 0x1000, 45 ANDROID_NL80211_SUBCMD_GSCAN_RANGE_END = 0x10FF, 46 47 /* define all NearbyDiscovery related commands between 0x1100 and 0x11FF */ 48 ANDROID_NL80211_SUBCMD_NBD_RANGE_START = 0x1100, 49 ANDROID_NL80211_SUBCMD_NBD_RANGE_END = 0x11FF, 50 51 /* define all RTT related commands between 0x1100 and 0x11FF */ 52 ANDROID_NL80211_SUBCMD_RTT_RANGE_START = 0x1100, 53 ANDROID_NL80211_SUBCMD_RTT_RANGE_END = 0x11FF, 54 55 ANDROID_NL80211_SUBCMD_LSTATS_RANGE_START = 0x1200, 56 ANDROID_NL80211_SUBCMD_LSTATS_RANGE_END = 0x12FF, 57 58 /* define all Logger related commands between 0x1400 and 0x14FF */ 59 ANDROID_NL80211_SUBCMD_DEBUG_RANGE_START = 0x1400, 60 ANDROID_NL80211_SUBCMD_DEBUG_RANGE_END = 0x14FF, 61 62 /* define all wifi offload related commands between 0x1600 and 0x16FF */ 63 ANDROID_NL80211_SUBCMD_WIFI_OFFLOAD_RANGE_START = 0x1600, 64 ANDROID_NL80211_SUBCMD_WIFI_OFFLOAD_RANGE_END = 0x16FF, 65 66 /* This is reserved for future usage */ 67 68 } ANDROID_VENDOR_SUB_COMMAND; 69 70 typedef enum { 71 72 GSCAN_SUBCMD_GET_CAPABILITIES = ANDROID_NL80211_SUBCMD_GSCAN_RANGE_START, 73 74 GSCAN_SUBCMD_SET_CONFIG, /* 0x1001 */ 75 76 GSCAN_SUBCMD_SET_SCAN_CONFIG, /* 0x1002 */ 77 GSCAN_SUBCMD_ENABLE_GSCAN, /* 0x1003 */ 78 GSCAN_SUBCMD_GET_SCAN_RESULTS, /* 0x1004 */ 79 GSCAN_SUBCMD_SCAN_RESULTS, /* 0x1005 */ 80 81 GSCAN_SUBCMD_SET_HOTLIST, /* 0x1006 */ 82 83 GSCAN_SUBCMD_SET_SIGNIFICANT_CHANGE_CONFIG, /* 0x1007 */ 84 GSCAN_SUBCMD_ENABLE_FULL_SCAN_RESULTS, /* 0x1008 */ 85 GSCAN_SUBCMD_GET_CHANNEL_LIST, /* 0x1009 */ 86 87 WIFI_SUBCMD_GET_FEATURE_SET, /* 0x100A */ 88 WIFI_SUBCMD_GET_FEATURE_SET_MATRIX, /* 0x100B */ 89 WIFI_SUBCMD_SET_PNO_RANDOM_MAC_OUI, /* 0x100C */ 90 WIFI_SUBCMD_NODFS_SET, /* 0x100D */ 91 WIFI_SUBCMD_SET_COUNTRY_CODE, /* 0x100E */ 92 /* Add more sub commands here */ 93 GSCAN_SUBCMD_SET_EPNO_SSID, /* 0x100F */ 94 95 WIFI_SUBCMD_SET_SSID_WHITE_LIST, /* 0x1010 */ 96 WIFI_SUBCMD_SET_ROAM_PARAMS, /* 0x1011 */ 97 WIFI_SUBCMD_ENABLE_LAZY_ROAM, /* 0x1012 */ 98 WIFI_SUBCMD_SET_BSSID_PREF, /* 0x1013 */ 99 WIFI_SUBCMD_SET_BSSID_BLACKLIST, /* 0x1014 */ 100 101 GSCAN_SUBCMD_ANQPO_CONFIG, /* 0x1015 */ 102 WIFI_SUBCMD_SET_RSSI_MONITOR, /* 0x1016 */ 103 /* Add more sub commands here */ 104 105 GSCAN_SUBCMD_MAX 106 107 } WIFI_SUB_COMMAND; 108 109 typedef enum { 110 BRCM_RESERVED1, 111 BRCM_RESERVED2, 112 GSCAN_EVENT_SIGNIFICANT_CHANGE_RESULTS , 113 GSCAN_EVENT_HOTLIST_RESULTS_FOUND, 114 GSCAN_EVENT_SCAN_RESULTS_AVAILABLE, 115 GSCAN_EVENT_FULL_SCAN_RESULTS, 116 RTT_EVENT_COMPLETE, 117 GSCAN_EVENT_COMPLETE_SCAN, 118 GSCAN_EVENT_HOTLIST_RESULTS_LOST, 119 GSCAN_EVENT_EPNO_EVENT, 120 GOOGLE_DEBUG_RING_EVENT, 121 GOOGLE_DEBUG_MEM_DUMP_EVENT, 122 GSCAN_EVENT_ANQPO_HOTSPOT_MATCH, 123 GOOGLE_RSSI_MONITOR_EVENT 124 } WIFI_EVENT; 125 126 typedef void (*wifi_internal_event_handler) (wifi_handle handle, int events); 127 128 class WifiCommand; 129 130 typedef struct { 131 int nl_cmd; 132 uint32_t vendor_id; 133 int vendor_subcmd; 134 nl_recvmsg_msg_cb_t cb_func; 135 void *cb_arg; 136 } cb_info; 137 138 typedef struct { 139 wifi_request_id id; 140 WifiCommand *cmd; 141 } cmd_info; 142 143 typedef struct { 144 wifi_handle handle; // handle to wifi data 145 char name[8+1]; // interface name + trailing null 146 int id; // id to use when talking to driver 147 } interface_info; 148 149 typedef struct { 150 151 struct nl_sock *cmd_sock; // command socket object 152 struct nl_sock *event_sock; // event socket object 153 int nl80211_family_id; // family id for 80211 driver 154 int cleanup_socks[2]; // sockets used to implement wifi_cleanup 155 156 bool in_event_loop; // Indicates that event loop is active 157 bool clean_up; // Indication to exit since cleanup has started 158 159 wifi_internal_event_handler event_handler; // default event handler 160 wifi_cleaned_up_handler cleaned_up_handler; // socket cleaned up handler 161 162 cb_info *event_cb; // event callbacks 163 int num_event_cb; // number of event callbacks 164 int alloc_event_cb; // number of allocated callback objects 165 pthread_mutex_t cb_lock; // mutex for the event_cb access 166 167 cmd_info *cmd; // Outstanding commands 168 int num_cmd; // number of commands 169 int alloc_cmd; // number of commands allocated 170 171 interface_info **interfaces; // array of interfaces 172 int num_interfaces; // number of interfaces 173 174 175 // add other details 176 } hal_info; 177 178 #define PNO_SSID_FOUND 0x1 179 #define PNO_SSID_LOST 0x2 180 181 typedef struct wifi_pno_result { 182 unsigned char ssid[32]; 183 unsigned char ssid_len; 184 signed char rssi; 185 u16 channel; 186 u16 flags; 187 mac_addr bssid; 188 } wifi_pno_result_t; 189 190 wifi_error wifi_register_handler(wifi_handle handle, int cmd, nl_recvmsg_msg_cb_t func, void *arg); 191 wifi_error wifi_register_vendor_handler(wifi_handle handle, 192 uint32_t id, int subcmd, nl_recvmsg_msg_cb_t func, void *arg); 193 194 void wifi_unregister_handler(wifi_handle handle, int cmd); 195 void wifi_unregister_vendor_handler(wifi_handle handle, uint32_t id, int subcmd); 196 197 wifi_error wifi_register_cmd(wifi_handle handle, int id, WifiCommand *cmd); 198 WifiCommand *wifi_unregister_cmd(wifi_handle handle, int id); 199 WifiCommand *wifi_get_cmd(wifi_handle handle, int id); 200 void wifi_unregister_cmd(wifi_handle handle, WifiCommand *cmd); 201 202 interface_info *getIfaceInfo(wifi_interface_handle); 203 wifi_handle getWifiHandle(wifi_interface_handle handle); 204 hal_info *getHalInfo(wifi_handle handle); 205 hal_info *getHalInfo(wifi_interface_handle handle); 206 wifi_handle getWifiHandle(hal_info *info); 207 wifi_interface_handle getIfaceHandle(interface_info *info); 208 wifi_error wifi_cancel_cmd(wifi_request_id id, wifi_interface_handle iface); 209 210 // some common macros 211 212 #define min(x, y) ((x) < (y) ? (x) : (y)) 213 #define max(x, y) ((x) > (y) ? (x) : (y)) 214 215 #endif 216 217