[PATCH] P2P: Add deinit_p2p_cli op

Eliad Peller eliad
Mon Mar 5 02:39:44 PST 2012


On p2p group removal, the GO is deinitialized correctly
(and the vif mode is set back to sta), but the P2P_CLI
isn't deinitialized, and the vif stays in P2P_CLI mode.

Add a new deinit_p2p_cli op (similar to deinit_ap), which
currently only sets the interface back to sta mode.

Signed-hostap: Eliad Peller <eliad at wizery.com>
intended-for: hostap-1
---
 src/drivers/driver.h            |   11 +++++++++++
 src/drivers/driver_nl80211.c    |    9 +++++++++
 wpa_supplicant/driver_i.h       |    7 +++++++
 wpa_supplicant/p2p_supplicant.c |    5 ++++-
 4 files changed, 31 insertions(+), 1 deletions(-)

diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 04aedcf..f104cd7 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -2003,6 +2003,17 @@ struct wpa_driver_ops {
 	int (*deinit_ap)(void *priv);
 
 	/**
+	 * deinit_ap - Deinitialize P2P_CLI mode
+	 * @priv: Private driver interface data
+	 * Returns: 0 on success, -1 on failure (or if not supported)
+	 *
+	 * This optional function can be used to disable P2P_CLI mode.
+	 * usually, it will most be used to change vif type back to
+	 * station mode.
+	 */
+	int (*deinit_p2p_cli)(void *priv);
+
+	/**
 	 * suspend - Notification on system suspend/hibernate event
 	 * @priv: Private driver interface data
 	 */
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 184b26f..a3c857c 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -8263,6 +8263,14 @@ static int wpa_driver_nl80211_deinit_ap(void *priv)
 	return wpa_driver_nl80211_set_mode(priv, NL80211_IFTYPE_STATION);
 }
 
+static int wpa_driver_nl80211_deinit_p2p_cli(void *priv)
+{
+	struct i802_bss *bss = priv;
+	struct wpa_driver_nl80211_data *drv = bss->drv;
+	if (drv->nlmode != NL80211_IFTYPE_P2P_CLIENT)
+		return -1;
+	return wpa_driver_nl80211_set_mode(priv, NL80211_IFTYPE_STATION);
+}
 
 static void wpa_driver_nl80211_resume(void *priv)
 {
@@ -8989,6 +8997,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
 	wpa_driver_nl80211_cancel_remain_on_channel,
 	.probe_req_report = wpa_driver_nl80211_probe_req_report,
 	.deinit_ap = wpa_driver_nl80211_deinit_ap,
+	.deinit_p2p_cli = wpa_driver_nl80211_deinit_p2p_cli,
 	.resume = wpa_driver_nl80211_resume,
 	.send_ft_action = nl80211_send_ft_action,
 	.signal_monitor = nl80211_signal_monitor,
diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h
index 5b10540..e1e921d 100644
--- a/wpa_supplicant/driver_i.h
+++ b/wpa_supplicant/driver_i.h
@@ -427,6 +427,13 @@ static inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
 	return 0;
 }
 
+static inline int wpa_drv_deinit_p2p_cli(struct wpa_supplicant *wpa_s)
+{
+	if (wpa_s->driver->deinit_p2p_cli)
+		return wpa_s->driver->deinit_p2p_cli(wpa_s->drv_priv);
+	return 0;
+}
+
 static inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
 {
 	if (wpa_s->driver->suspend)
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 486a551..46bb123 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -311,7 +311,10 @@ static void wpas_p2p_group_delete(struct wpa_supplicant *wpa_s)
 		wpa_printf(MSG_DEBUG, "P2P: Temporary group network not "
 			   "found");
 	}
-	wpa_supplicant_ap_deinit(wpa_s);
+	if (wpa_s->ap_iface)
+		wpa_supplicant_ap_deinit(wpa_s);
+	else
+		wpa_drv_deinit_p2p_cli(wpa_s);
 }
 
 
-- 
1.7.6.401.g6a319




More information about the Hostap mailing list