[RFC v2 04/99] NAN: Change the return value of nan_de_rx_sdf()

Andrei Otcheretianski andrei.otcheretianski at intel.com
Tue Dec 23 03:51:08 PST 2025


From: Ilan Peer <ilan.peer at intel.com>

Change the return value of nan_de_rx_sdf() and relevant function
internal to the NAN DE to indicate if the information contained
in the SDF was valuable, e.g., there was a 'match' or 'result'
event.

This is needed in later patches that add logic to store information
about a peer, i.e., avoid storing peers that are not relevant.

Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
 src/common/nan_de.c | 102 +++++++++++++++++++++++++-------------------
 src/common/nan_de.h |   2 +-
 2 files changed, 59 insertions(+), 45 deletions(-)

diff --git a/src/common/nan_de.c b/src/common/nan_de.c
index 6d48709739..2ded6542c7 100644
--- a/src/common/nan_de.c
+++ b/src/common/nan_de.c
@@ -1071,7 +1071,7 @@ static bool nan_de_filter_match(struct nan_de_service *srv,
 }
 
 
-static void nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,
+static bool nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,
 			      const u8 *peer_addr, const u8 *a3, u8 instance_id,
 			      const u8 *matching_filter,
 			      size_t matching_filter_len,
@@ -1081,7 +1081,7 @@ static void nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,
 			      bool range_limit, int rssi)
 {
 	if (!nan_de_filter_match(srv, matching_filter, matching_filter_len))
-		return;
+		return false;
 
 	/* Skip USD logic */
 	if (srv->sync)
@@ -1093,7 +1093,7 @@ static void nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,
 			wpa_printf(MSG_DEBUG,
 				   "NAN: Discard SDA with RSSI %d below threshold %d",
 				   rssi, de->rssi_threshold);
-			return;
+			return false;
 		}
 	}
 
@@ -1126,10 +1126,12 @@ send_event:
 			peer_addr,
 			sdea_control & NAN_SDEA_CTRL_FSD_REQ,
 			sdea_control & NAN_SDEA_CTRL_FSD_GAS);
+
+	return true;
 }
 
 
-static void nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv,
+static bool nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv,
 				const u8 *peer_addr, const u8 *a3,
 				u8 instance_id,
 				const u8 *matching_filter,
@@ -1143,7 +1145,7 @@ static void nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv,
 	/* Publish function processing of a receive Subscribe message */
 
 	if (!nan_de_filter_match(srv, matching_filter, matching_filter_len))
-		return;
+		return false;
 
 	if ((range_limit || srv->close_proximity) &&
 	    de->rssi_threshold && rssi) {
@@ -1151,19 +1153,19 @@ static void nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv,
 			wpa_printf(MSG_DEBUG,
 				   "NAN: Discard SDA with RSSI %d below threshold %d",
 				   rssi, de->rssi_threshold);
-			return;
+			return false;
 		}
 	}
 
 	if (!srv->publish.solicited)
-		return;
+		return false;
 
 	if (os_reltime_initialized(&srv->pause_state_end) &&
 	    (!ether_addr_equal(peer_addr, srv->sel_peer_addr) ||
 	     instance_id != srv->sel_peer_id)) {
 		wpa_printf(MSG_DEBUG,
 			   "NAN: In pauseState - ignore Subscribe message from another subscriber");
-		return;
+		return false;
 	}
 
 	if (de->offload)
@@ -1186,10 +1188,12 @@ offload:
 	if (!srv->publish.disable_events && de->cb.replied)
 		de->cb.replied(de->cb.ctx, srv->id, peer_addr, instance_id,
 			       srv_proto_type, ssi, ssi_len);
+
+	return true;
 }
 
 
-static void nan_de_rx_follow_up(struct nan_de *de, struct nan_de_service *srv,
+static bool nan_de_rx_follow_up(struct nan_de *de, struct nan_de_service *srv,
 				const u8 *peer_addr, const u8 *a3,
 				u8 instance_id, const u8 *ssi, size_t ssi_len)
 {
@@ -1203,7 +1207,7 @@ static void nan_de_rx_follow_up(struct nan_de *de, struct nan_de_service *srv,
 	     !ssi)) {
 		wpa_printf(MSG_DEBUG,
 			   "NAN: In pauseState - ignore Follow-up message from another subscriber or without ssi");
-		return;
+		return false;
 	}
 
 	if (srv->type == NAN_DE_PUBLISH && !ssi && !srv->sync)
@@ -1215,6 +1219,8 @@ static void nan_de_rx_follow_up(struct nan_de *de, struct nan_de_service *srv,
 	if (de->cb.receive)
 		de->cb.receive(de->cb.ctx, srv->id, instance_id, ssi, ssi_len,
 			       peer_addr);
+
+	return true;
 }
 
 
@@ -1274,7 +1280,7 @@ static bool nan_srf_match(struct nan_de *de, const u8 *srf, size_t srf_len)
 }
 
 
-static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
+static bool nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 			  unsigned int freq, const u8 *buf, size_t len,
 			  const u8 *sda, size_t sda_len, int rssi)
 {
@@ -1290,9 +1296,10 @@ static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 	const u8 *end;
 	const u8 *matching_filter = NULL;
 	size_t matching_filter_len = 0;
+	bool ret = false;
 
 	if (sda_len < NAN_SERVICE_ID_LEN + 1 + 1 + 1)
-		return;
+		return false;
 	end = sda + sda_len;
 
 	service_id = sda;
@@ -1311,12 +1318,12 @@ static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 		wpa_printf(MSG_DEBUG,
 			   "NAN: Discard SDF with unknown Service Control Type %u",
 			   type);
-		return;
+		return false;
 	}
 
 	if (ctrl & NAN_SRV_CTRL_BINDING_BITMAP) {
 		if (end - sda < 2)
-			return;
+			return false;
 		sda += 2;
 	}
 
