|
@@ -330,6 +330,30 @@ void p2p_buf_add_p2p_interface(struct wpabuf *buf, struct p2p_data *p2p)
|
|
|
}
|
|
|
|
|
|
|
|
|
+static void p2p_add_wps_string(struct wpabuf *buf, enum wps_attribute attr,
|
|
|
+ const char *val)
|
|
|
+{
|
|
|
+ size_t len;
|
|
|
+
|
|
|
+ wpabuf_put_be16(buf, attr);
|
|
|
+ len = val ? os_strlen(val) : 0;
|
|
|
+#ifndef CONFIG_WPS_STRICT
|
|
|
+ if (len == 0) {
|
|
|
+ /*
|
|
|
+ * Some deployed WPS implementations fail to parse zeor-length
|
|
|
+ * attributes. As a workaround, send a space character if the
|
|
|
+ * device attribute string is empty.
|
|
|
+ */
|
|
|
+ wpabuf_put_be16(buf, 1);
|
|
|
+ wpabuf_put_u8(buf, ' ');
|
|
|
+ }
|
|
|
+#endif /* CONFIG_WPS_STRICT */
|
|
|
+ wpabuf_put_be16(buf, len);
|
|
|
+ if (val)
|
|
|
+ wpabuf_put_data(buf, val, len);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void p2p_build_wps_ie(struct p2p_data *p2p, struct wpabuf *buf, u16 pw_id,
|
|
|
int all_attr)
|
|
|
{
|
|
@@ -355,34 +379,28 @@ void p2p_build_wps_ie(struct p2p_data *p2p, struct wpabuf *buf, u16 pw_id,
|
|
|
wpabuf_put_be16(buf, pw_id);
|
|
|
|
|
|
if (all_attr) {
|
|
|
- size_t nlen;
|
|
|
-
|
|
|
wpabuf_put_be16(buf, ATTR_RESPONSE_TYPE);
|
|
|
wpabuf_put_be16(buf, 1);
|
|
|
wpabuf_put_u8(buf, WPS_RESP_ENROLLEE_INFO);
|
|
|
|
|
|
-#if 0
|
|
|
- /* FIX */
|
|
|
- wps_build_uuid_e(buf, reg->wps->uuid);
|
|
|
- wps_build_manufacturer(dev, buf);
|
|
|
- wps_build_model_name(dev, buf);
|
|
|
- wps_build_model_number(dev, buf);
|
|
|
- wps_build_serial_number(dev, buf);
|
|
|
-#endif
|
|
|
+ wps_build_uuid_e(buf, p2p->cfg->uuid);
|
|
|
+ p2p_add_wps_string(buf, ATTR_MANUFACTURER,
|
|
|
+ p2p->cfg->manufacturer);
|
|
|
+ p2p_add_wps_string(buf, ATTR_MODEL_NAME, p2p->cfg->model_name);
|
|
|
+ p2p_add_wps_string(buf, ATTR_MODEL_NUMBER,
|
|
|
+ p2p->cfg->model_number);
|
|
|
+ p2p_add_wps_string(buf, ATTR_SERIAL_NUMBER,
|
|
|
+ p2p->cfg->serial_number);
|
|
|
|
|
|
wpabuf_put_be16(buf, ATTR_PRIMARY_DEV_TYPE);
|
|
|
wpabuf_put_be16(buf, WPS_DEV_TYPE_LEN);
|
|
|
wpabuf_put_data(buf, p2p->cfg->pri_dev_type, WPS_DEV_TYPE_LEN);
|
|
|
|
|
|
- wpabuf_put_be16(buf, ATTR_DEV_NAME);
|
|
|
- nlen = p2p->cfg->dev_name ? os_strlen(p2p->cfg->dev_name) : 0;
|
|
|
- wpabuf_put_be16(buf, nlen);
|
|
|
- if (p2p->cfg->dev_name)
|
|
|
- wpabuf_put_data(buf, p2p->cfg->dev_name, nlen);
|
|
|
+ p2p_add_wps_string(buf, ATTR_DEV_NAME, p2p->cfg->dev_name);
|
|
|
|
|
|
wpabuf_put_be16(buf, ATTR_CONFIG_METHODS);
|
|
|
wpabuf_put_be16(buf, 2);
|
|
|
- wpabuf_put_be16(buf, 0); /* FIX: ? */
|
|
|
+ wpabuf_put_be16(buf, p2p->cfg->config_methods);
|
|
|
}
|
|
|
|
|
|
wps_build_wfa_ext(buf, 0, NULL, 0);
|