2 * WPA Supplicant / dbus-based control interface
3 * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
4 * Copyright (c) 2009, 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.
21 #include "../config.h"
22 #include "../wpa_supplicant_i.h"
24 #include "dbus_new_helpers.h"
25 #include "dbus_dict_helpers.h"
27 #include "dbus_new_handlers.h"
28 #include "dbus_common.h"
29 #include "dbus_common_i.h"
33 * wpas_dbus_signal_interface - Send a interface related event signal
34 * @wpa_s: %wpa_supplicant network interface data
35 * @sig_name: signal name - InterfaceAdded or InterfaceRemoved
36 * @properties: Whether to add second argument with object properties
38 * Notify listeners about event related with interface
40 static void wpas_dbus_signal_interface(struct wpa_supplicant
*wpa_s
,
41 const char *sig_name
, int properties
)
43 struct wpas_dbus_priv
*iface
;
45 DBusMessageIter iter
, iter_dict
;
47 iface
= wpa_s
->global
->dbus
;
49 /* Do nothing if the control interface is not turned on */
53 msg
= dbus_message_new_signal(WPAS_DBUS_NEW_PATH
,
54 WPAS_DBUS_NEW_INTERFACE
, sig_name
);
58 dbus_message_iter_init_append(msg
, &iter
);
59 if (!dbus_message_iter_append_basic(&iter
, DBUS_TYPE_OBJECT_PATH
,
60 &wpa_s
->dbus_new_path
))
64 if (!wpa_dbus_dict_open_write(&iter
, &iter_dict
))
67 wpa_dbus_get_object_properties(iface
, wpa_s
->dbus_new_path
,
68 WPAS_DBUS_NEW_IFACE_INTERFACE
,
71 if (!wpa_dbus_dict_close_write(&iter
, &iter_dict
))
75 dbus_connection_send(iface
->con
, msg
, NULL
);
76 dbus_message_unref(msg
);
80 wpa_printf(MSG_ERROR
, "dbus: Failed to construct signal");
81 dbus_message_unref(msg
);
86 * wpas_dbus_signal_interface_added - Send a interface created signal
87 * @wpa_s: %wpa_supplicant network interface data
89 * Notify listeners about creating new interface
91 static void wpas_dbus_signal_interface_added(struct wpa_supplicant
*wpa_s
)
93 wpas_dbus_signal_interface(wpa_s
, "InterfaceAdded", TRUE
);
98 * wpas_dbus_signal_interface_removed - Send a interface removed signal
99 * @wpa_s: %wpa_supplicant network interface data
101 * Notify listeners about removing interface
103 static void wpas_dbus_signal_interface_removed(struct wpa_supplicant
*wpa_s
)
105 wpas_dbus_signal_interface(wpa_s
, "InterfaceRemoved", FALSE
);
111 * wpas_dbus_signal_scan_done - send scan done signal
112 * @wpa_s: %wpa_supplicant network interface data
113 * @success: indicates if scanning succeed or failed
115 * Notify listeners about finishing a scan
117 void wpas_dbus_signal_scan_done(struct wpa_supplicant
*wpa_s
, int success
)
119 struct wpas_dbus_priv
*iface
;
123 iface
= wpa_s
->global
->dbus
;
125 /* Do nothing if the control interface is not turned on */
129 msg
= dbus_message_new_signal(wpa_s
->dbus_new_path
,
130 WPAS_DBUS_NEW_IFACE_INTERFACE
,
135 succ
= success
? TRUE
: FALSE
;
136 if (dbus_message_append_args(msg
, DBUS_TYPE_BOOLEAN
, &succ
,
138 dbus_connection_send(iface
->con
, msg
, NULL
);
140 wpa_printf(MSG_ERROR
, "dbus: Failed to construct signal");
141 dbus_message_unref(msg
);
146 * wpas_dbus_signal_blob - Send a BSS related event signal
147 * @wpa_s: %wpa_supplicant network interface data
148 * @bss_obj_path: BSS object path
149 * @sig_name: signal name - BSSAdded or BSSRemoved
150 * @properties: Whether to add second argument with object properties
152 * Notify listeners about event related with BSS
154 static void wpas_dbus_signal_bss(struct wpa_supplicant
*wpa_s
,
155 const char *bss_obj_path
,
156 const char *sig_name
, int properties
)
158 struct wpas_dbus_priv
*iface
;
160 DBusMessageIter iter
, iter_dict
;
162 iface
= wpa_s
->global
->dbus
;
164 /* Do nothing if the control interface is not turned on */
168 msg
= dbus_message_new_signal(wpa_s
->dbus_new_path
,
169 WPAS_DBUS_NEW_IFACE_INTERFACE
,
174 dbus_message_iter_init_append(msg
, &iter
);
175 if (!dbus_message_iter_append_basic(&iter
, DBUS_TYPE_OBJECT_PATH
,
180 if (!wpa_dbus_dict_open_write(&iter
, &iter_dict
))
183 wpa_dbus_get_object_properties(iface
, bss_obj_path
,
184 WPAS_DBUS_NEW_IFACE_BSSID
,
187 if (!wpa_dbus_dict_close_write(&iter
, &iter_dict
))
191 dbus_connection_send(iface
->con
, msg
, NULL
);
192 dbus_message_unref(msg
);
196 wpa_printf(MSG_ERROR
, "dbus: Failed to construct signal");
197 dbus_message_unref(msg
);
202 * wpas_dbus_signal_bss_added - Send a BSS added signal
203 * @wpa_s: %wpa_supplicant network interface data
204 * @bss_obj_path: new BSS object path
206 * Notify listeners about adding new BSS
208 static void wpas_dbus_signal_bss_added(struct wpa_supplicant
*wpa_s
,
209 const char *bss_obj_path
)
211 wpas_dbus_signal_bss(wpa_s
, bss_obj_path
, "BSSAdded", TRUE
);
216 * wpas_dbus_signal_bss_removed - Send a BSS removed signal
217 * @wpa_s: %wpa_supplicant network interface data
218 * @bss_obj_path: BSS object path
220 * Notify listeners about removing BSS
222 static void wpas_dbus_signal_bss_removed(struct wpa_supplicant
*wpa_s
,
223 const char *bss_obj_path
)
225 wpas_dbus_signal_bss(wpa_s
, bss_obj_path
, "BSSRemoved", FALSE
);
230 * wpas_dbus_signal_blob - Send a blob related event signal
231 * @wpa_s: %wpa_supplicant network interface data
233 * @sig_name: signal name - BlobAdded or BlobRemoved
235 * Notify listeners about event related with blob
237 static void wpas_dbus_signal_blob(struct wpa_supplicant
*wpa_s
,
238 const char *name
, const char *sig_name
)
240 struct wpas_dbus_priv
*iface
;
243 iface
= wpa_s
->global
->dbus
;
245 /* Do nothing if the control interface is not turned on */
249 msg
= dbus_message_new_signal(wpa_s
->dbus_new_path
,
250 WPAS_DBUS_NEW_IFACE_INTERFACE
,
255 if (dbus_message_append_args(msg
, DBUS_TYPE_STRING
, &name
,
257 dbus_connection_send(iface
->con
, msg
, NULL
);
259 wpa_printf(MSG_ERROR
, "dbus: Failed to construct signal");
260 dbus_message_unref(msg
);
265 * wpas_dbus_signal_blob_added - Send a blob added signal
266 * @wpa_s: %wpa_supplicant network interface data
269 * Notify listeners about adding a new blob
271 void wpas_dbus_signal_blob_added(struct wpa_supplicant
*wpa_s
,
274 wpas_dbus_signal_blob(wpa_s
, name
, "BlobAdded");
279 * wpas_dbus_signal_blob_removed - Send a blob removed signal
280 * @wpa_s: %wpa_supplicant network interface data
283 * Notify listeners about removing blob
285 void wpas_dbus_signal_blob_removed(struct wpa_supplicant
*wpa_s
,
288 wpas_dbus_signal_blob(wpa_s
, name
, "BlobRemoved");
293 * wpas_dbus_signal_network - Send a network related event signal
294 * @wpa_s: %wpa_supplicant network interface data
295 * @id: new network id
296 * @sig_name: signal name - NetworkAdded, NetworkRemoved or NetworkSelected
297 * @properties: determines if add second argument with object properties
299 * Notify listeners about event related with configured network
301 static void wpas_dbus_signal_network(struct wpa_supplicant
*wpa_s
,
302 int id
, const char *sig_name
,
305 struct wpas_dbus_priv
*iface
;
307 DBusMessageIter iter
, iter_dict
;
308 char net_obj_path
[WPAS_DBUS_OBJECT_PATH_MAX
], *path
;
310 iface
= wpa_s
->global
->dbus
;
312 /* Do nothing if the control interface is not turned on */
316 os_snprintf(net_obj_path
, WPAS_DBUS_OBJECT_PATH_MAX
,
317 "%s/" WPAS_DBUS_NEW_NETWORKS_PART
"/%u",
318 wpa_s
->dbus_new_path
, id
);
320 msg
= dbus_message_new_signal(wpa_s
->dbus_new_path
,
321 WPAS_DBUS_NEW_IFACE_INTERFACE
,
326 dbus_message_iter_init_append(msg
, &iter
);
328 if (!dbus_message_iter_append_basic(&iter
, DBUS_TYPE_OBJECT_PATH
,
333 if (!wpa_dbus_dict_open_write(&iter
, &iter_dict
))
336 wpa_dbus_get_object_properties(iface
, net_obj_path
,
337 WPAS_DBUS_NEW_IFACE_NETWORK
,
340 if (!wpa_dbus_dict_close_write(&iter
, &iter_dict
))
344 dbus_connection_send(iface
->con
, msg
, NULL
);
346 dbus_message_unref(msg
);
350 wpa_printf(MSG_ERROR
, "dbus: Failed to construct signal");
351 dbus_message_unref(msg
);
356 * wpas_dbus_signal_network_added - Send a network added signal
357 * @wpa_s: %wpa_supplicant network interface data
358 * @id: new network id
360 * Notify listeners about adding new network
362 static void wpas_dbus_signal_network_added(struct wpa_supplicant
*wpa_s
,
365 wpas_dbus_signal_network(wpa_s
, id
, "NetworkAdded", TRUE
);
370 * wpas_dbus_signal_network_removed - Send a network removed signal
371 * @wpa_s: %wpa_supplicant network interface data
374 * Notify listeners about removing a network
376 static void wpas_dbus_signal_network_removed(struct wpa_supplicant
*wpa_s
,
379 wpas_dbus_signal_network(wpa_s
, id
, "NetworkRemoved", FALSE
);
384 * wpas_dbus_signal_network_selected - Send a network selected signal
385 * @wpa_s: %wpa_supplicant network interface data
388 * Notify listeners about selecting a network
390 void wpas_dbus_signal_network_selected(struct wpa_supplicant
*wpa_s
, int id
)
392 wpas_dbus_signal_network(wpa_s
, id
, "NetworkSelected", FALSE
);
397 * wpas_dbus_signal_network_enabled_changed - Signals Enabled property changes
398 * @wpa_s: %wpa_supplicant network interface data
399 * @ssid: configured network which Enabled property has changed
401 * Sends PropertyChanged signals containing new value of Enabled property
402 * for specified network
404 void wpas_dbus_signal_network_enabled_changed(struct wpa_supplicant
*wpa_s
,
405 struct wpa_ssid
*ssid
)
408 struct network_handler_args args
= { wpa_s
, ssid
};
409 char path
[WPAS_DBUS_OBJECT_PATH_MAX
];
410 os_snprintf(path
, WPAS_DBUS_OBJECT_PATH_MAX
,
411 "%s/" WPAS_DBUS_NEW_NETWORKS_PART
"/%d",
412 wpa_s
->dbus_new_path
, ssid
->id
);
414 wpa_dbus_signal_property_changed(wpa_s
->global
->dbus
,
415 (WPADBusPropertyAccessor
)
416 wpas_dbus_getter_enabled
, &args
,
417 path
, WPAS_DBUS_NEW_IFACE_NETWORK
,
425 * wpas_dbus_signal_wps_event_success - Signals Success WPS event
426 * @wpa_s: %wpa_supplicant network interface data
428 * Sends Event dbus signal with name "success" and empty dict as arguments
430 void wpas_dbus_signal_wps_event_success(struct wpa_supplicant
*wpa_s
)
434 DBusMessageIter iter
, dict_iter
;
435 struct wpas_dbus_priv
*iface
;
436 char *key
= "success";
438 iface
= wpa_s
->global
->dbus
;
440 /* Do nothing if the control interface is not turned on */
444 msg
= dbus_message_new_signal(wpa_s
->dbus_new_path
,
445 WPAS_DBUS_NEW_IFACE_WPS
, "Event");
449 dbus_message_iter_init_append(msg
, &iter
);
451 if (!dbus_message_iter_append_basic(&iter
, DBUS_TYPE_STRING
, &key
) ||
452 !wpa_dbus_dict_open_write(&iter
, &dict_iter
) ||
453 !wpa_dbus_dict_close_write(&iter
, &dict_iter
))
454 wpa_printf(MSG_ERROR
, "dbus: Failed to construct signal");
456 dbus_connection_send(iface
->con
, msg
, NULL
);
458 dbus_message_unref(msg
);
463 * wpas_dbus_signal_wps_event_fail - Signals Fail WPS event
464 * @wpa_s: %wpa_supplicant network interface data
466 * Sends Event dbus signal with name "fail" and dictionary containing
467 * "msg field with fail message number (int32) as arguments
469 void wpas_dbus_signal_wps_event_fail(struct wpa_supplicant
*wpa_s
,
470 struct wps_event_fail
*fail
)
474 DBusMessageIter iter
, dict_iter
;
475 struct wpas_dbus_priv
*iface
;
478 iface
= wpa_s
->global
->dbus
;
480 /* Do nothing if the control interface is not turned on */
484 msg
= dbus_message_new_signal(wpa_s
->dbus_new_path
,
485 WPAS_DBUS_NEW_IFACE_WPS
, "Event");
489 dbus_message_iter_init_append(msg
, &iter
);
491 if (!dbus_message_iter_append_basic(&iter
, DBUS_TYPE_STRING
, &key
) ||
492 !wpa_dbus_dict_open_write(&iter
, &dict_iter
) ||
493 !wpa_dbus_dict_append_int32(&dict_iter
, "msg", fail
->msg
) ||
494 !wpa_dbus_dict_close_write(&iter
, &dict_iter
))
495 wpa_printf(MSG_ERROR
, "dbus: Failed to construct signal");
497 dbus_connection_send(iface
->con
, msg
, NULL
);
499 dbus_message_unref(msg
);
504 * wpas_dbus_signal_wps_event_m2d - Signals M2D WPS event
505 * @wpa_s: %wpa_supplicant network interface data
507 * Sends Event dbus signal with name "m2d" and dictionary containing
508 * fields of wps_event_m2d structure.
510 void wpas_dbus_signal_wps_event_m2d(struct wpa_supplicant
*wpa_s
,
511 struct wps_event_m2d
*m2d
)
515 DBusMessageIter iter
, dict_iter
;
516 struct wpas_dbus_priv
*iface
;
519 iface
= wpa_s
->global
->dbus
;
521 /* Do nothing if the control interface is not turned on */
525 msg
= dbus_message_new_signal(wpa_s
->dbus_new_path
,
526 WPAS_DBUS_NEW_IFACE_WPS
, "Event");
530 dbus_message_iter_init_append(msg
, &iter
);
532 if (!dbus_message_iter_append_basic(&iter
, DBUS_TYPE_STRING
, &key
) ||
533 !wpa_dbus_dict_open_write(&iter
, &dict_iter
) ||
534 !wpa_dbus_dict_append_uint16(&dict_iter
, "config_methods",
535 m2d
->config_methods
) ||
536 !wpa_dbus_dict_append_byte_array(&dict_iter
, "manufacturer",
537 (const char *) m2d
->manufacturer
,
538 m2d
->manufacturer_len
) ||
539 !wpa_dbus_dict_append_byte_array(&dict_iter
, "model_name",
540 (const char *) m2d
->model_name
,
541 m2d
->model_name_len
) ||
542 !wpa_dbus_dict_append_byte_array(&dict_iter
, "model_number",
543 (const char *) m2d
->model_number
,
544 m2d
->model_number_len
) ||
545 !wpa_dbus_dict_append_byte_array(&dict_iter
, "serial_number",
548 m2d
->serial_number_len
) ||
549 !wpa_dbus_dict_append_byte_array(&dict_iter
, "dev_name",
550 (const char *) m2d
->dev_name
,
551 m2d
->dev_name_len
) ||
552 !wpa_dbus_dict_append_byte_array(&dict_iter
, "primary_dev_type",
554 m2d
->primary_dev_type
, 8) ||
555 !wpa_dbus_dict_append_uint16(&dict_iter
, "config_error",
556 m2d
->config_error
) ||
557 !wpa_dbus_dict_append_uint16(&dict_iter
, "dev_password_id",
558 m2d
->dev_password_id
) ||
559 !wpa_dbus_dict_close_write(&iter
, &dict_iter
))
560 wpa_printf(MSG_ERROR
, "dbus: Failed to construct signal");
562 dbus_connection_send(iface
->con
, msg
, NULL
);
564 dbus_message_unref(msg
);
569 * wpas_dbus_signal_wps_cred - Signals new credentials
570 * @wpa_s: %wpa_supplicant network interface data
572 * Sends signal with credentials in directory argument
574 void wpas_dbus_signal_wps_cred(struct wpa_supplicant
*wpa_s
,
575 const struct wps_credential
*cred
)
578 DBusMessageIter iter
, dict_iter
;
579 struct wpas_dbus_priv
*iface
;
580 char *auth_type
[6]; /* we have six possible authorization types */
582 char *encr_type
[4]; /* we have four possible encryption types */
585 iface
= wpa_s
->global
->dbus
;
587 /* Do nothing if the control interface is not turned on */
591 msg
= dbus_message_new_signal(wpa_s
->dbus_new_path
,
592 WPAS_DBUS_NEW_IFACE_WPS
,
597 dbus_message_iter_init_append(msg
, &iter
);
598 if (!wpa_dbus_dict_open_write(&iter
, &dict_iter
))
601 if (cred
->auth_type
& WPS_AUTH_OPEN
)
602 auth_type
[at_num
++] = "open";
603 if (cred
->auth_type
& WPS_AUTH_WPAPSK
)
604 auth_type
[at_num
++] = "wpa-psk";
605 if (cred
->auth_type
& WPS_AUTH_SHARED
)
606 auth_type
[at_num
++] = "shared";
607 if (cred
->auth_type
& WPS_AUTH_WPA
)
608 auth_type
[at_num
++] = "wpa-eap";
609 if (cred
->auth_type
& WPS_AUTH_WPA2
)
610 auth_type
[at_num
++] = "wpa2-eap";
611 if (cred
->auth_type
& WPS_AUTH_WPA2PSK
)
612 auth_type
[at_num
++] =
615 if (cred
->encr_type
& WPS_ENCR_NONE
)
616 encr_type
[et_num
++] = "none";
617 if (cred
->encr_type
& WPS_ENCR_WEP
)
618 encr_type
[et_num
++] = "wep";
619 if (cred
->encr_type
& WPS_ENCR_TKIP
)
620 encr_type
[et_num
++] = "tkip";
621 if (cred
->encr_type
& WPS_ENCR_AES
)
622 encr_type
[et_num
++] = "aes";
624 if (wpa_s
->current_ssid
) {
625 if (!wpa_dbus_dict_append_byte_array(
627 (const char *) wpa_s
->current_ssid
->bssid
,
632 if (!wpa_dbus_dict_append_byte_array(&dict_iter
, "SSID",
633 (const char *) cred
->ssid
,
635 !wpa_dbus_dict_append_string_array(&dict_iter
, "AuthType",
636 (const char **) auth_type
,
638 !wpa_dbus_dict_append_string_array(&dict_iter
, "EncrType",
639 (const char **) encr_type
,
641 !wpa_dbus_dict_append_byte_array(&dict_iter
, "Key",
642 (const char *) cred
->key
,
644 !wpa_dbus_dict_append_uint32(&dict_iter
, "KeyIndex",
646 !wpa_dbus_dict_close_write(&iter
, &dict_iter
))
649 dbus_connection_send(iface
->con
, msg
, NULL
);
652 dbus_message_unref(msg
);
655 #endif /* CONFIG_WPS */
659 * wpas_dbus_signal_prop_changed - Signals change of property
660 * @wpa_s: %wpa_supplicant network interface data
661 * @property: indicates which property has changed
663 * Sends ProertyChanged signals with path, interface and arguments
664 * depending on which property has changed.
666 void wpas_dbus_signal_prop_changed(struct wpa_supplicant
*wpa_s
,
667 enum wpas_dbus_prop property
)
669 WPADBusPropertyAccessor getter
;
673 case WPAS_DBUS_PROP_AP_SCAN
:
674 getter
= (WPADBusPropertyAccessor
) wpas_dbus_getter_ap_scan
;
677 case WPAS_DBUS_PROP_SCANNING
:
678 getter
= (WPADBusPropertyAccessor
) wpas_dbus_getter_scanning
;
681 case WPAS_DBUS_PROP_STATE
:
682 getter
= (WPADBusPropertyAccessor
) wpas_dbus_getter_state
;
685 case WPAS_DBUS_PROP_CURRENT_BSS
:
686 getter
= (WPADBusPropertyAccessor
)
687 wpas_dbus_getter_current_bss
;
690 case WPAS_DBUS_PROP_CURRENT_NETWORK
:
691 getter
= (WPADBusPropertyAccessor
)
692 wpas_dbus_getter_current_network
;
693 prop
= "CurrentNetwork";
696 wpa_printf(MSG_ERROR
, "dbus: %s: Unknown Property value %d",
701 wpa_dbus_signal_property_changed(wpa_s
->global
->dbus
,
702 getter
, wpa_s
, wpa_s
->dbus_new_path
,
703 WPAS_DBUS_NEW_IFACE_INTERFACE
, prop
);
708 * wpas_dbus_signal_debug_level_changed - Signals change of debug param
709 * @global: wpa_global structure
711 * Sends ProertyChanged signals informing that debug level has changed.
713 void wpas_dbus_signal_debug_level_changed(struct wpa_global
*global
)
715 wpa_dbus_signal_property_changed(global
->dbus
,
716 (WPADBusPropertyAccessor
)
717 wpas_dbus_getter_debug_level
,
718 global
, WPAS_DBUS_NEW_PATH
,
719 WPAS_DBUS_NEW_INTERFACE
,
725 * wpas_dbus_signal_debug_timestamp_changed - Signals change of debug param
726 * @global: wpa_global structure
728 * Sends ProertyChanged signals informing that debug timestamp has changed.
730 void wpas_dbus_signal_debug_timestamp_changed(struct wpa_global
*global
)
732 wpa_dbus_signal_property_changed(global
->dbus
,
733 (WPADBusPropertyAccessor
)
734 wpas_dbus_getter_debug_timestamp
,
735 global
, WPAS_DBUS_NEW_PATH
,
736 WPAS_DBUS_NEW_INTERFACE
,
742 * wpas_dbus_signal_debug_show_keys_changed - Signals change of debug param
743 * @global: wpa_global structure
745 * Sends ProertyChanged signals informing that debug show_keys has changed.
747 void wpas_dbus_signal_debug_show_keys_changed(struct wpa_global
*global
)
749 wpa_dbus_signal_property_changed(global
->dbus
,
750 (WPADBusPropertyAccessor
)
751 wpas_dbus_getter_debug_show_keys
,
752 global
, WPAS_DBUS_NEW_PATH
,
753 WPAS_DBUS_NEW_INTERFACE
,
758 static void wpas_dbus_register(struct wpa_dbus_object_desc
*obj_desc
,
760 WPADBusArgumentFreeFunction priv_free
,
761 const struct wpa_dbus_method_desc
*methods
,
762 const struct wpa_dbus_property_desc
*properties
,
763 const struct wpa_dbus_signal_desc
*signals
)
765 obj_desc
->user_data
= priv
;
766 obj_desc
->user_data_free_func
= priv_free
;
767 obj_desc
->methods
= methods
;
768 obj_desc
->properties
= properties
;
769 obj_desc
->signals
= signals
;
773 static const struct wpa_dbus_method_desc wpas_dbus_global_methods
[] = {
774 { "CreateInterface", WPAS_DBUS_NEW_INTERFACE
,
775 (WPADBusMethodHandler
) &wpas_dbus_handler_create_interface
,
777 { "args", "a{sv}", ARG_IN
},
778 { "path", "o", ARG_OUT
},
782 { "RemoveInterface", WPAS_DBUS_NEW_INTERFACE
,
783 (WPADBusMethodHandler
) &wpas_dbus_handler_remove_interface
,
785 { "path", "o", ARG_IN
},
789 { "GetInterface", WPAS_DBUS_NEW_INTERFACE
,
790 (WPADBusMethodHandler
) &wpas_dbus_handler_get_interface
,
792 { "ifname", "s", ARG_IN
},
793 { "path", "o", ARG_OUT
},
797 { NULL
, NULL
, NULL
, { END_ARGS
} }
800 static const struct wpa_dbus_property_desc wpas_dbus_global_properties
[] = {
801 { "DebugLevel", WPAS_DBUS_NEW_INTERFACE
, "s",
802 (WPADBusPropertyAccessor
) wpas_dbus_getter_debug_level
,
803 (WPADBusPropertyAccessor
) wpas_dbus_setter_debug_level
,
806 { "DebugTimestamp", WPAS_DBUS_NEW_INTERFACE
, "b",
807 (WPADBusPropertyAccessor
) wpas_dbus_getter_debug_timestamp
,
808 (WPADBusPropertyAccessor
) wpas_dbus_setter_debug_timestamp
,
811 { "DebugShowKeys", WPAS_DBUS_NEW_INTERFACE
, "b",
812 (WPADBusPropertyAccessor
) wpas_dbus_getter_debug_show_keys
,
813 (WPADBusPropertyAccessor
) wpas_dbus_setter_debug_show_keys
,
816 { "Interfaces", WPAS_DBUS_NEW_INTERFACE
, "ao",
817 (WPADBusPropertyAccessor
) &wpas_dbus_getter_interfaces
,
821 { "EapMethods", WPAS_DBUS_NEW_INTERFACE
, "as",
822 (WPADBusPropertyAccessor
) wpas_dbus_getter_eap_methods
,
826 { NULL
, NULL
, NULL
, NULL
, NULL
, 0 }
829 static const struct wpa_dbus_signal_desc wpas_dbus_global_signals
[] = {
830 { "InterfaceAdded", WPAS_DBUS_NEW_INTERFACE
,
832 { "path", "o", ARG_OUT
},
833 { "properties", "a{sv}", ARG_OUT
},
837 { "InterfaceRemoved", WPAS_DBUS_NEW_INTERFACE
,
839 { "path", "o", ARG_OUT
},
843 { "PropertiesChanged", WPAS_DBUS_NEW_INTERFACE
,
845 { "properties", "a{sv}", ARG_OUT
},
849 { NULL
, NULL
, { END_ARGS
} }
854 * wpas_dbus_ctrl_iface_init - Initialize dbus control interface
855 * @global: Pointer to global data from wpa_supplicant_init()
856 * Returns: 0 on success or -1 on failure
858 * Initialize the dbus control interface for wpa_supplicantand and start
859 * receiving commands from external programs over the bus.
861 int wpas_dbus_ctrl_iface_init(struct wpas_dbus_priv
*priv
)
863 struct wpa_dbus_object_desc
*obj_desc
;
866 obj_desc
= os_zalloc(sizeof(struct wpa_dbus_object_desc
));
868 wpa_printf(MSG_ERROR
, "Not enough memory "
869 "to create object description");
873 wpas_dbus_register(obj_desc
, priv
->global
, NULL
,
874 wpas_dbus_global_methods
,
875 wpas_dbus_global_properties
,
876 wpas_dbus_global_signals
);
878 wpa_printf(MSG_DEBUG
, "dbus: Register D-Bus object '%s'",
880 ret
= wpa_dbus_ctrl_iface_init(priv
, WPAS_DBUS_NEW_PATH
,
881 WPAS_DBUS_NEW_SERVICE
,
884 free_dbus_object_desc(obj_desc
);
886 priv
->dbus_new_initialized
= 1;
893 * wpas_dbus_ctrl_iface_deinit - Deinitialize dbus ctrl interface for
895 * @iface: Pointer to dbus private data from wpas_dbus_init()
897 * Deinitialize the dbus control interface that was initialized with
898 * wpas_dbus_ctrl_iface_init().
900 void wpas_dbus_ctrl_iface_deinit(struct wpas_dbus_priv
*iface
)
902 if (!iface
->dbus_new_initialized
)
904 wpa_printf(MSG_DEBUG
, "dbus: Unregister D-Bus object '%s'",
906 dbus_connection_unregister_object_path(iface
->con
,
911 static void wpa_dbus_free(void *ptr
)
917 static const struct wpa_dbus_property_desc wpas_dbus_network_properties
[] = {
918 { "Properties", WPAS_DBUS_NEW_IFACE_NETWORK
, "a{sv}",
919 (WPADBusPropertyAccessor
) wpas_dbus_getter_network_properties
,
920 (WPADBusPropertyAccessor
) wpas_dbus_setter_network_properties
,
923 { "Enabled", WPAS_DBUS_NEW_IFACE_NETWORK
, "b",
924 (WPADBusPropertyAccessor
) wpas_dbus_getter_enabled
,
925 (WPADBusPropertyAccessor
) wpas_dbus_setter_enabled
,
928 { NULL
, NULL
, NULL
, NULL
, NULL
, 0 }
932 static const struct wpa_dbus_signal_desc wpas_dbus_network_signals
[] = {
933 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_NETWORK
,
935 { "properties", "a{sv}", ARG_OUT
},
939 { NULL
, NULL
, { END_ARGS
} }
944 * wpas_dbus_register_network - Register a configured network with dbus
945 * @wpa_s: wpa_supplicant interface structure
946 * @ssid: network configuration data
947 * Returns: 0 on success, -1 on failure
949 * Registers network representing object with dbus
951 int wpas_dbus_register_network(struct wpa_supplicant
*wpa_s
,
952 struct wpa_ssid
*ssid
)
954 struct wpas_dbus_priv
*ctrl_iface
;
955 struct wpa_dbus_object_desc
*obj_desc
;
956 struct network_handler_args
*arg
;
957 char net_obj_path
[WPAS_DBUS_OBJECT_PATH_MAX
];
959 /* Do nothing if the control interface is not turned on */
960 if (wpa_s
== NULL
|| wpa_s
->global
== NULL
)
962 ctrl_iface
= wpa_s
->global
->dbus
;
963 if (ctrl_iface
== NULL
)
966 os_snprintf(net_obj_path
, WPAS_DBUS_OBJECT_PATH_MAX
,
967 "%s/" WPAS_DBUS_NEW_NETWORKS_PART
"/%u",
968 wpa_s
->dbus_new_path
, ssid
->id
);
970 wpa_printf(MSG_DEBUG
, "dbus: Register network object '%s'",
972 obj_desc
= os_zalloc(sizeof(struct wpa_dbus_object_desc
));
974 wpa_printf(MSG_ERROR
, "Not enough memory "
975 "to create object description");
979 /* allocate memory for handlers arguments */
980 arg
= os_zalloc(sizeof(struct network_handler_args
));
982 wpa_printf(MSG_ERROR
, "Not enough memory "
983 "to create arguments for method");
990 wpas_dbus_register(obj_desc
, arg
, wpa_dbus_free
, NULL
,
991 wpas_dbus_network_properties
,
992 wpas_dbus_network_signals
);
994 if (wpa_dbus_register_object_per_iface(ctrl_iface
, net_obj_path
,
995 wpa_s
->ifname
, obj_desc
))
998 wpas_dbus_signal_network_added(wpa_s
, ssid
->id
);
1003 free_dbus_object_desc(obj_desc
);
1009 * wpas_dbus_unregister_network - Unregister a configured network from dbus
1010 * @wpa_s: wpa_supplicant interface structure
1012 * Returns: 0 on success, -1 on failure
1014 * Unregisters network representing object from dbus
1016 int wpas_dbus_unregister_network(struct wpa_supplicant
*wpa_s
, int nid
)
1018 struct wpas_dbus_priv
*ctrl_iface
;
1019 char net_obj_path
[WPAS_DBUS_OBJECT_PATH_MAX
];
1022 /* Do nothing if the control interface is not turned on */
1023 if (wpa_s
== NULL
|| wpa_s
->global
== NULL
)
1025 ctrl_iface
= wpa_s
->global
->dbus
;
1026 if (ctrl_iface
== NULL
)
1029 os_snprintf(net_obj_path
, WPAS_DBUS_OBJECT_PATH_MAX
,
1030 "%s/" WPAS_DBUS_NEW_NETWORKS_PART
"/%u",
1031 wpa_s
->dbus_new_path
, nid
);
1033 wpa_printf(MSG_DEBUG
, "dbus: Unregister network object '%s'",
1035 ret
= wpa_dbus_unregister_object_per_iface(ctrl_iface
, net_obj_path
);
1038 wpas_dbus_signal_network_removed(wpa_s
, nid
);
1044 static const struct wpa_dbus_property_desc wpas_dbus_bss_properties
[] = {
1045 { "SSID", WPAS_DBUS_NEW_IFACE_BSSID
, "ay",
1046 (WPADBusPropertyAccessor
) wpas_dbus_getter_bss_ssid
,
1050 { "BSSID", WPAS_DBUS_NEW_IFACE_BSSID
, "ay",
1051 (WPADBusPropertyAccessor
) wpas_dbus_getter_bss_bssid
,
1055 { "Privacy", WPAS_DBUS_NEW_IFACE_BSSID
, "b",
1056 (WPADBusPropertyAccessor
) wpas_dbus_getter_bss_privacy
,
1060 { "Mode", WPAS_DBUS_NEW_IFACE_BSSID
, "s",
1061 (WPADBusPropertyAccessor
) wpas_dbus_getter_bss_mode
,
1065 { "Signal", WPAS_DBUS_NEW_IFACE_BSSID
, "n",
1066 (WPADBusPropertyAccessor
) wpas_dbus_getter_bss_signal
,
1070 { "Frequency", WPAS_DBUS_NEW_IFACE_BSSID
, "q",
1071 (WPADBusPropertyAccessor
) wpas_dbus_getter_bss_frequency
,
1075 { "MaxRate", WPAS_DBUS_NEW_IFACE_BSSID
, "q",
1076 (WPADBusPropertyAccessor
) wpas_dbus_getter_bss_max_rate
,
1080 { "WPAIE", WPAS_DBUS_NEW_IFACE_BSSID
, "ay",
1081 (WPADBusPropertyAccessor
) wpas_dbus_getter_bss_wpaie
,
1085 { "RSNIE", WPAS_DBUS_NEW_IFACE_BSSID
, "ay",
1086 (WPADBusPropertyAccessor
) wpas_dbus_getter_bss_rsnie
,
1090 { "WPSIE", WPAS_DBUS_NEW_IFACE_BSSID
, "ay",
1091 (WPADBusPropertyAccessor
) wpas_dbus_getter_bss_wpsie
,
1095 { NULL
, NULL
, NULL
, NULL
, NULL
, 0 }
1099 static const struct wpa_dbus_signal_desc wpas_dbus_bss_signals
[] = {
1100 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_BSSID
,
1102 { "properties", "a{sv}", ARG_OUT
},
1106 { NULL
, NULL
, { END_ARGS
} }
1111 * wpas_dbus_unregister_bss - Unregister a scanned BSS from dbus
1112 * @wpa_s: wpa_supplicant interface structure
1113 * @bssid: scanned network bssid
1114 * @id: unique BSS identifier
1115 * Returns: 0 on success, -1 on failure
1117 * Unregisters BSS representing object from dbus
1119 int wpas_dbus_unregister_bss(struct wpa_supplicant
*wpa_s
,
1120 u8 bssid
[ETH_ALEN
], unsigned int id
)
1122 struct wpas_dbus_priv
*ctrl_iface
;
1123 char bss_obj_path
[WPAS_DBUS_OBJECT_PATH_MAX
];
1125 /* Do nothing if the control interface is not turned on */
1126 if (wpa_s
== NULL
|| wpa_s
->global
== NULL
)
1128 ctrl_iface
= wpa_s
->global
->dbus
;
1129 if (ctrl_iface
== NULL
)
1132 os_snprintf(bss_obj_path
, WPAS_DBUS_OBJECT_PATH_MAX
,
1133 "%s/" WPAS_DBUS_NEW_BSSIDS_PART
"/%u",
1134 wpa_s
->dbus_new_path
, id
);
1136 wpa_printf(MSG_DEBUG
, "dbus: Unregister BSS object '%s'",
1138 if (wpa_dbus_unregister_object_per_iface(ctrl_iface
, bss_obj_path
)) {
1139 wpa_printf(MSG_ERROR
, "dbus: Cannot unregister BSS object %s",
1144 wpas_dbus_signal_bss_removed(wpa_s
, bss_obj_path
);
1151 * wpas_dbus_register_bss - Register a scanned BSS with dbus
1152 * @wpa_s: wpa_supplicant interface structure
1153 * @bssid: scanned network bssid
1154 * @id: unique BSS identifier
1155 * Returns: 0 on success, -1 on failure
1157 * Registers BSS representing object with dbus
1159 int wpas_dbus_register_bss(struct wpa_supplicant
*wpa_s
,
1160 u8 bssid
[ETH_ALEN
], unsigned int id
)
1162 struct wpas_dbus_priv
*ctrl_iface
;
1163 struct wpa_dbus_object_desc
*obj_desc
;
1164 char bss_obj_path
[WPAS_DBUS_OBJECT_PATH_MAX
];
1165 struct bss_handler_args
*arg
;
1167 /* Do nothing if the control interface is not turned on */
1168 if (wpa_s
== NULL
|| wpa_s
->global
== NULL
)
1170 ctrl_iface
= wpa_s
->global
->dbus
;
1171 if (ctrl_iface
== NULL
)
1174 os_snprintf(bss_obj_path
, WPAS_DBUS_OBJECT_PATH_MAX
,
1175 "%s/" WPAS_DBUS_NEW_BSSIDS_PART
"/%u",
1176 wpa_s
->dbus_new_path
, id
);
1178 obj_desc
= os_zalloc(sizeof(struct wpa_dbus_object_desc
));
1180 wpa_printf(MSG_ERROR
, "Not enough memory "
1181 "to create object description");
1185 arg
= os_zalloc(sizeof(struct bss_handler_args
));
1187 wpa_printf(MSG_ERROR
, "Not enough memory "
1188 "to create arguments for handler");
1194 wpas_dbus_register(obj_desc
, arg
, wpa_dbus_free
, NULL
,
1195 wpas_dbus_bss_properties
,
1196 wpas_dbus_bss_signals
);
1198 wpa_printf(MSG_DEBUG
, "dbus: Register BSS object '%s'",
1200 if (wpa_dbus_register_object_per_iface(ctrl_iface
, bss_obj_path
,
1201 wpa_s
->ifname
, obj_desc
)) {
1202 wpa_printf(MSG_ERROR
,
1203 "Cannot register BSSID dbus object %s.",
1208 wpas_dbus_signal_bss_added(wpa_s
, bss_obj_path
);
1213 free_dbus_object_desc(obj_desc
);
1218 static const struct wpa_dbus_method_desc wpas_dbus_interface_methods
[] = {
1219 { "Scan", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1220 (WPADBusMethodHandler
) &wpas_dbus_handler_scan
,
1222 { "args", "a{sv}", ARG_IN
},
1226 { "Disconnect", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1227 (WPADBusMethodHandler
) &wpas_dbus_handler_disconnect
,
1232 { "AddNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1233 (WPADBusMethodHandler
) &wpas_dbus_handler_add_network
,
1235 { "args", "a{sv}", ARG_IN
},
1236 { "path", "o", ARG_OUT
},
1240 { "RemoveNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1241 (WPADBusMethodHandler
) &wpas_dbus_handler_remove_network
,
1243 { "path", "o", ARG_IN
},
1247 { "SelectNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1248 (WPADBusMethodHandler
) &wpas_dbus_handler_select_network
,
1250 { "path", "o", ARG_IN
},
1254 { "AddBlob", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1255 (WPADBusMethodHandler
) &wpas_dbus_handler_add_blob
,
1257 { "name", "s", ARG_IN
},
1258 { "data", "ay", ARG_IN
},
1262 { "GetBlob", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1263 (WPADBusMethodHandler
) &wpas_dbus_handler_get_blob
,
1265 { "name", "s", ARG_IN
},
1266 { "data", "ay", ARG_OUT
},
1270 { "RemoveBlob", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1271 (WPADBusMethodHandler
) &wpas_dbus_handler_remove_blob
,
1273 { "name", "s", ARG_IN
},
1278 { "Start", WPAS_DBUS_NEW_IFACE_WPS
,
1279 (WPADBusMethodHandler
) &wpas_dbus_handler_wps_start
,
1281 { "args", "a{sv}", ARG_IN
},
1282 { "output", "a{sv}", ARG_OUT
},
1286 #endif /* CONFIG_WPS */
1287 { NULL
, NULL
, NULL
, { END_ARGS
} }
1290 static const struct wpa_dbus_property_desc wpas_dbus_interface_properties
[] = {
1291 { "Capabilities", WPAS_DBUS_NEW_IFACE_INTERFACE
, "a{sv}",
1292 (WPADBusPropertyAccessor
) wpas_dbus_getter_capabilities
,
1295 { "State", WPAS_DBUS_NEW_IFACE_INTERFACE
, "s",
1296 (WPADBusPropertyAccessor
) wpas_dbus_getter_state
,
1299 { "Scanning", WPAS_DBUS_NEW_IFACE_INTERFACE
, "b",
1300 (WPADBusPropertyAccessor
) wpas_dbus_getter_scanning
,
1303 { "ApScan", WPAS_DBUS_NEW_IFACE_INTERFACE
, "u",
1304 (WPADBusPropertyAccessor
) wpas_dbus_getter_ap_scan
,
1305 (WPADBusPropertyAccessor
) wpas_dbus_setter_ap_scan
,
1308 { "Ifname", WPAS_DBUS_NEW_IFACE_INTERFACE
, "s",
1309 (WPADBusPropertyAccessor
) wpas_dbus_getter_ifname
,
1312 { "Driver", WPAS_DBUS_NEW_IFACE_INTERFACE
, "s",
1313 (WPADBusPropertyAccessor
) wpas_dbus_getter_driver
,
1316 { "BridgeIfname", WPAS_DBUS_NEW_IFACE_INTERFACE
, "s",
1317 (WPADBusPropertyAccessor
) wpas_dbus_getter_bridge_ifname
,
1320 { "CurrentBSS", WPAS_DBUS_NEW_IFACE_INTERFACE
, "o",
1321 (WPADBusPropertyAccessor
) wpas_dbus_getter_current_bss
,
1324 { "CurrentNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE
, "o",
1325 (WPADBusPropertyAccessor
) wpas_dbus_getter_current_network
,
1328 { "Blobs", WPAS_DBUS_NEW_IFACE_INTERFACE
, "a{say}",
1329 (WPADBusPropertyAccessor
) wpas_dbus_getter_blobs
,
1332 { "BSSs", WPAS_DBUS_NEW_IFACE_INTERFACE
, "ao",
1333 (WPADBusPropertyAccessor
) wpas_dbus_getter_bsss
,
1336 { "Networks", WPAS_DBUS_NEW_IFACE_INTERFACE
, "ao",
1337 (WPADBusPropertyAccessor
) wpas_dbus_getter_networks
,
1341 { "ProcessCredentials", WPAS_DBUS_NEW_IFACE_WPS
, "b",
1342 (WPADBusPropertyAccessor
) wpas_dbus_getter_process_credentials
,
1343 (WPADBusPropertyAccessor
) wpas_dbus_setter_process_credentials
,
1346 #endif /* CONFIG_WPS */
1347 { NULL
, NULL
, NULL
, NULL
, NULL
, 0 }
1350 static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals
[] = {
1351 { "ScanDone", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1353 { "success", "b", ARG_OUT
},
1357 { "BSSAdded", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1359 { "path", "o", ARG_OUT
},
1360 { "properties", "a{sv}", ARG_OUT
},
1364 { "BSSRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1366 { "path", "o", ARG_OUT
},
1370 { "BlobAdded", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1372 { "name", "s", ARG_OUT
},
1376 { "BlobRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1378 { "name", "s", ARG_OUT
},
1382 { "NetworkAdded", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1384 { "path", "o", ARG_OUT
},
1385 { "properties", "a{sv}", ARG_OUT
},
1389 { "NetworkRemoved", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1391 { "path", "o", ARG_OUT
},
1395 { "NetworkSelected", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1397 { "path", "o", ARG_OUT
},
1401 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_INTERFACE
,
1403 { "properties", "a{sv}", ARG_OUT
},
1408 { "Event", WPAS_DBUS_NEW_IFACE_WPS
,
1410 { "name", "s", ARG_OUT
},
1411 { "args", "a{sv}", ARG_OUT
},
1415 { "Credentials", WPAS_DBUS_NEW_IFACE_WPS
,
1417 { "credentials", "a{sv}", ARG_OUT
},
1421 { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_WPS
,
1423 { "properties", "a{sv}", ARG_OUT
},
1427 #endif /* CONFIG_WPS */
1428 { NULL
, NULL
, { END_ARGS
} }
1432 int wpas_dbus_register_interface(struct wpa_supplicant
*wpa_s
)
1435 struct wpa_dbus_object_desc
*obj_desc
= NULL
;
1436 struct wpas_dbus_priv
*ctrl_iface
= wpa_s
->global
->dbus
;
1439 /* Do nothing if the control interface is not turned on */
1440 if (ctrl_iface
== NULL
)
1443 /* Create and set the interface's object path */
1444 wpa_s
->dbus_new_path
= os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX
);
1445 if (wpa_s
->dbus_new_path
== NULL
)
1447 next
= ctrl_iface
->next_objid
++;
1448 os_snprintf(wpa_s
->dbus_new_path
, WPAS_DBUS_OBJECT_PATH_MAX
,
1449 WPAS_DBUS_NEW_PATH_INTERFACES
"/%u",
1452 obj_desc
= os_zalloc(sizeof(struct wpa_dbus_object_desc
));
1454 wpa_printf(MSG_ERROR
, "Not enough memory "
1455 "to create object description");
1459 wpas_dbus_register(obj_desc
, wpa_s
, NULL
, wpas_dbus_interface_methods
,
1460 wpas_dbus_interface_properties
,
1461 wpas_dbus_interface_signals
);
1463 wpa_printf(MSG_DEBUG
, "dbus: Register interface object '%s'",
1464 wpa_s
->dbus_new_path
);
1465 if (wpa_dbus_register_object_per_iface(ctrl_iface
,
1466 wpa_s
->dbus_new_path
,
1467 wpa_s
->ifname
, obj_desc
))
1470 wpas_dbus_signal_interface_added(wpa_s
);
1475 os_free(wpa_s
->dbus_new_path
);
1476 wpa_s
->dbus_new_path
= NULL
;
1477 free_dbus_object_desc(obj_desc
);
1482 int wpas_dbus_unregister_interface(struct wpa_supplicant
*wpa_s
)
1484 struct wpas_dbus_priv
*ctrl_iface
;
1486 /* Do nothing if the control interface is not turned on */
1487 if (wpa_s
== NULL
|| wpa_s
->global
== NULL
)
1489 ctrl_iface
= wpa_s
->global
->dbus
;
1490 if (ctrl_iface
== NULL
)
1493 wpa_printf(MSG_DEBUG
, "dbus: Unregister interface object '%s'",
1494 wpa_s
->dbus_new_path
);
1495 if (wpa_dbus_unregister_object_per_iface(ctrl_iface
,
1496 wpa_s
->dbus_new_path
))
1499 wpas_dbus_signal_interface_removed(wpa_s
);
1501 os_free(wpa_s
->dbus_new_path
);
1502 wpa_s
->dbus_new_path
= NULL
;