From b3060bf99fd5ed392dd7e762fa579fa733a54da1 Mon Sep 17 00:00:00 2001 From: Avraham Stern Date: Wed, 28 Dec 2016 15:06:45 +0200 Subject: [PATCH] common: Add helper function to convert RSSI to RCPI This conversion will be done several times in the code, so add a helper function that does this conversion. Signed-off-by: Avrahams Stern --- src/utils/common.c | 21 +++++++++++++++++++++ src/utils/common.h | 1 + wpa_supplicant/rrm.c | 16 +--------------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/utils/common.c b/src/utils/common.c index 04a533a05..1eb33705b 100644 --- a/src/utils/common.c +++ b/src/utils/common.c @@ -1200,3 +1200,24 @@ int str_starts(const char *str, const char *start) { return os_strncmp(str, start, os_strlen(start)) == 0; } + + +/** + * rssi_to_rcpi - Convert RSSI to RCPI + * @rssi: RSSI to convert + * Returns: RCPI corresponding to the given RSSI value, or 255 if not available. + * + * It's possible to estimate RCPI based on RSSI in dBm. This calculation will + * not reflect the correct value for high rates, but it's good enough for Action + * frames which are transmitted with up to 24 Mbps rates. + */ +u8 rssi_to_rcpi(int rssi) +{ + if (!rssi) + return 255; /* not available */ + if (rssi < -110) + return 0; + if (rssi > 0) + return 220; + return (rssi + 110) * 2; +} diff --git a/src/utils/common.h b/src/utils/common.h index 77856774d..88428647b 100644 --- a/src/utils/common.h +++ b/src/utils/common.h @@ -552,6 +552,7 @@ int is_ctrl_char(char c); int str_starts(const char *str, const char *start); +u8 rssi_to_rcpi(int rssi); /* * gcc 4.4 ends up generating strict-aliasing warnings about some very common diff --git a/wpa_supplicant/rrm.c b/wpa_supplicant/rrm.c index 85c6ed539..5223e8ef3 100644 --- a/wpa_supplicant/rrm.c +++ b/wpa_supplicant/rrm.c @@ -598,21 +598,7 @@ void wpas_rrm_handle_link_measurement_request(struct wpa_supplicant *wpa_s, report.tpc.len = 2; report.rsni = 255; /* 255 indicates that RSNI is not available */ report.dialog_token = req->dialog_token; - - /* - * It's possible to estimate RCPI based on RSSI in dBm. This - * calculation will not reflect the correct value for high rates, - * but it's good enough for Action frames which are transmitted - * with up to 24 Mbps rates. - */ - if (!rssi) - report.rcpi = 255; /* not available */ - else if (rssi < -110) - report.rcpi = 0; - else if (rssi > 0) - report.rcpi = 220; - else - report.rcpi = (rssi + 110) * 2; + report.rcpi = rssi_to_rcpi(rssi); /* action_category + action_code */ buf = wpabuf_alloc(2 + sizeof(report));