P2P: Use preferred frequency list from the local driver
[mech_eap.git] / src / p2p / p2p_i.h
index f80b9ba..3d6bc70 100644 (file)
 
 #define P2P_GO_NEG_CNF_MAX_RETRY_COUNT 1
 
+/*
+ * A threshold (in seconds) to prefer a direct Probe Response frame from a P2P
+ * Device over the P2P Client Info received from a GO.
+ */
+#define P2P_DEV_GROUP_CLIENT_RESP_THRESHOLD 1
+
 enum p2p_role_indication;
 
 /*
@@ -47,6 +53,9 @@ struct p2p_device {
         * from Beacon/Probe Response), the interface address is stored here.
         * p2p_device_addr must still be set in such a case to the unique
         * identifier for the P2P Device.
+        *
+        * This field is also used during P2PS PD to store the intended GO
+        * address of the peer.
         */
        u8 interface_addr[ETH_ALEN];
 
@@ -71,7 +80,7 @@ struct p2p_device {
        char country[3];
        struct p2p_channels channels;
        int oper_freq;
-       u8 oper_ssid[32];
+       u8 oper_ssid[SSID_MAX_LEN];
        size_t oper_ssid_len;
 
        /**
@@ -106,6 +115,9 @@ struct p2p_device {
 #define P2P_DEV_NO_PREF_CHAN BIT(18)
 #define P2P_DEV_WAIT_INV_REQ_ACK BIT(19)
 #define P2P_DEV_P2PS_REPORTED BIT(20)
+#define P2P_DEV_PD_PEER_P2PS BIT(21)
+#define P2P_DEV_LAST_SEEN_AS_GROUP_CLIENT BIT(22)
+
        unsigned int flags;
 
        int status; /* enum p2p_status_code */
@@ -321,7 +333,7 @@ struct p2p_data {
        /**
         * ssid - Selected SSID for GO Negotiation (if local end will be GO)
         */
-       u8 ssid[32];
+       u8 ssid[SSID_MAX_LEN];
 
        /**
         * ssid_len - ssid length in octets
@@ -362,6 +374,7 @@ struct p2p_data {
                P2P_PENDING_GO_NEG_CONFIRM,
                P2P_PENDING_SD,
                P2P_PENDING_PD,
+               P2P_PENDING_PD_RESPONSE,
                P2P_PENDING_INVITATION_REQUEST,
                P2P_PENDING_INVITATION_RESPONSE,
                P2P_PENDING_DEV_DISC_REQUEST,
@@ -401,7 +414,7 @@ struct p2p_data {
        enum p2p_invite_role inv_role;
        u8 inv_bssid[ETH_ALEN];
        int inv_bssid_set;
-       u8 inv_ssid[32];
+       u8 inv_ssid[SSID_MAX_LEN];
        size_t inv_ssid_len;
        u8 inv_sa[ETH_ALEN];
        u8 inv_group_bssid[ETH_ALEN];
@@ -504,11 +517,9 @@ struct p2p_data {
        struct p2ps_advertisement *p2ps_adv_list;
        struct p2ps_provision *p2ps_prov;
        u8 wild_card_hash[P2PS_HASH_LEN];
-       u8 query_hash[P2P_MAX_QUERY_HASH * P2PS_HASH_LEN];
-       u8 query_count;
        u8 p2ps_seek;
+       u8 p2ps_seek_hash[P2P_MAX_QUERY_HASH * P2PS_HASH_LEN];
        u8 p2ps_seek_count;
-       u8 p2ps_svc_found;
 
 #ifdef CONFIG_WIFI_DISPLAY
        struct wpabuf *wfd_ie_beacon;
@@ -527,6 +538,9 @@ struct p2p_data {
        u16 authorized_oob_dev_pw_id;
 
        struct wpabuf **vendor_elem;
+
+       unsigned int pref_freq_list[P2P_MAX_PREF_CHANNELS];
+       unsigned int num_pref_freq;
 };
 
 /**
@@ -576,7 +590,7 @@ struct p2p_message {
        const u8 *p2p_device_addr;
        const u8 *pri_dev_type;
        u8 num_sec_dev_types;
-       char device_name[33];
+       char device_name[WPS_DEV_NAME_MAX_LEN + 1];
        u16 config_methods;
 
        /* WPS IE */
@@ -793,6 +807,7 @@ void p2p_process_prov_disc_resp(struct p2p_data *p2p, const u8 *sa,
 int p2p_send_prov_disc_req(struct p2p_data *p2p, struct p2p_device *dev,
                           int join, int force_freq);
 void p2p_reset_pending_pd(struct p2p_data *p2p);
+void p2ps_prov_free(struct p2p_data *p2p);
 
 /* p2p_invitation.c */
 void p2p_process_invitation_req(struct p2p_data *p2p, const u8 *sa,
@@ -838,7 +853,9 @@ void p2p_go_complete(struct p2p_data *p2p, struct p2p_device *peer);
 int p2p_match_dev_type(struct p2p_data *p2p, struct wpabuf *wps);
 int dev_type_list_match(const u8 *dev_type, const u8 *req_dev_type[],
                        size_t num_req_dev_type);
-struct wpabuf * p2p_build_probe_resp_ies(struct p2p_data *p2p);
+struct wpabuf * p2p_build_probe_resp_ies(struct p2p_data *p2p,
+                                        const u8 *query_hash,
+                                        u8 query_count);
 void p2p_build_ssid(struct p2p_data *p2p, u8 *ssid, size_t *ssid_len);
 int p2p_send_action(struct p2p_data *p2p, unsigned int freq, const u8 *dst,
                    const u8 *src, const u8 *bssid, const u8 *buf,