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
60typedef int16_t s16;
61typedef int32_t s32;
62typedef int64_t s64;
63
64typedef void (*wifi_internal_event_handler) (wifi_handle handle, int events);
65
66class WifiCommand;
67
68typedef 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
76typedef struct {
77    wifi_request_id id;
78    WifiCommand *cmd;
79} cmd_info;
80
81typedef 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
87typedef struct {
88    wifi_gscan_capabilities gscan_capa;
89    wifi_roaming_capabilities roaming_capa;
90} wifi_capa;
91
92struct gscan_event_handlers_s;
93struct rssi_monitor_event_handler_s;
94struct cld80211_ctx;
95
96typedef 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
153wifi_error wifi_register_handler(wifi_handle handle, int cmd, nl_recvmsg_msg_cb_t func, void *arg);
154wifi_error wifi_register_vendor_handler(wifi_handle handle,
155            uint32_t id, int subcmd, nl_recvmsg_msg_cb_t func, void *arg);
156
157void wifi_unregister_handler(wifi_handle handle, int cmd);
158void wifi_unregister_vendor_handler(wifi_handle handle, uint32_t id, int subcmd);
159
160wifi_error wifi_register_cmd(wifi_handle handle, int id, WifiCommand *cmd);
161WifiCommand *wifi_unregister_cmd(wifi_handle handle, int id);
162void wifi_unregister_cmd(wifi_handle handle, WifiCommand *cmd);
163
164interface_info *getIfaceInfo(wifi_interface_handle);
165wifi_handle getWifiHandle(wifi_interface_handle handle);
166hal_info *getHalInfo(wifi_handle handle);
167hal_info *getHalInfo(wifi_interface_handle handle);
168wifi_handle getWifiHandle(hal_info *info);
169wifi_interface_handle getIfaceHandle(interface_info *info);
170wifi_error initializeGscanHandlers(hal_info *info);
171wifi_error cleanupGscanHandlers(hal_info *info);
172wifi_error initializeRSSIMonitorHandler(hal_info *info);
173wifi_error cleanupRSSIMonitorHandler(hal_info *info);
174
175lowi_cb_table_t *getLowiCallbackTable(u32 requested_lowi_capabilities);
176
177wifi_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);
180wifi_error wifi_stop_sending_offloaded_packet(wifi_request_id id,
181        wifi_interface_handle iface);
182wifi_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);
184wifi_error wifi_stop_rssi_monitoring(wifi_request_id id, wifi_interface_handle iface);
185wifi_error mapErrorKernelToWifiHAL(int error);
186// some common macros
187
188#define min(x, y)       ((x) < (y) ? (x) : (y))
189#define max(x, y)       ((x) > (y) ? (x) : (y))
190
191#define REQUEST_ID_MAX 1000
192#define get_requestid() ((arc4random()%REQUEST_ID_MAX) + 1)
193#define WAIT_TIME_FOR_SET_REG_DOMAIN 50000
194
195#ifndef UNUSED
196#define UNUSED(x)    (void)(x)
197#endif
198
199#ifdef __cplusplus
200extern "C"
201{
202#endif /* __cplusplus */
203void hexdump(void *bytes, u16 len);
204u8 get_rssi(u8 rssi_wo_noise_floor);
205#ifdef __cplusplus
206}
207#endif /* __cplusplus */
208
209#endif
210
211