|
wpa_supplicant / hostapd 2.0
|
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
1.7.3