[PATCH 06/20] wpa_s: p2p: create P2P Device interface if supported
Peer, Ilan
ilan.peer
Sun May 19 11:14:12 PDT 2013
> -----Original Message-----
> From: hostap-bounces at lists.shmoo.com [mailto:hostap-
> bounces at lists.shmoo.com] On Behalf Of Arend van Spriel
> Sent: Thursday, May 16, 2013 16:28
> To: Jouni Malinen
> Cc: hostap at 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 at 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 at lists.shmoo.com
> http://lists.shmoo.com/mailman/listinfo/hostap
More information about the Hostap
mailing list