Patchwork [v2] wpa_supplicant: Add a configuration file for the P2P_DEVICE parameters

login
register
mail settings
Submitter Ilan Peer
Date Sept. 2, 2013, 12:41 p.m.
Message ID <1378125660-16627-2-git-send-email-ilan.peer@intel.com>
Download mbox | patch
Permalink /patch/271941/
State Accepted
Headers show

Comments

Ilan Peer - Sept. 2, 2013, 12:41 p.m.
Add an option to specify a configuration file that can be
used to hold the P2P_DEVICE configuration parameters. If this option is
not used, the P2P_DEVICE configuration parameters will be read from
interface configuration file.

Note that it is advised to use this option in some cases such as:

1. If a P2P_DEVICE is supported by the driver, the wpa_supplicant creates
   a dedicated P2P Device interface, where the configuration file used for
   the main interface is used. As a consequence, if the configuration file
   includes network definition etc., the wpa_supplicant will try to perform
   station specific flows on the P2P Device interface which will fail.
2. If a P2P_DEVICE is supported by the driver and update_config is used,
   the P2P Device configuration data will override the main interface
   configuration data.

Signed-hostap: Ilan Peer <ilan.peer@intel.com>
---
 wpa_supplicant/README             |    3 ++-
 wpa_supplicant/main.c             |   13 ++++++++++++-
 wpa_supplicant/p2p_supplicant.c   |   15 ++++++++++++++-
 wpa_supplicant/wpa_supplicant.c   |   10 ++++++++++
 wpa_supplicant/wpa_supplicant_i.h |   16 ++++++++++++++++
 5 files changed, 54 insertions(+), 3 deletions(-)
Jouni Malinen - March 6, 2014, 11:20 p.m.
On Mon, Sep 02, 2013 at 03:41:00PM +0300, Ilan Peer wrote:
> Add an option to specify a configuration file that can be
> used to hold the P2P_DEVICE configuration parameters. If this option is
> not used, the P2P_DEVICE configuration parameters will be read from
> interface configuration file.

Thanks, applied. I had hoped to be able to work on a bit different
approach that would not be in any way specific to the P2P Device case,
but it's now obvious that this did not happen and I'm not sure when I
may find time to look at this. I had not understood how the earlier
design worked, but this commit is clearly an improvement over it, so
it's good to get this included regardless of possible changes in the
future for P2P parameter configuration.
Ilan Peer - March 9, 2014, 6:47 a.m.
> -----Original Message-----
> From: hostap-bounces@lists.shmoo.com [mailto:hostap-
> bounces@lists.shmoo.com] On Behalf Of Jouni Malinen
> Sent: Friday, March 07, 2014 01:21
> To: hostap@lists.shmoo.com
> Subject: Re: [PATCH v2] wpa_supplicant: Add a configuration file for the
> P2P_DEVICE parameters
> 
> On Mon, Sep 02, 2013 at 03:41:00PM +0300, Ilan Peer wrote:
> > Add an option to specify a configuration file that can be used to hold
> > the P2P_DEVICE configuration parameters. If this option is not used,
> > the P2P_DEVICE configuration parameters will be read from interface
> > configuration file.
> 
> Thanks, applied. I had hoped to be able to work on a bit different approach
> that would not be in any way specific to the P2P Device case, but it's now
> obvious that this did not happen and I'm not sure when I may find time to
> look at this. I had not understood how the earlier design worked, but this
> commit is clearly an improvement over it, so it's good to get this included
> regardless of possible changes in the future for P2P parameter configuration.
> 

Thanks. Can you share the other approach you wanted to take (with the hope I might be able to help :))?

I think that the main issue would be with devices that support a dedicated P2P_DEVICE interface, which is the case of Intel 7260 series and above. At least for such cases we always used this patch, as things did not work otherwise. 

Regards,

Ilan.
Jouni Malinen - March 14, 2014, 2:24 p.m.
On Sun, Mar 09, 2014 at 06:47:18AM +0000, Peer, Ilan wrote:
> Thanks. Can you share the other approach you wanted to take (with the hope I might be able to help :))?

I was thinking of adding a global configuration file that would allow
all the per-device parameters (like device name and lots of the P2P
management related information) to be configured. This file would be
used for P2P/WPS configuration (among other things) regardless of
whether the new dedicated P2P Device interface is used, so exact same
set of configuration files could be used regardless which driver is used
in the system.
Ilan Peer - March 17, 2014, 7:04 p.m.
> -----Original Message-----
> From: hostap-bounces@lists.shmoo.com [mailto:hostap-
> bounces@lists.shmoo.com] On Behalf Of Jouni Malinen
> Sent: Friday, March 14, 2014 16:24
> To: hostap@lists.shmoo.com
> Subject: Re: [PATCH v2] wpa_supplicant: Add a configuration file for the
> P2P_DEVICE parameters
> 
> On Sun, Mar 09, 2014 at 06:47:18AM +0000, Peer, Ilan wrote:
> > Thanks. Can you share the other approach you wanted to take (with the
> hope I might be able to help :))?
> 
> I was thinking of adding a global configuration file that would allow all the
> per-device parameters (like device name and lots of the P2P management
> related information) to be configured. This file would be used for P2P/WPS
> configuration (among other things) regardless of whether the new dedicated
> P2P Device interface is used, so exact same set of configuration files could be
> used regardless which driver is used in the system.
> 

Thanks. Will try to prepare implement such logic ...

Patch

