dbus: Add RemoveClient method to remove a client from local GO
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>
This commit is contained in:
parent
f0a79c9403
commit
4e7175827e
4 changed files with 85 additions and 0 deletions
|
@ -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>
|
<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>
|
||||||
|
|
||||||
|
<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>
|
<li>
|
||||||
<h3>Flush ( nothing ) --> nothing</h3>
|
<h3>Flush ( nothing ) --> nothing</h3>
|
||||||
<p>Flush P2P peer table and state.</p>
|
<p>Flush P2P peer table and state.</p>
|
||||||
|
|
|
@ -2734,6 +2734,13 @@ static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
|
||||||
END_ARGS
|
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,
|
{ "Flush", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
|
||||||
(WPADBusMethodHandler) wpas_dbus_handler_p2p_flush,
|
(WPADBusMethodHandler) wpas_dbus_handler_p2p_flush,
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,
|
DBusMessage * wpas_dbus_handler_p2p_flush(DBusMessage *message,
|
||||||
struct wpa_supplicant *wpa_s)
|
struct wpa_supplicant *wpa_s)
|
||||||
{
|
{
|
||||||
|
|
|
@ -56,6 +56,9 @@ DBusMessage *wpas_dbus_handler_p2p_invite(
|
||||||
DBusMessage *wpas_dbus_handler_p2p_disconnect(
|
DBusMessage *wpas_dbus_handler_p2p_disconnect(
|
||||||
DBusMessage *message, struct wpa_supplicant *wpa_s);
|
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 *wpas_dbus_handler_p2p_flush(
|
||||||
DBusMessage *message, struct wpa_supplicant *wpa_s);
|
DBusMessage *message, struct wpa_supplicant *wpa_s);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue