[PATCH] WPS: Send the credential when learning AP params in registrar role

Olivier Sobrie olivier at sobrie.be
Tue Aug 9 18:02:02 EDT 2011


When the supplicant acts as a registrar to learn the access point
parameters then send the credentials to the wpa_cli interface after
receiving the 7th message.
When setting the option 'wps_cred_processing' to 1 or 2 in the
wpa_supplicant.conf you should receive the credential through the
wpa control interface.

Without this patch, after the 7th message you got the WPS-CRED-RECEIVED
notification without the credentials. This was because the cred_attr and
cred_attr_len were not filled in in the wps structure.

Signed-off-by: Olivier Sobrie <olivier at sobrie.be>
---
 src/wps/wps_registrar.c |   36 ++++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/src/wps/wps_registrar.c b/src/wps/wps_registrar.c
index 2d7f632..1f964e7 100644
--- a/src/wps/wps_registrar.c
+++ b/src/wps/wps_registrar.c
@@ -1592,6 +1592,29 @@ static int wps_build_ap_settings(struct wps_data *wps, struct wpabuf *msg)
 	return 0;
 }
 
+static int wps_build_ap_cred(struct wps_data *wps, struct wpabuf *msg)
+{
+	struct wpabuf *plain;
+
+	plain = wpabuf_alloc(200);
+	if (plain == NULL)
+		return -1;
+
+	if (wps_build_ap_settings(wps, plain)) {
+		wpabuf_free(plain);
+		return -1;
+	}
+
+	wpabuf_put_be16(msg, ATTR_CRED);
+	wpabuf_put_be16(msg, wpabuf_len(plain));
+	wpabuf_put_buf(msg, plain);
+	wpabuf_free(plain);
+
+	wps->cred.cred_attr = wpabuf_head(msg);
+	wps->cred.cred_attr_len = wpabuf_len(msg);
+
+	return 0;
+}
 
 static struct wpabuf * wps_build_m2(struct wps_data *wps)
 {
@@ -2551,6 +2574,8 @@ static void wps_cred_update(struct wps_credential *dst,
 static int wps_process_ap_settings_r(struct wps_data *wps,
 				     struct wps_parse_attr *attr)
 {
+	struct wpabuf *msg;
+
 	if (wps->wps->ap || wps->er)
 		return 0;
 
@@ -2577,12 +2602,23 @@ static int wps_process_ap_settings_r(struct wps_data *wps,
 		 */
 		wps_registrar_pin_completed(wps->wps->registrar);
 
+		msg = wpabuf_alloc(1000);
+		if (msg == NULL)
+			return -1;
+
+		if (wps_build_ap_cred(wps, msg)) {
+			wpabuf_free(msg);
+			return -1;
+		}
+
 		if (wps->ap_settings_cb) {
 			wps->ap_settings_cb(wps->ap_settings_cb_ctx,
 					    &wps->cred);
+			wpabuf_free(msg);
 			return 1;
 		}
 		wps_sta_cred_cb(wps);
+		wpabuf_free(msg);
 		return 1;
 	}
 }
-- 
1.7.6



More information about the HostAP mailing list