[PATCH 07/15] wpa_supplicant: Refactor wpas_rrm_build_lci_report()

Andrei Otcheretianski andrei.otcheretianski at intel.com
Wed Dec 28 05:06:39 PST 2016


From: Avraham Stern <avraham.stern at intel.com>

1. Change the return type to reflect whether building the report
   succeeded or failed.
2. Change argument type to rrm_measurement_request_element instead
   of raw packet data to ease processing the request.
3. Use already existing function to create the measurement report
   and add it to the report buffer.

Signed-off-by: Avraham Stern <avraham.stern at intel.com>
---
 wpa_supplicant/rrm.c | 77 +++++++++++++++++++++++++++++++---------------------
 1 file changed, 46 insertions(+), 31 deletions(-)

diff --git a/wpa_supplicant/rrm.c b/wpa_supplicant/rrm.c
index 584b1c4..696dd26 100644
--- a/wpa_supplicant/rrm.c
+++ b/wpa_supplicant/rrm.c
@@ -297,34 +297,34 @@ static int wpas_rrm_report_elem(struct wpabuf *buf, u8 token, u8 mode, u8 type,
 }
 
 
-static struct wpabuf * wpas_rrm_build_lci_report(struct wpa_supplicant *wpa_s,
-						 const u8 *request, size_t len,
-						 struct wpabuf *report)
+static int
+wpas_rrm_build_lci_report(struct wpa_supplicant *wpa_s,
+			  struct rrm_measurement_request_element *req,
+			  struct wpabuf **buf)
 {
-	u8 token, type, subject;
+	u8 subject;
 	u16 max_age = 0;
 	struct os_reltime t, diff;
 	unsigned long diff_l;
-	u8 *ptoken;
 	const u8 *subelem;
+	const u8 *request = req->variable;
+	size_t len = req->len - 3;
+
+	if (len < 4)
+		return -1;
 
-	if (!wpa_s->lci || len < 3 + 4)
-		return report;
+	if (!wpa_s->lci)
+		goto reject;
 
-	token = *request++;
-	/* Measurement request mode isn't used */
-	request++;
-	type = *request++;
 	subject = *request++;
 
-	wpa_printf(MSG_DEBUG,
-		   "Measurement request token %u type %u location subject %u",
-		   token, type, subject);
+	wpa_printf(MSG_DEBUG, "Measurement request location subject=%d",
+		   subject);
 
-	if (type != MEASURE_TYPE_LCI || subject != LOCATION_SUBJECT_REMOTE) {
+	if (subject != LOCATION_SUBJECT_REMOTE) {
 		wpa_printf(MSG_INFO,
-			   "Not building LCI report - bad type or location subject");
-		return report;
+			   "Not building LCI report - bad location subject");
+		return 0;
 	}
 
 	/* Subelements are formatted exactly like elements */
@@ -333,26 +333,43 @@ static struct wpabuf * wpas_rrm_build_lci_report(struct wpa_supplicant *wpa_s,
 		max_age = WPA_GET_LE16(subelem + 2);
 
 	if (os_get_reltime(&t))
-		return report;
+		goto reject;
 
 	os_reltime_sub(&t, &wpa_s->lci_time, &diff);
 	/* LCI age is calculated in 10th of a second units. */
 	diff_l = diff.sec * 10 + diff.usec / 100000;
 
 	if (max_age != 0xffff && max_age < diff_l)
-		return report;
+		goto reject;
+
+	if (wpabuf_resize(buf, 2 + wpabuf_len(wpa_s->lci)))
+		return -1;
+
+	if (wpas_rrm_report_elem(*buf, req->token,
+				 MEASUREMENT_REPORT_MODE_ACCEPT, req->type,
+				 wpabuf_head_u8(wpa_s->lci),
+				 wpabuf_len(wpa_s->lci)) < 0) {
+		wpa_printf(MSG_DEBUG, "Failed to add LCI report element");
+		return -1;
+	}
+
+	return 0;
 
-	if (wpabuf_resize(&report, 2 + wpabuf_len(wpa_s->lci)))
-		return report;
+reject:
+	if (wpabuf_resize(buf, sizeof(struct rrm_measurement_report_element))) {
+		wpa_printf(MSG_DEBUG,
+			   "RRM: Memory allocation failed");
+		return -1;
+	}
 
-	wpabuf_put_u8(report, WLAN_EID_MEASURE_REPORT);
-	wpabuf_put_u8(report, wpabuf_len(wpa_s->lci));
-	/* We'll override user's measurement token */
-	ptoken = wpabuf_put(report, 0);
-	wpabuf_put_buf(report, wpa_s->lci);
-	*ptoken = token;
+	if (wpas_rrm_report_elem(*buf, req->token,
+				 MEASUREMENT_REPORT_MODE_REJECT_INCAPABLE,
+				 req->type, NULL, 0) < 0) {
+		wpa_printf(MSG_DEBUG, "RRM: Failed to add report element");
+		return -1;
+	}
 
-	return report;
+	return 0;
 }
 
 
@@ -382,9 +399,7 @@ wpas_rrm_handle_msr_req_element(struct wpa_supplicant *wpa_s,
 
 	switch (req->type) {
 	case MEASURE_TYPE_LCI:
-		*buf = wpas_rrm_build_lci_report(wpa_s, &req->token, req->len,
-						 *buf);
-		return 0;
+		return wpas_rrm_build_lci_report(wpa_s, req, buf);
 	default:
 		wpa_printf(MSG_INFO,
 			   "RRM: unsupported radio measurement type %hhu",
-- 
1.9.1




More information about the Hostap mailing list