P2P: Handle P2P Device dedicated interface parent removal

In case of a network interface removal, check if the interface
was also the parent interface of the P2P Device dedicated interface.
If this is the case, then stop the P2P Device functionality, and
remove the P2P Device dedicated interface.

In case that the interface is added again and P2P Device
functionality can be enabled again, add a new P2P Device dedicated
interface and allow further P2P Device functionality.

In case that the P2P Device dedicated interface is re-created, the
original P2P Device configuration file is needed, so store it in
the global params (instead in the wpa_interface configuration).

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
This commit is contained in:
Ilan Peer 2015-06-17 16:18:20 +03:00 committed by Jouni Malinen
parent 1ac977bdd5
commit f43c1ae798
5 changed files with 45 additions and 14 deletions

View file

@ -2553,6 +2553,21 @@ wpa_supplicant_event_interface_status(struct wpa_supplicant *wpa_s,
wpa_msg(wpa_s, MSG_INFO, "Failed to initialize the " wpa_msg(wpa_s, MSG_INFO, "Failed to initialize the "
"driver after interface was added"); "driver after interface was added");
} }
#ifdef CONFIG_P2P
if (!wpa_s->global->p2p &&
!wpa_s->global->p2p_disabled &&
!wpa_s->conf->p2p_disabled &&
(wpa_s->drv_flags &
WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) &&
wpas_p2p_add_p2pdev_interface(
wpa_s, wpa_s->global->params.conf_p2p_dev) < 0) {
wpa_printf(MSG_INFO,
"P2P: Failed to enable P2P Device interface");
/* Try to continue without. P2P will be disabled. */
}
#endif /* CONFIG_P2P */
break; break;
case EVENT_INTERFACE_REMOVED: case EVENT_INTERFACE_REMOVED:
wpa_dbg(wpa_s, MSG_DEBUG, "Configured interface was removed"); wpa_dbg(wpa_s, MSG_DEBUG, "Configured interface was removed");
@ -2561,6 +2576,21 @@ wpa_supplicant_event_interface_status(struct wpa_supplicant *wpa_s,
wpa_supplicant_set_state(wpa_s, WPA_INTERFACE_DISABLED); wpa_supplicant_set_state(wpa_s, WPA_INTERFACE_DISABLED);
l2_packet_deinit(wpa_s->l2); l2_packet_deinit(wpa_s->l2);
wpa_s->l2 = NULL; wpa_s->l2 = NULL;
#ifdef CONFIG_P2P
if (wpa_s->global->p2p &&
wpa_s->global->p2p_init_wpa_s->parent == wpa_s &&
(wpa_s->drv_flags &
WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) {
wpa_dbg(wpa_s, MSG_DEBUG,
"Removing P2P Device interface");
wpa_supplicant_remove_iface(
wpa_s->global, wpa_s->global->p2p_init_wpa_s,
0);
wpa_s->global->p2p_init_wpa_s = NULL;
}
#endif /* CONFIG_P2P */
#ifdef CONFIG_TERMINATE_ONLASTIF #ifdef CONFIG_TERMINATE_ONLASTIF
/* check if last interface */ /* check if last interface */
if (!any_interfaces(wpa_s->global->ifaces)) if (!any_interfaces(wpa_s->global->ifaces))

View file

@ -237,7 +237,7 @@ int main(int argc, char *argv[])
goto out; goto out;
#ifdef CONFIG_P2P #ifdef CONFIG_P2P
case 'm': case 'm':
iface->conf_p2p_dev = optarg; params.conf_p2p_dev = optarg;
break; break;
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */
case 'o': case 'o':

View file

@ -3472,7 +3472,6 @@ int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s,
iface.confname = wpa_s->confname; iface.confname = wpa_s->confname;
iface.ctrl_interface = wpa_s->conf->ctrl_interface; iface.ctrl_interface = wpa_s->conf->ctrl_interface;
} }
iface.conf_p2p_dev = NULL;
p2pdev_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface, wpa_s); p2pdev_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface, wpa_s);
if (!p2pdev_wpa_s) { if (!p2pdev_wpa_s) {

View file

@ -4451,7 +4451,8 @@ struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
if (wpa_s->global->p2p == NULL && if (wpa_s->global->p2p == NULL &&
!wpa_s->global->p2p_disabled && !wpa_s->conf->p2p_disabled && !wpa_s->global->p2p_disabled && !wpa_s->conf->p2p_disabled &&
(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) &&
wpas_p2p_add_p2pdev_interface(wpa_s, iface->conf_p2p_dev) < 0) { wpas_p2p_add_p2pdev_interface(
wpa_s, wpa_s->global->params.conf_p2p_dev) < 0) {
wpa_printf(MSG_INFO, wpa_printf(MSG_INFO,
"P2P: Failed to enable P2P Device interface"); "P2P: Failed to enable P2P Device interface");
/* Try to continue without. P2P will be disabled. */ /* Try to continue without. P2P will be disabled. */

View file

@ -66,17 +66,6 @@ struct wpa_interface {
*/ */
const char *confanother; const char *confanother;
#ifdef CONFIG_P2P
/**
* conf_p2p_dev - 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 * ctrl_interface - Control interface parameter
* *
@ -227,6 +216,18 @@ struct wpa_params {
* its internal entropy store over restarts. * its internal entropy store over restarts.
*/ */
char *entropy_file; char *entropy_file;
#ifdef CONFIG_P2P
/**
* conf_p2p_dev - 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 */
}; };
struct p2p_srv_bonjour { struct p2p_srv_bonjour {