@@ -1324,10 +1331,10 @@ static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 		u8 flen;
 
 		if (end - sda < 1)
-			return;
+			return false;
 		flen = *sda++;
 		if (end - sda < flen)
-			return;
+			return false;
 		matching_filter = sda;
 		matching_filter_len = flen;
 		sda += flen;
@@ -1337,15 +1344,15 @@ static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 		u8 flen;
 
 		if (end - sda < 1)
-			return;
+			return false;
 		flen = *sda++;
 		if (end - sda < flen)
-			return;
+			return false;
 
 		if (!nan_srf_match(de, sda, flen)) {
 			wpa_printf(MSG_DEBUG,
 				   "NAN: Discard SDA with non-matching SRF");
-			return;
+			return false;
 		}
 		sda += flen;
 	}
@@ -1354,10 +1361,10 @@ static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 		u8 flen;
 
 		if (end - sda < 1)
-			return;
+			return false;
 		flen = *sda++;
 		if (end - sda < flen)
-			return;
+			return false;
 		if (flen >= 4 && WPA_GET_BE24(sda) == OUI_WFA) {
 			srv_proto_type = sda[3];
 			ssi = sda + 4;
@@ -1408,44 +1415,49 @@ static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 
 		switch (type) {
 		case NAN_SRV_CTRL_PUBLISH:
-			nan_de_rx_publish(de, srv, peer_addr, a3, instance_id,
-					  matching_filter,
-					  matching_filter_len,
-					  req_instance_id,
-					  sdea_control, srv_proto_type,
-					  ssi, ssi_len,
-					  ctrl &
-					  NAN_SRV_CTRL_DISCOVERY_RANGE_LIMITED,
-					  rssi);
+			ret |= nan_de_rx_publish(de, srv, peer_addr, a3,
+						 instance_id,
+						 matching_filter,
+						 matching_filter_len,
+						 req_instance_id,
+						 sdea_control, srv_proto_type,
+						 ssi, ssi_len,
+						 ctrl &
+						 NAN_SRV_CTRL_DISCOVERY_RANGE_LIMITED,
+						 rssi);
 			break;
 		case NAN_SRV_CTRL_SUBSCRIBE:
-			nan_de_rx_subscribe(de, srv, peer_addr, a3, instance_id,
-					    matching_filter,
-					    matching_filter_len,
-					    srv_proto_type,
-					    ssi, ssi_len,
-					    ctrl &
-					    NAN_SRV_CTRL_DISCOVERY_RANGE_LIMITED,
-					    rssi);
+			ret |= nan_de_rx_subscribe(de, srv, peer_addr, a3,
+						   instance_id,
+						   matching_filter,
+						   matching_filter_len,
+						   srv_proto_type,
+						   ssi, ssi_len,
+						   ctrl &
+						   NAN_SRV_CTRL_DISCOVERY_RANGE_LIMITED,
+						   rssi);
 			break;
 		case NAN_SRV_CTRL_FOLLOW_UP:
-			nan_de_rx_follow_up(de, srv, peer_addr, a3, instance_id,
-					    ssi, ssi_len);
+			ret |= nan_de_rx_follow_up(de, srv, peer_addr, a3,
+						   instance_id, ssi, ssi_len);
 			break;
 		}
 	}
+
+	return ret;
 }
 
 
-void nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
+bool nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 		   unsigned int freq, const u8 *buf, size_t len, int rssi)
 {
 	const u8 *sda;
 	u16 sda_len;
 	unsigned int skip;
+	bool ret = false;
 
 	if (!de->num_service)
-		return;
+		return false;
 
 	wpa_printf(MSG_DEBUG, "NAN: RX SDF from " MACSTR " freq=%u len=%zu rssi=%d",
 		   MAC2STR(peer_addr), freq, len, rssi);
@@ -1460,9 +1472,11 @@ void nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 		sda++;
 		sda_len = WPA_GET_LE16(sda);
 		sda += 2;
-		nan_de_rx_sda(de, peer_addr, a3, freq, buf, len, sda, sda_len,
-			      rssi);
+		ret |= nan_de_rx_sda(de, peer_addr, a3, freq, buf, len,
+				     sda, sda_len, rssi);
 	}
+
+	return ret;
 }
 
 
diff --git a/src/common/nan_de.h b/src/common/nan_de.h
index 22ab1d5641..5c204ff976 100644
--- a/src/common/nan_de.h
+++ b/src/common/nan_de.h
@@ -81,7 +81,7 @@ void nan_de_update_nmi(struct nan_de *de, const u8 *nmi);
 void nan_de_tx_status(struct nan_de *de, unsigned int freq, const u8 *dst);
 void nan_de_tx_wait_ended(struct nan_de *de);
 
-void nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
+bool nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 		   unsigned int freq, const u8 *buf, size_t len, int rssi);
 const u8 * nan_de_get_service_id(struct nan_de *de, int id);
 
-- 
2.49.0




More information about the Hostap mailing list