2 * WPA Supplicant / dbus-based control interface
3 * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
4 * Copyright (c) 2009-2010, Witold Sowa <witold.sowa@gmail.com>
5 * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * Alternatively, this software may be distributed under the terms of BSD
14 * See README and COPYING for more details.
20 #include "common/ieee802_11_defs.h"
22 #include "../config.h"
23 #include "../wpa_supplicant_i.h"
25 #include "dbus_new_helpers.h"
26 #include "dbus_dict_helpers.h"
28 #include "dbus_new_handlers.h"
29 #include "dbus_common.h"
30 #include "dbus_common_i.h"
31 #include "dbus_new_handlers_p2p.h"
36 * wpas_dbus_signal_interface - Send a interface related event signal
37 * @wpa_s: %wpa_supplicant network interface data
38 * @sig_name: signal name - InterfaceAdded or InterfaceRemoved
39 * @properties: Whether to add second argument with object properties
41 * Notify listeners about event related with interface
43 static void wpas_dbus_signal_interface(struct wpa_supplicant *wpa_s,
44 const char *sig_name, int properties)
46 struct wpas_dbus_priv *iface;
48 DBusMessageIter iter, iter_dict;
50 iface = wpa_s->global->dbus;
52 /* Do nothing if the control interface is not turned on */
56 msg = dbus_message_new_signal(WPAS_DBUS_NEW_PATH,
57 WPAS_DBUS_NEW_INTERFACE, sig_name);
61 dbus_message_iter_init_append(msg, &iter);
62 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
63 &wpa_s->dbus_new_path))
67 if (!wpa_dbus_dict_open_write(&iter, &iter_dict))
70 wpa_dbus_get_object_properties(iface, wpa_s->dbus_new_path,
71 WPAS_DBUS_NEW_IFACE_INTERFACE,
74 if (!wpa_dbus_dict_close_write(&iter, &iter_dict))
78 dbus_connection_send(iface->con, msg, NULL);
79 dbus_message_unref(msg);
83 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
84 dbus_message_unref(msg);
89 * wpas_dbus_signal_interface_added - Send a interface created signal
90 * @wpa_s: %wpa_supplicant network interface data
92 * Notify listeners about creating new interface
94 static void wpas_dbus_signal_interface_added(struct wpa_supplicant *wpa_s)
96 wpas_dbus_signal_interface(wpa_s, "InterfaceAdded", TRUE);
101 * wpas_dbus_signal_interface_removed - Send a interface removed signal
102 * @wpa_s: %wpa_supplicant network interface data
104 * Notify listeners about removing interface
106 static void wpas_dbus_signal_interface_removed(struct wpa_supplicant *wpa_s)
108 wpas_dbus_signal_interface(wpa_s, "InterfaceRemoved", FALSE);
114 * wpas_dbus_signal_scan_done - send scan done signal
115 * @wpa_s: %wpa_supplicant network interface data
116 * @success: indicates if scanning succeed or failed
118 * Notify listeners about finishing a scan
120 void wpas_dbus_signal_scan_done(struct wpa_supplicant *wpa_s, int success)
122 struct wpas_dbus_priv *iface;
126 iface = wpa_s->global->dbus;
128 /* Do nothing if the control interface is not turned on */
132 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
133 WPAS_DBUS_NEW_IFACE_INTERFACE,
138 succ = success ? TRUE : FALSE;
139 if (dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &succ,
141 dbus_connection_send(iface->con, msg, NULL);
143 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
144 dbus_message_unref(msg);
149 * wpas_dbus_signal_blob - Send a BSS related event signal
150 * @wpa_s: %wpa_supplicant network interface data
151 * @bss_obj_path: BSS object path
152 * @sig_name: signal name - BSSAdded or BSSRemoved
153 * @properties: Whether to add second argument with object properties
155 * Notify listeners about event related with BSS
157 static void wpas_dbus_signal_bss(struct wpa_supplicant *wpa_s,
158 const char *bss_obj_path,
159 const char *sig_name, int properties)
161 struct wpas_dbus_priv *iface;
163 DBusMessageIter iter, iter_dict;
165 iface = wpa_s->global->dbus;
167 /* Do nothing if the control interface is not turned on */
171 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
172 WPAS_DBUS_NEW_IFACE_INTERFACE,
177 dbus_message_iter_init_append(msg, &iter);
178 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
183 if (!wpa_dbus_dict_open_write(&iter, &iter_dict))
186 wpa_dbus_get_object_properties(iface, bss_obj_path,
187 WPAS_DBUS_NEW_IFACE_BSS,
190 if (!wpa_dbus_dict_close_write(&iter, &iter_dict))
194 dbus_connection_send(iface->con, msg, NULL);
195 dbus_message_unref(msg);
199 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
200 dbus_message_unref(msg);
205 * wpas_dbus_signal_bss_added - Send a BSS added signal
206 * @wpa_s: %wpa_supplicant network interface data
207 * @bss_obj_path: new BSS object path
209 * Notify listeners about adding new BSS
211 static void wpas_dbus_signal_bss_added(struct wpa_supplicant *wpa_s,
212 const char *bss_obj_path)
214 wpas_dbus_signal_bss(wpa_s, bss_obj_path, "BSSAdded", TRUE);
219 * wpas_dbus_signal_bss_removed - Send a BSS removed signal
220 * @wpa_s: %wpa_supplicant network interface data
221 * @bss_obj_path: BSS object path
223 * Notify listeners about removing BSS
225 static void wpas_dbus_signal_bss_removed(struct wpa_supplicant *wpa_s,
226 const char *bss_obj_path)
228 wpas_dbus_signal_bss(wpa_s, bss_obj_path, "BSSRemoved", FALSE);
233 * wpas_dbus_signal_blob - Send a blob related event signal
234 * @wpa_s: %wpa_supplicant network interface data
236 * @sig_name: signal name - BlobAdded or BlobRemoved
238 * Notify listeners about event related with blob
240 static void wpas_dbus_signal_blob(struct wpa_supplicant *wpa_s,
241 const char *name, const char *sig_name)
243 struct wpas_dbus_priv *iface;
246 iface = wpa_s->global->dbus;
248 /* Do nothing if the control interface is not turned on */
252 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
253 WPAS_DBUS_NEW_IFACE_INTERFACE,
258 if (dbus_message_append_args(msg, DBUS_TYPE_STRING, &name,
260 dbus_connection_send(iface->con, msg, NULL);
262 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
263 dbus_message_unref(msg);
268 * wpas_dbus_signal_blob_added - Send a blob added signal
269 * @wpa_s: %wpa_supplicant network interface data
272 * Notify listeners about adding a new blob
274 void wpas_dbus_signal_blob_added(struct wpa_supplicant *wpa_s,
277 wpas_dbus_signal_blob(wpa_s, name, "BlobAdded");
282 * wpas_dbus_signal_blob_removed - Send a blob removed signal
283 * @wpa_s: %wpa_supplicant network interface data
286 * Notify listeners about removing blob
288 void wpas_dbus_signal_blob_removed(struct wpa_supplicant *wpa_s,
291 wpas_dbus_signal_blob(wpa_s, name, "BlobRemoved");
296 * wpas_dbus_signal_network - Send a network related event signal
297 * @wpa_s: %wpa_supplicant network interface data
298 * @id: new network id
299 * @sig_name: signal name - NetworkAdded, NetworkRemoved or NetworkSelected
300 * @properties: determines if add second argument with object properties
302 * Notify listeners about event related with configured network
304 static void wpas_dbus_signal_network(struct wpa_supplicant *wpa_s,
305 int id, const char *sig_name,
308 struct wpas_dbus_priv *iface;
310 DBusMessageIter iter, iter_dict;
311 char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
313 iface = wpa_s->global->dbus;
315 /* Do nothing if the control interface is not turned on */
319 os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
320 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
321 wpa_s->dbus_new_path, id);
323 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
324 WPAS_DBUS_NEW_IFACE_INTERFACE,
329 dbus_message_iter_init_append(msg, &iter);
331 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
336 if (!wpa_dbus_dict_open_write(&iter, &iter_dict))
339 wpa_dbus_get_object_properties(iface, net_obj_path,
340 WPAS_DBUS_NEW_IFACE_NETWORK,
343 if (!wpa_dbus_dict_close_write(&iter, &iter_dict))
347 dbus_connection_send(iface->con, msg, NULL);
349 dbus_message_unref(msg);
353 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
354 dbus_message_unref(msg);
359 * wpas_dbus_signal_network_added - Send a network added signal
360 * @wpa_s: %wpa_supplicant network interface data
361 * @id: new network id
363 * Notify listeners about adding new network
365 static void wpas_dbus_signal_network_added(struct wpa_supplicant *wpa_s,
368 wpas_dbus_signal_network(wpa_s, id, "NetworkAdded", TRUE);
373 * wpas_dbus_signal_network_removed - Send a network removed signal
374 * @wpa_s: %wpa_supplicant network interface data
377 * Notify listeners about removing a network
379 static void wpas_dbus_signal_network_removed(struct wpa_supplicant *wpa_s,
382 wpas_dbus_signal_network(wpa_s, id, "NetworkRemoved", FALSE);
387 * wpas_dbus_signal_network_selected - Send a network selected signal
388 * @wpa_s: %wpa_supplicant network interface data
391 * Notify listeners about selecting a network
393 void wpas_dbus_signal_network_selected(struct wpa_supplicant *wpa_s, int id)
395 wpas_dbus_signal_network(wpa_s, id, "NetworkSelected", FALSE);
400 * wpas_dbus_signal_network_enabled_changed - Signals Enabled property changes
401 * @wpa_s: %wpa_supplicant network interface data
402 * @ssid: configured network which Enabled property has changed
404 * Sends PropertyChanged signals containing new value of Enabled property
405 * for specified network
407 void wpas_dbus_signal_network_enabled_changed(struct wpa_supplicant *wpa_s,
408 struct wpa_ssid *ssid)
411 char path[WPAS_DBUS_OBJECT_PATH_MAX];
412 os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
413 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
414 wpa_s->dbus_new_path, ssid->id);
416 wpa_dbus_mark_property_changed(wpa_s->global->dbus, path,
417 WPAS_DBUS_NEW_IFACE_NETWORK, "Enabled");
424 * wpas_dbus_signal_wps_event_success - Signals Success WPS event
425 * @wpa_s: %wpa_supplicant network interface data
427 * Sends Event dbus signal with name "success" and empty dict as arguments
429 void wpas_dbus_signal_wps_event_success(struct wpa_supplicant *wpa_s)
433 DBusMessageIter iter, dict_iter;
434 struct wpas_dbus_priv *iface;
435 char *key = "success";
437 iface = wpa_s->global->dbus;
439 /* Do nothing if the control interface is not turned on */
443 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
444 WPAS_DBUS_NEW_IFACE_WPS, "Event");
448 dbus_message_iter_init_append(msg, &iter);
450 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key) ||
451 !wpa_dbus_dict_open_write(&iter, &dict_iter) ||
452 !wpa_dbus_dict_close_write(&iter, &dict_iter))
453 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
455 dbus_connection_send(iface->con, msg, NULL);
457 dbus_message_unref(msg);
462 * wpas_dbus_signal_wps_event_fail - Signals Fail WPS event
463 * @wpa_s: %wpa_supplicant network interface data
465 * Sends Event dbus signal with name "fail" and dictionary containing
466 * "msg field with fail message number (int32) as arguments
468 void wpas_dbus_signal_wps_event_fail(struct wpa_supplicant *wpa_s,
469 struct wps_event_fail *fail)
473 DBusMessageIter iter, dict_iter;
474 struct wpas_dbus_priv *iface;
477 iface = wpa_s->global->dbus;
479 /* Do nothing if the control interface is not turned on */
483 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
484 WPAS_DBUS_NEW_IFACE_WPS, "Event");
488 dbus_message_iter_init_append(msg, &iter);
490 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key) ||
491 !wpa_dbus_dict_open_write(&iter, &dict_iter) ||
492 !wpa_dbus_dict_append_int32(&dict_iter, "msg", fail->msg) ||
493 !wpa_dbus_dict_close_write(&iter, &dict_iter))
494 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
496 dbus_connection_send(iface->con, msg, NULL);
498 dbus_message_unref(msg);
503 * wpas_dbus_signal_wps_event_m2d - Signals M2D WPS event
504 * @wpa_s: %wpa_supplicant network interface data
506 * Sends Event dbus signal with name "m2d" and dictionary containing
507 * fields of wps_event_m2d structure.
509 void wpas_dbus_signal_wps_event_m2d(struct wpa_supplicant *wpa_s,
510 struct wps_event_m2d *m2d)
514 DBusMessageIter iter, dict_iter;
515 struct wpas_dbus_priv *iface;
518 iface = wpa_s->global->dbus;
520 /* Do nothing if the control interface is not turned on */
524 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
525 WPAS_DBUS_NEW_IFACE_WPS, "Event");
529 dbus_message_iter_init_append(msg, &iter);
531 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key) ||
532 !wpa_dbus_dict_open_write(&iter, &dict_iter) ||
533 !wpa_dbus_dict_append_uint16(&dict_iter, "config_methods",
534 m2d->config_methods) ||
535 !wpa_dbus_dict_append_byte_array(&dict_iter, "manufacturer",
536 (const char *) m2d->manufacturer,
537 m2d->manufacturer_len) ||
538 !wpa_dbus_dict_append_byte_array(&dict_iter, "model_name",
539 (const char *) m2d->model_name,
540 m2d->model_name_len) ||
541 !wpa_dbus_dict_append_byte_array(&dict_iter, "model_number",
542 (const char *) m2d->model_number,
543 m2d->model_number_len) ||
544 !wpa_dbus_dict_append_byte_array(&dict_iter, "serial_number",
547 m2d->serial_number_len) ||
548 !wpa_dbus_dict_append_byte_array(&dict_iter, "dev_name",
549 (const char *) m2d->dev_name,
550 m2d->dev_name_len) ||
551 !wpa_dbus_dict_append_byte_array(&dict_iter, "primary_dev_type",
553 m2d->primary_dev_type, 8) ||
554 !wpa_dbus_dict_append_uint16(&dict_iter, "config_error",
555 m2d->config_error) ||
556 !wpa_dbus_dict_append_uint16(&dict_iter, "dev_password_id",
557 m2d->dev_password_id) ||
558 !wpa_dbus_dict_close_write(&iter, &dict_iter))
559 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
561 dbus_connection_send(iface->con, msg, NULL);
563 dbus_message_unref(msg);
568 * wpas_dbus_signal_wps_cred - Signals new credentials
569 * @wpa_s: %wpa_supplicant network interface data
571 * Sends signal with credentials in directory argument
573 void wpas_dbus_signal_wps_cred(struct wpa_supplicant *wpa_s,
574 const struct wps_credential *cred)
577 DBusMessageIter iter, dict_iter;
578 struct wpas_dbus_priv *iface;
579 char *auth_type[6]; /* we have six possible authorization types */
581 char *encr_type[4]; /* we have four possible encryption types */
584 iface = wpa_s->global->dbus;
586 /* Do nothing if the control interface is not turned on */
590 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
591 WPAS_DBUS_NEW_IFACE_WPS,
596 dbus_message_iter_init_append(msg, &iter);
597 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
600 if (cred->auth_type & WPS_AUTH_OPEN)
601 auth_type[at_num++] = "open";
602 if (cred->auth_type & WPS_AUTH_WPAPSK)
603 auth_type[at_num++] = "wpa-psk";
604 if (cred->auth_type & WPS_AUTH_SHARED)
605 auth_type[at_num++] = "shared";
606 if (cred->auth_type & WPS_AUTH_WPA)
607 auth_type[at_num++] = "wpa-eap";
608 if (cred->auth_type & WPS_AUTH_WPA2)
609 auth_type[at_num++] = "wpa2-eap";
610 if (cred->auth_type & WPS_AUTH_WPA2PSK)
611 auth_type[at_num++] =
614 if (cred->encr_type & WPS_ENCR_NONE)
615 encr_type[et_num++] = "none";
616 if (cred->encr_type & WPS_ENCR_WEP)
617 encr_type[et_num++] = "wep";
618 if (cred->encr_type & WPS_ENCR_TKIP)
619 encr_type[et_num++] = "tkip";
620 if (cred->encr_type & WPS_ENCR_AES)
621 encr_type[et_num++] = "aes";
623 if (wpa_s->current_ssid) {
624 if (!wpa_dbus_dict_append_byte_array(
626 (const char *) wpa_s->current_ssid->bssid,
631 if (!wpa_dbus_dict_append_byte_array(&dict_iter, "SSID",
632 (const char *) cred->ssid,
634 !wpa_dbus_dict_append_string_array(&dict_iter, "AuthType",
635 (const char **) auth_type,
637 !wpa_dbus_dict_append_string_array(&dict_iter, "EncrType",
638 (const char **) encr_type,
640 !wpa_dbus_dict_append_byte_array(&dict_iter, "Key",
641 (const char *) cred->key,
643 !wpa_dbus_dict_append_uint32(&dict_iter, "KeyIndex",
645 !wpa_dbus_dict_close_write(&iter, &dict_iter))
648 dbus_connection_send(iface->con, msg, NULL);
651 dbus_message_unref(msg);
654 #endif /* CONFIG_WPS */
659 * wpas_dbus_signal_p2p_group_removed - Signals P2P group was removed
660 * @wpa_s: %wpa_supplicant network interface data
661 * @role: role of this device (client or GO)
662 * Sends signal with i/f name and role as string arguments
664 void wpas_dbus_signal_p2p_group_removed(struct wpa_supplicant *wpa_s,
669 DBusMessageIter iter;
670 struct wpas_dbus_priv *iface = wpa_s->global->dbus;
671 char *ifname = wpa_s->ifname;
673 /* Do nothing if the control interface is not turned on */
677 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
678 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
683 dbus_message_iter_init_append(msg, &iter);
685 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &ifname)) {
686 wpa_printf(MSG_ERROR, "dbus: Failed to construct GroupFinished"
687 "signal -not enough memory for ifname ");
691 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &role))
692 wpa_printf(MSG_ERROR, "dbus: Failed to construct GroupFinished"
693 "signal -not enough memory for role ");
695 dbus_connection_send(iface->con, msg, NULL);
698 dbus_message_unref(msg);
703 * wpas_dbus_signal_p2p_provision_discovery - Signals various PD events
705 * @dev_addr - who sent the request or responded to our request.
706 * @request - Will be 1 if request, 0 for response.
707 * @status - valid only in case of response
708 * @config_methods - wps config methods
709 * @generated_pin - pin to be displayed in case of WPS_CONFIG_DISPLAY method
711 * Sends following provision discovery related events:
712 * ProvisionDiscoveryRequestDisplayPin
713 * ProvisionDiscoveryResponseDisplayPin
714 * ProvisionDiscoveryRequestEnterPin
715 * ProvisionDiscoveryResponseEnterPin
716 * ProvisionDiscoveryPBCRequest
717 * ProvisionDiscoveryPBCResponse
720 * ProvisionDiscoveryFailure (timeout case)
722 void wpas_dbus_signal_p2p_provision_discovery(struct wpa_supplicant *wpa_s,
723 const u8 *dev_addr, int request,
724 enum p2p_prov_disc_status status,
726 unsigned int generated_pin)
729 DBusMessageIter iter;
730 struct wpas_dbus_priv *iface;
733 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
735 char pin[9], *p_pin = NULL;
737 iface = wpa_s->global->dbus;
739 /* Do nothing if the control interface is not turned on */
743 if (request || !status) {
744 if (config_methods & WPS_CONFIG_DISPLAY)
746 "ProvisionDiscoveryRequestDisplayPin" :
747 "ProvisionDiscoveryResponseEnterPin";
748 else if (config_methods & WPS_CONFIG_KEYPAD)
750 "ProvisionDiscoveryRequestEnterPin" :
751 "ProvisionDiscoveryResponseDisplayPin";
752 else if (config_methods & WPS_CONFIG_PUSHBUTTON)
753 _signal = request ? "ProvisionDiscoveryPBCRequest" :
754 "ProvisionDiscoveryPBCResponse";
756 return; /* Unknown or un-supported method */
757 } else if (!request && status)
758 /* Explicit check for failure response */
759 _signal = "ProvisionDiscoveryFailure";
761 add_pin = ((request && (config_methods & WPS_CONFIG_DISPLAY)) ||
762 (!request && !status &&
763 (config_methods & WPS_CONFIG_KEYPAD)));
766 os_snprintf(pin, sizeof(pin), "%08d", generated_pin);
770 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
771 WPAS_DBUS_NEW_IFACE_P2PDEVICE, _signal);
775 /* Check if this is a known peer */
776 if (p2p_get_peer_info(wpa_s->global->p2p, dev_addr, 0, NULL, 0) < 0)
779 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
780 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/"
782 wpa_s->dbus_new_path, MAC2STR(dev_addr));
784 path = peer_obj_path;
786 dbus_message_iter_init_append(msg, &iter);
788 if (!dbus_message_iter_append_basic(&iter,
789 DBUS_TYPE_OBJECT_PATH,
793 if (!request && status)
794 /* Attach status to ProvisionDiscoveryFailure */
795 error_ret = !dbus_message_iter_append_basic(&iter,
799 error_ret = (add_pin &&
800 !dbus_message_iter_append_basic(&iter,
806 dbus_connection_send(iface->con, msg, NULL);
808 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
810 dbus_message_unref(msg);
814 void wpas_dbus_signal_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
815 const u8 *src, u16 dev_passwd_id)
818 DBusMessageIter iter;
819 struct wpas_dbus_priv *iface;
820 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
822 iface = wpa_s->global->dbus;
824 /* Do nothing if the control interface is not turned on */
828 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
829 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
830 wpa_s->dbus_new_path, MAC2STR(src));
831 path = peer_obj_path;
833 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
834 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
835 "GONegotiationRequest");
839 dbus_message_iter_init_append(msg, &iter);
841 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
843 !dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT16,
845 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
847 dbus_connection_send(iface->con, msg, NULL);
849 dbus_message_unref(msg);
853 static int wpas_dbus_get_group_obj_path(struct wpa_supplicant *wpa_s,
854 const struct wpa_ssid *ssid,
855 char *group_obj_path)
859 if (os_memcmp(ssid->ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN))
862 memcpy(group_name, ssid->ssid + P2P_WILDCARD_SSID_LEN, 2);
863 group_name[2] = '\0';
865 os_snprintf(group_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
866 "%s/" WPAS_DBUS_NEW_P2P_GROUPS_PART "/%s",
867 wpa_s->dbus_new_path, group_name);
874 * wpas_dbus_signal_p2p_group_started - Signals P2P group has
875 * started.Emitted when a group is succesfully started
876 * irrespective of the role (client/GO) of the current device
878 * @wpa_s: %wpa_supplicant network interface data
880 * @client: this device is P2P client
881 * @network_id: network id of the group started, use instead of ssid->id
882 * to account for persistent groups
884 void wpas_dbus_signal_p2p_group_started(struct wpa_supplicant *wpa_s,
885 const struct wpa_ssid *ssid,
886 int client, int network_id)
889 DBusMessageIter iter, dict_iter;
890 struct wpas_dbus_priv *iface;
891 char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
892 char group_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
894 iface = wpa_s->parent->global->dbus;
896 /* Do nothing if the control interface is not turned on */
900 if (wpas_dbus_get_group_obj_path(wpa_s, ssid, group_obj_path) < 0)
903 /* New interface has been created for this group */
904 msg = dbus_message_new_signal(wpa_s->parent->dbus_new_path,
905 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
911 dbus_message_iter_init_append(msg, &iter);
912 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
916 * In case the device supports creating a separate interface the
917 * DBus client will need to know the object path for the interface
918 * object this group was created on, so include it here.
920 if (!wpa_dbus_dict_append_object_path(&dict_iter,
922 wpa_s->dbus_new_path))
925 if (!wpa_dbus_dict_append_string(&dict_iter, "role",
926 client ? "client" : "GO"))
929 os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
930 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
931 wpa_s->parent->dbus_new_path, network_id);
933 if (!wpa_dbus_dict_append_object_path(&dict_iter, "group_object",
935 !wpa_dbus_dict_append_object_path(&dict_iter, "network_object",
937 !wpa_dbus_dict_close_write(&iter, &dict_iter))
940 dbus_connection_send(iface->con, msg, NULL);
943 dbus_message_unref(msg);
949 * Method to emit GONeogtiation Success or Failure signals based
951 * @status: Status of the GO neg request. 0 for success, other for errors.
953 void wpas_dbus_signal_p2p_go_neg_resp(struct wpa_supplicant *wpa_s, int status)
956 DBusMessageIter iter;
957 struct wpas_dbus_priv *iface;
959 iface = wpa_s->global->dbus;
961 /* Do nothing if the control interface is not turned on */
965 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
966 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
967 status ? "GONegotiationFailure" :
968 "GONegotiationSuccess");
973 dbus_message_iter_init_append(msg, &iter);
974 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32,
976 wpa_printf(MSG_ERROR,
977 "dbus: Failed to construct signal");
982 dbus_connection_send(iface->con, msg, NULL);
984 dbus_message_unref(msg);
990 * Method to emit Invitation Result signal based on status and
992 * @status: Status of the Invite request. 0 for success, other
994 * @bssid : Basic Service Set Identifier
996 void wpas_dbus_signal_p2p_invitation_result(struct wpa_supplicant *wpa_s,
997 int status, const u8 *bssid)
1000 DBusMessageIter iter, dict_iter;
1001 struct wpas_dbus_priv *iface;
1003 wpa_printf(MSG_INFO, "%s\n", __func__);
1005 iface = wpa_s->global->dbus;
1006 /* Do nothing if the control interface is not turned on */
1010 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
1011 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1012 "InvitationResult");
1017 dbus_message_iter_init_append(msg, &iter);
1018 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
1021 if (!wpa_dbus_dict_append_int32(&dict_iter, "status", status))
1024 if (!wpa_dbus_dict_append_byte_array(&dict_iter, "BSSID",
1025 (const char *) bssid,
1029 if (!wpa_dbus_dict_close_write(&iter, &dict_iter))
1032 dbus_connection_send(iface->con, msg, NULL);
1035 dbus_message_unref(msg);
1041 * Method to emit a signal for a peer joining the group.
1042 * The signal will carry path to the group member object
1043 * constructed using p2p i/f addr used for connecting.
1045 * @wpa_s: %wpa_supplicant network interface data
1046 * @member_addr: addr (p2p i/f) of the peer joining the group
1048 void wpas_dbus_signal_p2p_peer_joined(struct wpa_supplicant *wpa_s,
1051 struct wpas_dbus_priv *iface;
1053 DBusMessageIter iter;
1054 char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
1056 iface = wpa_s->global->dbus;
1058 /* Do nothing if the control interface is not turned on */
1062 if (!wpa_s->dbus_groupobj_path)
1065 os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1066 "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/"
1068 wpa_s->dbus_groupobj_path, MAC2STR(member));
1070 msg = dbus_message_new_signal(wpa_s->dbus_groupobj_path,
1071 WPAS_DBUS_NEW_IFACE_P2P_GROUP,
1076 dbus_message_iter_init_append(msg, &iter);
1077 path = groupmember_obj_path;
1078 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
1082 dbus_connection_send(iface->con, msg, NULL);
1084 dbus_message_unref(msg);
1088 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
1089 dbus_message_unref(msg);
1095 * Method to emit a signal for a peer disconnecting the group.
1096 * The signal will carry path to the group member object
1097 * constructed using p2p i/f addr used for connecting.
1099 * @wpa_s: %wpa_supplicant network interface data
1100 * @member_addr: addr (p2p i/f) of the peer joining the group
1102 void wpas_dbus_signal_p2p_peer_disconnected(struct wpa_supplicant *wpa_s,
1105 struct wpas_dbus_priv *iface;
1107 DBusMessageIter iter;
1108 char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
1110 iface = wpa_s->global->dbus;
1112 /* Do nothing if the control interface is not turned on */
1116 if (!wpa_s->dbus_groupobj_path)
1119 os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1120 "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/"
1122 wpa_s->dbus_groupobj_path, MAC2STR(member));
1124 msg = dbus_message_new_signal(wpa_s->dbus_groupobj_path,
1125 WPAS_DBUS_NEW_IFACE_P2P_GROUP,
1126 "PeerDisconnected");
1130 dbus_message_iter_init_append(msg, &iter);
1131 path = groupmember_obj_path;
1132 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
1136 dbus_connection_send(iface->con, msg, NULL);
1138 dbus_message_unref(msg);
1142 wpa_printf(MSG_ERROR, "dbus: Failed to construct PeerDisconnected "
1144 dbus_message_unref(msg);
1150 * Method to emit a signal for a service discovery request.
1151 * The signal will carry station address, frequency, dialog token,
1152 * update indicator and it tlvs
1154 * @wpa_s: %wpa_supplicant network interface data
1155 * @sa: station addr (p2p i/f) of the peer
1156 * @dialog_token: service discovery request dialog token
1157 * @update_indic: service discovery request update indicator
1158 * @tlvs: service discovery request genrated byte array of tlvs
1159 * @tlvs_len: service discovery request tlvs length
1161 void wpas_dbus_signal_p2p_sd_request(struct wpa_supplicant *wpa_s,
1162 int freq, const u8 *sa, u8 dialog_token,
1163 u16 update_indic, const u8 *tlvs,
1167 DBusMessageIter iter, dict_iter;
1168 struct wpas_dbus_priv *iface;
1169 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
1170 iface = wpa_s->global->dbus;
1172 /* Do nothing if the control interface is not turned on */
1176 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
1177 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1178 "ServiceDiscoveryRequest");
1182 /* Check if this is a known peer */
1183 if (p2p_get_peer_info(wpa_s->global->p2p, sa, 0, NULL, 0) < 0)
1186 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1187 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/"
1188 COMPACT_MACSTR, wpa_s->dbus_new_path, MAC2STR(sa));
1190 path = peer_obj_path;
1192 dbus_message_iter_init_append(msg, &iter);
1193 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
1197 if (!wpa_dbus_dict_append_object_path(&dict_iter, "peer_object",
1199 !wpa_dbus_dict_append_int32(&dict_iter, "frequency", freq) ||
1200 !wpa_dbus_dict_append_int32(&dict_iter, "dialog_token",
1202 !wpa_dbus_dict_append_uint16(&dict_iter, "update_indicator",
1204 !wpa_dbus_dict_append_byte_array(&dict_iter, "tlvs",
1205 (const char *) tlvs,
1207 !wpa_dbus_dict_close_write(&iter, &dict_iter))
1210 dbus_connection_send(iface->con, msg, NULL);
1211 dbus_message_unref(msg);
1214 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
1215 dbus_message_unref(msg);
1221 * Method to emit a signal for a service discovery response.
1222 * The signal will carry station address, update indicator and it
1225 * @wpa_s: %wpa_supplicant network interface data
1226 * @sa: station addr (p2p i/f) of the peer
1227 * @update_indic: service discovery request update indicator
1228 * @tlvs: service discovery request genrated byte array of tlvs
1229 * @tlvs_len: service discovery request tlvs length
1231 void wpas_dbus_signal_p2p_sd_response(struct wpa_supplicant *wpa_s,
1232 const u8 *sa, u16 update_indic,
1233 const u8 *tlvs, size_t tlvs_len)
1236 DBusMessageIter iter, dict_iter;
1237 struct wpas_dbus_priv *iface;
1238 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
1239 iface = wpa_s->global->dbus;
1241 /* Do nothing if the control interface is not turned on */
1245 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
1246 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1247 "ServiceDiscoveryResponse");
1251 /* Check if this is a known peer */
1252 if (p2p_get_peer_info(wpa_s->global->p2p, sa, 0, NULL, 0) < 0)
1255 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1256 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/"
1257 COMPACT_MACSTR, wpa_s->dbus_new_path, MAC2STR(sa));
1259 path = peer_obj_path;
1261 dbus_message_iter_init_append(msg, &iter);
1262 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
1265 if (!wpa_dbus_dict_append_object_path(&dict_iter, "peer_object",
1267 !wpa_dbus_dict_append_uint16(&dict_iter, "update_indicator",
1269 !wpa_dbus_dict_append_byte_array(&dict_iter, "tlvs",
1270 (const char *) tlvs,
1272 !wpa_dbus_dict_close_write(&iter, &dict_iter))
1276 dbus_connection_send(iface->con, msg, NULL);
1277 dbus_message_unref(msg);
1280 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
1281 dbus_message_unref(msg);
1285 * wpas_dbus_signal_persistent_group - Send a persistent group related
1287 * @wpa_s: %wpa_supplicant network interface data
1288 * @id: new persistent group id
1289 * @sig_name: signal name - PersistentGroupAdded, PersistentGroupRemoved
1290 * @properties: determines if add second argument with object properties
1292 * Notify listeners about an event related to persistent groups.
1294 static void wpas_dbus_signal_persistent_group(struct wpa_supplicant *wpa_s,
1295 int id, const char *sig_name,
1298 struct wpas_dbus_priv *iface;
1300 DBusMessageIter iter, iter_dict;
1301 char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
1303 iface = wpa_s->global->dbus;
1305 /* Do nothing if the control interface is not turned on */
1309 os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1310 "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
1311 wpa_s->dbus_new_path, id);
1313 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
1314 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1319 dbus_message_iter_init_append(msg, &iter);
1320 path = pgrp_obj_path;
1321 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
1326 if (!wpa_dbus_dict_open_write(&iter, &iter_dict))
1329 wpa_dbus_get_object_properties(
1330 iface, pgrp_obj_path,
1331 WPAS_DBUS_NEW_IFACE_PERSISTENT_GROUP,
1334 if (!wpa_dbus_dict_close_write(&iter, &iter_dict))
1338 dbus_connection_send(iface->con, msg, NULL);
1340 dbus_message_unref(msg);
1344 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
1345 dbus_message_unref(msg);
1350 * wpas_dbus_signal_persistent_group_added - Send a persistent_group
1352 * @wpa_s: %wpa_supplicant network interface data
1353 * @id: new persistent group id
1355 * Notify listeners about addition of a new persistent group.
1357 static void wpas_dbus_signal_persistent_group_added(
1358 struct wpa_supplicant *wpa_s, int id)
1360 wpas_dbus_signal_persistent_group(wpa_s, id, "PersistentGroupAdded",
1366 * wpas_dbus_signal_persistent_group_removed - Send a persistent_group
1368 * @wpa_s: %wpa_supplicant network interface data
1369 * @id: persistent group id
1371 * Notify listeners about removal of a persistent group.
1373 static void wpas_dbus_signal_persistent_group_removed(
1374 struct wpa_supplicant *wpa_s, int id)
1376 wpas_dbus_signal_persistent_group(wpa_s, id, "PersistentGroupRemoved",
1380 #endif /*CONFIG_P2P*/
1384 * wpas_dbus_signal_prop_changed - Signals change of property
1385 * @wpa_s: %wpa_supplicant network interface data
1386 * @property: indicates which property has changed
1388 * Sends PropertyChanged signals with path, interface and arguments
1389 * depending on which property has changed.
1391 void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
1392 enum wpas_dbus_prop property)
1394 WPADBusPropertyAccessor getter;
1397 if (wpa_s->dbus_new_path == NULL)
1398 return; /* Skip signal since D-Bus setup is not yet ready */
1401 case WPAS_DBUS_PROP_AP_SCAN:
1402 getter = (WPADBusPropertyAccessor) wpas_dbus_getter_ap_scan;
1405 case WPAS_DBUS_PROP_SCANNING:
1406 getter = (WPADBusPropertyAccessor) wpas_dbus_getter_scanning;
1409 case WPAS_DBUS_PROP_STATE:
1410 getter = (WPADBusPropertyAccessor) wpas_dbus_getter_state;
1413 case WPAS_DBUS_PROP_CURRENT_BSS:
1414 getter = (WPADBusPropertyAccessor)
1415 wpas_dbus_getter_current_bss;
1416 prop = "CurrentBSS";
1418 case WPAS_DBUS_PROP_CURRENT_NETWORK:
1419 getter = (WPADBusPropertyAccessor)
1420 wpas_dbus_getter_current_network;
1421 prop = "CurrentNetwork";
1423 case WPAS_DBUS_PROP_BSSS:
1424 getter = (WPADBusPropertyAccessor) wpas_dbus_getter_bsss;
1427 case WPAS_DBUS_PROP_CURRENT_AUTH_MODE:
1428 getter = (WPADBusPropertyAccessor)
1429 wpas_dbus_getter_current_auth_mode;
1430 prop = "CurrentAuthMode";
1433 wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
1434 __func__, property);
1438 wpa_dbus_mark_property_changed(wpa_s->global->dbus,
1439 wpa_s->dbus_new_path,
1440 WPAS_DBUS_NEW_IFACE_INTERFACE, prop);
1445 * wpas_dbus_bss_signal_prop_changed - Signals change of BSS property
1446 * @wpa_s: %wpa_supplicant network interface data
1447 * @property: indicates which property has changed
1448 * @id: unique BSS identifier
1450 * Sends PropertyChanged signals with path, interface, and arguments depending
1451 * on which property has changed.
1453 void wpas_dbus_bss_signal_prop_changed(struct wpa_supplicant *wpa_s,
1454 enum wpas_dbus_bss_prop property,
1457 char path[WPAS_DBUS_OBJECT_PATH_MAX];
1461 case WPAS_DBUS_BSS_PROP_SIGNAL:
1464 case WPAS_DBUS_BSS_PROP_FREQ:
1467 case WPAS_DBUS_BSS_PROP_MODE:
1470 case WPAS_DBUS_BSS_PROP_PRIVACY:
1473 case WPAS_DBUS_BSS_PROP_RATES:
1476 case WPAS_DBUS_BSS_PROP_WPA:
1479 case WPAS_DBUS_BSS_PROP_RSN:
1482 case WPAS_DBUS_BSS_PROP_IES:
1486 wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
1487 __func__, property);
1491 os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
1492 "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
1493 wpa_s->dbus_new_path, id);
1495 wpa_dbus_mark_property_changed(wpa_s->global->dbus, path,
1496 WPAS_DBUS_NEW_IFACE_BSS, prop);
1501 * wpas_dbus_signal_debug_level_changed - Signals change of debug param
1502 * @global: wpa_global structure
1504 * Sends PropertyChanged signals informing that debug level has changed.
1506 void wpas_dbus_signal_debug_level_changed(struct wpa_global *global)
1508 wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
1509 WPAS_DBUS_NEW_INTERFACE,
1515 * wpas_dbus_signal_debug_timestamp_changed - Signals change of debug param
1516 * @global: wpa_global structure
1518 * Sends PropertyChanged signals informing that debug timestamp has changed.
1520 void wpas_dbus_signal_debug_timestamp_changed(struct wpa_global *global)
1522 wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
1523 WPAS_DBUS_NEW_INTERFACE,
1529 * wpas_dbus_signal_debug_show_keys_changed - Signals change of debug param
1530 * @global: wpa_global structure
1532 * Sends PropertyChanged signals informing that debug show_keys has changed.
1534 void wpas_dbus_signal_debug_show_keys_changed(struct wpa_global *global)
1536 wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
1537 WPAS_DBUS_NEW_INTERFACE,
1542 static void wpas_dbus_register(struct wpa_dbus_object_desc *obj_desc,
1544 WPADBusArgumentFreeFunction priv_free,
1545 const struct wpa_dbus_method_desc *methods,
1546 const struct wpa_dbus_property_desc *properties,
1547 const struct wpa_dbus_signal_desc *signals)
1551 obj_desc->user_data = priv;
1552 obj_desc->user_data_free_func = priv_free;
1553 obj_desc->methods = methods;
1554 obj_desc->properties = properties;
1555 obj_desc->signals = signals;
1557 for (n = 0; properties && properties->dbus_property; properties++)
1560 obj_desc->prop_changed_flags = os_zalloc(n);
1561 if (!obj_desc->prop_changed_flags)
1562 wpa_printf(MSG_DEBUG, "dbus: %s: can't register handlers",
1567 static const struct wpa_dbus_method_desc wpas_dbus_global_methods[] = {
1568 { "CreateInterface", WPAS_DBUS_NEW_INTERFACE,
1569 (WPADBusMethodHandler) &wpas_dbus_handler_create_interface,
1571 { "args", "a{sv}", ARG_IN },
1572 { "path", "o", ARG_OUT },
1576 { "RemoveInterface", WPAS_DBUS_NEW_INTERFACE,
1577 (WPADBusMethodHandler) &wpas_dbus_handler_remove_interface,
1579 { "path", "o", ARG_IN },
1583 { "GetInterface", WPAS_DBUS_NEW_INTERFACE,
1584 (WPADBusMethodHandler) &wpas_dbus_handler_get_interface,
1586 { "ifname", "s", ARG_IN },
1587 { "path", "o", ARG_OUT },
1591 { NULL, NULL, NULL, { END_ARGS } }
1594 static const struct wpa_dbus_property_desc wpas_dbus_global_properties[] = {
1595 { "DebugLevel", WPAS_DBUS_NEW_INTERFACE, "s",
1596 (WPADBusPropertyAccessor) wpas_dbus_getter_debug_level,
1597 (WPADBusPropertyAccessor) wpas_dbus_setter_debug_level,
1600 { "DebugTimestamp", WPAS_DBUS_NEW_INTERFACE, "b",
1601 (WPADBusPropertyAccessor) wpas_dbus_getter_debug_timestamp,
1602 (WPADBusPropertyAccessor) wpas_dbus_setter_debug_timestamp,
1605 { "DebugShowKeys", WPAS_DBUS_NEW_INTERFACE, "b",
1606 (WPADBusPropertyAccessor) wpas_dbus_getter_debug_show_keys,
1607 (WPADBusPropertyAccessor) wpas_dbus_setter_debug_show_keys,
1610 { "Interfaces", WPAS_DBUS_NEW_INTERFACE, "ao",
1611 (WPADBusPropertyAccessor) &wpas_dbus_getter_interfaces,
1615 { "EapMethods", WPAS_DBUS_NEW_INTERFACE, "as",
1616 (WPADBusPropertyAccessor) wpas_dbus_getter_eap_methods,
1620 { NULL, NULL, NULL, NULL, NULL, 0 }
1623 static const struct wpa_dbus_signal_desc wpas_dbus_global_signals[] = {
1624 { "InterfaceAdded", WPAS_DBUS_NEW_INTERFACE,
1626 { "path", "o", ARG_OUT },
1627 { "properties", "a{sv}", ARG_OUT },
1631 { "InterfaceRemoved", WPAS_DBUS_NEW_INTERFACE,
1633 { "path", "o", ARG_OUT },
1637 { "PropertiesChanged", WPAS_DBUS_NEW_INTERFACE,
1639 { "properties", "a{sv}", ARG_OUT },
1643 { NULL, NULL, { END_ARGS } }
1648 * wpas_dbus_ctrl_iface_init - Initialize dbus control interface
1649 * @global: Pointer to global data from wpa_supplicant_init()
1650 * Returns: 0 on success or -1 on failure
1652 * Initialize the dbus control interface for wpa_supplicantand and start
1653 * receiving commands from external programs over the bus.
1655 int wpas_dbus_ctrl_iface_init(struct wpas_dbus_priv *priv)
1657 struct wpa_dbus_object_desc *obj_desc;
1660 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
1662 wpa_printf(MSG_ERROR, "Not enough memory "
1663 "to create object description");
1667 wpas_dbus_register(obj_desc, priv->global, NULL,
1668 wpas_dbus_global_methods,
1669 wpas_dbus_global_properties,
1670 wpas_dbus_global_signals);
1672 wpa_printf(MSG_DEBUG, "dbus: Register D-Bus object '%s'",
1673 WPAS_DBUS_NEW_PATH);
1674 ret = wpa_dbus_ctrl_iface_init(priv, WPAS_DBUS_NEW_PATH,
1675 WPAS_DBUS_NEW_SERVICE,
1678 free_dbus_object_desc(obj_desc);
1680 priv->dbus_new_initialized = 1;
1687 * wpas_dbus_ctrl_iface_deinit - Deinitialize dbus ctrl interface for
1689 * @iface: Pointer to dbus private data from wpas_dbus_init()
1691 * Deinitialize the dbus control interface that was initialized with
1692 * wpas_dbus_ctrl_iface_init().
1694 void wpas_dbus_ctrl_iface_deinit(struct wpas_dbus_priv *iface)
1696 if (!iface->dbus_new_initialized)
1698 wpa_printf(MSG_DEBUG, "dbus: Unregister D-Bus object '%s'",
1699 WPAS_DBUS_NEW_PATH);
1700 dbus_connection_unregister_object_path(iface->con,
1701 WPAS_DBUS_NEW_PATH);
1705 static void wpa_dbus_free(void *ptr)
1711 static const struct wpa_dbus_property_desc wpas_dbus_network_properties[] = {
1712 { "Properties", WPAS_DBUS_NEW_IFACE_NETWORK, "a{sv}",
1713 (WPADBusPropertyAccessor) wpas_dbus_getter_network_properties,
1714 (WPADBusPropertyAccessor) wpas_dbus_setter_network_properties,
1717 { "Enabled", WPAS_DBUS_NEW_IFACE_NETWORK, "b",
1718 (WPADBusPropertyAccessor) wpas_dbus_getter_enabled,
1719 (WPADBusPropertyAccessor) wpas_dbus_setter_enabled,
1722 { NULL, NULL, NULL, NULL, NULL, 0 }
1726 static const struct wpa_dbus_signal_desc wpas_dbus_network_signals[] = {
1727 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_NETWORK,
1729 { "properties", "a{sv}", ARG_OUT },
1733 { NULL, NULL, { END_ARGS } }
1738 * wpas_dbus_register_network - Register a configured network with dbus
1739 * @wpa_s: wpa_supplicant interface structure
1740 * @ssid: network configuration data
1741 * Returns: 0 on success, -1 on failure
1743 * Registers network representing object with dbus
1745 int wpas_dbus_register_network(struct wpa_supplicant *wpa_s,
1746 struct wpa_ssid *ssid)
1748 struct wpas_dbus_priv *ctrl_iface;
1749 struct wpa_dbus_object_desc *obj_desc;
1750 struct network_handler_args *arg;
1751 char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
1754 * If it is a persistent group register it as such.
1755 * This is to handle cases where an interface is being initialized
1756 * with a list of networks read from config.
1758 if (network_is_persistent_group(ssid))
1759 return wpas_dbus_register_persistent_group(wpa_s, ssid);
1761 /* Do nothing if the control interface is not turned on */
1762 if (wpa_s == NULL || wpa_s->global == NULL)
1764 ctrl_iface = wpa_s->global->dbus;
1765 if (ctrl_iface == NULL)
1768 os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1769 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
1770 wpa_s->dbus_new_path, ssid->id);
1772 wpa_printf(MSG_DEBUG, "dbus: Register network object '%s'",
1774 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
1776 wpa_printf(MSG_ERROR, "Not enough memory "
1777 "to create object description");
1781 /* allocate memory for handlers arguments */
1782 arg = os_zalloc(sizeof(struct network_handler_args));
1784 wpa_printf(MSG_ERROR, "Not enough memory "
1785 "to create arguments for method");
1792 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
1793 wpas_dbus_network_properties,
1794 wpas_dbus_network_signals);
1796 if (wpa_dbus_register_object_per_iface(ctrl_iface, net_obj_path,
1797 wpa_s->ifname, obj_desc))
1800 wpas_dbus_signal_network_added(wpa_s, ssid->id);
1805 free_dbus_object_desc(obj_desc);
1811 * wpas_dbus_unregister_network - Unregister a configured network from dbus
1812 * @wpa_s: wpa_supplicant interface structure
1814 * Returns: 0 on success, -1 on failure
1816 * Unregisters network representing object from dbus
1818 int wpas_dbus_unregister_network(struct wpa_supplicant *wpa_s, int nid)
1820 struct wpas_dbus_priv *ctrl_iface;
1821 char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
1823 struct wpa_ssid *ssid;
1825 ssid = wpa_config_get_network(wpa_s->conf, nid);
1827 /* If it is a persistent group unregister it as such */
1828 if (ssid && network_is_persistent_group(ssid))
1829 return wpas_dbus_unregister_persistent_group(wpa_s, nid);
1831 /* Do nothing if the control interface is not turned on */
1832 if (wpa_s == NULL || wpa_s->global == NULL ||
1833 wpa_s->dbus_new_path == NULL)
1835 ctrl_iface = wpa_s->global->dbus;
1836 if (ctrl_iface == NULL)
1839 os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1840 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
1841 wpa_s->dbus_new_path, nid);
1843 wpa_printf(MSG_DEBUG, "dbus: Unregister network object '%s'",
1845 ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, net_obj_path);
1848 wpas_dbus_signal_network_removed(wpa_s, nid);
1854 static const struct wpa_dbus_property_desc wpas_dbus_bss_properties[] = {
1855 { "SSID", WPAS_DBUS_NEW_IFACE_BSS, "ay",
1856 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_ssid,
1860 { "BSSID", WPAS_DBUS_NEW_IFACE_BSS, "ay",
1861 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_bssid,
1865 { "Privacy", WPAS_DBUS_NEW_IFACE_BSS, "b",
1866 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_privacy,
1870 { "Mode", WPAS_DBUS_NEW_IFACE_BSS, "s",
1871 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_mode,
1875 { "Signal", WPAS_DBUS_NEW_IFACE_BSS, "n",
1876 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_signal,
1880 { "Frequency", WPAS_DBUS_NEW_IFACE_BSS, "q",
1881 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_frequency,
1885 { "Rates", WPAS_DBUS_NEW_IFACE_BSS, "au",
1886 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_rates,
1890 { "WPA", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
1891 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_wpa,
1895 { "RSN", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
1896 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_rsn,
1900 { "IEs", WPAS_DBUS_NEW_IFACE_BSS, "ay",
1901 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_ies,
1905 { NULL, NULL, NULL, NULL, NULL, 0 }
1909 static const struct wpa_dbus_signal_desc wpas_dbus_bss_signals[] = {
1910 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_BSS,
1912 { "properties", "a{sv}", ARG_OUT },
1916 { NULL, NULL, { END_ARGS } }
1921 * wpas_dbus_unregister_bss - Unregister a scanned BSS from dbus
1922 * @wpa_s: wpa_supplicant interface structure
1923 * @bssid: scanned network bssid
1924 * @id: unique BSS identifier
1925 * Returns: 0 on success, -1 on failure
1927 * Unregisters BSS representing object from dbus
1929 int wpas_dbus_unregister_bss(struct wpa_supplicant *wpa_s,
1930 u8 bssid[ETH_ALEN], unsigned int id)
1932 struct wpas_dbus_priv *ctrl_iface;
1933 char bss_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
1935 /* Do nothing if the control interface is not turned on */
1936 if (wpa_s == NULL || wpa_s->global == NULL)
1938 ctrl_iface = wpa_s->global->dbus;
1939 if (ctrl_iface == NULL)
1942 os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1943 "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
1944 wpa_s->dbus_new_path, id);
1946 wpa_printf(MSG_DEBUG, "dbus: Unregister BSS object '%s'",
1948 if (wpa_dbus_unregister_object_per_iface(ctrl_iface, bss_obj_path)) {
1949 wpa_printf(MSG_ERROR, "dbus: Cannot unregister BSS object %s",
1954 wpas_dbus_signal_bss_removed(wpa_s, bss_obj_path);
1955 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_BSSS);
1962 * wpas_dbus_register_bss - Register a scanned BSS with dbus
1963 * @wpa_s: wpa_supplicant interface structure
1964 * @bssid: scanned network bssid
1965 * @id: unique BSS identifier
1966 * Returns: 0 on success, -1 on failure
1968 * Registers BSS representing object with dbus
1970 int wpas_dbus_register_bss(struct wpa_supplicant *wpa_s,
1971 u8 bssid[ETH_ALEN], unsigned int id)
1973 struct wpas_dbus_priv *ctrl_iface;
1974 struct wpa_dbus_object_desc *obj_desc;
1975 char bss_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
1976 struct bss_handler_args *arg;
1978 /* Do nothing if the control interface is not turned on */
1979 if (wpa_s == NULL || wpa_s->global == NULL)
1981 ctrl_iface = wpa_s->global->dbus;
1982 if (ctrl_iface == NULL)
1985 os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1986 "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
1987 wpa_s->dbus_new_path, id);
1989 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
1991 wpa_printf(MSG_ERROR, "Not enough memory "
1992 "to create object description");
1996 arg = os_zalloc(sizeof(struct bss_handler_args));
1998 wpa_printf(MSG_ERROR, "Not enough memory "
1999 "to create arguments for handler");
2005 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
2006 wpas_dbus_bss_properties,
2007 wpas_dbus_bss_signals);
2009 wpa_printf(MSG_DEBUG, "dbus: Register BSS object '%s'",
2011 if (wpa_dbus_register_object_per_iface(ctrl_iface, bss_obj_path,
2012 wpa_s->ifname, obj_desc)) {
2013 wpa_printf(MSG_ERROR,
2014 "Cannot register BSSID dbus object %s.",
2019 wpas_dbus_signal_bss_added(wpa_s, bss_obj_path);
2020 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_BSSS);
2025 free_dbus_object_desc(obj_desc);
2030 static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
2031 { "Scan", WPAS_DBUS_NEW_IFACE_INTERFACE,
2032 (WPADBusMethodHandler) &wpas_dbus_handler_scan,
2034 { "args", "a{sv}", ARG_IN },
2038 { "Disconnect", WPAS_DBUS_NEW_IFACE_INTERFACE,
2039 (WPADBusMethodHandler) &wpas_dbus_handler_disconnect,
2044 { "AddNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
2045 (WPADBusMethodHandler) &wpas_dbus_handler_add_network,
2047 { "args", "a{sv}", ARG_IN },
2048 { "path", "o", ARG_OUT },
2052 { "RemoveNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
2053 (WPADBusMethodHandler) &wpas_dbus_handler_remove_network,
2055 { "path", "o", ARG_IN },
2059 { "RemoveAllNetworks", WPAS_DBUS_NEW_IFACE_INTERFACE,
2060 (WPADBusMethodHandler) &wpas_dbus_handler_remove_all_networks,
2065 { "SelectNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
2066 (WPADBusMethodHandler) &wpas_dbus_handler_select_network,
2068 { "path", "o", ARG_IN },
2072 { "AddBlob", WPAS_DBUS_NEW_IFACE_INTERFACE,
2073 (WPADBusMethodHandler) &wpas_dbus_handler_add_blob,
2075 { "name", "s", ARG_IN },
2076 { "data", "ay", ARG_IN },
2080 { "GetBlob", WPAS_DBUS_NEW_IFACE_INTERFACE,
2081 (WPADBusMethodHandler) &wpas_dbus_handler_get_blob,
2083 { "name", "s", ARG_IN },
2084 { "data", "ay", ARG_OUT },
2088 { "RemoveBlob", WPAS_DBUS_NEW_IFACE_INTERFACE,
2089 (WPADBusMethodHandler) &wpas_dbus_handler_remove_blob,
2091 { "name", "s", ARG_IN },
2096 { "Start", WPAS_DBUS_NEW_IFACE_WPS,
2097 (WPADBusMethodHandler) &wpas_dbus_handler_wps_start,
2099 { "args", "a{sv}", ARG_IN },
2100 { "output", "a{sv}", ARG_OUT },
2104 #endif /* CONFIG_WPS */
2106 { "Find", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2107 (WPADBusMethodHandler)wpas_dbus_handler_p2p_find,
2109 { "args", "a{sv}", ARG_IN },
2113 { "StopFind", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2114 (WPADBusMethodHandler)wpas_dbus_handler_p2p_stop_find,
2119 { "Listen", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2120 (WPADBusMethodHandler)wpas_dbus_handler_p2p_listen,
2122 { "timeout", "i", ARG_IN },
2126 { "ExtendedListen", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2127 (WPADBusMethodHandler)wpas_dbus_handler_p2p_extendedlisten,
2129 { "args", "a{sv}", ARG_IN },
2133 { "PresenceRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2134 (WPADBusMethodHandler)wpas_dbus_handler_p2p_presence_request,
2136 { "args", "a{sv}", ARG_IN },
2140 { "ProvisionDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2141 (WPADBusMethodHandler)wpas_dbus_handler_p2p_prov_disc_req,
2143 { "peer", "o", ARG_IN },
2144 { "config_method", "s", ARG_IN },
2148 { "Connect", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2149 (WPADBusMethodHandler)wpas_dbus_handler_p2p_connect,
2151 { "args", "a{sv}", ARG_IN },
2152 { "generated_pin", "i", ARG_OUT },
2156 { "GroupAdd", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2157 (WPADBusMethodHandler)wpas_dbus_handler_p2p_group_add,
2159 { "args", "a{sv}", ARG_IN },
2163 { "Invite", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2164 (WPADBusMethodHandler)wpas_dbus_handler_p2p_invite,
2166 { "args", "a{sv}", ARG_IN },
2170 { "Disconnect", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2171 (WPADBusMethodHandler)wpas_dbus_handler_p2p_disconnect,
2176 { "RejectPeer", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2177 (WPADBusMethodHandler)wpas_dbus_handler_p2p_rejectpeer,
2179 { "peer", "o", ARG_IN },
2183 { "Flush", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2184 (WPADBusMethodHandler)wpas_dbus_handler_p2p_flush,
2189 { "AddService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2190 (WPADBusMethodHandler)wpas_dbus_handler_p2p_add_service,
2192 { "args", "a{sv}", ARG_IN },
2196 { "DeleteService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2197 (WPADBusMethodHandler)wpas_dbus_handler_p2p_delete_service,
2199 { "args", "a{sv}", ARG_IN },
2203 { "FlushService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2204 (WPADBusMethodHandler)wpas_dbus_handler_p2p_flush_service,
2209 { "ServiceDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2210 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_req,
2212 { "args", "a{sv}", ARG_IN },
2216 { "ServiceDiscoveryResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2217 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_res,
2219 { "args", "a{sv}", ARG_IN },
2223 { "ServiceDiscoveryCancelRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2224 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_cancel_req,
2226 { "args", "t", ARG_IN },
2230 { "ServiceUpdate", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2231 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_update,
2236 { "ServiceDiscoveryExternal", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2237 (WPADBusMethodHandler)wpas_dbus_handler_p2p_serv_disc_external,
2239 { "arg", "i", ARG_IN },
2243 { "ServiceDiscoveryExternal", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2244 (WPADBusMethodHandler)wpas_dbus_handler_p2p_serv_disc_external,
2246 { "arg", "i", ARG_IN },
2250 #endif /* CONFIG_P2P */
2251 { "FlushBSS", WPAS_DBUS_NEW_IFACE_INTERFACE,
2252 (WPADBusMethodHandler) &wpas_dbus_handler_flush_bss,
2254 { "age", "u", ARG_IN },
2258 { NULL, NULL, NULL, { END_ARGS } }
2261 static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = {
2262 { "Capabilities", WPAS_DBUS_NEW_IFACE_INTERFACE, "a{sv}",
2263 (WPADBusPropertyAccessor) wpas_dbus_getter_capabilities,
2266 { "State", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2267 (WPADBusPropertyAccessor) wpas_dbus_getter_state,
2270 { "Scanning", WPAS_DBUS_NEW_IFACE_INTERFACE, "b",
2271 (WPADBusPropertyAccessor) wpas_dbus_getter_scanning,
2274 { "ApScan", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
2275 (WPADBusPropertyAccessor) wpas_dbus_getter_ap_scan,
2276 (WPADBusPropertyAccessor) wpas_dbus_setter_ap_scan,
2279 { "BSSExpireAge", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
2280 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_expire_age,
2281 (WPADBusPropertyAccessor) wpas_dbus_setter_bss_expire_age,
2284 { "BSSExpireCount", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
2285 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_expire_count,
2286 (WPADBusPropertyAccessor) wpas_dbus_setter_bss_expire_count,
2289 { "Country", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2290 (WPADBusPropertyAccessor) wpas_dbus_getter_country,
2291 (WPADBusPropertyAccessor) wpas_dbus_setter_country,
2294 { "Ifname", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2295 (WPADBusPropertyAccessor) wpas_dbus_getter_ifname,
2298 { "Driver", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2299 (WPADBusPropertyAccessor) wpas_dbus_getter_driver,
2302 { "BridgeIfname", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2303 (WPADBusPropertyAccessor) wpas_dbus_getter_bridge_ifname,
2306 { "CurrentBSS", WPAS_DBUS_NEW_IFACE_INTERFACE, "o",
2307 (WPADBusPropertyAccessor) wpas_dbus_getter_current_bss,
2310 { "CurrentNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE, "o",
2311 (WPADBusPropertyAccessor) wpas_dbus_getter_current_network,
2314 { "CurrentAuthMode", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2315 (WPADBusPropertyAccessor) wpas_dbus_getter_current_auth_mode,
2318 { "Blobs", WPAS_DBUS_NEW_IFACE_INTERFACE, "a{say}",
2319 (WPADBusPropertyAccessor) wpas_dbus_getter_blobs,
2322 { "BSSs", WPAS_DBUS_NEW_IFACE_INTERFACE, "ao",
2323 (WPADBusPropertyAccessor) wpas_dbus_getter_bsss,
2326 { "Networks", WPAS_DBUS_NEW_IFACE_INTERFACE, "ao",
2327 (WPADBusPropertyAccessor) wpas_dbus_getter_networks,
2331 { "ProcessCredentials", WPAS_DBUS_NEW_IFACE_WPS, "b",
2332 (WPADBusPropertyAccessor) wpas_dbus_getter_process_credentials,
2333 (WPADBusPropertyAccessor) wpas_dbus_setter_process_credentials,
2336 #endif /* CONFIG_WPS */
2338 { "P2PDeviceProperties", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "a{sv}",
2339 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_device_properties,
2340 (WPADBusPropertyAccessor) wpas_dbus_setter_p2p_device_properties,
2343 { "Peers", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ao",
2344 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_peers,
2347 { "Role", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "s",
2348 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_role,
2351 { "Group", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "o",
2352 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_group,
2355 { "PeerGO", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "o",
2356 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_peergo,
2359 { "PersistentGroups", WPAS_DBUS_NEW_IFACE_INTERFACE, "ao",
2360 (WPADBusPropertyAccessor) wpas_dbus_getter_persistent_groups,
2363 #endif /* CONFIG_P2P */
2364 { NULL, NULL, NULL, NULL, NULL, 0 }
2367 static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
2368 { "ScanDone", WPAS_DBUS_NEW_IFACE_INTERFACE,
2370 { "success", "b", ARG_OUT },
2374 { "BSSAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
2376 { "path", "o", ARG_OUT },
2377 { "properties", "a{sv}", ARG_OUT },
2381 { "BSSRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE,
2383 { "path", "o", ARG_OUT },
2387 { "BlobAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
2389 { "name", "s", ARG_OUT },
2393 { "BlobRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE,
2395 { "name", "s", ARG_OUT },
2399 { "NetworkAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
2401 { "path", "o", ARG_OUT },
2402 { "properties", "a{sv}", ARG_OUT },
2406 { "NetworkRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE,
2408 { "path", "o", ARG_OUT },
2412 { "NetworkSelected", WPAS_DBUS_NEW_IFACE_INTERFACE,
2414 { "path", "o", ARG_OUT },
2418 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_INTERFACE,
2420 { "properties", "a{sv}", ARG_OUT },
2425 { "Event", WPAS_DBUS_NEW_IFACE_WPS,
2427 { "name", "s", ARG_OUT },
2428 { "args", "a{sv}", ARG_OUT },
2432 { "Credentials", WPAS_DBUS_NEW_IFACE_WPS,
2434 { "credentials", "a{sv}", ARG_OUT },
2438 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_WPS,
2440 { "properties", "a{sv}", ARG_OUT },
2444 #endif /* CONFIG_WPS */
2446 { "P2PStateChanged", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2448 { "states", "a{ss}", ARG_OUT },
2452 { "DeviceFound", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2454 { "path", "o", ARG_OUT },
2455 { "properties", "a{sv}", ARG_OUT },
2459 { "DeviceLost", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2461 { "path", "o", ARG_OUT },
2465 { "ProvisionDiscoveryRequestDisplayPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2467 { "peer_object", "o", ARG_OUT },
2468 { "pin", "s", ARG_OUT },
2472 { "ProvisionDiscoveryResponseDisplayPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2474 { "peer_object", "o", ARG_OUT },
2475 { "pin", "s", ARG_OUT },
2479 { "ProvisionDiscoveryRequestEnterPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2481 { "peer_object", "o", ARG_OUT },
2485 { "ProvisionDiscoveryResponseEnterPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2487 { "peer_object", "o", ARG_OUT },
2491 { "ProvisionDiscoveryPBCRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2493 { "peer_object", "o", ARG_OUT },
2497 { "ProvisionDiscoveryPBCResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2499 { "peer_object", "o", ARG_OUT },
2503 { "ProvisionDiscoveryFailure", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2505 { "peer_object", "o", ARG_OUT },
2506 { "status", "i", ARG_OUT },
2510 { "GroupStarted", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2512 { "properties", "a{sv}", ARG_OUT },
2516 { "GONegotiationSuccess", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2521 { "GONegotiationFailure", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2523 { "status", "i", ARG_OUT },
2527 { "GONegotiationRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2529 { "path", "o", ARG_OUT },
2530 { "dev_passwd_id", "i", ARG_OUT },
2534 { "InvitationResult", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2536 { "invite_result", "a{sv}", ARG_OUT },
2540 { "GroupFinished", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2542 { "ifname", "s", ARG_OUT },
2543 { "role", "s", ARG_OUT },
2547 { "ServiceDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2549 { "sd_request", "a{sv}", ARG_OUT },
2553 { "ServiceDiscoveryResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2555 { "sd_response", "a{sv}", ARG_OUT },
2559 { "PersistentGroupAdded", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2561 { "path", "o", ARG_OUT },
2562 { "properties", "a{sv}", ARG_OUT },
2566 #endif /* CONFIG_P2P */
2567 { NULL, NULL, { END_ARGS } }
2571 int wpas_dbus_register_interface(struct wpa_supplicant *wpa_s)
2574 struct wpa_dbus_object_desc *obj_desc = NULL;
2575 struct wpas_dbus_priv *ctrl_iface = wpa_s->global->dbus;
2578 /* Do nothing if the control interface is not turned on */
2579 if (ctrl_iface == NULL)
2582 /* Create and set the interface's object path */
2583 wpa_s->dbus_new_path = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
2584 if (wpa_s->dbus_new_path == NULL)
2586 next = ctrl_iface->next_objid++;
2587 os_snprintf(wpa_s->dbus_new_path, WPAS_DBUS_OBJECT_PATH_MAX,
2588 WPAS_DBUS_NEW_PATH_INTERFACES "/%u",
2591 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
2593 wpa_printf(MSG_ERROR, "Not enough memory "
2594 "to create object description");
2598 wpas_dbus_register(obj_desc, wpa_s, NULL, wpas_dbus_interface_methods,
2599 wpas_dbus_interface_properties,
2600 wpas_dbus_interface_signals);
2602 wpa_printf(MSG_DEBUG, "dbus: Register interface object '%s'",
2603 wpa_s->dbus_new_path);
2604 if (wpa_dbus_register_object_per_iface(ctrl_iface,
2605 wpa_s->dbus_new_path,
2606 wpa_s->ifname, obj_desc))
2609 wpas_dbus_signal_interface_added(wpa_s);
2614 os_free(wpa_s->dbus_new_path);
2615 wpa_s->dbus_new_path = NULL;
2616 free_dbus_object_desc(obj_desc);
2621 int wpas_dbus_unregister_interface(struct wpa_supplicant *wpa_s)
2623 struct wpas_dbus_priv *ctrl_iface;
2625 /* Do nothing if the control interface is not turned on */
2626 if (wpa_s == NULL || wpa_s->global == NULL)
2628 ctrl_iface = wpa_s->global->dbus;
2629 if (ctrl_iface == NULL)
2632 wpa_printf(MSG_DEBUG, "dbus: Unregister interface object '%s'",
2633 wpa_s->dbus_new_path);
2634 if (wpa_dbus_unregister_object_per_iface(ctrl_iface,
2635 wpa_s->dbus_new_path))
2638 wpas_dbus_signal_interface_removed(wpa_s);
2640 os_free(wpa_s->dbus_new_path);
2641 wpa_s->dbus_new_path = NULL;
2648 static const struct wpa_dbus_property_desc wpas_dbus_p2p_peer_properties[] = {
2649 { "Properties", WPAS_DBUS_NEW_IFACE_P2P_PEER, "a{sv}",
2650 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_peer_properties,
2653 { "IEs", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ay",
2654 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_peer_ies,
2657 { NULL, NULL, NULL, NULL, NULL, 0 }
2660 static const struct wpa_dbus_signal_desc wpas_dbus_p2p_peer_signals[] = {
2662 { NULL, NULL, { END_ARGS } }
2666 * wpas_dbus_signal_peer - Send a peer related event signal
2667 * @wpa_s: %wpa_supplicant network interface data
2668 * @dev: peer device object
2669 * @interface: name of the interface emitting this signal.
2670 * In case of peer objects, it would be emitted by either
2671 * the "interface object" or by "peer objects"
2672 * @sig_name: signal name - DeviceFound
2674 * Notify listeners about event related with newly found p2p peer device
2676 static void wpas_dbus_signal_peer(struct wpa_supplicant *wpa_s,
2677 const u8 *dev_addr, const char *interface,
2678 const char *sig_name)
2680 struct wpas_dbus_priv *iface;
2682 DBusMessageIter iter;
2683 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
2685 iface = wpa_s->global->dbus;
2687 /* Do nothing if the control interface is not turned on */
2691 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2692 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
2693 wpa_s->dbus_new_path, MAC2STR(dev_addr));
2695 msg = dbus_message_new_signal(wpa_s->dbus_new_path, interface,
2700 dbus_message_iter_init_append(msg, &iter);
2701 path = peer_obj_path;
2702 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
2706 dbus_connection_send(iface->con, msg, NULL);
2708 dbus_message_unref(msg);
2712 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
2713 dbus_message_unref(msg);
2718 * wpas_dbus_signal_peer_found - Send a peer found signal
2719 * @wpa_s: %wpa_supplicant network interface data
2720 * @dev: peer device object
2722 * Notify listeners about find a p2p peer device found
2724 void wpas_dbus_signal_peer_device_found(struct wpa_supplicant *wpa_s,
2727 wpas_dbus_signal_peer(wpa_s, dev_addr,
2728 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2733 * wpas_dbus_signal_peer_lost - Send a peer lost signal
2734 * @wpa_s: %wpa_supplicant network interface data
2735 * @dev: peer device object
2737 * Notify listeners about lost a p2p peer device
2739 void wpas_dbus_signal_peer_device_lost(struct wpa_supplicant *wpa_s,
2742 wpas_dbus_signal_peer(wpa_s, dev_addr,
2743 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2748 * wpas_dbus_register_peer - Register a discovered peer object with dbus
2749 * @wpa_s: wpa_supplicant interface structure
2750 * @ssid: network configuration data
2751 * Returns: 0 on success, -1 on failure
2753 * Registers network representing object with dbus
2755 int wpas_dbus_register_peer(struct wpa_supplicant *wpa_s, const u8 *dev_addr)
2757 struct wpas_dbus_priv *ctrl_iface;
2758 struct wpa_dbus_object_desc *obj_desc;
2759 struct peer_handler_args *arg;
2760 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2762 /* Do nothing if the control interface is not turned on */
2763 if (wpa_s == NULL || wpa_s->global == NULL)
2766 ctrl_iface = wpa_s->global->dbus;
2767 if (ctrl_iface == NULL)
2770 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2771 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
2772 wpa_s->dbus_new_path, MAC2STR(dev_addr));
2774 wpa_printf(MSG_INFO, "dbus: Register peer object '%s'",
2776 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
2778 wpa_printf(MSG_ERROR, "Not enough memory "
2779 "to create object description");
2783 /* allocate memory for handlers arguments */
2784 arg = os_zalloc(sizeof(struct peer_handler_args));
2786 wpa_printf(MSG_ERROR, "Not enough memory "
2787 "to create arguments for method");
2792 os_memcpy(arg->p2p_device_addr, dev_addr, ETH_ALEN);
2794 wpas_dbus_register(obj_desc, arg, wpa_dbus_free,
2796 wpas_dbus_p2p_peer_properties,
2797 wpas_dbus_p2p_peer_signals);
2799 if (wpa_dbus_register_object_per_iface(ctrl_iface, peer_obj_path,
2800 wpa_s->ifname, obj_desc))
2806 free_dbus_object_desc(obj_desc);
2811 * wpas_dbus_unregister_peer - Unregister a peer object with dbus
2812 * @wpa_s: wpa_supplicant interface structure
2813 * @dev_addr: p2p device addr
2814 * Returns: 0 on success, -1 on failure
2816 * Registers network representing object with dbus
2818 int wpas_dbus_unregister_peer(struct wpa_supplicant *wpa_s,
2821 struct wpas_dbus_priv *ctrl_iface;
2822 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2825 /* Do nothing if the control interface is not turned on */
2826 if (wpa_s == NULL || wpa_s->global == NULL ||
2827 wpa_s->dbus_new_path == NULL)
2829 ctrl_iface = wpa_s->global->dbus;
2830 if (ctrl_iface == NULL)
2833 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2834 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
2835 wpa_s->dbus_new_path, MAC2STR(dev_addr));
2837 wpa_printf(MSG_INFO, "dbus: Unregister peer object '%s'",
2839 ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, peer_obj_path);
2845 static const struct wpa_dbus_property_desc wpas_dbus_p2p_group_properties[] = {
2846 { "Members", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "ao",
2847 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_group_members,
2851 WPAS_DBUS_NEW_IFACE_P2P_GROUP, "a{sv}",
2852 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_group_properties,
2853 (WPADBusPropertyAccessor) wpas_dbus_setter_p2p_group_properties,
2856 { NULL, NULL, NULL, NULL, NULL, 0 }
2859 static const struct wpa_dbus_signal_desc wpas_dbus_p2p_group_signals[] = {
2860 { "PeerJoined", WPAS_DBUS_NEW_IFACE_P2P_GROUP,
2862 { "peer", "o", ARG_OUT },
2866 { "PeerDisconnected", WPAS_DBUS_NEW_IFACE_P2P_GROUP,
2868 { "peer", "o", ARG_OUT },
2872 { NULL, NULL, { END_ARGS } }
2876 * wpas_dbus_register_p2p_group - Register a p2p group object with dbus
2877 * @wpa_s: wpa_supplicant interface structure
2878 * @ssid: SSID struct
2879 * Returns: 0 on success, -1 on failure
2881 * Registers p2p group representing object with dbus
2883 void wpas_dbus_register_p2p_group(struct wpa_supplicant *wpa_s,
2884 struct wpa_ssid *ssid)
2886 struct wpas_dbus_priv *ctrl_iface;
2887 struct wpa_dbus_object_desc *obj_desc;
2888 char group_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2890 /* Do nothing if the control interface is not turned on */
2891 if (wpa_s == NULL || wpa_s->global == NULL)
2894 ctrl_iface = wpa_s->global->dbus;
2895 if (ctrl_iface == NULL)
2898 if (wpa_s->dbus_groupobj_path) {
2899 wpa_printf(MSG_INFO, "%s: Group object '%s' already exists",
2900 __func__, wpa_s->dbus_groupobj_path);
2904 if (wpas_dbus_get_group_obj_path(wpa_s, ssid, group_obj_path) < 0)
2907 wpa_s->dbus_groupobj_path = os_strdup(group_obj_path);
2908 if (wpa_s->dbus_groupobj_path == NULL)
2911 wpa_printf(MSG_INFO, "dbus: Register group object '%s'",
2913 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
2915 wpa_printf(MSG_ERROR, "Not enough memory "
2916 "to create object description");
2920 wpas_dbus_register(obj_desc, wpa_s, NULL, NULL,
2921 wpas_dbus_p2p_group_properties,
2922 wpas_dbus_p2p_group_signals);
2924 if (wpa_dbus_register_object_per_iface(ctrl_iface, group_obj_path,
2925 wpa_s->ifname, obj_desc))
2931 if (wpa_s->dbus_groupobj_path) {
2932 os_free(wpa_s->dbus_groupobj_path);
2933 wpa_s->dbus_groupobj_path = NULL;
2936 free_dbus_object_desc(obj_desc);
2940 * wpas_dbus_unregister_p2p_group - Unregister a p2p group object from dbus
2941 * @wpa_s: wpa_supplicant interface structure
2942 * @ssid: network name of the p2p group started
2944 void wpas_dbus_unregister_p2p_group(struct wpa_supplicant *wpa_s,
2945 const struct wpa_ssid *ssid)
2947 struct wpas_dbus_priv *ctrl_iface;
2949 /* Do nothing if the control interface is not turned on */
2950 if (wpa_s == NULL || wpa_s->global == NULL)
2953 ctrl_iface = wpa_s->global->dbus;
2954 if (ctrl_iface == NULL)
2957 if (!wpa_s->dbus_groupobj_path) {
2958 wpa_printf(MSG_DEBUG,
2959 "%s: Group object '%s' already unregistered",
2960 __func__, wpa_s->dbus_groupobj_path);
2964 wpa_printf(MSG_DEBUG, "dbus: Unregister group object '%s'",
2965 wpa_s->dbus_groupobj_path);
2967 wpa_dbus_unregister_object_per_iface(ctrl_iface,
2968 wpa_s->dbus_groupobj_path);
2970 os_free(wpa_s->dbus_groupobj_path);
2971 wpa_s->dbus_groupobj_path = NULL;
2974 static const struct wpa_dbus_property_desc
2975 wpas_dbus_p2p_groupmember_properties[] = {
2976 { "Properties", WPAS_DBUS_NEW_IFACE_P2P_GROUPMEMBER, "a{sv}",
2977 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_group_properties,
2980 { NULL, NULL, NULL, NULL, NULL, 0 }
2984 * wpas_dbus_register_p2p_groupmember - Register a p2p groupmember
2986 * @wpa_s: wpa_supplicant interface structure
2987 * @p2p_if_addr: i/f addr of the device joining this group
2989 * Registers p2p groupmember representing object with dbus
2991 void wpas_dbus_register_p2p_groupmember(struct wpa_supplicant *wpa_s,
2992 const u8 *p2p_if_addr)
2994 struct wpas_dbus_priv *ctrl_iface;
2995 struct wpa_dbus_object_desc *obj_desc = NULL;
2996 struct groupmember_handler_args *arg;
2997 char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2999 /* Do nothing if the control interface is not turned on */
3000 if (wpa_s == NULL || wpa_s->global == NULL)
3003 ctrl_iface = wpa_s->global->dbus;
3004 if (ctrl_iface == NULL)
3007 if (!wpa_s->dbus_groupobj_path)
3010 os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3011 "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/" COMPACT_MACSTR,
3012 wpa_s->dbus_groupobj_path, MAC2STR(p2p_if_addr));
3014 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
3016 wpa_printf(MSG_ERROR, "Not enough memory "
3017 "to create object description");
3021 /* allocate memory for handlers arguments */
3022 arg = os_zalloc(sizeof(struct groupmember_handler_args));
3024 wpa_printf(MSG_ERROR, "Not enough memory "
3025 "to create arguments for method");
3030 os_memcpy(arg->member_addr, p2p_if_addr, ETH_ALEN);
3032 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
3033 wpas_dbus_p2p_groupmember_properties, NULL);
3035 if (wpa_dbus_register_object_per_iface(ctrl_iface, groupmember_obj_path,
3036 wpa_s->ifname, obj_desc))
3039 wpa_printf(MSG_INFO,
3040 "dbus: Registered group member object '%s' successfully",
3041 groupmember_obj_path);
3045 free_dbus_object_desc(obj_desc);
3049 * wpas_dbus_unregister_p2p_groupmember - Unregister a p2p groupmember
3051 * @wpa_s: wpa_supplicant interface structure
3052 * @p2p_if_addr: i/f addr of the device joining this group
3054 * Unregisters p2p groupmember representing object with dbus
3056 void wpas_dbus_unregister_p2p_groupmember(struct wpa_supplicant *wpa_s,
3057 const u8 *p2p_if_addr)
3059 struct wpas_dbus_priv *ctrl_iface;
3060 char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3062 /* Do nothing if the control interface is not turned on */
3063 if (wpa_s == NULL || wpa_s->global == NULL)
3066 ctrl_iface = wpa_s->global->dbus;
3067 if (ctrl_iface == NULL)
3070 if (!wpa_s->dbus_groupobj_path)
3073 os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3074 "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/" COMPACT_MACSTR,
3075 wpa_s->dbus_groupobj_path, MAC2STR(p2p_if_addr));
3077 wpa_dbus_unregister_object_per_iface(ctrl_iface, groupmember_obj_path);
3081 static const struct wpa_dbus_property_desc
3082 wpas_dbus_persistent_group_properties[] = {
3083 { "Properties", WPAS_DBUS_NEW_IFACE_PERSISTENT_GROUP, "a{sv}",
3084 (WPADBusPropertyAccessor)
3085 wpas_dbus_getter_persistent_group_properties,
3089 { NULL, NULL, NULL, NULL, NULL, 0 }
3092 /* No signals intended for persistent group objects */
3095 * wpas_dbus_register_persistent_group - Register a configured(saved)
3096 * persistent group with dbus
3097 * @wpa_s: wpa_supplicant interface structure
3098 * @ssid: persistent group (still represented as a network within wpa)
3099 * configuration data
3100 * Returns: 0 on success, -1 on failure
3102 * Registers a persistent group representing object with dbus.
3104 int wpas_dbus_register_persistent_group(struct wpa_supplicant *wpa_s,
3105 struct wpa_ssid *ssid)
3107 struct wpas_dbus_priv *ctrl_iface;
3108 struct wpa_dbus_object_desc *obj_desc;
3109 struct network_handler_args *arg;
3110 char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3112 /* Do nothing if the control interface is not turned on */
3113 if (wpa_s == NULL || wpa_s->global == NULL)
3116 /* Make sure ssid is a persistent group */
3117 if (ssid->disabled != 2 && !ssid->p2p_persistent_group)
3118 return -1; /* should we return w/o complaining? */
3120 ctrl_iface = wpa_s->global->dbus;
3121 if (ctrl_iface == NULL)
3125 * Intentionally not coming up with different numbering scheme
3126 * for persistent groups.
3128 os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3129 "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
3130 wpa_s->dbus_new_path, ssid->id);
3132 wpa_printf(MSG_DEBUG, "dbus: Register persistent group object '%s'",
3134 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
3136 wpa_printf(MSG_ERROR, "dbus: Not enough memory to create "
3137 "object description");
3142 * Reusing the same context structure as that for networks
3143 * since these are represented using same data structure.
3145 /* allocate memory for handlers arguments */
3146 arg = os_zalloc(sizeof(struct network_handler_args));
3148 wpa_printf(MSG_ERROR, "dbus: Not enough memory to create "
3149 "arguments for method");
3156 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
3157 wpas_dbus_persistent_group_properties,
3160 if (wpa_dbus_register_object_per_iface(ctrl_iface, pgrp_obj_path,
3161 wpa_s->ifname, obj_desc))
3164 wpas_dbus_signal_persistent_group_added(wpa_s, ssid->id);
3169 free_dbus_object_desc(obj_desc);
3175 * wpas_dbus_unregister_persistent_group - Unregister a persistent_group
3177 * @wpa_s: wpa_supplicant interface structure
3179 * Returns: 0 on success, -1 on failure
3181 * Unregisters persistent group representing object from dbus
3183 * NOTE: There is a slight issue with the semantics here. While the
3184 * implementation simply means the persistent group is unloaded from memory,
3185 * it should not get interpreted as the group is actually being erased/removed
3186 * from persistent storage as well.
3188 int wpas_dbus_unregister_persistent_group(struct wpa_supplicant *wpa_s,
3191 struct wpas_dbus_priv *ctrl_iface;
3192 char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3195 /* Do nothing if the control interface is not turned on */
3196 if (wpa_s == NULL || wpa_s->global == NULL ||
3197 wpa_s->dbus_new_path == NULL)
3199 ctrl_iface = wpa_s->global->dbus;
3200 if (ctrl_iface == NULL)
3203 os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3204 "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
3205 wpa_s->dbus_new_path, nid);
3207 wpa_printf(MSG_DEBUG, "dbus: Unregister persistent group object '%s'",
3209 ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, pgrp_obj_path);
3212 wpas_dbus_signal_persistent_group_removed(wpa_s, nid);
3217 #endif /* CONFIG_P2P */