wpa_supplicant: Add a configuration file for the P2P_DEVICE parameters
authorIlan Peer <ilan.peer@intel.com>
Mon, 2 Sep 2013 12:41:00 +0000 (15:41 +0300)
committerJouni Malinen <j@w1.fi>
Thu, 6 Mar 2014 22:11:04 +0000 (00:11 +0200)
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:

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.

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
wpa_supplicant/main.c
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/wpa_supplicant.c
wpa_supplicant/wpa_supplicant_i.h

index 7f88cd6..653848e 100644 (file)
@@ -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
index d56935d..d2e839d 100644 (file)
@@ -43,6 +43,9 @@ static void usage(void)
               "        [-o<override driver>] [-O<override ctrl>] \\\n"
               "        [-N -i<ifname> -c<conf> [-C<ctrl>] "
               "[-D<driver>] \\\n"
+#ifdef CONFIG_P2P
+              "        [-m<P2P Device config file>] \\\n"
+#endif /* CONFIG_P2P */
               "        [-p<driver_param>] [-b<br_ifname>] [-I<config file>] "
               "...]\n"
               "\n"
@@ -92,6 +95,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"
@@ -169,7 +175,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:KLm:No:O:p:P:qsTtuvW");
                if (c < 0)
                        break;
                switch (c) {
@@ -229,6 +235,11 @@ int main(int argc, char *argv[])
                        license();
                        exitcode = 0;
                        goto out;
+#ifdef CONFIG_P2P
+               case 'm':
+                       iface->conf_p2p_dev = optarg;
+                       break;
+#endif /* CONFIG_P2P */
                case 'o':
                        params.override_driver = optarg;
                        break;
index b878198..09f98a3 100644 (file)
@@ -3680,7 +3680,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");
index 555210b..561099c 100644 (file)
@@ -397,6 +397,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;
@@ -3382,6 +3387,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.
index 1314734..376a250 100644 (file)
@@ -64,6 +64,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
         *
@@ -386,6 +397,11 @@ struct wpa_supplicant {
 
        char *confname;
        char *confanother;
+
+#ifdef CONFIG_P2P
+       char *conf_p2p_dev;
+#endif /* CONFIG_P2P */
+
        struct wpa_config *conf;
        int countermeasures;
        struct os_reltime last_michael_mic_error;