3 #include <netlink/object-api.h>
4 #include <netlink/handlers.h>
9 interface_info
*getIfaceInfo(wifi_interface_handle handle
)
11 return (interface_info
*)handle
;
14 wifi_handle
getWifiHandle(wifi_interface_handle handle
)
16 return getIfaceInfo(handle
)->handle
;
19 hal_info
*getHalInfo(wifi_handle handle
)
21 return (hal_info
*)handle
;
24 hal_info
*getHalInfo(wifi_interface_handle handle
)
26 return getHalInfo(getWifiHandle(handle
));
29 wifi_handle
getWifiHandle(hal_info
*info
)
31 return (wifi_handle
)info
;
34 wifi_interface_handle
getIfaceHandle(interface_info
*info
)
36 return (wifi_interface_handle
)info
;
39 wifi_error
wifi_register_handler(wifi_handle handle
, int cmd
, nl_recvmsg_msg_cb_t func
, void *arg
)
41 hal_info
*info
= (hal_info
*)handle
;
43 /* TODO: check for multiple handlers? */
44 pthread_mutex_lock(&info
->cb_lock
);
46 wifi_error result
= WIFI_ERROR_OUT_OF_MEMORY
;
48 if (info
->num_event_cb
< info
->alloc_event_cb
) {
49 info
->event_cb
[info
->num_event_cb
].nl_cmd
= cmd
;
50 info
->event_cb
[info
->num_event_cb
].vendor_id
= 0;
51 info
->event_cb
[info
->num_event_cb
].vendor_subcmd
= 0;
52 info
->event_cb
[info
->num_event_cb
].cb_func
= func
;
53 info
->event_cb
[info
->num_event_cb
].cb_arg
= arg
;
54 ALOGI("Successfully added event handler %p:%p for command %d at %d",
55 arg
, func
, cmd
, info
->num_event_cb
);
57 result
= WIFI_SUCCESS
;
60 pthread_mutex_unlock(&info
->cb_lock
);
64 wifi_error
wifi_register_vendor_handler(wifi_handle handle
,
65 uint32_t id
, int subcmd
, nl_recvmsg_msg_cb_t func
, void *arg
)
67 hal_info
*info
= (hal_info
*)handle
;
69 //ALOGD("GSCAN register handle wifi_register_vendor_handler %p", handle);
70 /* TODO: check for multiple handlers? */
71 pthread_mutex_lock(&info
->cb_lock
);
72 ALOGI("Added event handler %p", info
);
74 wifi_error result
= WIFI_ERROR_OUT_OF_MEMORY
;
76 // ALOGD("register_vendor_handler: handle = %p", handle);
77 if (info
->num_event_cb
< info
->alloc_event_cb
) {
78 info
->event_cb
[info
->num_event_cb
].nl_cmd
= NL80211_CMD_VENDOR
;
79 info
->event_cb
[info
->num_event_cb
].vendor_id
= id
;
80 info
->event_cb
[info
->num_event_cb
].vendor_subcmd
= subcmd
;
81 info
->event_cb
[info
->num_event_cb
].cb_func
= func
;
82 info
->event_cb
[info
->num_event_cb
].cb_arg
= arg
;
83 ALOGI("Added event handler %p:%p for vendor 0x%0x and subcmd 0x%0x at %d",
84 arg
, func
, id
, subcmd
, info
->num_event_cb
);
86 result
= WIFI_SUCCESS
;
89 pthread_mutex_unlock(&info
->cb_lock
);
93 void wifi_unregister_handler(wifi_handle handle
, int cmd
)
95 hal_info
*info
= (hal_info
*)handle
;
97 if (cmd
== NL80211_CMD_VENDOR
) {
98 ALOGE("Must use wifi_unregister_vendor_handler to remove vendor handlers");
102 pthread_mutex_lock(&info
->cb_lock
);
104 for (int i
= 0; i
< info
->num_event_cb
; i
++) {
105 if (info
->event_cb
[i
].nl_cmd
== cmd
) {
106 ALOGI("Successfully removed event handler %p:%p for cmd = 0x%0x from %d",
107 info
->event_cb
[i
].cb_arg
, info
->event_cb
[i
].cb_func
, cmd
, i
);
109 memmove(&info
->event_cb
[i
], &info
->event_cb
[i
+1],
110 (info
->num_event_cb
- i
- 1) * sizeof(cb_info
));
111 info
->num_event_cb
--;
116 pthread_mutex_unlock(&info
->cb_lock
);
119 void wifi_unregister_vendor_handler(wifi_handle handle
, uint32_t id
, int subcmd
)
121 hal_info
*info
= (hal_info
*)handle
;
123 pthread_mutex_lock(&info
->cb_lock
);
125 for (int i
= 0; i
< info
->num_event_cb
; i
++) {
127 if (info
->event_cb
[i
].nl_cmd
== NL80211_CMD_VENDOR
128 && info
->event_cb
[i
].vendor_id
== id
129 && info
->event_cb
[i
].vendor_subcmd
== subcmd
) {
130 ALOGI("Successfully removed event handler %p:%p for vendor 0x%0x, subcmd 0x%0x from %d",
131 info
->event_cb
[i
].cb_arg
, info
->event_cb
[i
].cb_func
, id
, subcmd
, i
);
132 memmove(&info
->event_cb
[i
], &info
->event_cb
[i
+1],
133 (info
->num_event_cb
- i
- 1) * sizeof(cb_info
));
134 info
->num_event_cb
--;
139 pthread_mutex_unlock(&info
->cb_lock
);
143 wifi_error
wifi_register_cmd(wifi_handle handle
, int id
, WifiCommand
*cmd
)
145 hal_info
*info
= (hal_info
*)handle
;
147 ALOGD("registering command %d", id
);
149 wifi_error result
= WIFI_ERROR_OUT_OF_MEMORY
;
151 if (info
->num_cmd
< info
->alloc_cmd
) {
152 info
->cmd
[info
->num_cmd
].id
= id
;
153 info
->cmd
[info
->num_cmd
].cmd
= cmd
;
154 ALOGI("Successfully added command %d: %p at %d", id
, cmd
, info
->num_cmd
);
156 result
= WIFI_SUCCESS
;
162 WifiCommand
*wifi_unregister_cmd(wifi_handle handle
, int id
)
164 hal_info
*info
= (hal_info
*)handle
;
166 ALOGD("un-registering command %d", id
);
168 WifiCommand
*cmd
= NULL
;
170 for (int i
= 0; i
< info
->num_cmd
; i
++) {
171 if (info
->cmd
[i
].id
== id
) {
172 cmd
= info
->cmd
[i
].cmd
;
173 memmove(&info
->cmd
[i
], &info
->cmd
[i
+1], (info
->num_cmd
- i
) * sizeof(cmd_info
));
175 ALOGI("Successfully removed command %d: %p from %d", id
, cmd
, i
);
183 WifiCommand
*wifi_get_cmd(wifi_handle handle
, int id
)
185 hal_info
*info
= (hal_info
*)handle
;
187 WifiCommand
*cmd
= NULL
;
189 for (int i
= 0; i
< info
->num_cmd
; i
++) {
190 if (info
->cmd
[i
].id
== id
) {
191 cmd
= info
->cmd
[i
].cmd
;
199 void wifi_unregister_cmd(wifi_handle handle
, WifiCommand
*cmd
)
201 hal_info
*info
= (hal_info
*)handle
;
203 for (int i
= 0; i
< info
->num_cmd
; i
++) {
204 if (info
->cmd
[i
].cmd
== cmd
) {
205 int id
= info
->cmd
[i
].id
;
206 memmove(&info
->cmd
[i
], &info
->cmd
[i
+1], (info
->num_cmd
- i
) * sizeof(cmd_info
));
208 ALOGI("Successfully removed command %d: %p from %d", id
, cmd
, i
);