/*
* 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-2010, 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
goto err;
wpa_dbus_get_object_properties(iface, bss_obj_path,
- WPAS_DBUS_NEW_IFACE_BSSID,
+ WPAS_DBUS_NEW_IFACE_BSS,
&iter_dict);
if (!wpa_dbus_dict_close_write(&iter, &iter_dict))
}
-static void str_to_lower(char *s)
-{
- while (*s) {
- *s = tolower(*s);
- s++;
- }
-}
-
-
-/**
- * wpas_dbus_signal_state_changed - Send a state changed signal
- * @wpa_s: %wpa_supplicant network interface data
- * @new_state: new state wpa_supplicant is entering
- * @old_state: old state wpa_supplicant is leaving
- *
- * Notify listeners that wpa_supplicant has changed state
- */
-void wpas_dbus_signal_state_changed(struct wpa_supplicant *wpa_s,
- enum wpa_states new_state,
- enum wpa_states old_state)
-{
- struct wpas_dbus_priv *iface;
- DBusMessage *msg;
- char *new_state_str, *old_state_str;
-
- /* Do nothing if the control interface is not turned on */
- if (wpa_s->global == NULL)
- return;
- iface = wpa_s->global->dbus;
- if (iface == NULL)
- return;
-
- /* Only send signal if state really changed */
- if (new_state == old_state)
- return;
-
- msg = dbus_message_new_signal(wpa_s->dbus_new_path,
- WPAS_DBUS_NEW_IFACE_INTERFACE,
- "StateChanged");
- if (msg == NULL)
- return;
-
- new_state_str = os_strdup(wpa_supplicant_state_txt(new_state));
- old_state_str = os_strdup(wpa_supplicant_state_txt(old_state));
- if (new_state_str == NULL || old_state_str == NULL)
- goto out;
-
- /* make state string lowercase to fit new DBus API convention */
- str_to_lower(new_state_str);
- str_to_lower(old_state_str);
-
- if (!dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &new_state_str,
- DBUS_TYPE_STRING, &old_state_str,
- DBUS_TYPE_INVALID)) {
- wpa_printf(MSG_ERROR, "dbus: Failed to construct state change "
- "signal");
- goto out;
- }
-
- dbus_connection_send(iface->con, msg, NULL);
-
-out:
- dbus_message_unref(msg);
- os_free(new_state_str);
- os_free(old_state_str);
-}
-
-
/**
* wpas_dbus_signal_network_enabled_changed - Signals Enabled property changes
* @wpa_s: %wpa_supplicant network interface data
struct wpa_ssid *ssid)
{
- struct network_handler_args args = { wpa_s, ssid };
char path[WPAS_DBUS_OBJECT_PATH_MAX];
os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
"%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%d",
wpa_s->dbus_new_path, ssid->id);
- wpa_dbus_signal_property_changed(wpa_s->global->dbus,
- (WPADBusPropertyAccessor)
- wpas_dbus_getter_enabled, &args,
- path, WPAS_DBUS_NEW_IFACE_NETWORK,
- "Enabled");
+ wpa_dbus_mark_property_changed(wpa_s->global->dbus, path,
+ WPAS_DBUS_NEW_IFACE_NETWORK, "Enabled");
}
WPADBusPropertyAccessor getter;
char *prop;
+ if (wpa_s->dbus_new_path == NULL)
+ return; /* Skip signal since D-Bus setup is not yet ready */
+
switch (property) {
case WPAS_DBUS_PROP_AP_SCAN:
getter = (WPADBusPropertyAccessor) wpas_dbus_getter_ap_scan;
getter = (WPADBusPropertyAccessor) wpas_dbus_getter_scanning;
prop = "Scanning";
break;
+ case WPAS_DBUS_PROP_STATE:
+ getter = (WPADBusPropertyAccessor) wpas_dbus_getter_state;
+ prop = "State";
+ break;
case WPAS_DBUS_PROP_CURRENT_BSS:
getter = (WPADBusPropertyAccessor)
wpas_dbus_getter_current_bss;
return;
}
- wpa_dbus_signal_property_changed(wpa_s->global->dbus,
- getter, wpa_s, wpa_s->dbus_new_path,
- WPAS_DBUS_NEW_IFACE_INTERFACE, prop);
+ wpa_dbus_mark_property_changed(wpa_s->global->dbus,
+ wpa_s->dbus_new_path,
+ WPAS_DBUS_NEW_IFACE_INTERFACE, prop);
+}
+
+
+/**
+ * wpas_dbus_bss_signal_prop_changed - Signals change of BSS property
+ * @wpa_s: %wpa_supplicant network interface data
+ * @property: indicates which property has changed
+ * @id: unique BSS identifier
+ *
+ * Sends PropertyChanged signals with path, interface, and arguments depending
+ * on which property has changed.
+ */
+void wpas_dbus_bss_signal_prop_changed(struct wpa_supplicant *wpa_s,
+ enum wpas_dbus_bss_prop property,
+ unsigned int id)
+{
+ char path[WPAS_DBUS_OBJECT_PATH_MAX];
+ char *prop;
+
+ switch (property) {
+ case WPAS_DBUS_BSS_PROP_SIGNAL:
+ prop = "Signal";
+ break;
+ case WPAS_DBUS_BSS_PROP_FREQ:
+ prop = "Frequency";
+ break;
+ case WPAS_DBUS_BSS_PROP_MODE:
+ prop = "Mode";
+ break;
+ case WPAS_DBUS_BSS_PROP_PRIVACY:
+ prop = "Privacy";
+ break;
+ case WPAS_DBUS_BSS_PROP_RATES:
+ prop = "Rates";
+ break;
+ case WPAS_DBUS_BSS_PROP_WPA:
+ prop = "WPA";
+ break;
+ case WPAS_DBUS_BSS_PROP_RSN:
+ prop = "RSN";
+ break;
+ case WPAS_DBUS_BSS_PROP_IES:
+ prop = "IEs";
+ break;
+ default:
+ wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
+ __func__, property);
+ return;
+ }
+
+ os_snprintf(path, WPAS_DBUS_OBJECT_PATH_MAX,
+ "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
+ wpa_s->dbus_new_path, id);
+
+ wpa_dbus_mark_property_changed(wpa_s->global->dbus, path,
+ WPAS_DBUS_NEW_IFACE_BSS, prop);
}
*/
void wpas_dbus_signal_debug_level_changed(struct wpa_global *global)
{
- wpa_dbus_signal_property_changed(global->dbus,
- (WPADBusPropertyAccessor)
- wpas_dbus_getter_debug_level,
- global, WPAS_DBUS_NEW_PATH,
- WPAS_DBUS_NEW_INTERFACE,
- "DebugLevel");
+ wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
+ WPAS_DBUS_NEW_INTERFACE,
+ "DebugLevel");
}
*/
void wpas_dbus_signal_debug_timestamp_changed(struct wpa_global *global)
{
- wpa_dbus_signal_property_changed(global->dbus,
- (WPADBusPropertyAccessor)
- wpas_dbus_getter_debug_timestamp,
- global, WPAS_DBUS_NEW_PATH,
- WPAS_DBUS_NEW_INTERFACE,
- "DebugTimestamp");
+ wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
+ WPAS_DBUS_NEW_INTERFACE,
+ "DebugTimestamp");
}
*/
void wpas_dbus_signal_debug_show_keys_changed(struct wpa_global *global)
{
- wpa_dbus_signal_property_changed(global->dbus,
- (WPADBusPropertyAccessor)
- wpas_dbus_getter_debug_show_keys,
- global, WPAS_DBUS_NEW_PATH,
- WPAS_DBUS_NEW_INTERFACE,
- "DebugShowKeys");
+ wpa_dbus_mark_property_changed(global->dbus, WPAS_DBUS_NEW_PATH,
+ WPAS_DBUS_NEW_INTERFACE,
+ "DebugShowKeys");
}
const struct wpa_dbus_property_desc *properties,
const struct wpa_dbus_signal_desc *signals)
{
+ int n;
+
obj_desc->user_data = priv;
obj_desc->user_data_free_func = priv_free;
obj_desc->methods = methods;
obj_desc->properties = properties;
obj_desc->signals = signals;
+
+ for (n = 0; properties && properties->dbus_property; properties++)
+ n++;
+
+ obj_desc->prop_changed_flags = os_zalloc(n);
+ if (!obj_desc->prop_changed_flags)
+ wpa_printf(MSG_DEBUG, "dbus: %s: can't register handlers",
+ __func__);
}
};
static const struct wpa_dbus_property_desc wpas_dbus_global_properties[] = {
- { "DebugLevel", WPAS_DBUS_NEW_INTERFACE, "y",
+ { "DebugLevel", WPAS_DBUS_NEW_INTERFACE, "s",
(WPADBusPropertyAccessor) wpas_dbus_getter_debug_level,
(WPADBusPropertyAccessor) wpas_dbus_setter_debug_level,
RW
int ret;
/* Do nothing if the control interface is not turned on */
- if (wpa_s == NULL || wpa_s->global == NULL)
+ if (wpa_s == NULL || wpa_s->global == NULL ||
+ wpa_s->dbus_new_path == NULL)
return 0;
ctrl_iface = wpa_s->global->dbus;
if (ctrl_iface == NULL)
static const struct wpa_dbus_property_desc wpas_dbus_bss_properties[] = {
- { "SSID", WPAS_DBUS_NEW_IFACE_BSSID, "ay",
+ { "SSID", WPAS_DBUS_NEW_IFACE_BSS, "ay",
(WPADBusPropertyAccessor) wpas_dbus_getter_bss_ssid,
NULL,
R
},
- { "BSSID", WPAS_DBUS_NEW_IFACE_BSSID, "ay",
+ { "BSSID", WPAS_DBUS_NEW_IFACE_BSS, "ay",
(WPADBusPropertyAccessor) wpas_dbus_getter_bss_bssid,
NULL,
R
},
- { "Privacy", WPAS_DBUS_NEW_IFACE_BSSID, "b",
+ { "Privacy", WPAS_DBUS_NEW_IFACE_BSS, "b",
(WPADBusPropertyAccessor) wpas_dbus_getter_bss_privacy,
NULL,
R
},
- { "Mode", WPAS_DBUS_NEW_IFACE_BSSID, "s",
+ { "Mode", WPAS_DBUS_NEW_IFACE_BSS, "s",
(WPADBusPropertyAccessor) wpas_dbus_getter_bss_mode,
NULL,
R
},
- { "Signal", WPAS_DBUS_NEW_IFACE_BSSID, "n",
+ { "Signal", WPAS_DBUS_NEW_IFACE_BSS, "n",
(WPADBusPropertyAccessor) wpas_dbus_getter_bss_signal,
NULL,
R
},
- { "Frequency", WPAS_DBUS_NEW_IFACE_BSSID, "q",
+ { "Frequency", WPAS_DBUS_NEW_IFACE_BSS, "q",
(WPADBusPropertyAccessor) wpas_dbus_getter_bss_frequency,
NULL,
R
},
- { "MaxRate", WPAS_DBUS_NEW_IFACE_BSSID, "q",
- (WPADBusPropertyAccessor) wpas_dbus_getter_bss_max_rate,
+ { "Rates", WPAS_DBUS_NEW_IFACE_BSS, "au",
+ (WPADBusPropertyAccessor) wpas_dbus_getter_bss_rates,
NULL,
R
},
- { "WPAIE", WPAS_DBUS_NEW_IFACE_BSSID, "ay",
- (WPADBusPropertyAccessor) wpas_dbus_getter_bss_wpaie,
+ { "WPA", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
+ (WPADBusPropertyAccessor) wpas_dbus_getter_bss_wpa,
NULL,
R
},
- { "RSNIE", WPAS_DBUS_NEW_IFACE_BSSID, "ay",
- (WPADBusPropertyAccessor) wpas_dbus_getter_bss_rsnie,
+ { "RSN", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
+ (WPADBusPropertyAccessor) wpas_dbus_getter_bss_rsn,
NULL,
R
},
- { "WPSIE", WPAS_DBUS_NEW_IFACE_BSSID, "ay",
- (WPADBusPropertyAccessor) wpas_dbus_getter_bss_wpsie,
+ { "IEs", WPAS_DBUS_NEW_IFACE_BSS, "ay",
+ (WPADBusPropertyAccessor) wpas_dbus_getter_bss_ies,
NULL,
R
},
static const struct wpa_dbus_signal_desc wpas_dbus_bss_signals[] = {
- { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_BSSID,
+ { "PropertiesChanged", WPAS_DBUS_NEW_IFACE_BSS,
{
{ "properties", "a{sv}", ARG_OUT },
END_ARGS
END_ARGS
}
},
- { "StateChanged", WPAS_DBUS_NEW_IFACE_INTERFACE,
- {
- { "newState", "s", ARG_OUT },
- { "oldState", "s", ARG_OUT },
- END_ARGS
- }
- },
{ "BSSAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
{
{ "path", "o", ARG_OUT },