common.h revision 410ad0bbd246404e61de42ea62266f4cc55f9a5a
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 25const 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 35typedef 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 /* This is reserved for future usage */ 59 60} ANDROID_VENDOR_SUB_COMMAND; 61 62typedef enum { 63 64 GSCAN_SUBCMD_GET_CAPABILITIES = ANDROID_NL80211_SUBCMD_GSCAN_RANGE_START, 65 66 GSCAN_SUBCMD_SET_CONFIG, /* 0x1001 */ 67 68 GSCAN_SUBCMD_SET_SCAN_CONFIG, /* 0x1002 */ 69 GSCAN_SUBCMD_ENABLE_GSCAN, /* 0x1003 */ 70 GSCAN_SUBCMD_GET_SCAN_RESULTS, /* 0x1004 */ 71 GSCAN_SUBCMD_SCAN_RESULTS, /* 0x1005 */ 72 73 GSCAN_SUBCMD_SET_HOTLIST, /* 0x1006 */ 74 75 GSCAN_SUBCMD_SET_SIGNIFICANT_CHANGE_CONFIG, /* 0x1007 */ 76 GSCAN_SUBCMD_ENABLE_FULL_SCAN_RESULTS, /* 0x1008 */ 77 GSCAN_SUBCMD_GET_CHANNEL_LIST, /* 0x1009 */ 78 79 WIFI_SUBCMD_GET_FEATURE_SET, /* 0x100A */ 80 WIFI_SUBCMD_GET_FEATURE_SET_MATRIX, /* 0x100B */ 81 WIFI_SUBCMD_SET_PNO_RANDOM_MAC_OUI, /* 0x100C */ 82 WIFI_SUBCMD_NODFS_SET, /* 0x100D */ 83 WIFI_SUBCMD_SET_COUNTRY_CODE, /* 0x100E */ 84 /* Add more sub commands here */ 85 GSCAN_SUBCMD_SET_EPNO_SSID, /* 0x100F */ 86 87 WIFI_SUBCMD_SET_SSID_WHITE_LIST, /* 0x1010 */ 88 WIFI_SUBCMD_SET_ROAM_PARAMS, /* 0x1011 */ 89 WIFI_SUBCMD_ENABLE_LAZY_ROAM, /* 0x1012 */ 90 WIFI_SUBCMD_SET_BSSID_PREF, /* 0x1013 */ 91 WIFI_SUBCMD_SET_BSSID_BLACKLIST, /* 0x1014 */ 92 /* Add more sub commands here */ 93 94 GSCAN_SUBCMD_MAX /* 0x1015 */ 95 96} WIFI_SUB_COMMAND; 97 98typedef enum { 99 BRCM_RESERVED1, 100 BRCM_RESERVED2, 101 GSCAN_EVENT_SIGNIFICANT_CHANGE_RESULTS , 102 GSCAN_EVENT_HOTLIST_RESULTS_FOUND, 103 GSCAN_EVENT_SCAN_RESULTS_AVAILABLE, 104 GSCAN_EVENT_FULL_SCAN_RESULTS, 105 RTT_EVENT_COMPLETE, 106 GSCAN_EVENT_COMPLETE_SCAN, 107 GSCAN_EVENT_HOTLIST_RESULTS_LOST, 108 GSCAN_EVENT_EPNO_EVENT 109} WIFI_EVENT; 110 111typedef void (*wifi_internal_event_handler) (wifi_handle handle, int events); 112 113class WifiCommand; 114 115typedef struct { 116 int nl_cmd; 117 uint32_t vendor_id; 118 int vendor_subcmd; 119 nl_recvmsg_msg_cb_t cb_func; 120 void *cb_arg; 121} cb_info; 122 123typedef struct { 124 wifi_request_id id; 125 WifiCommand *cmd; 126} cmd_info; 127 128typedef struct { 129 wifi_handle handle; // handle to wifi data 130 char name[8+1]; // interface name + trailing null 131 int id; // id to use when talking to driver 132} interface_info; 133 134typedef struct { 135 136 struct nl_sock *cmd_sock; // command socket object 137 struct nl_sock *event_sock; // event socket object 138 int nl80211_family_id; // family id for 80211 driver 139 140 bool in_event_loop; // Indicates that event loop is active 141 bool clean_up; // Indication to clean up the socket 142 143 wifi_internal_event_handler event_handler; // default event handler 144 wifi_cleaned_up_handler cleaned_up_handler; // socket cleaned up handler 145 146 cb_info *event_cb; // event callbacks 147 int num_event_cb; // number of event callbacks 148 int alloc_event_cb; // number of allocated callback objects 149 pthread_mutex_t cb_lock; // mutex for the event_cb access 150 151 cmd_info *cmd; // Outstanding commands 152 int num_cmd; // number of commands 153 int alloc_cmd; // number of commands allocated 154 155 interface_info **interfaces; // array of interfaces 156 int num_interfaces; // number of interfaces 157 158 159 // add other details 160} hal_info; 161 162#define PNO_SSID_FOUND 0x1 163#define PNO_SSID_LOST 0x2 164 165typedef struct wifi_pno_result { 166 unsigned char ssid[32]; 167 unsigned char ssid_len; 168 signed char rssi; 169 u16 channel; 170 u16 flags; 171} wifi_pno_result_t; 172 173wifi_error wifi_register_handler(wifi_handle handle, int cmd, nl_recvmsg_msg_cb_t func, void *arg); 174wifi_error wifi_register_vendor_handler(wifi_handle handle, 175 uint32_t id, int subcmd, nl_recvmsg_msg_cb_t func, void *arg); 176 177void wifi_unregister_handler(wifi_handle handle, int cmd); 178void wifi_unregister_vendor_handler(wifi_handle handle, uint32_t id, int subcmd); 179 180wifi_error wifi_register_cmd(wifi_handle handle, int id, WifiCommand *cmd); 181WifiCommand *wifi_unregister_cmd(wifi_handle handle, int id); 182WifiCommand *wifi_get_cmd(wifi_handle handle, int id); 183void wifi_unregister_cmd(wifi_handle handle, WifiCommand *cmd); 184 185interface_info *getIfaceInfo(wifi_interface_handle); 186wifi_handle getWifiHandle(wifi_interface_handle handle); 187hal_info *getHalInfo(wifi_handle handle); 188hal_info *getHalInfo(wifi_interface_handle handle); 189wifi_handle getWifiHandle(hal_info *info); 190wifi_interface_handle getIfaceHandle(interface_info *info); 191 192 193// some common macros 194 195#define min(x, y) ((x) < (y) ? (x) : (y)) 196#define max(x, y) ((x) > (y) ? (x) : (y)) 197 198#endif 199 200