P2PS: Delete p2ps_svc_found from struct p2p_data
[mech_eap.git] / src / p2p / p2p_i.h
index 3b60582..f5bae32 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;
 
+/*
+ * To force Service Instances to fit within a single P2P Tag, MAX_SVC_ADV_LEN
+ * must equal 248 or less. Must have a minimum size of 19.
+ */
+#define MAX_SVC_ADV_LEN        600
+#define MAX_SVC_ADV_IE_LEN (9 + MAX_SVC_ADV_LEN + (5 * (MAX_SVC_ADV_LEN / 240)))
+
 enum p2p_go_state {
        UNKNOWN_GO,
        LOCAL_GO,
@@ -64,7 +77,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;
 
        /**
@@ -98,13 +111,17 @@ struct p2p_device {
 #define P2P_DEV_PD_BEFORE_GO_NEG BIT(17)
 #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 */
-       struct os_reltime go_neg_wait_started;
        unsigned int wait_count;
        unsigned int connect_reqs;
        unsigned int invitation_reqs;
+       unsigned int sd_reqs;
 
        u16 ext_listen_period;
        u16 ext_listen_interval;
@@ -260,10 +277,18 @@ struct p2p_data {
         */
        struct p2p_device *invite_peer;
 
+       /**
+        * last_p2p_find_oper - Pointer to last pre-find operation peer
+        */
+       struct p2p_device *last_p2p_find_oper;
+
        const u8 *invite_go_dev_addr;
        u8 invite_go_dev_addr_buf[ETH_ALEN];
        int invite_dev_pw_id;
 
+       unsigned int retry_invite_req:1;
+       unsigned int retry_invite_req_sent:1;
+
        /**
         * sd_peer - Pointer to Service Discovery peer
         */
@@ -305,7 +330,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
@@ -346,6 +371,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,
@@ -385,7 +411,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];
@@ -484,6 +510,15 @@ struct p2p_data {
        u8 pending_channel;
        u8 pending_channel_forced;
 
+       /* ASP Support */
+       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_count;
+
 #ifdef CONFIG_WIFI_DISPLAY
        struct wpabuf *wfd_ie_beacon;
        struct wpabuf *wfd_ie_probe_req;
@@ -550,7 +585,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 */
@@ -578,6 +613,31 @@ struct p2p_message {
 
        /* SSID IE */
        const u8 *ssid;
+
+       /* P2PS */
+       u8 service_hash_count;
+       const u8 *service_hash;
+
+       const u8 *session_info;
+       size_t session_info_len;
+
+       const u8 *conn_cap;
+
+       const u8 *adv_id;
+       const u8 *adv_mac;
+
+       const u8 *adv_service_instance;
+       size_t adv_service_instance_len;
+
+       const u8 *session_id;
+       const u8 *session_mac;
+
+       const u8 *feature_cap;
+       size_t feature_cap_len;
+
+       const u8 *persistent_dev;
+       const u8 *persistent_ssid;
+       size_t persistent_ssid_len;
 };
 
 
@@ -606,6 +666,8 @@ int p2p_freq_to_channel(unsigned int freq, u8 *op_class, u8 *channel);
 void p2p_channels_intersect(const struct p2p_channels *a,
                            const struct p2p_channels *b,
                            struct p2p_channels *res);
+void p2p_channels_union_inplace(struct p2p_channels *res,
+                               const struct p2p_channels *b);
 void p2p_channels_union(const struct p2p_channels *a,
                        const struct p2p_channels *b,
                        struct p2p_channels *res);
@@ -688,6 +750,18 @@ void p2p_buf_add_p2p_interface(struct wpabuf *buf, struct p2p_data *p2p);
 void p2p_buf_add_oob_go_neg_channel(struct wpabuf *buf, const char *country,
                                    u8 oper_class, u8 channel,
                                    enum p2p_role_indication role);
+void p2p_buf_add_service_hash(struct wpabuf *buf, struct p2p_data *p2p);
+void p2p_buf_add_session_info(struct wpabuf *buf, const char *info);
+void p2p_buf_add_connection_capability(struct wpabuf *buf, u8 connection_cap);
+void p2p_buf_add_advertisement_id(struct wpabuf *buf, u32 id, const u8 *mac);
+void p2p_buf_add_service_instance(struct wpabuf *buf, struct p2p_data *p2p,
+                                 u8 count, const u8 *hash,
+                                 struct p2ps_advertisement *adv_list);
+void p2p_buf_add_session_id(struct wpabuf *buf, u32 id, const u8 *mac);
+void p2p_buf_add_feature_capability(struct wpabuf *buf, u16 len,
+                                   const u8 *mask);
+void p2p_buf_add_persistent_group_info(struct wpabuf *buf, const u8 *dev_addr,
+                                      const u8 *ssid, size_t ssid_len);
 int p2p_build_wps_ie(struct p2p_data *p2p, struct wpabuf *buf, int pw_id,
                     int all_attr);
 
@@ -728,6 +802,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,
@@ -768,8 +843,7 @@ int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq,
 struct p2p_device * p2p_get_device(struct p2p_data *p2p, const u8 *addr);
 struct p2p_device * p2p_get_device_interface(struct p2p_data *p2p,
                                             const u8 *addr);
-void p2p_go_neg_failed(struct p2p_data *p2p, struct p2p_device *peer,
-                      int status);
+void p2p_go_neg_failed(struct p2p_data *p2p, int status);
 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[],
@@ -783,6 +857,9 @@ void p2p_stop_listen_for_freq(struct p2p_data *p2p, int freq);
 int p2p_prepare_channel(struct p2p_data *p2p, struct p2p_device *dev,
                        unsigned int force_freq, unsigned int pref_freq,
                        int go);
+void p2p_go_neg_wait_timeout(void *eloop_ctx, void *timeout_ctx);
+int p2p_go_select_channel(struct p2p_data *p2p, struct p2p_device *dev,
+                         u8 *status);
 void p2p_dbg(struct p2p_data *p2p, const char *fmt, ...)
 PRINTF_FORMAT(2, 3);
 void p2p_info(struct p2p_data *p2p, const char *fmt, ...)