2 * Network Configuration Module
4 * Copyright (c) 2019 Samsung Electronics Co., Ltd. All rights reserved.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
23 #include <vconf-keys.h>
28 #include "netsupplicant.h"
30 #include "wifi-config.h"
32 #include "wifi-key-encryption.h"
34 #define DEFAULT_BOOTSTRAP_TYPE "qrcode"
35 #define DEFAULT_DPP_CHANNEL "81/6"
36 #define DEFAULT_DPP_FREQ 2437
38 #define DEFAULT_DPP_CONFIG_PROCESSING_TYPE "0"
42 #define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
43 #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
54 WIFI_DPP_STATE_AWAITING,
55 WIFI_DPP_STATE_PEER_QR_REQUESTED,
56 WIFI_DPP_STATE_BOOTSTRAPPED,
57 WIFI_DPP_STATE_AUTHENTICATING,
58 WIFI_DPP_STATE_AUTHENTICATED,
59 WIFI_DPP_STATE_CONFIGURED,
60 WIFI_DPP_STATE_CONNECTING,
61 WIFI_DPP_STATE_CONNECTED,
70 gchar *net_access_key;
76 guint32 configurator_id;
77 gboolean is_initiator;
78 wifi_dpp_state_e state;
81 gboolean g_in_progress = FALSE;
82 static GSList *dpp_info_list = NULL;
84 static wifi_dpp_s *_get_dpp_info(guint32 peer_id, guint32 own_id)
86 wifi_dpp_s *ret = NULL;
89 for (list = dpp_info_list; list; list = list->next) {
91 if (ret->own_id == own_id && ret->peer_id == peer_id)
98 static wifi_dpp_s *_get_dpp_in_progress()
100 wifi_dpp_s *ret = NULL;
103 for (list = dpp_info_list; list; list = list->next) {
105 if (ret->state > WIFI_DPP_STATE_NONE)
112 static wifi_dpp_s *__create_dpp_info(gboolean is_initiator)
114 wifi_dpp_s *ret = g_try_malloc0(sizeof(wifi_dpp_s));
116 ret->is_initiator = is_initiator;
121 static void __add_to_dpp_info_list(wifi_dpp_s * p_dpp)
123 dpp_info_list = g_slist_prepend(dpp_info_list, p_dpp);
126 static void __remove_from_dpp_info_list(wifi_dpp_s * p_dpp)
128 dpp_info_list = g_slist_remove(dpp_info_list, p_dpp);
131 static void __destroy_dpp_info(wifi_dpp_s *p_dpp)
137 static void __free_critical(char *critical)
143 length = strlen(critical);
144 memset((void *)critical, 0x0, length);
148 static void __netconfig_wifi_notify_dpp_uri_generated(guint32 own_id, const gchar *own_uri)
150 GVariantBuilder *builder = NULL;
152 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
153 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(own_id));
154 g_variant_builder_add(builder, "{sv}", "own_uri", g_variant_new_string(own_uri));
156 wifi_emit_dpp_uri_generated((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
157 g_variant_builder_unref(builder);
162 static void __netconfig_wifi_notify_dpp_bootstrapped(guint32 peer_id)
164 GVariantBuilder *builder = NULL;
166 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
167 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(peer_id));
169 wifi_emit_dpp_bootstrapped((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
170 g_variant_builder_unref(builder);
175 static void __netconfig_wifi_notify_dpp_awaiting(guint32 own_id)
177 GVariantBuilder *builder = NULL;
179 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
180 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(own_id));
182 wifi_emit_dpp_awaiting((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
183 g_variant_builder_unref(builder);
188 static void __netconfig_wifi_notify_dpp_authenticating(guint32 peer_id, guint32 own_id)
190 GVariantBuilder *builder = NULL;
192 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
193 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(peer_id));
194 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(own_id));
196 wifi_emit_dpp_authenticating((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
197 g_variant_builder_unref(builder);
202 static void __netconfig_wifi_notify_dpp_failed()
204 wifi_emit_dpp_failed((Wifi *)get_wifi_object());
209 static void __netconfig_wifi_notify_dpp_removed(guint32 peer_id, guint32 own_id)
211 GVariantBuilder *builder = NULL;
213 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
214 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(peer_id));
215 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(own_id));
217 wifi_emit_dpp_removed((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
218 g_variant_builder_unref(builder);
223 static char *__netconfig_dpp_get_supplicant_interface()
225 char *if_path = NULL;
227 if_path = netconfig_wifi_get_supplicant_p2p_interface();
231 if_path = netconfig_wifi_get_supplicant_interface();
236 static gboolean __netconfig_wifi_invoke_dpp_set_dpp_config_processing()
238 char *if_path = NULL;
239 GVariant *message = NULL;
240 GVariant *params = NULL;
242 DBG("[TizenMW-->WPAS]: DPP Set config processing Request: ");
244 if_path = __netconfig_dpp_get_supplicant_interface();
245 if (if_path == NULL) {
246 ERR("Fail to get wpa_supplicant DBus interface path");
250 params = g_variant_new("(ssv)", SUPPLICANT_INTERFACE ".Interface",
251 "DppConfigProcessing", g_variant_new_string(DEFAULT_DPP_CONFIG_PROCESSING_TYPE));
253 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
254 if_path, DBUS_INTERFACE_PROPERTIES, "Set", params);
256 if (message == NULL) {
257 ERR(" DPP : Failed to set DPP config processing !!!");
261 g_variant_unref(message);
265 static gboolean __netconfig_wifi_invoke_dpp_qr_code(const char *peer_uri, guint32 *peer_id)
267 char *if_path = NULL;
268 GVariant *message = NULL;
269 GVariant *params = NULL;
271 DBG("[TizenMW-->WPAS]: DPP QrCode Request: ");
273 if_path = __netconfig_dpp_get_supplicant_interface();
274 if (if_path == NULL) {
275 ERR("Fail to get wpa_supplicant DBus interface path");
279 params = g_variant_new("(s)", peer_uri);
280 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
281 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "QrCode", params);
283 if (message == NULL) {
284 ERR(" DPP : Failed to set peer URI !!!");
288 g_variant_get(message, "(u)", peer_id);
289 INFO("DPP reply: [%u]", *peer_id);
291 g_variant_unref(message);
294 #define DEBUG_G_VARIANT(str, parameters)\
296 gchar *parameters_debug_str = NULL;\
298 parameters_debug_str = g_variant_print(parameters, TRUE);\
299 DBG("%s[%s]", str, parameters_debug_str ? parameters_debug_str : "NULL");\
300 g_free(parameters_debug_str);\
304 static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
306 GVariantIter *iter = NULL;
309 if (!dst || !src || size == 0) {
310 DBG("Invalid parameter");
313 g_variant_get(src, "ay", &iter);
315 DBG("failed to get iterator");
319 while (g_variant_iter_loop(iter, "y", &dst[length])) {
324 g_variant_iter_free(iter);
329 static gchar *__netconfig_get_p2p_address(const char *if_path)
331 GVariant *params = NULL;
332 GVariant *message = NULL;
333 GVariant *temp1 = NULL;
334 GVariant *temp2 = NULL;
335 guchar p2p_addr[MACADDR_LEN] = {0,};
336 gchar address_str[MACSTR_LEN] = {0,};
338 params = g_variant_new("(ss)", SUPPLICANT_INTERFACE ".Interface", "P2PAddress");
340 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
342 DBUS_INTERFACE_PROPERTIES,
346 if (message == NULL) {
347 ERR("netconfig_supplicant_invoke_dbus_method() failed.");
350 DEBUG_G_VARIANT("reply:", message);
352 temp1 = g_variant_get_child_value(message, 0);
353 temp2 = g_variant_get_child_value(temp1, 0);
354 DEBUG_G_VARIANT("temp2:", temp2);
355 __ws_unpack_ay(p2p_addr, temp2, MACADDR_LEN);
356 g_variant_unref(temp1);
357 g_variant_unref(temp2);
359 g_snprintf(address_str, MACSTR_LEN, MACSTR, MAC2STR(p2p_addr));
361 DBG("P2P address %s", address_str);
363 return g_strdup(address_str);
366 static gboolean __netconfig_wifi_invoke_dpp_add_bootstrap(const char *key, guint32 *id)
368 char *if_path = NULL;
369 GVariantBuilder *builder = NULL;
370 GVariant *params = NULL;
371 GVariant *message = NULL;
372 gchar *current_mac_addr = NULL;
374 DBG("[TizenMW-->WPAS]: DPP AddBootstrap Request: ");
376 if_path = __netconfig_dpp_get_supplicant_interface();
377 if (if_path == NULL) {
378 ERR("Fail to get wpa_supplicant DBus interface path");
381 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
382 g_variant_builder_add(builder, "{sv}", "type", g_variant_new_string("qrcode"));
383 g_variant_builder_add(builder, "{sv}", "channels", g_variant_new_string(DEFAULT_DPP_CHANNEL));
384 /* TODO: find more comfortable way */
385 current_mac_addr = __netconfig_get_p2p_address(if_path);
386 if (current_mac_addr)
387 g_variant_builder_add(builder, "{sv}", "mac", g_variant_new_string(current_mac_addr));
389 g_variant_builder_add(builder, "{sv}", "key", g_variant_new_string(key));
390 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
391 g_variant_builder_unref(builder);
393 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
394 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "AddBootstrap", params);
396 g_free(current_mac_addr);
397 if (message == NULL) {
398 ERR(" DPP : Failed to add bootstrap !!!");
402 g_variant_get(message, "(u)", id);
403 INFO("DPP reply: [%u]", *id);
405 g_variant_unref(message);
409 static gboolean __netconfig_wifi_invoke_dpp_get_bootstrap_uri(guint32 id, gchar **uri)
411 char *if_path = NULL;
412 GVariant *message = NULL;
413 GVariant *params = NULL;
420 DBG("[TizenMW-->WPAS]: DPP GetBootstrapUri Request: ");
422 if_path = __netconfig_dpp_get_supplicant_interface();
423 if (if_path == NULL) {
424 ERR("Fail to get wpa_supplicant DBus interface path");
428 params = g_variant_new("(u)", id);
429 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
430 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "GetBootstrapUri", params);
432 if (message == NULL) {
433 ERR(" DPP : Failed to get URI !!!");
437 g_variant_get(message, "(s)", uri);
438 INFO("DPP reply: [%s]", *uri);
440 g_variant_unref(message);
444 static gboolean __netconfig_wifi_invoke_dpp_add_configurator(const char *key, guint32 *id)
446 char *if_path = NULL;
447 GVariantBuilder *builder = NULL;
448 GVariant *params = NULL;
449 GVariant *message = NULL;
451 DBG("[TizenMW-->WPAS]: DPP AddConfigurator Request: ");
453 if_path = __netconfig_dpp_get_supplicant_interface();
454 if (if_path == NULL) {
455 ERR("Fail to get wpa_supplicant DBus interface path");
458 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
460 g_variant_builder_add(builder, "{sv}", "key", g_variant_new_string(key));
461 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
462 g_variant_builder_unref(builder);
464 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
465 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "AddConfigurator", params);
467 if (message == NULL) {
468 ERR(" DPP : Failed to add configurator !!!");
472 g_variant_get(message, "(u)", id);
473 INFO("DPP reply: [%u]", *id);
475 g_variant_unref(message);
479 static gchar *__generate_configurator_params(guint32 configurator_id, const char *ssid,
480 const char *net_role, const char *akm, const char *pass)
482 gchar ssid_hex[65] = {0,};
483 gchar pass_hex[129] = {0,};
486 gchar *conf_str = NULL;
488 netconfig_convert_bytes_to_hexstr(ssid, strlen(ssid), ssid_hex);
489 conf_str = g_strdup_printf(" ssid=%s conf=%s-%s", ssid_hex, net_role, akm);
492 netconfig_convert_bytes_to_hexstr(pass, strlen(pass), pass_hex);
493 ret = g_strdup_printf("%s pass=%s", conf_str, pass_hex);
495 ret = g_strdup_printf(" configurator=%u%s", configurator_id, conf_str);
502 static gboolean __netconfig_wifi_invoke_dpp_set_configurator_params(guint configurator_id,
503 const char *ssid, const char *net_role, const char *akm, const char *pass)
505 char *if_path = NULL;
506 GVariant *message = NULL;
507 GVariant *params = NULL;
508 gchar *configurator_param_str = NULL;
510 DBG("[TizenMW-->WPAS]: DPP Set configurator params Request: ");
512 if_path = __netconfig_dpp_get_supplicant_interface();
513 if (if_path == NULL) {
514 ERR("Fail to get wpa_supplicant DBus interface path");
518 configurator_param_str = __generate_configurator_params(
519 configurator_id, ssid, net_role, akm, pass);
520 if (!configurator_param_str) {
521 ERR(" DPP : Failed to gen conf params");
525 params = g_variant_new("(ssv)", SUPPLICANT_INTERFACE ".Interface",
526 "DPPConfiguratorParams", g_variant_new_string(configurator_param_str));
528 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
529 if_path, DBUS_INTERFACE_PROPERTIES, "Set", params);
531 g_free(configurator_param_str);
532 if (message == NULL) {
533 ERR(" DPP : Failed to set configurator params !!!");
537 g_variant_unref(message);
541 static gboolean __netconfig_wifi_invoke_dpp_listen(guint32 freq, const gchar *dev_role)
543 char *if_path = NULL;
544 GVariantBuilder *builder = NULL;
545 GVariant *params = NULL;
546 GVariant *message = NULL;
548 DBG("[TizenMW-->WPAS]: DPP Listen Request: ");
550 if_path = __netconfig_dpp_get_supplicant_interface();
551 if (if_path == NULL) {
552 ERR("Fail to get wpa_supplicant DBus interface path");
555 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
556 g_variant_builder_add(builder, "{sv}", "freq", g_variant_new_uint32(freq));
557 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_string(dev_role));
558 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
559 g_variant_builder_unref(builder);
561 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
562 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "Listen", params);
564 if (message == NULL) {
565 ERR(" DPP : Failed to start DPP listen !!!");
569 g_variant_unref(message);
573 static gboolean __netconfig_wifi_invoke_auth_init_enrollee(guint32 peer_id)
575 char *if_path = NULL;
576 GVariantBuilder *builder = NULL;
577 GVariant *params = NULL;
578 GVariant *message = NULL;
580 DBG("[TizenMW-->WPAS]: DPP AuthInit Request: ");
582 if_path = __netconfig_dpp_get_supplicant_interface();
583 if (if_path == NULL) {
584 ERR("Fail to get wpa_supplicant DBus interface path");
587 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
588 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_uint32(peer_id));
589 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_string("enrollee"));
590 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
591 g_variant_builder_unref(builder);
593 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
594 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "AuthInit", params);
596 if (message == NULL) {
597 ERR(" DPP : Failed to start DPP AuthInit !!!");
601 g_variant_unref(message);
605 static gboolean __netconfig_wifi_invoke_auth_init_configurator(guint32 peer_id,
606 guint32 configurator_id, const char *conf, const char *ssid, const char *pass)
608 char *if_path = NULL;
609 GVariantBuilder *builder = NULL;
610 GVariant *params = NULL;
611 GVariant *message = NULL;
612 gchar ssid_hex[65] = {0,};
613 gchar pass_hex[129] = {0,};
615 DBG("[TizenMW-->WPAS]: DPP AuthInit Request: ");
617 if_path = __netconfig_dpp_get_supplicant_interface();
618 if (if_path == NULL) {
619 ERR("Fail to get wpa_supplicant DBus interface path");
622 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
623 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_uint32(peer_id));
624 g_variant_builder_add(builder, "{sv}", "configurator", g_variant_new_uint32(configurator_id));
625 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_string("configurator"));
626 g_variant_builder_add(builder, "{sv}", "conf", g_variant_new_string(conf));
628 netconfig_convert_bytes_to_hexstr(ssid, strlen(ssid), ssid_hex);
629 g_variant_builder_add(builder, "{sv}", "ssid", g_variant_new_string(ssid_hex));
632 netconfig_convert_bytes_to_hexstr(pass, strlen(pass), pass_hex);
633 g_variant_builder_add(builder, "{sv}", "passphrase", g_variant_new_string(pass_hex));
635 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
636 g_variant_builder_unref(builder);
638 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
639 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "AuthInit", params);
641 if (message == NULL) {
642 ERR(" DPP : Failed to start DPP AuthInit !!!");
646 g_variant_unref(message);
650 static void __netconfig_wifi_invoke_dpp_stop_listen()
652 char *if_path = NULL;
653 GVariant *message = NULL;
655 DBG("[TizenMW-->WPAS]: DPP StopListen Request: ");
657 if_path = __netconfig_dpp_get_supplicant_interface();
658 if (if_path == NULL) {
659 ERR("Fail to get wpa_supplicant DBus interface path");
663 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
664 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "StopListen", NULL);
666 if (message == NULL) {
667 ERR(" DPP : Failed to stop listen !!!");
671 g_variant_unref(message);
675 static void __netconfig_wifi_invoke_dpp_remove_bootstrap(guint32 uri_id)
677 char *if_path = NULL;
678 GVariant *message = NULL;
679 GVariant *params = NULL;
686 DBG("[TizenMW-->WPAS]: DPP RemoveBootstrap Request: ");
688 if_path = __netconfig_dpp_get_supplicant_interface();
689 if (if_path == NULL) {
690 ERR("Fail to get wpa_supplicant DBus interface path");
694 params = g_variant_new("(u)", uri_id);
695 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
696 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "RemoveBootstrap", params);
698 if (message == NULL) {
699 ERR(" DPP : Failed to remove URI !!!");
703 g_variant_unref(message);
707 static void __netconfig_wifi_invoke_dpp_remove_configurator(guint32 configurator_id)
709 char *if_path = NULL;
710 GVariant *message = NULL;
711 GVariant *params = NULL;
713 if (configurator_id == 0) {
718 DBG("[TizenMW-->WPAS]: DPP RemoveConfigurator Request: ");
720 if_path = __netconfig_dpp_get_supplicant_interface();
721 if (if_path == NULL) {
722 ERR("Fail to get wpa_supplicant DBus interface path");
726 params = g_variant_new("(u)", configurator_id);
727 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
728 if_path, SUPPLICANT_INTERFACE ".Interface.DPP", "RemoveConfigurator", params);
730 if (message == NULL) {
731 ERR(" DPP : Failed to remove configurator !!!");
735 g_variant_unref(message);
739 static void __wifi_dpp_connman_specific_scan_request_reply(GObject *source_object, GAsyncResult *res,
742 GDBusConnection *conn = NULL;
743 GError *error = NULL;
746 conn = G_DBUS_CONNECTION(source_object);
747 reply = g_dbus_connection_call_finish(conn, res, &error);
749 ERR("Scan failed. Error [%s]\n", error->message);
752 DBG("Specific Scan Request success\n");
756 g_variant_unref(reply);
759 static gboolean __netconfig_wifi_dpp_invoke_connman_specific_scan(gchar *ssid)
761 GVariant *params = NULL;
762 GVariantBuilder *builder;
765 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
766 g_variant_builder_add(builder, "{sv}", "SSID", g_variant_new_string(ssid));
768 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
769 g_variant_builder_unref(builder);
771 ret = netconfig_invoke_dbus_method_nonblock(CONNMAN_SERVICE,
772 CONNMAN_WIFI_TECHNOLOGY_PREFIX,
773 CONNMAN_TECHNOLOGY_INTERFACE, "SpecificScan", params,
774 __wifi_dpp_connman_specific_scan_request_reply);
779 static void __wifi_dpp_connman_scan_request_reply(GObject *source_object, GAsyncResult *res,
782 GDBusConnection *conn = NULL;
783 GError *error = NULL;
786 conn = G_DBUS_CONNECTION(source_object);
787 reply = g_dbus_connection_call_finish(conn, res, &error);
789 ERR("Scan failed. Error [%s]\n", error->message);
792 DBG("Scan Request success\n");
796 g_variant_unref(reply);
799 static gboolean __netconfig_wifi_dpp_invoke_connman_scan()
801 return netconfig_invoke_dbus_method_nonblock(CONNMAN_SERVICE,
802 CONNMAN_WIFI_TECHNOLOGY_PREFIX,
803 CONNMAN_TECHNOLOGY_INTERFACE, "Scan", NULL,
804 __wifi_dpp_connman_scan_request_reply);
809 static gboolean __netconfig_wifi_invoke_flush_bss()
811 GVariant *message = NULL;
812 char *if_path = NULL;
813 GVariant *params = NULL;
815 DBG("[TizenMW-->WPAS]: Wi-Fi Flush BSS Request: ");
817 if_path = netconfig_wifi_get_supplicant_interface();
818 if (if_path == NULL) {
819 ERR("Fail to get wpa_supplicant DBus path");
823 params = g_variant_new("(u)", 0);
824 message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,
825 if_path, SUPPLICANT_INTERFACE ".Interface", "FlushBSS", params);
828 if (message == NULL) {
829 ERR(" Failed to flush BSS !!!");
833 g_variant_unref(message);
837 static gboolean __netconfig_wifi_dpp_enter_peer_uri(GDBusMethodInvocation *context,
838 guint32 peer_id, guint32 own_id, gboolean is_initiator, gchar *peer_uri)
840 wifi_dpp_s *p_dpp_info = NULL;
843 p_dpp_info = _get_dpp_info(peer_id, own_id);
845 ERR("Invalid parameter");
849 ret = __netconfig_wifi_invoke_dpp_qr_code(peer_uri, &(p_dpp_info->peer_id));
853 __netconfig_wifi_notify_dpp_bootstrapped(p_dpp_info->peer_id);
858 static gboolean __netconfig_wifi_dpp_generate_uri(GDBusMethodInvocation *context,
859 guint32 peer_id, guint32 own_id, gboolean is_initiator, const gchar *key)
861 wifi_dpp_s *p_dpp_info = NULL;
863 gchar *generated_uri = NULL;
866 p_dpp_info = _get_dpp_info(peer_id, own_id);
868 ERR("Invalid parameter");
872 ret = __netconfig_wifi_invoke_dpp_add_bootstrap(key, &id);
876 ret = __netconfig_wifi_invoke_dpp_get_bootstrap_uri(id, &generated_uri);
878 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
882 p_dpp_info->own_id = id;
883 __netconfig_wifi_notify_dpp_uri_generated(id, generated_uri);
884 g_free(generated_uri);
889 static gboolean __netconfig_wifi_dpp_start_configurator_initiator(GDBusMethodInvocation *context,
890 const char *group_id, const char *ssid, const char *peer_uri, guint32 peer_id,
891 const char *net_role, const char *akm, const char *configurator_key,
894 wifi_dpp_s *p_dpp_info = NULL;
896 char *conf_str = NULL;
897 gboolean ret = FALSE;
899 p_dpp_info = __create_dpp_info(TRUE);
901 INFO("Failed to create DPP info");
905 ret = __netconfig_wifi_invoke_dpp_qr_code(peer_uri, &(id));
907 __destroy_dpp_info(p_dpp_info);
911 ret = __netconfig_wifi_invoke_dpp_add_configurator(configurator_key, &(p_dpp_info->configurator_id));
913 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
914 __destroy_dpp_info(p_dpp_info);
917 p_dpp_info->state = WIFI_DPP_STATE_BOOTSTRAPPED;
918 __netconfig_wifi_notify_dpp_bootstrapped(id);
920 conf_str = g_strdup_printf("%s-%s", net_role, akm);
921 ret = __netconfig_wifi_invoke_auth_init_configurator(id,
922 p_dpp_info->configurator_id, conf_str, ssid, pass);
924 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
925 __destroy_dpp_info(p_dpp_info);
930 p_dpp_info->is_initiator = TRUE;
931 p_dpp_info->peer_id = id;
932 __add_to_dpp_info_list(p_dpp_info);
933 p_dpp_info->state = WIFI_DPP_STATE_AUTHENTICATING;
934 __netconfig_wifi_notify_dpp_authenticating(id, p_dpp_info->own_id);
941 static gboolean __netconfig_wifi_dpp_start_configurator_responder(GDBusMethodInvocation *context,
942 const char *group_id, const char *ssid, const char *net_role,
943 const char *akm, const char *auth_key, const char *configurator_key,
946 wifi_dpp_s *p_dpp_info = NULL;
947 gboolean ret = FALSE;
949 gchar *generated_uri = NULL;
951 p_dpp_info = __create_dpp_info(FALSE);
953 INFO("Failed to create DPP info");
957 ret = __netconfig_wifi_invoke_dpp_add_configurator(configurator_key, &(p_dpp_info->configurator_id));
959 __destroy_dpp_info(p_dpp_info);
963 ret = __netconfig_wifi_invoke_dpp_set_configurator_params(p_dpp_info->configurator_id, ssid, net_role, akm, pass);
965 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
966 __destroy_dpp_info(p_dpp_info);
970 ret = __netconfig_wifi_invoke_dpp_add_bootstrap(auth_key, &id);
972 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
973 __destroy_dpp_info(p_dpp_info);
977 ret = __netconfig_wifi_invoke_dpp_get_bootstrap_uri(id, &generated_uri);
979 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
980 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
981 __destroy_dpp_info(p_dpp_info);
985 __netconfig_wifi_notify_dpp_uri_generated(id, generated_uri);
987 ret = __netconfig_wifi_invoke_dpp_listen(DEFAULT_DPP_FREQ, "configurator");
989 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
990 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
991 g_free(generated_uri);
992 __destroy_dpp_info(p_dpp_info);
996 p_dpp_info->is_initiator = FALSE;
997 p_dpp_info->own_id = id;
998 __add_to_dpp_info_list(p_dpp_info);
999 p_dpp_info->state = WIFI_DPP_STATE_AWAITING;
1000 __netconfig_wifi_notify_dpp_awaiting(id);
1002 g_free(generated_uri);
1007 static gboolean __netconfig_wifi_dpp_start_enrollee_initiator(GDBusMethodInvocation *context,
1008 const char *peer_uri, guint32 peer_id)
1010 wifi_dpp_s *p_dpp_info = NULL;
1012 gboolean ret = FALSE;
1014 p_dpp_info = __create_dpp_info(TRUE);
1016 INFO("Failed to create DPP info");
1020 ret = __netconfig_wifi_invoke_dpp_set_dpp_config_processing();
1022 __destroy_dpp_info(p_dpp_info);
1026 ret = __netconfig_wifi_invoke_dpp_qr_code(peer_uri, &id);
1028 __destroy_dpp_info(p_dpp_info);
1031 p_dpp_info->state = WIFI_DPP_STATE_BOOTSTRAPPED;
1032 __netconfig_wifi_notify_dpp_bootstrapped(id);
1034 ret = __netconfig_wifi_invoke_auth_init_enrollee(id);
1036 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
1037 __destroy_dpp_info(p_dpp_info);
1041 p_dpp_info->is_initiator = TRUE;
1042 p_dpp_info->peer_id = id;
1043 __add_to_dpp_info_list(p_dpp_info);
1044 p_dpp_info->state = WIFI_DPP_STATE_AUTHENTICATING;
1045 __netconfig_wifi_notify_dpp_authenticating(id, p_dpp_info->own_id);
1050 static gboolean __netconfig_wifi_dpp_start_enrollee_responder(GDBusMethodInvocation *context,
1051 const char *auth_key)
1053 wifi_dpp_s *p_dpp_info = NULL;
1054 gboolean ret = FALSE;
1056 gchar *generated_uri = NULL;
1058 p_dpp_info = __create_dpp_info(FALSE);
1060 INFO("Failed to create DPP info");
1064 ret = __netconfig_wifi_invoke_dpp_set_dpp_config_processing();
1066 __destroy_dpp_info(p_dpp_info);
1070 ret = __netconfig_wifi_invoke_dpp_add_bootstrap(auth_key, &id);
1072 __destroy_dpp_info(p_dpp_info);
1076 ret = __netconfig_wifi_invoke_dpp_get_bootstrap_uri(id, &generated_uri);
1078 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
1079 __destroy_dpp_info(p_dpp_info);
1083 __netconfig_wifi_notify_dpp_uri_generated(id, generated_uri);
1085 ret = __netconfig_wifi_invoke_dpp_listen(DEFAULT_DPP_FREQ, "enrollee");
1087 __netconfig_wifi_invoke_dpp_remove_bootstrap(id);
1088 __destroy_dpp_info(p_dpp_info);
1092 p_dpp_info->is_initiator = FALSE;
1093 p_dpp_info->own_id = id;
1094 __add_to_dpp_info_list(p_dpp_info);
1095 p_dpp_info->state = WIFI_DPP_STATE_AWAITING;
1096 __netconfig_wifi_notify_dpp_awaiting(id);
1098 g_free(generated_uri);
1103 static gboolean __netconfig_wifi_dpp_stop(GDBusMethodInvocation *context,
1104 guint32 peer_id, guint32 own_id)
1106 wifi_dpp_s *p_dpp_info = NULL;
1108 p_dpp_info = _get_dpp_info(peer_id, own_id);
1110 ERR("Invalid parameter");
1114 __netconfig_wifi_invoke_dpp_stop_listen();
1115 __netconfig_wifi_invoke_dpp_remove_bootstrap(p_dpp_info->peer_id);
1117 if (p_dpp_info->own_id != 0)
1118 __netconfig_wifi_invoke_dpp_remove_bootstrap(p_dpp_info->own_id);
1120 if (p_dpp_info->configurator_id != 0)
1121 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
1123 __remove_from_dpp_info_list(p_dpp_info);
1124 __destroy_dpp_info(p_dpp_info);
1125 __netconfig_wifi_notify_dpp_removed(peer_id, own_id);
1131 void netconfig_wifi_dpp_auth_success_event(GVariant *message)
1133 wifi_dpp_s *p_dpp_info = NULL;
1134 GVariantBuilder *builder = NULL;
1136 p_dpp_info = _get_dpp_in_progress();
1138 ERR("DPP :there's no DPP in progress");
1142 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1143 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1144 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1146 p_dpp_info->state = WIFI_DPP_STATE_AUTHENTICATED;
1147 wifi_emit_dpp_auth_success((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1148 g_variant_builder_unref(builder);
1154 static void __clear_dpp_process(wifi_dpp_s *p_dpp_info)
1156 g_in_progress = FALSE;
1157 __netconfig_wifi_invoke_dpp_stop_listen();
1159 __netconfig_wifi_invoke_dpp_remove_bootstrap(p_dpp_info->peer_id);
1161 if (p_dpp_info->own_id != 0)
1162 __netconfig_wifi_invoke_dpp_remove_bootstrap(p_dpp_info->own_id);
1164 if (p_dpp_info->configurator_id != 0)
1165 __netconfig_wifi_invoke_dpp_remove_configurator(p_dpp_info->configurator_id);
1167 __remove_from_dpp_info_list(p_dpp_info);
1168 __netconfig_wifi_notify_dpp_removed(p_dpp_info->peer_id, p_dpp_info->own_id);
1169 __destroy_dpp_info(p_dpp_info);
1172 static void __resume_dpp_responder(wifi_dpp_s *p_dpp_info)
1174 gchar *device_role = NULL;
1177 __netconfig_wifi_invoke_dpp_stop_listen();
1179 if (p_dpp_info->configurator_id)
1180 device_role = "configurator";
1182 device_role = "enrollee";
1184 ret = __netconfig_wifi_invoke_dpp_listen(DEFAULT_DPP_FREQ, device_role);
1186 __clear_dpp_process(p_dpp_info);
1188 p_dpp_info->state = WIFI_DPP_STATE_AWAITING;
1189 __netconfig_wifi_notify_dpp_awaiting(p_dpp_info->own_id);
1193 static void __netconfig_wifi_dpp_wrap_up(wifi_dpp_s *p_dpp_info)
1195 if (p_dpp_info->is_initiator)
1196 __clear_dpp_process(p_dpp_info);
1198 __resume_dpp_responder(p_dpp_info);
1201 static void __netconfig_wifi_dpp_notify_dpp_failed(wifi_dpp_s *p_dpp_info)
1203 GVariantBuilder *builder = NULL;
1205 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1206 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1207 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1209 wifi_emit_dpp_auth_failed((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1210 g_variant_builder_unref(builder);
1212 __netconfig_wifi_dpp_wrap_up(p_dpp_info);
1215 void netconfig_wifi_dpp_auth_failed_event(GVariant *message)
1217 wifi_dpp_s *p_dpp_info = NULL;
1218 p_dpp_info = _get_dpp_in_progress();
1220 ERR("DPP :there's no DPP in progress");
1224 __netconfig_wifi_dpp_notify_dpp_failed(p_dpp_info);
1229 void netconfig_wifi_dpp_not_compatible_event(GVariant *message)
1231 wifi_dpp_s *p_dpp_info = NULL;
1232 GVariantBuilder *builder = NULL;
1234 p_dpp_info = _get_dpp_in_progress();
1236 ERR("DPP :there's no DPP in progress");
1240 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1241 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1242 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1244 wifi_emit_dpp_not_compatible((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1245 g_variant_builder_unref(builder);
1247 __netconfig_wifi_dpp_wrap_up(p_dpp_info);
1252 void netconfig_wifi_dpp_conf_failed_event(GVariant *message)
1254 wifi_dpp_s *p_dpp_info = NULL;
1255 GVariantBuilder *builder = NULL;
1257 p_dpp_info = _get_dpp_in_progress();
1259 ERR("DPP :there's no DPP in progress");
1263 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1264 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1265 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1267 wifi_emit_dpp_conf_failed((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1268 g_variant_builder_unref(builder);
1270 __netconfig_wifi_dpp_wrap_up(p_dpp_info);
1275 void netconfig_wifi_dpp_scan_peer_qr_event(GVariant *message)
1277 wifi_dpp_s *p_dpp_info = NULL;
1278 GVariantBuilder *builder = NULL;
1280 p_dpp_info = _get_dpp_in_progress();
1282 ERR("DPP :there's no DPP in progress");
1286 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1287 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1288 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1290 wifi_emit_dpp_scan_peer_qr((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1291 g_variant_builder_unref(builder);
1293 p_dpp_info->state = WIFI_DPP_STATE_PEER_QR_REQUESTED;
1298 void netconfig_wifi_dpp_network_id_event(GVariant *message)
1300 wifi_dpp_s *p_dpp_info = NULL;
1301 GVariantBuilder *builder = NULL;
1303 p_dpp_info = _get_dpp_in_progress();
1305 ERR("DPP :there's no DPP in progress");
1309 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1310 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1311 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1313 wifi_emit_dpp_network_id((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1314 g_variant_builder_unref(builder);
1319 void netconfig_wifi_dpp_conf_sent_event(GVariant *message)
1321 wifi_dpp_s *p_dpp_info = NULL;
1322 GVariantBuilder *builder = NULL;
1324 p_dpp_info = _get_dpp_in_progress();
1326 ERR("DPP :there's no DPP in progress");
1330 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1331 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1332 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1334 wifi_emit_dpp_conf_sent((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1335 g_variant_builder_unref(builder);
1337 __netconfig_wifi_dpp_wrap_up(p_dpp_info);
1342 void netconfig_wifi_dpp_conf_received_event(GVariant *message)
1344 wifi_dpp_s *p_dpp_info = NULL;
1345 GVariantBuilder *builder = NULL;
1347 p_dpp_info = _get_dpp_in_progress();
1349 ERR("DPP :there's no DPP in progress");
1353 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1354 g_variant_builder_add(builder, "{sv}", "peer_id", g_variant_new_uint32(p_dpp_info->peer_id));
1355 g_variant_builder_add(builder, "{sv}", "own_id", g_variant_new_uint32(p_dpp_info->own_id));
1357 wifi_emit_dpp_conf_received((Wifi *)get_wifi_object(), g_variant_builder_end(builder));
1358 g_variant_builder_unref(builder);
1360 p_dpp_info->state = WIFI_DPP_STATE_CONFIGURED;
1365 static wifi_dpp_akm_e __get_dpp_akm(const gchar *akm_str)
1367 if (g_strcmp0(akm_str, "psk") == 0)
1368 return WIFI_DPP_AKM_PSK;
1369 else if (g_strcmp0(akm_str, "sae") == 0)
1370 return WIFI_DPP_AKM_SAE;
1371 else if (g_strcmp0(akm_str, "dpp") == 0)
1372 return WIFI_DPP_AKM_DPP;
1374 return WIFI_DPP_AKM_UNKNOWN;
1377 static gboolean __is_configuration_valid(wifi_dpp_akm_e akm, const gchar *passphrase,
1378 const gchar *connector, const gchar *c_sign_key, const gchar *net_access_key)
1380 if ((akm == WIFI_DPP_AKM_PSK || akm == WIFI_DPP_AKM_SAE) && passphrase)
1382 else if (akm == WIFI_DPP_AKM_DPP && connector && c_sign_key && net_access_key)
1387 gboolean __save_passphrase(GKeyFile *keyfile, gchar *group_name, gchar *key, gchar *value)
1389 gchar *enc_data = NULL;
1390 gboolean ret = TRUE;
1395 enc_data = _netconfig_encrypt_passphrase(value);
1397 ERR("Failed to encrypt the passphrase");
1400 g_key_file_set_string(keyfile, group_name, key, enc_data);
1407 gboolean __save_credentials(GKeyFile *keyfile, gchar *group_name, wifi_dpp_conf_obj *conf_obj)
1411 ret = __save_passphrase(keyfile, group_name,
1412 "Passphrase", conf_obj->passphrase);
1416 ret = __save_passphrase(keyfile, group_name,
1417 "Connector", conf_obj->connector);
1421 ret = __save_passphrase(keyfile, group_name,
1422 "CSignKey", conf_obj->c_sign_key);
1426 ret = __save_passphrase(keyfile, group_name,
1427 "NetAccessKey", conf_obj->net_access_key);
1435 static gboolean __save_configuration_object(wifi_dpp_conf_obj *conf_obj)
1437 gchar ssid_hex[65] = {0,};
1438 gchar *config_id = NULL;
1439 gchar *group_name = NULL;
1440 GKeyFile *keyfile = NULL;
1443 if (!conf_obj->ssid) {
1444 ERR("DPP :there's no SSID in configuration");
1448 if (!__is_configuration_valid(__get_dpp_akm(conf_obj->akm),
1449 conf_obj->passphrase,
1450 conf_obj->connector,
1451 conf_obj->c_sign_key,
1452 conf_obj->net_access_key)) {
1453 ERR("DPP :Invalid AKM information in configuration");
1457 netconfig_convert_bytes_to_hexstr(conf_obj->ssid, strlen(conf_obj->ssid), ssid_hex);
1458 config_id = g_strdup_printf("%s_managed_%s", ssid_hex, conf_obj->akm);
1459 ret = wifi_config_get_group_name("wifi_", config_id, &group_name);
1461 ERR("Failed to get Wi-Fi config group name");
1466 keyfile = g_key_file_new();
1467 g_key_file_set_string(keyfile, group_name, "Name", conf_obj->ssid);
1468 g_key_file_set_string(keyfile, group_name, "SSID", ssid_hex);
1470 if (!__save_credentials(keyfile, group_name, conf_obj)) {
1471 g_key_file_free(keyfile);
1477 g_key_file_set_boolean(keyfile, group_name, "Favorite", TRUE);
1478 g_key_file_set_boolean(keyfile, group_name, "AutoConnect", TRUE);
1480 ret = wifi_config_save_configuration(config_id, keyfile);
1482 INFO("Success to save configuration [%s]", config_id);
1484 INFO("Fail to save configuration [%s]", config_id);
1486 g_key_file_free(keyfile);
1494 void netconfig_wifi_dpp_conf_obj_event(GVariant *message)
1496 GVariantIter *iter = NULL;
1498 GVariant *value = NULL;
1499 wifi_dpp_s *p_dpp_info = NULL;
1500 wifi_dpp_conf_obj conf_obj = {0,};
1502 p_dpp_info = _get_dpp_in_progress();
1504 ERR("DPP :there's no DPP in progress");
1508 g_variant_get(message, "(a{sv})", &iter);
1509 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
1510 if (g_strcmp0(key, "ssid") == 0)
1511 g_variant_get(value, "&s", &conf_obj.ssid);
1512 else if (g_strcmp0(key, "akm") == 0)
1513 g_variant_get(value, "&s", &conf_obj.akm);
1514 else if (g_strcmp0(key, "passphrase") == 0)
1515 g_variant_get(value, "&s", &conf_obj.passphrase);
1516 else if (g_strcmp0(key, "connector") == 0)
1517 g_variant_get(value, "&s", &conf_obj.connector);
1518 else if (g_strcmp0(key, "c_sign_key") == 0)
1519 g_variant_get(value, "&s", &conf_obj.c_sign_key);
1520 else if (g_strcmp0(key, "net_access_key") == 0)
1521 g_variant_get(value, "&s", &conf_obj.net_access_key);
1524 if (!__save_configuration_object(&conf_obj) || !__netconfig_wifi_invoke_flush_bss()) {
1525 g_variant_iter_free(iter);
1526 __netconfig_wifi_dpp_notify_dpp_failed(p_dpp_info);
1530 g_variant_iter_free(iter);
1531 __clear_dpp_process(p_dpp_info);
1532 __netconfig_wifi_dpp_invoke_connman_scan();
1536 gboolean handle_dpp_enter_peer_uri(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1538 gboolean ret = FALSE;
1542 guint32 peer_id = 0;
1544 gboolean is_initiator = FALSE;
1547 INFO("Received DPP enter peer uri Request");
1548 if ((wifi == NULL) || (dpp_info == NULL)) {
1549 ERR("Invalid arguments");
1550 netconfig_error_dbus_method_return(context,
1551 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1555 g_variant_get(dpp_info, "a{sv}", &iter);
1556 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1557 if (g_strcmp0(field, "peer_id") == 0 &&
1558 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1559 peer_id = g_variant_get_uint32(value);
1560 } else if (g_strcmp0(field, "own_id") == 0 &&
1561 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1562 own_id = g_variant_get_uint32(value);
1564 } else if (g_strcmp0(field, "uri") == 0 &&
1565 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1567 uri = g_strdup(g_variant_get_string(value, NULL));
1571 if (!own_id || !uri){
1572 g_variant_iter_free(iter);
1574 ERR("Invalid arguments");
1575 netconfig_error_dbus_method_return(context,
1576 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1579 wifi_complete_dpp_enter_peer_uri(wifi, context);
1581 ret = __netconfig_wifi_dpp_enter_peer_uri(context, peer_id, own_id,
1584 INFO("Success to enter peer uri");
1586 __netconfig_wifi_notify_dpp_failed();
1588 g_variant_iter_free(iter);
1594 gboolean handle_dpp_generate_uri(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1596 gboolean ret = FALSE;
1600 guint32 peer_id = 0;
1602 gboolean is_initiator = FALSE;
1605 INFO("Received DPP gen own uri Request");
1606 if ((wifi == NULL) || (dpp_info == NULL)) {
1607 ERR("Invalid arguments");
1608 netconfig_error_dbus_method_return(context,
1609 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1613 g_variant_get(dpp_info, "a{sv}", &iter);
1614 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1615 if (g_strcmp0(field, "peer_id") == 0 &&
1616 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1617 peer_id = g_variant_get_uint32(value);
1618 } else if (g_strcmp0(field, "own_id") == 0 &&
1619 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1620 own_id = g_variant_get_uint32(value);
1622 } else if (g_strcmp0(field, "is_initiator") == 0 &&
1623 g_variant_is_of_type(value, G_VARIANT_TYPE_BOOLEAN)) {
1624 is_initiator = g_variant_get_boolean(value);
1625 } else if (g_strcmp0(field, "key") == 0 &&
1626 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1627 __free_critical(key);
1628 key = g_strdup(g_variant_get_string(value, NULL));
1633 __free_critical(key);
1634 g_variant_iter_free(iter);
1635 ERR("Invalid arguments");
1636 netconfig_error_dbus_method_return(context,
1637 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1640 wifi_complete_dpp_generate_uri(wifi, context);
1642 ret = __netconfig_wifi_dpp_generate_uri(context, peer_id, own_id,
1645 INFO("Success to generate uri");
1647 __netconfig_wifi_notify_dpp_failed();
1649 g_variant_iter_free(iter);
1650 __free_critical(key);
1655 gboolean handle_dpp_start_configurator_initiator(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1660 gchar *group_id = NULL;
1662 gchar *peer_uri = NULL;
1663 guint32 peer_id = 0;
1664 gchar *net_role = NULL;
1666 gchar *configurator_key = NULL;
1669 INFO("Received DPP start configurator initiator");
1670 if ((wifi == NULL) || (dpp_info == NULL)) {
1671 ERR("Invalid arguments");
1672 netconfig_error_dbus_method_return(context,
1673 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1676 if (g_in_progress) {
1677 ERR("DPP in progress");;
1678 netconfig_error_inprogress(context);
1682 g_variant_get(dpp_info, "a{sv}", &iter);
1683 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1684 if (g_strcmp0(field, "group_id") == 0 &&
1685 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1687 group_id = g_strdup(g_variant_get_string(value, NULL));
1688 } else if (g_strcmp0(field, "ssid") == 0 &&
1689 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1691 ssid = g_strdup(g_variant_get_string(value, NULL));
1692 } else if (g_strcmp0(field, "peer_uri") == 0 &&
1693 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1695 peer_uri = g_strdup(g_variant_get_string(value, NULL));
1696 } else if (g_strcmp0(field, "peer_id") == 0 &&
1697 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1698 peer_id = g_variant_get_uint32(value);
1699 } else if (g_strcmp0(field, "net_role") == 0 &&
1700 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1702 net_role = g_strdup(g_variant_get_string(value, NULL));
1703 } else if (g_strcmp0(field, "akm") == 0 &&
1704 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1706 akm = g_strdup(g_variant_get_string(value, NULL));
1707 } else if (g_strcmp0(field, "configurator_key") == 0 &&
1708 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1709 __free_critical(configurator_key);
1710 configurator_key = g_strdup(g_variant_get_string(value, NULL));
1711 } else if (g_strcmp0(field, "pass") == 0 &&
1712 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1713 __free_critical(pass);
1714 pass = g_strdup(g_variant_get_string(value, NULL));
1718 if (!ssid || !akm || !net_role || !peer_uri){
1719 g_variant_iter_free(iter);
1725 __free_critical(configurator_key);
1726 __free_critical(pass);
1727 ERR("Invalid arguments");
1728 netconfig_error_dbus_method_return(context,
1729 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1733 wifi_complete_dpp_start_configurator_initiator(wifi, context);
1735 g_in_progress = __netconfig_wifi_dpp_start_configurator_initiator(context, group_id,
1736 ssid, peer_uri, peer_id, net_role, akm, configurator_key, pass);
1738 INFO("Success to dpp start configurator initiator");
1740 __netconfig_wifi_notify_dpp_failed();
1742 g_variant_iter_free(iter);
1748 __free_critical(configurator_key);
1749 __free_critical(pass);
1753 gboolean handle_dpp_start_enrollee_initiator(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1758 gchar *peer_uri = NULL;
1759 guint32 peer_id = 0;
1761 INFO("Received DPP start enrollee initiator");
1762 if ((wifi == NULL) || (dpp_info == NULL)) {
1763 ERR("Invalid arguments");
1764 netconfig_error_dbus_method_return(context,
1765 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1768 if (g_in_progress) {
1769 ERR("DPP in progress");;
1770 netconfig_error_inprogress(context);
1774 g_variant_get(dpp_info, "a{sv}", &iter);
1775 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1777 if (g_strcmp0(field, "peer_uri") == 0 &&
1778 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1780 peer_uri = g_strdup(g_variant_get_string(value, NULL));
1781 } else if (g_strcmp0(field, "peer_id") == 0 &&
1782 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1783 peer_id = g_variant_get_uint32(value);
1788 g_variant_iter_free(iter);
1789 ERR("Invalid arguments");
1790 netconfig_error_dbus_method_return(context,
1791 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1794 wifi_complete_dpp_start_enrollee_initiator(wifi, context);
1796 g_in_progress = __netconfig_wifi_dpp_start_enrollee_initiator(context, peer_uri, peer_id);
1798 INFO("Success to dpp start enrollee initiator");
1800 __netconfig_wifi_notify_dpp_failed();
1802 g_variant_iter_free(iter);
1808 gboolean handle_dpp_start_configurator_responder(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1813 gchar *group_id = NULL;
1815 gchar *net_role = NULL;
1817 gchar *auth_key = NULL;
1818 gchar *configurator_key = NULL;
1821 INFO("Received DPP start configurator responder");
1822 if ((wifi == NULL) || (dpp_info == NULL)) {
1823 ERR("Invalid arguments");
1824 netconfig_error_dbus_method_return(context,
1825 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1828 if (g_in_progress) {
1829 ERR("DPP in progress");;
1830 netconfig_error_inprogress(context);
1834 g_variant_get(dpp_info, "a{sv}", &iter);
1835 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1836 if (g_strcmp0(field, "group_id") == 0 &&
1837 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1839 group_id = g_strdup(g_variant_get_string(value, NULL));
1840 } else if (g_strcmp0(field, "ssid") == 0 &&
1841 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1843 ssid = g_strdup(g_variant_get_string(value, NULL));
1844 } else if (g_strcmp0(field, "net_role") == 0 &&
1845 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1847 net_role = g_strdup(g_variant_get_string(value, NULL));
1848 } else if (g_strcmp0(field, "akm") == 0 &&
1849 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1851 akm = g_strdup(g_variant_get_string(value, NULL));
1852 } else if (g_strcmp0(field, "auth_key") == 0 &&
1853 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1854 __free_critical(auth_key);
1855 auth_key = g_strdup(g_variant_get_string(value, NULL));
1856 } else if (g_strcmp0(field, "configurator_key") == 0 &&
1857 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1858 __free_critical(configurator_key);
1859 configurator_key = g_strdup(g_variant_get_string(value, NULL));
1860 } else if (g_strcmp0(field, "pass") == 0 &&
1861 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1862 __free_critical(pass);
1863 pass = g_strdup(g_variant_get_string(value, NULL));
1867 if (!ssid || !akm || !net_role){
1868 g_variant_iter_free(iter);
1873 __free_critical(auth_key);
1874 __free_critical(configurator_key);
1875 __free_critical(pass);
1876 ERR("Invalid arguments");
1877 netconfig_error_dbus_method_return(context,
1878 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1881 wifi_complete_dpp_start_configurator_responder(wifi, context);
1883 g_in_progress = __netconfig_wifi_dpp_start_configurator_responder(context, group_id,
1884 ssid, net_role, akm, auth_key, configurator_key, pass);
1886 INFO("Success to dpp start configurator responder");
1888 __netconfig_wifi_notify_dpp_failed();
1890 g_variant_iter_free(iter);
1895 __free_critical(auth_key);
1896 __free_critical(configurator_key);
1897 __free_critical(pass);
1902 gboolean handle_dpp_start_enrollee_responder(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1907 gchar *auth_key = NULL;
1909 INFO("Received DPP start enrollee responder");
1910 if ((wifi == NULL) || (dpp_info == NULL)) {
1911 ERR("Invalid arguments");
1912 netconfig_error_dbus_method_return(context,
1913 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1916 if (g_in_progress) {
1917 ERR("DPP in progress");;
1918 netconfig_error_inprogress(context);
1922 g_variant_get(dpp_info, "a{sv}", &iter);
1923 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1924 if (g_strcmp0(field, "auth_key") == 0 &&
1925 g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
1926 __free_critical(auth_key);
1927 auth_key = g_strdup(g_variant_get_string(value, NULL));
1930 wifi_complete_dpp_start_enrollee_responder(wifi, context);
1932 g_in_progress = __netconfig_wifi_dpp_start_enrollee_responder(context, auth_key);
1934 INFO("Success to dpp start enrolee responder");
1936 __netconfig_wifi_notify_dpp_failed();
1938 g_variant_iter_free(iter);
1939 __free_critical(auth_key);
1944 gboolean handle_dpp_stop(Wifi *wifi, GDBusMethodInvocation *context, GVariant *dpp_info)
1949 guint32 peer_id = 0;
1952 INFO("Received DPP stop Request");
1953 if ((wifi == NULL) || (dpp_info == NULL)) {
1954 ERR("Invalid arguments");
1955 netconfig_error_dbus_method_return(context,
1956 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1960 g_variant_get(dpp_info, "a{sv}", &iter);
1962 g_variant_get(dpp_info, "a{sv}", &iter);
1963 while (g_variant_iter_loop(iter, "{sv}", &field, &value)) {
1964 if (g_strcmp0(field, "peer_id") == 0 &&
1965 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1966 peer_id = g_variant_get_uint32(value);
1967 } else if (g_strcmp0(field, "own_id") == 0 &&
1968 g_variant_is_of_type(value, G_VARIANT_TYPE_UINT32)) {
1969 own_id = g_variant_get_uint32(value);
1972 if (!peer_id && !own_id){
1973 g_variant_iter_free(iter);
1974 ERR("Invalid arguments");
1975 netconfig_error_dbus_method_return(context,
1976 NETCONFIG_ERROR_INVALID_PARAMETER, "InvalidArguments");
1979 wifi_complete_dpp_stop(wifi, context);
1981 g_in_progress = !(__netconfig_wifi_dpp_stop(context, peer_id, own_id));
1983 INFO("Success to dpp stop");
1985 __netconfig_wifi_notify_dpp_failed();
1987 g_variant_iter_free(iter);