Browse Source

P2P: Add wpas_p2p_disconnect()

Add a new API function wpas_p2p_disconnect()
to disconnect from or dissolve a group.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Johannes Berg 14 years ago
parent
commit
3103f34576
2 changed files with 27 additions and 9 deletions
  1. 26 9
      wpa_supplicant/p2p_supplicant.c
  2. 1 0
      wpa_supplicant/p2p_supplicant.h

+ 26 - 9
wpa_supplicant/p2p_supplicant.c

@@ -3034,8 +3034,7 @@ int wpas_p2p_group_remove(struct wpa_supplicant *wpa_s, const char *ifname)
 		while (wpa_s) {
 			prev = wpa_s;
 			wpa_s = wpa_s->next;
-			prev->removal_reason = P2P_GROUP_REMOVAL_REQUESTED;
-			wpas_p2p_group_delete(prev);
+			wpas_p2p_disconnect(prev);
 		}
 		return 0;
 	}
@@ -3045,13 +3044,7 @@ int wpas_p2p_group_remove(struct wpa_supplicant *wpa_s, const char *ifname)
 			break;
 	}
 
-	if (wpa_s == NULL)
-		return -1;
-
-	wpa_s->removal_reason = P2P_GROUP_REMOVAL_REQUESTED;
-	wpas_p2p_group_delete(wpa_s);
-
-	return 0;
+	return wpas_p2p_disconnect(wpa_s);
 }
 
 
@@ -4156,3 +4149,27 @@ int wpas_p2p_unauthorize(struct wpa_supplicant *wpa_s, const char *addr)
 
 	return p2p_unauthorize(p2p, peer);
 }
+
+
+/**
+ * wpas_p2p_disconnect - Disconnect from a P2P Group
+ * @wpa_s: Pointer to wpa_supplicant data
+ * Returns: 0 on success, -1 on failure
+ *
+ * This can be used to disconnect from a group in which the local end is a P2P
+ * Client or to end a P2P Group in case the local end is the Group Owner. If a
+ * virtual network interface was created for this group, that interface will be
+ * removed. Otherwise, only the configured P2P group network will be removed
+ * from the interface.
+ */
+int wpas_p2p_disconnect(struct wpa_supplicant *wpa_s)
+{
+
+	if (wpa_s == NULL)
+		return -1;
+
+	wpa_s->removal_reason = P2P_GROUP_REMOVAL_REQUESTED;
+	wpas_p2p_group_delete(wpa_s);
+
+	return 0;
+}

+ 1 - 0
wpa_supplicant/p2p_supplicant.h

@@ -121,5 +121,6 @@ void wpas_p2p_interface_unavailable(struct wpa_supplicant *wpa_s);
 void wpas_p2p_update_best_channels(struct wpa_supplicant *wpa_s,
 				   int freq_24, int freq_5, int freq_overall);
 int wpas_p2p_unauthorize(struct wpa_supplicant *wpa_s, const char *addr);
+int wpas_p2p_disconnect(struct wpa_supplicant *wpa_s);
 
 #endif /* P2P_SUPPLICANT_H */