Home | History | Annotate | Download | only in wifi_hal
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "wifi_hal.h"
     18 
     19 #ifndef __WIFI_HAL_COMMON_H__
     20 #define __WIFI_HAL_COMMON_H__
     21 
     22 #ifndef LOG_TAG
     23 #define LOG_TAG  "WifiHAL"
     24 #endif
     25 
     26 #include <stdint.h>
     27 #include <fcntl.h>
     28 #include <inttypes.h>
     29 #include <sys/socket.h>
     30 #include <netlink/genl/genl.h>
     31 #include <netlink/genl/family.h>
     32 #include <netlink/genl/ctrl.h>
     33 #include <linux/rtnetlink.h>
     34 #include <netpacket/packet.h>
     35 #include <linux/filter.h>
     36 #include <linux/errqueue.h>
     37 
     38 #include <linux/pkt_sched.h>
     39 #include <netlink/object-api.h>
     40 #include <netlink/netlink.h>
     41 #include <netlink/socket.h>
     42 
     43 #include "nl80211_copy.h"
     44 
     45 #include <utils/Log.h>
     46 #include "rb_wrapper.h"
     47 #include "pkt_stats.h"
     48 #include "wifihal_internal.h"
     49 
     50 #define SOCKET_BUFFER_SIZE      (32768U)
     51 #define RECV_BUF_SIZE           (4096)
     52 #define DEFAULT_EVENT_CB_SIZE   (64)
     53 #define DEFAULT_CMD_SIZE        (64)
     54 #define NUM_RING_BUFS           5
     55 
     56 #define MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
     57 #define MAC_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x"
     58 #define BIT(x) (1 << (x))
     59 
     60 typedef int16_t s16;
     61 typedef int32_t s32;
     62 typedef int64_t s64;
     63 
     64 typedef void (*wifi_internal_event_handler) (wifi_handle handle, int events);
     65 
     66 class WifiCommand;
     67 
     68 typedef struct {
     69     int nl_cmd;
     70     uint32_t vendor_id;
     71     int vendor_subcmd;
     72     nl_recvmsg_msg_cb_t cb_func;
     73     void *cb_arg;
     74 } cb_info;
     75 
     76 typedef struct {
     77     wifi_request_id id;
     78     WifiCommand *cmd;
     79 } cmd_info;
     80 
     81 typedef struct {
     82     wifi_handle handle;                             // handle to wifi data
     83     char name[IFNAMSIZ+1];                          // interface name + trailing null
     84     int  id;                                        // id to use when talking to driver
     85 } interface_info;
     86 
     87 typedef struct {
     88     wifi_gscan_capabilities gscan_capa;
     89     wifi_roaming_capabilities roaming_capa;
     90 } wifi_capa;
     91 
     92 struct gscan_event_handlers_s;
     93 struct rssi_monitor_event_handler_s;
     94 struct cld80211_ctx;
     95 
     96 typedef struct hal_info_s {
     97 
     98     struct nl_sock *cmd_sock;                       // command socket object
     99     struct nl_sock *event_sock;                     // event socket object
    100     struct nl_sock *user_sock;                      // user socket object
    101     int nl80211_family_id;                          // family id for 80211 driver
    102 
    103     bool in_event_loop;                             // Indicates that event loop is active
    104     bool clean_up;                                  // Indication to clean up the socket
    105 
    106     wifi_internal_event_handler event_handler;      // default event handler
    107     wifi_cleaned_up_handler cleaned_up_handler;     // socket cleaned up handler
    108 
    109     cb_info *event_cb;                              // event callbacks
    110     int num_event_cb;                               // number of event callbacks
    111     int alloc_event_cb;                             // number of allocated callback objects
    112     pthread_mutex_t cb_lock;                        // mutex for the event_cb access
    113 
    114     cmd_info *cmd;                                  // Outstanding commands
    115     int num_cmd;                                    // number of commands
    116     int alloc_cmd;                                  // number of commands allocated
    117 
    118     interface_info **interfaces;                    // array of interfaces
    119     int num_interfaces;                             // number of interfaces
    120 
    121     feature_set supported_feature_set;
    122     // add other details
    123     int user_sock_arg;
    124     struct rb_info rb_infos[NUM_RING_BUFS];
    125     void (*on_ring_buffer_data) (char *ring_name, char *buffer, int buffer_size,
    126           wifi_ring_buffer_status *status);
    127     void (*on_alert) (wifi_request_id id, char *buffer, int buffer_size, int err_code);
    128     struct pkt_stats_s *pkt_stats;
    129 
    130     /* socket pair used to exit from blocking poll*/
    131     int exit_sockets[2];
    132     u32 rx_buf_size_allocated;
    133     u32 rx_buf_size_occupied;
    134     wifi_ring_buffer_entry *rx_aggr_pkts;
    135     rx_aggr_stats aggr_stats;
    136     u32 prev_seq_no;
    137     // pointer to structure having various gscan_event_handlers
    138     struct gscan_event_handlers_s *gscan_handlers;
    139     /* mutex for the log_handler access*/
    140     pthread_mutex_t lh_lock;
    141     /* mutex for the alert_handler access*/
    142     pthread_mutex_t ah_lock;
    143     u32 firmware_bus_max_size;
    144     bool fate_monitoring_enabled;
    145     packet_fate_monitor_info *pkt_fate_stats;
    146     /* mutex for the packet fate stats shared resource protection */
    147     pthread_mutex_t pkt_fate_stats_lock;
    148     struct rssi_monitor_event_handler_s *rssi_handlers;
    149     wifi_capa capa;
    150     struct cld80211_ctx *cldctx;
    151 } hal_info;
    152 
    153 wifi_error wifi_register_handler(wifi_handle handle, int cmd, nl_recvmsg_msg_cb_t func, void *arg);
    154 wifi_error wifi_register_vendor_handler(wifi_handle handle,
    155             uint32_t id, int subcmd, nl_recvmsg_msg_cb_t func, void *arg);
    156 
    157 void wifi_unregister_handler(wifi_handle handle, int cmd);
    158 void wifi_unregister_vendor_handler(wifi_handle handle, uint32_t id, int subcmd);
    159 
    160 wifi_error wifi_register_cmd(wifi_handle handle, int id, WifiCommand *cmd);
    161 WifiCommand *wifi_unregister_cmd(wifi_handle handle, int id);
    162 void wifi_unregister_cmd(wifi_handle handle, WifiCommand *cmd);
    163 
    164 interface_info *getIfaceInfo(wifi_interface_handle);
    165 wifi_handle getWifiHandle(wifi_interface_handle handle);
    166 hal_info *getHalInfo(wifi_handle handle);
    167 hal_info *getHalInfo(wifi_interface_handle handle);
    168 wifi_handle getWifiHandle(hal_info *info);
    169 wifi_interface_handle getIfaceHandle(interface_info *info);
    170 wifi_error initializeGscanHandlers(hal_info *info);
    171 wifi_error cleanupGscanHandlers(hal_info *info);
    172 wifi_error initializeRSSIMonitorHandler(hal_info *info);
    173 wifi_error cleanupRSSIMonitorHandler(hal_info *info);
    174 
    175 lowi_cb_table_t *getLowiCallbackTable(u32 requested_lowi_capabilities);
    176 
    177 wifi_error wifi_start_sending_offloaded_packet(wifi_request_id id,
    178         wifi_interface_handle iface, u8 *ip_packet, u16 ip_packet_len,
    179         u8 *src_mac_addr, u8 *dst_mac_addr, u32 period_msec);
    180 wifi_error wifi_stop_sending_offloaded_packet(wifi_request_id id,
    181         wifi_interface_handle iface);
    182 wifi_error wifi_start_rssi_monitoring(wifi_request_id id, wifi_interface_handle
    183         iface, s8 max_rssi, s8 min_rssi, wifi_rssi_event_handler eh);
    184 wifi_error wifi_stop_rssi_monitoring(wifi_request_id id, wifi_interface_handle iface);
    185 // some common macros
    186 
    187 #define min(x, y)       ((x) < (y) ? (x) : (y))
    188 #define max(x, y)       ((x) > (y) ? (x) : (y))
    189 
    190 #define REQUEST_ID_MAX 1000
    191 #define get_requestid() ((arc4random()%REQUEST_ID_MAX) + 1)
    192 #define WAIT_TIME_FOR_SET_REG_DOMAIN 50000
    193 
    194 #ifndef UNUSED
    195 #define UNUSED(x)    (void)(x)
    196 #endif
    197 
    198 #ifdef __cplusplus
    199 extern "C"
    200 {
    201 #endif /* __cplusplus */
    202 void hexdump(void *bytes, u16 len);
    203 u8 get_rssi(u8 rssi_wo_noise_floor);
    204 #ifdef __cplusplus
    205 }
    206 #endif /* __cplusplus */
    207 
    208 #endif
    209 
    210