[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