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