OSDN Git Service

Accumulative patch from commit 8cee87ab139e52516ee4185789b40a0459fa7406
[android-x86/external-wpa_supplicant_8.git] / src / p2p / p2p_i.h
index 68b1194..d59a8ac 100644 (file)
@@ -2,14 +2,8 @@
  * P2P - Internal definitions for P2P module
  * Copyright (c) 2009-2010, Atheros Communications
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
  */
 
 #ifndef P2P_I_H
@@ -18,8 +12,6 @@
 #include "utils/list.h"
 #include "p2p.h"
 
-/* TODO: add removal of expired P2P device entries */
-
 enum p2p_go_state {
        UNKNOWN_GO,
        LOCAL_GO,
@@ -33,7 +25,6 @@ struct p2p_device {
        struct dl_list list;
        struct os_time last_seen;
        int listen_freq;
-       int level;
        enum p2p_wps_method wps_method;
 
        struct p2p_peer_info info;
@@ -61,6 +52,7 @@ struct p2p_device {
        int go_neg_req_sent;
        enum p2p_go_state go_state;
        u8 dialog_token;
+       u8 tie_breaker;
        u8 intended_addr[ETH_ALEN];
 
        char country[3];
@@ -70,10 +62,18 @@ struct p2p_device {
        size_t oper_ssid_len;
 
        /**
-        * req_config_methods - Pending provisioning discovery methods
+        * req_config_methods - Pending provision discovery methods
         */
        u16 req_config_methods;
 
+       /**
+        * wps_prov_info - Stored provisioning WPS config method
+        *
+        * This is used to store pending WPS config method between Provisioning
+        * Discovery and connection to a running group.
+        */
+       u16 wps_prov_info;
+
 #define P2P_DEV_PROBE_REQ_ONLY BIT(0)
 #define P2P_DEV_REPORTED BIT(1)
 #define P2P_DEV_NOT_YET_READY BIT(2)
@@ -90,6 +90,8 @@ struct p2p_device {
 #define P2P_DEV_FORCE_FREQ BIT(13)
 #define P2P_DEV_PD_FOR_JOIN BIT(14)
 #define P2P_DEV_REPORTED_ONCE BIT(15)
+#define P2P_DEV_PREFER_PERSISTENT_RECONN BIT(16)
+#define P2P_DEV_PD_BEFORE_GO_NEG BIT(17)
        unsigned int flags;
 
        int status; /* enum p2p_status_code */
@@ -108,6 +110,7 @@ struct p2p_sd_query {
        struct p2p_sd_query *next;
        u8 peer[ETH_ALEN];
        int for_all_peers;
+       int wsd; /* Wi-Fi Display Service Discovery Request */
        struct wpabuf *tlvs;
 };
 
@@ -201,6 +204,16 @@ struct p2p_data {
                 * P2P_INVITE_LISTEN - Listen during Invite
                 */
                P2P_INVITE_LISTEN,
+
+               /**
+                * P2P_SEARCH_WHEN_READY - Waiting to start Search
+                */
+               P2P_SEARCH_WHEN_READY,
+
+               /**
+                * P2P_CONTINUE_SEARCH_WHEN_READY - Waiting to continue Search
+                */
+               P2P_CONTINUE_SEARCH_WHEN_READY,
        } state;
 
        /**
@@ -214,10 +227,23 @@ struct p2p_data {
        int max_disc_int;
 
        /**
+        * max_disc_tu - Maximum number of TUs for discoverable interval
+        */
+       int max_disc_tu;
+
+       /**
         * devices - List of known P2P Device peers
         */
        struct dl_list devices;
 
+#ifdef ANDROID_P2P
+       /**
+        * sd_dev_list - device pointer to be serviced next
+        * for service discovery
+        */
+       struct dl_list *sd_dev_list;
+#endif
+
        /**
         * go_neg_peer - Pointer to GO Negotiation peer
         */
@@ -274,6 +300,11 @@ struct p2p_data {
        size_t ssid_len;
 
        /**
+        * ssid_set - Whether SSID is already set for GO Negotiation
+        */
+       int ssid_set;
+
+       /**
         * Regulatory class for own operational channel
         */
        u8 op_reg_class;
@@ -325,7 +356,12 @@ struct p2p_data {
         * srv_update_indic - Service Update Indicator for local services
         */
        u16 srv_update_indic;
-
+#ifdef ANDROID_P2P
+       /**
+        * srv_count - Registered services count
+        */
+       u16 srv_count;
+#endif
        struct wpabuf *sd_resp; /* Fragmented SD response */
        u8 sd_resp_addr[ETH_ALEN];
        u8 sd_resp_dialog_token;
@@ -350,6 +386,7 @@ struct p2p_data {
        int inv_persistent;
 
        enum p2p_discovery_type find_type;
+       unsigned int last_p2p_find_timeout;
        u8 last_prog_scan_class;
        u8 last_prog_scan_chan;
        int p2p_scan_running;
@@ -364,6 +401,10 @@ struct p2p_data {
        /* Requested device types for find/search */
        unsigned int num_req_dev_types;
        u8 *req_dev_types;
+       u8 *find_dev_id;
+       u8 find_dev_id_buf[ETH_ALEN];
+
+       struct os_time find_start; /* time of last p2p_find start */
 
        struct p2p_group **groups;
        size_t num_groups;
@@ -393,6 +434,44 @@ struct p2p_data {
         * wps_vendor_ext - WPS Vendor Extensions to add
         */
        struct wpabuf *wps_vendor_ext[P2P_MAX_WPS_VENDOR_EXT];
+
+       /*
+        * user_initiated_pd - Whether a PD request is user initiated or not.
+        */
+       u8 user_initiated_pd;
+
+       /*
+        * Keep track of which peer a given PD request was sent to.
+        * Used to raise a timeout alert in case there is no response.
+        */
+       u8 pending_pd_devaddr[ETH_ALEN];
+
+       /*
+        * Retry counter for provision discovery requests when issued
+        * in IDLE state.
+        */
+       int pd_retries;
+
+       u8 go_timeout;
+       u8 client_timeout;
+
+       /* Extra delay in milliseconds between search iterations */
+       unsigned int search_delay;
+       int in_search_delay;
+
+#ifdef CONFIG_WIFI_DISPLAY
+       struct wpabuf *wfd_ie_beacon;
+       struct wpabuf *wfd_ie_probe_req;
+       struct wpabuf *wfd_ie_probe_resp;
+       struct wpabuf *wfd_ie_assoc_req;
+       struct wpabuf *wfd_ie_invitation;
+       struct wpabuf *wfd_ie_prov_disc_req;
+       struct wpabuf *wfd_ie_prov_disc_resp;
+       struct wpabuf *wfd_ie_go_neg;
+       struct wpabuf *wfd_dev_info;
+       struct wpabuf *wfd_assoc_bssid;
+       struct wpabuf *wfd_coupled_sink_info;
+#endif /* CONFIG_WIFI_DISPLAY */
 };
 
 /**
@@ -401,6 +480,7 @@ struct p2p_data {
 struct p2p_message {
        struct wpabuf *p2p_attributes;
        struct wpabuf *wps_attributes;
+       struct wpabuf *wfd_subelems;
 
        u8 dialog_token;
 
@@ -519,6 +599,10 @@ const u8 * p2p_group_get_interface_addr(struct p2p_group *group);
 u8 p2p_group_presence_req(struct p2p_group *group,
                          const u8 *client_interface_addr,
                          const u8 *noa, size_t noa_len);
+int p2p_group_is_group_id_match(struct p2p_group *group, const u8 *group_id,
+                               size_t group_id_len);
+void p2p_group_update_ies(struct p2p_group *group);
+struct wpabuf * p2p_group_get_wfd_ie(struct p2p_group *g);
 
 
 void p2p_buf_add_action_hdr(struct wpabuf *buf, u8 subtype, u8 dialog_token);
@@ -550,7 +634,7 @@ void p2p_buf_add_noa(struct wpabuf *buf, u8 noa_index, u8 opp_ps, u8 ctwindow,
 void p2p_buf_add_ext_listen_timing(struct wpabuf *buf, u16 period,
                                   u16 interval);
 void p2p_buf_add_p2p_interface(struct wpabuf *buf, struct p2p_data *p2p);
-void p2p_build_wps_ie(struct p2p_data *p2p, struct wpabuf *buf, u16 pw_id,
+void p2p_build_wps_ie(struct p2p_data *p2p, struct wpabuf *buf, int pw_id,
                      int all_attr);
 
 /* p2p_sd.c */
@@ -578,6 +662,9 @@ void p2p_process_go_neg_resp(struct p2p_data *p2p, const u8 *sa,
 void p2p_process_go_neg_conf(struct p2p_data *p2p, const u8 *sa,
                             const u8 *data, size_t len);
 int p2p_connect_send(struct p2p_data *p2p, struct p2p_device *dev);
+u16 p2p_wps_method_pw_id(enum p2p_wps_method wps_method);
+void p2p_reselect_channel(struct p2p_data *p2p,
+                         struct p2p_channels *intersection);
 
 /* p2p_pd.c */
 void p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa,
@@ -585,7 +672,8 @@ void p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa,
 void p2p_process_prov_disc_resp(struct p2p_data *p2p, const u8 *sa,
                                const u8 *data, size_t len);
 int p2p_send_prov_disc_req(struct p2p_data *p2p, struct p2p_device *dev,
-                          int join);
+                          int join, int force_freq);
+void p2p_reset_pending_pd(struct p2p_data *p2p);
 
 /* p2p_invitation.c */
 void p2p_process_invitation_req(struct p2p_data *p2p, const u8 *sa,
@@ -620,6 +708,9 @@ struct p2p_device * p2p_add_dev_from_go_neg_req(struct p2p_data *p2p,
                                                struct p2p_message *msg);
 void p2p_add_dev_info(struct p2p_data *p2p, const u8 *addr,
                      struct p2p_device *dev, struct p2p_message *msg);
+int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq,
+                  struct os_time *rx_time, int level, const u8 *ies,
+                  size_t ies_len, int scan_res);
 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);
@@ -634,5 +725,6 @@ 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,
                    size_t len, unsigned int wait_time);
+void p2p_stop_listen_for_freq(struct p2p_data *p2p, int freq);
 
 #endif /* P2P_I_H */