diff mbox series

[2/4] RNR: add bss_parameters to the neighbor_db

Message ID 20200624131212.2648129-3-john@phrozen.org
State New
Headers show
Series RNR: reduced neighbor report | expand

Commit Message

John Crispin June 24, 2020, 1:12 p.m. UTC
P802.11ax/D4.0 9.4.2.170 (Reduced Neighbor Report element) described this
field used inside reduced neighbor reports. It holds info about multiple
bssid and 6G co-location which was not present in the existing neighbor
reports.

Signed-off-by: John Crispin <john@phrozen.org>
---
 hostapd/ctrl_iface.c | 16 +++++++++++++++-
 src/ap/hostapd.h     |  1 +
 src/ap/neighbor_db.c |  6 ++++--
 src/ap/neighbor_db.h |  3 ++-
 4 files changed, 22 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
index b470c5643..9ef394273 100644
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -3003,6 +3003,7 @@  static int hostapd_ctrl_iface_set_neighbor(struct hostapd_data *hapd, char *buf)
 	u8 bssid[ETH_ALEN];
 	struct wpabuf *nr, *lci = NULL, *civic = NULL;
 	int stationary = 0;
+	int bss_parameters = 0;
 	char *tmp;
 	int ret;
 
@@ -3087,9 +3088,22 @@  static int hostapd_ctrl_iface_set_neighbor(struct hostapd_data *hapd, char *buf)
 	if (os_strstr(buf, "stat"))
 		stationary = 1;
 
+	tmp = os_strstr(buf, "bss_parameter=");
+	if (tmp) {
+		bss_parameters = atoi(tmp + 14);
+		if (bss_parameters > 0xff) {
+			wpa_printf(MSG_ERROR,
+				   "CTRL: SET_NEIGHBOR: Bad bss_parameters subelement");
+			wpabuf_free(nr);
+			wpabuf_free(lci);
+			wpabuf_free(civic);
+			return -1;
+		}
+	}
+
 set:
 	ret = hostapd_neighbor_set(hapd, bssid, &ssid, nr, lci, civic,
-				   stationary);
+				   stationary, bss_parameters);
 
 	wpabuf_free(nr);
 	wpabuf_free(lci);
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index ae16a30bf..b84627bf5 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -138,6 +138,7 @@  struct hostapd_neighbor_entry {
 	/* LCI update time */
 	struct os_time lci_date;
 	int stationary;
+	u8 bss_parameters;
 };
 
 struct hostapd_sae_commit_queue {
diff --git a/src/ap/neighbor_db.c b/src/ap/neighbor_db.c
index 01bf88623..41d0d1d15 100644
--- a/src/ap/neighbor_db.c
+++ b/src/ap/neighbor_db.c
@@ -120,7 +120,8 @@  hostapd_neighbor_add(struct hostapd_data *hapd)
 int hostapd_neighbor_set(struct hostapd_data *hapd, const u8 *bssid,
 			 const struct wpa_ssid_value *ssid,
 			 const struct wpabuf *nr, const struct wpabuf *lci,
-			 const struct wpabuf *civic, int stationary)
+			 const struct wpabuf *civic, int stationary,
+			 u8 bss_parameters)
 {
 	struct hostapd_neighbor_entry *entry;
 
@@ -152,6 +153,7 @@  int hostapd_neighbor_set(struct hostapd_data *hapd, const u8 *bssid,
 	}
 
 	entry->stationary = stationary;
+	entry->bss_parameters = bss_parameters;
 
 	return 0;
 
@@ -311,7 +313,7 @@  void hostapd_neighbor_set_own_report(struct hostapd_data *hapd)
 	wpabuf_put_u8(nr, center_freq2_idx);
 
 	hostapd_neighbor_set(hapd, hapd->own_addr, &ssid, nr, hapd->iconf->lci,
-			     hapd->iconf->civic, hapd->iconf->stationary_ap);
+			     hapd->iconf->civic, hapd->iconf->stationary_ap, 0);
 
 	wpabuf_free(nr);
 #endif /* NEED_AP_MLME */
diff --git a/src/ap/neighbor_db.h b/src/ap/neighbor_db.h
index bed0a2f5f..992671b62 100644
--- a/src/ap/neighbor_db.h
+++ b/src/ap/neighbor_db.h
@@ -17,7 +17,8 @@  int hostapd_neighbor_show(struct hostapd_data *hapd, char *buf, size_t buflen);
 int hostapd_neighbor_set(struct hostapd_data *hapd, const u8 *bssid,
 			 const struct wpa_ssid_value *ssid,
 			 const struct wpabuf *nr, const struct wpabuf *lci,
-			 const struct wpabuf *civic, int stationary);
+			 const struct wpabuf *civic, int stationary,
+			 u8 bss_parameters);
 void hostapd_neighbor_set_own_report(struct hostapd_data *hapd);
 int hostapd_neighbor_remove(struct hostapd_data *hapd, const u8 *bssid,
 			    const struct wpa_ssid_value *ssid);