wpa_supplicant / hostapd 2.0

p2p.h

Go to the documentation of this file.
00001 
00010 #ifndef P2P_H
00011 #define P2P_H
00012 
00017 #define P2P_MAX_REG_CLASSES 10
00018 
00023 #define P2P_MAX_REG_CLASS_CHANNELS 20
00024 
00029 struct p2p_channels {
00034         struct p2p_reg_class {
00039                 u8 reg_class;
00040 
00045                 u8 channel[P2P_MAX_REG_CLASS_CHANNELS];
00046 
00051                 size_t channels;
00052         } reg_class[P2P_MAX_REG_CLASSES];
00053 
00058         size_t reg_classes;
00059 };
00060 
00061 enum p2p_wps_method {
00062         WPS_NOT_READY, WPS_PIN_DISPLAY, WPS_PIN_KEYPAD, WPS_PBC
00063 };
00064 
00069 struct p2p_go_neg_results {
00077         int status;
00078 
00083         int role_go;
00084 
00089         int freq;
00090 
00095         u8 ssid[32];
00096 
00101         size_t ssid_len;
00102 
00107         char passphrase[64];
00108 
00113         u8 peer_device_addr[ETH_ALEN];
00114 
00119         u8 peer_interface_addr[ETH_ALEN];
00120 
00125         enum p2p_wps_method wps_method;
00126 
00127 #define P2P_MAX_CHANNELS 50
00128 
00133         int freq_list[P2P_MAX_CHANNELS];
00134 
00142         int persistent_group;
00143 
00148         unsigned int peer_config_timeout;
00149 };
00150 
00151 struct p2p_data;
00152 
00153 enum p2p_scan_type {
00154         P2P_SCAN_SOCIAL,
00155         P2P_SCAN_FULL,
00156         P2P_SCAN_SPECIFIC,
00157         P2P_SCAN_SOCIAL_PLUS_ONE
00158 };
00159 
00160 #define P2P_MAX_WPS_VENDOR_EXT 10
00161 
00166 struct p2p_peer_info {
00171         u8 p2p_device_addr[ETH_ALEN];
00172 
00177         u8 pri_dev_type[8];
00178 
00183         char device_name[33];
00184 
00189         char manufacturer[65];
00190 
00195         char model_name[33];
00196 
00201         char model_number[33];
00202 
00207         char serial_number[33];
00208 
00213         int level;
00214 
00219         u16 config_methods;
00220 
00225         u8 dev_capab;
00226 
00231         u8 group_capab;
00232 
00240         u8 wps_sec_dev_type_list[128];
00241 
00246         size_t wps_sec_dev_type_list_len;
00247 
00248         struct wpabuf *wps_vendor_ext[P2P_MAX_WPS_VENDOR_EXT];
00249 };
00250 
00251 enum p2p_prov_disc_status {
00252         P2P_PROV_DISC_SUCCESS,
00253         P2P_PROV_DISC_TIMEOUT,
00254         P2P_PROV_DISC_REJECTED,
00255 };
00256 
00257 struct p2p_channel {
00258         u8 op_class;
00259         u8 chan;
00260 };
00261 
00269 struct p2p_config {
00274         char country[3];
00275 
00280         u8 reg_class;
00281 
00286         u8 channel;
00287 
00291         u8 op_reg_class;
00292 
00297         u8 op_channel;
00298 
00303         u8 cfg_op_channel;
00304 
00313         struct p2p_channels channels;
00314 
00319         unsigned int num_pref_chan;
00320 
00325         struct p2p_channel *pref_chan;
00326 
00331         u8 pri_dev_type[8];
00332 
00337 #define P2P_SEC_DEVICE_TYPES 5
00338 
00343         u8 sec_dev_type[P2P_SEC_DEVICE_TYPES][8];
00344 
00349         size_t num_sec_dev_types;
00350 
00355         u8 dev_addr[ETH_ALEN];
00356 
00361         char *dev_name;
00362 
00363         char *manufacturer;
00364         char *model_name;
00365         char *model_number;
00366         char *serial_number;
00367 
00368         u8 uuid[16];
00369         u16 config_methods;
00370 
00375         int concurrent_operations;
00376 
00384         size_t max_peers;
00385 
00390         int p2p_intra_bss;
00391 
00399         u8 ssid_postfix[32 - 9];
00400 
00405         size_t ssid_postfix_len;
00406 
00411         void *msg_ctx;
00412 
00417         void *cb_ctx;
00418 
00419 
00420         /* Callbacks to request lower layer driver operations */
00421 
00453         int (*p2p_scan)(void *ctx, enum p2p_scan_type type, int freq,
00454                         unsigned int num_req_dev_types,
00455                         const u8 *req_dev_types, const u8 *dev_id, u16 pw_id);
00456 
00478         int (*send_probe_resp)(void *ctx, const struct wpabuf *buf);
00479 
00499         int (*send_action)(void *ctx, unsigned int freq, const u8 *dst,
00500                            const u8 *src, const u8 *bssid, const u8 *buf,
00501                            size_t len, unsigned int wait_time);
00502 
00512         void (*send_action_done)(void *ctx);
00513 
00535         int (*start_listen)(void *ctx, unsigned int freq,
00536                             unsigned int duration,
00537                             const struct wpabuf *probe_resp_ie);
00546         void (*stop_listen)(void *ctx);
00547 
00561         int (*get_noa)(void *ctx, const u8 *interface_addr, u8 *buf,
00562                        size_t buf_len);
00563 
00564         /* Callbacks to notify events to upper layer management entity */
00565 
00579         void (*dev_found)(void *ctx, const u8 *addr,
00580                           const struct p2p_peer_info *info,
00581                           int new_device);
00582 
00591         void (*dev_lost)(void *ctx, const u8 *dev_addr);
00592 
00607         void (*go_neg_req_rx)(void *ctx, const u8 *src, u16 dev_passwd_id);
00608 
00627         void (*go_neg_completed)(void *ctx, struct p2p_go_neg_results *res);
00628 
00648         void (*sd_request)(void *ctx, int freq, const u8 *sa, u8 dialog_token,
00649                            u16 update_indic, const u8 *tlvs, size_t tlvs_len);
00650 
00665         void (*sd_response)(void *ctx, const u8 *sa, u16 update_indic,
00666                             const u8 *tlvs, size_t tlvs_len);
00667 
00686         void (*prov_disc_req)(void *ctx, const u8 *peer, u16 config_methods,
00687                               const u8 *dev_addr, const u8 *pri_dev_type,
00688                               const char *dev_name, u16 supp_config_methods,
00689                               u8 dev_capab, u8 group_capab,
00690                               const u8 *group_id, size_t group_id_len);
00691 
00704         void (*prov_disc_resp)(void *ctx, const u8 *peer, u16 config_methods);
00705 
00719         void (*prov_disc_fail)(void *ctx, const u8 *peer,
00720                                enum p2p_prov_disc_status status);
00721 
00754         u8 (*invitation_process)(void *ctx, const u8 *sa, const u8 *bssid,
00755                                  const u8 *go_dev_addr, const u8 *ssid,
00756                                  size_t ssid_len, int *go, u8 *group_bssid,
00757                                  int *force_freq, int persistent_group);
00758 
00777         void (*invitation_received)(void *ctx, const u8 *sa, const u8 *bssid,
00778                                     const u8 *ssid, size_t ssid_len,
00779                                     const u8 *go_dev_addr, u8 status,
00780                                     int op_freq);
00781 
00795         void (*invitation_result)(void *ctx, int status, const u8 *bssid);
00796 
00805         int (*go_connected)(void *ctx, const u8 *dev_addr);
00806 };
00807 
00808 
00809 /* P2P module initialization/deinitialization */
00810 
00823 struct p2p_data * p2p_init(const struct p2p_config *cfg);
00824 
00830 void p2p_deinit(struct p2p_data *p2p);
00831 
00839 void p2p_flush(struct p2p_data *p2p);
00840 
00853 int p2p_unauthorize(struct p2p_data *p2p, const u8 *addr);
00854 
00864 int p2p_set_dev_name(struct p2p_data *p2p, const char *dev_name);
00865 
00866 int p2p_set_manufacturer(struct p2p_data *p2p, const char *manufacturer);
00867 int p2p_set_model_name(struct p2p_data *p2p, const char *model_name);
00868 int p2p_set_model_number(struct p2p_data *p2p, const char *model_number);
00869 int p2p_set_serial_number(struct p2p_data *p2p, const char *serial_number);
00870 
00871 void p2p_set_config_methods(struct p2p_data *p2p, u16 config_methods);
00872 void p2p_set_uuid(struct p2p_data *p2p, const u8 *uuid);
00873 
00883 int p2p_set_pri_dev_type(struct p2p_data *p2p, const u8 *pri_dev_type);
00884 
00894 int p2p_set_sec_dev_types(struct p2p_data *p2p, const u8 dev_types[][8],
00895                           size_t num_dev_types);
00896 
00897 int p2p_set_country(struct p2p_data *p2p, const char *country);
00898 
00899 
00900 /* Commands from upper layer management entity */
00901 
00902 enum p2p_discovery_type {
00903         P2P_FIND_START_WITH_FULL,
00904         P2P_FIND_ONLY_SOCIAL,
00905         P2P_FIND_PROGRESSIVE
00906 };
00907 
00921 int p2p_find(struct p2p_data *p2p, unsigned int timeout,
00922              enum p2p_discovery_type type,
00923              unsigned int num_req_dev_types, const u8 *req_dev_types,
00924              const u8 *dev_id);
00925 
00931 void p2p_stop_find(struct p2p_data *p2p);
00932 
00942 void p2p_stop_find_for_freq(struct p2p_data *p2p, int freq);
00943 
00956 int p2p_listen(struct p2p_data *p2p, unsigned int timeout);
00957 
00972 int p2p_connect(struct p2p_data *p2p, const u8 *peer_addr,
00973                 enum p2p_wps_method wps_method,
00974                 int go_intent, const u8 *own_interface_addr,
00975                 unsigned int force_freq, int persistent_group);
00976 
00994 int p2p_authorize(struct p2p_data *p2p, const u8 *peer_addr,
00995                   enum p2p_wps_method wps_method,
00996                   int go_intent, const u8 *own_interface_addr,
00997                   unsigned int force_freq, int persistent_group);
00998 
01006 int p2p_reject(struct p2p_data *p2p, const u8 *peer_addr);
01007 
01026 int p2p_prov_disc_req(struct p2p_data *p2p, const u8 *peer_addr,
01027                       u16 config_methods, int join, int force_freq);
01028 
01040 void * p2p_sd_request(struct p2p_data *p2p, const u8 *dst,
01041                       const struct wpabuf *tlvs);
01042 
01050 int p2p_sd_cancel_request(struct p2p_data *p2p, void *req);
01051 
01064 void p2p_sd_response(struct p2p_data *p2p, int freq, const u8 *dst,
01065                      u8 dialog_token, const struct wpabuf *resp_tlvs);
01066 
01076 void p2p_sd_service_update(struct p2p_data *p2p);
01077 
01078 
01079 enum p2p_invite_role {
01080         P2P_INVITE_ROLE_GO,
01081         P2P_INVITE_ROLE_ACTIVE_GO,
01082         P2P_INVITE_ROLE_CLIENT
01083 };
01084 
01099 int p2p_invite(struct p2p_data *p2p, const u8 *peer, enum p2p_invite_role role,
01100                const u8 *bssid, const u8 *ssid, size_t ssid_len,
01101                unsigned int force_freq, const u8 *go_dev_addr,
01102                int persistent_group);
01103 
01120 int p2p_presence_req(struct p2p_data *p2p, const u8 *go_interface_addr,
01121                      const u8 *own_interface_addr, unsigned int freq,
01122                      u32 duration1, u32 interval1, u32 duration2,
01123                      u32 interval2);
01124 
01139 int p2p_ext_listen(struct p2p_data *p2p, unsigned int period,
01140                    unsigned int interval);
01141 
01142 /* Event notifications from upper layer management operations */
01143 
01153 void p2p_wps_success_cb(struct p2p_data *p2p, const u8 *mac_addr);
01154 
01164 void p2p_group_formation_failed(struct p2p_data *p2p);
01165 
01177 u16 p2p_get_provisioning_info(struct p2p_data *p2p, const u8 *addr);
01178 
01188 void p2p_clear_provisioning_info(struct p2p_data *p2p, const u8 *addr);
01189 
01190 
01191 /* Event notifications from lower layer driver operations */
01192 
01202 enum p2p_probe_req_status {
01203         P2P_PREQ_MALFORMED,
01204         P2P_PREQ_NOT_LISTEN,
01205         P2P_PREQ_NOT_P2P,
01206         P2P_PREQ_NOT_PROCESSED,
01207         P2P_PREQ_PROCESSED
01208 };
01209 
01221 enum p2p_probe_req_status
01222 p2p_probe_req_rx(struct p2p_data *p2p, const u8 *addr, const u8 *dst,
01223                  const u8 *bssid, const u8 *ie, size_t ie_len);
01224 
01237 void p2p_rx_action(struct p2p_data *p2p, const u8 *da, const u8 *sa,
01238                    const u8 *bssid, u8 category,
01239                    const u8 *data, size_t len, int freq);
01240 
01267 int p2p_scan_res_handler(struct p2p_data *p2p, const u8 *bssid, int freq,
01268                          int level, const u8 *ies, size_t ies_len);
01269 
01281 void p2p_scan_res_handled(struct p2p_data *p2p);
01282 
01283 enum p2p_send_action_result {
01284         P2P_SEND_ACTION_SUCCESS /* Frame was send and acknowledged */,
01285         P2P_SEND_ACTION_NO_ACK /* Frame was sent, but not acknowledged */,
01286         P2P_SEND_ACTION_FAILED /* Frame was not sent due to a failure */
01287 };
01288 
01302 void p2p_send_action_cb(struct p2p_data *p2p, unsigned int freq, const u8 *dst,
01303                         const u8 *src, const u8 *bssid,
01304                         enum p2p_send_action_result result);
01305 
01316 void p2p_listen_cb(struct p2p_data *p2p, unsigned int freq,
01317                    unsigned int duration);
01318 
01329 int p2p_listen_end(struct p2p_data *p2p, unsigned int freq);
01330 
01331 void p2p_deauth_notif(struct p2p_data *p2p, const u8 *bssid, u16 reason_code,
01332                       const u8 *ie, size_t ie_len);
01333 
01334 void p2p_disassoc_notif(struct p2p_data *p2p, const u8 *bssid, u16 reason_code,
01335                         const u8 *ie, size_t ie_len);
01336 
01337 
01338 /* Per-group P2P state for GO */
01339 
01340 struct p2p_group;
01341 
01349 struct p2p_group_config {
01357         int persistent_group;
01358 
01363         u8 interface_addr[ETH_ALEN];
01364 
01369         unsigned int max_clients;
01370 
01375         void *cb_ctx;
01376 
01391         void (*ie_update)(void *ctx, struct wpabuf *beacon_ies,
01392                           struct wpabuf *proberesp_ies);
01393 
01400         void (*idle_update)(void *ctx, int idle);
01401 };
01402 
01414 struct p2p_group * p2p_group_init(struct p2p_data *p2p,
01415                                   struct p2p_group_config *config);
01416 
01422 void p2p_group_deinit(struct p2p_group *group);
01423 
01433 int p2p_group_notif_assoc(struct p2p_group *group, const u8 *addr,
01434                           const u8 *ie, size_t len);
01435 
01446 struct wpabuf * p2p_group_assoc_resp_ie(struct p2p_group *group, u8 status);
01447 
01454 void p2p_group_notif_disassoc(struct p2p_group *group, const u8 *addr);
01455 
01461 void p2p_group_notif_formation_done(struct p2p_group *group);
01462 
01475 int p2p_group_notif_noa(struct p2p_group *group, const u8 *noa,
01476                         size_t noa_len);
01477 
01490 int p2p_group_match_dev_type(struct p2p_group *group, struct wpabuf *wps);
01491 
01496 int p2p_group_match_dev_id(struct p2p_group *group, struct wpabuf *p2p);
01497 
01504 int p2p_group_go_discover(struct p2p_group *group, const u8 *dev_id,
01505                           const u8 *searching_dev, int rx_freq);
01506 
01507 
01508 /* Generic helper functions */
01509 
01521 int p2p_ie_text(struct wpabuf *p2p_ie, char *buf, char *end);
01522 
01535 int p2p_scan_result_text(const u8 *ies, size_t ies_len, char *buf, char *end);
01536 
01545 int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr);
01546 
01558 int p2p_assoc_req_ie(struct p2p_data *p2p, const u8 *bssid, u8 *buf,
01559                      size_t len, int p2p_group, struct wpabuf *p2p_ie);
01560 
01568 void p2p_scan_ie(struct p2p_data *p2p, struct wpabuf *ies, const u8 *dev_id);
01569 
01576 size_t p2p_scan_ie_buf_len(struct p2p_data *p2p);
01577 
01585 int p2p_go_params(struct p2p_data *p2p, struct p2p_go_neg_results *params);
01586 
01593 u8 p2p_get_group_capab(const struct wpabuf *p2p_ie);
01594 
01601 int p2p_get_cross_connect_disallowed(const struct wpabuf *p2p_ie);
01602 
01609 const u8 * p2p_get_go_dev_addr(const struct wpabuf *p2p_ie);
01610 
01619 const struct p2p_peer_info * p2p_get_peer_info(struct p2p_data *p2p,
01620                                                const u8 *addr, int next);
01621 
01634 int p2p_get_peer_info_txt(const struct p2p_peer_info *info,
01635                           char *buf, size_t buflen);
01636 
01644 int p2p_peer_known(struct p2p_data *p2p, const u8 *addr);
01645 
01656 void p2p_set_client_discoverability(struct p2p_data *p2p, int enabled);
01657 
01664 void p2p_set_managed_oper(struct p2p_data *p2p, int enabled);
01665 
01666 int p2p_set_listen_channel(struct p2p_data *p2p, u8 reg_class, u8 channel);
01667 
01668 int p2p_set_ssid_postfix(struct p2p_data *p2p, const u8 *postfix, size_t len);
01669 
01670 int p2p_get_interface_addr(struct p2p_data *p2p, const u8 *dev_addr,
01671                            u8 *iface_addr);
01672 int p2p_get_dev_addr(struct p2p_data *p2p, const u8 *iface_addr,
01673                            u8 *dev_addr);
01674 
01675 void p2p_set_peer_filter(struct p2p_data *p2p, const u8 *addr);
01676 
01683 void p2p_set_cross_connect(struct p2p_data *p2p, int enabled);
01684 
01685 int p2p_get_oper_freq(struct p2p_data *p2p, const u8 *iface_addr);
01686 
01693 void p2p_set_intra_bss_dist(struct p2p_data *p2p, int enabled);
01694 
01702 int p2p_supported_freq(struct p2p_data *p2p, unsigned int freq);
01703 
01704 void p2p_update_channel_list(struct p2p_data *p2p, struct p2p_channels *chan);
01705 
01714 void p2p_set_best_channels(struct p2p_data *p2p, int freq_24, int freq_5,
01715                            int freq_overall);
01716 
01717 const u8 * p2p_get_go_neg_peer(struct p2p_data *p2p);
01718 
01725 unsigned int p2p_get_group_num_members(struct p2p_group *group);
01726 
01735 const u8 * p2p_iterate_group_members(struct p2p_group *group, void **next);
01736 
01745 const u8 * p2p_group_get_dev_addr(struct p2p_group *group, const u8 *addr);
01746 
01754 int p2p_group_is_client_connected(struct p2p_group *group, const u8 *dev_addr);
01755 
01764 const struct p2p_peer_info *
01765 p2p_get_peer_found(struct p2p_data *p2p, const u8 *addr, int next);
01766 
01772 void p2p_remove_wps_vendor_extensions(struct p2p_data *p2p);
01773 
01784 int p2p_add_wps_vendor_extension(struct p2p_data *p2p,
01785                                  const struct wpabuf *vendor_ext);
01786 
01796 int p2p_set_oper_channel(struct p2p_data *p2p, u8 op_reg_class, u8 op_channel,
01797                          int cfg_op_channel);
01798 
01807 int p2p_set_pref_chan(struct p2p_data *p2p, unsigned int num_pref_chan,
01808                       const struct p2p_channel *pref_chan);
01809 
01816 int p2p_in_progress(struct p2p_data *p2p);
01817 
01824 int p2p_other_scan_completed(struct p2p_data *p2p);
01825 
01826 const char * p2p_wps_method_text(enum p2p_wps_method method);
01827 
01828 #endif /* P2P_H */
01829 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines