1252190Srpaulo/* 2252190Srpaulo * P2P - Internal definitions for P2P module 3252190Srpaulo * Copyright (c) 2009-2010, Atheros Communications 4252190Srpaulo * 5252190Srpaulo * This software may be distributed under the terms of the BSD license. 6252190Srpaulo * See README for more details. 7252190Srpaulo */ 8252190Srpaulo 9252190Srpaulo#ifndef P2P_I_H 10252190Srpaulo#define P2P_I_H 11252190Srpaulo 12252190Srpaulo#include "utils/list.h" 13252190Srpaulo#include "p2p.h" 14252190Srpaulo 15281806Srpaulo#define P2P_GO_NEG_CNF_MAX_RETRY_COUNT 1 16281806Srpaulo 17289549Srpaulo/* 18289549Srpaulo * A threshold (in seconds) to prefer a direct Probe Response frame from a P2P 19289549Srpaulo * Device over the P2P Client Info received from a GO. 20289549Srpaulo */ 21289549Srpaulo#define P2P_DEV_GROUP_CLIENT_RESP_THRESHOLD 1 22289549Srpaulo 23281806Srpauloenum p2p_role_indication; 24281806Srpaulo 25281806Srpaulo/* 26281806Srpaulo * To force Service Instances to fit within a single P2P Tag, MAX_SVC_ADV_LEN 27281806Srpaulo * must equal 248 or less. Must have a minimum size of 19. 28281806Srpaulo */ 29281806Srpaulo#define MAX_SVC_ADV_LEN 600 30281806Srpaulo#define MAX_SVC_ADV_IE_LEN (9 + MAX_SVC_ADV_LEN + (5 * (MAX_SVC_ADV_LEN / 240))) 31281806Srpaulo 32252190Srpauloenum p2p_go_state { 33252190Srpaulo UNKNOWN_GO, 34252190Srpaulo LOCAL_GO, 35252190Srpaulo REMOTE_GO 36252190Srpaulo}; 37252190Srpaulo 38252190Srpaulo/** 39252190Srpaulo * struct p2p_device - P2P Device data (internal to P2P module) 40252190Srpaulo */ 41252190Srpaulostruct p2p_device { 42252190Srpaulo struct dl_list list; 43281806Srpaulo struct os_reltime last_seen; 44252190Srpaulo int listen_freq; 45281806Srpaulo int oob_go_neg_freq; 46252190Srpaulo enum p2p_wps_method wps_method; 47281806Srpaulo u16 oob_pw_id; 48252190Srpaulo 49252190Srpaulo struct p2p_peer_info info; 50252190Srpaulo 51252190Srpaulo /* 52252190Srpaulo * If the peer was discovered based on an interface address (e.g., GO 53252190Srpaulo * from Beacon/Probe Response), the interface address is stored here. 54252190Srpaulo * p2p_device_addr must still be set in such a case to the unique 55252190Srpaulo * identifier for the P2P Device. 56289549Srpaulo * 57289549Srpaulo * This field is also used during P2PS PD to store the intended GO 58289549Srpaulo * address of the peer. 59252190Srpaulo */ 60252190Srpaulo u8 interface_addr[ETH_ALEN]; 61252190Srpaulo 62252190Srpaulo /* 63252190Srpaulo * P2P Device Address of the GO in whose group this P2P Device is a 64252190Srpaulo * client. 65252190Srpaulo */ 66252190Srpaulo u8 member_in_go_dev[ETH_ALEN]; 67252190Srpaulo 68252190Srpaulo /* 69252190Srpaulo * P2P Interface Address of the GO in whose group this P2P Device is a 70252190Srpaulo * client. 71252190Srpaulo */ 72252190Srpaulo u8 member_in_go_iface[ETH_ALEN]; 73252190Srpaulo 74252190Srpaulo int go_neg_req_sent; 75252190Srpaulo enum p2p_go_state go_state; 76252190Srpaulo u8 dialog_token; 77281806Srpaulo u8 tie_breaker; 78252190Srpaulo u8 intended_addr[ETH_ALEN]; 79252190Srpaulo 80252190Srpaulo char country[3]; 81252190Srpaulo struct p2p_channels channels; 82252190Srpaulo int oper_freq; 83289549Srpaulo u8 oper_ssid[SSID_MAX_LEN]; 84252190Srpaulo size_t oper_ssid_len; 85252190Srpaulo 86252190Srpaulo /** 87252190Srpaulo * req_config_methods - Pending provision discovery methods 88252190Srpaulo */ 89252190Srpaulo u16 req_config_methods; 90252190Srpaulo 91252190Srpaulo /** 92252190Srpaulo * wps_prov_info - Stored provisioning WPS config method 93252190Srpaulo * 94252190Srpaulo * This is used to store pending WPS config method between Provisioning 95252190Srpaulo * Discovery and connection to a running group. 96252190Srpaulo */ 97252190Srpaulo u16 wps_prov_info; 98252190Srpaulo 99252190Srpaulo#define P2P_DEV_PROBE_REQ_ONLY BIT(0) 100252190Srpaulo#define P2P_DEV_REPORTED BIT(1) 101252190Srpaulo#define P2P_DEV_NOT_YET_READY BIT(2) 102252190Srpaulo#define P2P_DEV_PD_PEER_DISPLAY BIT(5) 103252190Srpaulo#define P2P_DEV_PD_PEER_KEYPAD BIT(6) 104252190Srpaulo#define P2P_DEV_USER_REJECTED BIT(7) 105252190Srpaulo#define P2P_DEV_PEER_WAITING_RESPONSE BIT(8) 106252190Srpaulo#define P2P_DEV_PREFER_PERSISTENT_GROUP BIT(9) 107252190Srpaulo#define P2P_DEV_WAIT_GO_NEG_RESPONSE BIT(10) 108252190Srpaulo#define P2P_DEV_WAIT_GO_NEG_CONFIRM BIT(11) 109252190Srpaulo#define P2P_DEV_GROUP_CLIENT_ONLY BIT(12) 110252190Srpaulo#define P2P_DEV_FORCE_FREQ BIT(13) 111252190Srpaulo#define P2P_DEV_PD_FOR_JOIN BIT(14) 112252190Srpaulo#define P2P_DEV_REPORTED_ONCE BIT(15) 113252190Srpaulo#define P2P_DEV_PREFER_PERSISTENT_RECONN BIT(16) 114252190Srpaulo#define P2P_DEV_PD_BEFORE_GO_NEG BIT(17) 115281806Srpaulo#define P2P_DEV_NO_PREF_CHAN BIT(18) 116281806Srpaulo#define P2P_DEV_WAIT_INV_REQ_ACK BIT(19) 117281806Srpaulo#define P2P_DEV_P2PS_REPORTED BIT(20) 118281806Srpaulo#define P2P_DEV_PD_PEER_P2PS BIT(21) 119289549Srpaulo#define P2P_DEV_LAST_SEEN_AS_GROUP_CLIENT BIT(22) 120289549Srpaulo 121252190Srpaulo unsigned int flags; 122252190Srpaulo 123252190Srpaulo int status; /* enum p2p_status_code */ 124252190Srpaulo unsigned int wait_count; 125252190Srpaulo unsigned int connect_reqs; 126252190Srpaulo unsigned int invitation_reqs; 127281806Srpaulo unsigned int sd_reqs; 128252190Srpaulo 129252190Srpaulo u16 ext_listen_period; 130252190Srpaulo u16 ext_listen_interval; 131252190Srpaulo 132252190Srpaulo u8 go_timeout; 133252190Srpaulo u8 client_timeout; 134281806Srpaulo 135281806Srpaulo /** 136281806Srpaulo * go_neg_conf_sent - Number of GO Negotiation Confirmation retries 137281806Srpaulo */ 138281806Srpaulo u8 go_neg_conf_sent; 139281806Srpaulo 140281806Srpaulo /** 141281806Srpaulo * freq - Frquency on which the GO Negotiation Confirmation is sent 142281806Srpaulo */ 143281806Srpaulo int go_neg_conf_freq; 144281806Srpaulo 145281806Srpaulo /** 146281806Srpaulo * go_neg_conf - GO Negotiation Confirmation frame 147281806Srpaulo */ 148281806Srpaulo struct wpabuf *go_neg_conf; 149281806Srpaulo 150281806Srpaulo int sd_pending_bcast_queries; 151252190Srpaulo}; 152252190Srpaulo 153252190Srpaulostruct p2p_sd_query { 154252190Srpaulo struct p2p_sd_query *next; 155252190Srpaulo u8 peer[ETH_ALEN]; 156252190Srpaulo int for_all_peers; 157252190Srpaulo int wsd; /* Wi-Fi Display Service Discovery Request */ 158252190Srpaulo struct wpabuf *tlvs; 159252190Srpaulo}; 160252190Srpaulo 161252190Srpaulo/** 162252190Srpaulo * struct p2p_data - P2P module data (internal to P2P module) 163252190Srpaulo */ 164252190Srpaulostruct p2p_data { 165252190Srpaulo /** 166252190Srpaulo * cfg - P2P module configuration 167252190Srpaulo * 168252190Srpaulo * This is included in the same memory allocation with the 169252190Srpaulo * struct p2p_data and as such, must not be freed separately. 170252190Srpaulo */ 171252190Srpaulo struct p2p_config *cfg; 172252190Srpaulo 173252190Srpaulo /** 174252190Srpaulo * state - The current P2P state 175252190Srpaulo */ 176252190Srpaulo enum p2p_state { 177252190Srpaulo /** 178252190Srpaulo * P2P_IDLE - Idle 179252190Srpaulo */ 180252190Srpaulo P2P_IDLE, 181252190Srpaulo 182252190Srpaulo /** 183252190Srpaulo * P2P_SEARCH - Search (Device Discovery) 184252190Srpaulo */ 185252190Srpaulo P2P_SEARCH, 186252190Srpaulo 187252190Srpaulo /** 188252190Srpaulo * P2P_CONNECT - Trying to start GO Negotiation 189252190Srpaulo */ 190252190Srpaulo P2P_CONNECT, 191252190Srpaulo 192252190Srpaulo /** 193252190Srpaulo * P2P_CONNECT_LISTEN - Listen during GO Negotiation start 194252190Srpaulo */ 195252190Srpaulo P2P_CONNECT_LISTEN, 196252190Srpaulo 197252190Srpaulo /** 198252190Srpaulo * P2P_GO_NEG - In GO Negotiation 199252190Srpaulo */ 200252190Srpaulo P2P_GO_NEG, 201252190Srpaulo 202252190Srpaulo /** 203252190Srpaulo * P2P_LISTEN_ONLY - Listen only 204252190Srpaulo */ 205252190Srpaulo P2P_LISTEN_ONLY, 206252190Srpaulo 207252190Srpaulo /** 208252190Srpaulo * P2P_WAIT_PEER_CONNECT - Waiting peer in List for GO Neg 209252190Srpaulo */ 210252190Srpaulo P2P_WAIT_PEER_CONNECT, 211252190Srpaulo 212252190Srpaulo /** 213252190Srpaulo * P2P_WAIT_PEER_IDLE - Waiting peer idle for GO Neg 214252190Srpaulo */ 215252190Srpaulo P2P_WAIT_PEER_IDLE, 216252190Srpaulo 217252190Srpaulo /** 218252190Srpaulo * P2P_SD_DURING_FIND - Service Discovery during find 219252190Srpaulo */ 220252190Srpaulo P2P_SD_DURING_FIND, 221252190Srpaulo 222252190Srpaulo /** 223252190Srpaulo * P2P_PROVISIONING - Provisioning (during group formation) 224252190Srpaulo */ 225252190Srpaulo P2P_PROVISIONING, 226252190Srpaulo 227252190Srpaulo /** 228252190Srpaulo * P2P_PD_DURING_FIND - Provision Discovery during find 229252190Srpaulo */ 230252190Srpaulo P2P_PD_DURING_FIND, 231252190Srpaulo 232252190Srpaulo /** 233252190Srpaulo * P2P_INVITE - Trying to start Invite 234252190Srpaulo */ 235252190Srpaulo P2P_INVITE, 236252190Srpaulo 237252190Srpaulo /** 238252190Srpaulo * P2P_INVITE_LISTEN - Listen during Invite 239252190Srpaulo */ 240252190Srpaulo P2P_INVITE_LISTEN, 241252190Srpaulo } state; 242252190Srpaulo 243252190Srpaulo /** 244252190Srpaulo * min_disc_int - minDiscoverableInterval 245252190Srpaulo */ 246252190Srpaulo int min_disc_int; 247252190Srpaulo 248252190Srpaulo /** 249252190Srpaulo * max_disc_int - maxDiscoverableInterval 250252190Srpaulo */ 251252190Srpaulo int max_disc_int; 252252190Srpaulo 253252190Srpaulo /** 254252190Srpaulo * max_disc_tu - Maximum number of TUs for discoverable interval 255252190Srpaulo */ 256252190Srpaulo int max_disc_tu; 257252190Srpaulo 258252190Srpaulo /** 259252190Srpaulo * devices - List of known P2P Device peers 260252190Srpaulo */ 261252190Srpaulo struct dl_list devices; 262252190Srpaulo 263252190Srpaulo /** 264252190Srpaulo * go_neg_peer - Pointer to GO Negotiation peer 265252190Srpaulo */ 266252190Srpaulo struct p2p_device *go_neg_peer; 267252190Srpaulo 268252190Srpaulo /** 269252190Srpaulo * invite_peer - Pointer to Invite peer 270252190Srpaulo */ 271252190Srpaulo struct p2p_device *invite_peer; 272252190Srpaulo 273281806Srpaulo /** 274281806Srpaulo * last_p2p_find_oper - Pointer to last pre-find operation peer 275281806Srpaulo */ 276281806Srpaulo struct p2p_device *last_p2p_find_oper; 277281806Srpaulo 278252190Srpaulo const u8 *invite_go_dev_addr; 279252190Srpaulo u8 invite_go_dev_addr_buf[ETH_ALEN]; 280281806Srpaulo int invite_dev_pw_id; 281252190Srpaulo 282281806Srpaulo unsigned int retry_invite_req:1; 283281806Srpaulo unsigned int retry_invite_req_sent:1; 284281806Srpaulo 285252190Srpaulo /** 286252190Srpaulo * sd_peer - Pointer to Service Discovery peer 287252190Srpaulo */ 288252190Srpaulo struct p2p_device *sd_peer; 289252190Srpaulo 290252190Srpaulo /** 291252190Srpaulo * sd_query - Pointer to Service Discovery query 292252190Srpaulo */ 293252190Srpaulo struct p2p_sd_query *sd_query; 294252190Srpaulo 295281806Srpaulo /** 296281806Srpaulo * num_p2p_sd_queries - Total number of broadcast SD queries present in 297281806Srpaulo * the list 298281806Srpaulo */ 299281806Srpaulo int num_p2p_sd_queries; 300281806Srpaulo 301337817Scy /** 302337817Scy * sd_query_no_ack - The first peer (Dev Addr) that did not ACK SD Query 303337817Scy * 304337817Scy * This is used to track the first peer that did not ACK an SD Query 305337817Scy * within a single P2P Search iteration. All zeros address means no such 306337817Scy * peer was yet seen. This information is used to allow a new Listen and 307337817Scy * Search phases to be once every pending SD Query has been sent once to 308337817Scy * each peer instead of looping all pending attempts continuously until 309337817Scy * running out of retry maximums. 310337817Scy */ 311337817Scy u8 sd_query_no_ack[ETH_ALEN]; 312337817Scy 313252190Srpaulo /* GO Negotiation data */ 314252190Srpaulo 315252190Srpaulo /** 316252190Srpaulo * intended_addr - Local Intended P2P Interface Address 317252190Srpaulo * 318252190Srpaulo * This address is used during group owner negotiation as the Intended 319252190Srpaulo * P2P Interface Address and the group interface will be created with 320252190Srpaulo * address as the local address in case of successfully completed 321252190Srpaulo * negotiation. 322252190Srpaulo */ 323252190Srpaulo u8 intended_addr[ETH_ALEN]; 324252190Srpaulo 325252190Srpaulo /** 326252190Srpaulo * go_intent - Local GO Intent to be used during GO Negotiation 327252190Srpaulo */ 328252190Srpaulo u8 go_intent; 329252190Srpaulo 330252190Srpaulo /** 331252190Srpaulo * next_tie_breaker - Next tie-breaker value to use in GO Negotiation 332252190Srpaulo */ 333252190Srpaulo u8 next_tie_breaker; 334252190Srpaulo 335252190Srpaulo /** 336252190Srpaulo * ssid - Selected SSID for GO Negotiation (if local end will be GO) 337252190Srpaulo */ 338289549Srpaulo u8 ssid[SSID_MAX_LEN]; 339252190Srpaulo 340252190Srpaulo /** 341252190Srpaulo * ssid_len - ssid length in octets 342252190Srpaulo */ 343252190Srpaulo size_t ssid_len; 344252190Srpaulo 345252190Srpaulo /** 346252190Srpaulo * ssid_set - Whether SSID is already set for GO Negotiation 347252190Srpaulo */ 348252190Srpaulo int ssid_set; 349252190Srpaulo 350252190Srpaulo /** 351252190Srpaulo * Regulatory class for own operational channel 352252190Srpaulo */ 353252190Srpaulo u8 op_reg_class; 354252190Srpaulo 355252190Srpaulo /** 356252190Srpaulo * op_channel - Own operational channel 357252190Srpaulo */ 358252190Srpaulo u8 op_channel; 359252190Srpaulo 360252190Srpaulo /** 361252190Srpaulo * channels - Own supported regulatory classes and channels 362252190Srpaulo * 363252190Srpaulo * List of supposerted channels per regulatory class. The regulatory 364252190Srpaulo * classes are defined in IEEE Std 802.11-2007 Annex J and the 365252190Srpaulo * numbering of the clases depends on the configured country code. 366252190Srpaulo */ 367252190Srpaulo struct p2p_channels channels; 368252190Srpaulo 369281806Srpaulo struct wpa_freq_range_list no_go_freq; 370281806Srpaulo 371252190Srpaulo enum p2p_pending_action_state { 372252190Srpaulo P2P_NO_PENDING_ACTION, 373252190Srpaulo P2P_PENDING_GO_NEG_REQUEST, 374252190Srpaulo P2P_PENDING_GO_NEG_RESPONSE, 375252190Srpaulo P2P_PENDING_GO_NEG_RESPONSE_FAILURE, 376252190Srpaulo P2P_PENDING_GO_NEG_CONFIRM, 377252190Srpaulo P2P_PENDING_SD, 378252190Srpaulo P2P_PENDING_PD, 379281806Srpaulo P2P_PENDING_PD_RESPONSE, 380252190Srpaulo P2P_PENDING_INVITATION_REQUEST, 381252190Srpaulo P2P_PENDING_INVITATION_RESPONSE, 382252190Srpaulo P2P_PENDING_DEV_DISC_REQUEST, 383252190Srpaulo P2P_PENDING_DEV_DISC_RESPONSE, 384252190Srpaulo P2P_PENDING_GO_DISC_REQ 385252190Srpaulo } pending_action_state; 386252190Srpaulo 387252190Srpaulo unsigned int pending_listen_freq; 388252190Srpaulo unsigned int pending_listen_sec; 389252190Srpaulo unsigned int pending_listen_usec; 390252190Srpaulo 391252190Srpaulo u8 dev_capab; 392252190Srpaulo 393252190Srpaulo int in_listen; 394252190Srpaulo int drv_in_listen; 395252190Srpaulo 396252190Srpaulo /** 397252190Srpaulo * sd_queries - Pending service discovery queries 398252190Srpaulo */ 399252190Srpaulo struct p2p_sd_query *sd_queries; 400252190Srpaulo 401252190Srpaulo /** 402252190Srpaulo * srv_update_indic - Service Update Indicator for local services 403252190Srpaulo */ 404252190Srpaulo u16 srv_update_indic; 405252190Srpaulo 406252190Srpaulo struct wpabuf *sd_resp; /* Fragmented SD response */ 407252190Srpaulo u8 sd_resp_addr[ETH_ALEN]; 408252190Srpaulo u8 sd_resp_dialog_token; 409252190Srpaulo size_t sd_resp_pos; /* Offset in sd_resp */ 410252190Srpaulo u8 sd_frag_id; 411252190Srpaulo 412252190Srpaulo struct wpabuf *sd_rx_resp; /* Reassembled SD response */ 413252190Srpaulo u16 sd_rx_update_indic; 414252190Srpaulo 415252190Srpaulo /* P2P Invitation data */ 416252190Srpaulo enum p2p_invite_role inv_role; 417252190Srpaulo u8 inv_bssid[ETH_ALEN]; 418252190Srpaulo int inv_bssid_set; 419289549Srpaulo u8 inv_ssid[SSID_MAX_LEN]; 420252190Srpaulo size_t inv_ssid_len; 421252190Srpaulo u8 inv_sa[ETH_ALEN]; 422252190Srpaulo u8 inv_group_bssid[ETH_ALEN]; 423252190Srpaulo u8 *inv_group_bssid_ptr; 424252190Srpaulo u8 inv_go_dev_addr[ETH_ALEN]; 425252190Srpaulo u8 inv_status; 426252190Srpaulo int inv_op_freq; 427252190Srpaulo int inv_persistent; 428252190Srpaulo 429252190Srpaulo enum p2p_discovery_type find_type; 430346981Scy int find_specified_freq; 431252190Srpaulo unsigned int last_p2p_find_timeout; 432252190Srpaulo u8 last_prog_scan_class; 433252190Srpaulo u8 last_prog_scan_chan; 434346981Scy unsigned int find_pending_full:1; 435252190Srpaulo int p2p_scan_running; 436252190Srpaulo enum p2p_after_scan { 437252190Srpaulo P2P_AFTER_SCAN_NOTHING, 438252190Srpaulo P2P_AFTER_SCAN_LISTEN, 439252190Srpaulo P2P_AFTER_SCAN_CONNECT 440252190Srpaulo } start_after_scan; 441252190Srpaulo u8 after_scan_peer[ETH_ALEN]; 442281806Srpaulo unsigned int send_action_in_progress:1; 443252190Srpaulo 444252190Srpaulo /* Requested device types for find/search */ 445252190Srpaulo unsigned int num_req_dev_types; 446252190Srpaulo u8 *req_dev_types; 447252190Srpaulo u8 *find_dev_id; 448252190Srpaulo u8 find_dev_id_buf[ETH_ALEN]; 449252190Srpaulo 450281806Srpaulo struct os_reltime find_start; /* time of last p2p_find start */ 451281806Srpaulo 452252190Srpaulo struct p2p_group **groups; 453252190Srpaulo size_t num_groups; 454252190Srpaulo 455252190Srpaulo struct p2p_device *pending_client_disc_go; 456252190Srpaulo u8 pending_client_disc_addr[ETH_ALEN]; 457252190Srpaulo u8 pending_dev_disc_dialog_token; 458252190Srpaulo u8 pending_dev_disc_addr[ETH_ALEN]; 459252190Srpaulo int pending_dev_disc_freq; 460252190Srpaulo unsigned int pending_client_disc_freq; 461252190Srpaulo 462252190Srpaulo int ext_listen_only; 463252190Srpaulo unsigned int ext_listen_period; 464252190Srpaulo unsigned int ext_listen_interval; 465252190Srpaulo unsigned int ext_listen_interval_sec; 466252190Srpaulo unsigned int ext_listen_interval_usec; 467252190Srpaulo 468252190Srpaulo u8 peer_filter[ETH_ALEN]; 469252190Srpaulo 470252190Srpaulo int cross_connect; 471252190Srpaulo 472252190Srpaulo int best_freq_24; 473252190Srpaulo int best_freq_5; 474252190Srpaulo int best_freq_overall; 475281806Srpaulo int own_freq_preference; 476252190Srpaulo 477252190Srpaulo /** 478252190Srpaulo * wps_vendor_ext - WPS Vendor Extensions to add 479252190Srpaulo */ 480252190Srpaulo struct wpabuf *wps_vendor_ext[P2P_MAX_WPS_VENDOR_EXT]; 481252190Srpaulo 482252190Srpaulo /* 483252190Srpaulo * user_initiated_pd - Whether a PD request is user initiated or not. 484252190Srpaulo */ 485252190Srpaulo u8 user_initiated_pd; 486252190Srpaulo 487252190Srpaulo /* 488252190Srpaulo * Keep track of which peer a given PD request was sent to. 489252190Srpaulo * Used to raise a timeout alert in case there is no response. 490252190Srpaulo */ 491252190Srpaulo u8 pending_pd_devaddr[ETH_ALEN]; 492252190Srpaulo 493252190Srpaulo /* 494252190Srpaulo * Retry counter for provision discovery requests when issued 495252190Srpaulo * in IDLE state. 496252190Srpaulo */ 497252190Srpaulo int pd_retries; 498252190Srpaulo 499281806Srpaulo /** 500281806Srpaulo * pd_force_freq - Forced frequency for PD retries or 0 to auto-select 501281806Srpaulo * 502281806Srpaulo * This is is used during PD retries for join-a-group case to use the 503281806Srpaulo * correct operating frequency determined from a BSS entry for the GO. 504281806Srpaulo */ 505281806Srpaulo int pd_force_freq; 506281806Srpaulo 507252190Srpaulo u8 go_timeout; 508252190Srpaulo u8 client_timeout; 509252190Srpaulo 510252190Srpaulo /* Extra delay in milliseconds between search iterations */ 511252190Srpaulo unsigned int search_delay; 512252190Srpaulo int in_search_delay; 513252190Srpaulo 514281806Srpaulo u8 pending_reg_class; 515281806Srpaulo u8 pending_channel; 516281806Srpaulo u8 pending_channel_forced; 517281806Srpaulo 518281806Srpaulo /* ASP Support */ 519281806Srpaulo struct p2ps_advertisement *p2ps_adv_list; 520281806Srpaulo struct p2ps_provision *p2ps_prov; 521281806Srpaulo u8 wild_card_hash[P2PS_HASH_LEN]; 522281806Srpaulo u8 p2ps_seek; 523289549Srpaulo u8 p2ps_seek_hash[P2P_MAX_QUERY_HASH * P2PS_HASH_LEN]; 524281806Srpaulo u8 p2ps_seek_count; 525281806Srpaulo 526252190Srpaulo#ifdef CONFIG_WIFI_DISPLAY 527252190Srpaulo struct wpabuf *wfd_ie_beacon; 528252190Srpaulo struct wpabuf *wfd_ie_probe_req; 529252190Srpaulo struct wpabuf *wfd_ie_probe_resp; 530252190Srpaulo struct wpabuf *wfd_ie_assoc_req; 531252190Srpaulo struct wpabuf *wfd_ie_invitation; 532252190Srpaulo struct wpabuf *wfd_ie_prov_disc_req; 533252190Srpaulo struct wpabuf *wfd_ie_prov_disc_resp; 534252190Srpaulo struct wpabuf *wfd_ie_go_neg; 535252190Srpaulo struct wpabuf *wfd_dev_info; 536252190Srpaulo struct wpabuf *wfd_assoc_bssid; 537252190Srpaulo struct wpabuf *wfd_coupled_sink_info; 538346981Scy struct wpabuf *wfd_r2_dev_info; 539252190Srpaulo#endif /* CONFIG_WIFI_DISPLAY */ 540281806Srpaulo 541281806Srpaulo u16 authorized_oob_dev_pw_id; 542281806Srpaulo 543281806Srpaulo struct wpabuf **vendor_elem; 544289549Srpaulo 545289549Srpaulo unsigned int pref_freq_list[P2P_MAX_PREF_CHANNELS]; 546289549Srpaulo unsigned int num_pref_freq; 547346981Scy 548346981Scy /* Override option for preferred operating channel in GO Negotiation */ 549346981Scy u8 override_pref_op_class; 550346981Scy u8 override_pref_channel; 551252190Srpaulo}; 552252190Srpaulo 553252190Srpaulo/** 554252190Srpaulo * struct p2p_message - Parsed P2P message (or P2P IE) 555252190Srpaulo */ 556252190Srpaulostruct p2p_message { 557252190Srpaulo struct wpabuf *p2p_attributes; 558252190Srpaulo struct wpabuf *wps_attributes; 559252190Srpaulo struct wpabuf *wfd_subelems; 560252190Srpaulo 561252190Srpaulo u8 dialog_token; 562252190Srpaulo 563252190Srpaulo const u8 *capability; 564252190Srpaulo const u8 *go_intent; 565252190Srpaulo const u8 *status; 566252190Srpaulo const u8 *listen_channel; 567252190Srpaulo const u8 *operating_channel; 568252190Srpaulo const u8 *channel_list; 569252190Srpaulo u8 channel_list_len; 570252190Srpaulo const u8 *config_timeout; 571252190Srpaulo const u8 *intended_addr; 572252190Srpaulo const u8 *group_bssid; 573252190Srpaulo const u8 *invitation_flags; 574252190Srpaulo 575252190Srpaulo const u8 *group_info; 576252190Srpaulo size_t group_info_len; 577252190Srpaulo 578252190Srpaulo const u8 *group_id; 579252190Srpaulo size_t group_id_len; 580252190Srpaulo 581252190Srpaulo const u8 *device_id; 582252190Srpaulo 583252190Srpaulo const u8 *manageability; 584252190Srpaulo 585252190Srpaulo const u8 *noa; 586252190Srpaulo size_t noa_len; 587252190Srpaulo 588252190Srpaulo const u8 *ext_listen_timing; 589252190Srpaulo 590252190Srpaulo const u8 *minor_reason_code; 591252190Srpaulo 592281806Srpaulo const u8 *oob_go_neg_channel; 593281806Srpaulo 594252190Srpaulo /* P2P Device Info */ 595252190Srpaulo const u8 *p2p_device_info; 596252190Srpaulo size_t p2p_device_info_len; 597252190Srpaulo const u8 *p2p_device_addr; 598252190Srpaulo const u8 *pri_dev_type; 599252190Srpaulo u8 num_sec_dev_types; 600289549Srpaulo char device_name[WPS_DEV_NAME_MAX_LEN + 1]; 601252190Srpaulo u16 config_methods; 602252190Srpaulo 603252190Srpaulo /* WPS IE */ 604252190Srpaulo u16 dev_password_id; 605281806Srpaulo int dev_password_id_present; 606252190Srpaulo u16 wps_config_methods; 607252190Srpaulo const u8 *wps_pri_dev_type; 608252190Srpaulo const u8 *wps_sec_dev_type_list; 609252190Srpaulo size_t wps_sec_dev_type_list_len; 610252190Srpaulo const u8 *wps_vendor_ext[P2P_MAX_WPS_VENDOR_EXT]; 611252190Srpaulo size_t wps_vendor_ext_len[P2P_MAX_WPS_VENDOR_EXT]; 612252190Srpaulo const u8 *manufacturer; 613252190Srpaulo size_t manufacturer_len; 614252190Srpaulo const u8 *model_name; 615252190Srpaulo size_t model_name_len; 616252190Srpaulo const u8 *model_number; 617252190Srpaulo size_t model_number_len; 618252190Srpaulo const u8 *serial_number; 619252190Srpaulo size_t serial_number_len; 620281806Srpaulo const u8 *oob_dev_password; 621281806Srpaulo size_t oob_dev_password_len; 622252190Srpaulo 623252190Srpaulo /* DS Parameter Set IE */ 624252190Srpaulo const u8 *ds_params; 625252190Srpaulo 626252190Srpaulo /* SSID IE */ 627252190Srpaulo const u8 *ssid; 628281806Srpaulo 629281806Srpaulo /* P2PS */ 630281806Srpaulo u8 service_hash_count; 631281806Srpaulo const u8 *service_hash; 632281806Srpaulo 633281806Srpaulo const u8 *session_info; 634281806Srpaulo size_t session_info_len; 635281806Srpaulo 636281806Srpaulo const u8 *conn_cap; 637281806Srpaulo 638281806Srpaulo const u8 *adv_id; 639281806Srpaulo const u8 *adv_mac; 640281806Srpaulo 641281806Srpaulo const u8 *adv_service_instance; 642281806Srpaulo size_t adv_service_instance_len; 643281806Srpaulo 644281806Srpaulo const u8 *session_id; 645281806Srpaulo const u8 *session_mac; 646281806Srpaulo 647281806Srpaulo const u8 *feature_cap; 648281806Srpaulo size_t feature_cap_len; 649281806Srpaulo 650281806Srpaulo const u8 *persistent_dev; 651281806Srpaulo const u8 *persistent_ssid; 652281806Srpaulo size_t persistent_ssid_len; 653289549Srpaulo 654289549Srpaulo const u8 *pref_freq_list; 655289549Srpaulo size_t pref_freq_list_len; 656252190Srpaulo}; 657252190Srpaulo 658252190Srpaulo 659252190Srpaulo#define P2P_MAX_GROUP_ENTRIES 50 660252190Srpaulo 661252190Srpaulostruct p2p_group_info { 662252190Srpaulo unsigned int num_clients; 663252190Srpaulo struct p2p_client_info { 664252190Srpaulo const u8 *p2p_device_addr; 665252190Srpaulo const u8 *p2p_interface_addr; 666252190Srpaulo u8 dev_capab; 667252190Srpaulo u16 config_methods; 668252190Srpaulo const u8 *pri_dev_type; 669252190Srpaulo u8 num_sec_dev_types; 670252190Srpaulo const u8 *sec_dev_types; 671252190Srpaulo const char *dev_name; 672252190Srpaulo size_t dev_name_len; 673252190Srpaulo } client[P2P_MAX_GROUP_ENTRIES]; 674252190Srpaulo}; 675252190Srpaulo 676252190Srpaulo 677252190Srpaulo/* p2p_utils.c */ 678252190Srpauloint p2p_random(char *buf, size_t len); 679281806Srpauloint p2p_channel_to_freq(int op_class, int channel); 680281806Srpauloint p2p_freq_to_channel(unsigned int freq, u8 *op_class, u8 *channel); 681252190Srpaulovoid p2p_channels_intersect(const struct p2p_channels *a, 682252190Srpaulo const struct p2p_channels *b, 683252190Srpaulo struct p2p_channels *res); 684281806Srpaulovoid p2p_channels_union_inplace(struct p2p_channels *res, 685281806Srpaulo const struct p2p_channels *b); 686281806Srpaulovoid p2p_channels_union(const struct p2p_channels *a, 687281806Srpaulo const struct p2p_channels *b, 688281806Srpaulo struct p2p_channels *res); 689281806Srpaulovoid p2p_channels_remove_freqs(struct p2p_channels *chan, 690281806Srpaulo const struct wpa_freq_range_list *list); 691252190Srpauloint p2p_channels_includes(const struct p2p_channels *channels, u8 reg_class, 692252190Srpaulo u8 channel); 693281806Srpaulovoid p2p_channels_dump(struct p2p_data *p2p, const char *title, 694281806Srpaulo const struct p2p_channels *chan); 695281806Srpauloint p2p_channel_select(struct p2p_channels *chans, const int *classes, 696281806Srpaulo u8 *op_class, u8 *op_channel); 697281806Srpauloint p2p_channel_random_social(struct p2p_channels *chans, u8 *op_class, 698346981Scy u8 *op_channel, 699346981Scy struct wpa_freq_range_list *avoid_list, 700346981Scy struct wpa_freq_range_list *disallow_list); 701252190Srpaulo 702252190Srpaulo/* p2p_parse.c */ 703337817Scyvoid p2p_copy_filter_devname(char *dst, size_t dst_len, 704337817Scy const void *src, size_t src_len); 705252190Srpauloint p2p_parse_p2p_ie(const struct wpabuf *buf, struct p2p_message *msg); 706252190Srpauloint p2p_parse_ies(const u8 *data, size_t len, struct p2p_message *msg); 707252190Srpauloint p2p_parse(const u8 *data, size_t len, struct p2p_message *msg); 708281806Srpauloint p2p_parse_ies_separate(const u8 *wsc, size_t wsc_len, const u8 *p2p, 709281806Srpaulo size_t p2p_len, struct p2p_message *msg); 710252190Srpaulovoid p2p_parse_free(struct p2p_message *msg); 711252190Srpauloint p2p_attr_text(struct wpabuf *data, char *buf, char *end); 712252190Srpauloint p2p_group_info_parse(const u8 *gi, size_t gi_len, 713252190Srpaulo struct p2p_group_info *info); 714252190Srpaulo 715252190Srpaulo/* p2p_build.c */ 716252190Srpaulo 717252190Srpaulostruct p2p_noa_desc { 718252190Srpaulo u8 count_type; 719252190Srpaulo u32 duration; 720252190Srpaulo u32 interval; 721252190Srpaulo u32 start_time; 722252190Srpaulo}; 723252190Srpaulo 724252190Srpaulo/* p2p_group.c */ 725252190Srpauloconst u8 * p2p_group_get_interface_addr(struct p2p_group *group); 726252190Srpaulou8 p2p_group_presence_req(struct p2p_group *group, 727252190Srpaulo const u8 *client_interface_addr, 728252190Srpaulo const u8 *noa, size_t noa_len); 729252190Srpauloint p2p_group_is_group_id_match(struct p2p_group *group, const u8 *group_id, 730252190Srpaulo size_t group_id_len); 731252190Srpaulovoid p2p_group_update_ies(struct p2p_group *group); 732281806Srpaulovoid p2p_group_force_beacon_update_ies(struct p2p_group *group); 733252190Srpaulostruct wpabuf * p2p_group_get_wfd_ie(struct p2p_group *g); 734281806Srpaulovoid p2p_buf_add_group_info(struct p2p_group *group, struct wpabuf *buf, 735281806Srpaulo int max_clients); 736281806Srpaulovoid p2p_group_buf_add_id(struct p2p_group *group, struct wpabuf *buf); 737281806Srpauloint p2p_group_get_freq(struct p2p_group *group); 738252190Srpaulo 739252190Srpaulo 740252190Srpaulovoid p2p_buf_add_action_hdr(struct wpabuf *buf, u8 subtype, u8 dialog_token); 741252190Srpaulovoid p2p_buf_add_public_action_hdr(struct wpabuf *buf, u8 subtype, 742252190Srpaulo u8 dialog_token); 743252190Srpaulou8 * p2p_buf_add_ie_hdr(struct wpabuf *buf); 744252190Srpaulovoid p2p_buf_add_status(struct wpabuf *buf, u8 status); 745252190Srpaulovoid p2p_buf_add_device_info(struct wpabuf *buf, struct p2p_data *p2p, 746252190Srpaulo struct p2p_device *peer); 747252190Srpaulovoid p2p_buf_add_device_id(struct wpabuf *buf, const u8 *dev_addr); 748252190Srpaulovoid p2p_buf_update_ie_hdr(struct wpabuf *buf, u8 *len); 749252190Srpaulovoid p2p_buf_add_capability(struct wpabuf *buf, u8 dev_capab, u8 group_capab); 750252190Srpaulovoid p2p_buf_add_go_intent(struct wpabuf *buf, u8 go_intent); 751252190Srpaulovoid p2p_buf_add_listen_channel(struct wpabuf *buf, const char *country, 752252190Srpaulo u8 reg_class, u8 channel); 753252190Srpaulovoid p2p_buf_add_operating_channel(struct wpabuf *buf, const char *country, 754252190Srpaulo u8 reg_class, u8 channel); 755252190Srpaulovoid p2p_buf_add_channel_list(struct wpabuf *buf, const char *country, 756252190Srpaulo struct p2p_channels *chan); 757252190Srpaulovoid p2p_buf_add_config_timeout(struct wpabuf *buf, u8 go_timeout, 758252190Srpaulo u8 client_timeout); 759252190Srpaulovoid p2p_buf_add_intended_addr(struct wpabuf *buf, const u8 *interface_addr); 760252190Srpaulovoid p2p_buf_add_group_bssid(struct wpabuf *buf, const u8 *bssid); 761252190Srpaulovoid p2p_buf_add_group_id(struct wpabuf *buf, const u8 *dev_addr, 762252190Srpaulo const u8 *ssid, size_t ssid_len); 763252190Srpaulovoid p2p_buf_add_invitation_flags(struct wpabuf *buf, u8 flags); 764252190Srpaulovoid p2p_buf_add_noa(struct wpabuf *buf, u8 noa_index, u8 opp_ps, u8 ctwindow, 765252190Srpaulo struct p2p_noa_desc *desc1, struct p2p_noa_desc *desc2); 766252190Srpaulovoid p2p_buf_add_ext_listen_timing(struct wpabuf *buf, u16 period, 767252190Srpaulo u16 interval); 768252190Srpaulovoid p2p_buf_add_p2p_interface(struct wpabuf *buf, struct p2p_data *p2p); 769281806Srpaulovoid p2p_buf_add_oob_go_neg_channel(struct wpabuf *buf, const char *country, 770281806Srpaulo u8 oper_class, u8 channel, 771281806Srpaulo enum p2p_role_indication role); 772281806Srpaulovoid p2p_buf_add_service_hash(struct wpabuf *buf, struct p2p_data *p2p); 773281806Srpaulovoid p2p_buf_add_session_info(struct wpabuf *buf, const char *info); 774281806Srpaulovoid p2p_buf_add_connection_capability(struct wpabuf *buf, u8 connection_cap); 775281806Srpaulovoid p2p_buf_add_advertisement_id(struct wpabuf *buf, u32 id, const u8 *mac); 776281806Srpaulovoid p2p_buf_add_service_instance(struct wpabuf *buf, struct p2p_data *p2p, 777281806Srpaulo u8 count, const u8 *hash, 778281806Srpaulo struct p2ps_advertisement *adv_list); 779281806Srpaulovoid p2p_buf_add_session_id(struct wpabuf *buf, u32 id, const u8 *mac); 780281806Srpaulovoid p2p_buf_add_feature_capability(struct wpabuf *buf, u16 len, 781281806Srpaulo const u8 *mask); 782281806Srpaulovoid p2p_buf_add_persistent_group_info(struct wpabuf *buf, const u8 *dev_addr, 783281806Srpaulo const u8 *ssid, size_t ssid_len); 784281806Srpauloint p2p_build_wps_ie(struct p2p_data *p2p, struct wpabuf *buf, int pw_id, 785281806Srpaulo int all_attr); 786289549Srpaulovoid p2p_buf_add_pref_channel_list(struct wpabuf *buf, 787289549Srpaulo const u32 *preferred_freq_list, u32 size); 788252190Srpaulo 789252190Srpaulo/* p2p_sd.c */ 790252190Srpaulostruct p2p_sd_query * p2p_pending_sd_req(struct p2p_data *p2p, 791252190Srpaulo struct p2p_device *dev); 792252190Srpaulovoid p2p_free_sd_queries(struct p2p_data *p2p); 793252190Srpaulovoid p2p_rx_gas_initial_req(struct p2p_data *p2p, const u8 *sa, 794252190Srpaulo const u8 *data, size_t len, int rx_freq); 795252190Srpaulovoid p2p_rx_gas_initial_resp(struct p2p_data *p2p, const u8 *sa, 796252190Srpaulo const u8 *data, size_t len, int rx_freq); 797252190Srpaulovoid p2p_rx_gas_comeback_req(struct p2p_data *p2p, const u8 *sa, 798252190Srpaulo const u8 *data, size_t len, int rx_freq); 799252190Srpaulovoid p2p_rx_gas_comeback_resp(struct p2p_data *p2p, const u8 *sa, 800252190Srpaulo const u8 *data, size_t len, int rx_freq); 801252190Srpauloint p2p_start_sd(struct p2p_data *p2p, struct p2p_device *dev); 802252190Srpaulo 803252190Srpaulo/* p2p_go_neg.c */ 804252190Srpauloint p2p_peer_channels_check(struct p2p_data *p2p, struct p2p_channels *own, 805252190Srpaulo struct p2p_device *dev, 806252190Srpaulo const u8 *channel_list, size_t channel_list_len); 807252190Srpaulovoid p2p_process_go_neg_req(struct p2p_data *p2p, const u8 *sa, 808252190Srpaulo const u8 *data, size_t len, int rx_freq); 809252190Srpaulovoid p2p_process_go_neg_resp(struct p2p_data *p2p, const u8 *sa, 810252190Srpaulo const u8 *data, size_t len, int rx_freq); 811252190Srpaulovoid p2p_process_go_neg_conf(struct p2p_data *p2p, const u8 *sa, 812252190Srpaulo const u8 *data, size_t len); 813252190Srpauloint p2p_connect_send(struct p2p_data *p2p, struct p2p_device *dev); 814252190Srpaulou16 p2p_wps_method_pw_id(enum p2p_wps_method wps_method); 815252190Srpaulovoid p2p_reselect_channel(struct p2p_data *p2p, 816252190Srpaulo struct p2p_channels *intersection); 817289549Srpaulovoid p2p_check_pref_chan(struct p2p_data *p2p, int go, 818289549Srpaulo struct p2p_device *dev, struct p2p_message *msg); 819252190Srpaulo 820252190Srpaulo/* p2p_pd.c */ 821252190Srpaulovoid p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa, 822252190Srpaulo const u8 *data, size_t len, int rx_freq); 823252190Srpaulovoid p2p_process_prov_disc_resp(struct p2p_data *p2p, const u8 *sa, 824252190Srpaulo const u8 *data, size_t len); 825252190Srpauloint p2p_send_prov_disc_req(struct p2p_data *p2p, struct p2p_device *dev, 826252190Srpaulo int join, int force_freq); 827252190Srpaulovoid p2p_reset_pending_pd(struct p2p_data *p2p); 828289549Srpaulovoid p2ps_prov_free(struct p2p_data *p2p); 829252190Srpaulo 830252190Srpaulo/* p2p_invitation.c */ 831252190Srpaulovoid p2p_process_invitation_req(struct p2p_data *p2p, const u8 *sa, 832252190Srpaulo const u8 *data, size_t len, int rx_freq); 833252190Srpaulovoid p2p_process_invitation_resp(struct p2p_data *p2p, const u8 *sa, 834252190Srpaulo const u8 *data, size_t len); 835252190Srpauloint p2p_invite_send(struct p2p_data *p2p, struct p2p_device *dev, 836281806Srpaulo const u8 *go_dev_addr, int dev_pw_id); 837252190Srpaulovoid p2p_invitation_req_cb(struct p2p_data *p2p, int success); 838252190Srpaulovoid p2p_invitation_resp_cb(struct p2p_data *p2p, int success); 839252190Srpaulo 840252190Srpaulo/* p2p_dev_disc.c */ 841252190Srpaulovoid p2p_process_dev_disc_req(struct p2p_data *p2p, const u8 *sa, 842252190Srpaulo const u8 *data, size_t len, int rx_freq); 843252190Srpaulovoid p2p_dev_disc_req_cb(struct p2p_data *p2p, int success); 844252190Srpauloint p2p_send_dev_disc_req(struct p2p_data *p2p, struct p2p_device *dev); 845252190Srpaulovoid p2p_dev_disc_resp_cb(struct p2p_data *p2p, int success); 846252190Srpaulovoid p2p_process_dev_disc_resp(struct p2p_data *p2p, const u8 *sa, 847252190Srpaulo const u8 *data, size_t len); 848252190Srpaulovoid p2p_go_disc_req_cb(struct p2p_data *p2p, int success); 849252190Srpaulovoid p2p_process_go_disc_req(struct p2p_data *p2p, const u8 *da, const u8 *sa, 850252190Srpaulo const u8 *data, size_t len, int rx_freq); 851252190Srpaulo 852252190Srpaulo/* p2p.c */ 853252190Srpaulovoid p2p_set_state(struct p2p_data *p2p, int new_state); 854252190Srpaulovoid p2p_set_timeout(struct p2p_data *p2p, unsigned int sec, 855252190Srpaulo unsigned int usec); 856252190Srpaulovoid p2p_clear_timeout(struct p2p_data *p2p); 857252190Srpaulovoid p2p_continue_find(struct p2p_data *p2p); 858252190Srpaulostruct p2p_device * p2p_add_dev_from_go_neg_req(struct p2p_data *p2p, 859252190Srpaulo const u8 *addr, 860252190Srpaulo struct p2p_message *msg); 861252190Srpaulovoid p2p_add_dev_info(struct p2p_data *p2p, const u8 *addr, 862252190Srpaulo struct p2p_device *dev, struct p2p_message *msg); 863252190Srpauloint p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, 864281806Srpaulo struct os_reltime *rx_time, int level, const u8 *ies, 865252190Srpaulo size_t ies_len, int scan_res); 866252190Srpaulostruct p2p_device * p2p_get_device(struct p2p_data *p2p, const u8 *addr); 867252190Srpaulostruct p2p_device * p2p_get_device_interface(struct p2p_data *p2p, 868252190Srpaulo const u8 *addr); 869281806Srpaulovoid p2p_go_neg_failed(struct p2p_data *p2p, int status); 870252190Srpaulovoid p2p_go_complete(struct p2p_data *p2p, struct p2p_device *peer); 871252190Srpauloint p2p_match_dev_type(struct p2p_data *p2p, struct wpabuf *wps); 872252190Srpauloint dev_type_list_match(const u8 *dev_type, const u8 *req_dev_type[], 873252190Srpaulo size_t num_req_dev_type); 874289549Srpaulostruct wpabuf * p2p_build_probe_resp_ies(struct p2p_data *p2p, 875289549Srpaulo const u8 *query_hash, 876289549Srpaulo u8 query_count); 877252190Srpaulovoid p2p_build_ssid(struct p2p_data *p2p, u8 *ssid, size_t *ssid_len); 878252190Srpauloint p2p_send_action(struct p2p_data *p2p, unsigned int freq, const u8 *dst, 879252190Srpaulo const u8 *src, const u8 *bssid, const u8 *buf, 880252190Srpaulo size_t len, unsigned int wait_time); 881252190Srpaulovoid p2p_stop_listen_for_freq(struct p2p_data *p2p, int freq); 882281806Srpauloint p2p_prepare_channel(struct p2p_data *p2p, struct p2p_device *dev, 883281806Srpaulo unsigned int force_freq, unsigned int pref_freq, 884281806Srpaulo int go); 885281806Srpaulovoid p2p_go_neg_wait_timeout(void *eloop_ctx, void *timeout_ctx); 886281806Srpauloint p2p_go_select_channel(struct p2p_data *p2p, struct p2p_device *dev, 887281806Srpaulo u8 *status); 888281806Srpaulovoid p2p_dbg(struct p2p_data *p2p, const char *fmt, ...) 889281806SrpauloPRINTF_FORMAT(2, 3); 890281806Srpaulovoid p2p_info(struct p2p_data *p2p, const char *fmt, ...) 891281806SrpauloPRINTF_FORMAT(2, 3); 892281806Srpaulovoid p2p_err(struct p2p_data *p2p, const char *fmt, ...) 893281806SrpauloPRINTF_FORMAT(2, 3); 894252190Srpaulo 895252190Srpaulo#endif /* P2P_I_H */ 896