Patchwork [06/20] wpa_s: p2p: create P2P Device interface if supported

login
register
mail settings
Submitter Arend van Spriel
Date May 16, 2013, 1:28 p.m.
Message ID <1368710915-32176-7-git-send-email-arend@broadcom.com>
Download mbox | patch
Permalink /patch/244319/
State Changes Requested
Headers show

Comments

Arend van Spriel - May 16, 2013, 1:28 p.m.
If the capability flag of the driver indicates a dedicated
P2P Device is supported, a P2P Device interface is created
in wpas_p2p_init().

Signed-hostap: Arend van Spriel <arend@broadcom.com>
---
 wpa_supplicant/p2p_supplicant.c   |   34 ++++++++++++++++++++++++++++++++++
 wpa_supplicant/p2p_supplicant.h   |    1 +
 wpa_supplicant/wpa_supplicant.c   |    8 +++++++-
 wpa_supplicant/wpa_supplicant_i.h |    7 +++++++
 4 files changed, 49 insertions(+), 1 deletion(-)
Ilan Peer - May 19, 2013, 6:14 p.m.
> -----Original Message-----
> From: hostap-bounces@lists.shmoo.com [mailto:hostap-
> bounces@lists.shmoo.com] On Behalf Of Arend van Spriel
> Sent: Thursday, May 16, 2013 16:28
> To: Jouni Malinen
> Cc: hostap@lists.shmoo.com
> Subject: [PATCH 06/20] wpa_s: p2p: create P2P Device interface if supported
> 
> If the capability flag of the driver indicates a dedicated P2P Device is
> supported, a P2P Device interface is created in wpas_p2p_init().
> 
> Signed-hostap: Arend van Spriel <arend@broadcom.com>
> ---
>  wpa_supplicant/p2p_supplicant.c   |   34
> ++++++++++++++++++++++++++++++++++
>  wpa_supplicant/p2p_supplicant.h   |    1 +
>  wpa_supplicant/wpa_supplicant.c   |    8 +++++++-
>  wpa_supplicant/wpa_supplicant_i.h |    7 +++++++
>  4 files changed, 49 insertions(+), 1 deletion(-)
> 
> diff --git a/wpa_supplicant/p2p_supplicant.c
> b/wpa_supplicant/p2p_supplicant.c index 37aa314..d87f824 100644
> --- a/wpa_supplicant/p2p_supplicant.c
> +++ b/wpa_supplicant/p2p_supplicant.c
> @@ -2921,6 +2921,40 @@ static int wpas_go_connected(void *ctx, const u8
> *dev_addr)
>  	return 0;
>  }
> 
> +int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s) {
> +	struct wpa_interface iface;
> +	struct wpa_supplicant *p2pdev_wpa_s;
> +	char ifname[100];
> +	char force_name[100];
> +	int ret;
> +
> +	os_snprintf(ifname, sizeof(ifname), "p2p-dev-%s", wpa_s->ifname);
> +	force_name[0] = '\0';
> +	wpa_s->pending_interface_type = WPA_IF_P2P_DEVICE;
> +	ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, ifname, NULL,
> NULL,
> +			     force_name, wpa_s->pending_interface_addr,
> NULL);
> +	if (ret < 0) {
> +		wpa_printf(MSG_DEBUG, "P2P: failed to create P2P Device
> interface");
> +		return ret;
> +	}
> +	os_strlcpy(wpa_s->pending_interface_name, ifname,
> +		   sizeof(wpa_s->pending_interface_name));
> +	os_memset(&iface, 0, sizeof(iface));
> +	iface.p2p_mgmt = 1;
> +	iface.ifname = wpa_s->pending_interface_name;
> +	iface.driver = wpa_s->driver->name;
> +	iface.ctrl_interface = wpa_s->conf->ctrl_interface;
> +	iface.driver_param = wpa_s->conf->driver_param;
> +	p2pdev_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
> +	if (!p2pdev_wpa_s) {
> +		wpa_printf(MSG_DEBUG, "P2P: failed to add P2P Device
> interface");
> +		return -1;
> +	}
> +
> +	wpa_s->pending_interface_name[0] = '\0';
> +	return 0;
> +}
> 
>  /**
>   * wpas_p2p_init - Initialize P2P module for %wpa_supplicant diff --git
> a/wpa_supplicant/p2p_supplicant.h b/wpa_supplicant/p2p_supplicant.h index
> 0a7212c..2157cae 100644
> --- a/wpa_supplicant/p2p_supplicant.h
> +++ b/wpa_supplicant/p2p_supplicant.h
> @@ -18,6 +18,7 @@ struct p2p_channels;
>  int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s);
> void wpas_p2p_deinit(struct wpa_supplicant *wpa_s);  void
> wpas_p2p_deinit_global(struct wpa_global *global);
> +int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s);
>  int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
>  		     const char *pin, enum p2p_wps_method wps_method,
>  		     int persistent_group, int auto_join, int join, diff --git
> a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index
> 2d05247..7c3b180 100644
> --- a/wpa_supplicant/wpa_supplicant.c
> +++ b/wpa_supplicant/wpa_supplicant.c
> @@ -2996,7 +2996,13 @@ next_driver:
>  	}
> 
>  #ifdef CONFIG_P2P
> -	if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
> +	if (iface->p2p_mgmt == 0 && wpa_s->global->p2p == NULL &&
> +	    (wpa_s->drv_flags &
> WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) {
> +		if (wpas_p2p_add_p2pdev_interface(wpa_s) < 0) {
> +			wpa_msg(wpa_s, MSG_ERROR, "Failed to create P2P
> Device");
> +			return -1;
> +		}

I might be missing something here, but in this flow, where is wpas_p2p_init()called?

> +	} else if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
>  		wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
>  		return -1;
>  	}
> diff --git a/wpa_supplicant/wpa_supplicant_i.h
> b/wpa_supplicant/wpa_supplicant_i.h
> index 7559a75..02e4bc6 100644
> --- a/wpa_supplicant/wpa_supplicant_i.h
> +++ b/wpa_supplicant/wpa_supplicant_i.h
> @@ -104,6 +104,13 @@ struct wpa_interface {
>  	 * receiving of EAPOL frames from an additional interface.
>  	 */
>  	const char *bridge_ifname;
> +
> +	/**
> +	 * p2p_mgmt - interface used for P2P management
> +	 *
> +	 * Indicates whether wpas_p2p_init() must be called for this interface.
> +	 */
> +	int p2p_mgmt;
>  };
> 
>  /**
> --
> 1.7.10.4
> 
> 
> _______________________________________________
> HostAP mailing list
> HostAP@lists.shmoo.com
> http://lists.shmoo.com/mailman/listinfo/hostap
Arend van Spriel - May 19, 2013, 9:16 p.m.
On 05/19/2013 08:14 PM, Peer, Ilan wrote:
>
>
>> -----Original Message-----
>> From: hostap-bounces@lists.shmoo.com [mailto:hostap-
>> bounces@lists.shmoo.com] On Behalf Of Arend van Spriel
>> Sent: Thursday, May 16, 2013 16:28
>> To: Jouni Malinen
>> Cc: hostap@lists.shmoo.com
>> Subject: [PATCH 06/20] wpa_s: p2p: create P2P Device interface if supported
>>
>> If the capability flag of the driver indicates a dedicated P2P Device is
>> supported, a P2P Device interface is created in wpas_p2p_init().
>>
>> Signed-hostap: Arend van Spriel <arend@broadcom.com>
>> ---
>>   wpa_supplicant/p2p_supplicant.c   |   34
>> ++++++++++++++++++++++++++++++++++
>>   wpa_supplicant/p2p_supplicant.h   |    1 +
>>   wpa_supplicant/wpa_supplicant.c   |    8 +++++++-
>>   wpa_supplicant/wpa_supplicant_i.h |    7 +++++++
>>   4 files changed, 49 insertions(+), 1 deletion(-)
>>
>> diff --git a/wpa_supplicant/p2p_supplicant.c
>> b/wpa_supplicant/p2p_supplicant.c index 37aa314..d87f824 100644
>> --- a/wpa_supplicant/p2p_supplicant.c
>> +++ b/wpa_supplicant/p2p_supplicant.c
>> @@ -2921,6 +2921,40 @@ static int wpas_go_connected(void *ctx, const u8
>> *dev_addr)
>>   	return 0;
>>   }
>>
>> +int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s) {
>> +	struct wpa_interface iface;
>> +	struct wpa_supplicant *p2pdev_wpa_s;
>> +	char ifname[100];
>> +	char force_name[100];
>> +	int ret;
>> +
>> +	os_snprintf(ifname, sizeof(ifname), "p2p-dev-%s", wpa_s->ifname);
>> +	force_name[0] = '\0';
>> +	wpa_s->pending_interface_type = WPA_IF_P2P_DEVICE;
>> +	ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, ifname, NULL,
>> NULL,
>> +			     force_name, wpa_s->pending_interface_addr,
>> NULL);
>> +	if (ret < 0) {
>> +		wpa_printf(MSG_DEBUG, "P2P: failed to create P2P Device
>> interface");
>> +		return ret;
>> +	}
>> +	os_strlcpy(wpa_s->pending_interface_name, ifname,
>> +		   sizeof(wpa_s->pending_interface_name));
>> +	os_memset(&iface, 0, sizeof(iface));
>> +	iface.p2p_mgmt = 1;
>> +	iface.ifname = wpa_s->pending_interface_name;
>> +	iface.driver = wpa_s->driver->name;
>> +	iface.ctrl_interface = wpa_s->conf->ctrl_interface;
>> +	iface.driver_param = wpa_s->conf->driver_param;
>> +	p2pdev_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
>> +	if (!p2pdev_wpa_s) {
>> +		wpa_printf(MSG_DEBUG, "P2P: failed to add P2P Device
>> interface");
>> +		return -1;
>> +	}
>> +
>> +	wpa_s->pending_interface_name[0] = '\0';
>> +	return 0;
>> +}
>>
>>   /**
>>    * wpas_p2p_init - Initialize P2P module for %wpa_supplicant diff --git
>> a/wpa_supplicant/p2p_supplicant.h b/wpa_supplicant/p2p_supplicant.h index
>> 0a7212c..2157cae 100644
>> --- a/wpa_supplicant/p2p_supplicant.h
>> +++ b/wpa_supplicant/p2p_supplicant.h
>> @@ -18,6 +18,7 @@ struct p2p_channels;
>>   int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s);
>> void wpas_p2p_deinit(struct wpa_supplicant *wpa_s);  void
>> wpas_p2p_deinit_global(struct wpa_global *global);
>> +int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s);
>>   int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
>>   		     const char *pin, enum p2p_wps_method wps_method,
>>   		     int persistent_group, int auto_join, int join, diff --git
>> a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index
>> 2d05247..7c3b180 100644
>> --- a/wpa_supplicant/wpa_supplicant.c
>> +++ b/wpa_supplicant/wpa_supplicant.c
>> @@ -2996,7 +2996,13 @@ next_driver:
>>   	}
>>
>>   #ifdef CONFIG_P2P
>> -	if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
>> +	if (iface->p2p_mgmt == 0 && wpa_s->global->p2p == NULL &&
>> +	    (wpa_s->drv_flags &
>> WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) {
>> +		if (wpas_p2p_add_p2pdev_interface(wpa_s) < 0) {
>> +			wpa_msg(wpa_s, MSG_ERROR, "Failed to create P2P
>> Device");
>> +			return -1;
>> +		}
>
> I might be missing something here, but in this flow, where is wpas_p2p_init()called?

wpas_p2p_add_p2pdev_interface() does a wpa_supplicant_add_iface() with 
iface->p2p_mgmt set to 1. So wpas_p2p_init() is only called for the P2P 
Device wpa_s or for the first interface specified on the command line in 
case driver does not support P2P_DEVICE.

>> +	} else if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
>>   		wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
>>   		return -1;
>>   	}
>> diff --git a/wpa_supplicant/wpa_supplicant_i.h
>> b/wpa_supplicant/wpa_supplicant_i.h
>> index 7559a75..02e4bc6 100644
>> --- a/wpa_supplicant/wpa_supplicant_i.h
>> +++ b/wpa_supplicant/wpa_supplicant_i.h
>> @@ -104,6 +104,13 @@ struct wpa_interface {
>>   	 * receiving of EAPOL frames from an additional interface.
>>   	 */
>>   	const char *bridge_ifname;
>> +
>> +	/**
>> +	 * p2p_mgmt - interface used for P2P management
>> +	 *
>> +	 * Indicates whether wpas_p2p_init() must be called for this interface.
>> +	 */
>> +	int p2p_mgmt;
>>   };
>>
>>   /**
>> --
>> 1.7.10.4
>>
>>
>> _______________________________________________
>> HostAP mailing list
>> HostAP@lists.shmoo.com
>> http://lists.shmoo.com/mailman/listinfo/hostap
>

Patch

diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 37aa314..d87f824 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -2921,6 +2921,40 @@  static int wpas_go_connected(void *ctx, const u8 *dev_addr)
 	return 0;
 }
 
+int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s)
+{
+	struct wpa_interface iface;
+	struct wpa_supplicant *p2pdev_wpa_s;
+	char ifname[100];
+	char force_name[100];
+	int ret;
+
+	os_snprintf(ifname, sizeof(ifname), "p2p-dev-%s", wpa_s->ifname);
+	force_name[0] = '\0';
+	wpa_s->pending_interface_type = WPA_IF_P2P_DEVICE;
+	ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, ifname, NULL, NULL,
+			     force_name, wpa_s->pending_interface_addr, NULL);
+	if (ret < 0) {
+		wpa_printf(MSG_DEBUG, "P2P: failed to create P2P Device interface");
+		return ret;
+	}
+	os_strlcpy(wpa_s->pending_interface_name, ifname,
+		   sizeof(wpa_s->pending_interface_name));
+	os_memset(&iface, 0, sizeof(iface));
+	iface.p2p_mgmt = 1;
+	iface.ifname = wpa_s->pending_interface_name;
+	iface.driver = wpa_s->driver->name;
+	iface.ctrl_interface = wpa_s->conf->ctrl_interface;
+	iface.driver_param = wpa_s->conf->driver_param;
+	p2pdev_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
+	if (!p2pdev_wpa_s) {
+		wpa_printf(MSG_DEBUG, "P2P: failed to add P2P Device interface");
+		return -1;
+	}
+
+	wpa_s->pending_interface_name[0] = '\0';
+	return 0;
+}
 
 /**
  * wpas_p2p_init - Initialize P2P module for %wpa_supplicant
diff --git a/wpa_supplicant/p2p_supplicant.h b/wpa_supplicant/p2p_supplicant.h
index 0a7212c..2157cae 100644
--- a/wpa_supplicant/p2p_supplicant.h
+++ b/wpa_supplicant/p2p_supplicant.h
@@ -18,6 +18,7 @@  struct p2p_channels;
 int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s);
 void wpas_p2p_deinit(struct wpa_supplicant *wpa_s);
 void wpas_p2p_deinit_global(struct wpa_global *global);
+int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s);
 int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
 		     const char *pin, enum p2p_wps_method wps_method,
 		     int persistent_group, int auto_join, int join,
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 2d05247..7c3b180 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -2996,7 +2996,13 @@  next_driver:
 	}
 
 #ifdef CONFIG_P2P
-	if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
+	if (iface->p2p_mgmt == 0 && wpa_s->global->p2p == NULL &&
+	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) {
+		if (wpas_p2p_add_p2pdev_interface(wpa_s) < 0) {
+			wpa_msg(wpa_s, MSG_ERROR, "Failed to create P2P Device");
+			return -1;
+		}
+	} else if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
 		wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
 		return -1;
 	}
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index 7559a75..02e4bc6 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -104,6 +104,13 @@  struct wpa_interface {
 	 * receiving of EAPOL frames from an additional interface.
 	 */
 	const char *bridge_ifname;
+
+	/**
+	 * p2p_mgmt - interface used for P2P management
+	 *
+	 * Indicates whether wpas_p2p_init() must be called for this interface.
+	 */
+	int p2p_mgmt;
 };
 
 /**