wpa_supplicant / hostapd  2.5
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Data Structures | Macros | Enumerations | Functions
p2p_supplicant.c File Reference

wpa_supplicant - P2P Copyright (c) 2010-2014, Jouni Malinen j@w1..nosp@m.fi More...

#include "includes.h"
#include "common.h"
#include "eloop.h"
#include "common/ieee802_11_common.h"
#include "common/ieee802_11_defs.h"
#include "common/wpa_ctrl.h"
#include "wps/wps_i.h"
#include "p2p/p2p.h"
#include "ap/hostapd.h"
#include "ap/ap_config.h"
#include "ap/sta_info.h"
#include "ap/ap_drv_ops.h"
#include "ap/wps_hostapd.h"
#include "ap/p2p_hostapd.h"
#include "ap/dfs.h"
#include "eapol_supp/eapol_supp_sm.h"
#include "rsn_supp/wpa.h"
#include "wpa_supplicant_i.h"
#include "driver_i.h"
#include "ap.h"
#include "config_ssid.h"
#include "config.h"
#include "notify.h"
#include "scan.h"
#include "bss.h"
#include "offchannel.h"
#include "wps_supplicant.h"
#include "p2p_supplicant.h"
#include "wifi_display.h"

Data Structures

struct  send_action_work
 
struct  wpas_p2p_listen_work
 
struct  p2p_oper_class_map
 

Macros

#define P2P_MAX_JOIN_SCAN_ATTEMPTS   10
 
#define P2P_AUTO_PD_SCAN_ATTEMPTS   5
 
#define P2P_GO_FREQ_CHANGE_TIME   5
 Defines time interval in seconds when a GO needs to evacuate a frequency that it is currently using, but is no longer valid for P2P use cases.
 
#define P2P_MAX_CLIENT_IDLE   10
 
#define P2P_MAX_INITIAL_CONN_WAIT   10
 
#define P2P_MAX_INITIAL_CONN_WAIT_GO   10
 
#define P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE   15
 
#define P2P_MGMT_DEVICE_PREFIX   "p2p-dev-"
 
#define P2P_RECONSIDER_GO_MOVE_DELAY   30
 
#define C(n)   if (s->n) d->n = os_strdup(s->n)
 

Enumerations

enum  p2p_group_removal_reason {
  P2P_GROUP_REMOVAL_UNKNOWN, P2P_GROUP_REMOVAL_SILENT, P2P_GROUP_REMOVAL_FORMATION_FAILED, P2P_GROUP_REMOVAL_REQUESTED,
  P2P_GROUP_REMOVAL_IDLE_TIMEOUT, P2P_GROUP_REMOVAL_UNAVAILABLE, P2P_GROUP_REMOVAL_GO_ENDING_SESSION, P2P_GROUP_REMOVAL_PSK_FAILURE,
  P2P_GROUP_REMOVAL_FREQ_CONFLICT, P2P_GROUP_REMOVAL_GO_LEAVE_CHANNEL
}
 
enum  chan_allowed { NOT_ALLOWED, NO_IR, ALLOWED }
 

Functions

void wpas_p2p_ap_setup_failed (struct wpa_supplicant *wpa_s)
 
int wpas_p2p_get_ht40_mode (struct wpa_supplicant *wpa_s, struct hostapd_hw_modes *mode, u8 channel)
 
int wpas_p2p_get_vht80_center (struct wpa_supplicant *wpa_s, struct hostapd_hw_modes *mode, u8 channel)
 
struct wpa_supplicantwpas_get_p2p_go_iface (struct wpa_supplicant *wpa_s, const u8 *ssid, size_t ssid_len)
 
struct wpa_supplicantwpas_get_p2p_client_iface (struct wpa_supplicant *wpa_s, const u8 *peer_dev_addr)
 
int wpas_p2p_add_p2pdev_interface (struct wpa_supplicant *wpa_s, const char *conf_p2p_dev)
 
int wpas_p2p_init (struct wpa_global *global, struct wpa_supplicant *wpa_s)
 Initialize P2P module for wpa_supplicant. More...
 
