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",
1382 * wpas_dbus_signal_p2p_wps_failed - Signals WpsFailed event
1383 * @wpa_s: %wpa_supplicant network interface data
1385 * Sends Event dbus signal with name "fail" and dictionary containing
1386 * "msg" field with fail message number (int32) as arguments
1388 void wpas_dbus_signal_p2p_wps_failed(struct wpa_supplicant *wpa_s,
1389 struct wps_event_fail *fail)
1393 DBusMessageIter iter, dict_iter;
1394 struct wpas_dbus_priv *iface;
1397 iface = wpa_s->global->dbus;
1399 /* Do nothing if the control interface is not turned on */
1403 msg = dbus_message_new_signal(wpa_s->dbus_new_path,
1404 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
1409 dbus_message_iter_init_append(msg, &iter);
1411 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key) ||
1412 !wpa_dbus_dict_open_write(&iter, &dict_iter) ||
1413 !wpa_dbus_dict_append_int32(&dict_iter, "msg", fail->msg) ||
1414 !wpa_dbus_dict_append_int16(&dict_iter, "config_error",
1415 fail->config_error) ||
1416 !wpa_dbus_dict_close_write(&iter, &dict_iter))
1417 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
1419 dbus_connection_send(iface->con, msg, NULL);
1421 dbus_message_unref(msg);
1424 #endif /*CONFIG_P2P*/
1428 * wpas_dbus_signal_prop_changed - Signals change of property
1429 * @wpa_s: %wpa_supplicant network interface data
1430 * @property: indicates which property has changed
1432 * Sends PropertyChanged signals with path, interface and arguments
1433 * depending on which property has changed.
1435 void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
1436 enum wpas_dbus_prop property)
1438 WPADBusPropertyAccessor getter;
1441 if (wpa_s->dbus_new_path == NULL)
1442 return; /* Skip signal since D-Bus setup is not yet ready */
1445 case WPAS_DBUS_PROP_AP_SCAN:
1446 getter = (WPADBusPropertyAccessor) wpas_dbus_getter_ap_scan;
1449 case WPAS_DBUS_PROP_SCANNING:
1450 getter = (WPADBusPropertyAccessor) wpas_dbus_getter_scanning;
1453 case WPAS_DBUS_PROP_STATE:
1454 getter = (WPADBusPropertyAccessor) wpas_dbus_getter_state;
1457 case WPAS_DBUS_PROP_CURRENT_BSS:
1458 getter = (WPADBusPropertyAccessor)
1459 wpas_dbus_getter_current_bss;
1460 prop = "CurrentBSS";
1462 case WPAS_DBUS_PROP_CURRENT_NETWORK:
1463 getter = (WPADBusPropertyAccessor)
1464 wpas_dbus_getter_current_network;
1465 prop = "CurrentNetwork";
1467 case WPAS_DBUS_PROP_BSSS:
1468 getter = (WPADBusPropertyAccessor) wpas_dbus_getter_bsss;
1471 case WPAS_DBUS_PROP_CURRENT_AUTH_MODE:
1472 getter = (WPADBusPropertyAccessor)
1473 wpas_dbus_getter_current_auth_mode;
1474 prop = "CurrentAuthMode";
1477 wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
1478 __func__, property);
1482 wpa_dbus_mark_property_changed(wpa_s->global->dbus,
1483 wpa_s->dbus_new_path,
1484 WPAS_DBUS_NEW_IFACE_INTERFACE, prop);
1489 * wpas_dbus_bss_signal_prop_changed - Signals change of BSS property
1490 * @wpa_s: %wpa_supplicant network interface data
1491 * @property: indicates which property has changed
1492 * @id: unique BSS identifier
1494 * Sends PropertyChanged signals with path, interface, and arguments depending
1495 * on which property has changed.
1497 void wpas_dbus_bss_signal_prop_changed(struct wpa_supplicant *wpa_s,
1498 enum wpas_dbus_bss_prop property,
1501 char path[WPAS_DBUS_OBJECT_PATH_MAX];
1505 case WPAS_DBUS_BSS_PROP_SIGNAL:
1508 case WPAS_DBUS_BSS_PROP_FREQ:
1511 case WPAS_DBUS_BSS_PROP_MODE:
1514 case WPAS_DBUS_BSS_PROP_PRIVACY:
1517 case WPAS_DBUS_BSS_PROP_RATES:
1520 case WPAS_DBUS_BSS_PROP_WPA:
1523 case WPAS_DBUS_BSS_PROP_RSN:
1526 case WPAS_DBUS_BSS_PROP_IES:
1530 wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
1531 __func__, property);
1535 os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
1536 "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
1537 wpa_s->dbus_new_path, id);
1539 wpa_dbus_mark_property_changed(wpa_s->global->dbus, path,
1540 WPAS_DBUS_NEW_IFACE_BSS, prop);
1545 * wpas_dbus_signal_debug_level_changed - Signals change of debug param
1546 * @global: wpa_global structure
1548 * Sends PropertyChanged signals informing that debug level has changed.
1550 void wpas_dbus_signal_debug_level_changed(struct wpa_global *global)
1552 wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
1553 WPAS_DBUS_NEW_INTERFACE,
1559 * wpas_dbus_signal_debug_timestamp_changed - Signals change of debug param
1560 * @global: wpa_global structure
1562 * Sends PropertyChanged signals informing that debug timestamp has changed.
1564 void wpas_dbus_signal_debug_timestamp_changed(struct wpa_global *global)
1566 wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
1567 WPAS_DBUS_NEW_INTERFACE,
1573 * wpas_dbus_signal_debug_show_keys_changed - Signals change of debug param
1574 * @global: wpa_global structure
1576 * Sends PropertyChanged signals informing that debug show_keys has changed.
1578 void wpas_dbus_signal_debug_show_keys_changed(struct wpa_global *global)
1580 wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
1581 WPAS_DBUS_NEW_INTERFACE,
1586 static void wpas_dbus_register(struct wpa_dbus_object_desc *obj_desc,
1588 WPADBusArgumentFreeFunction priv_free,
1589 const struct wpa_dbus_method_desc *methods,
1590 const struct wpa_dbus_property_desc *properties,
1591 const struct wpa_dbus_signal_desc *signals)
1595 obj_desc->user_data = priv;
1596 obj_desc->user_data_free_func = priv_free;
1597 obj_desc->methods = methods;
1598 obj_desc->properties = properties;
1599 obj_desc->signals = signals;
1601 for (n = 0; properties && properties->dbus_property; properties++)
1604 obj_desc->prop_changed_flags = os_zalloc(n);
1605 if (!obj_desc->prop_changed_flags)
1606 wpa_printf(MSG_DEBUG, "dbus: %s: can't register handlers",
1611 static const struct wpa_dbus_method_desc wpas_dbus_global_methods[] = {
1612 { "CreateInterface", WPAS_DBUS_NEW_INTERFACE,
1613 (WPADBusMethodHandler) &wpas_dbus_handler_create_interface,
1615 { "args", "a{sv}", ARG_IN },
1616 { "path", "o", ARG_OUT },
1620 { "RemoveInterface", WPAS_DBUS_NEW_INTERFACE,
1621 (WPADBusMethodHandler) &wpas_dbus_handler_remove_interface,
1623 { "path", "o", ARG_IN },
1627 { "GetInterface", WPAS_DBUS_NEW_INTERFACE,
1628 (WPADBusMethodHandler) &wpas_dbus_handler_get_interface,
1630 { "ifname", "s", ARG_IN },
1631 { "path", "o", ARG_OUT },
1635 { NULL, NULL, NULL, { END_ARGS } }
1638 static const struct wpa_dbus_property_desc wpas_dbus_global_properties[] = {
1639 { "DebugLevel", WPAS_DBUS_NEW_INTERFACE, "s",
1640 (WPADBusPropertyAccessor) wpas_dbus_getter_debug_level,
1641 (WPADBusPropertyAccessor) wpas_dbus_setter_debug_level,
1644 { "DebugTimestamp", WPAS_DBUS_NEW_INTERFACE, "b",
1645 (WPADBusPropertyAccessor) wpas_dbus_getter_debug_timestamp,
1646 (WPADBusPropertyAccessor) wpas_dbus_setter_debug_timestamp,
1649 { "DebugShowKeys", WPAS_DBUS_NEW_INTERFACE, "b",
1650 (WPADBusPropertyAccessor) wpas_dbus_getter_debug_show_keys,
1651 (WPADBusPropertyAccessor) wpas_dbus_setter_debug_show_keys,
1654 { "Interfaces", WPAS_DBUS_NEW_INTERFACE, "ao",
1655 (WPADBusPropertyAccessor) &wpas_dbus_getter_interfaces,
1659 { "EapMethods", WPAS_DBUS_NEW_INTERFACE, "as",
1660 (WPADBusPropertyAccessor) wpas_dbus_getter_eap_methods,
1664 { NULL, NULL, NULL, NULL, NULL, 0 }
1667 static const struct wpa_dbus_signal_desc wpas_dbus_global_signals[] = {
1668 { "InterfaceAdded", WPAS_DBUS_NEW_INTERFACE,
1670 { "path", "o", ARG_OUT },
1671 { "properties", "a{sv}", ARG_OUT },
1675 { "InterfaceRemoved", WPAS_DBUS_NEW_INTERFACE,
1677 { "path", "o", ARG_OUT },
1681 { "PropertiesChanged", WPAS_DBUS_NEW_INTERFACE,
1683 { "properties", "a{sv}", ARG_OUT },
1687 { NULL, NULL, { END_ARGS } }
1692 * wpas_dbus_ctrl_iface_init - Initialize dbus control interface
1693 * @global: Pointer to global data from wpa_supplicant_init()
1694 * Returns: 0 on success or -1 on failure
1696 * Initialize the dbus control interface for wpa_supplicantand and start
1697 * receiving commands from external programs over the bus.
1699 int wpas_dbus_ctrl_iface_init(struct wpas_dbus_priv *priv)
1701 struct wpa_dbus_object_desc *obj_desc;
1704 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
1706 wpa_printf(MSG_ERROR, "Not enough memory "
1707 "to create object description");
1711 wpas_dbus_register(obj_desc, priv->global, NULL,
1712 wpas_dbus_global_methods,
1713 wpas_dbus_global_properties,
1714 wpas_dbus_global_signals);
1716 wpa_printf(MSG_DEBUG, "dbus: Register D-Bus object '%s'",
1717 WPAS_DBUS_NEW_PATH);
1718 ret = wpa_dbus_ctrl_iface_init(priv, WPAS_DBUS_NEW_PATH,
1719 WPAS_DBUS_NEW_SERVICE,
1722 free_dbus_object_desc(obj_desc);
1724 priv->dbus_new_initialized = 1;
1731 * wpas_dbus_ctrl_iface_deinit - Deinitialize dbus ctrl interface for
1733 * @iface: Pointer to dbus private data from wpas_dbus_init()
1735 * Deinitialize the dbus control interface that was initialized with
1736 * wpas_dbus_ctrl_iface_init().
1738 void wpas_dbus_ctrl_iface_deinit(struct wpas_dbus_priv *iface)
1740 if (!iface->dbus_new_initialized)
1742 wpa_printf(MSG_DEBUG, "dbus: Unregister D-Bus object '%s'",
1743 WPAS_DBUS_NEW_PATH);
1744 dbus_connection_unregister_object_path(iface->con,
1745 WPAS_DBUS_NEW_PATH);
1749 static void wpa_dbus_free(void *ptr)
1755 static const struct wpa_dbus_property_desc wpas_dbus_network_properties[] = {
1756 { "Properties", WPAS_DBUS_NEW_IFACE_NETWORK, "a{sv}",
1757 (WPADBusPropertyAccessor) wpas_dbus_getter_network_properties,
1758 (WPADBusPropertyAccessor) wpas_dbus_setter_network_properties,
1761 { "Enabled", WPAS_DBUS_NEW_IFACE_NETWORK, "b",
1762 (WPADBusPropertyAccessor) wpas_dbus_getter_enabled,
1763 (WPADBusPropertyAccessor) wpas_dbus_setter_enabled,
1766 { NULL, NULL, NULL, NULL, NULL, 0 }
1770 static const struct wpa_dbus_signal_desc wpas_dbus_network_signals[] = {
1771 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_NETWORK,
1773 { "properties", "a{sv}", ARG_OUT },
1777 { NULL, NULL, { END_ARGS } }
1782 * wpas_dbus_register_network - Register a configured network with dbus
1783 * @wpa_s: wpa_supplicant interface structure
1784 * @ssid: network configuration data
1785 * Returns: 0 on success, -1 on failure
1787 * Registers network representing object with dbus
1789 int wpas_dbus_register_network(struct wpa_supplicant *wpa_s,
1790 struct wpa_ssid *ssid)
1792 struct wpas_dbus_priv *ctrl_iface;
1793 struct wpa_dbus_object_desc *obj_desc;
1794 struct network_handler_args *arg;
1795 char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
1799 * If it is a persistent group register it as such.
1800 * This is to handle cases where an interface is being initialized
1801 * with a list of networks read from config.
1803 if (network_is_persistent_group(ssid))
1804 return wpas_dbus_register_persistent_group(wpa_s, ssid);
1805 #endif /* CONFIG_P2P */
1807 /* Do nothing if the control interface is not turned on */
1808 if (wpa_s == NULL || wpa_s->global == NULL)
1810 ctrl_iface = wpa_s->global->dbus;
1811 if (ctrl_iface == NULL)
1814 os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1815 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
1816 wpa_s->dbus_new_path, ssid->id);
1818 wpa_printf(MSG_DEBUG, "dbus: Register network object '%s'",
1820 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
1822 wpa_printf(MSG_ERROR, "Not enough memory "
1823 "to create object description");
1827 /* allocate memory for handlers arguments */
1828 arg = os_zalloc(sizeof(struct network_handler_args));
1830 wpa_printf(MSG_ERROR, "Not enough memory "
1831 "to create arguments for method");
1838 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
1839 wpas_dbus_network_properties,
1840 wpas_dbus_network_signals);
1842 if (wpa_dbus_register_object_per_iface(ctrl_iface, net_obj_path,
1843 wpa_s->ifname, obj_desc))
1846 wpas_dbus_signal_network_added(wpa_s, ssid->id);
1851 free_dbus_object_desc(obj_desc);
1857 * wpas_dbus_unregister_network - Unregister a configured network from dbus
1858 * @wpa_s: wpa_supplicant interface structure
1860 * Returns: 0 on success, -1 on failure
1862 * Unregisters network representing object from dbus
1864 int wpas_dbus_unregister_network(struct wpa_supplicant *wpa_s, int nid)
1866 struct wpas_dbus_priv *ctrl_iface;
1867 char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
1869 struct wpa_ssid *ssid;
1871 ssid = wpa_config_get_network(wpa_s->conf, nid);
1874 /* If it is a persistent group unregister it as such */
1875 if (ssid && network_is_persistent_group(ssid))
1876 return wpas_dbus_unregister_persistent_group(wpa_s, nid);
1877 #endif /* CONFIG_P2P */
1879 /* Do nothing if the control interface is not turned on */
1880 if (wpa_s == NULL || wpa_s->global == NULL ||
1881 wpa_s->dbus_new_path == NULL)
1883 ctrl_iface = wpa_s->global->dbus;
1884 if (ctrl_iface == NULL)
1887 os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1888 "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
1889 wpa_s->dbus_new_path, nid);
1891 wpa_printf(MSG_DEBUG, "dbus: Unregister network object '%s'",
1893 ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, net_obj_path);
1896 wpas_dbus_signal_network_removed(wpa_s, nid);
1902 static const struct wpa_dbus_property_desc wpas_dbus_bss_properties[] = {
1903 { "SSID", WPAS_DBUS_NEW_IFACE_BSS, "ay",
1904 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_ssid,
1908 { "BSSID", WPAS_DBUS_NEW_IFACE_BSS, "ay",
1909 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_bssid,
1913 { "Privacy", WPAS_DBUS_NEW_IFACE_BSS, "b",
1914 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_privacy,
1918 { "Mode", WPAS_DBUS_NEW_IFACE_BSS, "s",
1919 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_mode,
1923 { "Signal", WPAS_DBUS_NEW_IFACE_BSS, "n",
1924 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_signal,
1928 { "Frequency", WPAS_DBUS_NEW_IFACE_BSS, "q",
1929 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_frequency,
1933 { "Rates", WPAS_DBUS_NEW_IFACE_BSS, "au",
1934 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_rates,
1938 { "WPA", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
1939 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_wpa,
1943 { "RSN", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
1944 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_rsn,
1948 { "IEs", WPAS_DBUS_NEW_IFACE_BSS, "ay",
1949 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_ies,
1953 { NULL, NULL, NULL, NULL, NULL, 0 }
1957 static const struct wpa_dbus_signal_desc wpas_dbus_bss_signals[] = {
1958 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_BSS,
1960 { "properties", "a{sv}", ARG_OUT },
1964 { NULL, NULL, { END_ARGS } }
1969 * wpas_dbus_unregister_bss - Unregister a scanned BSS from dbus
1970 * @wpa_s: wpa_supplicant interface structure
1971 * @bssid: scanned network bssid
1972 * @id: unique BSS identifier
1973 * Returns: 0 on success, -1 on failure
1975 * Unregisters BSS representing object from dbus
1977 int wpas_dbus_unregister_bss(struct wpa_supplicant *wpa_s,
1978 u8 bssid[ETH_ALEN], unsigned int id)
1980 struct wpas_dbus_priv *ctrl_iface;
1981 char bss_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
1983 /* Do nothing if the control interface is not turned on */
1984 if (wpa_s == NULL || wpa_s->global == NULL)
1986 ctrl_iface = wpa_s->global->dbus;
1987 if (ctrl_iface == NULL)
1990 os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
1991 "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
1992 wpa_s->dbus_new_path, id);
1994 wpa_printf(MSG_DEBUG, "dbus: Unregister BSS object '%s'",
1996 if (wpa_dbus_unregister_object_per_iface(ctrl_iface, bss_obj_path)) {
1997 wpa_printf(MSG_ERROR, "dbus: Cannot unregister BSS object %s",
2002 wpas_dbus_signal_bss_removed(wpa_s, bss_obj_path);
2003 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_BSSS);
2010 * wpas_dbus_register_bss - Register a scanned BSS with dbus
2011 * @wpa_s: wpa_supplicant interface structure
2012 * @bssid: scanned network bssid
2013 * @id: unique BSS identifier
2014 * Returns: 0 on success, -1 on failure
2016 * Registers BSS representing object with dbus
2018 int wpas_dbus_register_bss(struct wpa_supplicant *wpa_s,
2019 u8 bssid[ETH_ALEN], unsigned int id)
2021 struct wpas_dbus_priv *ctrl_iface;
2022 struct wpa_dbus_object_desc *obj_desc;
2023 char bss_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2024 struct bss_handler_args *arg;
2026 /* Do nothing if the control interface is not turned on */
2027 if (wpa_s == NULL || wpa_s->global == NULL)
2029 ctrl_iface = wpa_s->global->dbus;
2030 if (ctrl_iface == NULL)
2033 os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2034 "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
2035 wpa_s->dbus_new_path, id);
2037 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
2039 wpa_printf(MSG_ERROR, "Not enough memory "
2040 "to create object description");
2044 arg = os_zalloc(sizeof(struct bss_handler_args));
2046 wpa_printf(MSG_ERROR, "Not enough memory "
2047 "to create arguments for handler");
2053 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
2054 wpas_dbus_bss_properties,
2055 wpas_dbus_bss_signals);
2057 wpa_printf(MSG_DEBUG, "dbus: Register BSS object '%s'",
2059 if (wpa_dbus_register_object_per_iface(ctrl_iface, bss_obj_path,
2060 wpa_s->ifname, obj_desc)) {
2061 wpa_printf(MSG_ERROR,
2062 "Cannot register BSSID dbus object %s.",
2067 wpas_dbus_signal_bss_added(wpa_s, bss_obj_path);
2068 wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_BSSS);
2073 free_dbus_object_desc(obj_desc);
2078 static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
2079 { "Scan", WPAS_DBUS_NEW_IFACE_INTERFACE,
2080 (WPADBusMethodHandler) &wpas_dbus_handler_scan,
2082 { "args", "a{sv}", ARG_IN },
2086 { "Disconnect", WPAS_DBUS_NEW_IFACE_INTERFACE,
2087 (WPADBusMethodHandler) &wpas_dbus_handler_disconnect,
2092 { "AddNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
2093 (WPADBusMethodHandler) &wpas_dbus_handler_add_network,
2095 { "args", "a{sv}", ARG_IN },
2096 { "path", "o", ARG_OUT },
2100 { "RemoveNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
2101 (WPADBusMethodHandler) &wpas_dbus_handler_remove_network,
2103 { "path", "o", ARG_IN },
2107 { "RemoveAllNetworks", WPAS_DBUS_NEW_IFACE_INTERFACE,
2108 (WPADBusMethodHandler) &wpas_dbus_handler_remove_all_networks,
2113 { "SelectNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
2114 (WPADBusMethodHandler) &wpas_dbus_handler_select_network,
2116 { "path", "o", ARG_IN },
2120 { "AddBlob", WPAS_DBUS_NEW_IFACE_INTERFACE,
2121 (WPADBusMethodHandler) &wpas_dbus_handler_add_blob,
2123 { "name", "s", ARG_IN },
2124 { "data", "ay", ARG_IN },
2128 { "GetBlob", WPAS_DBUS_NEW_IFACE_INTERFACE,
2129 (WPADBusMethodHandler) &wpas_dbus_handler_get_blob,
2131 { "name", "s", ARG_IN },
2132 { "data", "ay", ARG_OUT },
2136 { "RemoveBlob", WPAS_DBUS_NEW_IFACE_INTERFACE,
2137 (WPADBusMethodHandler) &wpas_dbus_handler_remove_blob,
2139 { "name", "s", ARG_IN },
2144 { "Start", WPAS_DBUS_NEW_IFACE_WPS,
2145 (WPADBusMethodHandler) &wpas_dbus_handler_wps_start,
2147 { "args", "a{sv}", ARG_IN },
2148 { "output", "a{sv}", ARG_OUT },
2152 #endif /* CONFIG_WPS */
2154 { "Find", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2155 (WPADBusMethodHandler)wpas_dbus_handler_p2p_find,
2157 { "args", "a{sv}", ARG_IN },
2161 { "StopFind", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2162 (WPADBusMethodHandler)wpas_dbus_handler_p2p_stop_find,
2167 { "Listen", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2168 (WPADBusMethodHandler)wpas_dbus_handler_p2p_listen,
2170 { "timeout", "i", ARG_IN },
2174 { "ExtendedListen", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2175 (WPADBusMethodHandler)wpas_dbus_handler_p2p_extendedlisten,
2177 { "args", "a{sv}", ARG_IN },
2181 { "PresenceRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2182 (WPADBusMethodHandler)wpas_dbus_handler_p2p_presence_request,
2184 { "args", "a{sv}", ARG_IN },
2188 { "ProvisionDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2189 (WPADBusMethodHandler)wpas_dbus_handler_p2p_prov_disc_req,
2191 { "peer", "o", ARG_IN },
2192 { "config_method", "s", ARG_IN },
2196 { "Connect", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2197 (WPADBusMethodHandler)wpas_dbus_handler_p2p_connect,
2199 { "args", "a{sv}", ARG_IN },
2200 { "generated_pin", "i", ARG_OUT },
2204 { "GroupAdd", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2205 (WPADBusMethodHandler)wpas_dbus_handler_p2p_group_add,
2207 { "args", "a{sv}", ARG_IN },
2211 { "Invite", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2212 (WPADBusMethodHandler)wpas_dbus_handler_p2p_invite,
2214 { "args", "a{sv}", ARG_IN },
2218 { "Disconnect", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2219 (WPADBusMethodHandler)wpas_dbus_handler_p2p_disconnect,
2224 { "RejectPeer", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2225 (WPADBusMethodHandler)wpas_dbus_handler_p2p_rejectpeer,
2227 { "peer", "o", ARG_IN },
2231 { "Flush", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2232 (WPADBusMethodHandler)wpas_dbus_handler_p2p_flush,
2237 { "AddService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2238 (WPADBusMethodHandler)wpas_dbus_handler_p2p_add_service,
2240 { "args", "a{sv}", ARG_IN },
2244 { "DeleteService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2245 (WPADBusMethodHandler)wpas_dbus_handler_p2p_delete_service,
2247 { "args", "a{sv}", ARG_IN },
2251 { "FlushService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2252 (WPADBusMethodHandler)wpas_dbus_handler_p2p_flush_service,
2257 { "ServiceDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2258 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_req,
2260 { "args", "a{sv}", ARG_IN },
2264 { "ServiceDiscoveryResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2265 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_res,
2267 { "args", "a{sv}", ARG_IN },
2271 { "ServiceDiscoveryCancelRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2272 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_cancel_req,
2274 { "args", "t", ARG_IN },
2278 { "ServiceUpdate", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2279 (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_update,
2284 { "ServiceDiscoveryExternal", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2285 (WPADBusMethodHandler)wpas_dbus_handler_p2p_serv_disc_external,
2287 { "arg", "i", ARG_IN },
2291 { "ServiceDiscoveryExternal", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2292 (WPADBusMethodHandler)wpas_dbus_handler_p2p_serv_disc_external,
2294 { "arg", "i", ARG_IN },
2298 { "AddPersistentGroup", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2299 (WPADBusMethodHandler) wpas_dbus_handler_add_persistent_group,
2301 { "args", "a{sv}", ARG_IN },
2302 { "path", "o", ARG_OUT },
2306 { "RemovePersistentGroup", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2307 (WPADBusMethodHandler) wpas_dbus_handler_remove_persistent_group,
2309 { "path", "o", ARG_IN },
2313 { "RemoveAllPersistentGroups", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2314 (WPADBusMethodHandler)
2315 wpas_dbus_handler_remove_all_persistent_groups,
2320 #endif /* CONFIG_P2P */
2321 { "FlushBSS", WPAS_DBUS_NEW_IFACE_INTERFACE,
2322 (WPADBusMethodHandler) &wpas_dbus_handler_flush_bss,
2324 { "age", "u", ARG_IN },
2328 { NULL, NULL, NULL, { END_ARGS } }
2331 static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = {
2332 { "Capabilities", WPAS_DBUS_NEW_IFACE_INTERFACE, "a{sv}",
2333 (WPADBusPropertyAccessor) wpas_dbus_getter_capabilities,
2336 { "State", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2337 (WPADBusPropertyAccessor) wpas_dbus_getter_state,
2340 { "Scanning", WPAS_DBUS_NEW_IFACE_INTERFACE, "b",
2341 (WPADBusPropertyAccessor) wpas_dbus_getter_scanning,
2344 { "ApScan", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
2345 (WPADBusPropertyAccessor) wpas_dbus_getter_ap_scan,
2346 (WPADBusPropertyAccessor) wpas_dbus_setter_ap_scan,
2349 { "BSSExpireAge", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
2350 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_expire_age,
2351 (WPADBusPropertyAccessor) wpas_dbus_setter_bss_expire_age,
2354 { "BSSExpireCount", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
2355 (WPADBusPropertyAccessor) wpas_dbus_getter_bss_expire_count,
2356 (WPADBusPropertyAccessor) wpas_dbus_setter_bss_expire_count,
2359 { "Country", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2360 (WPADBusPropertyAccessor) wpas_dbus_getter_country,
2361 (WPADBusPropertyAccessor) wpas_dbus_setter_country,
2364 { "Ifname", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2365 (WPADBusPropertyAccessor) wpas_dbus_getter_ifname,
2368 { "Driver", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2369 (WPADBusPropertyAccessor) wpas_dbus_getter_driver,
2372 { "BridgeIfname", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2373 (WPADBusPropertyAccessor) wpas_dbus_getter_bridge_ifname,
2376 { "CurrentBSS", WPAS_DBUS_NEW_IFACE_INTERFACE, "o",
2377 (WPADBusPropertyAccessor) wpas_dbus_getter_current_bss,
2380 { "CurrentNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE, "o",
2381 (WPADBusPropertyAccessor) wpas_dbus_getter_current_network,
2384 { "CurrentAuthMode", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
2385 (WPADBusPropertyAccessor) wpas_dbus_getter_current_auth_mode,
2388 { "Blobs", WPAS_DBUS_NEW_IFACE_INTERFACE, "a{say}",
2389 (WPADBusPropertyAccessor) wpas_dbus_getter_blobs,
2392 { "BSSs", WPAS_DBUS_NEW_IFACE_INTERFACE, "ao",
2393 (WPADBusPropertyAccessor) wpas_dbus_getter_bsss,
2396 { "Networks", WPAS_DBUS_NEW_IFACE_INTERFACE, "ao",
2397 (WPADBusPropertyAccessor) wpas_dbus_getter_networks,
2401 { "ProcessCredentials", WPAS_DBUS_NEW_IFACE_WPS, "b",
2402 (WPADBusPropertyAccessor) wpas_dbus_getter_process_credentials,
2403 (WPADBusPropertyAccessor) wpas_dbus_setter_process_credentials,
2406 #endif /* CONFIG_WPS */
2408 { "P2PDeviceProperties", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "a{sv}",
2409 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_device_properties,
2410 (WPADBusPropertyAccessor) wpas_dbus_setter_p2p_device_properties,
2413 { "Peers", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ao",
2414 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_peers,
2417 { "Role", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "s",
2418 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_role,
2421 { "Group", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "o",
2422 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_group,
2425 { "PeerGO", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "o",
2426 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_peergo,
2429 { "PersistentGroups", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ao",
2430 (WPADBusPropertyAccessor) wpas_dbus_getter_persistent_groups,
2433 #endif /* CONFIG_P2P */
2434 { NULL, NULL, NULL, NULL, NULL, 0 }
2437 static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
2438 { "ScanDone", WPAS_DBUS_NEW_IFACE_INTERFACE,
2440 { "success", "b", ARG_OUT },
2444 { "BSSAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
2446 { "path", "o", ARG_OUT },
2447 { "properties", "a{sv}", ARG_OUT },
2451 { "BSSRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE,
2453 { "path", "o", ARG_OUT },
2457 { "BlobAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
2459 { "name", "s", ARG_OUT },
2463 { "BlobRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE,
2465 { "name", "s", ARG_OUT },
2469 { "NetworkAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
2471 { "path", "o", ARG_OUT },
2472 { "properties", "a{sv}", ARG_OUT },
2476 { "NetworkRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE,
2478 { "path", "o", ARG_OUT },
2482 { "NetworkSelected", WPAS_DBUS_NEW_IFACE_INTERFACE,
2484 { "path", "o", ARG_OUT },
2488 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_INTERFACE,
2490 { "properties", "a{sv}", ARG_OUT },
2495 { "Event", WPAS_DBUS_NEW_IFACE_WPS,
2497 { "name", "s", ARG_OUT },
2498 { "args", "a{sv}", ARG_OUT },
2502 { "Credentials", WPAS_DBUS_NEW_IFACE_WPS,
2504 { "credentials", "a{sv}", ARG_OUT },
2508 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_WPS,
2510 { "properties", "a{sv}", ARG_OUT },
2514 #endif /* CONFIG_WPS */
2516 { "P2PStateChanged", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2518 { "states", "a{ss}", ARG_OUT },
2522 { "DeviceFound", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2524 { "path", "o", ARG_OUT },
2525 { "properties", "a{sv}", ARG_OUT },
2529 { "DeviceLost", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2531 { "path", "o", ARG_OUT },
2535 { "ProvisionDiscoveryRequestDisplayPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2537 { "peer_object", "o", ARG_OUT },
2538 { "pin", "s", ARG_OUT },
2542 { "ProvisionDiscoveryResponseDisplayPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2544 { "peer_object", "o", ARG_OUT },
2545 { "pin", "s", ARG_OUT },
2549 { "ProvisionDiscoveryRequestEnterPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2551 { "peer_object", "o", ARG_OUT },
2555 { "ProvisionDiscoveryResponseEnterPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2557 { "peer_object", "o", ARG_OUT },
2561 { "ProvisionDiscoveryPBCRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2563 { "peer_object", "o", ARG_OUT },
2567 { "ProvisionDiscoveryPBCResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2569 { "peer_object", "o", ARG_OUT },
2573 { "ProvisionDiscoveryFailure", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2575 { "peer_object", "o", ARG_OUT },
2576 { "status", "i", ARG_OUT },
2580 { "GroupStarted", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2582 { "properties", "a{sv}", ARG_OUT },
2586 { "GONegotiationSuccess", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2591 { "GONegotiationFailure", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2593 { "status", "i", ARG_OUT },
2597 { "GONegotiationRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2599 { "path", "o", ARG_OUT },
2600 { "dev_passwd_id", "i", ARG_OUT },
2604 { "InvitationResult", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2606 { "invite_result", "a{sv}", ARG_OUT },
2610 { "GroupFinished", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2612 { "ifname", "s", ARG_OUT },
2613 { "role", "s", ARG_OUT },
2617 { "ServiceDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2619 { "sd_request", "a{sv}", ARG_OUT },
2623 { "ServiceDiscoveryResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2625 { "sd_response", "a{sv}", ARG_OUT },
2629 { "PersistentGroupAdded", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2631 { "path", "o", ARG_OUT },
2632 { "properties", "a{sv}", ARG_OUT },
2636 { "WpsFailed", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2638 { "name", "s", ARG_OUT },
2639 { "args", "a{sv}", ARG_OUT },
2643 #endif /* CONFIG_P2P */
2644 { NULL, NULL, { END_ARGS } }
2648 int wpas_dbus_register_interface(struct wpa_supplicant *wpa_s)
2651 struct wpa_dbus_object_desc *obj_desc = NULL;
2652 struct wpas_dbus_priv *ctrl_iface = wpa_s->global->dbus;
2655 /* Do nothing if the control interface is not turned on */
2656 if (ctrl_iface == NULL)
2659 /* Create and set the interface's object path */
2660 wpa_s->dbus_new_path = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
2661 if (wpa_s->dbus_new_path == NULL)
2663 next = ctrl_iface->next_objid++;
2664 os_snprintf(wpa_s->dbus_new_path, WPAS_DBUS_OBJECT_PATH_MAX,
2665 WPAS_DBUS_NEW_PATH_INTERFACES "/%u",
2668 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
2670 wpa_printf(MSG_ERROR, "Not enough memory "
2671 "to create object description");
2675 wpas_dbus_register(obj_desc, wpa_s, NULL, wpas_dbus_interface_methods,
2676 wpas_dbus_interface_properties,
2677 wpas_dbus_interface_signals);
2679 wpa_printf(MSG_DEBUG, "dbus: Register interface object '%s'",
2680 wpa_s->dbus_new_path);
2681 if (wpa_dbus_register_object_per_iface(ctrl_iface,
2682 wpa_s->dbus_new_path,
2683 wpa_s->ifname, obj_desc))
2686 wpas_dbus_signal_interface_added(wpa_s);
2691 os_free(wpa_s->dbus_new_path);
2692 wpa_s->dbus_new_path = NULL;
2693 free_dbus_object_desc(obj_desc);
2698 int wpas_dbus_unregister_interface(struct wpa_supplicant *wpa_s)
2700 struct wpas_dbus_priv *ctrl_iface;
2702 /* Do nothing if the control interface is not turned on */
2703 if (wpa_s == NULL || wpa_s->global == NULL)
2705 ctrl_iface = wpa_s->global->dbus;
2706 if (ctrl_iface == NULL)
2709 wpa_printf(MSG_DEBUG, "dbus: Unregister interface object '%s'",
2710 wpa_s->dbus_new_path);
2711 if (wpa_dbus_unregister_object_per_iface(ctrl_iface,
2712 wpa_s->dbus_new_path))
2715 wpas_dbus_signal_interface_removed(wpa_s);
2717 os_free(wpa_s->dbus_new_path);
2718 wpa_s->dbus_new_path = NULL;
2725 static const struct wpa_dbus_property_desc wpas_dbus_p2p_peer_properties[] = {
2726 { "Properties", WPAS_DBUS_NEW_IFACE_P2P_PEER, "a{sv}",
2727 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_peer_properties,
2730 { "IEs", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ay",
2731 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_peer_ies,
2734 { NULL, NULL, NULL, NULL, NULL, 0 }
2737 static const struct wpa_dbus_signal_desc wpas_dbus_p2p_peer_signals[] = {
2739 { NULL, NULL, { END_ARGS } }
2743 * wpas_dbus_signal_peer - Send a peer related event signal
2744 * @wpa_s: %wpa_supplicant network interface data
2745 * @dev: peer device object
2746 * @interface: name of the interface emitting this signal.
2747 * In case of peer objects, it would be emitted by either
2748 * the "interface object" or by "peer objects"
2749 * @sig_name: signal name - DeviceFound
2751 * Notify listeners about event related with newly found p2p peer device
2753 static void wpas_dbus_signal_peer(struct wpa_supplicant *wpa_s,
2754 const u8 *dev_addr, const char *interface,
2755 const char *sig_name)
2757 struct wpas_dbus_priv *iface;
2759 DBusMessageIter iter;
2760 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
2762 iface = wpa_s->global->dbus;
2764 /* Do nothing if the control interface is not turned on */
2768 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2769 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
2770 wpa_s->dbus_new_path, MAC2STR(dev_addr));
2772 msg = dbus_message_new_signal(wpa_s->dbus_new_path, interface,
2777 dbus_message_iter_init_append(msg, &iter);
2778 path = peer_obj_path;
2779 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
2783 dbus_connection_send(iface->con, msg, NULL);
2785 dbus_message_unref(msg);
2789 wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
2790 dbus_message_unref(msg);
2795 * wpas_dbus_signal_peer_found - Send a peer found signal
2796 * @wpa_s: %wpa_supplicant network interface data
2797 * @dev: peer device object
2799 * Notify listeners about find a p2p peer device found
2801 void wpas_dbus_signal_peer_device_found(struct wpa_supplicant *wpa_s,
2804 wpas_dbus_signal_peer(wpa_s, dev_addr,
2805 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2810 * wpas_dbus_signal_peer_lost - Send a peer lost signal
2811 * @wpa_s: %wpa_supplicant network interface data
2812 * @dev: peer device object
2814 * Notify listeners about lost a p2p peer device
2816 void wpas_dbus_signal_peer_device_lost(struct wpa_supplicant *wpa_s,
2819 wpas_dbus_signal_peer(wpa_s, dev_addr,
2820 WPAS_DBUS_NEW_IFACE_P2PDEVICE,
2825 * wpas_dbus_register_peer - Register a discovered peer object with dbus
2826 * @wpa_s: wpa_supplicant interface structure
2827 * @ssid: network configuration data
2828 * Returns: 0 on success, -1 on failure
2830 * Registers network representing object with dbus
2832 int wpas_dbus_register_peer(struct wpa_supplicant *wpa_s, const u8 *dev_addr)
2834 struct wpas_dbus_priv *ctrl_iface;
2835 struct wpa_dbus_object_desc *obj_desc;
2836 struct peer_handler_args *arg;
2837 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2839 /* Do nothing if the control interface is not turned on */
2840 if (wpa_s == NULL || wpa_s->global == NULL)
2843 ctrl_iface = wpa_s->global->dbus;
2844 if (ctrl_iface == NULL)
2847 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2848 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
2849 wpa_s->dbus_new_path, MAC2STR(dev_addr));
2851 wpa_printf(MSG_INFO, "dbus: Register peer object '%s'",
2853 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
2855 wpa_printf(MSG_ERROR, "Not enough memory "
2856 "to create object description");
2860 /* allocate memory for handlers arguments */
2861 arg = os_zalloc(sizeof(struct peer_handler_args));
2863 wpa_printf(MSG_ERROR, "Not enough memory "
2864 "to create arguments for method");
2869 os_memcpy(arg->p2p_device_addr, dev_addr, ETH_ALEN);
2871 wpas_dbus_register(obj_desc, arg, wpa_dbus_free,
2873 wpas_dbus_p2p_peer_properties,
2874 wpas_dbus_p2p_peer_signals);
2876 if (wpa_dbus_register_object_per_iface(ctrl_iface, peer_obj_path,
2877 wpa_s->ifname, obj_desc))
2883 free_dbus_object_desc(obj_desc);
2888 * wpas_dbus_unregister_peer - Unregister a peer object with dbus
2889 * @wpa_s: wpa_supplicant interface structure
2890 * @dev_addr: p2p device addr
2891 * Returns: 0 on success, -1 on failure
2893 * Registers network representing object with dbus
2895 int wpas_dbus_unregister_peer(struct wpa_supplicant *wpa_s,
2898 struct wpas_dbus_priv *ctrl_iface;
2899 char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2902 /* Do nothing if the control interface is not turned on */
2903 if (wpa_s == NULL || wpa_s->global == NULL ||
2904 wpa_s->dbus_new_path == NULL)
2906 ctrl_iface = wpa_s->global->dbus;
2907 if (ctrl_iface == NULL)
2910 os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
2911 "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
2912 wpa_s->dbus_new_path, MAC2STR(dev_addr));
2914 wpa_printf(MSG_INFO, "dbus: Unregister peer object '%s'",
2916 ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, peer_obj_path);
2922 static const struct wpa_dbus_property_desc wpas_dbus_p2p_group_properties[] = {
2923 { "Members", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "ao",
2924 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_group_members,
2928 WPAS_DBUS_NEW_IFACE_P2P_GROUP, "a{sv}",
2929 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_group_properties,
2930 (WPADBusPropertyAccessor) wpas_dbus_setter_p2p_group_properties,
2933 { NULL, NULL, NULL, NULL, NULL, 0 }
2936 static const struct wpa_dbus_signal_desc wpas_dbus_p2p_group_signals[] = {
2937 { "PeerJoined", WPAS_DBUS_NEW_IFACE_P2P_GROUP,
2939 { "peer", "o", ARG_OUT },
2943 { "PeerDisconnected", WPAS_DBUS_NEW_IFACE_P2P_GROUP,
2945 { "peer", "o", ARG_OUT },
2949 { NULL, NULL, { END_ARGS } }
2953 * wpas_dbus_register_p2p_group - Register a p2p group object with dbus
2954 * @wpa_s: wpa_supplicant interface structure
2955 * @ssid: SSID struct
2956 * Returns: 0 on success, -1 on failure
2958 * Registers p2p group representing object with dbus
2960 void wpas_dbus_register_p2p_group(struct wpa_supplicant *wpa_s,
2961 struct wpa_ssid *ssid)
2963 struct wpas_dbus_priv *ctrl_iface;
2964 struct wpa_dbus_object_desc *obj_desc;
2965 char group_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
2967 /* Do nothing if the control interface is not turned on */
2968 if (wpa_s == NULL || wpa_s->global == NULL)
2971 ctrl_iface = wpa_s->global->dbus;
2972 if (ctrl_iface == NULL)
2975 if (wpa_s->dbus_groupobj_path) {
2976 wpa_printf(MSG_INFO, "%s: Group object '%s' already exists",
2977 __func__, wpa_s->dbus_groupobj_path);
2981 if (wpas_dbus_get_group_obj_path(wpa_s, ssid, group_obj_path) < 0)
2984 wpa_s->dbus_groupobj_path = os_strdup(group_obj_path);
2985 if (wpa_s->dbus_groupobj_path == NULL)
2988 wpa_printf(MSG_INFO, "dbus: Register group object '%s'",
2990 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
2992 wpa_printf(MSG_ERROR, "Not enough memory "
2993 "to create object description");
2997 wpas_dbus_register(obj_desc, wpa_s, NULL, NULL,
2998 wpas_dbus_p2p_group_properties,
2999 wpas_dbus_p2p_group_signals);
3001 if (wpa_dbus_register_object_per_iface(ctrl_iface, group_obj_path,
3002 wpa_s->ifname, obj_desc))
3008 if (wpa_s->dbus_groupobj_path) {
3009 os_free(wpa_s->dbus_groupobj_path);
3010 wpa_s->dbus_groupobj_path = NULL;
3013 free_dbus_object_desc(obj_desc);
3017 * wpas_dbus_unregister_p2p_group - Unregister a p2p group object from dbus
3018 * @wpa_s: wpa_supplicant interface structure
3019 * @ssid: network name of the p2p group started
3021 void wpas_dbus_unregister_p2p_group(struct wpa_supplicant *wpa_s,
3022 const struct wpa_ssid *ssid)
3024 struct wpas_dbus_priv *ctrl_iface;
3026 /* Do nothing if the control interface is not turned on */
3027 if (wpa_s == NULL || wpa_s->global == NULL)
3030 ctrl_iface = wpa_s->global->dbus;
3031 if (ctrl_iface == NULL)
3034 if (!wpa_s->dbus_groupobj_path) {
3035 wpa_printf(MSG_DEBUG,
3036 "%s: Group object '%s' already unregistered",
3037 __func__, wpa_s->dbus_groupobj_path);
3041 wpa_printf(MSG_DEBUG, "dbus: Unregister group object '%s'",
3042 wpa_s->dbus_groupobj_path);
3044 wpa_dbus_unregister_object_per_iface(ctrl_iface,
3045 wpa_s->dbus_groupobj_path);
3047 os_free(wpa_s->dbus_groupobj_path);
3048 wpa_s->dbus_groupobj_path = NULL;
3051 static const struct wpa_dbus_property_desc
3052 wpas_dbus_p2p_groupmember_properties[] = {
3053 { "Properties", WPAS_DBUS_NEW_IFACE_P2P_GROUPMEMBER, "a{sv}",
3054 (WPADBusPropertyAccessor) wpas_dbus_getter_p2p_group_properties,
3057 { NULL, NULL, NULL, NULL, NULL, 0 }
3061 * wpas_dbus_register_p2p_groupmember - Register a p2p groupmember
3063 * @wpa_s: wpa_supplicant interface structure
3064 * @p2p_if_addr: i/f addr of the device joining this group
3066 * Registers p2p groupmember representing object with dbus
3068 void wpas_dbus_register_p2p_groupmember(struct wpa_supplicant *wpa_s,
3069 const u8 *p2p_if_addr)
3071 struct wpas_dbus_priv *ctrl_iface;
3072 struct wpa_dbus_object_desc *obj_desc = NULL;
3073 struct groupmember_handler_args *arg;
3074 char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3076 /* Do nothing if the control interface is not turned on */
3077 if (wpa_s == NULL || wpa_s->global == NULL)
3080 ctrl_iface = wpa_s->global->dbus;
3081 if (ctrl_iface == NULL)
3084 if (!wpa_s->dbus_groupobj_path)
3087 os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3088 "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/" COMPACT_MACSTR,
3089 wpa_s->dbus_groupobj_path, MAC2STR(p2p_if_addr));
3091 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
3093 wpa_printf(MSG_ERROR, "Not enough memory "
3094 "to create object description");
3098 /* allocate memory for handlers arguments */
3099 arg = os_zalloc(sizeof(struct groupmember_handler_args));
3101 wpa_printf(MSG_ERROR, "Not enough memory "
3102 "to create arguments for method");
3107 os_memcpy(arg->member_addr, p2p_if_addr, ETH_ALEN);
3109 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
3110 wpas_dbus_p2p_groupmember_properties, NULL);
3112 if (wpa_dbus_register_object_per_iface(ctrl_iface, groupmember_obj_path,
3113 wpa_s->ifname, obj_desc))
3116 wpa_printf(MSG_INFO,
3117 "dbus: Registered group member object '%s' successfully",
3118 groupmember_obj_path);
3122 free_dbus_object_desc(obj_desc);
3126 * wpas_dbus_unregister_p2p_groupmember - Unregister a p2p groupmember
3128 * @wpa_s: wpa_supplicant interface structure
3129 * @p2p_if_addr: i/f addr of the device joining this group
3131 * Unregisters p2p groupmember representing object with dbus
3133 void wpas_dbus_unregister_p2p_groupmember(struct wpa_supplicant *wpa_s,
3134 const u8 *p2p_if_addr)
3136 struct wpas_dbus_priv *ctrl_iface;
3137 char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3139 /* Do nothing if the control interface is not turned on */
3140 if (wpa_s == NULL || wpa_s->global == NULL)
3143 ctrl_iface = wpa_s->global->dbus;
3144 if (ctrl_iface == NULL)
3147 if (!wpa_s->dbus_groupobj_path)
3150 os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3151 "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/" COMPACT_MACSTR,
3152 wpa_s->dbus_groupobj_path, MAC2STR(p2p_if_addr));
3154 wpa_dbus_unregister_object_per_iface(ctrl_iface, groupmember_obj_path);
3158 static const struct wpa_dbus_property_desc
3159 wpas_dbus_persistent_group_properties[] = {
3160 { "Properties", WPAS_DBUS_NEW_IFACE_PERSISTENT_GROUP, "a{sv}",
3161 (WPADBusPropertyAccessor)
3162 wpas_dbus_getter_persistent_group_properties,
3163 (WPADBusPropertyAccessor)
3164 wpas_dbus_setter_persistent_group_properties,
3167 { NULL, NULL, NULL, NULL, NULL, 0 }
3170 /* No signals intended for persistent group objects */
3173 * wpas_dbus_register_persistent_group - Register a configured(saved)
3174 * persistent group with dbus
3175 * @wpa_s: wpa_supplicant interface structure
3176 * @ssid: persistent group (still represented as a network within wpa)
3177 * configuration data
3178 * Returns: 0 on success, -1 on failure
3180 * Registers a persistent group representing object with dbus.
3182 int wpas_dbus_register_persistent_group(struct wpa_supplicant *wpa_s,
3183 struct wpa_ssid *ssid)
3185 struct wpas_dbus_priv *ctrl_iface;
3186 struct wpa_dbus_object_desc *obj_desc;
3187 struct network_handler_args *arg;
3188 char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3190 /* Do nothing if the control interface is not turned on */
3191 if (wpa_s == NULL || wpa_s->global == NULL)
3194 /* Make sure ssid is a persistent group */
3195 if (ssid->disabled != 2 && !ssid->p2p_persistent_group)
3196 return -1; /* should we return w/o complaining? */
3198 ctrl_iface = wpa_s->global->dbus;
3199 if (ctrl_iface == NULL)
3203 * Intentionally not coming up with different numbering scheme
3204 * for persistent groups.
3206 os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3207 "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
3208 wpa_s->dbus_new_path, ssid->id);
3210 wpa_printf(MSG_DEBUG, "dbus: Register persistent group object '%s'",
3212 obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
3214 wpa_printf(MSG_ERROR, "dbus: Not enough memory to create "
3215 "object description");
3220 * Reusing the same context structure as that for networks
3221 * since these are represented using same data structure.
3223 /* allocate memory for handlers arguments */
3224 arg = os_zalloc(sizeof(struct network_handler_args));
3226 wpa_printf(MSG_ERROR, "dbus: Not enough memory to create "
3227 "arguments for method");
3234 wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
3235 wpas_dbus_persistent_group_properties,
3238 if (wpa_dbus_register_object_per_iface(ctrl_iface, pgrp_obj_path,
3239 wpa_s->ifname, obj_desc))
3242 wpas_dbus_signal_persistent_group_added(wpa_s, ssid->id);
3247 free_dbus_object_desc(obj_desc);
3253 * wpas_dbus_unregister_persistent_group - Unregister a persistent_group
3255 * @wpa_s: wpa_supplicant interface structure
3257 * Returns: 0 on success, -1 on failure
3259 * Unregisters persistent group representing object from dbus
3261 * NOTE: There is a slight issue with the semantics here. While the
3262 * implementation simply means the persistent group is unloaded from memory,
3263 * it should not get interpreted as the group is actually being erased/removed
3264 * from persistent storage as well.
3266 int wpas_dbus_unregister_persistent_group(struct wpa_supplicant *wpa_s,
3269 struct wpas_dbus_priv *ctrl_iface;
3270 char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
3273 /* Do nothing if the control interface is not turned on */
3274 if (wpa_s == NULL || wpa_s->global == NULL ||
3275 wpa_s->dbus_new_path == NULL)
3277 ctrl_iface = wpa_s->global->dbus;
3278 if (ctrl_iface == NULL)
3281 os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
3282 "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
3283 wpa_s->dbus_new_path, nid);
3285 wpa_printf(MSG_DEBUG, "dbus: Unregister persistent group object '%s'",
3287 ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, pgrp_obj_path);
3290 wpas_dbus_signal_persistent_group_removed(wpa_s, nid);
3295 #endif /* CONFIG_P2P */