1a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam/* 2a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * Copyright (C) 2014 The Android Open Source Project 3a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * 4a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * Licensed under the Apache License, Version 2.0 (the "License"); 5a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * you may not use this file except in compliance with the License. 6a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * You may obtain a copy of the License at 7a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * 8a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * http://www.apache.org/licenses/LICENSE-2.0 9a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * 10a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * Unless required by applicable law or agreed to in writing, software 11a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * distributed under the License is distributed on an "AS IS" BASIS, 12a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * See the License for the specific language governing permissions and 14a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * limitations under the License. 15a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam */ 16b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 17b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "wifi_hal.h" 18b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 19b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#ifndef __WIFI_HAL_COMMON_H__ 20b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define __WIFI_HAL_COMMON_H__ 21b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 22a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#ifndef LOG_TAG 23b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define LOG_TAG "WifiHAL" 24a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#endif 25a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam 26a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <stdint.h> 27a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <fcntl.h> 28a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <sys/socket.h> 29a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <netlink/genl/genl.h> 30a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <netlink/genl/family.h> 31a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <netlink/genl/ctrl.h> 32a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <linux/rtnetlink.h> 33a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <netpacket/packet.h> 34a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <linux/filter.h> 35a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <linux/errqueue.h> 36a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam 37a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <linux/pkt_sched.h> 38a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <netlink/object-api.h> 39a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <netlink/netlink.h> 40a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <netlink/socket.h> 41a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <netlink-types.h> 42b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 43b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "nl80211_copy.h" 44b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 45a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <utils/Log.h> 46a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam 47b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define SOCKET_BUFFER_SIZE (32768U) 48b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define RECV_BUF_SIZE (4096) 49b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define DEFAULT_EVENT_CB_SIZE (64) 50b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define DEFAULT_CMD_SIZE (64) 51b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 52b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndetypedef void (*wifi_internal_event_handler) (wifi_handle handle, int events); 53b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 54b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeclass WifiCommand; 55b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 56b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndetypedef struct { 57b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int nl_cmd; 58b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde uint32_t vendor_id; 59b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int vendor_subcmd; 60b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde nl_recvmsg_msg_cb_t cb_func; 61b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde void *cb_arg; 62b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} cb_info; 63b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 64b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndetypedef struct { 65b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde wifi_request_id id; 66b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde WifiCommand *cmd; 67b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} cmd_info; 68b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 69b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndetypedef struct { 70b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde wifi_handle handle; // handle to wifi data 71b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde char name[8+1]; // interface name + trailing null 72b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int id; // id to use when talking to driver 73b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} interface_info; 74b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 75b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndetypedef struct { 76b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 77b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde struct nl_sock *cmd_sock; // command socket object 78b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde struct nl_sock *event_sock; // event socket object 79b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int nl80211_family_id; // family id for 80211 driver 80b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 81b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde bool in_event_loop; // Indicates that event loop is active 82b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde bool clean_up; // Indication to clean up the socket 83b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 84b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde wifi_internal_event_handler event_handler; // default event handler 85b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde wifi_cleaned_up_handler cleaned_up_handler; // socket cleaned up handler 86b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 87b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde cb_info *event_cb; // event callbacks 88b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int num_event_cb; // number of event callbacks 89b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int alloc_event_cb; // number of allocated callback objects 90b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 91b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde cmd_info *cmd; // Outstanding commands 92b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int num_cmd; // number of commands 93b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int alloc_cmd; // number of commands allocated 94b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 95b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde interface_info **interfaces; // array of interfaces 96b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int num_interfaces; // number of interfaces 97b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 98b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde // add other details 99b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde} hal_info; 100b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 101b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndewifi_error wifi_register_handler(wifi_handle handle, int cmd, nl_recvmsg_msg_cb_t func, void *arg); 102b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndewifi_error wifi_register_vendor_handler(wifi_handle handle, 103b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde uint32_t id, int subcmd, nl_recvmsg_msg_cb_t func, void *arg); 104b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 105b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndevoid wifi_unregister_handler(wifi_handle handle, int cmd); 106b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndevoid wifi_unregister_vendor_handler(wifi_handle handle, uint32_t id, int subcmd); 107b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 108b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndewifi_error wifi_register_cmd(wifi_handle handle, int id, WifiCommand *cmd); 109b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit DeshapndeWifiCommand *wifi_unregister_cmd(wifi_handle handle, int id); 110b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndevoid wifi_unregister_cmd(wifi_handle handle, WifiCommand *cmd); 111b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 112b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeinterface_info *getIfaceInfo(wifi_interface_handle); 113b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndewifi_handle getWifiHandle(wifi_interface_handle handle); 114b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndehal_info *getHalInfo(wifi_handle handle); 115b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndehal_info *getHalInfo(wifi_interface_handle handle); 116b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndewifi_handle getWifiHandle(hal_info *info); 117b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndewifi_interface_handle getIfaceHandle(interface_info *info); 118b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 119b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 120b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde// some common macros 121b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 122b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define min(x, y) ((x) < (y) ? (x) : (y)) 123b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define max(x, y) ((x) > (y) ? (x) : (y)) 124b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 125a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#ifdef __cplusplus 126a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamextern "C" 127a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{ 128a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#endif /* __cplusplus */ 129a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamvoid hexdump(char *bytes, u16 len); 130a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#ifdef __cplusplus 131a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam} 132a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#endif /* __cplusplus */ 133a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam 134b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#endif 135b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 136