void wpas_p2p_deinit (struct wpa_supplicant *wpa_s)
 Deinitialize per-interface P2P data. More...
 
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, int auth, int go_intent, int freq, int persistent_id, int pd, int ht40, int vht)
 Request P2P Group Formation to be started. More...
 
void wpas_p2p_remain_on_channel_cb (struct wpa_supplicant *wpa_s, unsigned int freq, unsigned int duration)
 Indication of remain-on-channel start. More...
 
int wpas_p2p_listen_start (struct wpa_supplicant *wpa_s, unsigned int timeout)
 
void wpas_p2p_cancel_remain_on_channel_cb (struct wpa_supplicant *wpa_s, unsigned int freq)
 Remain-on-channel timeout. More...
 
int wpas_p2p_group_remove (struct wpa_supplicant *wpa_s, const char *ifname)
 Remove a P2P group. More...
 
int wpas_p2p_group_add (struct wpa_supplicant *wpa_s, int persistent_group, int freq, int ht40, int vht)
 Add a new P2P group with local end as Group Owner. More...
 
int wpas_p2p_group_add_persistent (struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, int addr_allocated, int force_freq, int neg_freq, int ht40, int vht, const struct p2p_channels *channels, int connection_timeout, int force_scan)
 
struct p2p_groupwpas_p2p_group_init (struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
 
void wpas_p2p_wps_success (struct wpa_supplicant *wpa_s, const u8 *peer_addr, int registrar)
 
void wpas_p2p_wps_failed (struct wpa_supplicant *wpa_s, struct wps_event_fail *fail)
 
int wpas_p2p_wps_eapol_cb (struct wpa_supplicant *wpa_s)
 
int wpas_p2p_prov_disc (struct wpa_supplicant *wpa_s, const u8 *peer_addr, const char *config_method, enum wpas_p2p_prov_disc_use use, struct p2ps_provision *p2ps_prov)
 
int wpas_p2p_scan_result_text (const u8 *ies, size_t ies_len, char *buf, char *end)
 
int wpas_p2p_find (struct wpa_supplicant *wpa_s, unsigned int timeout, enum p2p_discovery_type type, unsigned int num_req_dev_types, const u8 *req_dev_types, const u8 *dev_id, unsigned int search_delay, u8 seek_cnt, const char **seek_string, int freq)
 
void wpas_p2p_stop_find (struct wpa_supplicant *wpa_s)
 
int wpas_p2p_listen (struct wpa_supplicant *wpa_s, unsigned int timeout)
 
int wpas_p2p_assoc_req_ie (struct wpa_supplicant *wpa_s, struct wpa_bss *bss, u8 *buf, size_t len, int p2p_group)
 
int wpas_p2p_probe_req_rx (struct wpa_supplicant *wpa_s, const u8 *addr, const u8 *dst, const u8 *bssid, const u8 *ie, size_t ie_len, unsigned int rx_freq, int ssi_signal)
 
void wpas_p2p_rx_action (struct wpa_supplicant *wpa_s, const u8 *da, const u8 *sa, const u8 *bssid, u8 category, const u8 *data, size_t len, int freq)
 
void wpas_p2p_scan_ie (struct wpa_supplicant *wpa_s, struct wpabuf *ies)
 
int wpas_p2p_reject (struct wpa_supplicant *wpa_s, const u8 *addr)
 
int wpas_p2p_invite (struct wpa_supplicant *wpa_s, const u8 *peer_addr, struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq, int ht40, int vht, int pref_freq)
 
int wpas_p2p_invite_group (struct wpa_supplicant *wpa_s, const char *ifname, const u8 *peer_addr, const u8 *go_dev_addr)
 
void wpas_p2p_completed (struct wpa_supplicant *wpa_s)
 
int wpas_p2p_presence_req (struct wpa_supplicant *wpa_s, u32 duration1, u32 interval1, u32 duration2, u32 interval2)
 
int wpas_p2p_ext_listen (struct wpa_supplicant *wpa_s, unsigned int period, unsigned int interval)
 
int wpas_p2p_deauth_notif (struct wpa_supplicant *wpa_s, const u8 *bssid, u16 reason_code, const u8 *ie, size_t ie_len, int locally_generated)
 
void wpas_p2p_disassoc_notif (struct wpa_supplicant *wpa_s, const u8 *bssid, u16 reason_code, const u8 *ie, size_t ie_len, int locally_generated)
 
void wpas_p2p_update_config (struct wpa_supplicant *wpa_s)
 
int wpas_p2p_set_noa (struct wpa_supplicant *wpa_s, u8 count, int start, int duration)
 
int wpas_p2p_set_cross_connect (struct wpa_supplicant *wpa_s, int enabled)
 
void wpas_p2p_notif_connected (struct wpa_supplicant *wpa_s)
 
void wpas_p2p_notif_disconnected (struct wpa_supplicant *wpa_s)
 
int wpas_p2p_notif_pbc_overlap (struct wpa_supplicant *wpa_s)
 
void wpas_p2p_pbc_overlap_cb (void *eloop_ctx, void *timeout_ctx)
 
void wpas_p2p_update_channel_list (struct wpa_supplicant *wpa_s, enum wpas_p2p_channel_update_trig trig)
 
int wpas_p2p_cancel (struct wpa_supplicant *wpa_s)
 
void wpas_p2p_interface_unavailable (struct wpa_supplicant *wpa_s)
 
void wpas_p2p_update_best_channels (struct wpa_supplicant *wpa_s, int freq_24, int freq_5, int freq_overall)
 
int wpas_p2p_unauthorize (struct wpa_supplicant *wpa_s, const char *addr)
 
int wpas_p2p_disconnect (struct wpa_supplicant *wpa_s)
 Disconnect from a P2P Group. More...
 
int wpas_p2p_in_progress (struct wpa_supplicant *wpa_s)
 
void wpas_p2p_network_removed (struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
 
struct wpa_ssidwpas_p2p_get_persistent (struct wpa_supplicant *wpa_s, const u8 *addr, const u8 *ssid, size_t ssid_len)
 
void wpas_p2p_notify_ap_sta_authorized (struct wpa_supplicant *wpa_s, const u8 *addr)
 
int wpas_p2p_scan_no_go_seen (struct wpa_supplicant *wpa_s)
 
unsigned int wpas_p2p_search_delay (struct wpa_supplicant *wpa_s)
 
void wpas_p2p_new_psk_cb (struct wpa_supplicant *wpa_s, const u8 *mac_addr, const u8 *p2p_dev_addr, const u8 *psk, size_t psk_len)
 
void wpas_p2p_remove_client (struct wpa_supplicant *wpa_s, const u8 *peer, int iface_addr)
 
int wpas_p2p_handle_frequency_conflicts (struct wpa_supplicant *wpa_s, int freq, struct wpa_ssid *ssid)
 
int wpas_p2p_4way_hs_failed (struct wpa_supplicant *wpa_s)
 
void wpas_p2p_indicate_state_change (struct wpa_supplicant *wpa_s)
 
void wpas_p2p_deinit_iface (struct wpa_supplicant *wpa_s)
 
void wpas_p2p_ap_deinit (struct wpa_supplicant *wpa_s)
 

Detailed Description

wpa_supplicant - P2P Copyright (c) 2010-2014, Jouni Malinen j@w1..nosp@m.fi

Function Documentation

void wpas_p2p_cancel_remain_on_channel_cb ( struct wpa_supplicant wpa_s,
unsigned int  freq 
)

Remain-on-channel timeout.

Parameters
wpa_sPointer to wpa_supplicant data from wpa_supplicant_add_iface()
freqFrequency of the channel in MHz

This callback is called when the driver indicates that a remain-on-channel operation has been completed, i.e., the duration on the requested channel has timed out.

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,
int  auth,
int  go_intent,
int  freq,
int  persistent_id,
int  pd,
int  ht40,
int  vht 
)

Request P2P Group Formation to be started.

Parameters
wpa_sPointer to wpa_supplicant data from wpa_supplicant_add_iface()
peer_addrAddress of the peer P2P Device
pinPIN to use during provisioning or NULL to indicate PBC mode
persistent_groupWhether to create a persistent group
auto_joinWhether to select join vs. GO Negotiation automatically
joinWhether to join an existing group (as a client) instead of starting Group Owner negotiation; peer_addr is BSSID in that case
authWhether to only authorize the connection instead of doing that and initiating Group Owner negotiation
go_intentGO Intent or -1 to use default
freqFrequency for the group or 0 for auto-selection
persistent_idPersistent group credentials to use for forcing GO parameters or -1 to generate new values (SSID/passphrase)
pdWhether to send Provision Discovery prior to GO Negotiation as an interoperability workaround when initiating group formation
ht40Start GO with 40 MHz channel width
vhtStart GO with VHT support
Returns
0 or new PIN (if pin was NULL) on success, -1 on unspecified failure, -2 on failure due to channel not currently available, -3 if forced channel is not supported
void wpas_p2p_deinit ( struct wpa_supplicant wpa_s)

Deinitialize per-interface P2P data.

Parameters
wpa_sPointer to wpa_supplicant data from wpa_supplicant_add_iface()

This function deinitialize per-interface P2P data.

int wpas_p2p_disconnect ( struct wpa_supplicant wpa_s)

Disconnect from a P2P Group.

Parameters
wpa_sPointer to wpa_supplicant data
Returns
0 on success, -1 on failure

This can be used to disconnect from a group in which the local end is a P2P Client or to end a P2P Group in case the local end is the Group Owner. If a virtual network interface was created for this group, that interface will be removed. Otherwise, only the configured P2P group network will be removed from the interface.

int wpas_p2p_group_add ( struct wpa_supplicant wpa_s,
int  persistent_group,
int  freq,
int  ht40,
int  vht 
)

Add a new P2P group with local end as Group Owner.

Parameters
wpa_sPointer to wpa_supplicant data from wpa_supplicant_add_iface()
persistent_groupWhether to create a persistent group
freqFrequency for the group or 0 to indicate no hardcoding
ht40Start GO with 40 MHz channel width
vhtStart GO with VHT support
Returns
0 on success, -1 on failure

This function creates a new P2P group with the local end as the Group Owner, i.e., without using Group Owner Negotiation.

int wpas_p2p_group_remove ( struct wpa_supplicant wpa_s,
const char *  ifname 
)

Remove a P2P group.

Parameters
wpa_sPointer to wpa_supplicant data from wpa_supplicant_add_iface()
ifnameNetwork interface name of the group interface or "*" to remove all groups
Returns
0 on success, -1 on failure

This function is used to remove a P2P group. This can be used to disconnect from a group in which the local end is a P2P Client or to end a P2P Group in case the local end is the Group Owner. If a virtual network interface was created for this group, that interface will be removed. Otherwise, only the configured P2P group network will be removed from the interface.

int wpas_p2p_init ( struct wpa_global global,
struct wpa_supplicant wpa_s 
)

Initialize P2P module for wpa_supplicant.

Parameters
globalPointer to global data from wpa_supplicant_init()
wpa_sPointer to wpa_supplicant data from wpa_supplicant_add_iface()
Returns
0 on success, -1 on failure
void wpas_p2p_network_removed ( struct wpa_supplicant wpa_s,
struct wpa_ssid ssid 
)

Remove the network by scheduling the group formation timeout to happen immediately. The teardown code needs to be scheduled to run asynch later so that we don't delete data from under ourselves unexpectedly. Calling wpas_p2p_group_formation_timeout directly causes a series of crashes in WPS failure scenarios.

void wpas_p2p_remain_on_channel_cb ( struct wpa_supplicant wpa_s,
unsigned int  freq,
unsigned int  duration 
)

Indication of remain-on-channel start.

Parameters
wpa_sPointer to wpa_supplicant data from wpa_supplicant_add_iface()
freqFrequency of the channel in MHz
durationDuration of the stay on the channel in milliseconds

This callback is called when the driver indicates that it has started the requested remain-on-channel duration.