diff mbox series

ANQP/hostapd: RNR response to RNR query to ANQP query through action frame.

Message ID 20220121131452.6729-1-sharadanandk@gmail.com
State Changes Requested
Headers show
Series ANQP/hostapd: RNR response to RNR query to ANQP query through action frame. | expand

Commit Message

Sharadanand Karanjkar Jan. 21, 2022, 1:14 p.m. UTC
From: Sharadanand Karanjkar <skaranjkar@datto.com>

STA can query for RNR report from ANQP action frame.
Parse all the interfaces and fill the RNR information.
Doing this allows station to discover networks on other frequencies
which were announced throgh RNR in the ANQP RNR response,
e. g. for multi-media APs in WiFi 6e.

Signed-off-by: Sharadanand Karanjkar <skaranjkar@datto.com>
---
 wpa_supplicant/interworking.c | 37 +++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

Comments

Jouni Malinen April 9, 2022, 10:55 a.m. UTC | #1
On Fri, Jan 21, 2022 at 02:14:52PM +0100, sharadanandk@gmail.com wrote:
> STA can query for RNR report from ANQP action frame.
> Parse all the interfaces and fill the RNR information.
> Doing this allows station to discover networks on other frequencies
> which were announced throgh RNR in the ANQP RNR response,
> e. g. for multi-media APs in WiFi 6e.

This seems to be talking about AP mode functionality and hostapd, but..

> ---
>  wpa_supplicant/interworking.c | 37 +++++++++++++++++++++++++++++++++++
>  1 file changed, 37 insertions(+)

This is modifying wpa_supplicant Interworking functionality..

> diff --git a/wpa_supplicant/interworking.c b/wpa_supplicant/interworking.c
> +static void anqp_add_rnr(struct wpa_supplicant *wpa_s,
> +			   struct wpa_bss_anqp *anqp,
> +			   const u8 *data, size_t slen)
> +{
> +	struct wpa_bss_anqp_rnr *tmp, *elem = NULL;

struct wpa_bss_anqp_rnr is not defined anywhere, so clearly this is
missing something. There would also be no users for this information, so
it is not clear what this patch is trying to achieve.
diff mbox series

Patch

diff --git a/wpa_supplicant/interworking.c b/wpa_supplicant/interworking.c
index 71a5c1651..4ca139d98 100644
--- a/wpa_supplicant/interworking.c
+++ b/wpa_supplicant/interworking.c
@@ -2884,6 +2884,40 @@  static void anqp_add_extra(struct wpa_supplicant *wpa_s,
 	}
 }
 
+static void anqp_add_rnr(struct wpa_supplicant *wpa_s,
+			   struct wpa_bss_anqp *anqp,
+			   const u8 *data, size_t slen)
+{
+	struct wpa_bss_anqp_rnr *tmp, *elem = NULL;
+
+	if (!anqp)
+		return;
+
+	dl_list_for_each(tmp, &anqp->anqp_rnr, struct wpa_bss_anqp_rnr,
+			 list) {
+		if(os_memcmp(tmp->bssid, data, ETH_ALEN) == 0) {
+			elem = tmp;
+			break;
+		}
+	}
+
+	if (!elem) {
+		elem = os_zalloc(sizeof(*elem));
+		if (!elem)
+			return;
+
+		os_memcpy(elem->bssid, data, ETH_ALEN);
+		dl_list_add(&anqp->anqp_rnr, &elem->list);
+	} else {
+		wpabuf_free(elem->rnr_report);
+	}
+
+	elem->rnr_report = wpabuf_alloc_copy(data, slen);
+	if (!elem->rnr_report) {
+		dl_list_del(&elem->list);
+		os_free(elem);
+	}
+}
 
 static void interworking_parse_venue_url(struct wpa_supplicant *wpa_s,
 					 const u8 *data, size_t len)
@@ -3073,6 +3107,9 @@  static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
 			return;
 		}
 		break;
+	case ANQP_NEIGHBOR_REPORT:
+		anqp_add_rnr(wpa_s, anqp, data, slen);
+		break;
 	default:
 		wpa_msg(wpa_s, MSG_DEBUG,
 			"Interworking: Unsupported ANQP Info ID %u", info_id);