diff --git a/wpa_supplicant/README b/wpa_supplicant/README index 7f88cd659..653848e4c 100644 --- a/wpa_supplicant/README +++ b/wpa_supplicant/README @@ -413,7 +413,7 @@ usage: [-G] \ -i -c [-C] [-D] [-p] \ [-b [-N -i -c [-C] [-D] \ - [-p] [-b] ...] + [-p] [-b] [-m] ... 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 d56935d8c..d2e839dcf 100644 --- a/wpa_supplicant/main.c +++ b/wpa_supplicant/main.c @@ -43,6 +43,9 @@ static void usage(void) " [-o] [-O] \\\n" " [-N -i -c [-C] " "[-D] \\\n" +#ifdef CONFIG_P2P + " [-m] \\\n" +#endif /* CONFIG_P2P */ " [-p] [-b] [-I] " "...]\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; diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index b87819837..09f98a342 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -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"); diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 555210bc6..561099cb9 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -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. diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 13147340a..376a250b3 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -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;