D-Bus: Set last_scan_req to MANUAL_SCAN_REQ on Scan() trigger paths
[mech_eap.git] / wpa_supplicant / dbus / dbus_new_handlers_p2p.c
index 32f0a35..e9d60df 100644 (file)
@@ -127,8 +127,7 @@ DBusMessage * wpas_dbus_handler_p2p_find(DBusMessage *message,
                wpa_dbus_dict_entry_clear(&entry);
        }
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        wpas_p2p_find(wpa_s, timeout, type, num_req_dev_types, req_dev_types,
                      NULL, 0, 0, NULL, 0);
@@ -147,10 +146,7 @@ error:
 DBusMessage * wpas_dbus_handler_p2p_stop_find(DBusMessage *message,
                                              struct wpa_supplicant *wpa_s)
 {
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
-
-       wpas_p2p_stop_find(wpa_s);
+       wpas_p2p_stop_find(wpa_s->global->p2p_init_wpa_s);
        return NULL;
 }
 
@@ -168,8 +164,7 @@ DBusMessage * wpas_dbus_handler_p2p_rejectpeer(DBusMessage *message,
        if (parse_peer_object_path(peer_object_path, peer_addr) < 0)
                return wpas_dbus_error_invalid_args(message, NULL);
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        if (wpas_p2p_reject(wpa_s, peer_addr) < 0)
                return wpas_dbus_error_unknown_error(message,
@@ -188,8 +183,7 @@ DBusMessage * wpas_dbus_handler_p2p_listen(DBusMessage *message,
                                   DBUS_TYPE_INVALID))
                return wpas_dbus_error_no_memory(message);
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        if (wpas_p2p_listen(wpa_s, (unsigned int) timeout)) {
                return dbus_message_new_error(message,
@@ -230,8 +224,7 @@ DBusMessage * wpas_dbus_handler_p2p_extendedlisten(
                wpa_dbus_dict_entry_clear(&entry);
        }
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        if (wpas_p2p_ext_listen(wpa_s, period, interval))
                return wpas_dbus_error_unknown_error(
@@ -282,9 +275,6 @@ DBusMessage * wpas_dbus_handler_p2p_presence_request(
                wpa_dbus_dict_entry_clear(&entry);
        }
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
-
        if (wpas_p2p_presence_req(wpa_s, dur1, int1, dur2, int2) < 0)
                return wpas_dbus_error_unknown_error(message,
                                "Failed to invoke presence request.");
@@ -339,8 +329,7 @@ DBusMessage * wpas_dbus_handler_p2p_group_add(DBusMessage *message,
                wpa_dbus_dict_entry_clear(&entry);
        }
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        if (pg_object_path != NULL) {
                char *net_id_str;
@@ -427,6 +416,64 @@ static dbus_bool_t wpa_dbus_p2p_check_enabled(struct wpa_supplicant *wpa_s,
 }
 
 
+DBusMessage * wpas_dbus_handler_p2p_remove_client(DBusMessage *message,
+                                                 struct wpa_supplicant *wpa_s)
+{
+       DBusMessageIter iter_dict;
+       DBusMessage *reply = NULL;
+       DBusMessageIter iter;
+       struct wpa_dbus_dict_entry entry;
+       char *peer_object_path = NULL;
+       char *interface_addr = NULL;
+       u8 peer_addr[ETH_ALEN];
+
+       if (!wpa_dbus_p2p_check_enabled(wpa_s, message, &reply, NULL))
+               return reply;
+
+       dbus_message_iter_init(message, &iter);
+
+       if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL))
+               goto err;
+
+       while (wpa_dbus_dict_has_dict_entry(&iter_dict)) {
+               if (!wpa_dbus_dict_get_entry(&iter_dict, &entry))
+                       goto err;
+
+               if (os_strcmp(entry.key, "peer") == 0 &&
+                   entry.type == DBUS_TYPE_OBJECT_PATH) {
+                       os_free(peer_object_path);
+                       peer_object_path = os_strdup(entry.str_value);
+                       wpa_dbus_dict_entry_clear(&entry);
+               } else if (os_strcmp(entry.key, "iface") == 0 &&
+                          entry.type == DBUS_TYPE_STRING) {
+                       os_free(interface_addr);
+                       interface_addr = os_strdup(entry.str_value);
+                       wpa_dbus_dict_entry_clear(&entry);
+               } else {
+                       wpa_dbus_dict_entry_clear(&entry);
+                       goto err;
+               }
+       }
+
+       if ((!peer_object_path && !interface_addr) ||
+           (peer_object_path &&
+            (parse_peer_object_path(peer_object_path, peer_addr) < 0 ||
+             !p2p_peer_known(wpa_s->global->p2p, peer_addr))) ||
+           (interface_addr && hwaddr_aton(interface_addr, peer_addr) < 0))
+               goto err;
+
+       wpas_p2p_remove_client(wpa_s, peer_addr, interface_addr != NULL);
+       reply = NULL;
+out:
+       os_free(peer_object_path);
+       os_free(interface_addr);
+       return reply;
+err:
+       reply = wpas_dbus_error_invalid_args(message, "Invalid address format");
+       goto out;
+}
+
+
 DBusMessage * wpas_dbus_handler_p2p_flush(DBusMessage *message,
                                          struct wpa_supplicant *wpa_s)
 {
@@ -435,8 +482,7 @@ DBusMessage * wpas_dbus_handler_p2p_flush(DBusMessage *message,
        if (!wpa_dbus_p2p_check_enabled(wpa_s, message, &reply, NULL))
                return reply;
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN);
        wpa_s->force_long_sd = 0;
@@ -532,8 +578,7 @@ DBusMessage * wpas_dbus_handler_p2p_connect(DBusMessage *message,
        if ((!pin || !pin[0]) && wps_method == WPS_PIN_KEYPAD)
                goto inv_args;
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        new_pin = wpas_p2p_connect(wpa_s, addr, pin, wps_method,
                                   persistent_group, 0, join, authorize_only,
@@ -588,6 +633,26 @@ inv_args:
 }
 
 
+/**
+ * wpas_dbus_handler_p2p_cancel - Cancel P2P group formation
+ * @message: Pointer to incoming dbus message
+ * @wpa_s: %wpa_supplicant data structure
+ * Returns: NULL on success or DBus error on failure
+ *
+ * Handler for "Cancel" method call. Returns NULL if P2P cancel succeeds or DBus
+ * error on P2P cancel failure
+ */
+DBusMessage * wpas_dbus_handler_p2p_cancel(DBusMessage *message,
+                                          struct wpa_supplicant *wpa_s)
+{
+       if (wpas_p2p_cancel(wpa_s))
+               return wpas_dbus_error_unknown_error(message,
+                                                    "P2P cancel failed");
+
+       return NULL;
+}
+
+
 DBusMessage * wpas_dbus_handler_p2p_invite(DBusMessage *message,
                                           struct wpa_supplicant *wpa_s)
 {
@@ -635,8 +700,7 @@ DBusMessage * wpas_dbus_handler_p2p_invite(DBusMessage *message,
            !p2p_peer_known(wpa_s->global->p2p, peer_addr))
                goto err;
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        if (persistent) {
                char *net_id_str;
@@ -728,8 +792,7 @@ DBusMessage * wpas_dbus_handler_p2p_prov_disc_req(DBusMessage *message,
            os_strcmp(config_method, "pushbutton"))
                return wpas_dbus_error_invalid_args(message, NULL);
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        if (wpas_p2p_prov_disc(wpa_s, peer_addr, config_method,
                               WPAS_P2P_PD_FOR_GO_NEG, NULL) < 0)
@@ -760,8 +823,7 @@ dbus_bool_t wpas_dbus_getter_p2p_device_config(DBusMessageIter *iter,
        if (!wpa_dbus_p2p_check_enabled(wpa_s, NULL, NULL, error))
                return FALSE;
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
                                              "a{sv}", &variant_iter) ||
@@ -866,8 +928,7 @@ dbus_bool_t wpas_dbus_setter_p2p_device_config(DBusMessageIter *iter,
        if (!wpa_dbus_p2p_check_enabled(wpa_s, NULL, NULL, error))
                return FALSE;
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        dbus_message_iter_recurse(iter, &variant_iter);
        if (!wpa_dbus_dict_open_read(&variant_iter, &iter_dict, error))
@@ -1248,6 +1309,154 @@ dbus_bool_t wpas_dbus_getter_p2p_peer_device_name(DBusMessageIter *iter,
 }
 
 
+dbus_bool_t wpas_dbus_getter_p2p_peer_manufacturer(DBusMessageIter *iter,
+                                                  DBusError *error,
+                                                  void *user_data)
+{
+       struct peer_handler_args *peer_args = user_data;
+       const struct p2p_peer_info *info;
+       char *tmp;
+
+       if (!wpa_dbus_p2p_check_enabled(peer_args->wpa_s, NULL, NULL, error))
+               return FALSE;
+
+       /* get the peer info */
+       info = p2p_get_peer_found(peer_args->wpa_s->global->p2p,
+                                 peer_args->p2p_device_addr, 0);
+       if (info == NULL) {
+               dbus_set_error(error, DBUS_ERROR_FAILED, "failed to find peer");
+               return FALSE;
+       }
+
+       tmp = os_strdup(info->manufacturer);
+       if (!tmp) {
+               dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
+               return FALSE;
+       }
+
+       if (!wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, &tmp,
+                                             error)) {
+               dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
+               os_free(tmp);
+               return FALSE;
+       }
+
+       os_free(tmp);
+       return TRUE;
+}
+
+
+dbus_bool_t wpas_dbus_getter_p2p_peer_modelname(DBusMessageIter *iter,
+                                               DBusError *error,
+                                               void *user_data)
+{
+       struct peer_handler_args *peer_args = user_data;
+       const struct p2p_peer_info *info;
+       char *tmp;
+
+       if (!wpa_dbus_p2p_check_enabled(peer_args->wpa_s, NULL, NULL, error))
+               return FALSE;
+
+       /* get the peer info */
+       info = p2p_get_peer_found(peer_args->wpa_s->global->p2p,
+                                 peer_args->p2p_device_addr, 0);
+       if (info == NULL) {
+               dbus_set_error(error, DBUS_ERROR_FAILED, "failed to find peer");
+               return FALSE;
+       }
+
+       tmp = os_strdup(info->model_name);
+       if (!tmp) {
+               dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
+               return FALSE;
+       }
+
+       if (!wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, &tmp,
+                                             error)) {
+               dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
+               os_free(tmp);
+               return FALSE;
+       }
+
+       os_free(tmp);
+       return TRUE;
+}
+
+
+dbus_bool_t wpas_dbus_getter_p2p_peer_modelnumber(DBusMessageIter *iter,
+                                                 DBusError *error,
+                                                 void *user_data)
+{
+       struct peer_handler_args *peer_args = user_data;
+       const struct p2p_peer_info *info;
+       char *tmp;
+
+       if (!wpa_dbus_p2p_check_enabled(peer_args->wpa_s, NULL, NULL, error))
+               return FALSE;
+
+       /* get the peer info */
+       info = p2p_get_peer_found(peer_args->wpa_s->global->p2p,
+                                 peer_args->p2p_device_addr, 0);
+       if (info == NULL) {
+               dbus_set_error(error, DBUS_ERROR_FAILED, "failed to find peer");
+               return FALSE;
+       }
+
+       tmp = os_strdup(info->model_number);
+       if (!tmp) {
+               dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
+               return FALSE;
+       }
+
+       if (!wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, &tmp,
+                                             error)) {
+               dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
+               os_free(tmp);
+               return FALSE;
+       }
+
+       os_free(tmp);
+       return TRUE;
+}
+
+
+dbus_bool_t wpas_dbus_getter_p2p_peer_serialnumber(DBusMessageIter *iter,
+                                                  DBusError *error,
+                                                  void *user_data)
+{
+       struct peer_handler_args *peer_args = user_data;
+       const struct p2p_peer_info *info;
+       char *tmp;
+
+       if (!wpa_dbus_p2p_check_enabled(peer_args->wpa_s, NULL, NULL, error))
+               return FALSE;
+
+       /* get the peer info */
+       info = p2p_get_peer_found(peer_args->wpa_s->global->p2p,
+                                 peer_args->p2p_device_addr, 0);
+       if (info == NULL) {
+               dbus_set_error(error, DBUS_ERROR_FAILED, "failed to find peer");
+               return FALSE;
+       }
+
+       tmp = os_strdup(info->serial_number);
+       if (!tmp) {
+               dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
+               return FALSE;
+       }
+
+       if (!wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING, &tmp,
+                                             error)) {
+               dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
+               os_free(tmp);
+               return FALSE;
+       }
+
+       os_free(tmp);
+       return TRUE;
+}
+
+
 dbus_bool_t wpas_dbus_getter_p2p_peer_primary_device_type(
        DBusMessageIter *iter, DBusError *error, void *user_data)
 {
@@ -1586,8 +1795,7 @@ dbus_bool_t wpas_dbus_getter_p2p_peer_groups(DBusMessageIter *iter,
        os_memset(&data, 0, sizeof(data));
 
        wpa_s = peer_args->wpa_s;
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        wpa_s_go = wpas_get_p2p_client_iface(wpa_s, info->p2p_device_addr);
        if (wpa_s_go) {
@@ -1644,8 +1852,7 @@ dbus_bool_t wpas_dbus_getter_persistent_groups(DBusMessageIter *iter,
        unsigned int i = 0, num = 0;
        dbus_bool_t success = FALSE;
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
        if (!wpa_s->parent->dbus_new_path)
                return FALSE;
 
@@ -1759,8 +1966,7 @@ DBusMessage * wpas_dbus_handler_add_persistent_group(
 
        dbus_message_iter_init(message, &iter);
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
        if (wpa_s->parent->dbus_new_path)
                ssid = wpa_config_add_network(wpa_s->conf);
        if (ssid == NULL) {
@@ -1842,8 +2048,7 @@ DBusMessage * wpas_dbus_handler_remove_persistent_group(
        dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &op,
                              DBUS_TYPE_INVALID);
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
 
        /*
         * Extract the network ID and ensure the network is actually a child of
@@ -1919,8 +2124,8 @@ DBusMessage * wpas_dbus_handler_remove_all_persistent_groups(
        struct wpa_ssid *ssid, *next;
        struct wpa_config *config;
 
-       if (wpa_s->p2p_dev)
-               wpa_s = wpa_s->p2p_dev;
+       wpa_s = wpa_s->global->p2p_init_wpa_s;
+
        config = wpa_s->conf;
        ssid = config->ssid;
        while (ssid) {