diff --git a/wpa_supplicant/README b/wpa_supplicant/README
index 78df89e..c215845 100644
--- a/wpa_supplicant/README
+++ b/wpa_supplicant/README
@@ -413,7 +413,7 @@  usage:
         [-G<group>] \
         -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] [-p<driver_param>] \
         [-b<br_ifname> [-N -i<ifname> -c<conf> [-C<ctrl>] [-D<driver>] \
-        [-p<driver_param>] [-b<br_ifname>] ...]
+        [-p<driver_param>] [-b<br_ifname>] [-m<p2p Device config file>] ...
 
 options:
   -b = optional bridge interface name
@@ -438,6 +438,7 @@  options:
   -w = wait for interface to be added, if needed
   -W = wait for a control interface monitor before starting
   -N = start describing new interface
+  -m = Configuration file for the P2P Device
 
 drivers:
   nl80211 = Linux nl80211/cfg80211
diff --git a/wpa_supplicant/main.c b/wpa_supplicant/main.c
index 39b837e..430b68b 100644
--- a/wpa_supplicant/main.c
+++ b/wpa_supplicant/main.c
@@ -35,6 +35,9 @@  static void usage(void)
 	       "        [-N -i<ifname> -c<conf> [-C<ctrl>] "
 	       "[-D<driver>] \\\n"
 	       "        [-p<driver_param>] [-b<br_ifname>] [-I<config file>] "
+#ifdef CONFIG_P2P
+	       "        [-m<P2P Device config file>] "
+#endif
 	       "...]\n"
 	       "\n"
 	       "drivers:\n",
@@ -83,6 +86,9 @@  static void usage(void)
 #endif /* CONFIG_DBUS */
 	printf("  -v = show version\n"
 	       "  -W = wait for a control interface monitor before starting\n"
+#ifdef CONFIG_P2P
+	       "  -m = Configuration file for the P2P Device interface\n"
+#endif /* CONFIG_P2P */
 	       "  -N = start describing new interface\n");
 
 	printf("example:\n"
@@ -160,7 +166,7 @@  int main(int argc, char *argv[])
 
 	for (;;) {
 		c = getopt(argc, argv,
-			   "b:Bc:C:D:de:f:g:G:hi:I:KLNo:O:p:P:qsTtuvW");
+			   "b:Bc:C:D:de:f:g:G:hi:I:KLNo:O:p:P:qsTtuvWm:");
 		if (c < 0)
 			break;
 		switch (c) {
@@ -213,6 +219,11 @@  int main(int argc, char *argv[])
 		case 'I':
 			iface->confanother = optarg;
 			break;
+#ifdef CONFIG_P2P
+		case 'm':
+			iface->conf_p2p_dev = optarg;
+			break;
+#endif /* CONFIG_P2P */
 		case 'K':
 			params.wpa_debug_show_keys++;
 			break;
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index c0e8651..c19109d 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -3145,7 +3145,20 @@  int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s)
 	iface.ifname = wpa_s->pending_interface_name;
 	iface.driver = wpa_s->driver->name;
 	iface.driver_param = wpa_s->conf->driver_param;
-	iface.confname = wpa_s->confname;
+
+	/*
+	 * If a P2P Device configuration file was given, use it as the interface
+	 * configuration file (instead of using parent's configuration file.
+	 */
+	if (wpa_s->conf_p2p_dev) {
+		iface.confname = wpa_s->conf_p2p_dev;
+		iface.ctrl_interface = NULL;
+	} else {
+		iface.confname = wpa_s->confname;
+		iface.ctrl_interface = wpa_s->conf->ctrl_interface;
+	}
+	iface.conf_p2p_dev = NULL;
+
 	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");
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index c274f3c..f388098 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -404,6 +404,11 @@  static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
 	os_free(wpa_s->confanother);
 	wpa_s->confanother = NULL;
 
+#ifdef CONFIG_P2P
+	os_free(wpa_s->conf_p2p_dev);
+	wpa_s->conf_p2p_dev = NULL;
+#endif /* CONFIG_P2P */
+
 	wpa_sm_set_eapol(wpa_s->wpa, NULL);
 	eapol_sm_deinit(wpa_s->eapol);
 	wpa_s->eapol = NULL;
@@ -2826,6 +2831,11 @@  static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
 		wpa_s->confanother = os_rel2abs_path(iface->confanother);
 		wpa_config_read(wpa_s->confanother, wpa_s->conf);
 
+#ifdef CONFIG_P2P
+		wpa_s->conf_p2p_dev = os_rel2abs_path(iface->conf_p2p_dev);
+		wpa_config_read(wpa_s->conf_p2p_dev, wpa_s->conf);
+#endif /* CONFIG_P2P */
+
 		/*
 		 * Override ctrl_interface and driver_param if set on command
 		 * line.
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index d69cd61..f7b21c9 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -63,6 +63,17 @@  struct wpa_interface {
 	 */
 	const char *confanother;
 
+#ifdef CONFIG_P2P
+	/**
+	 * conf_p2p_dev - Additional configuration file used to hold the
+	 * P2P Device configuration parameters.
+	 *
+	 * This can also be %NULL. In such a case, if a P2P Device dedicated
+	 * interfaces is created, the main configuration file will be used.
+	 */
+	const char *conf_p2p_dev;
+#endif /* CONFIG_P2P */
+
 	/**
 	 * ctrl_interface - Control interface parameter
 	 *
@@ -334,6 +345,11 @@  struct wpa_supplicant {
 
 	char *confname;
 	char *confanother;
+
+#ifdef CONFIG_P2P
+	char *conf_p2p_dev;
+#endif /* CONFIG_P2P */
+
 	struct wpa_config *conf;
 	int countermeasures;
 	os_time_t last_michael_mic_error;