|
@@ -2184,35 +2184,42 @@ static const struct wpa_dbus_method_desc wpas_dbus_global_methods[] = {
|
|
|
static const struct wpa_dbus_property_desc wpas_dbus_global_properties[] = {
|
|
|
{ "DebugLevel", WPAS_DBUS_NEW_INTERFACE, "s",
|
|
|
wpas_dbus_getter_debug_level,
|
|
|
- wpas_dbus_setter_debug_level
|
|
|
+ wpas_dbus_setter_debug_level,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "DebugTimestamp", WPAS_DBUS_NEW_INTERFACE, "b",
|
|
|
wpas_dbus_getter_debug_timestamp,
|
|
|
- wpas_dbus_setter_debug_timestamp
|
|
|
+ wpas_dbus_setter_debug_timestamp,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "DebugShowKeys", WPAS_DBUS_NEW_INTERFACE, "b",
|
|
|
wpas_dbus_getter_debug_show_keys,
|
|
|
- wpas_dbus_setter_debug_show_keys
|
|
|
+ wpas_dbus_setter_debug_show_keys,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "Interfaces", WPAS_DBUS_NEW_INTERFACE, "ao",
|
|
|
wpas_dbus_getter_interfaces,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "EapMethods", WPAS_DBUS_NEW_INTERFACE, "as",
|
|
|
wpas_dbus_getter_eap_methods,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Capabilities", WPAS_DBUS_NEW_INTERFACE, "as",
|
|
|
wpas_dbus_getter_global_capabilities,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
#ifdef CONFIG_WIFI_DISPLAY
|
|
|
{ "WFDIEs", WPAS_DBUS_NEW_INTERFACE, "ay",
|
|
|
wpas_dbus_getter_global_wfd_ies,
|
|
|
- wpas_dbus_setter_global_wfd_ies
|
|
|
+ wpas_dbus_setter_global_wfd_ies,
|
|
|
+ NULL
|
|
|
},
|
|
|
#endif /* CONFIG_WIFI_DISPLAY */
|
|
|
- { NULL, NULL, NULL, NULL, NULL }
|
|
|
+ { NULL, NULL, NULL, NULL, NULL, NULL }
|
|
|
};
|
|
|
|
|
|
static const struct wpa_dbus_signal_desc wpas_dbus_global_signals[] = {
|
|
@@ -2240,12 +2247,50 @@ static const struct wpa_dbus_signal_desc wpas_dbus_global_signals[] = {
|
|
|
};
|
|
|
|
|
|
|
|
|
+static char * uscore_to_dbus(const char *uscore)
|
|
|
+{
|
|
|
+ const char *p = uscore;
|
|
|
+ char *str, *s;
|
|
|
+ dbus_bool_t last_was_uscore = TRUE;
|
|
|
+
|
|
|
+ s = str = os_zalloc(os_strlen(uscore) + 1);
|
|
|
+ if (!str)
|
|
|
+ return NULL;
|
|
|
+ while (p && *p) {
|
|
|
+ if (*p == '_') {
|
|
|
+ last_was_uscore = TRUE;
|
|
|
+ } else {
|
|
|
+ *s++ = last_was_uscore ? toupper(*p) : *p;
|
|
|
+ last_was_uscore = FALSE;
|
|
|
+ }
|
|
|
+ p++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return str;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static int wpa_dbus_ctrl_iface_props_init(struct wpas_dbus_priv *priv);
|
|
|
+
|
|
|
+
|
|
|
+static void wpa_dbus_ctrl_iface_props_deinit(struct wpas_dbus_priv *priv)
|
|
|
+{
|
|
|
+ int idx = priv->globals_start;
|
|
|
+
|
|
|
+ /* Free all allocated property values */
|
|
|
+ while (priv->all_interface_properties[idx].dbus_property)
|
|
|
+ os_free((char *)
|
|
|
+ priv->all_interface_properties[idx++].dbus_property);
|
|
|
+ os_free((char *) priv->all_interface_properties);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* wpas_dbus_ctrl_iface_init - Initialize dbus control interface
|
|
|
* @global: Pointer to global data from wpa_supplicant_init()
|
|
|
* Returns: 0 on success or -1 on failure
|
|
|
*
|
|
|
- * Initialize the dbus control interface for wpa_supplicantand and start
|
|
|
+ * Initialize the dbus control interface for wpa_supplicant and start
|
|
|
* receiving commands from external programs over the bus.
|
|
|
*/
|
|
|
int wpas_dbus_ctrl_iface_init(struct wpas_dbus_priv *priv)
|
|
@@ -2253,11 +2298,18 @@ int wpas_dbus_ctrl_iface_init(struct wpas_dbus_priv *priv)
|
|
|
struct wpa_dbus_object_desc *obj_desc;
|
|
|
int ret;
|
|
|
|
|
|
+ ret = wpa_dbus_ctrl_iface_props_init(priv);
|
|
|
+ if (ret < 0) {
|
|
|
+ wpa_printf(MSG_ERROR,
|
|
|
+ "dbus: Not enough memory to init interface properties");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
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 -1;
|
|
|
+ goto error;
|
|
|
}
|
|
|
|
|
|
wpas_dbus_register(obj_desc, priv->global, NULL,
|
|
@@ -2270,31 +2322,36 @@ int wpas_dbus_ctrl_iface_init(struct wpas_dbus_priv *priv)
|
|
|
ret = wpa_dbus_ctrl_iface_init(priv, WPAS_DBUS_NEW_PATH,
|
|
|
WPAS_DBUS_NEW_SERVICE,
|
|
|
obj_desc);
|
|
|
- if (ret < 0)
|
|
|
+ if (ret < 0) {
|
|
|
free_dbus_object_desc(obj_desc);
|
|
|
- else
|
|
|
- priv->dbus_new_initialized = 1;
|
|
|
+ goto error;
|
|
|
+ }
|
|
|
|
|
|
- return ret;
|
|
|
+ priv->dbus_new_initialized = 1;
|
|
|
+ return 0;
|
|
|
+
|
|
|
+error:
|
|
|
+ wpa_dbus_ctrl_iface_props_deinit(priv);
|
|
|
+ return -1;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* wpas_dbus_ctrl_iface_deinit - Deinitialize dbus ctrl interface for
|
|
|
* wpa_supplicant
|
|
|
- * @iface: Pointer to dbus private data from wpas_dbus_init()
|
|
|
+ * @priv: Pointer to dbus private data from wpas_dbus_init()
|
|
|
*
|
|
|
* Deinitialize the dbus control interface that was initialized with
|
|
|
* wpas_dbus_ctrl_iface_init().
|
|
|
*/
|
|
|
-void wpas_dbus_ctrl_iface_deinit(struct wpas_dbus_priv *iface)
|
|
|
+void wpas_dbus_ctrl_iface_deinit(struct wpas_dbus_priv *priv)
|
|
|
{
|
|
|
- if (!iface->dbus_new_initialized)
|
|
|
+ if (!priv->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);
|
|
|
+ dbus_connection_unregister_object_path(priv->con, WPAS_DBUS_NEW_PATH);
|
|
|
+ wpa_dbus_ctrl_iface_props_deinit(priv);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -2307,13 +2364,15 @@ static void wpa_dbus_free(void *ptr)
|
|
|
static const struct wpa_dbus_property_desc wpas_dbus_network_properties[] = {
|
|
|
{ "Properties", WPAS_DBUS_NEW_IFACE_NETWORK, "a{sv}",
|
|
|
wpas_dbus_getter_network_properties,
|
|
|
- wpas_dbus_setter_network_properties
|
|
|
+ wpas_dbus_setter_network_properties,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "Enabled", WPAS_DBUS_NEW_IFACE_NETWORK, "b",
|
|
|
wpas_dbus_getter_enabled,
|
|
|
- wpas_dbus_setter_enabled
|
|
|
+ wpas_dbus_setter_enabled,
|
|
|
+ NULL
|
|
|
},
|
|
|
- { NULL, NULL, NULL, NULL, NULL }
|
|
|
+ { NULL, NULL, NULL, NULL, NULL, NULL }
|
|
|
};
|
|
|
|
|
|
|
|
@@ -2452,53 +2511,65 @@ int wpas_dbus_unregister_network(struct wpa_supplicant *wpa_s, int nid)
|
|
|
static const struct wpa_dbus_property_desc wpas_dbus_bss_properties[] = {
|
|
|
{ "SSID", WPAS_DBUS_NEW_IFACE_BSS, "ay",
|
|
|
wpas_dbus_getter_bss_ssid,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "BSSID", WPAS_DBUS_NEW_IFACE_BSS, "ay",
|
|
|
wpas_dbus_getter_bss_bssid,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Privacy", WPAS_DBUS_NEW_IFACE_BSS, "b",
|
|
|
wpas_dbus_getter_bss_privacy,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Mode", WPAS_DBUS_NEW_IFACE_BSS, "s",
|
|
|
wpas_dbus_getter_bss_mode,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Signal", WPAS_DBUS_NEW_IFACE_BSS, "n",
|
|
|
wpas_dbus_getter_bss_signal,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Frequency", WPAS_DBUS_NEW_IFACE_BSS, "q",
|
|
|
wpas_dbus_getter_bss_frequency,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Rates", WPAS_DBUS_NEW_IFACE_BSS, "au",
|
|
|
wpas_dbus_getter_bss_rates,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "WPA", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
|
|
|
wpas_dbus_getter_bss_wpa,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "RSN", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
|
|
|
wpas_dbus_getter_bss_rsn,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "WPS", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
|
|
|
wpas_dbus_getter_bss_wps,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "IEs", WPAS_DBUS_NEW_IFACE_BSS, "ay",
|
|
|
wpas_dbus_getter_bss_ies,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Age", WPAS_DBUS_NEW_IFACE_BSS, "u",
|
|
|
wpas_dbus_getter_bss_age,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
- { NULL, NULL, NULL, NULL, NULL }
|
|
|
+ { NULL, NULL, NULL, NULL, NULL, NULL }
|
|
|
};
|
|
|
|
|
|
|
|
@@ -3004,125 +3075,154 @@ static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
|
|
|
static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = {
|
|
|
{ "Capabilities", WPAS_DBUS_NEW_IFACE_INTERFACE, "a{sv}",
|
|
|
wpas_dbus_getter_capabilities,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "State", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
|
|
|
wpas_dbus_getter_state,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Scanning", WPAS_DBUS_NEW_IFACE_INTERFACE, "b",
|
|
|
wpas_dbus_getter_scanning,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "ApScan", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
|
|
|
wpas_dbus_getter_ap_scan,
|
|
|
- wpas_dbus_setter_ap_scan
|
|
|
+ wpas_dbus_setter_ap_scan,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "BSSExpireAge", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
|
|
|
wpas_dbus_getter_bss_expire_age,
|
|
|
- wpas_dbus_setter_bss_expire_age
|
|
|
+ wpas_dbus_setter_bss_expire_age,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "BSSExpireCount", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
|
|
|
wpas_dbus_getter_bss_expire_count,
|
|
|
- wpas_dbus_setter_bss_expire_count
|
|
|
+ wpas_dbus_setter_bss_expire_count,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "Country", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
|
|
|
wpas_dbus_getter_country,
|
|
|
- wpas_dbus_setter_country
|
|
|
+ wpas_dbus_setter_country,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "Ifname", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
|
|
|
wpas_dbus_getter_ifname,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Driver", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
|
|
|
wpas_dbus_getter_driver,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "BridgeIfname", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
|
|
|
wpas_dbus_getter_bridge_ifname,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "CurrentBSS", WPAS_DBUS_NEW_IFACE_INTERFACE, "o",
|
|
|
wpas_dbus_getter_current_bss,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "CurrentNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE, "o",
|
|
|
wpas_dbus_getter_current_network,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "CurrentAuthMode", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
|
|
|
wpas_dbus_getter_current_auth_mode,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Blobs", WPAS_DBUS_NEW_IFACE_INTERFACE, "a{say}",
|
|
|
wpas_dbus_getter_blobs,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "BSSs", WPAS_DBUS_NEW_IFACE_INTERFACE, "ao",
|
|
|
wpas_dbus_getter_bsss,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Networks", WPAS_DBUS_NEW_IFACE_INTERFACE, "ao",
|
|
|
wpas_dbus_getter_networks,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "FastReauth", WPAS_DBUS_NEW_IFACE_INTERFACE, "b",
|
|
|
wpas_dbus_getter_fast_reauth,
|
|
|
- wpas_dbus_setter_fast_reauth
|
|
|
+ wpas_dbus_setter_fast_reauth,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "ScanInterval", WPAS_DBUS_NEW_IFACE_INTERFACE, "i",
|
|
|
wpas_dbus_getter_scan_interval,
|
|
|
- wpas_dbus_setter_scan_interval
|
|
|
+ wpas_dbus_setter_scan_interval,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "PKCS11EnginePath", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
|
|
|
wpas_dbus_getter_pkcs11_engine_path,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "PKCS11ModulePath", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
|
|
|
wpas_dbus_getter_pkcs11_module_path,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
#ifdef CONFIG_WPS
|
|
|
{ "ProcessCredentials", WPAS_DBUS_NEW_IFACE_WPS, "b",
|
|
|
wpas_dbus_getter_process_credentials,
|
|
|
- wpas_dbus_setter_process_credentials
|
|
|
+ wpas_dbus_setter_process_credentials,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "ConfigMethods", WPAS_DBUS_NEW_IFACE_WPS, "s",
|
|
|
wpas_dbus_getter_config_methods,
|
|
|
- wpas_dbus_setter_config_methods
|
|
|
+ wpas_dbus_setter_config_methods,
|
|
|
+ NULL
|
|
|
},
|
|
|
#endif /* CONFIG_WPS */
|
|
|
#ifdef CONFIG_P2P
|
|
|
{ "P2PDeviceConfig", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "a{sv}",
|
|
|
wpas_dbus_getter_p2p_device_config,
|
|
|
- wpas_dbus_setter_p2p_device_config
|
|
|
+ wpas_dbus_setter_p2p_device_config,
|
|
|
+ NULL
|
|
|
},
|
|
|
{ "Peers", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ao",
|
|
|
wpas_dbus_getter_p2p_peers,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Role", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "s",
|
|
|
wpas_dbus_getter_p2p_role,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Group", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "o",
|
|
|
wpas_dbus_getter_p2p_group,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "PeerGO", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "o",
|
|
|
wpas_dbus_getter_p2p_peergo,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "PersistentGroups", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ao",
|
|
|
wpas_dbus_getter_persistent_groups,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
#endif /* CONFIG_P2P */
|
|
|
{ "DisconnectReason", WPAS_DBUS_NEW_IFACE_INTERFACE, "i",
|
|
|
wpas_dbus_getter_disconnect_reason,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
- { NULL, NULL, NULL, NULL, NULL }
|
|
|
+ { NULL, NULL, NULL, NULL, NULL, NULL }
|
|
|
};
|
|
|
|
|
|
static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
|
|
@@ -3396,6 +3496,77 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
|
|
|
};
|
|
|
|
|
|
|
|
|
+static int wpa_dbus_ctrl_iface_props_init(struct wpas_dbus_priv *priv)
|
|
|
+{
|
|
|
+ size_t all_size;
|
|
|
+ unsigned int i, j, count, num_const, num_globals;
|
|
|
+ const char *global_name;
|
|
|
+ static const char * const ignored_globals[] = {
|
|
|
+ "bss_expiration_age", "bss_expiration_scan_count",
|
|
|
+ "ap_scan", "country", "fast_reauth",
|
|
|
+ "pkcs11_engine_path", "pkcs11_module_path"
|
|
|
+ };
|
|
|
+
|
|
|
+ /* wpas_dbus_interface_properties terminates with a NULL element */
|
|
|
+ num_const = ARRAY_SIZE(wpas_dbus_interface_properties) - 1;
|
|
|
+
|
|
|
+ num_globals = wpa_config_get_num_global_field_names();
|
|
|
+ priv->globals_start = num_const;
|
|
|
+
|
|
|
+ /* allocate enough for all properties + terminating NULL element */
|
|
|
+ all_size = (num_globals + num_const + 1) *
|
|
|
+ sizeof(wpas_dbus_interface_properties[0]);
|
|
|
+ priv->all_interface_properties = os_zalloc(all_size);
|
|
|
+ if (!priv->all_interface_properties) {
|
|
|
+ wpa_printf(MSG_ERROR,
|
|
|
+ "dbus: Not enough memory for interface properties");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Copy constant interface properties to the start of the array */
|
|
|
+ os_memcpy(priv->all_interface_properties,
|
|
|
+ wpas_dbus_interface_properties,
|
|
|
+ sizeof(wpas_dbus_interface_properties));
|
|
|
+
|
|
|
+ /* Dynamically construct interface global properties */
|
|
|
+ for (i = 0, count = num_const; i < num_globals; i++) {
|
|
|
+ struct wpa_dbus_property_desc *desc;
|
|
|
+ int no_var = 0;
|
|
|
+
|
|
|
+ /* ignore globals that are actually just methods */
|
|
|
+ global_name = wpa_config_get_global_field_name(i, &no_var);
|
|
|
+ if (no_var)
|
|
|
+ continue;
|
|
|
+ /* Ignore fields already explicitly exposed */
|
|
|
+ for (j = 0; j < ARRAY_SIZE(ignored_globals); j++) {
|
|
|
+ if (os_strcmp(global_name, ignored_globals[j]) == 0)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (j < ARRAY_SIZE(ignored_globals))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ desc = &priv->all_interface_properties[count++];
|
|
|
+ desc->dbus_property = uscore_to_dbus(global_name);
|
|
|
+ if (!desc->dbus_property) {
|
|
|
+ wpa_printf(MSG_ERROR,
|
|
|
+ "dbus: Not enough memory for D-Bus property name");
|
|
|
+ goto error;
|
|
|
+ }
|
|
|
+ desc->dbus_interface = WPAS_DBUS_NEW_IFACE_INTERFACE;
|
|
|
+ desc->type = "s";
|
|
|
+ desc->getter = wpas_dbus_getter_iface_global;
|
|
|
+ desc->setter = wpas_dbus_setter_iface_global;
|
|
|
+ desc->data = global_name;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+error:
|
|
|
+ wpa_dbus_ctrl_iface_props_deinit(priv);
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* wpas_dbus_register_interface - Register an interface with D-Bus
|
|
|
* @wpa_s: wpa_supplicant interface structure
|
|
@@ -3403,7 +3574,6 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
|
|
|
*/
|
|
|
int wpas_dbus_register_interface(struct wpa_supplicant *wpa_s)
|
|
|
{
|
|
|
-
|
|
|
struct wpa_dbus_object_desc *obj_desc = NULL;
|
|
|
struct wpas_dbus_priv *ctrl_iface = wpa_s->global->dbus;
|
|
|
int next;
|
|
@@ -3429,7 +3599,7 @@ int wpas_dbus_register_interface(struct wpa_supplicant *wpa_s)
|
|
|
}
|
|
|
|
|
|
wpas_dbus_register(obj_desc, wpa_s, NULL, wpas_dbus_interface_methods,
|
|
|
- wpas_dbus_interface_properties,
|
|
|
+ ctrl_iface->all_interface_properties,
|
|
|
wpas_dbus_interface_signals);
|
|
|
|
|
|
wpa_printf(MSG_DEBUG, "dbus: Register interface object '%s'",
|
|
@@ -3495,65 +3665,80 @@ int wpas_dbus_unregister_interface(struct wpa_supplicant *wpa_s)
|
|
|
static const struct wpa_dbus_property_desc wpas_dbus_p2p_peer_properties[] = {
|
|
|
{ "DeviceName", WPAS_DBUS_NEW_IFACE_P2P_PEER, "s",
|
|
|
wpas_dbus_getter_p2p_peer_device_name,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Manufacturer", WPAS_DBUS_NEW_IFACE_P2P_PEER, "s",
|
|
|
wpas_dbus_getter_p2p_peer_manufacturer,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "ModelName", WPAS_DBUS_NEW_IFACE_P2P_PEER, "s",
|
|
|
wpas_dbus_getter_p2p_peer_modelname,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "ModelNumber", WPAS_DBUS_NEW_IFACE_P2P_PEER, "s",
|
|
|
wpas_dbus_getter_p2p_peer_modelnumber,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "SerialNumber", WPAS_DBUS_NEW_IFACE_P2P_PEER, "s",
|
|
|
wpas_dbus_getter_p2p_peer_serialnumber,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "PrimaryDeviceType", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ay",
|
|
|
wpas_dbus_getter_p2p_peer_primary_device_type,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "config_method", WPAS_DBUS_NEW_IFACE_P2P_PEER, "q",
|
|
|
wpas_dbus_getter_p2p_peer_config_method,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "level", WPAS_DBUS_NEW_IFACE_P2P_PEER, "i",
|
|
|
wpas_dbus_getter_p2p_peer_level,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "devicecapability", WPAS_DBUS_NEW_IFACE_P2P_PEER, "y",
|
|
|
wpas_dbus_getter_p2p_peer_device_capability,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "groupcapability", WPAS_DBUS_NEW_IFACE_P2P_PEER, "y",
|
|
|
wpas_dbus_getter_p2p_peer_group_capability,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "SecondaryDeviceTypes", WPAS_DBUS_NEW_IFACE_P2P_PEER, "aay",
|
|
|
wpas_dbus_getter_p2p_peer_secondary_device_types,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "VendorExtension", WPAS_DBUS_NEW_IFACE_P2P_PEER, "aay",
|
|
|
wpas_dbus_getter_p2p_peer_vendor_extension,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "IEs", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ay",
|
|
|
wpas_dbus_getter_p2p_peer_ies,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "DeviceAddress", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ay",
|
|
|
wpas_dbus_getter_p2p_peer_device_address,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Groups", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ao",
|
|
|
wpas_dbus_getter_p2p_peer_groups,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
- { NULL, NULL, NULL, NULL, NULL }
|
|
|
+ { NULL, NULL, NULL, NULL, NULL, NULL }
|
|
|
};
|
|
|
|
|
|
static const struct wpa_dbus_signal_desc wpas_dbus_p2p_peer_signals[] = {
|
|
@@ -3811,41 +3996,50 @@ void wpas_dbus_signal_peer_groups_changed(struct wpa_supplicant *wpa_s,
|
|
|
static const struct wpa_dbus_property_desc wpas_dbus_p2p_group_properties[] = {
|
|
|
{ "Members", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "ao",
|
|
|
wpas_dbus_getter_p2p_group_members,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Group", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "o",
|
|
|
wpas_dbus_getter_p2p_group,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Role", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "s",
|
|
|
wpas_dbus_getter_p2p_role,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "SSID", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "ay",
|
|
|
wpas_dbus_getter_p2p_group_ssid,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "BSSID", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "ay",
|
|
|
wpas_dbus_getter_p2p_group_bssid,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Frequency", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "q",
|
|
|
wpas_dbus_getter_p2p_group_frequency,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "Passphrase", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "s",
|
|
|
wpas_dbus_getter_p2p_group_passphrase,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "PSK", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "ay",
|
|
|
wpas_dbus_getter_p2p_group_psk,
|
|
|
+ NULL,
|
|
|
NULL
|
|
|
},
|
|
|
{ "WPSVendorExtensions", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "aay",
|
|
|
wpas_dbus_getter_p2p_group_vendor_ext,
|
|
|
- wpas_dbus_setter_p2p_group_vendor_ext
|
|
|
+ wpas_dbus_setter_p2p_group_vendor_ext,
|
|
|
+ NULL
|
|
|
},
|
|
|
- { NULL, NULL, NULL, NULL, NULL }
|
|
|
+ { NULL, NULL, NULL, NULL, NULL, NULL }
|
|
|
};
|
|
|
|
|
|
static const struct wpa_dbus_signal_desc wpas_dbus_p2p_group_signals[] = {
|
|
@@ -3972,9 +4166,10 @@ static const struct wpa_dbus_property_desc
|
|
|
wpas_dbus_persistent_group_properties[] = {
|
|
|
{ "Properties", WPAS_DBUS_NEW_IFACE_PERSISTENT_GROUP, "a{sv}",
|
|
|
wpas_dbus_getter_persistent_group_properties,
|
|
|
- wpas_dbus_setter_persistent_group_properties
|
|
|
+ wpas_dbus_setter_persistent_group_properties,
|
|
|
+ NULL
|
|
|
},
|
|
|
- { NULL, NULL, NULL, NULL, NULL }
|
|
|
+ { NULL, NULL, NULL, NULL, NULL, NULL }
|
|
|
};
|
|
|
|
|
|
/* No signals intended for persistent group objects */
|