When the requested device type is set, add it to the probe request WPS attributes. Signed-off-by: Johannes Berg --- src/wps/wps.c | 1 + src/wps/wps.h | 3 +++ src/wps/wps_dev_attr.c | 17 +++++++++++++++++ src/wps/wps_dev_attr.h | 1 + src/wps/wps_i.h | 1 - 5 files changed, 22 insertions(+), 1 deletions(-) diff --git a/src/wps/wps.c b/src/wps/wps.c index 954a5fd..5dbfe55 100644 --- a/src/wps/wps.c +++ b/src/wps/wps.c @@ -475,6 +475,7 @@ struct wpabuf * wps_build_probe_req_ie(int pbc, struct wps_device_data *dev, wps_build_uuid_e(ie, uuid) || wps_build_primary_dev_type(dev, ie) || wps_build_secondary_dev_type(dev, ie) || + wps_build_req_dev_type(dev, ie) || wps_build_rf_bands(dev, ie) || wps_build_assoc_state(NULL, ie) || wps_build_config_error(ie, WPS_CFG_NO_ERROR) || diff --git a/src/wps/wps.h b/src/wps/wps.h index f603878..e9c1f90 100644 --- a/src/wps/wps.h +++ b/src/wps/wps.h @@ -63,6 +63,7 @@ struct wps_credential { #define WPS_DEV_TYPE_LEN 8 #define WPS_DEV_TYPE_BUFSIZE 21 +#define MAX_REQ_DEV_TYPE_COUNT 10 /** * struct wps_device_data - WPS Device Data @@ -90,6 +91,8 @@ struct wps_device_data { #define WPS_SEC_DEVICE_TYPES 5 u8 sec_dev_type[WPS_SEC_DEVICE_TYPES][WPS_DEV_TYPE_LEN]; u8 nb_sec_dev_types; + u8 req_dev_type[MAX_REQ_DEV_TYPE_COUNT][WPS_DEV_TYPE_LEN]; + u8 nb_req_dev_types; u32 os_version; u8 rf_bands; diff --git a/src/wps/wps_dev_attr.c b/src/wps/wps_dev_attr.c index 7e928f2..f1d21d7 100644 --- a/src/wps/wps_dev_attr.c +++ b/src/wps/wps_dev_attr.c @@ -142,6 +142,23 @@ int wps_build_secondary_dev_type(struct wps_device_data *dev, return 0; } +int wps_build_req_dev_type(struct wps_device_data *dev, struct wpabuf *msg) +{ + int i; + + if (!dev->nb_req_dev_types) + return 0; + + wpa_printf(MSG_DEBUG, "WPS: * Requested Device Type(s)"); + + for (i = 0; i < dev->nb_req_dev_types; i++) { + wpabuf_put_be16(msg, ATTR_REQUESTED_DEV_TYPE); + wpabuf_put_be16(msg, WPS_DEV_TYPE_LEN); + wpabuf_put_data(msg, dev->req_dev_type[i], WPS_DEV_TYPE_LEN); + } + + return 0; +} int wps_build_dev_name(struct wps_device_data *dev, struct wpabuf *msg) { diff --git a/src/wps/wps_dev_attr.h b/src/wps/wps_dev_attr.h index dccbeb9..db4cb15 100644 --- a/src/wps/wps_dev_attr.h +++ b/src/wps/wps_dev_attr.h @@ -36,5 +36,6 @@ int wps_process_rf_bands(struct wps_device_data *dev, const u8 *bands); void wps_device_data_dup(struct wps_device_data *dst, const struct wps_device_data *src); void wps_device_data_free(struct wps_device_data *dev); +int wps_build_req_dev_type(struct wps_device_data *dev, struct wpabuf *msg); #endif /* WPS_DEV_ATTR_H */ diff --git a/src/wps/wps_i.h b/src/wps/wps_i.h index 9953efb..176825c 100644 --- a/src/wps/wps_i.h +++ b/src/wps/wps_i.h @@ -199,7 +199,6 @@ struct wps_parse_attr { size_t cred_len[MAX_CRED_COUNT]; size_t num_cred; -#define MAX_REQ_DEV_TYPE_COUNT 10 const u8 *req_dev_type[MAX_REQ_DEV_TYPE_COUNT]; size_t num_req_dev_type; }; -- 1.7.2.3