[PATCH 1/2] New bgscan operation for list of candidates

Gery Kahn geryk at ti.com
Thu Jul 28 09:40:44 EDT 2011


Add new bgscan operation list_candidates which fills provided buffer with
candidates information.
The solution exists only for bgscan_learn, because there is no
candidates in bgscan_simple.

Signed-off-by: Gery Kahn <geryk at ti.com>
---
 wpa_supplicant/bgscan.c       |   10 ++++++++++
 wpa_supplicant/bgscan.h       |    9 +++++++++
 wpa_supplicant/bgscan_learn.c |   39 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 58 insertions(+), 0 deletions(-)

diff --git a/wpa_supplicant/bgscan.c b/wpa_supplicant/bgscan.c
index 5661830..6d9491c 100644
--- a/wpa_supplicant/bgscan.c
+++ b/wpa_supplicant/bgscan.c
@@ -121,3 +121,13 @@ void bgscan_notify_signal_change(struct wpa_supplicant *wpa_s, int above,
 						    current_noise,
 						    current_txrate);
 }
+
+int bgscan_list_candidates(struct wpa_supplicant *wpa_s,
+			    char *buf, size_t buflen)
+{
+	if (wpa_s->bgscan && wpa_s->bgscan_priv &&
+	    wpa_s->bgscan->list_candidates)
+		return wpa_s->bgscan->list_candidates(wpa_s->bgscan_priv,
+						      buf, buflen);
+	return 0;
+}
diff --git a/wpa_supplicant/bgscan.h b/wpa_supplicant/bgscan.h
index ae94a48..7d4dddf 100644
--- a/wpa_supplicant/bgscan.h
+++ b/wpa_supplicant/bgscan.h
@@ -31,6 +31,7 @@ struct bgscan_ops {
 				     int current_signal,
 				     int current_noise,
 				     int current_txrate);
+	int (*list_candidates)(void *priv, char *buf, size_t buflen);
 };
 
 #ifdef CONFIG_BGSCAN
@@ -43,6 +44,8 @@ void bgscan_notify_beacon_loss(struct wpa_supplicant *wpa_s);
 void bgscan_notify_signal_change(struct wpa_supplicant *wpa_s, int above,
 				 int current_signal, int current_noise,
 				 int current_txrate);
+int bgscan_list_candidates(struct wpa_supplicant *wpa_s,
+			    char *buf, size_t buflen);
 
 #else /* CONFIG_BGSCAN */
 
@@ -73,6 +76,12 @@ static inline void bgscan_notify_signal_change(struct wpa_supplicant *wpa_s,
 {
 }
 
+static inline int bgscan_list_candidates(struct wpa_supplicant *wpa_s,
+				   char *buf, size_t buflen)
+{
+	return 0;
+}
+
 #endif /* CONFIG_BGSCAN */
 
 #endif /* BGSCAN_H */
diff --git a/wpa_supplicant/bgscan_learn.c b/wpa_supplicant/bgscan_learn.c
index ee79511..2e60bf8 100644
--- a/wpa_supplicant/bgscan_learn.c
+++ b/wpa_supplicant/bgscan_learn.c
@@ -603,6 +603,44 @@ static void bgscan_learn_notify_signal_change(void *priv, int above,
 	}
 }
 
+static int bgscan_learn_list_candidates(void *priv, char *buf, size_t buflen)
+{
+	char *pos, *end;
+	int ret;
+	struct bgscan_learn_bss *bss;
+	struct bgscan_learn_data *data = priv;
+
+	pos = buf;
+	end = buf + buflen;
+
+	if (!data)
+		return pos - buf;
+
+	dl_list_for_each(bss, &data->bss, struct bgscan_learn_bss, list) {
+		ret = os_snprintf(pos, end - pos,
+			"BSS " MACSTR " %d\n",
+			MAC2STR(bss->bssid), bss->freq);
+		if (ret < 0 || ret >= end - pos)
+			return pos - buf;
+		pos += ret;
+	}
+
+	dl_list_for_each(bss, &data->bss, struct bgscan_learn_bss, list) {
+		size_t i;
+		for (i = 0; i < bss->num_neigh; i++) {
+			ret = os_snprintf(pos, end - pos,
+				"NEIGHBOR " MACSTR " " MACSTR "\n",
+				MAC2STR(bss->bssid),
+				MAC2STR(bss->neigh + i * ETH_ALEN));
+			if (ret < 0 || ret >= end - pos)
+				return pos - buf;
+			pos += ret;
+		}
+	}
+
+	return pos - buf;
+}
+
 
 const struct bgscan_ops bgscan_learn_ops = {
 	.name = "learn",
@@ -611,4 +649,5 @@ const struct bgscan_ops bgscan_learn_ops = {
 	.notify_scan = bgscan_learn_notify_scan,
 	.notify_beacon_loss = bgscan_learn_notify_beacon_loss,
 	.notify_signal_change = bgscan_learn_notify_signal_change,
+	.list_candidates = bgscan_learn_list_candidates,
 };
-- 
1.7.0.4



More information about the HostAP mailing list