1f05cddf9SRui Paulo /* 2f05cddf9SRui Paulo * P2P - Internal definitions for P2P module 3f05cddf9SRui Paulo * Copyright (c) 2009-2010, Atheros Communications 4f05cddf9SRui Paulo * 5f05cddf9SRui Paulo * This software may be distributed under the terms of the BSD license. 6f05cddf9SRui Paulo * See README for more details. 7f05cddf9SRui Paulo */ 8f05cddf9SRui Paulo 9f05cddf9SRui Paulo #ifndef P2P_I_H 10f05cddf9SRui Paulo #define P2P_I_H 11f05cddf9SRui Paulo 12f05cddf9SRui Paulo #include "utils/list.h" 13*a90b9d01SCy Schubert #include "drivers/driver.h" 14f05cddf9SRui Paulo #include "p2p.h" 15f05cddf9SRui Paulo 165b9c547cSRui Paulo #define P2P_GO_NEG_CNF_MAX_RETRY_COUNT 1 175b9c547cSRui Paulo 18325151a3SRui Paulo /* 19325151a3SRui Paulo * A threshold (in seconds) to prefer a direct Probe Response frame from a P2P 20325151a3SRui Paulo * Device over the P2P Client Info received from a GO. 21325151a3SRui Paulo */ 22325151a3SRui Paulo #define P2P_DEV_GROUP_CLIENT_RESP_THRESHOLD 1 23325151a3SRui Paulo 245b9c547cSRui Paulo enum p2p_role_indication; 255b9c547cSRui Paulo 265b9c547cSRui Paulo /* 275b9c547cSRui Paulo * To force Service Instances to fit within a single P2P Tag, MAX_SVC_ADV_LEN 285b9c547cSRui Paulo * must equal 248 or less. Must have a minimum size of 19. 295b9c547cSRui Paulo */ 305b9c547cSRui Paulo #define MAX_SVC_ADV_LEN 600 315b9c547cSRui Paulo #define MAX_SVC_ADV_IE_LEN (9 + MAX_SVC_ADV_LEN + (5 * (MAX_SVC_ADV_LEN / 240))) 325b9c547cSRui Paulo 33f05cddf9SRui Paulo enum p2p_go_state { 34f05cddf9SRui Paulo UNKNOWN_GO, 35f05cddf9SRui Paulo LOCAL_GO, 36f05cddf9SRui Paulo REMOTE_GO 37f05cddf9SRui Paulo }; 38f05cddf9SRui Paulo 39f05cddf9SRui Paulo /** 40f05cddf9SRui Paulo * struct p2p_device - P2P Device data (internal to P2P module) 41f05cddf9SRui Paulo */ 42f05cddf9SRui Paulo struct p2p_device { 43f05cddf9SRui Paulo struct dl_list list; 445b9c547cSRui Paulo struct os_reltime last_seen; 45f05cddf9SRui Paulo int listen_freq; 465b9c547cSRui Paulo int oob_go_neg_freq; 47f05cddf9SRui Paulo enum p2p_wps_method wps_method; 485b9c547cSRui Paulo u16 oob_pw_id; 49f05cddf9SRui Paulo 50f05cddf9SRui Paulo struct p2p_peer_info info; 51f05cddf9SRui Paulo 52f05cddf9SRui Paulo /* 53f05cddf9SRui Paulo * If the peer was discovered based on an interface address (e.g., GO 54f05cddf9SRui Paulo * from Beacon/Probe Response), the interface address is stored here. 55f05cddf9SRui Paulo * p2p_device_addr must still be set in such a case to the unique 56f05cddf9SRui Paulo * identifier for the P2P Device. 57325151a3SRui Paulo * 58325151a3SRui Paulo * This field is also used during P2PS PD to store the intended GO 59325151a3SRui Paulo * address of the peer. 60f05cddf9SRui Paulo */ 61f05cddf9SRui Paulo u8 interface_addr[ETH_ALEN]; 62f05cddf9SRui Paulo 63f05cddf9SRui Paulo /* 64f05cddf9SRui Paulo * P2P Device Address of the GO in whose group this P2P Device is a 65f05cddf9SRui Paulo * client. 66f05cddf9SRui Paulo */ 67f05cddf9SRui Paulo u8 member_in_go_dev[ETH_ALEN]; 68f05cddf9SRui Paulo 69f05cddf9SRui Paulo /* 70f05cddf9SRui Paulo * P2P Interface Address of the GO in whose group this P2P Device is a 71f05cddf9SRui Paulo * client. 72f05cddf9SRui Paulo */ 73f05cddf9SRui Paulo u8 member_in_go_iface[ETH_ALEN]; 74f05cddf9SRui Paulo 75f05cddf9SRui Paulo int go_neg_req_sent; 76f05cddf9SRui Paulo enum p2p_go_state go_state; 77f05cddf9SRui Paulo u8 dialog_token; 785b9c547cSRui Paulo u8 tie_breaker; 79f05cddf9SRui Paulo u8 intended_addr[ETH_ALEN]; 80f05cddf9SRui Paulo 81f05cddf9SRui Paulo char country[3]; 82f05cddf9SRui Paulo struct p2p_channels channels; 83f05cddf9SRui Paulo int oper_freq; 84325151a3SRui Paulo u8 oper_ssid[SSID_MAX_LEN]; 85f05cddf9SRui Paulo size_t oper_ssid_len; 86f05cddf9SRui Paulo 87f05cddf9SRui Paulo /** 88f05cddf9SRui Paulo * req_config_methods - Pending provision discovery methods 89f05cddf9SRui Paulo */ 90f05cddf9SRui Paulo u16 req_config_methods; 91f05cddf9SRui Paulo 92f05cddf9SRui Paulo /** 93f05cddf9SRui Paulo * wps_prov_info - Stored provisioning WPS config method 94f05cddf9SRui Paulo * 95f05cddf9SRui Paulo * This is used to store pending WPS config method between Provisioning 96f05cddf9SRui Paulo * Discovery and connection to a running group. 97f05cddf9SRui Paulo */ 98f05cddf9SRui Paulo u16 wps_prov_info; 99f05cddf9SRui Paulo 100f05cddf9SRui Paulo #define P2P_DEV_PROBE_REQ_ONLY BIT(0) 101f05cddf9SRui Paulo #define P2P_DEV_REPORTED BIT(1) 102f05cddf9SRui Paulo #define P2P_DEV_NOT_YET_READY BIT(2) 103f05cddf9SRui Paulo #define P2P_DEV_PD_PEER_DISPLAY BIT(5) 104f05cddf9SRui Paulo #define P2P_DEV_PD_PEER_KEYPAD BIT(6) 105f05cddf9SRui Paulo #define P2P_DEV_USER_REJECTED BIT(7) 106f05cddf9SRui Paulo #define P2P_DEV_PEER_WAITING_RESPONSE BIT(8) 107f05cddf9SRui Paulo #define P2P_DEV_PREFER_PERSISTENT_GROUP BIT(9) 108f05cddf9SRui Paulo #define P2P_DEV_WAIT_GO_NEG_RESPONSE BIT(10) 109f05cddf9SRui Paulo #define P2P_DEV_WAIT_GO_NEG_CONFIRM BIT(11) 110f05cddf9SRui Paulo #define P2P_DEV_GROUP_CLIENT_ONLY BIT(12) 111f05cddf9SRui Paulo #define P2P_DEV_FORCE_FREQ BIT(13) 112f05cddf9SRui Paulo #define P2P_DEV_PD_FOR_JOIN BIT(14) 113f05cddf9SRui Paulo #define P2P_DEV_REPORTED_ONCE BIT(15) 114f05cddf9SRui Paulo #define P2P_DEV_PREFER_PERSISTENT_RECONN BIT(16) 115f05cddf9SRui Paulo #define P2P_DEV_PD_BEFORE_GO_NEG BIT(17) 1165b9c547cSRui Paulo #define P2P_DEV_NO_PREF_CHAN BIT(18) 1175b9c547cSRui Paulo #define P2P_DEV_WAIT_INV_REQ_ACK BIT(19) 1185b9c547cSRui Paulo #define P2P_DEV_P2PS_REPORTED BIT(20) 1195b9c547cSRui Paulo #define P2P_DEV_PD_PEER_P2PS BIT(21) 120325151a3SRui Paulo #define P2P_DEV_LAST_SEEN_AS_GROUP_CLIENT BIT(22) 121325151a3SRui Paulo 122f05cddf9SRui Paulo unsigned int flags; 123f05cddf9SRui Paulo 124f05cddf9SRui Paulo int status; /* enum p2p_status_code */ 125f05cddf9SRui Paulo unsigned int wait_count; 126f05cddf9SRui Paulo unsigned int connect_reqs; 127f05cddf9SRui Paulo unsigned int invitation_reqs; 1285b9c547cSRui Paulo unsigned int sd_reqs; 129f05cddf9SRui Paulo 130f05cddf9SRui Paulo u16 ext_listen_period; 131f05cddf9SRui Paulo u16 ext_listen_interval; 132f05cddf9SRui Paulo 133f05cddf9SRui Paulo u8 go_timeout; 134f05cddf9SRui Paulo u8 client_timeout; 1355b9c547cSRui Paulo 1365b9c547cSRui Paulo /** 1375b9c547cSRui Paulo * go_neg_conf_sent - Number of GO Negotiation Confirmation retries 1385b9c547cSRui Paulo */ 1395b9c547cSRui Paulo u8 go_neg_conf_sent; 1405b9c547cSRui Paulo 1415b9c547cSRui Paulo /** 1425b9c547cSRui Paulo * freq - Frquency on which the GO Negotiation Confirmation is sent 1435b9c547cSRui Paulo */ 1445b9c547cSRui Paulo int go_neg_conf_freq; 1455b9c547cSRui Paulo 1465b9c547cSRui Paulo /** 1475b9c547cSRui Paulo * go_neg_conf - GO Negotiation Confirmation frame 1485b9c547cSRui Paulo */ 1495b9c547cSRui Paulo struct wpabuf *go_neg_conf; 1505b9c547cSRui Paulo 1515b9c547cSRui Paulo int sd_pending_bcast_queries; 152*a90b9d01SCy Schubert bool support_6ghz; 153f05cddf9SRui Paulo }; 154f05cddf9SRui Paulo 155f05cddf9SRui Paulo struct p2p_sd_query { 156f05cddf9SRui Paulo struct p2p_sd_query *next; 157f05cddf9SRui Paulo u8 peer[ETH_ALEN]; 158f05cddf9SRui Paulo int for_all_peers; 159f05cddf9SRui Paulo int wsd; /* Wi-Fi Display Service Discovery Request */ 160f05cddf9SRui Paulo struct wpabuf *tlvs; 161f05cddf9SRui Paulo }; 162f05cddf9SRui Paulo 163f05cddf9SRui Paulo /** 164f05cddf9SRui Paulo * struct p2p_data - P2P module data (internal to P2P module) 165f05cddf9SRui Paulo */ 166f05cddf9SRui Paulo struct p2p_data { 167f05cddf9SRui Paulo /** 168f05cddf9SRui Paulo * cfg - P2P module configuration 169f05cddf9SRui Paulo * 170f05cddf9SRui Paulo * This is included in the same memory allocation with the 171f05cddf9SRui Paulo * struct p2p_data and as such, must not be freed separately. 172f05cddf9SRui Paulo */ 173f05cddf9SRui Paulo struct p2p_config *cfg; 174f05cddf9SRui Paulo 175f05cddf9SRui Paulo /** 176f05cddf9SRui Paulo * state - The current P2P state 177f05cddf9SRui Paulo */ 178f05cddf9SRui Paulo enum p2p_state { 179f05cddf9SRui Paulo /** 180f05cddf9SRui Paulo * P2P_IDLE - Idle 181f05cddf9SRui Paulo */ 182f05cddf9SRui Paulo P2P_IDLE, 183f05cddf9SRui Paulo 184f05cddf9SRui Paulo /** 185f05cddf9SRui Paulo * P2P_SEARCH - Search (Device Discovery) 186f05cddf9SRui Paulo */ 187f05cddf9SRui Paulo P2P_SEARCH, 188f05cddf9SRui Paulo 189f05cddf9SRui Paulo /** 190f05cddf9SRui Paulo * P2P_CONNECT - Trying to start GO Negotiation 191f05cddf9SRui Paulo */ 192f05cddf9SRui Paulo P2P_CONNECT, 193f05cddf9SRui Paulo 194f05cddf9SRui Paulo /** 195f05cddf9SRui Paulo * P2P_CONNECT_LISTEN - Listen during GO Negotiation start 196f05cddf9SRui Paulo */ 197f05cddf9SRui Paulo P2P_CONNECT_LISTEN, 198f05cddf9SRui Paulo 199f05cddf9SRui Paulo /** 200f05cddf9SRui Paulo * P2P_GO_NEG - In GO Negotiation 201f05cddf9SRui Paulo */ 202f05cddf9SRui Paulo P2P_GO_NEG, 203f05cddf9SRui Paulo 204f05cddf9SRui Paulo /** 205f05cddf9SRui Paulo * P2P_LISTEN_ONLY - Listen only 206f05cddf9SRui Paulo */ 207f05cddf9SRui Paulo P2P_LISTEN_ONLY, 208f05cddf9SRui Paulo 209f05cddf9SRui Paulo /** 210f05cddf9SRui Paulo * P2P_WAIT_PEER_CONNECT - Waiting peer in List for GO Neg 211f05cddf9SRui Paulo */ 212f05cddf9SRui Paulo P2P_WAIT_PEER_CONNECT, 213f05cddf9SRui Paulo 214f05cddf9SRui Paulo /** 215f05cddf9SRui Paulo * P2P_WAIT_PEER_IDLE - Waiting peer idle for GO Neg 216f05cddf9SRui Paulo */ 217f05cddf9SRui Paulo P2P_WAIT_PEER_IDLE, 218f05cddf9SRui Paulo 219f05cddf9SRui Paulo /** 220f05cddf9SRui Paulo * P2P_SD_DURING_FIND - Service Discovery during find 221f05cddf9SRui Paulo */ 222f05cddf9SRui Paulo P2P_SD_DURING_FIND, 223f05cddf9SRui Paulo 224f05cddf9SRui Paulo /** 225f05cddf9SRui Paulo * P2P_PROVISIONING - Provisioning (during group formation) 226f05cddf9SRui Paulo */ 227f05cddf9SRui Paulo P2P_PROVISIONING, 228f05cddf9SRui Paulo 229f05cddf9SRui Paulo /** 230f05cddf9SRui Paulo * P2P_PD_DURING_FIND - Provision Discovery during find 231f05cddf9SRui Paulo */ 232f05cddf9SRui Paulo P2P_PD_DURING_FIND, 233f05cddf9SRui Paulo 234f05cddf9SRui Paulo /** 235f05cddf9SRui Paulo * P2P_INVITE - Trying to start Invite 236f05cddf9SRui Paulo */ 237f05cddf9SRui Paulo P2P_INVITE, 238f05cddf9SRui Paulo 239f05cddf9SRui Paulo /** 240f05cddf9SRui Paulo * P2P_INVITE_LISTEN - Listen during Invite 241f05cddf9SRui Paulo */ 242f05cddf9SRui Paulo P2P_INVITE_LISTEN, 243f05cddf9SRui Paulo } state; 244f05cddf9SRui Paulo 245f05cddf9SRui Paulo /** 246f05cddf9SRui Paulo * min_disc_int - minDiscoverableInterval 247f05cddf9SRui Paulo */ 248f05cddf9SRui Paulo int min_disc_int; 249f05cddf9SRui Paulo 250f05cddf9SRui Paulo /** 251f05cddf9SRui Paulo * max_disc_int - maxDiscoverableInterval 252f05cddf9SRui Paulo */ 253f05cddf9SRui Paulo int max_disc_int; 254f05cddf9SRui Paulo 255f05cddf9SRui Paulo /** 256f05cddf9SRui Paulo * max_disc_tu - Maximum number of TUs for discoverable interval 257f05cddf9SRui Paulo */ 258f05cddf9SRui Paulo int max_disc_tu; 259f05cddf9SRui Paulo 260f05cddf9SRui Paulo /** 261f05cddf9SRui Paulo * devices - List of known P2P Device peers 262f05cddf9SRui Paulo */ 263f05cddf9SRui Paulo struct dl_list devices; 264f05cddf9SRui Paulo 265f05cddf9SRui Paulo /** 266f05cddf9SRui Paulo * go_neg_peer - Pointer to GO Negotiation peer 267f05cddf9SRui Paulo */ 268f05cddf9SRui Paulo struct p2p_device *go_neg_peer; 269f05cddf9SRui Paulo 270f05cddf9SRui Paulo /** 271f05cddf9SRui Paulo * invite_peer - Pointer to Invite peer 272f05cddf9SRui Paulo */ 273f05cddf9SRui Paulo struct p2p_device *invite_peer; 274f05cddf9SRui Paulo 2755b9c547cSRui Paulo /** 2765b9c547cSRui Paulo * last_p2p_find_oper - Pointer to last pre-find operation peer 2775b9c547cSRui Paulo */ 2785b9c547cSRui Paulo struct p2p_device *last_p2p_find_oper; 2795b9c547cSRui Paulo 280f05cddf9SRui Paulo const u8 *invite_go_dev_addr; 281f05cddf9SRui Paulo u8 invite_go_dev_addr_buf[ETH_ALEN]; 2825b9c547cSRui Paulo int invite_dev_pw_id; 2835b9c547cSRui Paulo 2845b9c547cSRui Paulo unsigned int retry_invite_req:1; 2855b9c547cSRui Paulo unsigned int retry_invite_req_sent:1; 286f05cddf9SRui Paulo 287f05cddf9SRui Paulo /** 288f05cddf9SRui Paulo * sd_peer - Pointer to Service Discovery peer 289f05cddf9SRui Paulo */ 290f05cddf9SRui Paulo struct p2p_device *sd_peer; 291f05cddf9SRui Paulo 292f05cddf9SRui Paulo /** 293f05cddf9SRui Paulo * sd_query - Pointer to Service Discovery query 294f05cddf9SRui Paulo */ 295f05cddf9SRui Paulo struct p2p_sd_query *sd_query; 296f05cddf9SRui Paulo 2975b9c547cSRui Paulo /** 2985b9c547cSRui Paulo * num_p2p_sd_queries - Total number of broadcast SD queries present in 2995b9c547cSRui Paulo * the list 3005b9c547cSRui Paulo */ 3015b9c547cSRui Paulo int num_p2p_sd_queries; 3025b9c547cSRui Paulo 303780fb4a2SCy Schubert /** 304780fb4a2SCy Schubert * sd_query_no_ack - The first peer (Dev Addr) that did not ACK SD Query 305780fb4a2SCy Schubert * 306780fb4a2SCy Schubert * This is used to track the first peer that did not ACK an SD Query 307780fb4a2SCy Schubert * within a single P2P Search iteration. All zeros address means no such 308780fb4a2SCy Schubert * peer was yet seen. This information is used to allow a new Listen and 309780fb4a2SCy Schubert * Search phases to be once every pending SD Query has been sent once to 310780fb4a2SCy Schubert * each peer instead of looping all pending attempts continuously until 311780fb4a2SCy Schubert * running out of retry maximums. 312780fb4a2SCy Schubert */ 313780fb4a2SCy Schubert u8 sd_query_no_ack[ETH_ALEN]; 314780fb4a2SCy Schubert 315f05cddf9SRui Paulo /* GO Negotiation data */ 316f05cddf9SRui Paulo 317f05cddf9SRui Paulo /** 318f05cddf9SRui Paulo * intended_addr - Local Intended P2P Interface Address 319f05cddf9SRui Paulo * 320f05cddf9SRui Paulo * This address is used during group owner negotiation as the Intended 321f05cddf9SRui Paulo * P2P Interface Address and the group interface will be created with 322f05cddf9SRui Paulo * address as the local address in case of successfully completed 323f05cddf9SRui Paulo * negotiation. 324f05cddf9SRui Paulo */ 325f05cddf9SRui Paulo u8 intended_addr[ETH_ALEN]; 326f05cddf9SRui Paulo 327f05cddf9SRui Paulo /** 328f05cddf9SRui Paulo * go_intent - Local GO Intent to be used during GO Negotiation 329f05cddf9SRui Paulo */ 330f05cddf9SRui Paulo u8 go_intent; 331f05cddf9SRui Paulo 332f05cddf9SRui Paulo /** 333f05cddf9SRui Paulo * next_tie_breaker - Next tie-breaker value to use in GO Negotiation 334f05cddf9SRui Paulo */ 335f05cddf9SRui Paulo u8 next_tie_breaker; 336f05cddf9SRui Paulo 337f05cddf9SRui Paulo /** 338f05cddf9SRui Paulo * ssid - Selected SSID for GO Negotiation (if local end will be GO) 339f05cddf9SRui Paulo */ 340325151a3SRui Paulo u8 ssid[SSID_MAX_LEN]; 341f05cddf9SRui Paulo 342f05cddf9SRui Paulo /** 343f05cddf9SRui Paulo * ssid_len - ssid length in octets 344f05cddf9SRui Paulo */ 345f05cddf9SRui Paulo size_t ssid_len; 346f05cddf9SRui Paulo 347f05cddf9SRui Paulo /** 348f05cddf9SRui Paulo * ssid_set - Whether SSID is already set for GO Negotiation 349f05cddf9SRui Paulo */ 350f05cddf9SRui Paulo int ssid_set; 351f05cddf9SRui Paulo 352f05cddf9SRui Paulo /** 353f05cddf9SRui Paulo * Regulatory class for own operational channel 354f05cddf9SRui Paulo */ 355f05cddf9SRui Paulo u8 op_reg_class; 356f05cddf9SRui Paulo 357f05cddf9SRui Paulo /** 358f05cddf9SRui Paulo * op_channel - Own operational channel 359f05cddf9SRui Paulo */ 360f05cddf9SRui Paulo u8 op_channel; 361f05cddf9SRui Paulo 362f05cddf9SRui Paulo /** 363f05cddf9SRui Paulo * channels - Own supported regulatory classes and channels 364f05cddf9SRui Paulo * 365f05cddf9SRui Paulo * List of supposerted channels per regulatory class. The regulatory 366f05cddf9SRui Paulo * classes are defined in IEEE Std 802.11-2007 Annex J and the 367f05cddf9SRui Paulo * numbering of the clases depends on the configured country code. 368f05cddf9SRui Paulo */ 369f05cddf9SRui Paulo struct p2p_channels channels; 370f05cddf9SRui Paulo 3715b9c547cSRui Paulo struct wpa_freq_range_list no_go_freq; 3725b9c547cSRui Paulo 373f05cddf9SRui Paulo enum p2p_pending_action_state { 374f05cddf9SRui Paulo P2P_NO_PENDING_ACTION, 375f05cddf9SRui Paulo P2P_PENDING_GO_NEG_REQUEST, 376f05cddf9SRui Paulo P2P_PENDING_GO_NEG_RESPONSE, 377f05cddf9SRui Paulo P2P_PENDING_GO_NEG_RESPONSE_FAILURE, 378f05cddf9SRui Paulo P2P_PENDING_GO_NEG_CONFIRM, 379f05cddf9SRui Paulo P2P_PENDING_SD, 380f05cddf9SRui Paulo P2P_PENDING_PD, 3815b9c547cSRui Paulo P2P_PENDING_PD_RESPONSE, 382f05cddf9SRui Paulo P2P_PENDING_INVITATION_REQUEST, 383f05cddf9SRui Paulo P2P_PENDING_INVITATION_RESPONSE, 384f05cddf9SRui Paulo P2P_PENDING_DEV_DISC_REQUEST, 385f05cddf9SRui Paulo P2P_PENDING_DEV_DISC_RESPONSE, 386f05cddf9SRui Paulo P2P_PENDING_GO_DISC_REQ 387f05cddf9SRui Paulo } pending_action_state; 388f05cddf9SRui Paulo 389f05cddf9SRui Paulo unsigned int pending_listen_freq; 390f05cddf9SRui Paulo unsigned int pending_listen_sec; 391f05cddf9SRui Paulo unsigned int pending_listen_usec; 392*a90b9d01SCy Schubert bool pending_listen_wait_drv; 393f05cddf9SRui Paulo 394f05cddf9SRui Paulo u8 dev_capab; 395f05cddf9SRui Paulo 396f05cddf9SRui Paulo int in_listen; 397f05cddf9SRui Paulo int drv_in_listen; 398f05cddf9SRui Paulo 399f05cddf9SRui Paulo /** 400f05cddf9SRui Paulo * sd_queries - Pending service discovery queries 401f05cddf9SRui Paulo */ 402f05cddf9SRui Paulo struct p2p_sd_query *sd_queries; 403f05cddf9SRui Paulo 404f05cddf9SRui Paulo /** 405f05cddf9SRui Paulo * srv_update_indic - Service Update Indicator for local services 406f05cddf9SRui Paulo */ 407f05cddf9SRui Paulo u16 srv_update_indic; 408f05cddf9SRui Paulo 409f05cddf9SRui Paulo struct wpabuf *sd_resp; /* Fragmented SD response */ 410f05cddf9SRui Paulo u8 sd_resp_addr[ETH_ALEN]; 411f05cddf9SRui Paulo u8 sd_resp_dialog_token; 412f05cddf9SRui Paulo size_t sd_resp_pos; /* Offset in sd_resp */ 413f05cddf9SRui Paulo u8 sd_frag_id; 414f05cddf9SRui Paulo 415f05cddf9SRui Paulo struct wpabuf *sd_rx_resp; /* Reassembled SD response */ 416f05cddf9SRui Paulo u16 sd_rx_update_indic; 417f05cddf9SRui Paulo 418f05cddf9SRui Paulo /* P2P Invitation data */ 419f05cddf9SRui Paulo enum p2p_invite_role inv_role; 420f05cddf9SRui Paulo u8 inv_bssid[ETH_ALEN]; 421f05cddf9SRui Paulo int inv_bssid_set; 422325151a3SRui Paulo u8 inv_ssid[SSID_MAX_LEN]; 423f05cddf9SRui Paulo size_t inv_ssid_len; 424f05cddf9SRui Paulo u8 inv_sa[ETH_ALEN]; 425f05cddf9SRui Paulo u8 inv_group_bssid[ETH_ALEN]; 426f05cddf9SRui Paulo u8 *inv_group_bssid_ptr; 427f05cddf9SRui Paulo u8 inv_go_dev_addr[ETH_ALEN]; 428f05cddf9SRui Paulo u8 inv_status; 429f05cddf9SRui Paulo int inv_op_freq; 430f05cddf9SRui Paulo int inv_persistent; 431f05cddf9SRui Paulo 432f05cddf9SRui Paulo enum p2p_discovery_type find_type; 43385732ac8SCy Schubert int find_specified_freq; 434f05cddf9SRui Paulo unsigned int last_p2p_find_timeout; 435f05cddf9SRui Paulo u8 last_prog_scan_class; 436f05cddf9SRui Paulo u8 last_prog_scan_chan; 43785732ac8SCy Schubert unsigned int find_pending_full:1; 438f05cddf9SRui Paulo int p2p_scan_running; 439f05cddf9SRui Paulo enum p2p_after_scan { 440f05cddf9SRui Paulo P2P_AFTER_SCAN_NOTHING, 441f05cddf9SRui Paulo P2P_AFTER_SCAN_LISTEN, 442f05cddf9SRui Paulo P2P_AFTER_SCAN_CONNECT 443f05cddf9SRui Paulo } start_after_scan; 444f05cddf9SRui Paulo u8 after_scan_peer[ETH_ALEN]; 4455b9c547cSRui Paulo unsigned int send_action_in_progress:1; 446f05cddf9SRui Paulo 447f05cddf9SRui Paulo /* Requested device types for find/search */ 448f05cddf9SRui Paulo unsigned int num_req_dev_types; 449f05cddf9SRui Paulo u8 *req_dev_types; 450f05cddf9SRui Paulo u8 *find_dev_id; 451f05cddf9SRui Paulo u8 find_dev_id_buf[ETH_ALEN]; 452f05cddf9SRui Paulo 4535b9c547cSRui Paulo struct os_reltime find_start; /* time of last p2p_find start */ 4545b9c547cSRui Paulo 455f05cddf9SRui Paulo struct p2p_group **groups; 456f05cddf9SRui Paulo size_t num_groups; 457f05cddf9SRui Paulo 458f05cddf9SRui Paulo struct p2p_device *pending_client_disc_go; 459f05cddf9SRui Paulo u8 pending_client_disc_addr[ETH_ALEN]; 460f05cddf9SRui Paulo u8 pending_dev_disc_dialog_token; 461f05cddf9SRui Paulo u8 pending_dev_disc_addr[ETH_ALEN]; 462f05cddf9SRui Paulo int pending_dev_disc_freq; 463f05cddf9SRui Paulo unsigned int pending_client_disc_freq; 464f05cddf9SRui Paulo 465f05cddf9SRui Paulo int ext_listen_only; 466f05cddf9SRui Paulo unsigned int ext_listen_period; 467f05cddf9SRui Paulo unsigned int ext_listen_interval; 468f05cddf9SRui Paulo unsigned int ext_listen_interval_sec; 469f05cddf9SRui Paulo unsigned int ext_listen_interval_usec; 470f05cddf9SRui Paulo 471f05cddf9SRui Paulo u8 peer_filter[ETH_ALEN]; 472f05cddf9SRui Paulo 473f05cddf9SRui Paulo int cross_connect; 474f05cddf9SRui Paulo 475f05cddf9SRui Paulo int best_freq_24; 476f05cddf9SRui Paulo int best_freq_5; 477f05cddf9SRui Paulo int best_freq_overall; 4785b9c547cSRui Paulo int own_freq_preference; 479f05cddf9SRui Paulo 480f05cddf9SRui Paulo /** 481f05cddf9SRui Paulo * wps_vendor_ext - WPS Vendor Extensions to add 482f05cddf9SRui Paulo */ 483f05cddf9SRui Paulo struct wpabuf *wps_vendor_ext[P2P_MAX_WPS_VENDOR_EXT]; 484f05cddf9SRui Paulo 485f05cddf9SRui Paulo /* 486f05cddf9SRui Paulo * user_initiated_pd - Whether a PD request is user initiated or not. 487f05cddf9SRui Paulo */ 488f05cddf9SRui Paulo u8 user_initiated_pd; 489f05cddf9SRui Paulo 490f05cddf9SRui Paulo /* 491f05cddf9SRui Paulo * Keep track of which peer a given PD request was sent to. 492f05cddf9SRui Paulo * Used to raise a timeout alert in case there is no response. 493f05cddf9SRui Paulo */ 494f05cddf9SRui Paulo u8 pending_pd_devaddr[ETH_ALEN]; 495f05cddf9SRui Paulo 496f05cddf9SRui Paulo /* 497f05cddf9SRui Paulo * Retry counter for provision discovery requests when issued 498f05cddf9SRui Paulo * in IDLE state. 499f05cddf9SRui Paulo */ 500f05cddf9SRui Paulo int pd_retries; 501f05cddf9SRui Paulo 5025b9c547cSRui Paulo /** 5035b9c547cSRui Paulo * pd_force_freq - Forced frequency for PD retries or 0 to auto-select 5045b9c547cSRui Paulo * 5055b9c547cSRui Paulo * This is is used during PD retries for join-a-group case to use the 5065b9c547cSRui Paulo * correct operating frequency determined from a BSS entry for the GO. 5075b9c547cSRui Paulo */ 5085b9c547cSRui Paulo int pd_force_freq; 5095b9c547cSRui Paulo 510f05cddf9SRui Paulo u8 go_timeout; 511f05cddf9SRui Paulo u8 client_timeout; 512f05cddf9SRui Paulo 513f05cddf9SRui Paulo /* Extra delay in milliseconds between search iterations */ 514f05cddf9SRui Paulo unsigned int search_delay; 515f05cddf9SRui Paulo int in_search_delay; 516f05cddf9SRui Paulo 5175b9c547cSRui Paulo u8 pending_reg_class; 5185b9c547cSRui Paulo u8 pending_channel; 5195b9c547cSRui Paulo u8 pending_channel_forced; 5205b9c547cSRui Paulo 5215b9c547cSRui Paulo /* ASP Support */ 5225b9c547cSRui Paulo struct p2ps_advertisement *p2ps_adv_list; 5235b9c547cSRui Paulo struct p2ps_provision *p2ps_prov; 5245b9c547cSRui Paulo u8 wild_card_hash[P2PS_HASH_LEN]; 5255b9c547cSRui Paulo u8 p2ps_seek; 526325151a3SRui Paulo u8 p2ps_seek_hash[P2P_MAX_QUERY_HASH * P2PS_HASH_LEN]; 5275b9c547cSRui Paulo u8 p2ps_seek_count; 5285b9c547cSRui Paulo 529f05cddf9SRui Paulo #ifdef CONFIG_WIFI_DISPLAY 530f05cddf9SRui Paulo struct wpabuf *wfd_ie_beacon; 531f05cddf9SRui Paulo struct wpabuf *wfd_ie_probe_req; 532f05cddf9SRui Paulo struct wpabuf *wfd_ie_probe_resp; 533f05cddf9SRui Paulo struct wpabuf *wfd_ie_assoc_req; 534f05cddf9SRui Paulo struct wpabuf *wfd_ie_invitation; 535f05cddf9SRui Paulo struct wpabuf *wfd_ie_prov_disc_req; 536f05cddf9SRui Paulo struct wpabuf *wfd_ie_prov_disc_resp; 537f05cddf9SRui Paulo struct wpabuf *wfd_ie_go_neg; 538f05cddf9SRui Paulo struct wpabuf *wfd_dev_info; 539f05cddf9SRui Paulo struct wpabuf *wfd_assoc_bssid; 540f05cddf9SRui Paulo struct wpabuf *wfd_coupled_sink_info; 54185732ac8SCy Schubert struct wpabuf *wfd_r2_dev_info; 542f05cddf9SRui Paulo #endif /* CONFIG_WIFI_DISPLAY */ 5435b9c547cSRui Paulo 5445b9c547cSRui Paulo u16 authorized_oob_dev_pw_id; 5455b9c547cSRui Paulo 5465b9c547cSRui Paulo struct wpabuf **vendor_elem; 547325151a3SRui Paulo 548*a90b9d01SCy Schubert struct weighted_pcl pref_freq_list[P2P_MAX_PREF_CHANNELS]; 549325151a3SRui Paulo unsigned int num_pref_freq; 55085732ac8SCy Schubert 55185732ac8SCy Schubert /* Override option for preferred operating channel in GO Negotiation */ 55285732ac8SCy Schubert u8 override_pref_op_class; 55385732ac8SCy Schubert u8 override_pref_channel; 554c1d255d3SCy Schubert bool p2p_6ghz_capable; 555c1d255d3SCy Schubert bool include_6ghz; 556c1d255d3SCy Schubert bool allow_6ghz; 557f05cddf9SRui Paulo }; 558f05cddf9SRui Paulo 559f05cddf9SRui Paulo /** 560f05cddf9SRui Paulo * struct p2p_message - Parsed P2P message (or P2P IE) 561f05cddf9SRui Paulo */ 562f05cddf9SRui Paulo struct p2p_message { 563f05cddf9SRui Paulo struct wpabuf *p2p_attributes; 564f05cddf9SRui Paulo struct wpabuf *wps_attributes; 565f05cddf9SRui Paulo struct wpabuf *wfd_subelems; 566f05cddf9SRui Paulo 567f05cddf9SRui Paulo u8 dialog_token; 568f05cddf9SRui Paulo 569f05cddf9SRui Paulo const u8 *capability; 570f05cddf9SRui Paulo const u8 *go_intent; 571f05cddf9SRui Paulo const u8 *status; 572f05cddf9SRui Paulo const u8 *listen_channel; 573f05cddf9SRui Paulo const u8 *operating_channel; 574f05cddf9SRui Paulo const u8 *channel_list; 575f05cddf9SRui Paulo u8 channel_list_len; 576f05cddf9SRui Paulo const u8 *config_timeout; 577f05cddf9SRui Paulo const u8 *intended_addr; 578f05cddf9SRui Paulo const u8 *group_bssid; 579f05cddf9SRui Paulo const u8 *invitation_flags; 580f05cddf9SRui Paulo 581f05cddf9SRui Paulo const u8 *group_info; 582f05cddf9SRui Paulo size_t group_info_len; 583f05cddf9SRui Paulo 584f05cddf9SRui Paulo const u8 *group_id; 585f05cddf9SRui Paulo size_t group_id_len; 586f05cddf9SRui Paulo 587f05cddf9SRui Paulo const u8 *device_id; 588f05cddf9SRui Paulo 589f05cddf9SRui Paulo const u8 *manageability; 590f05cddf9SRui Paulo 591f05cddf9SRui Paulo const u8 *noa; 592f05cddf9SRui Paulo size_t noa_len; 593f05cddf9SRui Paulo 594f05cddf9SRui Paulo const u8 *ext_listen_timing; 595f05cddf9SRui Paulo 596f05cddf9SRui Paulo const u8 *minor_reason_code; 597f05cddf9SRui Paulo 5985b9c547cSRui Paulo const u8 *oob_go_neg_channel; 5995b9c547cSRui Paulo 600f05cddf9SRui Paulo /* P2P Device Info */ 601f05cddf9SRui Paulo const u8 *p2p_device_info; 602f05cddf9SRui Paulo size_t p2p_device_info_len; 603f05cddf9SRui Paulo const u8 *p2p_device_addr; 604f05cddf9SRui Paulo const u8 *pri_dev_type; 605f05cddf9SRui Paulo u8 num_sec_dev_types; 606325151a3SRui Paulo char device_name[WPS_DEV_NAME_MAX_LEN + 1]; 607f05cddf9SRui Paulo u16 config_methods; 608f05cddf9SRui Paulo 609f05cddf9SRui Paulo /* WPS IE */ 610f05cddf9SRui Paulo u16 dev_password_id; 6115b9c547cSRui Paulo int dev_password_id_present; 612f05cddf9SRui Paulo u16 wps_config_methods; 613f05cddf9SRui Paulo const u8 *wps_pri_dev_type; 614f05cddf9SRui Paulo const u8 *wps_sec_dev_type_list; 615f05cddf9SRui Paulo size_t wps_sec_dev_type_list_len; 616f05cddf9SRui Paulo const u8 *wps_vendor_ext[P2P_MAX_WPS_VENDOR_EXT]; 617f05cddf9SRui Paulo size_t wps_vendor_ext_len[P2P_MAX_WPS_VENDOR_EXT]; 618f05cddf9SRui Paulo const u8 *manufacturer; 619f05cddf9SRui Paulo size_t manufacturer_len; 620f05cddf9SRui Paulo const u8 *model_name; 621f05cddf9SRui Paulo size_t model_name_len; 622f05cddf9SRui Paulo const u8 *model_number; 623f05cddf9SRui Paulo size_t model_number_len; 624f05cddf9SRui Paulo const u8 *serial_number; 625f05cddf9SRui Paulo size_t serial_number_len; 6265b9c547cSRui Paulo const u8 *oob_dev_password; 6275b9c547cSRui Paulo size_t oob_dev_password_len; 628f05cddf9SRui Paulo 629f05cddf9SRui Paulo /* DS Parameter Set IE */ 630f05cddf9SRui Paulo const u8 *ds_params; 631f05cddf9SRui Paulo 632f05cddf9SRui Paulo /* SSID IE */ 633f05cddf9SRui Paulo const u8 *ssid; 6345b9c547cSRui Paulo 6355b9c547cSRui Paulo /* P2PS */ 6365b9c547cSRui Paulo u8 service_hash_count; 6375b9c547cSRui Paulo const u8 *service_hash; 6385b9c547cSRui Paulo 6395b9c547cSRui Paulo const u8 *session_info; 6405b9c547cSRui Paulo size_t session_info_len; 6415b9c547cSRui Paulo 6425b9c547cSRui Paulo const u8 *conn_cap; 6435b9c547cSRui Paulo 6445b9c547cSRui Paulo const u8 *adv_id; 6455b9c547cSRui Paulo const u8 *adv_mac; 6465b9c547cSRui Paulo 6475b9c547cSRui Paulo const u8 *adv_service_instance; 6485b9c547cSRui Paulo size_t adv_service_instance_len; 6495b9c547cSRui Paulo 6505b9c547cSRui Paulo const u8 *session_id; 6515b9c547cSRui Paulo const u8 *session_mac; 6525b9c547cSRui Paulo 6535b9c547cSRui Paulo const u8 *feature_cap; 6545b9c547cSRui Paulo size_t feature_cap_len; 6555b9c547cSRui Paulo 6565b9c547cSRui Paulo const u8 *persistent_dev; 6575b9c547cSRui Paulo const u8 *persistent_ssid; 6585b9c547cSRui Paulo size_t persistent_ssid_len; 659325151a3SRui Paulo 660325151a3SRui Paulo const u8 *pref_freq_list; 661325151a3SRui Paulo size_t pref_freq_list_len; 662f05cddf9SRui Paulo }; 663f05cddf9SRui Paulo 664f05cddf9SRui Paulo 665f05cddf9SRui Paulo #define P2P_MAX_GROUP_ENTRIES 50 666f05cddf9SRui Paulo 667f05cddf9SRui Paulo struct p2p_group_info { 668f05cddf9SRui Paulo unsigned int num_clients; 669f05cddf9SRui Paulo struct p2p_client_info { 670f05cddf9SRui Paulo const u8 *p2p_device_addr; 671f05cddf9SRui Paulo const u8 *p2p_interface_addr; 672f05cddf9SRui Paulo u8 dev_capab; 673f05cddf9SRui Paulo u16 config_methods; 674f05cddf9SRui Paulo const u8 *pri_dev_type; 675f05cddf9SRui Paulo u8 num_sec_dev_types; 676f05cddf9SRui Paulo const u8 *sec_dev_types; 677f05cddf9SRui Paulo const char *dev_name; 678f05cddf9SRui Paulo size_t dev_name_len; 679f05cddf9SRui Paulo } client[P2P_MAX_GROUP_ENTRIES]; 680f05cddf9SRui Paulo }; 681f05cddf9SRui Paulo 682f05cddf9SRui Paulo 683f05cddf9SRui Paulo /* p2p_utils.c */ 684f05cddf9SRui Paulo int p2p_random(char *buf, size_t len); 6855b9c547cSRui Paulo int p2p_freq_to_channel(unsigned int freq, u8 *op_class, u8 *channel); 686f05cddf9SRui Paulo void p2p_channels_intersect(const struct p2p_channels *a, 687f05cddf9SRui Paulo const struct p2p_channels *b, 688f05cddf9SRui Paulo struct p2p_channels *res); 6895b9c547cSRui Paulo void p2p_channels_union_inplace(struct p2p_channels *res, 6905b9c547cSRui Paulo const struct p2p_channels *b); 6915b9c547cSRui Paulo void p2p_channels_union(const struct p2p_channels *a, 6925b9c547cSRui Paulo const struct p2p_channels *b, 6935b9c547cSRui Paulo struct p2p_channels *res); 6945b9c547cSRui Paulo void p2p_channels_remove_freqs(struct p2p_channels *chan, 6955b9c547cSRui Paulo const struct wpa_freq_range_list *list); 696f05cddf9SRui Paulo int p2p_channels_includes(const struct p2p_channels *channels, u8 reg_class, 697f05cddf9SRui Paulo u8 channel); 6985b9c547cSRui Paulo void p2p_channels_dump(struct p2p_data *p2p, const char *title, 6995b9c547cSRui Paulo const struct p2p_channels *chan); 7005b9c547cSRui Paulo int p2p_channel_select(struct p2p_channels *chans, const int *classes, 7015b9c547cSRui Paulo u8 *op_class, u8 *op_channel); 7025b9c547cSRui Paulo int p2p_channel_random_social(struct p2p_channels *chans, u8 *op_class, 7034bc52338SCy Schubert u8 *op_channel, 7044bc52338SCy Schubert struct wpa_freq_range_list *avoid_list, 7054bc52338SCy Schubert struct wpa_freq_range_list *disallow_list); 706c1d255d3SCy Schubert void p2p_copy_channels(struct p2p_channels *dst, const struct p2p_channels *src, 707c1d255d3SCy Schubert bool allow_6ghz); 708f05cddf9SRui Paulo 709f05cddf9SRui Paulo /* p2p_parse.c */ 710780fb4a2SCy Schubert void p2p_copy_filter_devname(char *dst, size_t dst_len, 711780fb4a2SCy Schubert const void *src, size_t src_len); 712f05cddf9SRui Paulo int p2p_parse_p2p_ie(const struct wpabuf *buf, struct p2p_message *msg); 713f05cddf9SRui Paulo int p2p_parse_ies(const u8 *data, size_t len, struct p2p_message *msg); 714f05cddf9SRui Paulo int p2p_parse(const u8 *data, size_t len, struct p2p_message *msg); 7155b9c547cSRui Paulo int p2p_parse_ies_separate(const u8 *wsc, size_t wsc_len, const u8 *p2p, 7165b9c547cSRui Paulo size_t p2p_len, struct p2p_message *msg); 717f05cddf9SRui Paulo void p2p_parse_free(struct p2p_message *msg); 718f05cddf9SRui Paulo int p2p_attr_text(struct wpabuf *data, char *buf, char *end); 719f05cddf9SRui Paulo int p2p_group_info_parse(const u8 *gi, size_t gi_len, 720f05cddf9SRui Paulo struct p2p_group_info *info); 721f05cddf9SRui Paulo 722f05cddf9SRui Paulo /* p2p_build.c */ 723f05cddf9SRui Paulo 724f05cddf9SRui Paulo struct p2p_noa_desc { 725f05cddf9SRui Paulo u8 count_type; 726f05cddf9SRui Paulo u32 duration; 727f05cddf9SRui Paulo u32 interval; 728f05cddf9SRui Paulo u32 start_time; 729f05cddf9SRui Paulo }; 730f05cddf9SRui Paulo 731f05cddf9SRui Paulo /* p2p_group.c */ 732f05cddf9SRui Paulo const u8 * p2p_group_get_interface_addr(struct p2p_group *group); 733f05cddf9SRui Paulo u8 p2p_group_presence_req(struct p2p_group *group, 734f05cddf9SRui Paulo const u8 *client_interface_addr, 735f05cddf9SRui Paulo const u8 *noa, size_t noa_len); 736f05cddf9SRui Paulo int p2p_group_is_group_id_match(struct p2p_group *group, const u8 *group_id, 737f05cddf9SRui Paulo size_t group_id_len); 738f05cddf9SRui Paulo void p2p_group_update_ies(struct p2p_group *group); 7395b9c547cSRui Paulo void p2p_group_force_beacon_update_ies(struct p2p_group *group); 740f05cddf9SRui Paulo struct wpabuf * p2p_group_get_wfd_ie(struct p2p_group *g); 7415b9c547cSRui Paulo void p2p_buf_add_group_info(struct p2p_group *group, struct wpabuf *buf, 7425b9c547cSRui Paulo int max_clients); 7435b9c547cSRui Paulo void p2p_group_buf_add_id(struct p2p_group *group, struct wpabuf *buf); 7445b9c547cSRui Paulo int p2p_group_get_freq(struct p2p_group *group); 745f05cddf9SRui Paulo 746f05cddf9SRui Paulo 747f05cddf9SRui Paulo void p2p_buf_add_action_hdr(struct wpabuf *buf, u8 subtype, u8 dialog_token); 748f05cddf9SRui Paulo void p2p_buf_add_public_action_hdr(struct wpabuf *buf, u8 subtype, 749f05cddf9SRui Paulo u8 dialog_token); 750f05cddf9SRui Paulo u8 * p2p_buf_add_ie_hdr(struct wpabuf *buf); 751f05cddf9SRui Paulo void p2p_buf_add_status(struct wpabuf *buf, u8 status); 752f05cddf9SRui Paulo void p2p_buf_add_device_info(struct wpabuf *buf, struct p2p_data *p2p, 753f05cddf9SRui Paulo struct p2p_device *peer); 754f05cddf9SRui Paulo void p2p_buf_add_device_id(struct wpabuf *buf, const u8 *dev_addr); 755f05cddf9SRui Paulo void p2p_buf_update_ie_hdr(struct wpabuf *buf, u8 *len); 756f05cddf9SRui Paulo void p2p_buf_add_capability(struct wpabuf *buf, u8 dev_capab, u8 group_capab); 757f05cddf9SRui Paulo void p2p_buf_add_go_intent(struct wpabuf *buf, u8 go_intent); 758f05cddf9SRui Paulo void p2p_buf_add_listen_channel(struct wpabuf *buf, const char *country, 759f05cddf9SRui Paulo u8 reg_class, u8 channel); 760f05cddf9SRui Paulo void p2p_buf_add_operating_channel(struct wpabuf *buf, const char *country, 761f05cddf9SRui Paulo u8 reg_class, u8 channel); 762f05cddf9SRui Paulo void p2p_buf_add_channel_list(struct wpabuf *buf, const char *country, 763*a90b9d01SCy Schubert struct p2p_channels *chan, bool is_6ghz_capab); 764f05cddf9SRui Paulo void p2p_buf_add_config_timeout(struct wpabuf *buf, u8 go_timeout, 765f05cddf9SRui Paulo u8 client_timeout); 766f05cddf9SRui Paulo void p2p_buf_add_intended_addr(struct wpabuf *buf, const u8 *interface_addr); 767f05cddf9SRui Paulo void p2p_buf_add_group_bssid(struct wpabuf *buf, const u8 *bssid); 768f05cddf9SRui Paulo void p2p_buf_add_group_id(struct wpabuf *buf, const u8 *dev_addr, 769f05cddf9SRui Paulo const u8 *ssid, size_t ssid_len); 770f05cddf9SRui Paulo void p2p_buf_add_invitation_flags(struct wpabuf *buf, u8 flags); 771f05cddf9SRui Paulo void p2p_buf_add_noa(struct wpabuf *buf, u8 noa_index, u8 opp_ps, u8 ctwindow, 772f05cddf9SRui Paulo struct p2p_noa_desc *desc1, struct p2p_noa_desc *desc2); 773f05cddf9SRui Paulo void p2p_buf_add_ext_listen_timing(struct wpabuf *buf, u16 period, 774f05cddf9SRui Paulo u16 interval); 775f05cddf9SRui Paulo void p2p_buf_add_p2p_interface(struct wpabuf *buf, struct p2p_data *p2p); 7765b9c547cSRui Paulo void p2p_buf_add_oob_go_neg_channel(struct wpabuf *buf, const char *country, 7775b9c547cSRui Paulo u8 oper_class, u8 channel, 7785b9c547cSRui Paulo enum p2p_role_indication role); 7795b9c547cSRui Paulo void p2p_buf_add_service_hash(struct wpabuf *buf, struct p2p_data *p2p); 7805b9c547cSRui Paulo void p2p_buf_add_session_info(struct wpabuf *buf, const char *info); 7815b9c547cSRui Paulo void p2p_buf_add_connection_capability(struct wpabuf *buf, u8 connection_cap); 7825b9c547cSRui Paulo void p2p_buf_add_advertisement_id(struct wpabuf *buf, u32 id, const u8 *mac); 7835b9c547cSRui Paulo void p2p_buf_add_service_instance(struct wpabuf *buf, struct p2p_data *p2p, 7845b9c547cSRui Paulo u8 count, const u8 *hash, 7855b9c547cSRui Paulo struct p2ps_advertisement *adv_list); 7865b9c547cSRui Paulo void p2p_buf_add_session_id(struct wpabuf *buf, u32 id, const u8 *mac); 7875b9c547cSRui Paulo void p2p_buf_add_feature_capability(struct wpabuf *buf, u16 len, 7885b9c547cSRui Paulo const u8 *mask); 7895b9c547cSRui Paulo void p2p_buf_add_persistent_group_info(struct wpabuf *buf, const u8 *dev_addr, 7905b9c547cSRui Paulo const u8 *ssid, size_t ssid_len); 7915b9c547cSRui Paulo int p2p_build_wps_ie(struct p2p_data *p2p, struct wpabuf *buf, int pw_id, 792f05cddf9SRui Paulo int all_attr); 793325151a3SRui Paulo void p2p_buf_add_pref_channel_list(struct wpabuf *buf, 794*a90b9d01SCy Schubert const struct weighted_pcl *pref_freq_list, 7954b72b91aSCy Schubert unsigned int size); 796f05cddf9SRui Paulo 797f05cddf9SRui Paulo /* p2p_sd.c */ 798f05cddf9SRui Paulo struct p2p_sd_query * p2p_pending_sd_req(struct p2p_data *p2p, 799f05cddf9SRui Paulo struct p2p_device *dev); 800f05cddf9SRui Paulo void p2p_free_sd_queries(struct p2p_data *p2p); 801f05cddf9SRui Paulo void p2p_rx_gas_initial_req(struct p2p_data *p2p, const u8 *sa, 802f05cddf9SRui Paulo const u8 *data, size_t len, int rx_freq); 803f05cddf9SRui Paulo void p2p_rx_gas_initial_resp(struct p2p_data *p2p, const u8 *sa, 804f05cddf9SRui Paulo const u8 *data, size_t len, int rx_freq); 805f05cddf9SRui Paulo void p2p_rx_gas_comeback_req(struct p2p_data *p2p, const u8 *sa, 806f05cddf9SRui Paulo const u8 *data, size_t len, int rx_freq); 807f05cddf9SRui Paulo void p2p_rx_gas_comeback_resp(struct p2p_data *p2p, const u8 *sa, 808f05cddf9SRui Paulo const u8 *data, size_t len, int rx_freq); 809f05cddf9SRui Paulo int p2p_start_sd(struct p2p_data *p2p, struct p2p_device *dev); 810f05cddf9SRui Paulo 811f05cddf9SRui Paulo /* p2p_go_neg.c */ 812f05cddf9SRui Paulo int p2p_peer_channels_check(struct p2p_data *p2p, struct p2p_channels *own, 813f05cddf9SRui Paulo struct p2p_device *dev, 814f05cddf9SRui Paulo const u8 *channel_list, size_t channel_list_len); 815f05cddf9SRui Paulo void p2p_process_go_neg_req(struct p2p_data *p2p, const u8 *sa, 816f05cddf9SRui Paulo const u8 *data, size_t len, int rx_freq); 817f05cddf9SRui Paulo void p2p_process_go_neg_resp(struct p2p_data *p2p, const u8 *sa, 818f05cddf9SRui Paulo const u8 *data, size_t len, int rx_freq); 819f05cddf9SRui Paulo void p2p_process_go_neg_conf(struct p2p_data *p2p, const u8 *sa, 820f05cddf9SRui Paulo const u8 *data, size_t len); 821f05cddf9SRui Paulo int p2p_connect_send(struct p2p_data *p2p, struct p2p_device *dev); 822f05cddf9SRui Paulo u16 p2p_wps_method_pw_id(enum p2p_wps_method wps_method); 823f05cddf9SRui Paulo void p2p_reselect_channel(struct p2p_data *p2p, 824f05cddf9SRui Paulo struct p2p_channels *intersection); 825325151a3SRui Paulo void p2p_check_pref_chan(struct p2p_data *p2p, int go, 826325151a3SRui Paulo struct p2p_device *dev, struct p2p_message *msg); 827f05cddf9SRui Paulo 828f05cddf9SRui Paulo /* p2p_pd.c */ 829f05cddf9SRui Paulo void p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa, 830f05cddf9SRui Paulo const u8 *data, size_t len, int rx_freq); 831f05cddf9SRui Paulo void p2p_process_prov_disc_resp(struct p2p_data *p2p, const u8 *sa, 832f05cddf9SRui Paulo const u8 *data, size_t len); 833f05cddf9SRui Paulo int p2p_send_prov_disc_req(struct p2p_data *p2p, struct p2p_device *dev, 834f05cddf9SRui Paulo int join, int force_freq); 835f05cddf9SRui Paulo void p2p_reset_pending_pd(struct p2p_data *p2p); 836325151a3SRui Paulo void p2ps_prov_free(struct p2p_data *p2p); 837f05cddf9SRui Paulo 838f05cddf9SRui Paulo /* p2p_invitation.c */ 839f05cddf9SRui Paulo void p2p_process_invitation_req(struct p2p_data *p2p, const u8 *sa, 840f05cddf9SRui Paulo const u8 *data, size_t len, int rx_freq); 841f05cddf9SRui Paulo void p2p_process_invitation_resp(struct p2p_data *p2p, const u8 *sa, 842f05cddf9SRui Paulo const u8 *data, size_t len); 843f05cddf9SRui Paulo int p2p_invite_send(struct p2p_data *p2p, struct p2p_device *dev, 8445b9c547cSRui Paulo const u8 *go_dev_addr, int dev_pw_id); 845f05cddf9SRui Paulo void p2p_invitation_req_cb(struct p2p_data *p2p, int success); 846f05cddf9SRui Paulo void p2p_invitation_resp_cb(struct p2p_data *p2p, int success); 847f05cddf9SRui Paulo 848f05cddf9SRui Paulo /* p2p_dev_disc.c */ 849f05cddf9SRui Paulo void p2p_process_dev_disc_req(struct p2p_data *p2p, const u8 *sa, 850f05cddf9SRui Paulo const u8 *data, size_t len, int rx_freq); 851f05cddf9SRui Paulo void p2p_dev_disc_req_cb(struct p2p_data *p2p, int success); 852f05cddf9SRui Paulo int p2p_send_dev_disc_req(struct p2p_data *p2p, struct p2p_device *dev); 853f05cddf9SRui Paulo void p2p_dev_disc_resp_cb(struct p2p_data *p2p, int success); 854f05cddf9SRui Paulo void p2p_process_dev_disc_resp(struct p2p_data *p2p, const u8 *sa, 855f05cddf9SRui Paulo const u8 *data, size_t len); 856f05cddf9SRui Paulo void p2p_go_disc_req_cb(struct p2p_data *p2p, int success); 857f05cddf9SRui Paulo void p2p_process_go_disc_req(struct p2p_data *p2p, const u8 *da, const u8 *sa, 858f05cddf9SRui Paulo const u8 *data, size_t len, int rx_freq); 859f05cddf9SRui Paulo 860f05cddf9SRui Paulo /* p2p.c */ 861f05cddf9SRui Paulo void p2p_set_state(struct p2p_data *p2p, int new_state); 862f05cddf9SRui Paulo void p2p_set_timeout(struct p2p_data *p2p, unsigned int sec, 863f05cddf9SRui Paulo unsigned int usec); 864f05cddf9SRui Paulo void p2p_clear_timeout(struct p2p_data *p2p); 865f05cddf9SRui Paulo void p2p_continue_find(struct p2p_data *p2p); 866f05cddf9SRui Paulo struct p2p_device * p2p_add_dev_from_go_neg_req(struct p2p_data *p2p, 867f05cddf9SRui Paulo const u8 *addr, 868f05cddf9SRui Paulo struct p2p_message *msg); 869*a90b9d01SCy Schubert void p2p_update_peer_6ghz_capab(struct p2p_device *dev, 870*a90b9d01SCy Schubert const struct p2p_message *msg); 871f05cddf9SRui Paulo void p2p_add_dev_info(struct p2p_data *p2p, const u8 *addr, 872f05cddf9SRui Paulo struct p2p_device *dev, struct p2p_message *msg); 873f05cddf9SRui Paulo int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, 8745b9c547cSRui Paulo struct os_reltime *rx_time, int level, const u8 *ies, 875f05cddf9SRui Paulo size_t ies_len, int scan_res); 876f05cddf9SRui Paulo struct p2p_device * p2p_get_device(struct p2p_data *p2p, const u8 *addr); 877f05cddf9SRui Paulo struct p2p_device * p2p_get_device_interface(struct p2p_data *p2p, 878f05cddf9SRui Paulo const u8 *addr); 8795b9c547cSRui Paulo void p2p_go_neg_failed(struct p2p_data *p2p, int status); 880f05cddf9SRui Paulo void p2p_go_complete(struct p2p_data *p2p, struct p2p_device *peer); 881f05cddf9SRui Paulo int p2p_match_dev_type(struct p2p_data *p2p, struct wpabuf *wps); 882f05cddf9SRui Paulo int dev_type_list_match(const u8 *dev_type, const u8 *req_dev_type[], 883f05cddf9SRui Paulo size_t num_req_dev_type); 884325151a3SRui Paulo struct wpabuf * p2p_build_probe_resp_ies(struct p2p_data *p2p, 885325151a3SRui Paulo const u8 *query_hash, 886325151a3SRui Paulo u8 query_count); 887f05cddf9SRui Paulo void p2p_build_ssid(struct p2p_data *p2p, u8 *ssid, size_t *ssid_len); 888f05cddf9SRui Paulo int p2p_send_action(struct p2p_data *p2p, unsigned int freq, const u8 *dst, 889f05cddf9SRui Paulo const u8 *src, const u8 *bssid, const u8 *buf, 890f05cddf9SRui Paulo size_t len, unsigned int wait_time); 891f05cddf9SRui Paulo void p2p_stop_listen_for_freq(struct p2p_data *p2p, int freq); 8925b9c547cSRui Paulo int p2p_prepare_channel(struct p2p_data *p2p, struct p2p_device *dev, 8935b9c547cSRui Paulo unsigned int force_freq, unsigned int pref_freq, 8945b9c547cSRui Paulo int go); 8955b9c547cSRui Paulo void p2p_go_neg_wait_timeout(void *eloop_ctx, void *timeout_ctx); 8965b9c547cSRui Paulo int p2p_go_select_channel(struct p2p_data *p2p, struct p2p_device *dev, 8975b9c547cSRui Paulo u8 *status); 898*a90b9d01SCy Schubert void p2p_pref_channel_filter(const struct p2p_channels *a, 899*a90b9d01SCy Schubert const struct weighted_pcl *freq_list, 900*a90b9d01SCy Schubert unsigned int num_channels, 901*a90b9d01SCy Schubert struct p2p_channels *res, bool go); 902*a90b9d01SCy Schubert 903*a90b9d01SCy Schubert void p2p_sd_query_cb(struct p2p_data *p2p, int success); 904*a90b9d01SCy Schubert 9055b9c547cSRui Paulo void p2p_dbg(struct p2p_data *p2p, const char *fmt, ...) 9065b9c547cSRui Paulo PRINTF_FORMAT(2, 3); 9075b9c547cSRui Paulo void p2p_info(struct p2p_data *p2p, const char *fmt, ...) 9085b9c547cSRui Paulo PRINTF_FORMAT(2, 3); 9095b9c547cSRui Paulo void p2p_err(struct p2p_data *p2p, const char *fmt, ...) 9105b9c547cSRui Paulo PRINTF_FORMAT(2, 3); 911f05cddf9SRui Paulo 912f05cddf9SRui Paulo #endif /* P2P_I_H */ 913