Add support for wifi dongle
[platform/core/connectivity/net-config.git] / src / wifi.c
1 /*
2  * Network Configuration Module
3  *
4  * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23 #include <vconf.h>
24 #include <vconf-keys.h>
25 #include <sys/stat.h>
26 #include <fcntl.h>
27
28 #include "log.h"
29 #include "wifi.h"
30 #include "util.h"
31 #include "netdbus.h"
32 #include "neterror.h"
33 #include "wifi-eap.h"
34 #include "wifi-wps.h"
35 #include "wifi-bssid-scan.h"
36 #include "wifi-netlink-scan.h"
37 #include "wifi-power.h"
38 #include "wifi-state.h"
39 #include "wifi-agent.h"
40 #include "wifi-firmware.h"
41 #include "wifi-passpoint.h"
42 #include "wifi-eap-config.h"
43 #include "wifi-background-scan.h"
44 #include "ip-conflict-detect.h"
45 #include "wifi-config.h"
46 #include "wifi-tdls.h"
47 #include "wifi-key-encryption.h"
48 #include "wifi-extension.h"
49 #include "wifi-dpp.h"
50
51 #define SPRD_CP2_FIRMWARE_PATH "/hal/bin/cp2-downloader"
52 #define SPRD_CP2_FIRMWARE_STATE_PATH "/tmp/.wifi-firmware-loaded"
53 #define WIFI_SYSTEMD_SERVICE_PATH "/usr/lib/systemd/system/wifi-ready.service"
54 static int is_wifi_firmware_downloaded = FALSE;
55
56 static Wifi *wifi_object = NULL;
57 static NetConnmanAgent *connman_agent_object = NULL;
58 static WifiFirmware *wififirmware_object = NULL;
59 static char *wifi_def_mac = NULL;
60
61 Wifi *get_wifi_object(void){
62         return wifi_object;
63 }
64
65 static gboolean handle_check_black_list(Wifi *wifi, GDBusMethodInvocation *context,
66                 const gchar *name, const gchar *security_type, const gchar *eap)
67 {
68         ERR("Name (%s)", name);
69         INFO("disable to check");
70         wifi_complete_check_black_list(wifi, context, TRUE);
71         return TRUE;
72 }
73
74 static void _set_wifi_mac_address(void)
75 {
76         gchar *mac_addr = NULL;
77
78         mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS);
79         if (mac_addr == NULL || strlen(mac_addr) == 0) {
80                 if (wifi_def_mac)
81                         netconfig_set_mac_address_to_vconf(wifi_def_mac);
82                 else
83                         netconfig_set_mac_address_from_file();
84         }
85
86         g_free(mac_addr);
87 }
88
89 void wifi_set_default_mac(char *def_mac)
90 {
91         if (!def_mac)
92                 return;
93
94         if (wifi_def_mac)
95                 g_free(wifi_def_mac);
96
97         wifi_def_mac = def_mac;
98 }
99
100 int wifi_check_systemd_service(void)
101 {
102         if (access(WIFI_SYSTEMD_SERVICE_PATH, F_OK ) != -1 )
103                 return 1;
104         else
105                 return 0;
106 }
107
108 int wifi_check_interface(const char *ifname)
109 {
110         char path[WIFI_MAC_PATH_LENGTH];
111
112         snprintf(path, WIFI_MAC_PATH_LENGTH, WIFI_MAC_ADDR_PATH, ifname);
113
114         if (access(path, F_OK ) != -1 )
115                 return 1;
116         else
117                 return 0;
118 }
119
120 void __netconfig_wifi_connect_reply(GObject *source_object, GAsyncResult *res,
121                 gpointer user_data)
122 {
123         GDBusConnection *conn = NULL;
124         GError *error = NULL;
125         GVariant *params = NULL;
126         char *interface_name = user_data;
127
128         DBG("WiFi Connection Reply");
129
130         conn = G_DBUS_CONNECTION(source_object);
131         g_dbus_connection_call_finish(conn, res, &error);
132         if (error != NULL) {
133                 ERR("WiFi Connection Error [%s]", error->message);
134                 /* No need to emit WiFiConnectFail signal if Connection is
135                  * in progress */
136                 if (error->code == G_IO_ERROR_TIMED_OUT) {
137                         g_error_free(error);
138                         DBG("WiFi Connection in Progress");
139                         netconfig_gdbus_pending_call_unref();
140                         g_free(interface_name);
141                         return;
142                 }
143                 g_error_free(error);
144
145                 params = g_variant_new("(s)", interface_name);
146                 if (netconfig_dbus_emit_signal(NULL, NETCONFIG_WIFI_PATH,
147                                 NETCONFIG_WIFI_INTERFACE, "WiFiConnectFail",
148                                 params) == FALSE)
149                         ERR("Failed to emit WiFiConnectFail signal");
150                 else
151                         DBG("Successfully sent WiFiConnectFail signal");
152         } else
153                 DBG("WiFi Connection has been initiated successfully");
154
155         netconfig_gdbus_pending_call_unref();
156         g_free(interface_name);
157         return;
158 }
159
160 static void _update_wifi_firmware_state(void)
161 {
162         int fd;
163         mode_t mode = S_IRGRP | S_IWUSR | S_IXGRP;
164
165         fd = creat(SPRD_CP2_FIRMWARE_STATE_PATH, mode);
166         if (fd >= 0)
167                 close(fd);
168         else
169                 DBG("Failed to create wifi firmware state file");
170
171         is_wifi_firmware_downloaded = TRUE;
172 }
173
174 static int _get_wifi_firmware_state(void)
175 {
176         if (!is_wifi_firmware_downloaded
177                         && access(SPRD_CP2_FIRMWARE_STATE_PATH, F_OK) != 0)
178                 is_wifi_firmware_downloaded = FALSE;
179         else
180                 is_wifi_firmware_downloaded = TRUE;
181         return is_wifi_firmware_downloaded;
182 }
183
184 int wifi_firmware_download(void)
185 {
186         int rv = 0;
187         const char *path = SPRD_CP2_FIRMWARE_PATH;
188         char *const args[] = { SPRD_CP2_FIRMWARE_PATH, NULL };
189         char *const envs[] = { NULL };
190
191         if (!_get_wifi_firmware_state()) {
192                 rv = netconfig_execute_file(path, args, envs);
193                 if (rv < 0) {
194                         DBG("wifi firmware download fails");
195                         return -EIO;
196                 }
197                 _update_wifi_firmware_state();
198                 DBG("wifi firmware download successes");
199         }
200
201         return 0;
202 }
203
204 void wifi_object_create_and_init(void)
205 {
206         DBG("Create wifi object.");
207         GDBusInterfaceSkeleton *interface_wifi = NULL;
208         GDBusInterfaceSkeleton *interface_connman_agent = NULL;
209         GDBusInterfaceSkeleton *interface_wifi_firmware = NULL;
210         GDBusConnection *connection = NULL;
211         GDBusObjectManagerServer *server = netdbus_get_wifi_manager();
212         if (server == NULL)
213                 return;
214
215         connection = netdbus_get_connection();
216         g_dbus_object_manager_server_set_connection(server, connection);
217
218         /*Interface netconfig.wifi*/
219         wifi_object = wifi_skeleton_new();
220         interface_wifi = G_DBUS_INTERFACE_SKELETON(wifi_object);
221
222         /* WIFI power */
223         g_signal_connect(wifi_object, "handle-load-driver",
224                         G_CALLBACK(handle_load_driver), NULL);
225         g_signal_connect(wifi_object, "handle-remove-driver",
226                         G_CALLBACK(handle_remove_driver), NULL);
227         g_signal_connect(wifi_object, "handle-load-p2p-driver",
228                                 G_CALLBACK(handle_load_p2p_driver), NULL);
229         g_signal_connect(wifi_object, "handle-remove-p2p-driver",
230                         G_CALLBACK(handle_remove_p2p_driver), NULL);
231
232         /* WIFI scan */
233         g_signal_connect(wifi_object, "handle-request-bssid-scan",
234                         G_CALLBACK(handle_request_bssid_scan), NULL);
235         g_signal_connect(wifi_object, "handle-get-bssid-list",
236                         G_CALLBACK(handle_get_bssid_list), NULL);
237         g_signal_connect(wifi_object, "handle-netlink-scan",
238                         G_CALLBACK(handle_netlink_scan), NULL);
239
240         /* WPS Connect */
241         g_signal_connect(wifi_object, "handle-request-wps-connect",
242                         G_CALLBACK(handle_request_wps_connect), NULL);
243         g_signal_connect(wifi_object, "handle-request-wps-cancel",
244                         G_CALLBACK(handle_request_wps_cancel), NULL);
245
246         /* WIFI direct */
247         g_signal_connect(wifi_object, "handle-launch-direct",
248                         G_CALLBACK(handle_launch_direct), NULL);
249
250         /* EAP config */
251         g_signal_connect(wifi_object, "handle-create-eap-config",
252                         G_CALLBACK(handle_create_eap_config), NULL);
253         g_signal_connect(wifi_object, "handle-delete-eap-config",
254                         G_CALLBACK(handle_delete_eap_config), NULL);
255
256         /* VSIE methods */
257         g_signal_connect(wifi_object, "handle-add-vsie",
258                         G_CALLBACK(handle_add_vsie), NULL);
259         g_signal_connect(wifi_object, "handle-get-vsie",
260                         G_CALLBACK(handle_get_vsie), NULL);
261         g_signal_connect(wifi_object, "handle-remove-vsie",
262                         G_CALLBACK(handle_remove_vsie), NULL);
263
264         /* IP conflict methods */
265         g_signal_connect(wifi_object, "handle-ip-conflict-set-enable",
266                         G_CALLBACK(handle_ip_conflict_set_enable), NULL);
267         g_signal_connect(wifi_object, "handle-is-ip-conflict-detect-enabled",
268                         G_CALLBACK(handle_is_ip_conflict_detect_enabled), NULL);
269         g_signal_connect(wifi_object, "handle-set-ip-conflict-period",
270                         G_CALLBACK(handle_set_ip_conflict_period), NULL);
271         g_signal_connect(wifi_object, "handle-get-ip-conflict-state",
272                         G_CALLBACK(handle_get_ip_conflict_state), NULL);
273         g_signal_connect(wifi_object, "handle-get-ip-conflict-period",
274                         G_CALLBACK(handle_get_ip_conflict_period), NULL);
275
276         /* WIFI configuration */
277         g_signal_connect(wifi_object, "handle-save-configuration",
278                         G_CALLBACK(handle_save_configuration), NULL);
279         g_signal_connect(wifi_object, "handle-remove-configuration",
280                         G_CALLBACK(handle_remove_configuration), NULL);
281         g_signal_connect(wifi_object, "handle-get-config-ids",
282                         G_CALLBACK(handle_get_config_ids), NULL);
283         g_signal_connect(wifi_object, "handle-load-configuration",
284                         G_CALLBACK(handle_load_configuration), NULL);
285         g_signal_connect(wifi_object, "handle-set-config-field",
286                         G_CALLBACK(handle_set_config_field), NULL);
287         g_signal_connect(wifi_object, "handle-get-config-passphrase",
288                         G_CALLBACK(handle_get_config_passphrase), NULL);
289
290         /* WIFI EAP configuration */
291         g_signal_connect(wifi_object, "handle-save-eap-configuration",
292                         G_CALLBACK(handle_save_eap_configuration), NULL);
293         g_signal_connect(wifi_object, "handle-load-eap-configuration",
294                         G_CALLBACK(handle_load_eap_configuration), NULL);
295
296         /* BG scan mode */
297         g_signal_connect(wifi_object, "handle-set-bgscan",
298                         G_CALLBACK(handle_set_bgscan), NULL);
299         g_signal_connect(wifi_object, "handle-resume-bgscan",
300                         G_CALLBACK(handle_resume_bgscan), NULL);
301         g_signal_connect(wifi_object, "handle-pause-bgscan",
302                         G_CALLBACK(handle_pause_bgscan), NULL);
303         g_signal_connect(wifi_object, "handle-reset-bgscan-interval",
304                         G_CALLBACK(handle_reset_bgscan_interval), NULL);
305
306         /* Auto Scan Mode */
307         g_signal_connect(wifi_object, "handle-get-autoscan",
308                         G_CALLBACK(handle_get_autoscan), NULL);
309         g_signal_connect(wifi_object, "handle-get-autoscanmode",
310                         G_CALLBACK(handle_get_autoscanmode), NULL);
311
312         /* Extension API methods */
313         g_signal_connect(wifi_object, "handle-flush-bss",
314                         G_CALLBACK(handle_flush_bss), NULL);
315
316         /* Passpoint */
317         g_signal_connect(wifi_object, "handle-set-passpoint",
318                                 G_CALLBACK(handle_set_passpoint), NULL);
319         g_signal_connect(wifi_object, "handle-get-passpoint",
320                                         G_CALLBACK(handle_get_passpoint), NULL);
321
322         /* EAP authentication */
323         g_signal_connect(wifi_object, "handle-get-aka-auth",
324                                 G_CALLBACK(handle_get_aka_auth), NULL);
325         g_signal_connect(wifi_object, "handle-get-sim-auth",
326                                 G_CALLBACK(handle_get_sim_auth), NULL);
327         g_signal_connect(wifi_object, "handle-get-sim-imsi",
328                                 G_CALLBACK(handle_get_sim_imsi), NULL);
329         g_signal_connect(wifi_object, "handle-req-aka-auth",
330                         G_CALLBACK(handle_req_aka_auth), NULL);
331         g_signal_connect(wifi_object, "handle-req-sim-auth",
332                         G_CALLBACK(handle_req_sim_auth), NULL);
333
334         /* WIFI MDM blacklist */
335         g_signal_connect(wifi_object, "handle-check-black-list",
336                         G_CALLBACK(handle_check_black_list), NULL);
337
338         /* TDLS methods */
339         g_signal_connect(wifi_object, "handle-tdls-disconnect",
340                         G_CALLBACK(handle_tdls_disconnect), NULL);
341         g_signal_connect(wifi_object, "handle-tdls-connected-peer",
342                         G_CALLBACK(handle_tdls_connected_peer), NULL);
343         g_signal_connect(wifi_object, "handle-tdls-discover",
344                         G_CALLBACK(handle_tdls_discover), NULL);
345         g_signal_connect(wifi_object, "handle-tdls-connect",
346                         G_CALLBACK(handle_tdls_connect), NULL);
347         g_signal_connect(wifi_object, "handle-tdls-channel-switch",
348                         G_CALLBACK(handle_tdls_channel_switch), NULL);
349         g_signal_connect(wifi_object, "handle-tdls-cancel-channel-switch",
350                         G_CALLBACK(handle_tdls_cancel_channel_switch), NULL);
351
352         /* Passphrase Encryption */
353         g_signal_connect(wifi_object, "handle-encrypt-passphrase",
354                         G_CALLBACK(handle_encrypt_passphrase), NULL);
355         g_signal_connect(wifi_object, "handle-decrypt-passphrase",
356                         G_CALLBACK(handle_decrypt_passphrase), NULL);
357         g_signal_connect(wifi_object, "handle-decrypt-conf-obj",
358                         G_CALLBACK(handle_decrypt_conf_obj), NULL);
359
360         /* DPP */
361         g_signal_connect(wifi_object, "handle-dpp-enter-peer-uri",
362                         G_CALLBACK(handle_dpp_enter_peer_uri), NULL);
363         g_signal_connect(wifi_object, "handle-dpp-generate-uri",
364                         G_CALLBACK(handle_dpp_generate_uri), NULL);
365         g_signal_connect(wifi_object, "handle-dpp-start-configurator-initiator",
366                         G_CALLBACK(handle_dpp_start_configurator_initiator), NULL);
367         g_signal_connect(wifi_object, "handle-dpp-start-enrollee-initiator",
368                         G_CALLBACK(handle_dpp_start_enrollee_initiator), NULL);
369         g_signal_connect(wifi_object, "handle-dpp-start-configurator-responder",
370                         G_CALLBACK(handle_dpp_start_configurator_responder), NULL);
371         g_signal_connect(wifi_object, "handle-dpp-start-enrollee-responder",
372                         G_CALLBACK(handle_dpp_start_enrollee_responder), NULL);
373         g_signal_connect(wifi_object, "handle-dpp-stop",
374                         G_CALLBACK(handle_dpp_stop), NULL);
375
376         if (!g_dbus_interface_skeleton_export(interface_wifi, connection,
377                         NETCONFIG_WIFI_PATH, NULL)) {
378                 ERR("Export WIFI_PATH for wifi failed");
379         }
380
381         /* Interface connman.Agent */
382         connman_agent_object = net_connman_agent_skeleton_new();
383
384         interface_connman_agent = G_DBUS_INTERFACE_SKELETON(connman_agent_object);
385         g_signal_connect(connman_agent_object, "handle-report-error",
386                         G_CALLBACK(handle_report_error), NULL);
387         g_signal_connect(connman_agent_object, "handle-request-browser",
388                         G_CALLBACK(handle_request_browser), NULL);
389         g_signal_connect(connman_agent_object, "handle-request-input",
390                         G_CALLBACK(handle_request_input), NULL);
391         g_signal_connect(connman_agent_object, "handle-set-field",
392                         G_CALLBACK(handle_set_field), NULL);
393
394         if (!g_dbus_interface_skeleton_export(interface_connman_agent, connection,
395                         NETCONFIG_WIFI_PATH, NULL)) {
396                 ERR("Export WIFI_PATH for agent failed");
397         }
398
399         /*Interface netconfig.wifi.Firmware*/
400         wififirmware_object = wifi_firmware_skeleton_new();
401
402         interface_wifi_firmware = G_DBUS_INTERFACE_SKELETON(wififirmware_object);
403         g_signal_connect(wififirmware_object, "handle-start",
404                         G_CALLBACK(handle_start), NULL);
405         g_signal_connect(wififirmware_object, "handle-stop",
406                                 G_CALLBACK(handle_stop), NULL);
407
408         if (!g_dbus_interface_skeleton_export(interface_wifi_firmware, connection,
409                         NETCONFIG_WIFI_PATH, NULL)) {
410                 ERR("Export WIFI_PATH for firmware failed");
411         }
412
413         _set_wifi_mac_address();
414
415         wifi_state_initialize();
416         wifi_power_initialize();
417
418         return;
419 }
420
421 void wifi_object_deinit(void)
422 {
423         g_object_unref(wifi_object);
424         g_object_unref(connman_agent_object);
425         g_object_unref(wififirmware_object);
426
427         wifi_power_deinitialize();
428         wifi_state_deinitialize();
429
430         g_free(wifi_def_mac);
431 }