dbus: Replace BSS 'Properties' property with separate properties
[mech_eap.git] / wpa_supplicant / dbus / dbus_new.c
index 6085d58..f8d5767 100644 (file)
@@ -2,6 +2,7 @@
  * WPA Supplicant / dbus-based control interface
  * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
  * Copyright (c) 2009, Witold Sowa <witold.sowa@gmail.com>
+ * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
 #include "includes.h"
 
 #include "common.h"
-#include "drivers/driver.h"
 #include "wps/wps.h"
 #include "../config.h"
 #include "../wpa_supplicant_i.h"
+#include "../bss.h"
 #include "dbus_new_helpers.h"
 #include "dbus_dict_helpers.h"
 #include "dbus_new.h"
 #include "dbus_new_handlers.h"
+#include "dbus_common.h"
+#include "dbus_common_i.h"
 
 /**
  * wpas_dbus_set_path - Assign a dbus path to an interface
@@ -54,11 +57,11 @@ static int wpas_dbus_set_path(struct wpa_supplicant *wpa_s,
 static void wpas_dbus_signal_interface(struct wpa_supplicant *wpa_s,
                                       const char *sig_name)
 {
-       struct ctrl_iface_dbus_new_priv *iface;
+       struct wpas_dbus_priv *iface;
        DBusMessage *_signal;
        const char *path;
 
-       iface = wpa_s->global->dbus_new_ctrl_iface;
+       iface = wpa_s->global->dbus;
 
        /* Do nothing if the control interface is not turned on */
        if (iface == NULL)
