Deleted Added
full compact
7,14c7,8
< * 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
< * published by the Free Software Foundation.
< *
< * Alternatively, this software may be distributed under the terms of BSD
< * license.
< *
< * See README and COPYING for more details.
---
> * This software may be distributed under the terms of the BSD license.
> * See README for more details.
19a14
> #include "common/ieee802_11_defs.h"
23a19
> #include "../wpas_glue.h"
28d23
< #include "dbus_common.h"
29a25,26
> #include "dbus_new_handlers_p2p.h"
> #include "p2p/p2p.h"
30a28
> #ifdef CONFIG_AP /* until needed by something else */
31a30,121
> /*
> * NameOwnerChanged handling
> *
> * Some services we provide allow an application to register for
> * a signal that it needs. While it can also unregister, we must
> * be prepared for the case where the application simply crashes
> * and thus doesn't clean up properly. The way to handle this in
> * DBus is to register for the NameOwnerChanged signal which will
> * signal an owner change to NULL if the peer closes the socket
> * for whatever reason.
> *
> * Handle this signal via a filter function whenever necessary.
> * The code below also handles refcounting in case in the future
> * there will be multiple instances of this subscription scheme.
> */
> static const char wpas_dbus_noc_filter_str[] =
> "interface=org.freedesktop.DBus,member=NameOwnerChanged";
>
>
> static DBusHandlerResult noc_filter(DBusConnection *conn,
> DBusMessage *message, void *data)
> {
> struct wpas_dbus_priv *priv = data;
>
> if (dbus_message_get_type(message) != DBUS_MESSAGE_TYPE_SIGNAL)
> return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
>
> if (dbus_message_is_signal(message, DBUS_INTERFACE_DBUS,
> "NameOwnerChanged")) {
> const char *name;
> const char *prev_owner;
> const char *new_owner;
> DBusError derr;
> struct wpa_supplicant *wpa_s;
>
> dbus_error_init(&derr);
>
> if (!dbus_message_get_args(message, &derr,
> DBUS_TYPE_STRING, &name,
> DBUS_TYPE_STRING, &prev_owner,
> DBUS_TYPE_STRING, &new_owner,
> DBUS_TYPE_INVALID)) {
> /* Ignore this error */
> dbus_error_free(&derr);
> return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
> }
>
> for (wpa_s = priv->global->ifaces; wpa_s; wpa_s = wpa_s->next)
> {
> if (wpa_s->preq_notify_peer != NULL &&
> os_strcmp(name, wpa_s->preq_notify_peer) == 0 &&
> (new_owner == NULL || os_strlen(new_owner) == 0)) {
> /* probe request owner disconnected */
> os_free(wpa_s->preq_notify_peer);
> wpa_s->preq_notify_peer = NULL;
> wpas_dbus_unsubscribe_noc(priv);
> }
> }
> }
>
> return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
> }
>
>
> void wpas_dbus_subscribe_noc(struct wpas_dbus_priv *priv)
> {
> priv->dbus_noc_refcnt++;
> if (priv->dbus_noc_refcnt > 1)
> return;
>
> if (!dbus_connection_add_filter(priv->con, noc_filter, priv, NULL)) {
> wpa_printf(MSG_ERROR, "dbus: failed to add filter");
> return;
> }
>
> dbus_bus_add_match(priv->con, wpas_dbus_noc_filter_str, NULL);
> }
>
>
> void wpas_dbus_unsubscribe_noc(struct wpas_dbus_priv *priv)
> {
> priv->dbus_noc_refcnt--;
> if (priv->dbus_noc_refcnt > 0)
> return;
>
> dbus_bus_remove_match(priv->con, wpas_dbus_noc_filter_str, NULL);
> dbus_connection_remove_filter(priv->con, noc_filter, priv);
> }
>
> #endif /* CONFIG_AP */
>
>
45c135
< DBusMessageIter iter, iter_dict;
---
> DBusMessageIter iter;
64c154,156
< if (!wpa_dbus_dict_open_write(&iter, &iter_dict))
---
> if (!wpa_dbus_get_object_properties(
> iface, wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_INTERFACE, &iter))
66,72d157
<
< wpa_dbus_get_object_properties(iface, wpa_s->dbus_new_path,
< WPAS_DBUS_NEW_IFACE_INTERFACE,
< &iter_dict);
<
< if (!wpa_dbus_dict_close_write(&iter, &iter_dict))
< goto err;
160c245
< DBusMessageIter iter, iter_dict;
---
> DBusMessageIter iter;
180c265,267
< if (!wpa_dbus_dict_open_write(&iter, &iter_dict))
---
> if (!wpa_dbus_get_object_properties(iface, bss_obj_path,
> WPAS_DBUS_NEW_IFACE_BSS,
> &iter))
182,188d268
<
< wpa_dbus_get_object_properties(iface, bss_obj_path,
< WPAS_DBUS_NEW_IFACE_BSS,
< &iter_dict);
<
< if (!wpa_dbus_dict_close_write(&iter, &iter_dict))
< goto err;
307c387
< DBusMessageIter iter, iter_dict;
---
> DBusMessageIter iter;
333c413,415
< if (!wpa_dbus_dict_open_write(&iter, &iter_dict))
---
> if (!wpa_dbus_get_object_properties(
> iface, net_obj_path, WPAS_DBUS_NEW_IFACE_NETWORK,
> &iter))
335,341d416
<
< wpa_dbus_get_object_properties(iface, net_obj_path,
< WPAS_DBUS_NEW_IFACE_NETWORK,
< &iter_dict);
<
< if (!wpa_dbus_dict_close_write(&iter, &iter_dict))
< goto err;
396a472,532
> * wpas_dbus_signal_network_request - Indicate that additional information
> * (EAP password, etc.) is required to complete the association to this SSID
> * @wpa_s: %wpa_supplicant network interface data
> * @rtype: The specific additional information required
> * @default_text: Optional description of required information
> *
> * Request additional information or passwords to complete an association
> * request.
> */
> void wpas_dbus_signal_network_request(struct wpa_supplicant *wpa_s,
> struct wpa_ssid *ssid,
> enum wpa_ctrl_req_type rtype,
> const char *default_txt)
> {
> struct wpas_dbus_priv *iface;
> DBusMessage *msg;
> DBusMessageIter iter;
> char net_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
> const char *field, *txt = NULL, *net_ptr;
>
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> field = wpa_supplicant_ctrl_req_to_string(rtype, default_txt, &txt);
> if (field == NULL)
> return;
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_INTERFACE,
> "NetworkRequest");
> if (msg == NULL)
> return;
>
> os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
> wpa_s->dbus_new_path, ssid->id);
> net_ptr = &net_obj_path[0];
>
> dbus_message_iter_init_append(msg, &iter);
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
> &net_ptr))
> goto err;
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &field))
> goto err;
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &txt))
> goto err;
>
> dbus_connection_send(iface->con, msg, NULL);
> dbus_message_unref(msg);
> return;
>
> err:
> wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
> dbus_message_unref(msg);
> }
>
>
> /**
652a789,796
> void wpas_dbus_signal_certification(struct wpa_supplicant *wpa_s,
> int depth, const char *subject,
> const char *cert_hash,
> const struct wpabuf *cert)
> {
> struct wpas_dbus_priv *iface;
> DBusMessage *msg;
> DBusMessageIter iter, dict_iter;
653a798,873
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_INTERFACE,
> "Certification");
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
> if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
> goto nomem;
>
> if (!wpa_dbus_dict_append_uint32(&dict_iter, "depth", depth) ||
> !wpa_dbus_dict_append_string(&dict_iter, "subject", subject))
> goto nomem;
>
> if (cert_hash &&
> !wpa_dbus_dict_append_string(&dict_iter, "cert_hash", cert_hash))
> goto nomem;
>
> if (cert &&
> !wpa_dbus_dict_append_byte_array(&dict_iter, "cert",
> wpabuf_head(cert),
> wpabuf_len(cert)))
> goto nomem;
>
> if (!wpa_dbus_dict_close_write(&iter, &dict_iter))
> goto nomem;
>
> dbus_connection_send(iface->con, msg, NULL);
>
> nomem:
> dbus_message_unref(msg);
> }
>
>
> void wpas_dbus_signal_eap_status(struct wpa_supplicant *wpa_s,
> const char *status, const char *parameter)
> {
> struct wpas_dbus_priv *iface;
> DBusMessage *msg;
> DBusMessageIter iter;
>
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_INTERFACE,
> "EAP");
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
>
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &status)
> ||
> !dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
> &parameter))
> goto nomem;
>
> dbus_connection_send(iface->con, msg, NULL);
>
> nomem:
> dbus_message_unref(msg);
> }
>
>
> #ifdef CONFIG_P2P
>
654a875,1713
> * wpas_dbus_signal_p2p_group_removed - Signals P2P group was removed
> * @wpa_s: %wpa_supplicant network interface data
> * @role: role of this device (client or GO)
> * Sends signal with i/f name and role as string arguments
> */
> void wpas_dbus_signal_p2p_group_removed(struct wpa_supplicant *wpa_s,
> const char *role)
> {
>
> DBusMessage *msg;
> DBusMessageIter iter;
> struct wpas_dbus_priv *iface = wpa_s->global->dbus;
> char *ifname = wpa_s->ifname;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> "GroupFinished");
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
>
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &ifname)) {
> wpa_printf(MSG_ERROR, "dbus: Failed to construct GroupFinished"
> "signal -not enough memory for ifname ");
> goto err;
> }
>
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &role))
> wpa_printf(MSG_ERROR, "dbus: Failed to construct GroupFinished"
> "signal -not enough memory for role ");
> else
> dbus_connection_send(iface->con, msg, NULL);
>
> err:
> dbus_message_unref(msg);
> }
>
>
> /**
> * wpas_dbus_signal_p2p_provision_discovery - Signals various PD events
> *
> * @dev_addr - who sent the request or responded to our request.
> * @request - Will be 1 if request, 0 for response.
> * @status - valid only in case of response
> * @config_methods - wps config methods
> * @generated_pin - pin to be displayed in case of WPS_CONFIG_DISPLAY method
> *
> * Sends following provision discovery related events:
> * ProvisionDiscoveryRequestDisplayPin
> * ProvisionDiscoveryResponseDisplayPin
> * ProvisionDiscoveryRequestEnterPin
> * ProvisionDiscoveryResponseEnterPin
> * ProvisionDiscoveryPBCRequest
> * ProvisionDiscoveryPBCResponse
> *
> * TODO::
> * ProvisionDiscoveryFailure (timeout case)
> */
> void wpas_dbus_signal_p2p_provision_discovery(struct wpa_supplicant *wpa_s,
> const u8 *dev_addr, int request,
> enum p2p_prov_disc_status status,
> u16 config_methods,
> unsigned int generated_pin)
> {
> DBusMessage *msg;
> DBusMessageIter iter;
> struct wpas_dbus_priv *iface;
> char *_signal;
> int add_pin = 0;
> char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
> int error_ret = 1;
> char pin[9], *p_pin = NULL;
>
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> if (request || !status) {
> if (config_methods & WPS_CONFIG_DISPLAY)
> _signal = request ?
> "ProvisionDiscoveryRequestDisplayPin" :
> "ProvisionDiscoveryResponseEnterPin";
> else if (config_methods & WPS_CONFIG_KEYPAD)
> _signal = request ?
> "ProvisionDiscoveryRequestEnterPin" :
> "ProvisionDiscoveryResponseDisplayPin";
> else if (config_methods & WPS_CONFIG_PUSHBUTTON)
> _signal = request ? "ProvisionDiscoveryPBCRequest" :
> "ProvisionDiscoveryPBCResponse";
> else
> return; /* Unknown or un-supported method */
> } else if (!request && status)
> /* Explicit check for failure response */
> _signal = "ProvisionDiscoveryFailure";
>
> add_pin = ((request && (config_methods & WPS_CONFIG_DISPLAY)) ||
> (!request && !status &&
> (config_methods & WPS_CONFIG_KEYPAD)));
>
> if (add_pin) {
> os_snprintf(pin, sizeof(pin), "%08d", generated_pin);
> p_pin = pin;
> }
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE, _signal);
> if (msg == NULL)
> return;
>
> /* Check if this is a known peer */
> if (!p2p_peer_known(wpa_s->global->p2p, dev_addr))
> goto error;
>
> os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/"
> COMPACT_MACSTR,
> wpa_s->dbus_new_path, MAC2STR(dev_addr));
>
> path = peer_obj_path;
>
> dbus_message_iter_init_append(msg, &iter);
>
> if (!dbus_message_iter_append_basic(&iter,
> DBUS_TYPE_OBJECT_PATH,
> &path))
> goto error;
>
> if (!request && status)
> /* Attach status to ProvisionDiscoveryFailure */
> error_ret = !dbus_message_iter_append_basic(&iter,
> DBUS_TYPE_INT32,
> &status);
> else
> error_ret = (add_pin &&
> !dbus_message_iter_append_basic(&iter,
> DBUS_TYPE_STRING,
> &p_pin));
>
> error:
> if (!error_ret)
> dbus_connection_send(iface->con, msg, NULL);
> else
> wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
>
> dbus_message_unref(msg);
> }
>
>
> void wpas_dbus_signal_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
> const u8 *src, u16 dev_passwd_id)
> {
> DBusMessage *msg;
> DBusMessageIter iter;
> struct wpas_dbus_priv *iface;
> char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
>
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
> wpa_s->dbus_new_path, MAC2STR(src));
> path = peer_obj_path;
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> "GONegotiationRequest");
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
>
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
> &path) ||
> !dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT16,
> &dev_passwd_id))
> wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
> else
> dbus_connection_send(iface->con, msg, NULL);
>
> dbus_message_unref(msg);
> }
>
>
> static int wpas_dbus_get_group_obj_path(struct wpa_supplicant *wpa_s,
> const struct wpa_ssid *ssid,
> char *group_obj_path)
> {
> char group_name[3];
>
> if (os_memcmp(ssid->ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN))
> return -1;
>
> os_memcpy(group_name, ssid->ssid + P2P_WILDCARD_SSID_LEN, 2);
> group_name[2] = '\0';
>
> os_snprintf(group_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_GROUPS_PART "/%s",
> wpa_s->dbus_new_path, group_name);
>
> return 0;
> }
>
>
> /**
> * wpas_dbus_signal_p2p_group_started - Signals P2P group has
> * started. Emitted when a group is successfully started
> * irrespective of the role (client/GO) of the current device
> *
> * @wpa_s: %wpa_supplicant network interface data
> * @ssid: SSID object
> * @client: this device is P2P client
> * @network_id: network id of the group started, use instead of ssid->id
> * to account for persistent groups
> */
> void wpas_dbus_signal_p2p_group_started(struct wpa_supplicant *wpa_s,
> const struct wpa_ssid *ssid,
> int client, int network_id)
> {
> DBusMessage *msg;
> DBusMessageIter iter, dict_iter;
> struct wpas_dbus_priv *iface;
> char group_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
>
> iface = wpa_s->parent->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> if (wpas_dbus_get_group_obj_path(wpa_s, ssid, group_obj_path) < 0)
> return;
>
> /* New interface has been created for this group */
> msg = dbus_message_new_signal(wpa_s->parent->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> "GroupStarted");
>
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
> if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
> goto nomem;
>
> /*
> * In case the device supports creating a separate interface the
> * DBus client will need to know the object path for the interface
> * object this group was created on, so include it here.
> */
> if (!wpa_dbus_dict_append_object_path(&dict_iter,
> "interface_object",
> wpa_s->dbus_new_path))
> goto nomem;
>
> if (!wpa_dbus_dict_append_string(&dict_iter, "role",
> client ? "client" : "GO"))
> goto nomem;
>
> if (!wpa_dbus_dict_append_object_path(&dict_iter, "group_object",
> group_obj_path) ||
> !wpa_dbus_dict_close_write(&iter, &dict_iter))
> goto nomem;
>
> dbus_connection_send(iface->con, msg, NULL);
>
> nomem:
> dbus_message_unref(msg);
> }
>
>
> /**
> *
> * Method to emit GONeogtiation Success or Failure signals based
> * on status.
> * @status: Status of the GO neg request. 0 for success, other for errors.
> */
> void wpas_dbus_signal_p2p_go_neg_resp(struct wpa_supplicant *wpa_s,
> struct p2p_go_neg_results *res)
> {
> DBusMessage *msg;
> DBusMessageIter iter, dict_iter;
> DBusMessageIter iter_dict_entry, iter_dict_val, iter_dict_array;
> struct wpas_dbus_priv *iface;
> char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
> dbus_int32_t freqs[P2P_MAX_CHANNELS];
> dbus_int32_t *f_array = freqs;
>
>
> iface = wpa_s->global->dbus;
>
> os_memset(freqs, 0, sizeof(freqs));
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
> wpa_s->dbus_new_path, MAC2STR(res->peer_device_addr));
> path = peer_obj_path;
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> res->status ? "GONegotiationFailure" :
> "GONegotiationSuccess");
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
> if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
> goto err;
> if (!wpa_dbus_dict_append_object_path(&dict_iter, "peer_object",
> path) ||
> !wpa_dbus_dict_append_int32(&dict_iter, "status", res->status))
> goto err;
>
> if (!res->status) {
> int i = 0;
> int freq_list_num = 0;
>
> if (res->role_go) {
> if (!wpa_dbus_dict_append_byte_array(
> &dict_iter, "passphrase",
> (const char *) res->passphrase,
> sizeof(res->passphrase)))
> goto err;
> }
>
> if (!wpa_dbus_dict_append_string(&dict_iter, "role_go",
> res->role_go ? "GO" :
> "client") ||
> !wpa_dbus_dict_append_int32(&dict_iter, "frequency",
> res->freq) ||
> !wpa_dbus_dict_append_byte_array(&dict_iter, "ssid",
> (const char *) res->ssid,
> res->ssid_len) ||
> !wpa_dbus_dict_append_byte_array(&dict_iter,
> "peer_device_addr",
> (const char *)
> res->peer_device_addr,
> ETH_ALEN) ||
> !wpa_dbus_dict_append_byte_array(&dict_iter,
> "peer_interface_addr",
> (const char *)
> res->peer_interface_addr,
> ETH_ALEN) ||
> !wpa_dbus_dict_append_string(&dict_iter, "wps_method",
> p2p_wps_method_text(
> res->wps_method)))
> goto err;
>
> for (i = 0; i < P2P_MAX_CHANNELS; i++) {
> if (res->freq_list[i]) {
> freqs[i] = res->freq_list[i];
> freq_list_num++;
> }
> }
>
> if (!wpa_dbus_dict_begin_array(&dict_iter,
> "frequency_list",
> DBUS_TYPE_INT32_AS_STRING,
> &iter_dict_entry,
> &iter_dict_val,
> &iter_dict_array))
> goto err;
>
> if (!dbus_message_iter_append_fixed_array(&iter_dict_array,
> DBUS_TYPE_INT32,
> &f_array,
> freq_list_num))
> goto err;
>
> if (!wpa_dbus_dict_end_array(&dict_iter,
> &iter_dict_entry,
> &iter_dict_val,
> &iter_dict_array))
> goto err;
>
> if (!wpa_dbus_dict_append_int32(&dict_iter, "persistent_group",
> res->persistent_group) ||
> !wpa_dbus_dict_append_uint32(&dict_iter,
> "peer_config_timeout",
> res->peer_config_timeout))
> goto err;
> }
>
> if (!wpa_dbus_dict_close_write(&iter, &dict_iter))
> goto err;
>
> dbus_connection_send(iface->con, msg, NULL);
> err:
> dbus_message_unref(msg);
> }
>
>
> /**
> *
> * Method to emit Invitation Result signal based on status and
> * bssid
> * @status: Status of the Invite request. 0 for success, other
> * for errors
> * @bssid : Basic Service Set Identifier
> */
> void wpas_dbus_signal_p2p_invitation_result(struct wpa_supplicant *wpa_s,
> int status, const u8 *bssid)
> {
> DBusMessage *msg;
> DBusMessageIter iter, dict_iter;
> struct wpas_dbus_priv *iface;
>
> wpa_printf(MSG_INFO, "%s\n", __func__);
>
> iface = wpa_s->global->dbus;
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> "InvitationResult");
>
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
> if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
> goto nomem;
>
> if (!wpa_dbus_dict_append_int32(&dict_iter, "status", status))
> goto nomem;
> if (bssid) {
> if (!wpa_dbus_dict_append_byte_array(&dict_iter, "BSSID",
> (const char *) bssid,
> ETH_ALEN))
> goto nomem;
> }
> if (!wpa_dbus_dict_close_write(&iter, &dict_iter))
> goto nomem;
>
> dbus_connection_send(iface->con, msg, NULL);
>
> nomem:
> dbus_message_unref(msg);
> }
>
>
> /**
> *
> * Method to emit a signal for a peer joining the group.
> * The signal will carry path to the group member object
> * constructed using p2p i/f addr used for connecting.
> *
> * @wpa_s: %wpa_supplicant network interface data
> * @member_addr: addr (p2p i/f) of the peer joining the group
> */
> void wpas_dbus_signal_p2p_peer_joined(struct wpa_supplicant *wpa_s,
> const u8 *member)
> {
> struct wpas_dbus_priv *iface;
> DBusMessage *msg;
> DBusMessageIter iter;
> char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
>
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> if (!wpa_s->dbus_groupobj_path)
> return;
>
> os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/"
> COMPACT_MACSTR,
> wpa_s->dbus_groupobj_path, MAC2STR(member));
>
> msg = dbus_message_new_signal(wpa_s->dbus_groupobj_path,
> WPAS_DBUS_NEW_IFACE_P2P_GROUP,
> "PeerJoined");
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
> path = groupmember_obj_path;
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
> &path))
> goto err;
>
> dbus_connection_send(iface->con, msg, NULL);
>
> dbus_message_unref(msg);
> return;
>
> err:
> wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
> dbus_message_unref(msg);
> }
>
>
> /**
> *
> * Method to emit a signal for a peer disconnecting the group.
> * The signal will carry path to the group member object
> * constructed using p2p i/f addr used for connecting.
> *
> * @wpa_s: %wpa_supplicant network interface data
> * @member_addr: addr (p2p i/f) of the peer joining the group
> */
> void wpas_dbus_signal_p2p_peer_disconnected(struct wpa_supplicant *wpa_s,
> const u8 *member)
> {
> struct wpas_dbus_priv *iface;
> DBusMessage *msg;
> DBusMessageIter iter;
> char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
>
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> if (!wpa_s->dbus_groupobj_path)
> return;
>
> os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/"
> COMPACT_MACSTR,
> wpa_s->dbus_groupobj_path, MAC2STR(member));
>
> msg = dbus_message_new_signal(wpa_s->dbus_groupobj_path,
> WPAS_DBUS_NEW_IFACE_P2P_GROUP,
> "PeerDisconnected");
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
> path = groupmember_obj_path;
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
> &path))
> goto err;
>
> dbus_connection_send(iface->con, msg, NULL);
>
> dbus_message_unref(msg);
> return;
>
> err:
> wpa_printf(MSG_ERROR, "dbus: Failed to construct PeerDisconnected "
> "signal");
> dbus_message_unref(msg);
> }
>
>
> /**
> *
> * Method to emit a signal for a service discovery request.
> * The signal will carry station address, frequency, dialog token,
> * update indicator and it tlvs
> *
> * @wpa_s: %wpa_supplicant network interface data
> * @sa: station addr (p2p i/f) of the peer
> * @dialog_token: service discovery request dialog token
> * @update_indic: service discovery request update indicator
> * @tlvs: service discovery request genrated byte array of tlvs
> * @tlvs_len: service discovery request tlvs length
> */
> void wpas_dbus_signal_p2p_sd_request(struct wpa_supplicant *wpa_s,
> int freq, const u8 *sa, u8 dialog_token,
> u16 update_indic, const u8 *tlvs,
> size_t tlvs_len)
> {
> DBusMessage *msg;
> DBusMessageIter iter, dict_iter;
> struct wpas_dbus_priv *iface;
> char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> "ServiceDiscoveryRequest");
> if (msg == NULL)
> return;
>
> /* Check if this is a known peer */
> if (!p2p_peer_known(wpa_s->global->p2p, sa))
> goto error;
>
> os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/"
> COMPACT_MACSTR, wpa_s->dbus_new_path, MAC2STR(sa));
>
> path = peer_obj_path;
>
> dbus_message_iter_init_append(msg, &iter);
> if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
> goto error;
>
>
> if (!wpa_dbus_dict_append_object_path(&dict_iter, "peer_object",
> path) ||
> !wpa_dbus_dict_append_int32(&dict_iter, "frequency", freq) ||
> !wpa_dbus_dict_append_int32(&dict_iter, "dialog_token",
> dialog_token) ||
> !wpa_dbus_dict_append_uint16(&dict_iter, "update_indicator",
> update_indic) ||
> !wpa_dbus_dict_append_byte_array(&dict_iter, "tlvs",
> (const char *) tlvs,
> tlvs_len) ||
> !wpa_dbus_dict_close_write(&iter, &dict_iter))
> goto error;
>
> dbus_connection_send(iface->con, msg, NULL);
> dbus_message_unref(msg);
> return;
> error:
> wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
> dbus_message_unref(msg);
> }
>
>
> /**
> *
> * Method to emit a signal for a service discovery response.
> * The signal will carry station address, update indicator and it
> * tlvs
> *
> * @wpa_s: %wpa_supplicant network interface data
> * @sa: station addr (p2p i/f) of the peer
> * @update_indic: service discovery request update indicator
> * @tlvs: service discovery request genrated byte array of tlvs
> * @tlvs_len: service discovery request tlvs length
> */
> void wpas_dbus_signal_p2p_sd_response(struct wpa_supplicant *wpa_s,
> const u8 *sa, u16 update_indic,
> const u8 *tlvs, size_t tlvs_len)
> {
> DBusMessage *msg;
> DBusMessageIter iter, dict_iter;
> struct wpas_dbus_priv *iface;
> char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> "ServiceDiscoveryResponse");
> if (msg == NULL)
> return;
>
> /* Check if this is a known peer */
> if (!p2p_peer_known(wpa_s->global->p2p, sa))
> goto error;
>
> os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/"
> COMPACT_MACSTR, wpa_s->dbus_new_path, MAC2STR(sa));
>
> path = peer_obj_path;
>
> dbus_message_iter_init_append(msg, &iter);
> if (!wpa_dbus_dict_open_write(&iter, &dict_iter))
> goto error;
>
> if (!wpa_dbus_dict_append_object_path(&dict_iter, "peer_object",
> path) ||
> !wpa_dbus_dict_append_uint16(&dict_iter, "update_indicator",
> update_indic) ||
> !wpa_dbus_dict_append_byte_array(&dict_iter, "tlvs",
> (const char *) tlvs,
> tlvs_len) ||
> !wpa_dbus_dict_close_write(&iter, &dict_iter))
> goto error;
>
>
> dbus_connection_send(iface->con, msg, NULL);
> dbus_message_unref(msg);
> return;
> error:
> wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
> dbus_message_unref(msg);
> }
>
> /**
> * wpas_dbus_signal_persistent_group - Send a persistent group related
> * event signal
> * @wpa_s: %wpa_supplicant network interface data
> * @id: new persistent group id
> * @sig_name: signal name - PersistentGroupAdded, PersistentGroupRemoved
> * @properties: determines if add second argument with object properties
> *
> * Notify listeners about an event related to persistent groups.
> */
> static void wpas_dbus_signal_persistent_group(struct wpa_supplicant *wpa_s,
> int id, const char *sig_name,
> int properties)
> {
> struct wpas_dbus_priv *iface;
> DBusMessage *msg;
> DBusMessageIter iter;
> char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
>
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
> wpa_s->dbus_new_path, id);
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> sig_name);
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
> path = pgrp_obj_path;
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
> &path))
> goto err;
>
> if (properties) {
> if (!wpa_dbus_get_object_properties(
> iface, pgrp_obj_path,
> WPAS_DBUS_NEW_IFACE_PERSISTENT_GROUP, &iter))
> goto err;
> }
>
> dbus_connection_send(iface->con, msg, NULL);
>
> dbus_message_unref(msg);
> return;
>
> err:
> wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
> dbus_message_unref(msg);
> }
>
>
> /**
> * wpas_dbus_signal_persistent_group_added - Send a persistent_group
> * added signal
> * @wpa_s: %wpa_supplicant network interface data
> * @id: new persistent group id
> *
> * Notify listeners about addition of a new persistent group.
> */
> static void wpas_dbus_signal_persistent_group_added(
> struct wpa_supplicant *wpa_s, int id)
> {
> wpas_dbus_signal_persistent_group(wpa_s, id, "PersistentGroupAdded",
> TRUE);
> }
>
>
> /**
> * wpas_dbus_signal_persistent_group_removed - Send a persistent_group
> * removed signal
> * @wpa_s: %wpa_supplicant network interface data
> * @id: persistent group id
> *
> * Notify listeners about removal of a persistent group.
> */
> static void wpas_dbus_signal_persistent_group_removed(
> struct wpa_supplicant *wpa_s, int id)
> {
> wpas_dbus_signal_persistent_group(wpa_s, id, "PersistentGroupRemoved",
> FALSE);
> }
>
>
> /**
> * wpas_dbus_signal_p2p_wps_failed - Signals WpsFailed event
> * @wpa_s: %wpa_supplicant network interface data
> *
> * Sends Event dbus signal with name "fail" and dictionary containing
> * "msg" field with fail message number (int32) as arguments
> */
> void wpas_dbus_signal_p2p_wps_failed(struct wpa_supplicant *wpa_s,
> struct wps_event_fail *fail)
> {
>
> DBusMessage *msg;
> DBusMessageIter iter, dict_iter;
> struct wpas_dbus_priv *iface;
> char *key = "fail";
>
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> "WpsFailed");
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
>
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key) ||
> !wpa_dbus_dict_open_write(&iter, &dict_iter) ||
> !wpa_dbus_dict_append_int32(&dict_iter, "msg", fail->msg) ||
> !wpa_dbus_dict_append_int16(&dict_iter, "config_error",
> fail->config_error) ||
> !wpa_dbus_dict_close_write(&iter, &dict_iter))
> wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
> else
> dbus_connection_send(iface->con, msg, NULL);
>
> dbus_message_unref(msg);
> }
>
> #endif /*CONFIG_P2P*/
>
>
> /**
659c1718
< * Sends ProertyChanged signals with path, interface and arguments
---
> * Sends PropertyChanged signals with path, interface and arguments
665d1723
< WPADBusPropertyAccessor getter;
666a1725
> dbus_bool_t flush;
670a1730
> flush = FALSE;
673d1732
< getter = (WPADBusPropertyAccessor) wpas_dbus_getter_ap_scan;
677d1735
< getter = (WPADBusPropertyAccessor) wpas_dbus_getter_scanning;
681d1738
< getter = (WPADBusPropertyAccessor) wpas_dbus_getter_state;
685,686d1741
< getter = (WPADBusPropertyAccessor)
< wpas_dbus_getter_current_bss;
690,691d1744
< getter = (WPADBusPropertyAccessor)
< wpas_dbus_getter_current_network;
693a1747,1756
> case WPAS_DBUS_PROP_BSSS:
> prop = "BSSs";
> break;
> case WPAS_DBUS_PROP_CURRENT_AUTH_MODE:
> prop = "CurrentAuthMode";
> break;
> case WPAS_DBUS_PROP_DISCONNECT_REASON:
> prop = "DisconnectReason";
> flush = TRUE;
> break;
702a1766,1769
> if (flush) {
> wpa_dbus_flush_object_changed_properties(
> wpa_s->global->dbus->con, wpa_s->dbus_new_path);
> }
766c1833
< * Sends ProertyChanged signals informing that debug level has changed.
---
> * Sends PropertyChanged signals informing that debug level has changed.
780c1847
< * Sends ProertyChanged signals informing that debug timestamp has changed.
---
> * Sends PropertyChanged signals informing that debug timestamp has changed.
794c1861
< * Sends ProertyChanged signals informing that debug show_keys has changed.
---
> * Sends PropertyChanged signals informing that debug show_keys has changed.
852a1920,1928
> #ifdef CONFIG_AUTOSCAN
> { "AutoScan", WPAS_DBUS_NEW_IFACE_INTERFACE,
> (WPADBusMethodHandler) &wpas_dbus_handler_autoscan,
> {
> { "arg", "s", ARG_IN },
> END_ARGS
> }
> },
> #endif /* CONFIG_AUTOSCAN */
858,860c1934,1935
< (WPADBusPropertyAccessor) wpas_dbus_getter_debug_level,
< (WPADBusPropertyAccessor) wpas_dbus_setter_debug_level,
< RW
---
> wpas_dbus_getter_debug_level,
> wpas_dbus_setter_debug_level
863,865c1938,1939
< (WPADBusPropertyAccessor) wpas_dbus_getter_debug_timestamp,
< (WPADBusPropertyAccessor) wpas_dbus_setter_debug_timestamp,
< RW
---
> wpas_dbus_getter_debug_timestamp,
> wpas_dbus_setter_debug_timestamp
868,870c1942,1943
< (WPADBusPropertyAccessor) wpas_dbus_getter_debug_show_keys,
< (WPADBusPropertyAccessor) wpas_dbus_setter_debug_show_keys,
< RW
---
> wpas_dbus_getter_debug_show_keys,
> wpas_dbus_setter_debug_show_keys
873,875c1946,1947
< (WPADBusPropertyAccessor) &wpas_dbus_getter_interfaces,
< NULL,
< R
---
> wpas_dbus_getter_interfaces,
> NULL
878,880c1950,1951
< (WPADBusPropertyAccessor) wpas_dbus_getter_eap_methods,
< NULL,
< R
---
> wpas_dbus_getter_eap_methods,
> NULL
882c1953,1957
< { NULL, NULL, NULL, NULL, NULL, 0 }
---
> { "Capabilities", WPAS_DBUS_NEW_INTERFACE, "as",
> wpas_dbus_getter_global_capabilities,
> NULL
> },
> { NULL, NULL, NULL, NULL, NULL }
898a1974,1982
> { "NetworkRequest", WPAS_DBUS_NEW_IFACE_INTERFACE,
> {
> { "path", "o", ARG_OUT },
> { "field", "s", ARG_OUT },
> { "text", "s", ARG_OUT },
> END_ARGS
> }
> },
> /* Deprecated: use org.freedesktop.DBus.Properties.PropertiesChanged */
975,977c2059,2060
< (WPADBusPropertyAccessor) wpas_dbus_getter_network_properties,
< (WPADBusPropertyAccessor) wpas_dbus_setter_network_properties,
< RW
---
> wpas_dbus_getter_network_properties,
> wpas_dbus_setter_network_properties
980,982c2063,2064
< (WPADBusPropertyAccessor) wpas_dbus_getter_enabled,
< (WPADBusPropertyAccessor) wpas_dbus_setter_enabled,
< RW
---
> wpas_dbus_getter_enabled,
> wpas_dbus_setter_enabled
984c2066
< { NULL, NULL, NULL, NULL, NULL, 0 }
---
> { NULL, NULL, NULL, NULL, NULL }
988a2071
> /* Deprecated: use org.freedesktop.DBus.Properties.PropertiesChanged */
1014a2098,2107
> #ifdef CONFIG_P2P
> /*
> * If it is a persistent group register it as such.
> * This is to handle cases where an interface is being initialized
> * with a list of networks read from config.
> */
> if (network_is_persistent_group(ssid))
> return wpas_dbus_register_persistent_group(wpa_s, ssid);
> #endif /* CONFIG_P2P */
>
1076a2170,2171
> #ifdef CONFIG_P2P
> struct wpa_ssid *ssid;
1077a2173,2179
> ssid = wpa_config_get_network(wpa_s->conf, nid);
>
> /* If it is a persistent group unregister it as such */
> if (ssid && network_is_persistent_group(ssid))
> return wpas_dbus_unregister_persistent_group(wpa_s, nid);
> #endif /* CONFIG_P2P */
>
1079,1080c2181
< if (wpa_s == NULL || wpa_s->global == NULL ||
< wpa_s->dbus_new_path == NULL)
---
> if (wpa_s->global == NULL || wpa_s->dbus_new_path == NULL)
1103,1105c2204,2205
< (WPADBusPropertyAccessor) wpas_dbus_getter_bss_ssid,
< NULL,
< R
---
> wpas_dbus_getter_bss_ssid,
> NULL
1108,1110c2208,2209
< (WPADBusPropertyAccessor) wpas_dbus_getter_bss_bssid,
< NULL,
< R
---
> wpas_dbus_getter_bss_bssid,
> NULL
1113,1115c2212,2213
< (WPADBusPropertyAccessor) wpas_dbus_getter_bss_privacy,
< NULL,
< R
---
> wpas_dbus_getter_bss_privacy,
> NULL
1118,1120c2216,2217
< (WPADBusPropertyAccessor) wpas_dbus_getter_bss_mode,
< NULL,
< R
---
> wpas_dbus_getter_bss_mode,
> NULL
1123,1125c2220,2221
< (WPADBusPropertyAccessor) wpas_dbus_getter_bss_signal,
< NULL,
< R
---
> wpas_dbus_getter_bss_signal,
> NULL
1128,1130c2224,2225
< (WPADBusPropertyAccessor) wpas_dbus_getter_bss_frequency,
< NULL,
< R
---
> wpas_dbus_getter_bss_frequency,
> NULL
1133,1135c2228,2229
< (WPADBusPropertyAccessor) wpas_dbus_getter_bss_rates,
< NULL,
< R
---
> wpas_dbus_getter_bss_rates,
> NULL
1138,1140c2232,2233
< (WPADBusPropertyAccessor) wpas_dbus_getter_bss_wpa,
< NULL,
< R
---
> wpas_dbus_getter_bss_wpa,
> NULL
1143,1145c2236,2237
< (WPADBusPropertyAccessor) wpas_dbus_getter_bss_rsn,
< NULL,
< R
---
> wpas_dbus_getter_bss_rsn,
> NULL
1146a2239,2242
> { "WPS", WPAS_DBUS_NEW_IFACE_BSS, "a{sv}",
> wpas_dbus_getter_bss_wps,
> NULL
> },
1148,1150c2244,2245
< (WPADBusPropertyAccessor) wpas_dbus_getter_bss_ies,
< NULL,
< R
---
> wpas_dbus_getter_bss_ies,
> NULL
1152c2247
< { NULL, NULL, NULL, NULL, NULL, 0 }
---
> { NULL, NULL, NULL, NULL, NULL }
1156a2252
> /* Deprecated: use org.freedesktop.DBus.Properties.PropertiesChanged */
1201a2298
> wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_BSSS);
1265a2363
> wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_BSSS);
1296a2395,2400
> { "Reassociate", WPAS_DBUS_NEW_IFACE_INTERFACE,
> (WPADBusMethodHandler) &wpas_dbus_handler_reassociate,
> {
> END_ARGS
> }
> },
1303a2408,2413
> { "RemoveAllNetworks", WPAS_DBUS_NEW_IFACE_INTERFACE,
> (WPADBusMethodHandler) &wpas_dbus_handler_remove_all_networks,
> {
> END_ARGS
> }
> },
1310a2421,2429
> { "NetworkReply", WPAS_DBUS_NEW_IFACE_INTERFACE,
> (WPADBusMethodHandler) &wpas_dbus_handler_network_reply,
> {
> { "path", "o", ARG_IN },
> { "field", "s", ARG_IN },
> { "value", "s", ARG_IN },
> END_ARGS
> }
> },
1343a2463,2651
> #ifdef CONFIG_P2P
> { "Find", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_find,
> {
> { "args", "a{sv}", ARG_IN },
> END_ARGS
> }
> },
> { "StopFind", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_stop_find,
> {
> END_ARGS
> }
> },
> { "Listen", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_listen,
> {
> { "timeout", "i", ARG_IN },
> END_ARGS
> }
> },
> { "ExtendedListen", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_extendedlisten,
> {
> { "args", "a{sv}", ARG_IN },
> END_ARGS
> }
> },
> { "PresenceRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_presence_request,
> {
> { "args", "a{sv}", ARG_IN },
> END_ARGS
> }
> },
> { "ProvisionDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_prov_disc_req,
> {
> { "peer", "o", ARG_IN },
> { "config_method", "s", ARG_IN },
> END_ARGS
> }
> },
> { "Connect", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_connect,
> {
> { "args", "a{sv}", ARG_IN },
> { "generated_pin", "s", ARG_OUT },
> END_ARGS
> }
> },
> { "GroupAdd", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_group_add,
> {
> { "args", "a{sv}", ARG_IN },
> END_ARGS
> }
> },
> { "Invite", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_invite,
> {
> { "args", "a{sv}", ARG_IN },
> END_ARGS
> }
> },
> { "Disconnect", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_disconnect,
> {
> END_ARGS
> }
> },
> { "RejectPeer", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_rejectpeer,
> {
> { "peer", "o", ARG_IN },
> END_ARGS
> }
> },
> { "Flush", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_flush,
> {
> END_ARGS
> }
> },
> { "AddService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_add_service,
> {
> { "args", "a{sv}", ARG_IN },
> END_ARGS
> }
> },
> { "DeleteService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_delete_service,
> {
> { "args", "a{sv}", ARG_IN },
> END_ARGS
> }
> },
> { "FlushService", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_flush_service,
> {
> END_ARGS
> }
> },
> { "ServiceDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_req,
> {
> { "args", "a{sv}", ARG_IN },
> END_ARGS
> }
> },
> { "ServiceDiscoveryResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_res,
> {
> { "args", "a{sv}", ARG_IN },
> END_ARGS
> }
> },
> { "ServiceDiscoveryCancelRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_sd_cancel_req,
> {
> { "args", "t", ARG_IN },
> END_ARGS
> }
> },
> { "ServiceUpdate", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_service_update,
> {
> END_ARGS
> }
> },
> { "ServiceDiscoveryExternal", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_serv_disc_external,
> {
> { "arg", "i", ARG_IN },
> END_ARGS
> }
> },
> { "ServiceDiscoveryExternal", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)wpas_dbus_handler_p2p_serv_disc_external,
> {
> { "arg", "i", ARG_IN },
> END_ARGS
> }
> },
> { "AddPersistentGroup", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler) wpas_dbus_handler_add_persistent_group,
> {
> { "args", "a{sv}", ARG_IN },
> { "path", "o", ARG_OUT },
> END_ARGS
> }
> },
> { "RemovePersistentGroup", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler) wpas_dbus_handler_remove_persistent_group,
> {
> { "path", "o", ARG_IN },
> END_ARGS
> }
> },
> { "RemoveAllPersistentGroups", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> (WPADBusMethodHandler)
> wpas_dbus_handler_remove_all_persistent_groups,
> {
> END_ARGS
> }
> },
> #endif /* CONFIG_P2P */
> { "FlushBSS", WPAS_DBUS_NEW_IFACE_INTERFACE,
> (WPADBusMethodHandler) &wpas_dbus_handler_flush_bss,
> {
> { "age", "u", ARG_IN },
> END_ARGS
> }
> },
> #ifdef CONFIG_AP
> { "SubscribeProbeReq", WPAS_DBUS_NEW_IFACE_INTERFACE,
> (WPADBusMethodHandler) wpas_dbus_handler_subscribe_preq,
> {
> END_ARGS
> }
> },
> { "UnsubscribeProbeReq", WPAS_DBUS_NEW_IFACE_INTERFACE,
> (WPADBusMethodHandler) wpas_dbus_handler_unsubscribe_preq,
> {
> END_ARGS
> }
> },
> #endif /* CONFIG_AP */
1349,1350c2657,2658
< (WPADBusPropertyAccessor) wpas_dbus_getter_capabilities,
< NULL, R
---
> wpas_dbus_getter_capabilities,
> NULL
1353,1354c2661,2662
< (WPADBusPropertyAccessor) wpas_dbus_getter_state,
< NULL, R
---
> wpas_dbus_getter_state,
> NULL
1357,1358c2665,2666
< (WPADBusPropertyAccessor) wpas_dbus_getter_scanning,
< NULL, R
---
> wpas_dbus_getter_scanning,
> NULL
1361,1363c2669,2670
< (WPADBusPropertyAccessor) wpas_dbus_getter_ap_scan,
< (WPADBusPropertyAccessor) wpas_dbus_setter_ap_scan,
< RW
---
> wpas_dbus_getter_ap_scan,
> wpas_dbus_setter_ap_scan
1364a2672,2683
> { "BSSExpireAge", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
> wpas_dbus_getter_bss_expire_age,
> wpas_dbus_setter_bss_expire_age
> },
> { "BSSExpireCount", WPAS_DBUS_NEW_IFACE_INTERFACE, "u",
> wpas_dbus_getter_bss_expire_count,
> wpas_dbus_setter_bss_expire_count
> },
> { "Country", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
> wpas_dbus_getter_country,
> wpas_dbus_setter_country
> },
1366,1367c2685,2686
< (WPADBusPropertyAccessor) wpas_dbus_getter_ifname,
< NULL, R
---
> wpas_dbus_getter_ifname,
> NULL
1370,1371c2689,2690
< (WPADBusPropertyAccessor) wpas_dbus_getter_driver,
< NULL, R
---
> wpas_dbus_getter_driver,
> NULL
1374,1375c2693,2694
< (WPADBusPropertyAccessor) wpas_dbus_getter_bridge_ifname,
< NULL, R
---
> wpas_dbus_getter_bridge_ifname,
> NULL
1378,1379c2697,2698
< (WPADBusPropertyAccessor) wpas_dbus_getter_current_bss,
< NULL, R
---
> wpas_dbus_getter_current_bss,
> NULL
1382,1383c2701,2702
< (WPADBusPropertyAccessor) wpas_dbus_getter_current_network,
< NULL, R
---
> wpas_dbus_getter_current_network,
> NULL
1384a2704,2707
> { "CurrentAuthMode", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
> wpas_dbus_getter_current_auth_mode,
> NULL
> },
1386,1387c2709,2710
< (WPADBusPropertyAccessor) wpas_dbus_getter_blobs,
< NULL, R
---
> wpas_dbus_getter_blobs,
> NULL
1390,1391c2713,2714
< (WPADBusPropertyAccessor) wpas_dbus_getter_bsss,
< NULL, R
---
> wpas_dbus_getter_bsss,
> NULL
1394,1395c2717,2718
< (WPADBusPropertyAccessor) wpas_dbus_getter_networks,
< NULL, R
---
> wpas_dbus_getter_networks,
> NULL
1396a2720,2727
> { "FastReauth", WPAS_DBUS_NEW_IFACE_INTERFACE, "b",
> wpas_dbus_getter_fast_reauth,
> wpas_dbus_setter_fast_reauth
> },
> { "ScanInterval", WPAS_DBUS_NEW_IFACE_INTERFACE, "i",
> wpas_dbus_getter_scan_interval,
> wpas_dbus_setter_scan_interval
> },
1399,1401c2730,2731
< (WPADBusPropertyAccessor) wpas_dbus_getter_process_credentials,
< (WPADBusPropertyAccessor) wpas_dbus_setter_process_credentials,
< RW
---
> wpas_dbus_getter_process_credentials,
> wpas_dbus_setter_process_credentials
1404c2734,2764
< { NULL, NULL, NULL, NULL, NULL, 0 }
---
> #ifdef CONFIG_P2P
> { "P2PDeviceConfig", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "a{sv}",
> wpas_dbus_getter_p2p_device_config,
> wpas_dbus_setter_p2p_device_config
> },
> { "Peers", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ao",
> wpas_dbus_getter_p2p_peers,
> NULL
> },
> { "Role", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "s",
> wpas_dbus_getter_p2p_role,
> NULL
> },
> { "Group", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "o",
> wpas_dbus_getter_p2p_group,
> NULL
> },
> { "PeerGO", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "o",
> wpas_dbus_getter_p2p_peergo,
> NULL
> },
> { "PersistentGroups", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "ao",
> wpas_dbus_getter_persistent_groups,
> NULL
> },
> #endif /* CONFIG_P2P */
> { "DisconnectReason", WPAS_DBUS_NEW_IFACE_INTERFACE, "i",
> wpas_dbus_getter_disconnect_reason,
> NULL
> },
> { NULL, NULL, NULL, NULL, NULL }
1457a2818
> /* Deprecated: use org.freedesktop.DBus.Properties.PropertiesChanged */
1477a2839
> /* Deprecated: use org.freedesktop.DBus.Properties.PropertiesChanged */
1484a2847,3002
> #ifdef CONFIG_P2P
> { "P2PStateChanged", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "states", "a{ss}", ARG_OUT },
> END_ARGS
> }
> },
> { "DeviceFound", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "path", "o", ARG_OUT },
> { "properties", "a{sv}", ARG_OUT },
> END_ARGS
> }
> },
> { "DeviceLost", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "path", "o", ARG_OUT },
> END_ARGS
> }
> },
> { "ProvisionDiscoveryRequestDisplayPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "peer_object", "o", ARG_OUT },
> { "pin", "s", ARG_OUT },
> END_ARGS
> }
> },
> { "ProvisionDiscoveryResponseDisplayPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "peer_object", "o", ARG_OUT },
> { "pin", "s", ARG_OUT },
> END_ARGS
> }
> },
> { "ProvisionDiscoveryRequestEnterPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "peer_object", "o", ARG_OUT },
> END_ARGS
> }
> },
> { "ProvisionDiscoveryResponseEnterPin", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "peer_object", "o", ARG_OUT },
> END_ARGS
> }
> },
> { "ProvisionDiscoveryPBCRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "peer_object", "o", ARG_OUT },
> END_ARGS
> }
> },
> { "ProvisionDiscoveryPBCResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "peer_object", "o", ARG_OUT },
> END_ARGS
> }
> },
> { "ProvisionDiscoveryFailure", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "peer_object", "o", ARG_OUT },
> { "status", "i", ARG_OUT },
> END_ARGS
> }
> },
> { "GroupStarted", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "properties", "a{sv}", ARG_OUT },
> END_ARGS
> }
> },
> { "GONegotiationSuccess", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> END_ARGS
> }
> },
> { "GONegotiationFailure", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "status", "i", ARG_OUT },
> END_ARGS
> }
> },
> { "GONegotiationRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "path", "o", ARG_OUT },
> { "dev_passwd_id", "i", ARG_OUT },
> END_ARGS
> }
> },
> { "InvitationResult", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "invite_result", "a{sv}", ARG_OUT },
> END_ARGS
> }
> },
> { "GroupFinished", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "ifname", "s", ARG_OUT },
> { "role", "s", ARG_OUT },
> END_ARGS
> }
> },
> { "ServiceDiscoveryRequest", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "sd_request", "a{sv}", ARG_OUT },
> END_ARGS
> }
> },
> { "ServiceDiscoveryResponse", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "sd_response", "a{sv}", ARG_OUT },
> END_ARGS
> }
> },
> { "PersistentGroupAdded", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "path", "o", ARG_OUT },
> { "properties", "a{sv}", ARG_OUT },
> END_ARGS
> }
> },
> { "PersistentGroupRemoved", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "path", "o", ARG_OUT },
> END_ARGS
> }
> },
> { "WpsFailed", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> {
> { "name", "s", ARG_OUT },
> { "args", "a{sv}", ARG_OUT },
> END_ARGS
> }
> },
> #endif /* CONFIG_P2P */
> #ifdef CONFIG_AP
> { "ProbeRequest", WPAS_DBUS_NEW_IFACE_INTERFACE,
> {
> { "args", "a{sv}", ARG_OUT },
> END_ARGS
> }
> },
> #endif /* CONFIG_AP */
> { "Certification", WPAS_DBUS_NEW_IFACE_INTERFACE,
> {
> { "certification", "a{sv}", ARG_OUT },
> END_ARGS
> }
> },
> { "EAP", WPAS_DBUS_NEW_IFACE_INTERFACE,
> {
> { "status", "s", ARG_OUT },
> { "parameter", "s", ARG_OUT },
> END_ARGS
> }
> },
1551a3070,3078
>
> #ifdef CONFIG_AP
> if (wpa_s->preq_notify_peer) {
> wpas_dbus_unsubscribe_noc(ctrl_iface);
> os_free(wpa_s->preq_notify_peer);
> wpa_s->preq_notify_peer = NULL;
> }
> #endif /* CONFIG_AP */
>
1562a3090,3710
>
> #ifdef CONFIG_P2P
>
> 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
> },
> { "PrimaryDeviceType", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ay",
> wpas_dbus_getter_p2p_peer_primary_device_type,
> NULL
> },
> { "config_method", WPAS_DBUS_NEW_IFACE_P2P_PEER, "q",
> wpas_dbus_getter_p2p_peer_config_method,
> NULL
> },
> { "level", WPAS_DBUS_NEW_IFACE_P2P_PEER, "i",
> wpas_dbus_getter_p2p_peer_level,
> NULL
> },
> { "devicecapability", WPAS_DBUS_NEW_IFACE_P2P_PEER, "y",
> wpas_dbus_getter_p2p_peer_device_capability,
> NULL
> },
> { "groupcapability", WPAS_DBUS_NEW_IFACE_P2P_PEER, "y",
> wpas_dbus_getter_p2p_peer_group_capability,
> NULL
> },
> { "SecondaryDeviceTypes", WPAS_DBUS_NEW_IFACE_P2P_PEER, "aay",
> wpas_dbus_getter_p2p_peer_secondary_device_types,
> NULL
> },
> { "VendorExtension", WPAS_DBUS_NEW_IFACE_P2P_PEER, "aay",
> wpas_dbus_getter_p2p_peer_vendor_extension,
> NULL
> },
> { "IEs", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ay",
> wpas_dbus_getter_p2p_peer_ies,
> NULL
> },
> { NULL, NULL, NULL, NULL, NULL }
> };
>
> static const struct wpa_dbus_signal_desc wpas_dbus_p2p_peer_signals[] = {
>
> { NULL, NULL, { END_ARGS } }
> };
>
> /**
> * wpas_dbus_signal_peer - Send a peer related event signal
> * @wpa_s: %wpa_supplicant network interface data
> * @dev: peer device object
> * @interface: name of the interface emitting this signal.
> * In case of peer objects, it would be emitted by either
> * the "interface object" or by "peer objects"
> * @sig_name: signal name - DeviceFound
> *
> * Notify listeners about event related with newly found p2p peer device
> */
> static void wpas_dbus_signal_peer(struct wpa_supplicant *wpa_s,
> const u8 *dev_addr, const char *interface,
> const char *sig_name)
> {
> struct wpas_dbus_priv *iface;
> DBusMessage *msg;
> DBusMessageIter iter;
> char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
>
> iface = wpa_s->global->dbus;
>
> /* Do nothing if the control interface is not turned on */
> if (iface == NULL)
> return;
>
> os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
> wpa_s->dbus_new_path, MAC2STR(dev_addr));
>
> msg = dbus_message_new_signal(wpa_s->dbus_new_path, interface,
> sig_name);
> if (msg == NULL)
> return;
>
> dbus_message_iter_init_append(msg, &iter);
> path = peer_obj_path;
> if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
> &path))
> goto err;
>
> dbus_connection_send(iface->con, msg, NULL);
>
> dbus_message_unref(msg);
> return;
>
> err:
> wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
> dbus_message_unref(msg);
> }
>
>
> /**
> * wpas_dbus_signal_peer_found - Send a peer found signal
> * @wpa_s: %wpa_supplicant network interface data
> * @dev: peer device object
> *
> * Notify listeners about find a p2p peer device found
> */
> void wpas_dbus_signal_peer_device_found(struct wpa_supplicant *wpa_s,
> const u8 *dev_addr)
> {
> wpas_dbus_signal_peer(wpa_s, dev_addr,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> "DeviceFound");
> }
>
> /**
> * wpas_dbus_signal_peer_lost - Send a peer lost signal
> * @wpa_s: %wpa_supplicant network interface data
> * @dev: peer device object
> *
> * Notify listeners about lost a p2p peer device
> */
> void wpas_dbus_signal_peer_device_lost(struct wpa_supplicant *wpa_s,
> const u8 *dev_addr)
> {
> wpas_dbus_signal_peer(wpa_s, dev_addr,
> WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> "DeviceLost");
> }
>
> /**
> * wpas_dbus_register_peer - Register a discovered peer object with dbus
> * @wpa_s: wpa_supplicant interface structure
> * @ssid: network configuration data
> * Returns: 0 on success, -1 on failure
> *
> * Registers network representing object with dbus
> */
> int wpas_dbus_register_peer(struct wpa_supplicant *wpa_s, const u8 *dev_addr)
> {
> struct wpas_dbus_priv *ctrl_iface;
> struct wpa_dbus_object_desc *obj_desc;
> struct peer_handler_args *arg;
> char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
>
> /* 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;
> if (ctrl_iface == NULL)
> return 0;
>
> os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
> wpa_s->dbus_new_path, MAC2STR(dev_addr));
>
> wpa_printf(MSG_INFO, "dbus: Register peer object '%s'",
> peer_obj_path);
> obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
> if (!obj_desc) {
> wpa_printf(MSG_ERROR, "Not enough memory "
> "to create object description");
> goto err;
> }
>
> /* allocate memory for handlers arguments */
> arg = os_zalloc(sizeof(struct peer_handler_args));
> if (!arg) {
> wpa_printf(MSG_ERROR, "Not enough memory "
> "to create arguments for method");
> goto err;
> }
>
> arg->wpa_s = wpa_s;
> os_memcpy(arg->p2p_device_addr, dev_addr, ETH_ALEN);
>
> wpas_dbus_register(obj_desc, arg, wpa_dbus_free,
> NULL,
> wpas_dbus_p2p_peer_properties,
> wpas_dbus_p2p_peer_signals);
>
> if (wpa_dbus_register_object_per_iface(ctrl_iface, peer_obj_path,
> wpa_s->ifname, obj_desc))
> goto err;
>
> return 0;
>
> err:
> free_dbus_object_desc(obj_desc);
> return -1;
> }
>
> /**
> * wpas_dbus_unregister_peer - Unregister a peer object with dbus
> * @wpa_s: wpa_supplicant interface structure
> * @dev_addr: p2p device addr
> * Returns: 0 on success, -1 on failure
> *
> * Registers network representing object with dbus
> */
> int wpas_dbus_unregister_peer(struct wpa_supplicant *wpa_s,
> const u8 *dev_addr)
> {
> struct wpas_dbus_priv *ctrl_iface;
> char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
> int ret;
>
> /* Do nothing if the control interface is not turned on */
> 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)
> return 0;
>
> os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
> wpa_s->dbus_new_path, MAC2STR(dev_addr));
>
> wpa_printf(MSG_INFO, "dbus: Unregister peer object '%s'",
> peer_obj_path);
> ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, peer_obj_path);
>
> return ret;
> }
>
>
> 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
> },
> { "Group", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "o",
> wpas_dbus_getter_p2p_group,
> NULL
> },
> { "Role", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "s",
> wpas_dbus_getter_p2p_role,
> NULL
> },
> { "SSID", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "ay",
> wpas_dbus_getter_p2p_group_ssid,
> NULL
> },
> { "BSSID", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "ay",
> wpas_dbus_getter_p2p_group_bssid,
> NULL
> },
> { "Frequency", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "q",
> wpas_dbus_getter_p2p_group_frequency,
> NULL
> },
> { "Passphrase", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "s",
> wpas_dbus_getter_p2p_group_passphrase,
> NULL
> },
> { "PSK", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "ay",
> wpas_dbus_getter_p2p_group_psk,
> NULL
> },
> { "WPSVendorExtensions", WPAS_DBUS_NEW_IFACE_P2P_GROUP, "aay",
> wpas_dbus_getter_p2p_group_vendor_ext,
> wpas_dbus_setter_p2p_group_vendor_ext
> },
> { NULL, NULL, NULL, NULL, NULL }
> };
>
> static const struct wpa_dbus_signal_desc wpas_dbus_p2p_group_signals[] = {
> { "PeerJoined", WPAS_DBUS_NEW_IFACE_P2P_GROUP,
> {
> { "peer", "o", ARG_OUT },
> END_ARGS
> }
> },
> { "PeerDisconnected", WPAS_DBUS_NEW_IFACE_P2P_GROUP,
> {
> { "peer", "o", ARG_OUT },
> END_ARGS
> }
> },
> { NULL, NULL, { END_ARGS } }
> };
>
> /**
> * wpas_dbus_register_p2p_group - Register a p2p group object with dbus
> * @wpa_s: wpa_supplicant interface structure
> * @ssid: SSID struct
> * Returns: 0 on success, -1 on failure
> *
> * Registers p2p group representing object with dbus
> */
> void wpas_dbus_register_p2p_group(struct wpa_supplicant *wpa_s,
> struct wpa_ssid *ssid)
> {
> struct wpas_dbus_priv *ctrl_iface;
> struct wpa_dbus_object_desc *obj_desc;
> char group_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
>
> /* Do nothing if the control interface is not turned on */
> if (wpa_s == NULL || wpa_s->global == NULL)
> return;
>
> ctrl_iface = wpa_s->global->dbus;
> if (ctrl_iface == NULL)
> return;
>
> if (wpa_s->dbus_groupobj_path) {
> wpa_printf(MSG_INFO, "%s: Group object '%s' already exists",
> __func__, wpa_s->dbus_groupobj_path);
> return;
> }
>
> if (wpas_dbus_get_group_obj_path(wpa_s, ssid, group_obj_path) < 0)
> return;
>
> wpa_s->dbus_groupobj_path = os_strdup(group_obj_path);
> if (wpa_s->dbus_groupobj_path == NULL)
> return;
>
> wpa_printf(MSG_INFO, "dbus: Register group object '%s'",
> group_obj_path);
> obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
> if (!obj_desc) {
> wpa_printf(MSG_ERROR, "Not enough memory "
> "to create object description");
> goto err;
> }
>
> wpas_dbus_register(obj_desc, wpa_s, NULL, NULL,
> wpas_dbus_p2p_group_properties,
> wpas_dbus_p2p_group_signals);
>
> if (wpa_dbus_register_object_per_iface(ctrl_iface, group_obj_path,
> wpa_s->ifname, obj_desc))
> goto err;
>
> return;
>
> err:
> if (wpa_s->dbus_groupobj_path) {
> os_free(wpa_s->dbus_groupobj_path);
> wpa_s->dbus_groupobj_path = NULL;
> }
>
> free_dbus_object_desc(obj_desc);
> }
>
> /**
> * wpas_dbus_unregister_p2p_group - Unregister a p2p group object from dbus
> * @wpa_s: wpa_supplicant interface structure
> * @ssid: network name of the p2p group started
> */
> void wpas_dbus_unregister_p2p_group(struct wpa_supplicant *wpa_s,
> const struct wpa_ssid *ssid)
> {
> 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;
>
> ctrl_iface = wpa_s->global->dbus;
> if (ctrl_iface == NULL)
> return;
>
> if (!wpa_s->dbus_groupobj_path) {
> wpa_printf(MSG_DEBUG,
> "%s: Group object '%s' already unregistered",
> __func__, wpa_s->dbus_groupobj_path);
> return;
> }
>
> wpa_printf(MSG_DEBUG, "dbus: Unregister group object '%s'",
> wpa_s->dbus_groupobj_path);
>
> wpa_dbus_unregister_object_per_iface(ctrl_iface,
> wpa_s->dbus_groupobj_path);
>
> os_free(wpa_s->dbus_groupobj_path);
> wpa_s->dbus_groupobj_path = NULL;
> }
>
> static const struct wpa_dbus_property_desc
> wpas_dbus_p2p_groupmember_properties[] = {
> { NULL, NULL, NULL, NULL, NULL }
> };
>
> /**
> * wpas_dbus_register_p2p_groupmember - Register a p2p groupmember
> * object with dbus
> * @wpa_s: wpa_supplicant interface structure
> * @p2p_if_addr: i/f addr of the device joining this group
> *
> * Registers p2p groupmember representing object with dbus
> */
> void wpas_dbus_register_p2p_groupmember(struct wpa_supplicant *wpa_s,
> const u8 *p2p_if_addr)
> {
> struct wpas_dbus_priv *ctrl_iface;
> struct wpa_dbus_object_desc *obj_desc = NULL;
> struct groupmember_handler_args *arg;
> char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
>
> /* Do nothing if the control interface is not turned on */
> if (wpa_s == NULL || wpa_s->global == NULL)
> return;
>
> ctrl_iface = wpa_s->global->dbus;
> if (ctrl_iface == NULL)
> return;
>
> if (!wpa_s->dbus_groupobj_path)
> return;
>
> os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/" COMPACT_MACSTR,
> wpa_s->dbus_groupobj_path, MAC2STR(p2p_if_addr));
>
> obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
> if (!obj_desc) {
> wpa_printf(MSG_ERROR, "Not enough memory "
> "to create object description");
> goto err;
> }
>
> /* allocate memory for handlers arguments */
> arg = os_zalloc(sizeof(struct groupmember_handler_args));
> if (!arg) {
> wpa_printf(MSG_ERROR, "Not enough memory "
> "to create arguments for method");
> goto err;
> }
>
> arg->wpa_s = wpa_s;
> os_memcpy(arg->member_addr, p2p_if_addr, ETH_ALEN);
>
> wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
> wpas_dbus_p2p_groupmember_properties, NULL);
>
> if (wpa_dbus_register_object_per_iface(ctrl_iface, groupmember_obj_path,
> wpa_s->ifname, obj_desc))
> goto err;
>
> wpa_printf(MSG_INFO,
> "dbus: Registered group member object '%s' successfully",
> groupmember_obj_path);
> return;
>
> err:
> free_dbus_object_desc(obj_desc);
> }
>
> /**
> * wpas_dbus_unregister_p2p_groupmember - Unregister a p2p groupmember
> * object with dbus
> * @wpa_s: wpa_supplicant interface structure
> * @p2p_if_addr: i/f addr of the device joining this group
> *
> * Unregisters p2p groupmember representing object with dbus
> */
> void wpas_dbus_unregister_p2p_groupmember(struct wpa_supplicant *wpa_s,
> const u8 *p2p_if_addr)
> {
> struct wpas_dbus_priv *ctrl_iface;
> char groupmember_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
>
> /* Do nothing if the control interface is not turned on */
> if (wpa_s == NULL || wpa_s->global == NULL)
> return;
>
> ctrl_iface = wpa_s->global->dbus;
> if (ctrl_iface == NULL)
> return;
>
> if (!wpa_s->dbus_groupobj_path)
> return;
>
> os_snprintf(groupmember_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_P2P_GROUPMEMBERS_PART "/" COMPACT_MACSTR,
> wpa_s->dbus_groupobj_path, MAC2STR(p2p_if_addr));
>
> wpa_dbus_unregister_object_per_iface(ctrl_iface, groupmember_obj_path);
> }
>
>
> 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
> },
> { NULL, NULL, NULL, NULL, NULL }
> };
>
> /* No signals intended for persistent group objects */
>
> /**
> * wpas_dbus_register_persistent_group - Register a configured(saved)
> * persistent group with dbus
> * @wpa_s: wpa_supplicant interface structure
> * @ssid: persistent group (still represented as a network within wpa)
> * configuration data
> * Returns: 0 on success, -1 on failure
> *
> * Registers a persistent group representing object with dbus.
> */
> int wpas_dbus_register_persistent_group(struct wpa_supplicant *wpa_s,
> struct wpa_ssid *ssid)
> {
> struct wpas_dbus_priv *ctrl_iface;
> struct wpa_dbus_object_desc *obj_desc;
> struct network_handler_args *arg;
> char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
>
> /* Do nothing if the control interface is not turned on */
> if (wpa_s == NULL || wpa_s->global == NULL)
> return 0;
>
> /* Make sure ssid is a persistent group */
> if (ssid->disabled != 2 && !ssid->p2p_persistent_group)
> return -1; /* should we return w/o complaining? */
>
> ctrl_iface = wpa_s->global->dbus;
> if (ctrl_iface == NULL)
> return 0;
>
> /*
> * Intentionally not coming up with different numbering scheme
> * for persistent groups.
> */
> os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
> wpa_s->dbus_new_path, ssid->id);
>
> wpa_printf(MSG_DEBUG, "dbus: Register persistent group object '%s'",
> pgrp_obj_path);
> obj_desc = os_zalloc(sizeof(struct wpa_dbus_object_desc));
> if (!obj_desc) {
> wpa_printf(MSG_ERROR, "dbus: Not enough memory to create "
> "object description");
> goto err;
> }
>
> /*
> * Reusing the same context structure as that for networks
> * since these are represented using same data structure.
> */
> /* allocate memory for handlers arguments */
> arg = os_zalloc(sizeof(struct network_handler_args));
> if (!arg) {
> wpa_printf(MSG_ERROR, "dbus: Not enough memory to create "
> "arguments for method");
> goto err;
> }
>
> arg->wpa_s = wpa_s;
> arg->ssid = ssid;
>
> wpas_dbus_register(obj_desc, arg, wpa_dbus_free, NULL,
> wpas_dbus_persistent_group_properties,
> NULL);
>
> if (wpa_dbus_register_object_per_iface(ctrl_iface, pgrp_obj_path,
> wpa_s->ifname, obj_desc))
> goto err;
>
> wpas_dbus_signal_persistent_group_added(wpa_s, ssid->id);
>
> return 0;
>
> err:
> free_dbus_object_desc(obj_desc);
> return -1;
> }
>
>
> /**
> * wpas_dbus_unregister_persistent_group - Unregister a persistent_group
> * from dbus
> * @wpa_s: wpa_supplicant interface structure
> * @nid: network id
> * Returns: 0 on success, -1 on failure
> *
> * Unregisters persistent group representing object from dbus
> *
> * NOTE: There is a slight issue with the semantics here. While the
> * implementation simply means the persistent group is unloaded from memory,
> * it should not get interpreted as the group is actually being erased/removed
> * from persistent storage as well.
> */
> int wpas_dbus_unregister_persistent_group(struct wpa_supplicant *wpa_s,
> int nid)
> {
> struct wpas_dbus_priv *ctrl_iface;
> char pgrp_obj_path[WPAS_DBUS_OBJECT_PATH_MAX];
> int ret;
>
> /* Do nothing if the control interface is not turned on */
> 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)
> return 0;
>
> os_snprintf(pgrp_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
> "%s/" WPAS_DBUS_NEW_PERSISTENT_GROUPS_PART "/%u",
> wpa_s->dbus_new_path, nid);
>
> wpa_printf(MSG_DEBUG, "dbus: Unregister persistent group object '%s'",
> pgrp_obj_path);
> ret = wpa_dbus_unregister_object_per_iface(ctrl_iface, pgrp_obj_path);
>
> if (!ret)
> wpas_dbus_signal_persistent_group_removed(wpa_s, nid);
>
> return ret;
> }
>
> #endif /* CONFIG_P2P */