• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <sys/socket.h>
29 #include <netlink/genl/genl.h>
30 #include <netlink/genl/family.h>
31 #include <netlink/genl/ctrl.h>
32 #include <linux/rtnetlink.h>
33 #include <netpacket/packet.h>
34 #include <linux/filter.h>
35 #include <linux/errqueue.h>
36 
37 #include <linux/pkt_sched.h>
38 #include <netlink/object-api.h>
39 #include <netlink/netlink.h>
40 #include <netlink/socket.h>
41 #include <netlink-types.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 struct gscan_event_handlers_s;
88 
89 typedef struct hal_info_s {
90 
91     struct nl_sock *cmd_sock;                       // command socket object
92     struct nl_sock *event_sock;                     // event socket object
93     struct nl_sock *user_sock;                      // user socket object
94     int nl80211_family_id;                          // family id for 80211 driver
95 
96     bool in_event_loop;                             // Indicates that event loop is active
97     bool clean_up;                                  // Indication to clean up the socket
98 
99     wifi_internal_event_handler event_handler;      // default event handler
100     wifi_cleaned_up_handler cleaned_up_handler;     // socket cleaned up handler
101 
102     cb_info *event_cb;                              // event callbacks
103     int num_event_cb;                               // number of event callbacks
104     int alloc_event_cb;                             // number of allocated callback objects
105     pthread_mutex_t cb_lock;                        // mutex for the event_cb access
106 
107     cmd_info *cmd;                                  // Outstanding commands
108     int num_cmd;                                    // number of commands
109     int alloc_cmd;                                  // number of commands allocated
110 
111     interface_info **interfaces;                    // array of interfaces
112     int num_interfaces;                             // number of interfaces
113 
114     feature_set supported_feature_set;
115     // add other details
116     int user_sock_arg;
117     struct rb_info rb_infos[NUM_RING_BUFS];
118     void (*on_ring_buffer_data) (char *ring_name, char *buffer, int buffer_size,
119           wifi_ring_buffer_status *status);
120     void (*on_alert) (wifi_request_id id, char *buffer, int buffer_size, int err_code);
121     struct pkt_stats_s *pkt_stats;
122 
123     /* socket pair used to exit from blocking poll*/
124     int exit_sockets[2];
125     u32 rx_buf_size_allocated;
126     u32 rx_buf_size_occupied;
127     wifi_ring_buffer_entry *rx_aggr_pkts;
128     rx_aggr_stats aggr_stats;
129     u32 prev_seq_no;
130     // pointer to structure having various gscan_event_handlers
131     struct gscan_event_handlers_s *gscan_handlers;
132     /* mutex for the log_handler access*/
133     pthread_mutex_t lh_lock;
134     /* mutex for the alert_handler access*/
135     pthread_mutex_t ah_lock;
136 } hal_info;
137 
138 wifi_error wifi_register_handler(wifi_handle handle, int cmd, nl_recvmsg_msg_cb_t func, void *arg);
139 wifi_error wifi_register_vendor_handler(wifi_handle handle,
140             uint32_t id, int subcmd, nl_recvmsg_msg_cb_t func, void *arg);
141 
142 void wifi_unregister_handler(wifi_handle handle, int cmd);
143 void wifi_unregister_vendor_handler(wifi_handle handle, uint32_t id, int subcmd);
144 
145 wifi_error wifi_register_cmd(wifi_handle handle, int id, WifiCommand *cmd);
146 WifiCommand *wifi_unregister_cmd(wifi_handle handle, int id);
147 void wifi_unregister_cmd(wifi_handle handle, WifiCommand *cmd);
148 
149 interface_info *getIfaceInfo(wifi_interface_handle);
150 wifi_handle getWifiHandle(wifi_interface_handle handle);
151 hal_info *getHalInfo(wifi_handle handle);
152 hal_info *getHalInfo(wifi_interface_handle handle);
153 wifi_handle getWifiHandle(hal_info *info);
154 wifi_interface_handle getIfaceHandle(interface_info *info);
155 wifi_error initializeGscanHandlers(hal_info *info);
156 wifi_error cleanupGscanHandlers(hal_info *info);
157 
158 lowi_cb_table_t *getLowiCallbackTable(u32 requested_lowi_capabilities);
159 
160 wifi_error wifi_start_sending_offloaded_packet(wifi_request_id id,
161         wifi_interface_handle iface, u8 *ip_packet, u16 ip_packet_len,
162         u8 *src_mac_addr, u8 *dst_mac_addr, u32 period_msec);
163 wifi_error wifi_stop_sending_offloaded_packet(wifi_request_id id,
164         wifi_interface_handle iface);
165 wifi_error wifi_start_rssi_monitoring(wifi_request_id id, wifi_interface_handle
166         iface, s8 max_rssi, s8 min_rssi, wifi_rssi_event_handler eh);
167 wifi_error wifi_stop_rssi_monitoring(wifi_request_id id, wifi_interface_handle iface);
168 // some common macros
169 
170 #define min(x, y)       ((x) < (y) ? (x) : (y))
171 #define max(x, y)       ((x) > (y) ? (x) : (y))
172 
173 #define REQUEST_ID_MAX 1000
174 #define get_requestid() ((arc4random()%REQUEST_ID_MAX) + 1)
175 #define WAIT_TIME_FOR_SET_REG_DOMAIN 50000
176 
177 #ifdef __cplusplus
178 extern "C"
179 {
180 #endif /* __cplusplus */
181 void hexdump(void *bytes, u16 len);
182 #ifdef __cplusplus
183 }
184 #endif /* __cplusplus */
185 
186 #endif
187 
188