@@ -125,12 +128,12 @@ static void wpas_dbus_signal_interface_removed(struct wpa_supplicant *wpa_s)
 static void wpas_dbus_signal_scan_done(struct wpa_supplicant *wpa_s,
                                       int success)
 {
-       struct ctrl_iface_dbus_new_priv *iface;
+       struct wpas_dbus_priv *iface;
        DBusMessage *_signal;
        const char *path;
        dbus_bool_t succ;
 
-       iface = wpa_s->global->dbus_new_ctrl_iface;
+       iface = wpa_s->global->dbus;
 
        /* Do nothing if the control interface is not turned on */
        if (iface == NULL)
@@ -175,11 +178,11 @@ static void wpas_dbus_signal_bss(struct wpa_supplicant *wpa_s,
                                 const char *bss_obj_path,
                                 const char *sig_name)
 {
-       struct ctrl_iface_dbus_new_priv *iface;
+       struct wpas_dbus_priv *iface;
        DBusMessage *_signal;
        const char *path;
 
-       iface = wpa_s->global->dbus_new_ctrl_iface;
+       iface = wpa_s->global->dbus;
 
        /* Do nothing if the control interface is not turned on */
        if (iface == NULL)
@@ -250,11 +253,11 @@ static void wpas_dbus_signal_bss_removed(struct wpa_supplicant *wpa_s,
 static void wpas_dbus_signal_blob(struct wpa_supplicant *wpa_s,
                                  const char *name, const char *sig_name)
 {
-       struct ctrl_iface_dbus_new_priv *iface;
+       struct wpas_dbus_priv *iface;
        DBusMessage *_signal;
        const char *path;
 
-       iface = wpa_s->global->dbus_new_ctrl_iface;
+       iface = wpa_s->global->dbus;
 
        /* Do nothing if the control interface is not turned on */
        if (iface == NULL)
@@ -325,12 +328,12 @@ static void wpas_dbus_signal_blob_removed(struct wpa_supplicant *wpa_s,
 static void wpas_dbus_signal_network(struct wpa_supplicant *wpa_s,
                                     int id, const char *sig_name)
 {
-       struct ctrl_iface_dbus_new_priv *iface;
+       struct wpas_dbus_priv *iface;
        DBusMessage *_signal;
        const char *path;
        char *net_obj_path;
 
-       iface = wpa_s->global->dbus_new_ctrl_iface;
+       iface = wpa_s->global->dbus;
 
        /* Do nothing if the control interface is not turned on */
        if (iface == NULL)
@@ -426,7 +429,7 @@ static void wpas_dbus_signal_state_changed(struct wpa_supplicant *wpa_s,
                                           enum wpa_states new_state,
                                           enum wpa_states old_state)
 {
-       struct ctrl_iface_dbus_new_priv *iface;
+       struct wpas_dbus_priv *iface;
        DBusMessage *_signal = NULL;
        const char *path;
        char *new_state_str, *old_state_str;
@@ -435,7 +438,7 @@ static void wpas_dbus_signal_state_changed(struct wpa_supplicant *wpa_s,
        /* Do nothing if the control interface is not turned on */
        if (wpa_s->global == NULL)
                return;
-       iface = wpa_s->global->dbus_new_ctrl_iface;
+       iface = wpa_s->global->dbus;
        if (iface == NULL)
                return;
 
@@ -529,7 +532,7 @@ static void wpas_dbus_signal_network_enabled_changed(
                    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
                    wpas_dbus_get_path(wpa_s), ssid->id);
 
-       wpa_dbus_signal_property_changed(wpa_s->global->dbus_new_ctrl_iface,
+       wpa_dbus_signal_property_changed(wpa_s->global->dbus,
                                         (WPADBusPropertyAccessor)
                                         wpas_dbus_getter_enabled, &args,
                                         path, WPAS_DBUS_NEW_IFACE_NETWORK,
@@ -550,11 +553,11 @@ static void wpas_dbus_signal_wps_event_success(struct wpa_supplicant *wpa_s)
 
        DBusMessage *_signal = NULL;
        DBusMessageIter iter, dict_iter;
-       struct ctrl_iface_dbus_new_priv *iface;
+       struct wpas_dbus_priv *iface;
        char *key = "success";
        const char *path;
 
-       iface = wpa_s->global->dbus_new_ctrl_iface;
+       iface = wpa_s->global->dbus;
 
        /* Do nothing if the control interface is not turned on */
        if (iface == NULL)
@@ -604,11 +607,11 @@ static void wpas_dbus_signal_wps_event_fail(struct wpa_supplicant *wpa_s,
 
        DBusMessage *_signal = NULL;
        DBusMessageIter iter, dict_iter;
-       struct ctrl_iface_dbus_new_priv *iface;
+       struct wpas_dbus_priv *iface;
        char *key = "fail";
        const char *path;
 
-       iface = wpa_s->global->dbus_new_ctrl_iface;
+       iface = wpa_s->global->dbus;
 
        /* Do nothing if the control interface is not turned on */
        if (iface == NULL)
@@ -659,11 +662,11 @@ static void wpas_dbus_signal_wps_event_m2d(struct wpa_supplicant *wpa_s,
 
        DBusMessage *_signal = NULL;
        DBusMessageIter iter, dict_iter;
-       struct ctrl_iface_dbus_new_priv *iface;
+       struct wpas_dbus_priv *iface;
        char *key = "m2d";
        const char *path;
 
-       iface = wpa_s->global->dbus_new_ctrl_iface;
+       iface = wpa_s->global->dbus;
 
        /* Do nothing if the control interface is not turned on */
        if (iface == NULL)
@@ -736,14 +739,14 @@ static void wpas_dbus_signal_wps_cred(struct wpa_supplicant *wpa_s,
 {
        DBusMessage *_signal = NULL;
        DBusMessageIter iter, dict_iter;
-       struct ctrl_iface_dbus_new_priv *iface;
+       struct wpas_dbus_priv *iface;
        const char *path;
        char *auth_type[6]; /* we have six possible authorization types */
        int at_num = 0;
        char *encr_type[4]; /* we have four possible encryption types */
        int et_num = 0;
 
-       iface = wpa_s->global->dbus_new_ctrl_iface;
+       iface = wpa_s->global->dbus;
 
        /* Do nothing if the control interface is not turned on */
        if (iface == NULL)
@@ -889,7 +892,7 @@ static void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
                return;
        }
 
-       wpa_dbus_signal_property_changed(wpa_s->global->dbus_new_ctrl_iface,
+       wpa_dbus_signal_property_changed(wpa_s->global->dbus,
                                         getter, arg,
                                         wpas_dbus_get_path(wpa_s), iface,
                                         prop);
@@ -905,7 +908,7 @@ static void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
 static void wpas_dbus_signal_debug_params_changed(struct wpa_global *global)
 {
 
-       wpa_dbus_signal_property_changed(global->dbus_new_ctrl_iface,
+       wpa_dbus_signal_property_changed(global->dbus,
                                         (WPADBusPropertyAccessor)
                                         wpas_dbus_getter_debug_params,
                                         global, WPAS_DBUS_NEW_PATH,
@@ -939,16 +942,20 @@ struct wpas_dbus_signal {
 
 static void wpas_dbus_register(struct wpa_dbus_object_desc *obj_desc,
                               void *priv,
+                              WPADBusArgumentFreeFunction priv_free,
                               const struct wpas_dbus_method *methods,
                               const struct wpas_dbus_property *properties,
                               const struct wpas_dbus_signal *signals)
 {
        int i;
 
+       obj_desc->user_data = priv;
+       obj_desc->user_data_free_func = priv_free;
+
        for (i = 0; methods && methods[i].name; i++) {
                wpa_dbus_method_register(obj_desc, methods[i].iface,
                                         methods[i].name, methods[i].handler,
-                                        priv, NULL, methods[i].args);
+                                        methods[i].args);
        }
 
        for (i = 0; properties && properties[i].name; i++) {
@@ -957,7 +964,7 @@ static void wpas_dbus_register(struct wpa_dbus_object_desc *obj_desc,
                                           properties[i].type,
                                           properties[i].getter,
                                           properties[i].setter,
-                                          priv, NULL, properties[i]._access);
+                                          properties[i]._access);
        }
 
        for (i = 0; signals && signals[i].name; i++) {
@@ -1039,54 +1046,58 @@ static const struct wpas_dbus_signal wpas_dbus_global_signals[] = {
 /**
  * wpas_dbus_ctrl_iface_init - Initialize dbus control interface
  * @global: Pointer to global data from wpa_supplicant_init()
- * Returns: Pointer to dbus_new_ctrl_iface date or %NULL on failure
+ * Returns: 0 on success or -1 on failure
  *
  * Initialize the dbus control interface for wpa_supplicantand and start
  * receiving commands from external programs over the bus.
  */
-static struct ctrl_iface_dbus_new_priv * wpas_dbus_ctrl_iface_init(
-       struct wpa_global *global)
+int wpas_dbus_ctrl_iface_init(struct wpas_dbus_priv *priv)
 {
-       struct ctrl_iface_dbus_new_priv *ctrl_iface;
        struct wpa_dbus_object_desc *obj_desc;
+       int ret;
 
        obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
        if (!obj_desc) {
                wpa_printf(MSG_ERROR, "Not enough memory "
                           "to create object description");
-               return NULL;
+               return -1;
        }
 
-       wpas_dbus_register(obj_desc, global, wpas_dbus_global_methods,
+       wpas_dbus_register(obj_desc, priv->global, NULL,
+                          wpas_dbus_global_methods,
                           wpas_dbus_global_properties,
                           wpas_dbus_global_signals);
 
-       ctrl_iface = wpa_dbus_ctrl_iface_init(global, WPAS_DBUS_NEW_PATH,
-                                             WPAS_DBUS_NEW_SERVICE,
-                                             obj_desc);
-       if (!ctrl_iface)
+       wpa_printf(MSG_DEBUG, "dbus: Register D-Bus object '%s'",
+                  WPAS_DBUS_NEW_PATH);
+       ret = wpa_dbus_ctrl_iface_init(priv, WPAS_DBUS_NEW_PATH,
+                                      WPAS_DBUS_NEW_SERVICE,
+                                      obj_desc);
+       if (ret < 0)
                free_dbus_object_desc(obj_desc);
+       else
+               priv->dbus_new_initialized = 1;
 
-       return ctrl_iface;
+       return ret;
 }
 
 
 /**
  * wpas_dbus_ctrl_iface_deinit - Deinitialize dbus ctrl interface for
  * wpa_supplicant
- * @iface: Pointer to dbus private data from
- * wpas_dbus_ctrl_iface_init()
+ * @iface: Pointer to dbus private data from wpas_dbus_init()
  *
  * Deinitialize the dbus control interface that was initialized with
  * wpas_dbus_ctrl_iface_init().
  */
-static void wpas_dbus_ctrl_iface_deinit(struct ctrl_iface_dbus_new_priv *iface)
+void wpas_dbus_ctrl_iface_deinit(struct wpas_dbus_priv *iface)
 {
-       if (iface) {
-               dbus_connection_unregister_object_path(iface->con,
-                                                      WPAS_DBUS_NEW_PATH);
-               wpa_dbus_ctrl_iface_deinit(iface);
-       }
+       if (!iface->dbus_new_initialized)
+               return;
+       wpa_printf(MSG_DEBUG, "dbus: Unregister D-Bus object '%s'",
+                  WPAS_DBUS_NEW_PATH);
+       dbus_connection_unregister_object_path(iface->con,
+                                              WPAS_DBUS_NEW_PATH);
 }
 
 
@@ -1096,6 +1107,32 @@ static void wpa_dbus_free(void *ptr)
 }
 
 
+static const struct wpas_dbus_property wpas_dbus_network_properties[] = {
+       { "Properties", WPAS_DBUS_NEW_IFACE_NETWORK, "a{sv}",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_network_properties,
+         (WPADBusPropertyAccessor) wpas_dbus_setter_network_properties,
+         RW
+       },
+       { "Enabled", WPAS_DBUS_NEW_IFACE_NETWORK, "b",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_enabled,
+         (WPADBusPropertyAccessor) wpas_dbus_setter_enabled,
+         RW
+       },
+       { NULL, NULL, NULL, NULL, NULL, 0 }
+};
+
+
+static const struct wpas_dbus_signal wpas_dbus_network_signals[] = {
+       { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_NETWORK,
+         {
+                 { "properties", "a{sv}", ARG_OUT },
+                 END_ARGS
+         }
+       },
+       { NULL, NULL, { END_ARGS } }
+};
+
+
 /**
  * wpas_dbus_register_network - Register a configured network with dbus
  * @wpa_s: wpa_supplicant interface structure
@@ -1107,23 +1144,17 @@ static void wpa_dbus_free(void *ptr)
 static int wpas_dbus_register_network(struct wpa_supplicant *wpa_s,
                                      struct wpa_ssid *ssid)
 {
-       struct ctrl_iface_dbus_new_priv *ctrl_iface;
+       struct wpas_dbus_priv *ctrl_iface;
        struct wpa_dbus_object_desc *obj_desc;
 
-       struct network_handler_args *arg1 = NULL;
-       struct network_handler_args *arg2 = NULL;
+       struct network_handler_args *arg = NULL;
 
        char *net_obj_path;
 
-       struct wpa_dbus_argument sargs[] = {
-               { "properties", "a{sv}", ARG_OUT },
-               END_ARGS
-       };
-
        /* Do nothing if the control interface is not turned on */
        if (wpa_s == NULL || wpa_s->global == NULL)
                return 0;
-       ctrl_iface = wpa_s->global->dbus_new_ctrl_iface;
+       ctrl_iface = wpa_s->global->dbus;
        if (ctrl_iface == NULL)
                return 0;
 
@@ -1134,6 +1165,8 @@ static int wpas_dbus_register_network(struct wpa_supplicant *wpa_s,
                    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
                    wpas_dbus_get_path(wpa_s), ssid->id);
 
+       wpa_printf(MSG_DEBUG, "dbus: Register network object '%s'",
+                  net_obj_path);
        obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
        if (!obj_desc) {
                wpa_printf(MSG_ERROR, "Not enough memory "
@@ -1142,45 +1175,19 @@ static int wpas_dbus_register_network(struct wpa_supplicant *wpa_s,
        }
 
        /* allocate memory for handlers arguments */
-       arg1 =  os_zalloc(sizeof(struct network_handler_args));
-       if (!arg1) {
-               wpa_printf(MSG_ERROR, "Not enough memory "
-                          "to create arguments for method");
-               goto err;
-       }
-       arg2 =  os_zalloc(sizeof(struct network_handler_args));
-       if (!arg2) {
+       arg = os_zalloc(sizeof(struct network_handler_args));
+       if (!arg) {
                wpa_printf(MSG_ERROR, "Not enough memory "
                           "to create arguments for method");
                goto err;
        }
 
-       arg1->wpa_s = wpa_s;
-       arg1->ssid = ssid;
-       arg2->wpa_s = wpa_s;
-       arg2->ssid = ssid;
-
-       /* Enabled property */
-       wpa_dbus_property_register(obj_desc, WPAS_DBUS_NEW_IFACE_NETWORK,
-                                  "Enabled", "b",
-                                  (WPADBusPropertyAccessor)
-                                  wpas_dbus_getter_enabled,
-                                  (WPADBusPropertyAccessor)
-                                  wpas_dbus_setter_enabled,
-                                  arg1, wpa_dbus_free, RW);
-
-       /* Properties property */
-       wpa_dbus_property_register(obj_desc, WPAS_DBUS_NEW_IFACE_NETWORK,
-                                  "Properties", "a{sv}",
-                                  (WPADBusPropertyAccessor)
-                                  wpas_dbus_getter_network_properties,
-                                  (WPADBusPropertyAccessor)
-                                  wpas_dbus_setter_network_properties,
-                                  arg2, wpa_dbus_free, RW);
-
-       /* PropertiesChanged signal */
-       wpa_dbus_signal_register(obj_desc, WPAS_DBUS_NEW_IFACE_NETWORK,
-                                "PropertiesChanged", sargs);
+       arg->wpa_s = wpa_s;
+       arg->ssid = ssid;
+
+       wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
+                          wpas_dbus_network_properties,
+                          wpas_dbus_network_signals);
 
        if (wpa_dbus_register_object_per_iface(ctrl_iface, net_obj_path,
                                               wpa_s->ifname, obj_desc))
@@ -1194,8 +1201,7 @@ static int wpas_dbus_register_network(struct wpa_supplicant *wpa_s,
 err:
        os_free(net_obj_path);
        os_free(obj_desc);
-       os_free(arg1);
-       os_free(arg2);
+       os_free(arg);
        return -1;
 }
 
@@ -1210,14 +1216,14 @@ err:
  */
 static int wpas_dbus_unregister_network(struct wpa_supplicant *wpa_s, int nid)
 {
-       struct ctrl_iface_dbus_new_priv *ctrl_iface;
+       struct wpas_dbus_priv *ctrl_iface;
        char *net_obj_path;
        int ret;
 
        /* Do nothing if the control interface is not turned on */
        if (wpa_s == NULL || wpa_s->global == NULL)
                return 0;
-       ctrl_iface = wpa_s->global->dbus_new_ctrl_iface;
+       ctrl_iface = wpa_s->global->dbus;
        if (ctrl_iface == NULL)
                return 0;
 
@@ -1228,6 +1234,8 @@ static int wpas_dbus_unregister_network(struct wpa_supplicant *wpa_s, int nid)
                    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
                    wpas_dbus_get_path(wpa_s), nid);
 
+       wpa_printf(MSG_DEBUG, "dbus: Unregister network object '%s'",
+                  net_obj_path);
        ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, net_obj_path);
 
        if (!ret)
@@ -1238,24 +1246,91 @@ static int wpas_dbus_unregister_network(struct wpa_supplicant *wpa_s, int nid)
 }
 
 
+static const struct wpas_dbus_property wpas_dbus_bss_properties[] = {
+       { "SSID", WPAS_DBUS_NEW_IFACE_BSSID, "ay",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_bss_ssid,
+         NULL,
+         R
+       },
+       { "BSSID", WPAS_DBUS_NEW_IFACE_BSSID, "ay",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_bss_bssid,
+         NULL,
+         R
+       },
+       { "Privacy", WPAS_DBUS_NEW_IFACE_BSSID, "b",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_bss_privacy,
+         NULL,
+         R
+       },
+       { "Mode", WPAS_DBUS_NEW_IFACE_BSSID, "s",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_bss_mode,
+         NULL,
+         R
+       },
+       { "Signal", WPAS_DBUS_NEW_IFACE_BSSID, "n",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_bss_signal,
+         NULL,
+         R
+       },
+       { "Frequency", WPAS_DBUS_NEW_IFACE_BSSID, "q",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_bss_frequency,
+         NULL,
+         R
+       },
+       { "MaxRate", WPAS_DBUS_NEW_IFACE_BSSID, "q",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_bss_max_rate,
+         NULL,
+         R
+       },
+       { "WPAIE", WPAS_DBUS_NEW_IFACE_BSSID, "ay",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_bss_wpaie,
+         NULL,
+         R
+       },
+       { "RSNIE", WPAS_DBUS_NEW_IFACE_BSSID, "ay",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_bss_rsnie,
+         NULL,
+         R
+       },
+       { "WPSIE", WPAS_DBUS_NEW_IFACE_BSSID, "ay",
+         (WPADBusPropertyAccessor) wpas_dbus_getter_bss_wpsie,
+         NULL,
+         R
+       },
+       { NULL, NULL, NULL, NULL, NULL, 0 }
+};
+
+
+static const struct wpas_dbus_signal wpas_dbus_bss_signals[] = {
+       { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_BSSID,
+         {
+                 { "properties", "a{sv}", ARG_OUT },
+                 END_ARGS
+         }
+       },
+       { NULL, NULL, { END_ARGS } }
+};
+
+
 /**
  * wpas_dbus_unregister_bss - Unregister a scanned BSS from dbus
  * @wpa_s: wpa_supplicant interface structure
  * @bssid: scanned network bssid
+ * @id: unique BSS identifier
  * Returns: 0 on success, -1 on failure
  *
  * Unregisters BSS representing object from dbus
  */
 static int wpas_dbus_unregister_bss(struct wpa_supplicant *wpa_s,
-                                   u8 bssid[ETH_ALEN])
+                                   u8 bssid[ETH_ALEN], unsigned int id)
 {
-       struct ctrl_iface_dbus_new_priv *ctrl_iface;
+       struct wpas_dbus_priv *ctrl_iface;
        char *bss_obj_path;
 
        /* Do nothing if the control interface is not turned on */
        if (wpa_s == NULL || wpa_s->global == NULL)
                return 0;
-       ctrl_iface = wpa_s->global->dbus_new_ctrl_iface;
+       ctrl_iface = wpa_s->global->dbus;
        if (ctrl_iface == NULL)
                return 0;
 
@@ -1264,9 +1339,11 @@ static int wpas_dbus_unregister_bss(struct wpa_supplicant *wpa_s,
                return -1;
 
        os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
-                   "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/" WPAS_DBUS_BSSID_FORMAT,
-                   wpas_dbus_get_path(wpa_s), MAC2STR(bssid));
+                   "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
+                   wpas_dbus_get_path(wpa_s), id);
 
+       wpa_printf(MSG_DEBUG, "dbus: Unregister BSS object '%s'",
+                  bss_obj_path);
        if (wpa_dbus_unregister_object_per_iface(ctrl_iface, bss_obj_path)) {
                wpa_printf(MSG_ERROR,
                           "Cannot unregister BSSID dbus object %s.",
@@ -1286,14 +1363,15 @@ static int wpas_dbus_unregister_bss(struct wpa_supplicant *wpa_s,
  * wpas_dbus_register_bss - Register a scanned BSS with dbus
  * @wpa_s: wpa_supplicant interface structure
  * @bssid: scanned network bssid
+ * @id: unique BSS identifier
  * Returns: 0 on success, -1 on failure
  *
  * Registers BSS representing object with dbus
  */
 static int wpas_dbus_register_bss(struct wpa_supplicant *wpa_s,
-                                 u8 bssid[ETH_ALEN])
+                                 u8 bssid[ETH_ALEN], unsigned int id)
 {
-       struct ctrl_iface_dbus_new_priv *ctrl_iface;
+       struct wpas_dbus_priv *ctrl_iface;
        struct wpa_dbus_object_desc *obj_desc;
        char *bss_obj_path;
 
@@ -1302,7 +1380,7 @@ static int wpas_dbus_register_bss(struct wpa_supplicant *wpa_s,
        /* Do nothing if the control interface is not turned on */
        if (wpa_s == NULL || wpa_s->global == NULL)
                return 0;
-       ctrl_iface = wpa_s->global->dbus_new_ctrl_iface;
+       ctrl_iface = wpa_s->global->dbus;
        if (ctrl_iface == NULL)
                return 0;
 
@@ -1311,8 +1389,8 @@ static int wpas_dbus_register_bss(struct wpa_supplicant *wpa_s,
                return -1;
 
        os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
-                   "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/" WPAS_DBUS_BSSID_FORMAT,
-                   wpas_dbus_get_path(wpa_s), MAC2STR(bssid));
+                   "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
+                   wpas_dbus_get_path(wpa_s), id);
 
        obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
        if (!obj_desc) {
@@ -1328,15 +1406,14 @@ static int wpas_dbus_register_bss(struct wpa_supplicant *wpa_s,
                goto err;
        }
        arg->wpa_s = wpa_s;
-       os_memcpy(arg->bssid, bssid, ETH_ALEN);
+       arg->id = id;
 
-       /* Properties property */
-       wpa_dbus_property_register(obj_desc, WPAS_DBUS_NEW_IFACE_BSSID,
-                                  "Properties", "a{sv}",
-                                  (WPADBusPropertyAccessor)
-                                  wpas_dbus_getter_bss_properties, NULL,
-                                  arg, wpa_dbus_free, R);
+       wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
+                          wpas_dbus_bss_properties,
+                          wpas_dbus_bss_signals);
 
+       wpa_printf(MSG_DEBUG, "dbus: Register BSS object '%s'",
+                  bss_obj_path);
        if (wpa_dbus_register_object_per_iface(ctrl_iface, bss_obj_path,
                                               wpa_s->ifname, obj_desc)) {
                wpa_printf(MSG_ERROR,
@@ -1582,8 +1659,7 @@ static int wpas_dbus_register_interface(struct wpa_supplicant *wpa_s)
 
        struct wpa_dbus_object_desc *obj_desc = NULL;
        char *path;
-       struct ctrl_iface_dbus_new_priv *ctrl_iface =
-               wpa_s->global->dbus_new_ctrl_iface;
+       struct wpas_dbus_priv *ctrl_iface = wpa_s->global->dbus;
        int next;
 
        /* Do nothing if the control interface is not turned on */
@@ -1594,7 +1670,7 @@ static int wpas_dbus_register_interface(struct wpa_supplicant *wpa_s)
        path = os_zalloc(WPAS_DBUS_OBJECT_PATH_MAX);
        if (path == NULL)
                return -1;
-       next = wpa_dbus_next_objid(ctrl_iface);
+       next = ctrl_iface->next_objid++;
        os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
                    WPAS_DBUS_NEW_PATH_INTERFACES "/%u",
                    next);
@@ -1612,10 +1688,11 @@ static int wpas_dbus_register_interface(struct wpa_supplicant *wpa_s)
                goto err;
        }
 
-       wpas_dbus_register(obj_desc, wpa_s, wpas_dbus_interface_methods,
+       wpas_dbus_register(obj_desc, wpa_s, NULL, wpas_dbus_interface_methods,
                           wpas_dbus_interface_properties,
                           wpas_dbus_interface_signals);
 
+       wpa_printf(MSG_DEBUG, "dbus: Register interface object '%s'", path);
        if (wpa_dbus_register_object_per_iface(ctrl_iface, path, wpa_s->ifname,
                                               obj_desc))
                goto err;
@@ -1634,29 +1711,17 @@ err:
 
 static int wpas_dbus_unregister_interface(struct wpa_supplicant *wpa_s)
 {
-       struct ctrl_iface_dbus_new_priv *ctrl_iface;
-       struct wpa_ssid *ssid;
-       size_t i;
+       struct wpas_dbus_priv *ctrl_iface;
 
        /* Do nothing if the control interface is not turned on */
        if (wpa_s == NULL || wpa_s->global == NULL)
                return 0;
-       ctrl_iface = wpa_s->global->dbus_new_ctrl_iface;
+       ctrl_iface = wpa_s->global->dbus;
        if (ctrl_iface == NULL)
                return 0;
 
-       /* unregister all BSSs and networks from dbus */
-       for (i = 0; wpa_s->scan_res && i < wpa_s->scan_res->num; i++) {
-               wpas_dbus_unregister_bss(wpa_s,
-                                        wpa_s->scan_res->res[i]->bssid);
-       }
-
-       ssid = wpa_s->conf->ssid;
-       while (ssid) {
-               wpas_dbus_unregister_network(wpa_s, ssid->id);
-               ssid = ssid->next;
-       }
-
+       wpa_printf(MSG_DEBUG, "dbus: Unregister interface object '%s'",
+                  wpas_dbus_get_path(wpa_s));
        if (wpa_dbus_unregister_object_per_iface(ctrl_iface,
                                                 wpas_dbus_get_path(wpa_s)))
                return -1;
@@ -1672,9 +1737,6 @@ static int wpas_dbus_unregister_interface(struct wpa_supplicant *wpa_s)
 
 static struct wpas_dbus_callbacks callbacks =
 {
-       .dbus_ctrl_init = wpas_dbus_ctrl_iface_init,
-       .dbus_ctrl_deinit = wpas_dbus_ctrl_iface_deinit,
-
        .signal_interface_created = wpas_dbus_signal_interface_created,
        .signal_interface_removed = wpas_dbus_signal_interface_removed,