3 #include <linux/pkt_sched.h>
4 #include <netlink/object-api.h>
5 #include <netlink/handlers.h>
6 #include <linux/types.h>
11 interface_info
*getIfaceInfo(wifi_interface_handle handle
)
13 return (interface_info
*)handle
;
16 wifi_handle
getWifiHandle(wifi_interface_handle handle
)
18 return getIfaceInfo(handle
)->handle
;
21 hal_info
*getHalInfo(wifi_handle handle
)
23 return (hal_info
*)handle
;
26 hal_info
*getHalInfo(wifi_interface_handle handle
)
28 return getHalInfo(getWifiHandle(handle
));
31 wifi_handle
getWifiHandle(hal_info
*info
)
33 return (wifi_handle
)info
;
36 wifi_interface_handle
getIfaceHandle(interface_info
*info
)
38 return (wifi_interface_handle
)info
;
41 wifi_error
wifi_register_handler(wifi_handle handle
, int cmd
, nl_recvmsg_msg_cb_t func
, void *arg
)
43 hal_info
*info
= (hal_info
*)handle
;
45 /* TODO: check for multiple handlers? */
46 pthread_mutex_lock(&info
->cb_lock
);
48 wifi_error result
= WIFI_ERROR_OUT_OF_MEMORY
;
50 if (info
->num_event_cb
< info
->alloc_event_cb
) {
51 info
->event_cb
[info
->num_event_cb
].nl_cmd
= cmd
;
52 info
->event_cb
[info
->num_event_cb
].vendor_id
= 0;
53 info
->event_cb
[info
->num_event_cb
].vendor_subcmd
= 0;
54 info
->event_cb
[info
->num_event_cb
].cb_func
= func
;
55 info
->event_cb
[info
->num_event_cb
].cb_arg
= arg
;
56 ALOGI("Successfully added event handler %p:%p for command %d at %d",
57 arg
, func
, cmd
, info
->num_event_cb
);
59 result
= WIFI_SUCCESS
;
62 pthread_mutex_unlock(&info
->cb_lock
);
66 wifi_error
wifi_register_vendor_handler(wifi_handle handle
,
67 uint32_t id
, int subcmd
, nl_recvmsg_msg_cb_t func
, void *arg
)
69 hal_info
*info
= (hal_info
*)handle
;
71 //ALOGD("GSCAN register handle wifi_register_vendor_handler %p", handle);
72 /* TODO: check for multiple handlers? */
73 pthread_mutex_lock(&info
->cb_lock
);
74 ALOGI("Added event handler %p", info
);
76 wifi_error result
= WIFI_ERROR_OUT_OF_MEMORY
;
78 // ALOGD("register_vendor_handler: handle = %p", handle);
79 if (info
->num_event_cb
< info
->alloc_event_cb
) {
80 info
->event_cb
[info
->num_event_cb
].nl_cmd
= NL80211_CMD_VENDOR
;
81 info
->event_cb
[info
->num_event_cb
].vendor_id
= id
;
82 info
->event_cb
[info
->num_event_cb
].vendor_subcmd
= subcmd
;
83 info
->event_cb
[info
->num_event_cb
].cb_func
= func
;
84 info
->event_cb
[info
->num_event_cb
].cb_arg
= arg
;
85 ALOGI("Added event handler %p:%p for vendor 0x%0x and subcmd 0x%0x at %d",
86 arg
, func
, id
, subcmd
, info
->num_event_cb
);
88 result
= WIFI_SUCCESS
;
91 pthread_mutex_unlock(&info
->cb_lock
);
95 void wifi_unregister_handler(wifi_handle handle
, int cmd
)
97 hal_info
*info
= (hal_info
*)handle
;
99 if (cmd
== NL80211_CMD_VENDOR
) {
100 ALOGE("Must use wifi_unregister_vendor_handler to remove vendor handlers");
104 pthread_mutex_lock(&info
->cb_lock
);
106 for (int i
= 0; i
< info
->num_event_cb
; i
++) {
107 if (info
->event_cb
[i
].nl_cmd
== cmd
) {
108 ALOGI("Successfully removed event handler %p:%p for cmd = 0x%0x from %d",
109 info
->event_cb
[i
].cb_arg
, info
->event_cb
[i
].cb_func
, cmd
, i
);
111 memmove(&info
->event_cb
[i
], &info
->event_cb
[i
+1],
112 (info
->num_event_cb
- i
- 1) * sizeof(cb_info
));
113 info
->num_event_cb
--;
118 pthread_mutex_unlock(&info
->cb_lock
);
121 void wifi_unregister_vendor_handler(wifi_handle handle
, uint32_t id
, int subcmd
)
123 hal_info
*info
= (hal_info
*)handle
;
125 pthread_mutex_lock(&info
->cb_lock
);
127 for (int i
= 0; i
< info
->num_event_cb
; i
++) {
129 if (info
->event_cb
[i
].nl_cmd
== NL80211_CMD_VENDOR
130 && info
->event_cb
[i
].vendor_id
== id
131 && info
->event_cb
[i
].vendor_subcmd
== subcmd
) {
132 ALOGI("Successfully removed event handler %p:%p for vendor 0x%0x, subcmd 0x%0x from %d",
133 info
->event_cb
[i
].cb_arg
, info
->event_cb
[i
].cb_func
, id
, subcmd
, i
);
134 memmove(&info
->event_cb
[i
], &info
->event_cb
[i
+1],
135 (info
->num_event_cb
- i
- 1) * sizeof(cb_info
));
136 info
->num_event_cb
--;
141 pthread_mutex_unlock(&info
->cb_lock
);
145 wifi_error
wifi_register_cmd(wifi_handle handle
, int id
, WifiCommand
*cmd
)
147 hal_info
*info
= (hal_info
*)handle
;
149 ALOGD("registering command %d", id
);
151 wifi_error result
= WIFI_ERROR_OUT_OF_MEMORY
;
153 if (info
->num_cmd
< info
->alloc_cmd
) {
154 info
->cmd
[info
->num_cmd
].id
= id
;
155 info
->cmd
[info
->num_cmd
].cmd
= cmd
;
156 ALOGI("Successfully added command %d: %p at %d", id
, cmd
, info
->num_cmd
);
158 result
= WIFI_SUCCESS
;
164 WifiCommand
*wifi_unregister_cmd(wifi_handle handle
, int id
)
166 hal_info
*info
= (hal_info
*)handle
;
168 ALOGD("un-registering command %d", id
);
170 WifiCommand
*cmd
= NULL
;
172 for (int i
= 0; i
< info
->num_cmd
; i
++) {
173 if (info
->cmd
[i
].id
== id
) {
174 cmd
= info
->cmd
[i
].cmd
;
175 memmove(&info
->cmd
[i
], &info
->cmd
[i
+1], (info
->num_cmd
- i
) * sizeof(cmd_info
));
177 ALOGI("Successfully removed command %d: %p from %d", id
, cmd
, i
);
185 WifiCommand
*wifi_get_cmd(wifi_handle handle
, int id
)
187 hal_info
*info
= (hal_info
*)handle
;
189 WifiCommand
*cmd
= NULL
;
191 for (int i
= 0; i
< info
->num_cmd
; i
++) {
192 if (info
->cmd
[i
].id
== id
) {
193 cmd
= info
->cmd
[i
].cmd
;
201 void wifi_unregister_cmd(wifi_handle handle
, WifiCommand
*cmd
)
203 hal_info
*info
= (hal_info
*)handle
;
205 for (int i
= 0; i
< info
->num_cmd
; i
++) {
206 if (info
->cmd
[i
].cmd
== cmd
) {
207 int id
= info
->cmd
[i
].id
;
208 memmove(&info
->cmd
[i
], &info
->cmd
[i
+1], (info
->num_cmd
- i
) * sizeof(cmd_info
));
210 ALOGI("Successfully removed command %d: %p from %d", id
, cmd
, i
);