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;
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_get_object_properties(
68 iface, wpa_s->dbus_new_path,
69 WPAS_DBUS_NEW_IFACE_INTERFACE, &iter))
73 dbus_connection_send(iface->con, msg, NULL);
74 dbus_message_unref(msg);
78 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
79 dbus_message_unref(msg);
84 * wpas_dbus_signal_interface_added - Send a interface created signal
85 * @wpa_s: %wpa_supplicant network interface data
87 * Notify listeners about creating new interface
89 static void wpas_dbus_signal_interface_added(struct wpa_supplicant *wpa_s)
91 wpas_dbus_signal_interface(wpa_s, "InterfaceAdded", TRUE);
96 * wpas_dbus_signal_interface_removed - Send a interface removed signal
97 * @wpa_s: %wpa_supplicant network interface data
99 * Notify listeners about removing interface
101 static void wpas_dbus_signal_interface_removed(struct wpa_supplicant *wpa_s)
103 wpas_dbus_signal_interface(wpa_s, "InterfaceRemoved", FALSE);
109 * wpas_dbus_signal_scan_done - send scan done signal
110 * @wpa_s: %wpa_supplicant network interface data
111 * @success: indicates if scanning succeed or failed
113 * Notify listeners about finishing a scan
115 void wpas_dbus_signal_scan_done(struct wpa_supplicant *wpa_s, int success)
117 struct wpas_dbus_priv *iface;
121 iface = wpa_s->global->dbus;
123 /* Do nothing if the control interface is not turned on */
127 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
128 WPAS_DBUS_NEW_IFACE_INTERFACE,
133 succ = success ? TRUE : FALSE;
134 if (dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &succ,
136 dbus_connection_send(iface->con, msg, NULL);
138 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
139 dbus_message_unref(msg);
144 * wpas_dbus_signal_blob - Send a BSS related event signal
145 * @wpa_s: %wpa_supplicant network interface data
146 * @bss_obj_path: BSS object path
147 * @sig_name: signal name - BSSAdded or BSSRemoved
148 * @properties: Whether to add second argument with object properties
150 * Notify listeners about event related with BSS
152 static void wpas_dbus_signal_bss(struct wpa_supplicant *wpa_s,
153 const char *bss_obj_path,
154 const char *sig_name, int properties)
156 struct wpas_dbus_priv *iface;
158 DBusMessageIter iter;
160 iface = wpa_s->global->dbus;
162 /* Do nothing if the control interface is not turned on */
166 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
167 WPAS_DBUS_NEW_IFACE_INTERFACE,
172 dbus_message_iter_init_append(msg, &iter);
173 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
178 if (!wpa_dbus_get_object_properties(iface, bss_obj_path,
179 WPAS_DBUS_NEW_IFACE_BSS,
184 dbus_connection_send(iface->con, msg, NULL);
185 dbus_message_unref(msg);
189 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
190 dbus_message_unref(msg);
195 * wpas_dbus_signal_bss_added - Send a BSS added signal
196 * @wpa_s: %wpa_supplicant network interface data
197 * @bss_obj_path: new BSS object path
199 * Notify listeners about adding new BSS
201 static void wpas_dbus_signal_bss_added(struct wpa_supplicant *wpa_s,
202 const char *bss_obj_path)
204 wpas_dbus_signal_bss(wpa_s, bss_obj_path, "BSSAdded", TRUE);
209 * wpas_dbus_signal_bss_removed - Send a BSS removed signal
210 * @wpa_s: %wpa_supplicant network interface data
211 * @bss_obj_path: BSS object path
213 * Notify listeners about removing BSS
215 static void wpas_dbus_signal_bss_removed(struct wpa_supplicant *wpa_s,
216 const char *bss_obj_path)
218 wpas_dbus_signal_bss(wpa_s, bss_obj_path, "BSSRemoved", FALSE);
223 * wpas_dbus_signal_blob - Send a blob related event signal
224 * @wpa_s: %wpa_supplicant network interface data
226 * @sig_name: signal name - BlobAdded or BlobRemoved
228 * Notify listeners about event related with blob
230 static void wpas_dbus_signal_blob(struct wpa_supplicant *wpa_s,
231 const char *name, const char *sig_name)
233 struct wpas_dbus_priv *iface;
236 iface = wpa_s->global->dbus;
238 /* Do nothing if the control interface is not turned on */
242 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
243 WPAS_DBUS_NEW_IFACE_INTERFACE,
248 if (dbus_message_append_args(msg, DBUS_TYPE_STRING, &name,
250 dbus_connection_send(iface->con, msg, NULL);
252 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
253 dbus_message_unref(msg);
258 * wpas_dbus_signal_blob_added - Send a blob added signal
259 * @wpa_s: %wpa_supplicant network interface data
262 * Notify listeners about adding a new blob
264 void wpas_dbus_signal_blob_added(struct wpa_supplicant *wpa_s,
267 wpas_dbus_signal_blob(wpa_s, name, "BlobAdded");
272 * wpas_dbus_signal_blob_removed - Send a blob removed signal
273 * @wpa_s: %wpa_supplicant network interface data
276 * Notify listeners about removing blob
278 void wpas_dbus_signal_blob_removed(struct wpa_supplicant *wpa_s,
281 wpas_dbus_signal_blob(wpa_s, name, "BlobRemoved");
286 * wpas_dbus_signal_network - Send a network related event signal
287 * @wpa_s: %wpa_supplicant network interface data
288 * @id: new network id
289 * @sig_name: signal name - NetworkAdded, NetworkRemoved or NetworkSelected
290 * @properties: determines if add second argument with object properties
292 * Notify listeners about event related with configured network
294 static void wpas_dbus_signal_network(struct wpa_supplicant *wpa_s,
295 int id, const char *sig_name,
298 struct wpas_dbus_priv *iface;
300 DBusMessageIter iter;
301 char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
303 iface = wpa_s->global->dbus;
305 /* Do nothing if the control interface is not turned on */
309 os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
310 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
311 wpa_s->dbus_new_path, id);
313 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
314 WPAS_DBUS_NEW_IFACE_INTERFACE,
319 dbus_message_iter_init_append(msg, &iter);
321 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
326 if (!wpa_dbus_get_object_properties(
327 iface, net_obj_path, WPAS_DBUS_NEW_IFACE_NETWORK,
332 dbus_connection_send(iface->con, msg, NULL);
334 dbus_message_unref(msg);
338 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
339 dbus_message_unref(msg);
344 * wpas_dbus_signal_network_added - Send a network added signal
345 * @wpa_s: %wpa_supplicant network interface data
346 * @id: new network id
348 * Notify listeners about adding new network
350 static void wpas_dbus_signal_network_added(struct wpa_supplicant *wpa_s,
353 wpas_dbus_signal_network(wpa_s, id, "NetworkAdded", TRUE);
358 * wpas_dbus_signal_network_removed - Send a network removed signal
359 * @wpa_s: %wpa_supplicant network interface data
362 * Notify listeners about removing a network
364 static void wpas_dbus_signal_network_removed(struct wpa_supplicant *wpa_s,
367 wpas_dbus_signal_network(wpa_s, id, "NetworkRemoved", FALSE);
372 * wpas_dbus_signal_network_selected - Send a network selected signal
373 * @wpa_s: %wpa_supplicant network interface data
376 * Notify listeners about selecting a network
378 void wpas_dbus_signal_network_selected(struct wpa_supplicant *wpa_s, int id)
380 wpas_dbus_signal_network(wpa_s, id, "NetworkSelected", FALSE);
385 * wpas_dbus_signal_network_enabled_changed - Signals Enabled property changes
386 * @wpa_s: %wpa_supplicant network interface data
387 * @ssid: configured network which Enabled property has changed
389 * Sends PropertyChanged signals containing new value of Enabled property
390 * for specified network
392 void wpas_dbus_signal_network_enabled_changed(struct wpa_supplicant *wpa_s,
393 struct wpa_ssid *ssid)
396 char path[WPAS_DBUS_OBJECT_PATH_MAX];
397 os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
398 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
399 wpa_s->dbus_new_path, ssid->id);
401 wpa_dbus_mark_property_changed(wpa_s->global->dbus, path,
402 WPAS_DBUS_NEW_IFACE_NETWORK, "Enabled");
409 * wpas_dbus_signal_wps_event_success - Signals Success WPS event
410 * @wpa_s: %wpa_supplicant network interface data
412 * Sends Event dbus signal with name "success" and empty dict as arguments
414 void wpas_dbus_signal_wps_event_success(struct wpa_supplicant *wpa_s)
418 DBusMessageIter iter, dict_iter;
419 struct wpas_dbus_priv *iface;
420 char *key = "success";
422 iface = wpa_s->global->dbus;
424 /* Do nothing if the control interface is not turned on */
428 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
429 WPAS_DBUS_NEW_IFACE_WPS, "Event");
433 dbus_message_iter_init_append(msg, &iter);
435 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key) ||
436 !wpa_dbus_dict_open_write(&iter, &dict_iter) ||
437 !wpa_dbus_dict_close_write(&iter, &dict_iter))
438 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
440 dbus_connection_send(iface->con, msg, NULL);
442 dbus_message_unref(msg);
447 * wpas_dbus_signal_wps_event_fail - Signals Fail WPS event
448 * @wpa_s: %wpa_supplicant network interface data
450 * Sends Event dbus signal with name "fail" and dictionary containing
451 * "msg field with fail message number (int32) as arguments
453 void wpas_dbus_signal_wps_event_fail(struct wpa_supplicant *wpa_s,
454 struct wps_event_fail *fail)
458 DBusMessageIter iter, dict_iter;
459 struct wpas_dbus_priv *iface;
462 iface = wpa_s->global->dbus;
464 /* Do nothing if the control interface is not turned on */
468 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
469 WPAS_DBUS_NEW_IFACE_WPS, "Event");
473 dbus_message_iter_init_append(msg, &iter);
475 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key) ||
476 !wpa_dbus_dict_open_write(&iter, &dict_iter) ||
477 !wpa_dbus_dict_append_int32(&dict_iter, "msg", fail->msg) ||
478 !wpa_dbus_dict_close_write(&iter, &dict_iter))
479 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
481 dbus_connection_send(iface->con, msg, NULL);
483 dbus_message_unref(msg);
488 * wpas_dbus_signal_wps_event_m2d - Signals M2D WPS event
489 * @wpa_s: %wpa_supplicant network interface data
491 * Sends Event dbus signal with name "m2d" and dictionary containing
492 * fields of wps_event_m2d structure.
494 void wpas_dbus_signal_wps_event_m2d(struct wpa_supplicant *wpa_s,
495 struct wps_event_m2d *m2d)
499 DBusMessageIter iter, dict_iter;
500 struct wpas_dbus_priv *iface;
503 iface = wpa_s->global->dbus;
505 /* Do nothing if the control interface is not turned on */
509 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
510 WPAS_DBUS_NEW_IFACE_WPS, "Event");
514 dbus_message_iter_init_append(msg, &iter);
516 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key) ||
517 !wpa_dbus_dict_open_write(&iter, &dict_iter) ||
518 !wpa_dbus_dict_append_uint16(&dict_iter, "config_methods",
519 m2d->config_methods) ||
520 !wpa_dbus_dict_append_byte_array(&dict_iter, "manufacturer",
521 (const char *) m2d->manufacturer,
522 m2d->manufacturer_len) ||
523 !wpa_dbus_dict_append_byte_array(&dict_iter, "model_name",
524 (const char *) m2d->model_name,
525 m2d->model_name_len) ||
526 !wpa_dbus_dict_append_byte_array(&dict_iter, "model_number",
527 (const char *) m2d->model_number,
528 m2d->model_number_len) ||
529 !wpa_dbus_dict_append_byte_array(&dict_iter, "serial_number",
532 m2d->serial_number_len) ||
533 !wpa_dbus_dict_append_byte_array(&dict_iter, "dev_name",
534 (const char *) m2d->dev_name,
535 m2d->dev_name_len) ||
536 !wpa_dbus_dict_append_byte_array(&dict_iter, "primary_dev_type",
538 m2d->primary_dev_type, 8) ||
539 !wpa_dbus_dict_append_uint16(&dict_iter, "config_error",
540 m2d->config_error) ||
541 !wpa_dbus_dict_append_uint16(&dict_iter, "dev_password_id",
542 m2d->dev_password_id) ||
543 !wpa_dbus_dict_close_write(&iter, &dict_iter))
544 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
546 dbus_connection_send(iface->con, msg, NULL);
548 dbus_message_unref(msg);
553 * wpas_dbus_signal_wps_cred - Signals new credentials
554 * @wpa_s: %wpa_supplicant network interface data
556 * Sends signal with credentials in directory argument
558 void wpas_dbus_signal_wps_cred(struct wpa_supplicant *wpa_s,
559 const struct wps_credential *cred)
562 DBusMessageIter iter, dict_iter;
563 struct wpas_dbus_priv *iface;
564 char *auth_type[6]; /* we have six possible authorization types */
566 char *encr_type[4]; /* we have four possible encryption types */
569 iface = wpa_s->global->dbus;
571 /* Do nothing if the control interface is not turned on */
575 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
576 WPAS_DBUS_NEW_IFACE_WPS,
581 dbus_message_iter_init_append(msg, &iter);
582 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
585 if (cred->auth_type & WPS_AUTH_OPEN)
586 auth_type[at_num++] = "open";
587 if (cred->auth_type & WPS_AUTH_WPAPSK)
588 auth_type[at_num++] = "wpa-psk";
589 if (cred->auth_type & WPS_AUTH_SHARED)
590 auth_type[at_num++] = "shared";
591 if (cred->auth_type & WPS_AUTH_WPA)
592 auth_type[at_num++] = "wpa-eap";
593 if (cred->auth_type & WPS_AUTH_WPA2)
594 auth_type[at_num++] = "wpa2-eap";
595 if (cred->auth_type & WPS_AUTH_WPA2PSK)
596 auth_type[at_num++] =
599 if (cred->encr_type & WPS_ENCR_NONE)
600 encr_type[et_num++] = "none";
601 if (cred->encr_type & WPS_ENCR_WEP)
602 encr_type[et_num++] = "wep";
603 if (cred->encr_type & WPS_ENCR_TKIP)
604 encr_type[et_num++] = "tkip";
605 if (cred->encr_type & WPS_ENCR_AES)
606 encr_type[et_num++] = "aes";
608 if (wpa_s->current_ssid) {
609 if (!wpa_dbus_dict_append_byte_array(
611 (const char *) wpa_s->current_ssid->bssid,
616 if (!wpa_dbus_dict_append_byte_array(&dict_iter, "SSID",
617 (const char *) cred->ssid,
619 !wpa_dbus_dict_append_string_array(&dict_iter, "AuthType",
620 (const char **) auth_type,
622 !wpa_dbus_dict_append_string_array(&dict_iter, "EncrType",
623 (const char **) encr_type,
625 !wpa_dbus_dict_append_byte_array(&dict_iter, "Key",
626 (const char *) cred->key,
628 !wpa_dbus_dict_append_uint32(&dict_iter, "KeyIndex",
630 !wpa_dbus_dict_close_write(&iter, &dict_iter))
633 dbus_connection_send(iface->con, msg, NULL);
636 dbus_message_unref(msg);
639 #endif /* CONFIG_WPS */
641 void wpas_dbus_signal_certification(struct wpa_supplicant *wpa_s,
642 int depth, const char *subject,
643 const char *cert_hash,
644 const struct wpabuf *cert)
646 struct wpas_dbus_priv *iface;
648 DBusMessageIter iter, dict_iter;
650 iface = wpa_s->global->dbus;
652 /* Do nothing if the control interface is not turned on */
656 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
657 WPAS_DBUS_NEW_IFACE_INTERFACE,
662 dbus_message_iter_init_append(msg, &iter);
663 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
666 if (!wpa_dbus_dict_append_uint32(&dict_iter, "depth", depth) ||
667 !wpa_dbus_dict_append_string(&dict_iter, "subject", subject))
671 !wpa_dbus_dict_append_string(&dict_iter, "cert_hash", cert_hash))
675 !wpa_dbus_dict_append_byte_array(&dict_iter, "cert",
680 if (!wpa_dbus_dict_close_write(&iter, &dict_iter))
683 dbus_connection_send(iface->con, msg, NULL);
686 dbus_message_unref(msg);
692 * wpas_dbus_signal_p2p_group_removed - Signals P2P group was removed
693 * @wpa_s: %wpa_supplicant network interface data
694 * @role: role of this device (client or GO)
695 * Sends signal with i/f name and role as string arguments
697 void wpas_dbus_signal_p2p_group_removed(struct wpa_supplicant *wpa_s,
702 DBusMessageIter iter;
703 struct wpas_dbus_priv *iface = wpa_s->global->dbus;
704 char *ifname = wpa_s->ifname;
706 /* Do nothing if the control interface is not turned on */
710 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
711 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
716 dbus_message_iter_init_append(msg, &iter);
718 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &ifname)) {
719 wpa_printf(MSG_ERROR, "dbus: Failed to construct GroupFinished"
720 "signal -not enough memory for ifname ");
724 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &role))
725 wpa_printf(MSG_ERROR, "dbus: Failed to construct GroupFinished"
726 "signal -not enough memory for role ");
728 dbus_connection_send(iface->con, msg, NULL);
731 dbus_message_unref(msg);
736 * wpas_dbus_signal_p2p_provision_discovery - Signals various PD events
738 * @dev_addr - who sent the request or responded to our request.
739 * @request - Will be 1 if request, 0 for response.
740 * @status - valid only in case of response
741 * @config_methods - wps config methods
742 * @generated_pin - pin to be displayed in case of WPS_CONFIG_DISPLAY method
744 * Sends following provision discovery related events:
745 * ProvisionDiscoveryRequestDisplayPin
746 * ProvisionDiscoveryResponseDisplayPin
747 * ProvisionDiscoveryRequestEnterPin
748 * ProvisionDiscoveryResponseEnterPin
749 * ProvisionDiscoveryPBCRequest
750 * ProvisionDiscoveryPBCResponse
753 * ProvisionDiscoveryFailure (timeout case)
755 void wpas_dbus_signal_p2p_provision_discovery(struct wpa_supplicant *wpa_s,
756 const u8 *dev_addr, int request,
757 enum p2p_prov_disc_status status,
759 unsigned int generated_pin)
762 DBusMessageIter iter;
763 struct wpas_dbus_priv *iface;
766 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
768 char pin[9], *p_pin = NULL;
770 iface = wpa_s->global->dbus;
772 /* Do nothing if the control interface is not turned on */
776 if (request || !status) {
777 if (config_methods & WPS_CONFIG_DISPLAY)
779 "ProvisionDiscoveryRequestDisplayPin" :
780 "ProvisionDiscoveryResponseEnterPin";
781 else if (config_methods & WPS_CONFIG_KEYPAD)
783 "ProvisionDiscoveryRequestEnterPin" :
784 "ProvisionDiscoveryResponseDisplayPin";
785 else if (config_methods & WPS_CONFIG_PUSHBUTTON)
786 _signal = request ? "ProvisionDiscoveryPBCRequest" :
787 "ProvisionDiscoveryPBCResponse";
789 return; /* Unknown or un-supported method */
790 } else if (!request && status)
791 /* Explicit check for failure response */
792 _signal = "ProvisionDiscoveryFailure";
794 add_pin = ((request && (config_methods & WPS_CONFIG_DISPLAY)) ||
795 (!request && !status &&
796 (config_methods & WPS_CONFIG_KEYPAD)));
799 os_snprintf(pin, sizeof(pin), "%08d", generated_pin);
803 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
804 WPAS_DBUS_NEW_IFACE_P2PDEVICE, _signal);
808 /* Check if this is a known peer */
809 if (p2p_get_peer_info(wpa_s->global->p2p, dev_addr, 0, NULL, 0) < 0)
812 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
813 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/"
815 wpa_s->dbus_new_path, MAC2STR(dev_addr));
817 path = peer_obj_path;
819 dbus_message_iter_init_append(msg, &iter);
821 if (!dbus_message_iter_append_basic(&iter,
822 DBUS_TYPE_OBJECT_PATH,
826 if (!request && status)
827 /* Attach status to ProvisionDiscoveryFailure */
828 error_ret = !dbus_message_iter_append_basic(&iter,
832 error_ret = (add_pin &&
833 !dbus_message_iter_append_basic(&iter,
839 dbus_connection_send(iface->con, msg, NULL);
841 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
843 dbus_message_unref(msg);
847 void wpas_dbus_signal_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
848 const u8 *src, u16 dev_passwd_id)
851 DBusMessageIter iter;
852 struct wpas_dbus_priv *iface;
853 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
855 iface = wpa_s->global->dbus;
857 /* Do nothing if the control interface is not turned on */
861 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
862 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
863 wpa_s->dbus_new_path, MAC2STR(src));
864 path = peer_obj_path;
866 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
867 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
868 "GONegotiationRequest");
872 dbus_message_iter_init_append(msg, &iter);
874 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
876 !dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT16,
878 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
880 dbus_connection_send(iface->con, msg, NULL);
882 dbus_message_unref(msg);
886 static int wpas_dbus_get_group_obj_path(struct wpa_supplicant *wpa_s,
887 const struct wpa_ssid *ssid,
888 char *group_obj_path)
892 if (os_memcmp(ssid->ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN))
895 memcpy(group_name, ssid->ssid + P2P_WILDCARD_SSID_LEN, 2);
896 group_name[2] = '\0';
898 os_snprintf(group_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
899 "%s/" WPAS_DBUS_NEW_P2P_GROUPS_PART "/%s",
900 wpa_s->dbus_new_path, group_name);
907 * wpas_dbus_signal_p2p_group_started - Signals P2P group has
908 * started.Emitted when a group is succesfully started
909 * irrespective of the role (client/GO) of the current device
911 * @wpa_s: %wpa_supplicant network interface data
913 * @client: this device is P2P client
914 * @network_id: network id of the group started, use instead of ssid->id
915 * to account for persistent groups
917 void wpas_dbus_signal_p2p_group_started(struct wpa_supplicant *wpa_s,
918 const struct wpa_ssid *ssid,
919 int client, int network_id)
922 DBusMessageIter iter, dict_iter;
923 struct wpas_dbus_priv *iface;
924 char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
925 char group_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
927 iface = wpa_s->parent->global->dbus;
929 /* Do nothing if the control interface is not turned on */
933 if (wpas_dbus_get_group_obj_path(wpa_s, ssid, group_obj_path) < 0)
936 /* New interface has been created for this group */
937 msg = dbus_message_new_signal(wpa_s->parent->dbus_new_path,
938 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
944 dbus_message_iter_init_append(msg, &iter);
945 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
949 * In case the device supports creating a separate interface the
950 * DBus client will need to know the object path for the interface
951 * object this group was created on, so include it here.
953 if (!wpa_dbus_dict_append_object_path(&dict_iter,
955 wpa_s->dbus_new_path))
958 if (!wpa_dbus_dict_append_string(&dict_iter, "role",
959 client ? "client" : "GO"))
962 os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
963 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
964 wpa_s->parent->dbus_new_path, network_id);
966 if (!wpa_dbus_dict_append_object_path(&dict_iter, "group_object",
968 !wpa_dbus_dict_append_object_path(&dict_iter, "network_object",
970 !wpa_dbus_dict_close_write(&iter, &dict_iter))
973 dbus_connection_send(iface->con, msg, NULL);
976 dbus_message_unref(msg);
982 * Method to emit GONeogtiation Success or Failure signals based
984 * @status: Status of the GO neg request. 0 for success, other for errors.
986 void wpas_dbus_signal_p2p_go_neg_resp(struct wpa_supplicant *wpa_s, int status)
989 DBusMessageIter iter;
990 struct wpas_dbus_priv *iface;
992 iface = wpa_s->global->dbus;
994 /* Do nothing if the control interface is not turned on */
998 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
999 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1000 status ? "GONegotiationFailure" :
1001 "GONegotiationSuccess");
1006 dbus_message_iter_init_append(msg, &iter);
1007 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32,
1009 wpa_printf(MSG_ERROR,
1010 "dbus: Failed to construct signal");
1015 dbus_connection_send(iface->con, msg, NULL);
1017 dbus_message_unref(msg);
1023 * Method to emit Invitation Result signal based on status and
1025 * @status: Status of the Invite request. 0 for success, other
1027 * @bssid : Basic Service Set Identifier
1029 void wpas_dbus_signal_p2p_invitation_result(struct wpa_supplicant *wpa_s,
1030 int status, const u8 *bssid)
1033 DBusMessageIter iter, dict_iter;
1034 struct wpas_dbus_priv *iface;
1036 wpa_printf(MSG_INFO, "%s\n", __func__);
1038 iface = wpa_s->global->dbus;
1039 /* Do nothing if the control interface is not turned on */
1043 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
1044 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1045 "InvitationResult");
1050 dbus_message_iter_init_append(msg, &iter);
1051 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
1054 if (!wpa_dbus_dict_append_int32(&dict_iter, "status", status))
1057 if (!wpa_dbus_dict_append_byte_array(&dict_iter, "BSSID",
1058 (const char *) bssid,
1062 if (!wpa_dbus_dict_close_write(&iter, &dict_iter))
1065 dbus_connection_send(iface->con, msg, NULL);
1068 dbus_message_unref(msg);
1074 * Method to emit a signal for a peer joining the group.
1075 * The signal will carry path to the group member object
1076 * constructed using p2p i/f addr used for connecting.
1078 * @wpa_s: %wpa_supplicant network interface data
1079 * @member_addr: addr (p2p i/f) of the peer joining the group
1081 void wpas_dbus_signal_p2p_peer_joined(struct wpa_supplicant *wpa_s,
1084 struct wpas_dbus_priv *iface;
1086 DBusMessageIter iter;
1087 char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
1089 iface = wpa_s->global->dbus;
1091 /* Do nothing if the control interface is not turned on */
1095 if (!wpa_s->dbus_groupobj_path)
1098 os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1099 "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/"
1101 wpa_s->dbus_groupobj_path, MAC2STR(member));
1103 msg = dbus_message_new_signal(wpa_s->dbus_groupobj_path,
1104 WPAS_DBUS_NEW_IFACE_P2P_GROUP,
1109 dbus_message_iter_init_append(msg, &iter);
1110 path = groupmember_obj_path;
1111 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
1115 dbus_connection_send(iface->con, msg, NULL);
1117 dbus_message_unref(msg);
1121 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
1122 dbus_message_unref(msg);
1128 * Method to emit a signal for a peer disconnecting the group.
1129 * The signal will carry path to the group member object
1130 * constructed using p2p i/f addr used for connecting.
1132 * @wpa_s: %wpa_supplicant network interface data
1133 * @member_addr: addr (p2p i/f) of the peer joining the group
1135 void wpas_dbus_signal_p2p_peer_disconnected(struct wpa_supplicant *wpa_s,
1138 struct wpas_dbus_priv *iface;
1140 DBusMessageIter iter;
1141 char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
1143 iface = wpa_s->global->dbus;
1145 /* Do nothing if the control interface is not turned on */
1149 if (!wpa_s->dbus_groupobj_path)
1152 os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1153 "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/"
1155 wpa_s->dbus_groupobj_path, MAC2STR(member));
1157 msg = dbus_message_new_signal(wpa_s->dbus_groupobj_path,
1158 WPAS_DBUS_NEW_IFACE_P2P_GROUP,
1159 "PeerDisconnected");
1163 dbus_message_iter_init_append(msg, &iter);
1164 path = groupmember_obj_path;
1165 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
1169 dbus_connection_send(iface->con, msg, NULL);
1171 dbus_message_unref(msg);
1175 wpa_printf(MSG_ERROR, "dbus: Failed to construct PeerDisconnected "
1177 dbus_message_unref(msg);
1183 * Method to emit a signal for a service discovery request.
1184 * The signal will carry station address, frequency, dialog token,
1185 * update indicator and it tlvs
1187 * @wpa_s: %wpa_supplicant network interface data
1188 * @sa: station addr (p2p i/f) of the peer
1189 * @dialog_token: service discovery request dialog token
1190 * @update_indic: service discovery request update indicator
1191 * @tlvs: service discovery request genrated byte array of tlvs
1192 * @tlvs_len: service discovery request tlvs length
1194 void wpas_dbus_signal_p2p_sd_request(struct wpa_supplicant *wpa_s,
1195 int freq, const u8 *sa, u8 dialog_token,
1196 u16 update_indic, const u8 *tlvs,
1200 DBusMessageIter iter, dict_iter;
1201 struct wpas_dbus_priv *iface;
1202 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
1203 iface = wpa_s->global->dbus;
1205 /* Do nothing if the control interface is not turned on */
1209 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
1210 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1211 "ServiceDiscoveryRequest");
1215 /* Check if this is a known peer */
1216 if (p2p_get_peer_info(wpa_s->global->p2p, sa, 0, NULL, 0) < 0)
1219 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1220 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/"
1221 COMPACT_MACSTR, wpa_s->dbus_new_path, MAC2STR(sa));
1223 path = peer_obj_path;
1225 dbus_message_iter_init_append(msg, &iter);
1226 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
1230 if (!wpa_dbus_dict_append_object_path(&dict_iter, "peer_object",
1232 !wpa_dbus_dict_append_int32(&dict_iter, "frequency", freq) ||
1233 !wpa_dbus_dict_append_int32(&dict_iter, "dialog_token",
1235 !wpa_dbus_dict_append_uint16(&dict_iter, "update_indicator",
1237 !wpa_dbus_dict_append_byte_array(&dict_iter, "tlvs",
1238 (const char *) tlvs,
1240 !wpa_dbus_dict_close_write(&iter, &dict_iter))
1243 dbus_connection_send(iface->con, msg, NULL);
1244 dbus_message_unref(msg);
1247 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
1248 dbus_message_unref(msg);
1254 * Method to emit a signal for a service discovery response.
1255 * The signal will carry station address, update indicator and it
1258 * @wpa_s: %wpa_supplicant network interface data
1259 * @sa: station addr (p2p i/f) of the peer
1260 * @update_indic: service discovery request update indicator
1261 * @tlvs: service discovery request genrated byte array of tlvs
1262 * @tlvs_len: service discovery request tlvs length
1264 void wpas_dbus_signal_p2p_sd_response(struct wpa_supplicant *wpa_s,
1265 const u8 *sa, u16 update_indic,
1266 const u8 *tlvs, size_t tlvs_len)
1269 DBusMessageIter iter, dict_iter;
1270 struct wpas_dbus_priv *iface;
1271 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
1272 iface = wpa_s->global->dbus;
1274 /* Do nothing if the control interface is not turned on */
1278 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
1279 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1280 "ServiceDiscoveryResponse");
1284 /* Check if this is a known peer */
1285 if (p2p_get_peer_info(wpa_s->global->p2p, sa, 0, NULL, 0) < 0)
1288 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1289 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/"
1290 COMPACT_MACSTR, wpa_s->dbus_new_path, MAC2STR(sa));
1292 path = peer_obj_path;
1294 dbus_message_iter_init_append(msg, &iter);
1295 if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
1298 if (!wpa_dbus_dict_append_object_path(&dict_iter, "peer_object",
1300 !wpa_dbus_dict_append_uint16(&dict_iter, "update_indicator",
1302 !wpa_dbus_dict_append_byte_array(&dict_iter, "tlvs",
1303 (const char *) tlvs,
1305 !wpa_dbus_dict_close_write(&iter, &dict_iter))
1309 dbus_connection_send(iface->con, msg, NULL);
1310 dbus_message_unref(msg);
1313 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
1314 dbus_message_unref(msg);
1318 * wpas_dbus_signal_persistent_group - Send a persistent group related
1320 * @wpa_s: %wpa_supplicant network interface data
1321 * @id: new persistent group id
1322 * @sig_name: signal name - PersistentGroupAdded, PersistentGroupRemoved
1323 * @properties: determines if add second argument with object properties
1325 * Notify listeners about an event related to persistent groups.
1327 static void wpas_dbus_signal_persistent_group(struct wpa_supplicant *wpa_s,
1328 int id, const char *sig_name,
1331 struct wpas_dbus_priv *iface;
1333 DBusMessageIter iter;
1334 char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
1336 iface = wpa_s->global->dbus;
1338 /* Do nothing if the control interface is not turned on */
1342 os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1343 "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
1344 wpa_s->dbus_new_path, id);
1346 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
1347 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1352 dbus_message_iter_init_append(msg, &iter);
1353 path = pgrp_obj_path;
1354 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
1359 if (!wpa_dbus_get_object_properties(
1360 iface, pgrp_obj_path,
1361 WPAS_DBUS_NEW_IFACE_PERSISTENT_GROUP, &iter))
1365 dbus_connection_send(iface->con, msg, NULL);
1367 dbus_message_unref(msg);
1371 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
1372 dbus_message_unref(msg);
1377 * wpas_dbus_signal_persistent_group_added - Send a persistent_group
1379 * @wpa_s: %wpa_supplicant network interface data
1380 * @id: new persistent group id
1382 * Notify listeners about addition of a new persistent group.
1384 static void wpas_dbus_signal_persistent_group_added(
1385 struct wpa_supplicant *wpa_s, int id)
1387 wpas_dbus_signal_persistent_group(wpa_s, id, "PersistentGroupAdded",
1393 * wpas_dbus_signal_persistent_group_removed - Send a persistent_group
1395 * @wpa_s: %wpa_supplicant network interface data
1396 * @id: persistent group id
1398 * Notify listeners about removal of a persistent group.
1400 static void wpas_dbus_signal_persistent_group_removed(
1401 struct wpa_supplicant *wpa_s, int id)
1403 wpas_dbus_signal_persistent_group(wpa_s, id, "PersistentGroupRemoved",
1409 * wpas_dbus_signal_p2p_wps_failed - Signals WpsFailed event
1410 * @wpa_s: %wpa_supplicant network interface data
1412 * Sends Event dbus signal with name "fail" and dictionary containing
1413 * "msg" field with fail message number (int32) as arguments
1415 void wpas_dbus_signal_p2p_wps_failed(struct wpa_supplicant *wpa_s,
1416 struct wps_event_fail *fail)
1420 DBusMessageIter iter, dict_iter;
1421 struct wpas_dbus_priv *iface;
1424 iface = wpa_s->global->dbus;
1426 /* Do nothing if the control interface is not turned on */
1430 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
1431 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1436 dbus_message_iter_init_append(msg, &iter);
1438 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key) ||
1439 !wpa_dbus_dict_open_write(&iter, &dict_iter) ||
1440 !wpa_dbus_dict_append_int32(&dict_iter, "msg", fail->msg) ||
1441 !wpa_dbus_dict_append_int16(&dict_iter, "config_error",
1442 fail->config_error) ||
1443 !wpa_dbus_dict_close_write(&iter, &dict_iter))
1444 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
1446 dbus_connection_send(iface->con, msg, NULL);
1448 dbus_message_unref(msg);
1451 #endif /*CONFIG_P2P*/
1455 * wpas_dbus_signal_prop_changed - Signals change of property
1456 * @wpa_s: %wpa_supplicant network interface data
1457 * @property: indicates which property has changed
1459 * Sends PropertyChanged signals with path, interface and arguments
1460 * depending on which property has changed.
1462 void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
1463 enum wpas_dbus_prop property)
1465 WPADBusPropertyAccessor getter;
1468 if (wpa_s->dbus_new_path == NULL)
1469 return; /* Skip signal since D-Bus setup is not yet ready */
1472 case WPAS_DBUS_PROP_AP_SCAN:
1473 getter = wpas_dbus_getter_ap_scan;
1476 case WPAS_DBUS_PROP_SCANNING:
1477 getter = wpas_dbus_getter_scanning;
1480 case WPAS_DBUS_PROP_STATE:
1481 getter = wpas_dbus_getter_state;
1484 case WPAS_DBUS_PROP_CURRENT_BSS:
1485 getter = wpas_dbus_getter_current_bss;
1486 prop = "CurrentBSS";
1488 case WPAS_DBUS_PROP_CURRENT_NETWORK:
1489 getter = wpas_dbus_getter_current_network;
1490 prop = "CurrentNetwork";
1492 case WPAS_DBUS_PROP_BSSS:
1493 getter = wpas_dbus_getter_bsss;
1496 case WPAS_DBUS_PROP_CURRENT_AUTH_MODE:
1497 getter = wpas_dbus_getter_current_auth_mode;
1498 prop = "CurrentAuthMode";
1501 wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
1502 __func__, property);
1506 wpa_dbus_mark_property_changed(wpa_s->global->dbus,
1507 wpa_s->dbus_new_path,
1508 WPAS_DBUS_NEW_IFACE_INTERFACE, prop);
1513 * wpas_dbus_bss_signal_prop_changed - Signals change of BSS property
1514 * @wpa_s: %wpa_supplicant network interface data
1515 * @property: indicates which property has changed
1516 * @id: unique BSS identifier
1518 * Sends PropertyChanged signals with path, interface, and arguments depending
1519 * on which property has changed.
1521 void wpas_dbus_bss_signal_prop_changed(struct wpa_supplicant *wpa_s,
1522 enum wpas_dbus_bss_prop property,
1525 char path[WPAS_DBUS_OBJECT_PATH_MAX];
1529 case WPAS_DBUS_BSS_PROP_SIGNAL:
1532 case WPAS_DBUS_BSS_PROP_FREQ:
1535 case WPAS_DBUS_BSS_PROP_MODE:
1538 case WPAS_DBUS_BSS_PROP_PRIVACY:
1541 case WPAS_DBUS_BSS_PROP_RATES:
1544 case WPAS_DBUS_BSS_PROP_WPA:
1547 case WPAS_DBUS_BSS_PROP_RSN:
1550 case WPAS_DBUS_BSS_PROP_IES:
1554 wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
1555 __func__, property);
1559 os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
1560 "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
1561 wpa_s->dbus_new_path, id);
1563 wpa_dbus_mark_property_changed(wpa_s->global->dbus, path,
1564 WPAS_DBUS_NEW_IFACE_BSS, prop);
1569 * wpas_dbus_signal_debug_level_changed - Signals change of debug param
1570 * @global: wpa_global structure
1572 * Sends PropertyChanged signals informing that debug level has changed.
1574 void wpas_dbus_signal_debug_level_changed(struct wpa_global *global)
1576 wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
1577 WPAS_DBUS_NEW_INTERFACE,
1583 * wpas_dbus_signal_debug_timestamp_changed - Signals change of debug param
1584 * @global: wpa_global structure
1586 * Sends PropertyChanged signals informing that debug timestamp has changed.
1588 void wpas_dbus_signal_debug_timestamp_changed(struct wpa_global *global)
1590 wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
1591 WPAS_DBUS_NEW_INTERFACE,
1597 * wpas_dbus_signal_debug_show_keys_changed - Signals change of debug param
1598 * @global: wpa_global structure
1600 * Sends PropertyChanged signals informing that debug show_keys has changed.
1602 void wpas_dbus_signal_debug_show_keys_changed(struct wpa_global *global)
1604 wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
1605 WPAS_DBUS_NEW_INTERFACE,
1610 static void wpas_dbus_register(struct wpa_dbus_object_desc *obj_desc,
1612 WPADBusArgumentFreeFunction priv_free,
1613 const struct wpa_dbus_method_desc *methods,
1614 const struct wpa_dbus_property_desc *properties,
1615 const struct wpa_dbus_signal_desc *signals)
1619 obj_desc->user_data = priv;
1620 obj_desc->user_data_free_func = priv_free;
1621 obj_desc->methods = methods;
1622 obj_desc->properties = properties;
1623 obj_desc->signals = signals;
1625 for (n = 0; properties && properties->dbus_property; properties++)
1628 obj_desc->prop_changed_flags = os_zalloc(n);
1629 if (!obj_desc->prop_changed_flags)
1630 wpa_printf(MSG_DEBUG, "dbus: %s: can't register handlers",
1635 static const struct wpa_dbus_method_desc wpas_dbus_global_methods[] = {
1636 { "CreateInterface", WPAS_DBUS_NEW_INTERFACE,
1637 (WPADBusMethodHandler) &wpas_dbus_handler_create_interface,
1639 { "args", "a{sv}", ARG_IN },
1640 { "path", "o", ARG_OUT },
1644 { "RemoveInterface", WPAS_DBUS_NEW_INTERFACE,
1645 (WPADBusMethodHandler) &wpas_dbus_handler_remove_interface,
1647 { "path", "o", ARG_IN },
1651 { "GetInterface", WPAS_DBUS_NEW_INTERFACE,
1652 (WPADBusMethodHandler) &wpas_dbus_handler_get_interface,
1654 { "ifname", "s", ARG_IN },
1655 { "path", "o", ARG_OUT },
1659 { NULL, NULL, NULL, { END_ARGS } }
1662 static const struct wpa_dbus_property_desc wpas_dbus_global_properties[] = {
1663 { "DebugLevel", WPAS_DBUS_NEW_INTERFACE, "s",
1664 wpas_dbus_getter_debug_level,
1665 wpas_dbus_setter_debug_level,
1668 { "DebugTimestamp", WPAS_DBUS_NEW_INTERFACE, "b",
1669 wpas_dbus_getter_debug_timestamp,
1670 wpas_dbus_setter_debug_timestamp,
1673 { "DebugShowKeys", WPAS_DBUS_NEW_INTERFACE, "b",
1674 wpas_dbus_getter_debug_show_keys,
1675 wpas_dbus_setter_debug_show_keys,
1678 { "Interfaces", WPAS_DBUS_NEW_INTERFACE, "ao",
1679 wpas_dbus_getter_interfaces,
1683 { "EapMethods", WPAS_DBUS_NEW_INTERFACE, "as",
1684 wpas_dbus_getter_eap_methods,
1688 { NULL, NULL, NULL, NULL, NULL, 0 }
1691 static const struct wpa_dbus_signal_desc wpas_dbus_global_signals[] = {
1692 { "InterfaceAdded", WPAS_DBUS_NEW_INTERFACE,
1694 { "path", "o", ARG_OUT },
1695 { "properties", "a{sv}", ARG_OUT },
1699 { "InterfaceRemoved", WPAS_DBUS_NEW_INTERFACE,
1701 { "path", "o", ARG_OUT },
1705 { "PropertiesChanged", WPAS_DBUS_NEW_INTERFACE,
1707 { "properties", "a{sv}", ARG_OUT },
1711 { NULL, NULL, { END_ARGS } }
1716 * wpas_dbus_ctrl_iface_init - Initialize dbus control interface
1717 * @global: Pointer to global data from wpa_supplicant_init()
1718 * Returns: 0 on success or -1 on failure
1720 * Initialize the dbus control interface for wpa_supplicantand and start
1721 * receiving commands from external programs over the bus.
1723 int wpas_dbus_ctrl_iface_init(struct wpas_dbus_priv *priv)
1725 struct wpa_dbus_object_desc *obj_desc;
1728 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
1730 wpa_printf(MSG_ERROR, "Not enough memory "
1731 "to create object description");
1735 wpas_dbus_register(obj_desc, priv->global, NULL,
1736 wpas_dbus_global_methods,
1737 wpas_dbus_global_properties,
1738 wpas_dbus_global_signals);
1740 wpa_printf(MSG_DEBUG, "dbus: Register D-Bus object '%s'",
1741 WPAS_DBUS_NEW_PATH);
1742 ret = wpa_dbus_ctrl_iface_init(priv, WPAS_DBUS_NEW_PATH,
1743 WPAS_DBUS_NEW_SERVICE,
1746 free_dbus_object_desc(obj_desc);
1748 priv->dbus_new_initialized = 1;
1755 * wpas_dbus_ctrl_iface_deinit - Deinitialize dbus ctrl interface for
1757 * @iface: Pointer to dbus private data from wpas_dbus_init()
1759 * Deinitialize the dbus control interface that was initialized with
1760 * wpas_dbus_ctrl_iface_init().
1762 void wpas_dbus_ctrl_iface_deinit(struct wpas_dbus_priv *iface)
1764 if (!iface->dbus_new_initialized)
1766 wpa_printf(MSG_DEBUG, "dbus: Unregister D-Bus object '%s'",
1767 WPAS_DBUS_NEW_PATH);
1768 dbus_connection_unregister_object_path(iface->con,
1769 WPAS_DBUS_NEW_PATH);
1773 static void wpa_dbus_free(void *ptr)
1779 static const struct wpa_dbus_property_desc wpas_dbus_network_properties[] = {
1780 { "Properties", WPAS_DBUS_NEW_IFACE_NETWORK, "a{sv}",
1781 wpas_dbus_getter_network_properties,
1782 wpas_dbus_setter_network_properties,
1785 { "Enabled", WPAS_DBUS_NEW_IFACE_NETWORK, "b",
1786 wpas_dbus_getter_enabled,
1787 wpas_dbus_setter_enabled,
1790 { NULL, NULL, NULL, NULL, NULL, 0 }
1794 static const struct wpa_dbus_signal_desc wpas_dbus_network_signals[] = {
1795 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_NETWORK,
1797 { "properties", "a{sv}", ARG_OUT },
1801 { NULL, NULL, { END_ARGS } }
1806 * wpas_dbus_register_network - Register a configured network with dbus
1807 * @wpa_s: wpa_supplicant interface structure
1808 * @ssid: network configuration data
1809 * Returns: 0 on success, -1 on failure
1811 * Registers network representing object with dbus
1813 int wpas_dbus_register_network(struct wpa_supplicant *wpa_s,
1814 struct wpa_ssid *ssid)
1816 struct wpas_dbus_priv *ctrl_iface;
1817 struct wpa_dbus_object_desc *obj_desc;
1818 struct network_handler_args *arg;
1819 char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
1823 * If it is a persistent group register it as such.
1824 * This is to handle cases where an interface is being initialized
1825 * with a list of networks read from config.
1827 if (network_is_persistent_group(ssid))
1828 return wpas_dbus_register_persistent_group(wpa_s, ssid);
1829 #endif /* CONFIG_P2P */
1831 /* Do nothing if the control interface is not turned on */
1832 if (wpa_s == NULL || wpa_s->global == NULL)
1834 ctrl_iface = wpa_s->global->dbus;
1835 if (ctrl_iface == NULL)
1838 os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1839 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
1840 wpa_s->dbus_new_path, ssid->id);
1842 wpa_printf(MSG_DEBUG, "dbus: Register network object '%s'",
1844 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
1846 wpa_printf(MSG_ERROR, "Not enough memory "
1847 "to create object description");
1851 /* allocate memory for handlers arguments */
1852 arg = os_zalloc(sizeof(struct network_handler_args));
1854 wpa_printf(MSG_ERROR, "Not enough memory "
1855 "to create arguments for method");
1862 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
1863 wpas_dbus_network_properties,
1864 wpas_dbus_network_signals);
1866 if (wpa_dbus_register_object_per_iface(ctrl_iface, net_obj_path,
1867 wpa_s->ifname, obj_desc))
1870 wpas_dbus_signal_network_added(wpa_s, ssid->id);
1875 free_dbus_object_desc(obj_desc);
1881 * wpas_dbus_unregister_network - Unregister a configured network from dbus
1882 * @wpa_s: wpa_supplicant interface structure
1884 * Returns: 0 on success, -1 on failure
1886 * Unregisters network representing object from dbus
1888 int wpas_dbus_unregister_network(struct wpa_supplicant *wpa_s, int nid)
1890 struct wpas_dbus_priv *ctrl_iface;
1891 char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
1893 struct wpa_ssid *ssid;
1895 ssid = wpa_config_get_network(wpa_s->conf, nid);
1898 /* If it is a persistent group unregister it as such */
1899 if (ssid && network_is_persistent_group(ssid))
1900 return wpas_dbus_unregister_persistent_group(wpa_s, nid);
1901 #endif /* CONFIG_P2P */
1903 /* Do nothing if the control interface is not turned on */
1904 if (wpa_s == NULL || wpa_s->global == NULL ||
1905 wpa_s->dbus_new_path == NULL)
1907 ctrl_iface = wpa_s->global->dbus;
1908 if (ctrl_iface == NULL)
1911 os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1912 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
1913 wpa_s->dbus_new_path, nid);
1915 wpa_printf(MSG_DEBUG, "dbus: Unregister network object '%s'",
1917 ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, net_obj_path);
1920 wpas_dbus_signal_network_removed(wpa_s, nid);
1926 static const struct wpa_dbus_property_desc wpas_dbus_bss_properties[] = {
1927 { "SSID", WPAS_DBUS_NEW_IFACE_BSS, "ay",
1928 wpas_dbus_getter_bss_ssid,
1932 { "BSSID", WPAS_DBUS_NEW_IFACE_BSS, "ay",
1933 wpas_dbus_getter_bss_bssid,
1937 { "Privacy", WPAS_DBUS_NEW_IFACE_BSS, "b",
1938 wpas_dbus_getter_bss_privacy,
1942 { "Mode", WPAS_DBUS_NEW_IFACE_BSS, "s",
1943 wpas_dbus_getter_bss_mode,
1947 { "Signal", WPAS_DBUS_NEW_IFACE_BSS, "n",
1948 wpas_dbus_getter_bss_signal,
1952 { "Frequency", WPAS_DBUS_NEW_IFACE_BSS, "q",
1953 wpas_dbus_getter_bss_frequency,
1957 { "Rates", WPAS_DBUS_NEW_IFACE_BSS, "au",
1958 wpas_dbus_getter_bss_rates,
1962 { "WPA", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
1963 wpas_dbus_getter_bss_wpa,
1967 { "RSN", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
1968 wpas_dbus_getter_bss_rsn,
1972 { "IEs", WPAS_DBUS_NEW_IFACE_BSS, "ay",
1973 wpas_dbus_getter_bss_ies,
1977 { NULL, NULL, NULL, NULL, NULL, 0 }
1981 static const struct wpa_dbus_signal_desc wpas_dbus_bss_signals[] = {
1982 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_BSS,
1984 { "properties", "a{sv}", ARG_OUT },
1988 { NULL, NULL, { END_ARGS } }
1993 * wpas_dbus_unregister_bss - Unregister a scanned BSS from dbus
1994 * @wpa_s: wpa_supplicant interface structure
1995 * @bssid: scanned network bssid
1996 * @id: unique BSS identifier
1997 * Returns: 0 on success, -1 on failure
1999 * Unregisters BSS representing object from dbus
2001 int wpas_dbus_unregister_bss(struct wpa_supplicant *wpa_s,
2002 u8 bssid[ETH_ALEN], unsigned int id)
2004 struct wpas_dbus_priv *ctrl_iface;
2005 char bss_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2007 /* Do nothing if the control interface is not turned on */
2008 if (wpa_s == NULL || wpa_s->global == NULL)
2010 ctrl_iface = wpa_s->global->dbus;
2011 if (ctrl_iface == NULL)
2014 os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2015 "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
2016 wpa_s->dbus_new_path, id);
2018 wpa_printf(MSG_DEBUG, "dbus: Unregister BSS object '%s'",
2020 if (wpa_dbus_unregister_object_per_iface(ctrl_iface, bss_obj_path)) {
2021 wpa_printf(MSG_ERROR, "dbus: Cannot unregister BSS object %s",
2026 wpas_dbus_signal_bss_removed(wpa_s, bss_obj_path);
2027 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_BSSS);
2034 * wpas_dbus_register_bss - Register a scanned BSS with dbus
2035 * @wpa_s: wpa_supplicant interface structure
2036 * @bssid: scanned network bssid
2037 * @id: unique BSS identifier
2038 * Returns: 0 on success, -1 on failure
2040 * Registers BSS representing object with dbus
2042 int wpas_dbus_register_bss(struct wpa_supplicant *wpa_s,
2043 u8 bssid[ETH_ALEN], unsigned int id)
2045 struct wpas_dbus_priv *ctrl_iface;
2046 struct wpa_dbus_object_desc *obj_desc;
2047 char bss_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2048 struct bss_handler_args *arg;
2050 /* Do nothing if the control interface is not turned on */
2051 if (wpa_s == NULL || wpa_s->global == NULL)
2053 ctrl_iface = wpa_s->global->dbus;
2054 if (ctrl_iface == NULL)
2057 os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2058 "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
2059 wpa_s->dbus_new_path, id);
2061 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
2063 wpa_printf(MSG_ERROR, "Not enough memory "
2064 "to create object description");
2068 arg = os_zalloc(sizeof(struct bss_handler_args));
2070 wpa_printf(MSG_ERROR, "Not enough memory "
2071 "to create arguments for handler");
2077 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
2078 wpas_dbus_bss_properties,
2079 wpas_dbus_bss_signals);
2081 wpa_printf(MSG_DEBUG, "dbus: Register BSS object '%s'",
2083 if (wpa_dbus_register_object_per_iface(ctrl_iface, bss_obj_path,
2084 wpa_s->ifname, obj_desc)) {
2085 wpa_printf(MSG_ERROR,
2086 "Cannot register BSSID dbus object %s.",
2091 wpas_dbus_signal_bss_added(wpa_s, bss_obj_path);
2092 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_BSSS);
2097 free_dbus_object_desc(obj_desc);
2102 static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
2103 { "Scan", WPAS_DBUS_NEW_IFACE_INTERFACE,
2104 (WPADBusMethodHandler) &wpas_dbus_handler_scan,
2106 { "args", "a{sv}", ARG_IN },
2110 { "Disconnect", WPAS_DBUS_NEW_IFACE_INTERFACE,
2111 (WPADBusMethodHandler) &wpas_dbus_handler_disconnect,
2116 { "AddNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
2117 (WPADBusMethodHandler) &wpas_dbus_handler_add_network,
2119 { "args", "a{sv}", ARG_IN },
2120 { "path", "o", ARG_OUT },
2124 { "RemoveNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
2125 (WPADBusMethodHandler) &wpas_dbus_handler_remove_network,
2127 { "path", "o", ARG_IN },
2131 { "RemoveAllNetworks", WPAS_DBUS_NEW_IFACE_INTERFACE,
2132 (WPADBusMethodHandler) &wpas_dbus_handler_remove_all_networks,
2137 { "SelectNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
2138 (WPADBusMethodHandler) &wpas_dbus_handler_select_network,
2140 { "path", "o", ARG_IN },
2144 { "AddBlob", WPAS_DBUS_NEW_IFACE_INTERFACE,
2145 (WPADBusMethodHandler) &wpas_dbus_handler_add_blob,
2147 { "name", "s", ARG_IN },
2148 { "data", "ay", ARG_IN },
2152 { "GetBlob", WPAS_DBUS_NEW_IFACE_INTERFACE,
2153 (WPADBusMethodHandler) &wpas_dbus_handler_get_blob,
2155 { "name", "s", ARG_IN },
2156 { "data", "ay", ARG_OUT },
2160 { "RemoveBlob", WPAS_DBUS_NEW_IFACE_INTERFACE,
2161 (WPADBusMethodHandler) &wpas_dbus_handler_remove_blob,
2163 { "name", "s", ARG_IN },
2168 { "Start", WPAS_DBUS_NEW_IFACE_WPS,
2169 (WPADBusMethodHandler) &wpas_dbus_handler_wps_start,
2171 { "args", "a{sv}", ARG_IN },
2172 { "output", "a{sv}", ARG_OUT },
2176 #endif /* CONFIG_WPS */
2178 { "Find", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2179 (WPADBusMethodHandler)wpas_dbus_handler_p2p_find,
2181 { "args", "a{sv}", ARG_IN },
2185 { "StopFind", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2186 (WPADBusMethodHandler)wpas_dbus_handler_p2p_stop_find,
2191 { "Listen", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2192 (WPADBusMethodHandler)wpas_dbus_handler_p2p_listen,
2194 { "timeout", "i", ARG_IN },
2198 { "ExtendedListen", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2199 (WPADBusMethodHandler)wpas_dbus_handler_p2p_extendedlisten,
2201 { "args", "a{sv}", ARG_IN },
2205 { "PresenceRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2206 (WPADBusMethodHandler)wpas_dbus_handler_p2p_presence_request,
2208 { "args", "a{sv}", ARG_IN },
2212 { "ProvisionDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2213 (WPADBusMethodHandler)wpas_dbus_handler_p2p_prov_disc_req,
2215 { "peer", "o", ARG_IN },
2216 { "config_method", "s", ARG_IN },
2220 { "Connect", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2221 (WPADBusMethodHandler)wpas_dbus_handler_p2p_connect,
2223 { "args", "a{sv}", ARG_IN },
2224 { "generated_pin", "i", ARG_OUT },
2228 { "GroupAdd", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2229 (WPADBusMethodHandler)wpas_dbus_handler_p2p_group_add,
2231 { "args", "a{sv}", ARG_IN },
2235 { "Invite", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2236 (WPADBusMethodHandler)wpas_dbus_handler_p2p_invite,
2238 { "args", "a{sv}", ARG_IN },
2242 { "Disconnect", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2243 (WPADBusMethodHandler)wpas_dbus_handler_p2p_disconnect,
2248 { "RejectPeer", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2249 (WPADBusMethodHandler)wpas_dbus_handler_p2p_rejectpeer,
2251 { "peer", "o", ARG_IN },
2255 { "Flush", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2256 (WPADBusMethodHandler)wpas_dbus_handler_p2p_flush,
2261 { "AddService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2262 (WPADBusMethodHandler)wpas_dbus_handler_p2p_add_service,
2264 { "args", "a{sv}", ARG_IN },
2268 { "DeleteService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2269 (WPADBusMethodHandler)wpas_dbus_handler_p2p_delete_service,
2271 { "args", "a{sv}", ARG_IN },
2275 { "FlushService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2276 (WPADBusMethodHandler)wpas_dbus_handler_p2p_flush_service,
2281 { "ServiceDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2282 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_req,
2284 { "args", "a{sv}", ARG_IN },
2288 { "ServiceDiscoveryResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2289 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_res,
2291 { "args", "a{sv}", ARG_IN },
2295 { "ServiceDiscoveryCancelRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2296 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_cancel_req,
2298 { "args", "t", ARG_IN },
2302 { "ServiceUpdate", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2303 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_update,
2308 { "ServiceDiscoveryExternal", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2309 (WPADBusMethodHandler)wpas_dbus_handler_p2p_serv_disc_external,
2311 { "arg", "i", ARG_IN },
2315 { "ServiceDiscoveryExternal", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2316 (WPADBusMethodHandler)wpas_dbus_handler_p2p_serv_disc_external,
2318 { "arg", "i", ARG_IN },
2322 { "AddPersistentGroup", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2323 (WPADBusMethodHandler) wpas_dbus_handler_add_persistent_group,
2325 { "args", "a{sv}", ARG_IN },
2326 { "path", "o", ARG_OUT },
2330 { "RemovePersistentGroup", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2331 (WPADBusMethodHandler) wpas_dbus_handler_remove_persistent_group,
2333 { "path", "o", ARG_IN },
2337 { "RemoveAllPersistentGroups", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2338 (WPADBusMethodHandler)
2339 wpas_dbus_handler_remove_all_persistent_groups,
2344 #endif /* CONFIG_P2P */
2345 { "FlushBSS", WPAS_DBUS_NEW_IFACE_INTERFACE,
2346 (WPADBusMethodHandler) &wpas_dbus_handler_flush_bss,
2348 { "age", "u", ARG_IN },
2352 { NULL, NULL, NULL, { END_ARGS } }
2355 static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = {
2356 { "Capabilities", WPAS_DBUS_NEW_IFACE_INTERFACE, "a{sv}",
2357 wpas_dbus_getter_capabilities,
2360 { "State", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2361 wpas_dbus_getter_state,
2364 { "Scanning", WPAS_DBUS_NEW_IFACE_INTERFACE, "b",
2365 wpas_dbus_getter_scanning,
2368 { "ApScan", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
2369 wpas_dbus_getter_ap_scan,
2370 wpas_dbus_setter_ap_scan,
2373 { "BSSExpireAge", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
2374 wpas_dbus_getter_bss_expire_age,
2375 wpas_dbus_setter_bss_expire_age,
2378 { "BSSExpireCount", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
2379 wpas_dbus_getter_bss_expire_count,
2380 wpas_dbus_setter_bss_expire_count,
2383 { "Country", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2384 wpas_dbus_getter_country,
2385 wpas_dbus_setter_country,
2388 { "Ifname", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2389 wpas_dbus_getter_ifname,
2392 { "Driver", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2393 wpas_dbus_getter_driver,
2396 { "BridgeIfname", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2397 wpas_dbus_getter_bridge_ifname,
2400 { "CurrentBSS", WPAS_DBUS_NEW_IFACE_INTERFACE, "o",
2401 wpas_dbus_getter_current_bss,
2404 { "CurrentNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE, "o",
2405 wpas_dbus_getter_current_network,
2408 { "CurrentAuthMode", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2409 wpas_dbus_getter_current_auth_mode,
2412 { "Blobs", WPAS_DBUS_NEW_IFACE_INTERFACE, "a{say}",
2413 wpas_dbus_getter_blobs,
2416 { "BSSs", WPAS_DBUS_NEW_IFACE_INTERFACE, "ao",
2417 wpas_dbus_getter_bsss,
2420 { "Networks", WPAS_DBUS_NEW_IFACE_INTERFACE, "ao",
2421 wpas_dbus_getter_networks,
2425 { "ProcessCredentials", WPAS_DBUS_NEW_IFACE_WPS, "b",
2426 wpas_dbus_getter_process_credentials,
2427 wpas_dbus_setter_process_credentials,
2430 #endif /* CONFIG_WPS */
2432 { "P2PDeviceProperties", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "a{sv}",
2433 wpas_dbus_getter_p2p_device_properties,
2434 wpas_dbus_setter_p2p_device_properties,
2437 { "Peers", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ao",
2438 wpas_dbus_getter_p2p_peers,
2441 { "Role", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "s",
2442 wpas_dbus_getter_p2p_role,
2445 { "Group", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "o",
2446 wpas_dbus_getter_p2p_group,
2449 { "PeerGO", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "o",
2450 wpas_dbus_getter_p2p_peergo,
2453 { "PersistentGroups", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ao",
2454 wpas_dbus_getter_persistent_groups,
2457 #endif /* CONFIG_P2P */
2458 { NULL, NULL, NULL, NULL, NULL, 0 }
2461 static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
2462 { "ScanDone", WPAS_DBUS_NEW_IFACE_INTERFACE,
2464 { "success", "b", ARG_OUT },
2468 { "BSSAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
2470 { "path", "o", ARG_OUT },
2471 { "properties", "a{sv}", ARG_OUT },
2475 { "BSSRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE,
2477 { "path", "o", ARG_OUT },
2481 { "BlobAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
2483 { "name", "s", ARG_OUT },
2487 { "BlobRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE,
2489 { "name", "s", ARG_OUT },
2493 { "NetworkAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
2495 { "path", "o", ARG_OUT },
2496 { "properties", "a{sv}", ARG_OUT },
2500 { "NetworkRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE,
2502 { "path", "o", ARG_OUT },
2506 { "NetworkSelected", WPAS_DBUS_NEW_IFACE_INTERFACE,
2508 { "path", "o", ARG_OUT },
2512 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_INTERFACE,
2514 { "properties", "a{sv}", ARG_OUT },
2519 { "Event", WPAS_DBUS_NEW_IFACE_WPS,
2521 { "name", "s", ARG_OUT },
2522 { "args", "a{sv}", ARG_OUT },
2526 { "Credentials", WPAS_DBUS_NEW_IFACE_WPS,
2528 { "credentials", "a{sv}", ARG_OUT },
2532 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_WPS,
2534 { "properties", "a{sv}", ARG_OUT },
2538 #endif /* CONFIG_WPS */
2540 { "P2PStateChanged", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2542 { "states", "a{ss}", ARG_OUT },
2546 { "DeviceFound", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2548 { "path", "o", ARG_OUT },
2549 { "properties", "a{sv}", ARG_OUT },
2553 { "DeviceLost", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2555 { "path", "o", ARG_OUT },
2559 { "ProvisionDiscoveryRequestDisplayPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2561 { "peer_object", "o", ARG_OUT },
2562 { "pin", "s", ARG_OUT },
2566 { "ProvisionDiscoveryResponseDisplayPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2568 { "peer_object", "o", ARG_OUT },
2569 { "pin", "s", ARG_OUT },
2573 { "ProvisionDiscoveryRequestEnterPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2575 { "peer_object", "o", ARG_OUT },
2579 { "ProvisionDiscoveryResponseEnterPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2581 { "peer_object", "o", ARG_OUT },
2585 { "ProvisionDiscoveryPBCRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2587 { "peer_object", "o", ARG_OUT },
2591 { "ProvisionDiscoveryPBCResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2593 { "peer_object", "o", ARG_OUT },
2597 { "ProvisionDiscoveryFailure", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2599 { "peer_object", "o", ARG_OUT },
2600 { "status", "i", ARG_OUT },
2604 { "GroupStarted", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2606 { "properties", "a{sv}", ARG_OUT },
2610 { "GONegotiationSuccess", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2615 { "GONegotiationFailure", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2617 { "status", "i", ARG_OUT },
2621 { "GONegotiationRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2623 { "path", "o", ARG_OUT },
2624 { "dev_passwd_id", "i", ARG_OUT },
2628 { "InvitationResult", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2630 { "invite_result", "a{sv}", ARG_OUT },
2634 { "GroupFinished", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2636 { "ifname", "s", ARG_OUT },
2637 { "role", "s", ARG_OUT },
2641 { "ServiceDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2643 { "sd_request", "a{sv}", ARG_OUT },
2647 { "ServiceDiscoveryResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2649 { "sd_response", "a{sv}", ARG_OUT },
2653 { "PersistentGroupAdded", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2655 { "path", "o", ARG_OUT },
2656 { "properties", "a{sv}", ARG_OUT },
2660 { "PersistentGroupRemoved", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2662 { "path", "o", ARG_OUT },
2666 { "WpsFailed", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2668 { "name", "s", ARG_OUT },
2669 { "args", "a{sv}", ARG_OUT },
2673 #endif /* CONFIG_P2P */
2674 { "Certification", WPAS_DBUS_NEW_IFACE_INTERFACE,
2676 { "certification", "a{sv}", ARG_OUT },
2680 { NULL, NULL, { END_ARGS } }
2684 int wpas_dbus_register_interface(struct wpa_supplicant *wpa_s)
2687 struct wpa_dbus_object_desc *obj_desc = NULL;
2688 struct wpas_dbus_priv *ctrl_iface = wpa_s->global->dbus;
2691 /* Do nothing if the control interface is not turned on */
2692 if (ctrl_iface == NULL)
2695 /* Create and set the interface's object path */
2696 wpa_s->dbus_new_path = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
2697 if (wpa_s->dbus_new_path == NULL)
2699 next = ctrl_iface->next_objid++;
2700 os_snprintf(wpa_s->dbus_new_path, WPAS_DBUS_OBJECT_PATH_MAX,
2701 WPAS_DBUS_NEW_PATH_INTERFACES "/%u",
2704 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
2706 wpa_printf(MSG_ERROR, "Not enough memory "
2707 "to create object description");
2711 wpas_dbus_register(obj_desc, wpa_s, NULL, wpas_dbus_interface_methods,
2712 wpas_dbus_interface_properties,
2713 wpas_dbus_interface_signals);
2715 wpa_printf(MSG_DEBUG, "dbus: Register interface object '%s'",
2716 wpa_s->dbus_new_path);
2717 if (wpa_dbus_register_object_per_iface(ctrl_iface,
2718 wpa_s->dbus_new_path,
2719 wpa_s->ifname, obj_desc))
2722 wpas_dbus_signal_interface_added(wpa_s);
2727 os_free(wpa_s->dbus_new_path);
2728 wpa_s->dbus_new_path = NULL;
2729 free_dbus_object_desc(obj_desc);
2734 int wpas_dbus_unregister_interface(struct wpa_supplicant *wpa_s)
2736 struct wpas_dbus_priv *ctrl_iface;
2738 /* Do nothing if the control interface is not turned on */
2739 if (wpa_s == NULL || wpa_s->global == NULL)
2741 ctrl_iface = wpa_s->global->dbus;
2742 if (ctrl_iface == NULL)
2745 wpa_printf(MSG_DEBUG, "dbus: Unregister interface object '%s'",
2746 wpa_s->dbus_new_path);
2747 if (wpa_dbus_unregister_object_per_iface(ctrl_iface,
2748 wpa_s->dbus_new_path))
2751 wpas_dbus_signal_interface_removed(wpa_s);
2753 os_free(wpa_s->dbus_new_path);
2754 wpa_s->dbus_new_path = NULL;
2761 static const struct wpa_dbus_property_desc wpas_dbus_p2p_peer_properties[] = {
2762 { "Properties", WPAS_DBUS_NEW_IFACE_P2P_PEER, "a{sv}",
2763 wpas_dbus_getter_p2p_peer_properties,
2766 { "IEs", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ay",
2767 wpas_dbus_getter_p2p_peer_ies,
2770 { NULL, NULL, NULL, NULL, NULL, 0 }
2773 static const struct wpa_dbus_signal_desc wpas_dbus_p2p_peer_signals[] = {
2775 { NULL, NULL, { END_ARGS } }
2779 * wpas_dbus_signal_peer - Send a peer related event signal
2780 * @wpa_s: %wpa_supplicant network interface data
2781 * @dev: peer device object
2782 * @interface: name of the interface emitting this signal.
2783 * In case of peer objects, it would be emitted by either
2784 * the "interface object" or by "peer objects"
2785 * @sig_name: signal name - DeviceFound
2787 * Notify listeners about event related with newly found p2p peer device
2789 static void wpas_dbus_signal_peer(struct wpa_supplicant *wpa_s,
2790 const u8 *dev_addr, const char *interface,
2791 const char *sig_name)
2793 struct wpas_dbus_priv *iface;
2795 DBusMessageIter iter;
2796 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
2798 iface = wpa_s->global->dbus;
2800 /* Do nothing if the control interface is not turned on */
2804 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2805 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
2806 wpa_s->dbus_new_path, MAC2STR(dev_addr));
2808 msg = dbus_message_new_signal(wpa_s->dbus_new_path, interface,
2813 dbus_message_iter_init_append(msg, &iter);
2814 path = peer_obj_path;
2815 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
2819 dbus_connection_send(iface->con, msg, NULL);
2821 dbus_message_unref(msg);
2825 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
2826 dbus_message_unref(msg);
2831 * wpas_dbus_signal_peer_found - Send a peer found signal
2832 * @wpa_s: %wpa_supplicant network interface data
2833 * @dev: peer device object
2835 * Notify listeners about find a p2p peer device found
2837 void wpas_dbus_signal_peer_device_found(struct wpa_supplicant *wpa_s,
2840 wpas_dbus_signal_peer(wpa_s, dev_addr,
2841 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2846 * wpas_dbus_signal_peer_lost - Send a peer lost signal
2847 * @wpa_s: %wpa_supplicant network interface data
2848 * @dev: peer device object
2850 * Notify listeners about lost a p2p peer device
2852 void wpas_dbus_signal_peer_device_lost(struct wpa_supplicant *wpa_s,
2855 wpas_dbus_signal_peer(wpa_s, dev_addr,
2856 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2861 * wpas_dbus_register_peer - Register a discovered peer object with dbus
2862 * @wpa_s: wpa_supplicant interface structure
2863 * @ssid: network configuration data
2864 * Returns: 0 on success, -1 on failure
2866 * Registers network representing object with dbus
2868 int wpas_dbus_register_peer(struct wpa_supplicant *wpa_s, const u8 *dev_addr)
2870 struct wpas_dbus_priv *ctrl_iface;
2871 struct wpa_dbus_object_desc *obj_desc;
2872 struct peer_handler_args *arg;
2873 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2875 /* Do nothing if the control interface is not turned on */
2876 if (wpa_s == NULL || wpa_s->global == NULL)
2879 ctrl_iface = wpa_s->global->dbus;
2880 if (ctrl_iface == NULL)
2883 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2884 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
2885 wpa_s->dbus_new_path, MAC2STR(dev_addr));
2887 wpa_printf(MSG_INFO, "dbus: Register peer object '%s'",
2889 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
2891 wpa_printf(MSG_ERROR, "Not enough memory "
2892 "to create object description");
2896 /* allocate memory for handlers arguments */
2897 arg = os_zalloc(sizeof(struct peer_handler_args));
2899 wpa_printf(MSG_ERROR, "Not enough memory "
2900 "to create arguments for method");
2905 os_memcpy(arg->p2p_device_addr, dev_addr, ETH_ALEN);
2907 wpas_dbus_register(obj_desc, arg, wpa_dbus_free,
2909 wpas_dbus_p2p_peer_properties,
2910 wpas_dbus_p2p_peer_signals);
2912 if (wpa_dbus_register_object_per_iface(ctrl_iface, peer_obj_path,
2913 wpa_s->ifname, obj_desc))
2919 free_dbus_object_desc(obj_desc);
2924 * wpas_dbus_unregister_peer - Unregister a peer object with dbus
2925 * @wpa_s: wpa_supplicant interface structure
2926 * @dev_addr: p2p device addr
2927 * Returns: 0 on success, -1 on failure
2929 * Registers network representing object with dbus
2931 int wpas_dbus_unregister_peer(struct wpa_supplicant *wpa_s,
2934 struct wpas_dbus_priv *ctrl_iface;
2935 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2938 /* Do nothing if the control interface is not turned on */
2939 if (wpa_s == NULL || wpa_s->global == NULL ||
2940 wpa_s->dbus_new_path == NULL)
2942 ctrl_iface = wpa_s->global->dbus;
2943 if (ctrl_iface == NULL)
2946 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2947 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
2948 wpa_s->dbus_new_path, MAC2STR(dev_addr));
2950 wpa_printf(MSG_INFO, "dbus: Unregister peer object '%s'",
2952 ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, peer_obj_path);
2958 static const struct wpa_dbus_property_desc wpas_dbus_p2p_group_properties[] = {
2959 { "Members", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "ao",
2960 wpas_dbus_getter_p2p_group_members,
2964 WPAS_DBUS_NEW_IFACE_P2P_GROUP, "a{sv}",
2965 wpas_dbus_getter_p2p_group_properties,
2966 wpas_dbus_setter_p2p_group_properties,
2969 { NULL, NULL, NULL, NULL, NULL, 0 }
2972 static const struct wpa_dbus_signal_desc wpas_dbus_p2p_group_signals[] = {
2973 { "PeerJoined", WPAS_DBUS_NEW_IFACE_P2P_GROUP,
2975 { "peer", "o", ARG_OUT },
2979 { "PeerDisconnected", WPAS_DBUS_NEW_IFACE_P2P_GROUP,
2981 { "peer", "o", ARG_OUT },
2985 { NULL, NULL, { END_ARGS } }
2989 * wpas_dbus_register_p2p_group - Register a p2p group object with dbus
2990 * @wpa_s: wpa_supplicant interface structure
2991 * @ssid: SSID struct
2992 * Returns: 0 on success, -1 on failure
2994 * Registers p2p group representing object with dbus
2996 void wpas_dbus_register_p2p_group(struct wpa_supplicant *wpa_s,
2997 struct wpa_ssid *ssid)
2999 struct wpas_dbus_priv *ctrl_iface;
3000 struct wpa_dbus_object_desc *obj_desc;
3001 char group_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3003 /* Do nothing if the control interface is not turned on */
3004 if (wpa_s == NULL || wpa_s->global == NULL)
3007 ctrl_iface = wpa_s->global->dbus;
3008 if (ctrl_iface == NULL)
3011 if (wpa_s->dbus_groupobj_path) {
3012 wpa_printf(MSG_INFO, "%s: Group object '%s' already exists",
3013 __func__, wpa_s->dbus_groupobj_path);
3017 if (wpas_dbus_get_group_obj_path(wpa_s, ssid, group_obj_path) < 0)
3020 wpa_s->dbus_groupobj_path = os_strdup(group_obj_path);
3021 if (wpa_s->dbus_groupobj_path == NULL)
3024 wpa_printf(MSG_INFO, "dbus: Register group object '%s'",
3026 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
3028 wpa_printf(MSG_ERROR, "Not enough memory "
3029 "to create object description");
3033 wpas_dbus_register(obj_desc, wpa_s, NULL, NULL,
3034 wpas_dbus_p2p_group_properties,
3035 wpas_dbus_p2p_group_signals);
3037 if (wpa_dbus_register_object_per_iface(ctrl_iface, group_obj_path,
3038 wpa_s->ifname, obj_desc))
3044 if (wpa_s->dbus_groupobj_path) {
3045 os_free(wpa_s->dbus_groupobj_path);
3046 wpa_s->dbus_groupobj_path = NULL;
3049 free_dbus_object_desc(obj_desc);
3053 * wpas_dbus_unregister_p2p_group - Unregister a p2p group object from dbus
3054 * @wpa_s: wpa_supplicant interface structure
3055 * @ssid: network name of the p2p group started
3057 void wpas_dbus_unregister_p2p_group(struct wpa_supplicant *wpa_s,
3058 const struct wpa_ssid *ssid)
3060 struct wpas_dbus_priv *ctrl_iface;
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) {
3071 wpa_printf(MSG_DEBUG,
3072 "%s: Group object '%s' already unregistered",
3073 __func__, wpa_s->dbus_groupobj_path);
3077 wpa_printf(MSG_DEBUG, "dbus: Unregister group object '%s'",
3078 wpa_s->dbus_groupobj_path);
3080 wpa_dbus_unregister_object_per_iface(ctrl_iface,
3081 wpa_s->dbus_groupobj_path);
3083 os_free(wpa_s->dbus_groupobj_path);
3084 wpa_s->dbus_groupobj_path = NULL;
3087 static const struct wpa_dbus_property_desc
3088 wpas_dbus_p2p_groupmember_properties[] = {
3089 { "Properties", WPAS_DBUS_NEW_IFACE_P2P_GROUPMEMBER, "a{sv}",
3090 wpas_dbus_getter_p2p_group_properties,
3093 { NULL, NULL, NULL, NULL, NULL, 0 }
3097 * wpas_dbus_register_p2p_groupmember - Register a p2p groupmember
3099 * @wpa_s: wpa_supplicant interface structure
3100 * @p2p_if_addr: i/f addr of the device joining this group
3102 * Registers p2p groupmember representing object with dbus
3104 void wpas_dbus_register_p2p_groupmember(struct wpa_supplicant *wpa_s,
3105 const u8 *p2p_if_addr)
3107 struct wpas_dbus_priv *ctrl_iface;
3108 struct wpa_dbus_object_desc *obj_desc = NULL;
3109 struct groupmember_handler_args *arg;
3110 char groupmember_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 ctrl_iface = wpa_s->global->dbus;
3117 if (ctrl_iface == NULL)
3120 if (!wpa_s->dbus_groupobj_path)
3123 os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3124 "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/" COMPACT_MACSTR,
3125 wpa_s->dbus_groupobj_path, MAC2STR(p2p_if_addr));
3127 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
3129 wpa_printf(MSG_ERROR, "Not enough memory "
3130 "to create object description");
3134 /* allocate memory for handlers arguments */
3135 arg = os_zalloc(sizeof(struct groupmember_handler_args));
3137 wpa_printf(MSG_ERROR, "Not enough memory "
3138 "to create arguments for method");
3143 os_memcpy(arg->member_addr, p2p_if_addr, ETH_ALEN);
3145 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
3146 wpas_dbus_p2p_groupmember_properties, NULL);
3148 if (wpa_dbus_register_object_per_iface(ctrl_iface, groupmember_obj_path,
3149 wpa_s->ifname, obj_desc))
3152 wpa_printf(MSG_INFO,
3153 "dbus: Registered group member object '%s' successfully",
3154 groupmember_obj_path);
3158 free_dbus_object_desc(obj_desc);
3162 * wpas_dbus_unregister_p2p_groupmember - Unregister a p2p groupmember
3164 * @wpa_s: wpa_supplicant interface structure
3165 * @p2p_if_addr: i/f addr of the device joining this group
3167 * Unregisters p2p groupmember representing object with dbus
3169 void wpas_dbus_unregister_p2p_groupmember(struct wpa_supplicant *wpa_s,
3170 const u8 *p2p_if_addr)
3172 struct wpas_dbus_priv *ctrl_iface;
3173 char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3175 /* Do nothing if the control interface is not turned on */
3176 if (wpa_s == NULL || wpa_s->global == NULL)
3179 ctrl_iface = wpa_s->global->dbus;
3180 if (ctrl_iface == NULL)
3183 if (!wpa_s->dbus_groupobj_path)
3186 os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3187 "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/" COMPACT_MACSTR,
3188 wpa_s->dbus_groupobj_path, MAC2STR(p2p_if_addr));
3190 wpa_dbus_unregister_object_per_iface(ctrl_iface, groupmember_obj_path);
3194 static const struct wpa_dbus_property_desc
3195 wpas_dbus_persistent_group_properties[] = {
3196 { "Properties", WPAS_DBUS_NEW_IFACE_PERSISTENT_GROUP, "a{sv}",
3197 wpas_dbus_getter_persistent_group_properties,
3198 wpas_dbus_setter_persistent_group_properties,
3201 { NULL, NULL, NULL, NULL, NULL, 0 }
3204 /* No signals intended for persistent group objects */
3207 * wpas_dbus_register_persistent_group - Register a configured(saved)
3208 * persistent group with dbus
3209 * @wpa_s: wpa_supplicant interface structure
3210 * @ssid: persistent group (still represented as a network within wpa)
3211 * configuration data
3212 * Returns: 0 on success, -1 on failure
3214 * Registers a persistent group representing object with dbus.
3216 int wpas_dbus_register_persistent_group(struct wpa_supplicant *wpa_s,
3217 struct wpa_ssid *ssid)
3219 struct wpas_dbus_priv *ctrl_iface;
3220 struct wpa_dbus_object_desc *obj_desc;
3221 struct network_handler_args *arg;
3222 char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3224 /* Do nothing if the control interface is not turned on */
3225 if (wpa_s == NULL || wpa_s->global == NULL)
3228 /* Make sure ssid is a persistent group */
3229 if (ssid->disabled != 2 && !ssid->p2p_persistent_group)
3230 return -1; /* should we return w/o complaining? */
3232 ctrl_iface = wpa_s->global->dbus;
3233 if (ctrl_iface == NULL)
3237 * Intentionally not coming up with different numbering scheme
3238 * for persistent groups.
3240 os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3241 "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
3242 wpa_s->dbus_new_path, ssid->id);
3244 wpa_printf(MSG_DEBUG, "dbus: Register persistent group object '%s'",
3246 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
3248 wpa_printf(MSG_ERROR, "dbus: Not enough memory to create "
3249 "object description");
3254 * Reusing the same context structure as that for networks
3255 * since these are represented using same data structure.
3257 /* allocate memory for handlers arguments */
3258 arg = os_zalloc(sizeof(struct network_handler_args));
3260 wpa_printf(MSG_ERROR, "dbus: Not enough memory to create "
3261 "arguments for method");
3268 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
3269 wpas_dbus_persistent_group_properties,
3272 if (wpa_dbus_register_object_per_iface(ctrl_iface, pgrp_obj_path,
3273 wpa_s->ifname, obj_desc))
3276 wpas_dbus_signal_persistent_group_added(wpa_s, ssid->id);
3281 free_dbus_object_desc(obj_desc);
3287 * wpas_dbus_unregister_persistent_group - Unregister a persistent_group
3289 * @wpa_s: wpa_supplicant interface structure
3291 * Returns: 0 on success, -1 on failure
3293 * Unregisters persistent group representing object from dbus
3295 * NOTE: There is a slight issue with the semantics here. While the
3296 * implementation simply means the persistent group is unloaded from memory,
3297 * it should not get interpreted as the group is actually being erased/removed
3298 * from persistent storage as well.
3300 int wpas_dbus_unregister_persistent_group(struct wpa_supplicant *wpa_s,
3303 struct wpas_dbus_priv *ctrl_iface;
3304 char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3307 /* Do nothing if the control interface is not turned on */
3308 if (wpa_s == NULL || wpa_s->global == NULL ||
3309 wpa_s->dbus_new_path == NULL)
3311 ctrl_iface = wpa_s->global->dbus;
3312 if (ctrl_iface == NULL)
3315 os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3316 "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
3317 wpa_s->dbus_new_path, nid);
3319 wpa_printf(MSG_DEBUG, "dbus: Unregister persistent group object '%s'",
3321 ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, pgrp_obj_path);
3324 wpas_dbus_signal_persistent_group_removed(wpa_s, nid);
3329 #endif /* CONFIG_P2P */