]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: Add RemoveClient method to remove a client from local GO
authorPurushottam Kushwaha <p.kushwaha@samsung.com>
Tue, 16 Jun 2015 11:35:56 +0000 (11:35 +0000)
committerJouni Malinen <j@w1.fi>
Fri, 19 Jun 2015 09:55:54 +0000 (12:55 +0300)
This is equivalent to the P2P_REMOVE_CLIENT command on control
interface. This can be used to remove the specified client [as object
path or string format interface address] from all groups (operating and
persistent) from the local GO.

Argument(s): peer[object path] OR iface[string format MAC address]

Signed-off-by: Purushottam Kushwaha <p.kushwaha@samsung.com>
Signed-off-by: Jijo Jacob <jijo.jacob@samsung.com>
doc/dbus.doxygen
wpa_supplicant/dbus/dbus_new.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.h

index 7355dbb2a27f7d9c4999734091f21dc05be0000f..3a08ad7883ae4ec18220360e987d9336633a6968 100644 (file)
@@ -1118,6 +1118,23 @@ Interface for performing P2P (Wi-Fi Peer-to-Peer) P2P Device operations.
     <p>Reject connection attempt from a peer (specified with a device address). This is a mechanism to reject a pending GO Negotiation with a peer and request to automatically block any further connection or discovery of the peer.</p>
   </li>
 
+  <li>
+    <h3>RemoveClient ( a{sv} : args ) --> nothing</h3>
+    <p>Remove the client from all groups (operating and persistent) from the local GO.</p>
+    <h4>Arguments</h4>
+    <dl>
+      <dt>a{sv} : args</dt>
+      <dd>
+       A dictionary with parameters for removing a client:
+       <table>
+       <tr><th>Key</th><th>Value type</th><th>Description</th><th>Required</th></tr>
+       <tr><td>peer</td><td>o</td><td>Object path for peer's P2P Device Address</td><td>yes</td></tr>
+       <tr><td>iface</td><td>s</td><td>Interface address[MAC Address format] of the peer to be disconnected. Required if object path is not provided.</td><td>no</td></tr>
+       </table>
+      </dd>
+    </dl>
+  </li>
+
   <li>
     <h3>Flush ( nothing ) --> nothing</h3>
     <p>Flush P2P peer table and state.</p>
index 9125665c43a3123619d1f12adc1b92d91bea37ca..a3bf1e3d22f541180a141a836efd22172312ac64 100644 (file)
@@ -2734,6 +2734,13 @@ static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
                  END_ARGS
          }
        },
+       { "RemoveClient", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
+         (WPADBusMethodHandler) wpas_dbus_handler_p2p_remove_client,
+         {
+                 { "args", "a{sv}", ARG_IN },
+                 END_ARGS
+         }
+       },
        { "Flush", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
          (WPADBusMethodHandler) wpas_dbus_handler_p2p_flush,
          {
index 56e90334c25d87b8aae8d7c7736d5e7c19f2eb51..e9d60df2c1095c8f9542bceba3acfe630c0e3e81 100644 (file)
@@ -416,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)
 {
index d0953f18100d7224d08284b66a5dd6f18485445f..2aecbbe465070e97f4dc1e5efe3122565d1d83fa 100644 (file)
@@ -56,6 +56,9 @@ DBusMessage *wpas_dbus_handler_p2p_invite(
 DBusMessage *wpas_dbus_handler_p2p_disconnect(
        DBusMessage *message, struct wpa_supplicant *wpa_s);
 
+DBusMessage * wpas_dbus_handler_p2p_remove_client(
+       DBusMessage *message, struct wpa_supplicant *wpa_s);
+
 DBusMessage *wpas_dbus_handler_p2p_flush(
        DBusMessage *message, struct wpa_supplicant *wpa_s);