139beb93cSSam Leffler /* 239beb93cSSam Leffler * Wi-Fi Protected Setup 339beb93cSSam Leffler * Copyright (c) 2007-2008, Jouni Malinen <j@w1.fi> 439beb93cSSam Leffler * 539beb93cSSam Leffler * This program is free software; you can redistribute it and/or modify 639beb93cSSam Leffler * it under the terms of the GNU General Public License version 2 as 739beb93cSSam Leffler * published by the Free Software Foundation. 839beb93cSSam Leffler * 939beb93cSSam Leffler * Alternatively, this software may be distributed under the terms of BSD 1039beb93cSSam Leffler * license. 1139beb93cSSam Leffler * 1239beb93cSSam Leffler * See README and COPYING for more details. 1339beb93cSSam Leffler */ 1439beb93cSSam Leffler 1539beb93cSSam Leffler #ifndef WPS_H 1639beb93cSSam Leffler #define WPS_H 1739beb93cSSam Leffler 1839beb93cSSam Leffler #include "wps_defs.h" 1939beb93cSSam Leffler 2039beb93cSSam Leffler /** 2139beb93cSSam Leffler * enum wsc_op_code - EAP-WSC OP-Code values 2239beb93cSSam Leffler */ 2339beb93cSSam Leffler enum wsc_op_code { 2439beb93cSSam Leffler WSC_UPnP = 0 /* No OP Code in UPnP transport */, 2539beb93cSSam Leffler WSC_Start = 0x01, 2639beb93cSSam Leffler WSC_ACK = 0x02, 2739beb93cSSam Leffler WSC_NACK = 0x03, 2839beb93cSSam Leffler WSC_MSG = 0x04, 2939beb93cSSam Leffler WSC_Done = 0x05, 3039beb93cSSam Leffler WSC_FRAG_ACK = 0x06 3139beb93cSSam Leffler }; 3239beb93cSSam Leffler 3339beb93cSSam Leffler struct wps_registrar; 3439beb93cSSam Leffler struct upnp_wps_device_sm; 3539beb93cSSam Leffler 3639beb93cSSam Leffler /** 3739beb93cSSam Leffler * struct wps_credential - WPS Credential 3839beb93cSSam Leffler * @ssid: SSID 3939beb93cSSam Leffler * @ssid_len: Length of SSID 4039beb93cSSam Leffler * @auth_type: Authentication Type (WPS_AUTH_OPEN, .. flags) 4139beb93cSSam Leffler * @encr_type: Encryption Type (WPS_ENCR_NONE, .. flags) 4239beb93cSSam Leffler * @key_idx: Key index 4339beb93cSSam Leffler * @key: Key 4439beb93cSSam Leffler * @key_len: Key length in octets 4539beb93cSSam Leffler * @mac_addr: MAC address of the peer 4639beb93cSSam Leffler * @cred_attr: Unparsed Credential attribute data (used only in cred_cb()); 4739beb93cSSam Leffler * this may be %NULL, if not used 4839beb93cSSam Leffler * @cred_attr_len: Length of cred_attr in octets 4939beb93cSSam Leffler */ 5039beb93cSSam Leffler struct wps_credential { 5139beb93cSSam Leffler u8 ssid[32]; 5239beb93cSSam Leffler size_t ssid_len; 5339beb93cSSam Leffler u16 auth_type; 5439beb93cSSam Leffler u16 encr_type; 5539beb93cSSam Leffler u8 key_idx; 5639beb93cSSam Leffler u8 key[64]; 5739beb93cSSam Leffler size_t key_len; 5839beb93cSSam Leffler u8 mac_addr[ETH_ALEN]; 5939beb93cSSam Leffler const u8 *cred_attr; 6039beb93cSSam Leffler size_t cred_attr_len; 6139beb93cSSam Leffler }; 6239beb93cSSam Leffler 6339beb93cSSam Leffler /** 6439beb93cSSam Leffler * struct wps_device_data - WPS Device Data 6539beb93cSSam Leffler * @mac_addr: Device MAC address 6639beb93cSSam Leffler * @device_name: Device Name (0..32 octets encoded in UTF-8) 6739beb93cSSam Leffler * @manufacturer: Manufacturer (0..64 octets encoded in UTF-8) 6839beb93cSSam Leffler * @model_name: Model Name (0..32 octets encoded in UTF-8) 6939beb93cSSam Leffler * @model_number: Model Number (0..32 octets encoded in UTF-8) 7039beb93cSSam Leffler * @serial_number: Serial Number (0..32 octets encoded in UTF-8) 7139beb93cSSam Leffler * @categ: Primary Device Category 7239beb93cSSam Leffler * @oui: Primary Device OUI 7339beb93cSSam Leffler * @sub_categ: Primary Device Sub-Category 7439beb93cSSam Leffler * @os_version: OS Version 7539beb93cSSam Leffler * @rf_bands: RF bands (WPS_RF_24GHZ, WPS_RF_50GHZ flags) 7639beb93cSSam Leffler */ 7739beb93cSSam Leffler struct wps_device_data { 7839beb93cSSam Leffler u8 mac_addr[ETH_ALEN]; 7939beb93cSSam Leffler char *device_name; 8039beb93cSSam Leffler char *manufacturer; 8139beb93cSSam Leffler char *model_name; 8239beb93cSSam Leffler char *model_number; 8339beb93cSSam Leffler char *serial_number; 8439beb93cSSam Leffler u16 categ; 8539beb93cSSam Leffler u32 oui; 8639beb93cSSam Leffler u16 sub_categ; 8739beb93cSSam Leffler u32 os_version; 8839beb93cSSam Leffler u8 rf_bands; 8939beb93cSSam Leffler }; 9039beb93cSSam Leffler 9139beb93cSSam Leffler /** 9239beb93cSSam Leffler * struct wps_config - WPS configuration for a single registration protocol run 9339beb93cSSam Leffler */ 9439beb93cSSam Leffler struct wps_config { 9539beb93cSSam Leffler /** 9639beb93cSSam Leffler * wps - Pointer to long term WPS context 9739beb93cSSam Leffler */ 9839beb93cSSam Leffler struct wps_context *wps; 9939beb93cSSam Leffler 10039beb93cSSam Leffler /** 10139beb93cSSam Leffler * registrar - Whether this end is a Registrar 10239beb93cSSam Leffler */ 10339beb93cSSam Leffler int registrar; 10439beb93cSSam Leffler 10539beb93cSSam Leffler /** 10639beb93cSSam Leffler * pin - Enrollee Device Password (%NULL for Registrar or PBC) 10739beb93cSSam Leffler */ 10839beb93cSSam Leffler const u8 *pin; 10939beb93cSSam Leffler 11039beb93cSSam Leffler /** 11139beb93cSSam Leffler * pin_len - Length on pin in octets 11239beb93cSSam Leffler */ 11339beb93cSSam Leffler size_t pin_len; 11439beb93cSSam Leffler 11539beb93cSSam Leffler /** 11639beb93cSSam Leffler * pbc - Whether this is protocol run uses PBC 11739beb93cSSam Leffler */ 11839beb93cSSam Leffler int pbc; 11939beb93cSSam Leffler 12039beb93cSSam Leffler /** 12139beb93cSSam Leffler * assoc_wps_ie: (Re)AssocReq WPS IE (in AP; %NULL if not AP) 12239beb93cSSam Leffler */ 12339beb93cSSam Leffler const struct wpabuf *assoc_wps_ie; 12439beb93cSSam Leffler }; 12539beb93cSSam Leffler 12639beb93cSSam Leffler struct wps_data * wps_init(const struct wps_config *cfg); 12739beb93cSSam Leffler 12839beb93cSSam Leffler void wps_deinit(struct wps_data *data); 12939beb93cSSam Leffler 13039beb93cSSam Leffler /** 13139beb93cSSam Leffler * enum wps_process_res - WPS message processing result 13239beb93cSSam Leffler */ 13339beb93cSSam Leffler enum wps_process_res { 13439beb93cSSam Leffler /** 13539beb93cSSam Leffler * WPS_DONE - Processing done 13639beb93cSSam Leffler */ 13739beb93cSSam Leffler WPS_DONE, 13839beb93cSSam Leffler 13939beb93cSSam Leffler /** 14039beb93cSSam Leffler * WPS_CONTINUE - Processing continues 14139beb93cSSam Leffler */ 14239beb93cSSam Leffler WPS_CONTINUE, 14339beb93cSSam Leffler 14439beb93cSSam Leffler /** 14539beb93cSSam Leffler * WPS_FAILURE - Processing failed 14639beb93cSSam Leffler */ 14739beb93cSSam Leffler WPS_FAILURE, 14839beb93cSSam Leffler 14939beb93cSSam Leffler /** 15039beb93cSSam Leffler * WPS_PENDING - Processing continues, but waiting for an external 15139beb93cSSam Leffler * event (e.g., UPnP message from an external Registrar) 15239beb93cSSam Leffler */ 15339beb93cSSam Leffler WPS_PENDING 15439beb93cSSam Leffler }; 15539beb93cSSam Leffler enum wps_process_res wps_process_msg(struct wps_data *wps, 15639beb93cSSam Leffler enum wsc_op_code op_code, 15739beb93cSSam Leffler const struct wpabuf *msg); 15839beb93cSSam Leffler 15939beb93cSSam Leffler struct wpabuf * wps_get_msg(struct wps_data *wps, enum wsc_op_code *op_code); 16039beb93cSSam Leffler 16139beb93cSSam Leffler int wps_is_selected_pbc_registrar(const struct wpabuf *msg); 16239beb93cSSam Leffler int wps_is_selected_pin_registrar(const struct wpabuf *msg); 16339beb93cSSam Leffler const u8 * wps_get_uuid_e(const struct wpabuf *msg); 16439beb93cSSam Leffler 16539beb93cSSam Leffler struct wpabuf * wps_build_assoc_req_ie(enum wps_request_type req_type); 16639beb93cSSam Leffler struct wpabuf * wps_build_probe_req_ie(int pbc, struct wps_device_data *dev, 16739beb93cSSam Leffler const u8 *uuid, 16839beb93cSSam Leffler enum wps_request_type req_type); 16939beb93cSSam Leffler 17039beb93cSSam Leffler 17139beb93cSSam Leffler /** 17239beb93cSSam Leffler * struct wps_registrar_config - WPS Registrar configuration 17339beb93cSSam Leffler */ 17439beb93cSSam Leffler struct wps_registrar_config { 17539beb93cSSam Leffler /** 17639beb93cSSam Leffler * new_psk_cb - Callback for new PSK 17739beb93cSSam Leffler * @ctx: Higher layer context data (cb_ctx) 17839beb93cSSam Leffler * @mac_addr: MAC address of the Enrollee 17939beb93cSSam Leffler * @psk: The new PSK 18039beb93cSSam Leffler * @psk_len: The length of psk in octets 18139beb93cSSam Leffler * Returns: 0 on success, -1 on failure 18239beb93cSSam Leffler * 18339beb93cSSam Leffler * This callback is called when a new per-device PSK is provisioned. 18439beb93cSSam Leffler */ 18539beb93cSSam Leffler int (*new_psk_cb)(void *ctx, const u8 *mac_addr, const u8 *psk, 18639beb93cSSam Leffler size_t psk_len); 18739beb93cSSam Leffler 18839beb93cSSam Leffler /** 18939beb93cSSam Leffler * set_ie_cb - Callback for WPS IE changes 19039beb93cSSam Leffler * @ctx: Higher layer context data (cb_ctx) 19139beb93cSSam Leffler * @beacon_ie: WPS IE for Beacon 19239beb93cSSam Leffler * @beacon_ie_len: WPS IE length for Beacon 19339beb93cSSam Leffler * @probe_resp_ie: WPS IE for Probe Response 19439beb93cSSam Leffler * @probe_resp_ie_len: WPS IE length for Probe Response 19539beb93cSSam Leffler * Returns: 0 on success, -1 on failure 19639beb93cSSam Leffler * 19739beb93cSSam Leffler * This callback is called whenever the WPS IE in Beacon or Probe 19839beb93cSSam Leffler * Response frames needs to be changed (AP only). 19939beb93cSSam Leffler */ 20039beb93cSSam Leffler int (*set_ie_cb)(void *ctx, const u8 *beacon_ie, size_t beacon_ie_len, 20139beb93cSSam Leffler const u8 *probe_resp_ie, size_t probe_resp_ie_len); 20239beb93cSSam Leffler 20339beb93cSSam Leffler /** 20439beb93cSSam Leffler * pin_needed_cb - Callback for requesting a PIN 20539beb93cSSam Leffler * @ctx: Higher layer context data (cb_ctx) 20639beb93cSSam Leffler * @uuid_e: UUID-E of the unknown Enrollee 20739beb93cSSam Leffler * @dev: Device Data from the unknown Enrollee 20839beb93cSSam Leffler * 20939beb93cSSam Leffler * This callback is called whenever an unknown Enrollee requests to use 21039beb93cSSam Leffler * PIN method and a matching PIN (Device Password) is not found in 21139beb93cSSam Leffler * Registrar data. 21239beb93cSSam Leffler */ 21339beb93cSSam Leffler void (*pin_needed_cb)(void *ctx, const u8 *uuid_e, 21439beb93cSSam Leffler const struct wps_device_data *dev); 21539beb93cSSam Leffler 21639beb93cSSam Leffler /** 21739beb93cSSam Leffler * reg_success_cb - Callback for reporting successful registration 21839beb93cSSam Leffler * @ctx: Higher layer context data (cb_ctx) 21939beb93cSSam Leffler * @mac_addr: MAC address of the Enrollee 22039beb93cSSam Leffler * @uuid_e: UUID-E of the Enrollee 22139beb93cSSam Leffler * 22239beb93cSSam Leffler * This callback is called whenever an Enrollee completes registration 22339beb93cSSam Leffler * successfully. 22439beb93cSSam Leffler */ 22539beb93cSSam Leffler void (*reg_success_cb)(void *ctx, const u8 *mac_addr, 22639beb93cSSam Leffler const u8 *uuid_e); 22739beb93cSSam Leffler 22839beb93cSSam Leffler /** 22939beb93cSSam Leffler * cb_ctx: Higher layer context data for Registrar callbacks 23039beb93cSSam Leffler */ 23139beb93cSSam Leffler void *cb_ctx; 23239beb93cSSam Leffler 23339beb93cSSam Leffler /** 23439beb93cSSam Leffler * skip_cred_build: Do not build credential 23539beb93cSSam Leffler * 23639beb93cSSam Leffler * This option can be used to disable internal code that builds 23739beb93cSSam Leffler * Credential attribute into M8 based on the current network 23839beb93cSSam Leffler * configuration and Enrollee capabilities. The extra_cred data will 23939beb93cSSam Leffler * then be used as the Credential(s). 24039beb93cSSam Leffler */ 24139beb93cSSam Leffler int skip_cred_build; 24239beb93cSSam Leffler 24339beb93cSSam Leffler /** 24439beb93cSSam Leffler * extra_cred: Additional Credential attribute(s) 24539beb93cSSam Leffler * 24639beb93cSSam Leffler * This optional data (set to %NULL to disable) can be used to add 24739beb93cSSam Leffler * Credential attribute(s) for other networks into M8. If 24839beb93cSSam Leffler * skip_cred_build is set, this will also override the automatically 24939beb93cSSam Leffler * generated Credential attribute. 25039beb93cSSam Leffler */ 25139beb93cSSam Leffler const u8 *extra_cred; 25239beb93cSSam Leffler 25339beb93cSSam Leffler /** 25439beb93cSSam Leffler * extra_cred_len: Length of extra_cred in octets 25539beb93cSSam Leffler */ 25639beb93cSSam Leffler size_t extra_cred_len; 25739beb93cSSam Leffler 25839beb93cSSam Leffler /** 25939beb93cSSam Leffler * disable_auto_conf - Disable auto-configuration on first registration 26039beb93cSSam Leffler * 26139beb93cSSam Leffler * By default, the AP that is started in not configured state will 26239beb93cSSam Leffler * generate a random PSK and move to configured state when the first 26339beb93cSSam Leffler * registration protocol run is completed successfully. This option can 26439beb93cSSam Leffler * be used to disable this functionality and leave it up to an external 26539beb93cSSam Leffler * program to take care of configuration. This requires the extra_cred 26639beb93cSSam Leffler * to be set with a suitable Credential and skip_cred_build being used. 26739beb93cSSam Leffler */ 26839beb93cSSam Leffler int disable_auto_conf; 26939beb93cSSam Leffler }; 27039beb93cSSam Leffler 27139beb93cSSam Leffler 27239beb93cSSam Leffler /** 27339beb93cSSam Leffler * enum wps_event - WPS event types 27439beb93cSSam Leffler */ 27539beb93cSSam Leffler enum wps_event { 27639beb93cSSam Leffler /** 27739beb93cSSam Leffler * WPS_EV_M2D - M2D received (Registrar did not know us) 27839beb93cSSam Leffler */ 27939beb93cSSam Leffler WPS_EV_M2D, 28039beb93cSSam Leffler 28139beb93cSSam Leffler /** 28239beb93cSSam Leffler * WPS_EV_FAIL - Registration failed 28339beb93cSSam Leffler */ 28439beb93cSSam Leffler WPS_EV_FAIL, 28539beb93cSSam Leffler 28639beb93cSSam Leffler /** 28739beb93cSSam Leffler * WPS_EV_SUCCESS - Registration succeeded 28839beb93cSSam Leffler */ 28939beb93cSSam Leffler WPS_EV_SUCCESS, 29039beb93cSSam Leffler 29139beb93cSSam Leffler /** 29239beb93cSSam Leffler * WPS_EV_PWD_AUTH_FAIL - Password authentication failed 29339beb93cSSam Leffler */ 29439beb93cSSam Leffler WPS_EV_PWD_AUTH_FAIL 29539beb93cSSam Leffler }; 29639beb93cSSam Leffler 29739beb93cSSam Leffler /** 29839beb93cSSam Leffler * union wps_event_data - WPS event data 29939beb93cSSam Leffler */ 30039beb93cSSam Leffler union wps_event_data { 30139beb93cSSam Leffler /** 30239beb93cSSam Leffler * struct wps_event_m2d - M2D event data 30339beb93cSSam Leffler */ 30439beb93cSSam Leffler struct wps_event_m2d { 30539beb93cSSam Leffler u16 config_methods; 30639beb93cSSam Leffler const u8 *manufacturer; 30739beb93cSSam Leffler size_t manufacturer_len; 30839beb93cSSam Leffler const u8 *model_name; 30939beb93cSSam Leffler size_t model_name_len; 31039beb93cSSam Leffler const u8 *model_number; 31139beb93cSSam Leffler size_t model_number_len; 31239beb93cSSam Leffler const u8 *serial_number; 31339beb93cSSam Leffler size_t serial_number_len; 31439beb93cSSam Leffler const u8 *dev_name; 31539beb93cSSam Leffler size_t dev_name_len; 31639beb93cSSam Leffler const u8 *primary_dev_type; /* 8 octets */ 31739beb93cSSam Leffler u16 config_error; 31839beb93cSSam Leffler u16 dev_password_id; 31939beb93cSSam Leffler } m2d; 32039beb93cSSam Leffler 32139beb93cSSam Leffler /** 32239beb93cSSam Leffler * struct wps_event_fail - Registration failure information 32339beb93cSSam Leffler * @msg: enum wps_msg_type 32439beb93cSSam Leffler */ 32539beb93cSSam Leffler struct wps_event_fail { 32639beb93cSSam Leffler int msg; 32739beb93cSSam Leffler } fail; 32839beb93cSSam Leffler 32939beb93cSSam Leffler struct wps_event_pwd_auth_fail { 33039beb93cSSam Leffler int enrollee; 33139beb93cSSam Leffler int part; 33239beb93cSSam Leffler } pwd_auth_fail; 33339beb93cSSam Leffler }; 33439beb93cSSam Leffler 33539beb93cSSam Leffler /** 33639beb93cSSam Leffler * struct upnp_pending_message - Pending PutWLANResponse messages 33739beb93cSSam Leffler * @next: Pointer to next pending message or %NULL 33839beb93cSSam Leffler * @addr: NewWLANEventMAC 33939beb93cSSam Leffler * @msg: NewMessage 34039beb93cSSam Leffler * @type: Message Type 34139beb93cSSam Leffler */ 34239beb93cSSam Leffler struct upnp_pending_message { 34339beb93cSSam Leffler struct upnp_pending_message *next; 34439beb93cSSam Leffler u8 addr[ETH_ALEN]; 34539beb93cSSam Leffler struct wpabuf *msg; 34639beb93cSSam Leffler enum wps_msg_type type; 34739beb93cSSam Leffler }; 34839beb93cSSam Leffler 34939beb93cSSam Leffler /** 35039beb93cSSam Leffler * struct wps_context - Long term WPS context data 35139beb93cSSam Leffler * 35239beb93cSSam Leffler * This data is stored at the higher layer Authenticator or Supplicant data 35339beb93cSSam Leffler * structures and it is maintained over multiple registration protocol runs. 35439beb93cSSam Leffler */ 35539beb93cSSam Leffler struct wps_context { 35639beb93cSSam Leffler /** 35739beb93cSSam Leffler * ap - Whether the local end is an access point 35839beb93cSSam Leffler */ 35939beb93cSSam Leffler int ap; 36039beb93cSSam Leffler 36139beb93cSSam Leffler /** 36239beb93cSSam Leffler * registrar - Pointer to WPS registrar data from wps_registrar_init() 36339beb93cSSam Leffler */ 36439beb93cSSam Leffler struct wps_registrar *registrar; 36539beb93cSSam Leffler 36639beb93cSSam Leffler /** 36739beb93cSSam Leffler * wps_state - Current WPS state 36839beb93cSSam Leffler */ 36939beb93cSSam Leffler enum wps_state wps_state; 37039beb93cSSam Leffler 37139beb93cSSam Leffler /** 37239beb93cSSam Leffler * ap_setup_locked - Whether AP setup is locked (only used at AP) 37339beb93cSSam Leffler */ 37439beb93cSSam Leffler int ap_setup_locked; 37539beb93cSSam Leffler 37639beb93cSSam Leffler /** 37739beb93cSSam Leffler * uuid - Own UUID 37839beb93cSSam Leffler */ 37939beb93cSSam Leffler u8 uuid[16]; 38039beb93cSSam Leffler 38139beb93cSSam Leffler /** 38239beb93cSSam Leffler * ssid - SSID 38339beb93cSSam Leffler * 38439beb93cSSam Leffler * This SSID is used by the Registrar to fill in information for 38539beb93cSSam Leffler * Credentials. In addition, AP uses it when acting as an Enrollee to 38639beb93cSSam Leffler * notify Registrar of the current configuration. 38739beb93cSSam Leffler */ 38839beb93cSSam Leffler u8 ssid[32]; 38939beb93cSSam Leffler 39039beb93cSSam Leffler /** 39139beb93cSSam Leffler * ssid_len - Length of ssid in octets 39239beb93cSSam Leffler */ 39339beb93cSSam Leffler size_t ssid_len; 39439beb93cSSam Leffler 39539beb93cSSam Leffler /** 39639beb93cSSam Leffler * dev - Own WPS device data 39739beb93cSSam Leffler */ 39839beb93cSSam Leffler struct wps_device_data dev; 39939beb93cSSam Leffler 40039beb93cSSam Leffler /** 40139beb93cSSam Leffler * config_methods - Enabled configuration methods 40239beb93cSSam Leffler * 40339beb93cSSam Leffler * Bit field of WPS_CONFIG_* 40439beb93cSSam Leffler */ 40539beb93cSSam Leffler u16 config_methods; 40639beb93cSSam Leffler 40739beb93cSSam Leffler /** 40839beb93cSSam Leffler * encr_types - Enabled encryption types (bit field of WPS_ENCR_*) 40939beb93cSSam Leffler */ 41039beb93cSSam Leffler u16 encr_types; 41139beb93cSSam Leffler 41239beb93cSSam Leffler /** 41339beb93cSSam Leffler * auth_types - Authentication types (bit field of WPS_AUTH_*) 41439beb93cSSam Leffler */ 41539beb93cSSam Leffler u16 auth_types; 41639beb93cSSam Leffler 41739beb93cSSam Leffler /** 41839beb93cSSam Leffler * network_key - The current Network Key (PSK) or %NULL to generate new 41939beb93cSSam Leffler * 42039beb93cSSam Leffler * If %NULL, Registrar will generate per-device PSK. In addition, AP 42139beb93cSSam Leffler * uses this when acting as an Enrollee to notify Registrar of the 42239beb93cSSam Leffler * current configuration. 42339beb93cSSam Leffler */ 42439beb93cSSam Leffler u8 *network_key; 42539beb93cSSam Leffler 42639beb93cSSam Leffler /** 42739beb93cSSam Leffler * network_key_len - Length of network_key in octets 42839beb93cSSam Leffler */ 42939beb93cSSam Leffler size_t network_key_len; 43039beb93cSSam Leffler 43139beb93cSSam Leffler /** 43239beb93cSSam Leffler * ap_settings - AP Settings override for M7 (only used at AP) 43339beb93cSSam Leffler * 43439beb93cSSam Leffler * If %NULL, AP Settings attributes will be generated based on the 43539beb93cSSam Leffler * current network configuration. 43639beb93cSSam Leffler */ 43739beb93cSSam Leffler u8 *ap_settings; 43839beb93cSSam Leffler 43939beb93cSSam Leffler /** 44039beb93cSSam Leffler * ap_settings_len - Length of ap_settings in octets 44139beb93cSSam Leffler */ 44239beb93cSSam Leffler size_t ap_settings_len; 44339beb93cSSam Leffler 44439beb93cSSam Leffler /** 44539beb93cSSam Leffler * friendly_name - Friendly Name (required for UPnP) 44639beb93cSSam Leffler */ 44739beb93cSSam Leffler char *friendly_name; 44839beb93cSSam Leffler 44939beb93cSSam Leffler /** 45039beb93cSSam Leffler * manufacturer_url - Manufacturer URL (optional for UPnP) 45139beb93cSSam Leffler */ 45239beb93cSSam Leffler char *manufacturer_url; 45339beb93cSSam Leffler 45439beb93cSSam Leffler /** 45539beb93cSSam Leffler * model_description - Model Description (recommended for UPnP) 45639beb93cSSam Leffler */ 45739beb93cSSam Leffler char *model_description; 45839beb93cSSam Leffler 45939beb93cSSam Leffler /** 46039beb93cSSam Leffler * model_url - Model URL (optional for UPnP) 46139beb93cSSam Leffler */ 46239beb93cSSam Leffler char *model_url; 46339beb93cSSam Leffler 46439beb93cSSam Leffler /** 46539beb93cSSam Leffler * upc - Universal Product Code (optional for UPnP) 46639beb93cSSam Leffler */ 46739beb93cSSam Leffler char *upc; 46839beb93cSSam Leffler 46939beb93cSSam Leffler /** 47039beb93cSSam Leffler * cred_cb - Callback to notify that new Credentials were received 47139beb93cSSam Leffler * @ctx: Higher layer context data (cb_ctx) 47239beb93cSSam Leffler * @cred: The received Credential 47339beb93cSSam Leffler * Return: 0 on success, -1 on failure 47439beb93cSSam Leffler */ 47539beb93cSSam Leffler int (*cred_cb)(void *ctx, const struct wps_credential *cred); 47639beb93cSSam Leffler 47739beb93cSSam Leffler /** 47839beb93cSSam Leffler * event_cb - Event callback (state information about progress) 47939beb93cSSam Leffler * @ctx: Higher layer context data (cb_ctx) 48039beb93cSSam Leffler * @event: Event type 48139beb93cSSam Leffler * @data: Event data 48239beb93cSSam Leffler */ 48339beb93cSSam Leffler void (*event_cb)(void *ctx, enum wps_event event, 48439beb93cSSam Leffler union wps_event_data *data); 48539beb93cSSam Leffler 48639beb93cSSam Leffler /** 48739beb93cSSam Leffler * cb_ctx: Higher layer context data for callbacks 48839beb93cSSam Leffler */ 48939beb93cSSam Leffler void *cb_ctx; 49039beb93cSSam Leffler 49139beb93cSSam Leffler struct upnp_wps_device_sm *wps_upnp; 49239beb93cSSam Leffler 49339beb93cSSam Leffler /* Pending messages from UPnP PutWLANResponse */ 49439beb93cSSam Leffler struct upnp_pending_message *upnp_msgs; 49539beb93cSSam Leffler }; 49639beb93cSSam Leffler 49739beb93cSSam Leffler 49839beb93cSSam Leffler struct wps_registrar * 49939beb93cSSam Leffler wps_registrar_init(struct wps_context *wps, 50039beb93cSSam Leffler const struct wps_registrar_config *cfg); 50139beb93cSSam Leffler void wps_registrar_deinit(struct wps_registrar *reg); 50239beb93cSSam Leffler int wps_registrar_add_pin(struct wps_registrar *reg, const u8 *uuid, 50339beb93cSSam Leffler const u8 *pin, size_t pin_len); 50439beb93cSSam Leffler int wps_registrar_invalidate_pin(struct wps_registrar *reg, const u8 *uuid); 50539beb93cSSam Leffler int wps_registrar_unlock_pin(struct wps_registrar *reg, const u8 *uuid); 50639beb93cSSam Leffler int wps_registrar_button_pushed(struct wps_registrar *reg); 50739beb93cSSam Leffler void wps_registrar_probe_req_rx(struct wps_registrar *reg, const u8 *addr, 50839beb93cSSam Leffler const struct wpabuf *wps_data); 50939beb93cSSam Leffler int wps_registrar_update_ie(struct wps_registrar *reg); 51039beb93cSSam Leffler int wps_registrar_set_selected_registrar(struct wps_registrar *reg, 51139beb93cSSam Leffler const struct wpabuf *msg); 51239beb93cSSam Leffler 51339beb93cSSam Leffler unsigned int wps_pin_checksum(unsigned int pin); 51439beb93cSSam Leffler unsigned int wps_pin_valid(unsigned int pin); 51539beb93cSSam Leffler unsigned int wps_generate_pin(void); 51639beb93cSSam Leffler void wps_free_pending_msgs(struct upnp_pending_message *msgs); 51739beb93cSSam Leffler 51839beb93cSSam Leffler #endif /* WPS_H */ 519