11a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
21a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#include "wifi_hal.h"
31a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
41a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#ifndef __WIFI_HAL_COMMON_H__
51a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#define __WIFI_HAL_COMMON_H__
61a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
71a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#define LOG_TAG  "WifiHAL"
81a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
91a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#include <utils/Log.h>
101a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#include "nl80211_copy.h"
11bb8a4d506769d7dc8b33445c6725a40b7523063cVinit Deshpande#include "sync.h"
121a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
131a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#define SOCKET_BUFFER_SIZE      (32768U)
141a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#define RECV_BUF_SIZE           (4096)
151a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#define DEFAULT_EVENT_CB_SIZE   (64)
161a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#define DEFAULT_CMD_SIZE        (64)
17f0d5070a931327e6356d765478069b9e66452a5bAshwin#define DOT11_OUI_LEN             3
182b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin#define DOT11_MAX_SSID_LEN        32
191a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
202b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin#define MAX_PROBE_RESP_IE_LEN      2048
211a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde/*
221a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde Vendor OUI - This is a unique identifier that identifies organization. Lets
231a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde code Android specific functions with Google OUI; although vendors can do more
241a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde with their own OUI's as well.
251a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde */
261a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
271a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndeconst uint32_t GOOGLE_OUI = 0x001A11;
281a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde/* TODO: define vendor OUI here */
291a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
301a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
311a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde/*
321a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde This enum defines ranges for various commands; commands themselves
331a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde can be defined in respective feature headers; i.e. find gscan command
341a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde definitions in gscan.cpp
351a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde */
361a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
371a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndetypedef enum {
381a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    /* don't use 0 as a valid subcommand */
391a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    VENDOR_NL80211_SUBCMD_UNSPECIFIED,
401a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
411a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    /* define all vendor startup commands between 0x0 and 0x0FFF */
421a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    VENDOR_NL80211_SUBCMD_RANGE_START = 0x0001,
431a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    VENDOR_NL80211_SUBCMD_RANGE_END   = 0x0FFF,
441a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
451a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    /* define all GScan related commands between 0x1000 and 0x10FF */
461a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    ANDROID_NL80211_SUBCMD_GSCAN_RANGE_START = 0x1000,
471a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    ANDROID_NL80211_SUBCMD_GSCAN_RANGE_END   = 0x10FF,
481a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
491a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    /* define all NearbyDiscovery related commands between 0x1100 and 0x11FF */
501a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    ANDROID_NL80211_SUBCMD_NBD_RANGE_START = 0x1100,
511a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    ANDROID_NL80211_SUBCMD_NBD_RANGE_END   = 0x11FF,
521a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
531a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    /* define all RTT related commands between 0x1100 and 0x11FF */
541a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    ANDROID_NL80211_SUBCMD_RTT_RANGE_START = 0x1100,
551a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    ANDROID_NL80211_SUBCMD_RTT_RANGE_END   = 0x11FF,
561a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
5771cd80b3a0a1d019090f0dc022fce785ded3883eChilam Ng    ANDROID_NL80211_SUBCMD_LSTATS_RANGE_START = 0x1200,
5871cd80b3a0a1d019090f0dc022fce785ded3883eChilam Ng    ANDROID_NL80211_SUBCMD_LSTATS_RANGE_END   = 0x12FF,
5971cd80b3a0a1d019090f0dc022fce785ded3883eChilam Ng
60aa306e5f46b3e0e72d7917760b8af6aaebc35b1eJerry Lee    /* define all Logger related commands between 0x1400 and 0x14FF */
61aa306e5f46b3e0e72d7917760b8af6aaebc35b1eJerry Lee    ANDROID_NL80211_SUBCMD_DEBUG_RANGE_START = 0x1400,
62aa306e5f46b3e0e72d7917760b8af6aaebc35b1eJerry Lee    ANDROID_NL80211_SUBCMD_DEBUG_RANGE_END   = 0x14FF,
63aa306e5f46b3e0e72d7917760b8af6aaebc35b1eJerry Lee
648f1ec7e8e43ec37e94806764b2873c93368cf137Ecco Park    /* define all wifi offload related commands between 0x1600 and 0x16FF */
658f1ec7e8e43ec37e94806764b2873c93368cf137Ecco Park    ANDROID_NL80211_SUBCMD_WIFI_OFFLOAD_RANGE_START = 0x1600,
668f1ec7e8e43ec37e94806764b2873c93368cf137Ecco Park    ANDROID_NL80211_SUBCMD_WIFI_OFFLOAD_RANGE_END   = 0x16FF,
678f1ec7e8e43ec37e94806764b2873c93368cf137Ecco Park
68dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma    /* define all NAN related commands between 0x1700 and 0x17FF */
69dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma    ANDROID_NL80211_SUBCMD_NAN_RANGE_START = 0x1700,
70dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma    ANDROID_NL80211_SUBCMD_NAN_RANGE_END   = 0x17FF,
71dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma
72dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma    /* define all Android Packet Filter related commands between 0x1800 and 0x18FF */
73dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma    ANDROID_NL80211_SUBCMD_PKT_FILTER_RANGE_START = 0x1800,
74dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma    ANDROID_NL80211_SUBCMD_PKT_FILTER_RANGE_END   = 0x18FF,
75dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma
761a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    /* This is reserved for future usage */
771a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
781a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde} ANDROID_VENDOR_SUB_COMMAND;
791a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
80115bcffc16c53e9552c09a6792666c52a633b4f2Ashwintypedef enum {
819a23388d5a9f58f106169700bb179de0a4af7840Ashwin
829a23388d5a9f58f106169700bb179de0a4af7840Ashwin    GSCAN_SUBCMD_GET_CAPABILITIES = ANDROID_NL80211_SUBCMD_GSCAN_RANGE_START,
839a23388d5a9f58f106169700bb179de0a4af7840Ashwin
849a23388d5a9f58f106169700bb179de0a4af7840Ashwin    GSCAN_SUBCMD_SET_CONFIG,                            /* 0x1001 */
859a23388d5a9f58f106169700bb179de0a4af7840Ashwin
869a23388d5a9f58f106169700bb179de0a4af7840Ashwin    GSCAN_SUBCMD_SET_SCAN_CONFIG,                       /* 0x1002 */
879a23388d5a9f58f106169700bb179de0a4af7840Ashwin    GSCAN_SUBCMD_ENABLE_GSCAN,                          /* 0x1003 */
889a23388d5a9f58f106169700bb179de0a4af7840Ashwin    GSCAN_SUBCMD_GET_SCAN_RESULTS,                      /* 0x1004 */
899a23388d5a9f58f106169700bb179de0a4af7840Ashwin    GSCAN_SUBCMD_SCAN_RESULTS,                          /* 0x1005 */
909a23388d5a9f58f106169700bb179de0a4af7840Ashwin
919a23388d5a9f58f106169700bb179de0a4af7840Ashwin    GSCAN_SUBCMD_SET_HOTLIST,                           /* 0x1006 */
929a23388d5a9f58f106169700bb179de0a4af7840Ashwin
939a23388d5a9f58f106169700bb179de0a4af7840Ashwin    GSCAN_SUBCMD_SET_SIGNIFICANT_CHANGE_CONFIG,         /* 0x1007 */
949a23388d5a9f58f106169700bb179de0a4af7840Ashwin    GSCAN_SUBCMD_ENABLE_FULL_SCAN_RESULTS,              /* 0x1008 */
959a23388d5a9f58f106169700bb179de0a4af7840Ashwin    GSCAN_SUBCMD_GET_CHANNEL_LIST,                       /* 0x1009 */
969a23388d5a9f58f106169700bb179de0a4af7840Ashwin
979a23388d5a9f58f106169700bb179de0a4af7840Ashwin    WIFI_SUBCMD_GET_FEATURE_SET,                         /* 0x100A */
989a23388d5a9f58f106169700bb179de0a4af7840Ashwin    WIFI_SUBCMD_GET_FEATURE_SET_MATRIX,                  /* 0x100B */
99f0d5070a931327e6356d765478069b9e66452a5bAshwin    WIFI_SUBCMD_SET_PNO_RANDOM_MAC_OUI,                  /* 0x100C */
100b4ac10a4e1eddf00ddad32f3307cc050bb4e0963Dmitry Shmidt    WIFI_SUBCMD_NODFS_SET,                               /* 0x100D */
101c02e00563882d87ab29822c43097cbb1ce04b55dxinhe    WIFI_SUBCMD_SET_COUNTRY_CODE,                             /* 0x100E */
1029a23388d5a9f58f106169700bb179de0a4af7840Ashwin    /* Add more sub commands here */
10389a9a4cffbcee6af504c61ff575a008194070c82Ashwin    GSCAN_SUBCMD_SET_EPNO_SSID,                          /* 0x100F */
104410ad0bbd246404e61de42ea62266f4cc55f9a5aAshwin
105410ad0bbd246404e61de42ea62266f4cc55f9a5aAshwin    WIFI_SUBCMD_SET_SSID_WHITE_LIST,                    /* 0x1010 */
106410ad0bbd246404e61de42ea62266f4cc55f9a5aAshwin    WIFI_SUBCMD_SET_ROAM_PARAMS,                        /* 0x1011 */
107410ad0bbd246404e61de42ea62266f4cc55f9a5aAshwin    WIFI_SUBCMD_ENABLE_LAZY_ROAM,                       /* 0x1012 */
108410ad0bbd246404e61de42ea62266f4cc55f9a5aAshwin    WIFI_SUBCMD_SET_BSSID_PREF,                         /* 0x1013 */
109410ad0bbd246404e61de42ea62266f4cc55f9a5aAshwin    WIFI_SUBCMD_SET_BSSID_BLACKLIST,                     /* 0x1014 */
110f02e958d58bc49a8f228927dfb261fe57d080560Chilam Ng
111f02e958d58bc49a8f228927dfb261fe57d080560Chilam Ng    GSCAN_SUBCMD_ANQPO_CONFIG,                          /* 0x1015 */
112fef13c11034313585be68c32322b9a53c43a37b2Ashwin    WIFI_SUBCMD_SET_RSSI_MONITOR,                       /* 0x1016 */
11365f9c6fbd929be309642cdaf255e8394aad2b0caJun Lim    WIFI_SUBCMD_CONFIG_ND_OFFLOAD,                      /* 0x1017 */
114410ad0bbd246404e61de42ea62266f4cc55f9a5aAshwin    /* Add more sub commands here */
115410ad0bbd246404e61de42ea62266f4cc55f9a5aAshwin
116dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma    GSCAN_SUBCMD_MAX,
1179a23388d5a9f58f106169700bb179de0a4af7840Ashwin
118dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma    APF_SUBCMD_GET_CAPABILITIES = ANDROID_NL80211_SUBCMD_PKT_FILTER_RANGE_START,
119dfe5b594561312993f587dc29e524d400e8fbc77Sreenath Sharma    APF_SUBCMD_SET_FILTER,
1209a23388d5a9f58f106169700bb179de0a4af7840Ashwin} WIFI_SUB_COMMAND;
1219a23388d5a9f58f106169700bb179de0a4af7840Ashwin
1229a23388d5a9f58f106169700bb179de0a4af7840Ashwintypedef enum {
123115bcffc16c53e9552c09a6792666c52a633b4f2Ashwin    BRCM_RESERVED1,
124115bcffc16c53e9552c09a6792666c52a633b4f2Ashwin    BRCM_RESERVED2,
125115bcffc16c53e9552c09a6792666c52a633b4f2Ashwin    GSCAN_EVENT_SIGNIFICANT_CHANGE_RESULTS ,
126f0d5070a931327e6356d765478069b9e66452a5bAshwin    GSCAN_EVENT_HOTLIST_RESULTS_FOUND,
127115bcffc16c53e9552c09a6792666c52a633b4f2Ashwin    GSCAN_EVENT_SCAN_RESULTS_AVAILABLE,
128115bcffc16c53e9552c09a6792666c52a633b4f2Ashwin    GSCAN_EVENT_FULL_SCAN_RESULTS,
1299a23388d5a9f58f106169700bb179de0a4af7840Ashwin    RTT_EVENT_COMPLETE,
130f0d5070a931327e6356d765478069b9e66452a5bAshwin    GSCAN_EVENT_COMPLETE_SCAN,
13189a9a4cffbcee6af504c61ff575a008194070c82Ashwin    GSCAN_EVENT_HOTLIST_RESULTS_LOST,
132aa306e5f46b3e0e72d7917760b8af6aaebc35b1eJerry Lee    GSCAN_EVENT_EPNO_EVENT,
133aa306e5f46b3e0e72d7917760b8af6aaebc35b1eJerry Lee    GOOGLE_DEBUG_RING_EVENT,
134b3b31174c61e38a970b956cb50cb66cd1903ca9bJerry Lee    GOOGLE_DEBUG_MEM_DUMP_EVENT,
135fef13c11034313585be68c32322b9a53c43a37b2Ashwin    GSCAN_EVENT_ANQPO_HOTSPOT_MATCH,
136fef13c11034313585be68c32322b9a53c43a37b2Ashwin    GOOGLE_RSSI_MONITOR_EVENT
137115bcffc16c53e9552c09a6792666c52a633b4f2Ashwin} WIFI_EVENT;
138115bcffc16c53e9552c09a6792666c52a633b4f2Ashwin
1391a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndetypedef void (*wifi_internal_event_handler) (wifi_handle handle, int events);
1401a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1411a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndeclass WifiCommand;
1421a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1431a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndetypedef struct {
1441a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    int nl_cmd;
1451a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    uint32_t vendor_id;
1461a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    int vendor_subcmd;
1471a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    nl_recvmsg_msg_cb_t cb_func;
1481a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    void *cb_arg;
1491a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde} cb_info;
1501a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1511a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndetypedef struct {
1521a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    wifi_request_id id;
1531a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    WifiCommand *cmd;
1541a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde} cmd_info;
1551a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1561a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndetypedef struct {
1571a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    wifi_handle handle;                             // handle to wifi data
15814563c48353feaae11cce3017f038fb5cff54c5dSreenath Sharma    char name[IFNAMSIZ+1];                          // interface name + trailing null
1591a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    int  id;                                        // id to use when talking to driver
1601a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde} interface_info;
1611a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1621a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndetypedef struct {
1631a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1641a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    struct nl_sock *cmd_sock;                       // command socket object
1651a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    struct nl_sock *event_sock;                     // event socket object
1661a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    int nl80211_family_id;                          // family id for 80211 driver
16705e31d445f52da4746ff0cc0703d83814cea98d0Vinit Deshpande    int cleanup_socks[2];                           // sockets used to implement wifi_cleanup
1681a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1691a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    bool in_event_loop;                             // Indicates that event loop is active
17056c89ca266b11be506192f3a13a1dba3f109c2cfAshwin    bool clean_up;                                  // Indication to exit since cleanup has started
1711a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1721a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    wifi_internal_event_handler event_handler;      // default event handler
1731a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    wifi_cleaned_up_handler cleaned_up_handler;     // socket cleaned up handler
1741a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1751a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    cb_info *event_cb;                              // event callbacks
1761a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    int num_event_cb;                               // number of event callbacks
1771a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    int alloc_event_cb;                             // number of allocated callback objects
178bb8a4d506769d7dc8b33445c6725a40b7523063cVinit Deshpande    pthread_mutex_t cb_lock;                        // mutex for the event_cb access
1791a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1801a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    cmd_info *cmd;                                  // Outstanding commands
1811a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    int num_cmd;                                    // number of commands
1821a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    int alloc_cmd;                                  // number of commands allocated
1831a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
1841a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    interface_info **interfaces;                    // array of interfaces
1851a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    int num_interfaces;                             // number of interfaces
1861a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
187bb8a4d506769d7dc8b33445c6725a40b7523063cVinit Deshpande
1881a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde    // add other details
1891a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde} hal_info;
1901a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
19189a9a4cffbcee6af504c61ff575a008194070c82Ashwin#define PNO_SSID_FOUND  0x1
19289a9a4cffbcee6af504c61ff575a008194070c82Ashwin#define PNO_SSID_LOST    0x2
19389a9a4cffbcee6af504c61ff575a008194070c82Ashwin
19489a9a4cffbcee6af504c61ff575a008194070c82Ashwintypedef struct wifi_pno_result {
1952b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    unsigned char ssid[DOT11_MAX_SSID_LEN];
19689a9a4cffbcee6af504c61ff575a008194070c82Ashwin    unsigned char ssid_len;
197ee8188b877f4aac2c09ee68ec5cfc60b1869a512Pierre Vandwalle    signed char rssi;
19889a9a4cffbcee6af504c61ff575a008194070c82Ashwin    u16 channel;
19989a9a4cffbcee6af504c61ff575a008194070c82Ashwin    u16 flags;
20025a0fb843d8b6d9141ccb435f1f9ee9a29d3afc6Ashwin    mac_addr  bssid;
20189a9a4cffbcee6af504c61ff575a008194070c82Ashwin} wifi_pno_result_t;
20289a9a4cffbcee6af504c61ff575a008194070c82Ashwin
2032b31c56930bc154d639da4ff2f56c34ef61688e5Ashwintypedef struct wifi_gscan_result {
2042b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u64 ts;                           // Time of discovery
2052b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u8 ssid[DOT11_MAX_SSID_LEN+1];    // null terminated
2062b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    mac_addr bssid;                   // BSSID
2072b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u32 channel;                      // channel frequency in MHz
2082b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    s32 rssi;                         // in db
2092b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u64 rtt;                          // in nanoseconds
2102b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u64 rtt_sd;                       // standard deviation in rtt
2112b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u16 beacon_period;                // units are Kusec
2122b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u16 capability;                   // Capability information
2132b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u32 pad;
2142b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin} wifi_gscan_result_t;
2152b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin
2162b31c56930bc154d639da4ff2f56c34ef61688e5Ashwintypedef struct wifi_gscan_full_result {
2172b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    wifi_gscan_result_t fixed;
2182b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u32 scan_ch_bucket;              // scan chbucket bitmask
2192b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u32 ie_length;                   // byte length of Information Elements
2202b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin    u8  ie_data[1];                  // IE data to follow
2212b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin} wifi_gscan_full_result_t;
2222b31c56930bc154d639da4ff2f56c34ef61688e5Ashwin
2231a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndewifi_error wifi_register_handler(wifi_handle handle, int cmd, nl_recvmsg_msg_cb_t func, void *arg);
2241a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndewifi_error wifi_register_vendor_handler(wifi_handle handle,
2251a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde            uint32_t id, int subcmd, nl_recvmsg_msg_cb_t func, void *arg);
2261a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
2271a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndevoid wifi_unregister_handler(wifi_handle handle, int cmd);
2281a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndevoid wifi_unregister_vendor_handler(wifi_handle handle, uint32_t id, int subcmd);
2291a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
2301a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndewifi_error wifi_register_cmd(wifi_handle handle, int id, WifiCommand *cmd);
2311a526434ae215b48970501ccb463d4e77af39c9eVinit DeshapndeWifiCommand *wifi_unregister_cmd(wifi_handle handle, int id);
232115bcffc16c53e9552c09a6792666c52a633b4f2AshwinWifiCommand *wifi_get_cmd(wifi_handle handle, int id);
2331a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndevoid wifi_unregister_cmd(wifi_handle handle, WifiCommand *cmd);
2341a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
2351a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndeinterface_info *getIfaceInfo(wifi_interface_handle);
2361a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndewifi_handle getWifiHandle(wifi_interface_handle handle);
2371a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndehal_info *getHalInfo(wifi_handle handle);
2381a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndehal_info *getHalInfo(wifi_interface_handle handle);
2391a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndewifi_handle getWifiHandle(hal_info *info);
2401a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapndewifi_interface_handle getIfaceHandle(interface_info *info);
241fef13c11034313585be68c32322b9a53c43a37b2Ashwinwifi_error wifi_cancel_cmd(wifi_request_id id, wifi_interface_handle iface);
2421a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
2431a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde// some common macros
2441a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
2451a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#define min(x, y)       ((x) < (y) ? (x) : (y))
2461a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#define max(x, y)       ((x) > (y) ? (x) : (y))
2471a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
2486af064b77bfdc84a6f425a7c9d0941fad11f4489Sreenath Sharma#define NULL_CHECK_RETURN(ptr, str, ret) \
2496af064b77bfdc84a6f425a7c9d0941fad11f4489Sreenath Sharma    do { \
2506af064b77bfdc84a6f425a7c9d0941fad11f4489Sreenath Sharma        if (!(ptr)) { \
2516af064b77bfdc84a6f425a7c9d0941fad11f4489Sreenath Sharma            ALOGE("%s(): null pointer - #ptr (%s)\n", __FUNCTION__, str); \
2526af064b77bfdc84a6f425a7c9d0941fad11f4489Sreenath Sharma            return ret; \
2536af064b77bfdc84a6f425a7c9d0941fad11f4489Sreenath Sharma        } \
2546af064b77bfdc84a6f425a7c9d0941fad11f4489Sreenath Sharma    } while (0)
2556af064b77bfdc84a6f425a7c9d0941fad11f4489Sreenath Sharma
2561a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde#endif
2571a526434ae215b48970501ccb463d4e77af39c9eVinit Deshapnde
258