ubus: derive RSSI from measurement report
authorDavid Bauer <mail@david-bauer.net>
Sun, 22 May 2022 23:12:38 +0000 (01:12 +0200)
committerDavid Bauer <mail@david-bauer.net>
Wed, 20 Jul 2022 22:31:46 +0000 (00:31 +0200)
Derive the RSSI of a measurement-report based on it's RCPI.

Signed-off-by: David Bauer <mail@david-bauer.net>
measurement.c
ubus.c
usteer.h

index 0c7cde273aee3ceb3fe1904947aed4956e3d11dc..333a6be1344545f183eb12d016683ffdd42b7a44 100644 (file)
 LIST_HEAD(measurements);
 static struct usteer_timeout_queue tq;
 
+int
+usteer_measurement_get_rssi(struct usteer_measurement_report *report)
+{
+       /* Apple devices always set the RSNI to 0, while
+        * it should be set to 255 in case RSNI is unavailable.
+        *
+        * For them, RCPI seems to be calculated as RCPI = 255 + (RSSI)
+        */
+
+       if (!report->rsni)
+               return report->rcpi - 255;
+
+       return (report->rcpi / 2) - 110;
+}
+
 void
 usteer_measurement_report_node_cleanup(struct usteer_node *node)
 {
diff --git a/ubus.c b/ubus.c
index d337c45cc1d3f8a0e2c43ff9a5bd844f887f1014..557656e5994fac9db1907b8debcda82d324c4b13 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -449,6 +449,7 @@ usteer_ubus_get_connected_clients(struct ubus_context *ctx, struct ubus_object *
                                blobmsg_add_string(&b, "node", usteer_node_name(mr->node));
                                blobmsg_add_u32(&b, "rcpi", mr->rcpi);
                                blobmsg_add_u32(&b, "rsni", mr->rsni);
+                               blobmsg_add_u32(&b, "rssi", usteer_measurement_get_rssi(mr));
                                blobmsg_add_u64(&b, "timestamp", mr->timestamp);
                                blobmsg_close_table(&b, t);
                        }
index 239159a632b9e086bc6d7cf7a88d771b13e442f7..01c849e70435bbaa55cda1be5d596388e13e1453 100644 (file)
--- a/usteer.h
+++ b/usteer.h
@@ -383,6 +383,8 @@ void usteer_run_hook(const char *name, const char *arg);
 void usteer_dump_node(struct blob_buf *buf, struct usteer_node *node);
 void usteer_dump_host(struct blob_buf *buf, struct usteer_remote_host *host);
 
+int usteer_measurement_get_rssi(struct usteer_measurement_report *report);
+
 struct usteer_measurement_report * usteer_measurement_report_get(struct sta *sta, struct usteer_node *node, bool create);
 void usteer_measurement_report_node_cleanup(struct usteer_node *node);
 void usteer_measurement_report_sta_cleanup(struct sta *sta);