All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 1/5] netdev: parse rates in netdev_get_station
@ 2021-01-14 20:54 James Prestwood
  2021-01-14 20:54 ` [PATCH v5 2/5] netdev: parse expected throughput " James Prestwood
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: James Prestwood @ 2021-01-14 20:54 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 3656 bytes --]

---
 src/netdev.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/netdev.h | 18 ++++++++++
 2 files changed, 112 insertions(+)

v5:
 * Renamed some station_info members

diff --git a/src/netdev.c b/src/netdev.c
index 2c88e648..7d36eb77 100644
--- a/src/netdev.c
+++ b/src/netdev.c
@@ -368,11 +368,74 @@ int netdev_set_powered(struct netdev *netdev, bool powered,
 	return 0;
 }
 
+static bool netdev_parse_bitrate(struct l_genl_attr *attr,
+					enum netdev_mcs_type *type_out,
+					uint32_t *rate_out,
+					uint8_t *mcs_out)
+{
+	uint16_t type, len;
+	const void *data;
+	uint32_t rate = 0;
+	uint8_t mcs = 0;
+	enum netdev_mcs_type mcs_type = NETDEV_MCS_TYPE_NONE;
+
+	while (l_genl_attr_next(attr, &type, &len, &data)) {
+		switch (type) {
+		case NL80211_RATE_INFO_BITRATE32:
+			if (len != 4)
+				return false;
+
+			rate = l_get_u32(data);
+
+			break;
+
+		case NL80211_RATE_INFO_MCS:
+			if (len != 1)
+				return false;
+
+			mcs = l_get_u8(data);
+			mcs_type = NETDEV_MCS_TYPE_HT;
+
+			break;
+
+		case NL80211_RATE_INFO_VHT_MCS:
+			if (len != 1)
+				return false;
+
+			mcs = l_get_u8(data);
+			mcs_type = NETDEV_MCS_TYPE_VHT;
+
+			break;
+
+		case NL80211_RATE_INFO_HE_MCS:
+			if (len != 1)
+				return false;
+
+			mcs = l_get_u8(data);
+			mcs_type = NETDEV_MCS_TYPE_HE;
+
+			break;
+		}
+	}
+
+	if (!rate)
+		return false;
+
+	*type_out = mcs_type;
+	*rate_out = rate;
+
+	if (mcs_type != NETDEV_MCS_TYPE_NONE)
+		*mcs_out = mcs;
+
+	return true;
+}
+
 static bool netdev_parse_sta_info(struct l_genl_attr *attr,
 					struct netdev_station_info *info)
 {
 	uint16_t type, len;
 	const void *data;
+	struct l_genl_attr nested;
 
 	while (l_genl_attr_next(attr, &type, &len, &data)) {
 		switch (type) {
@@ -383,6 +446,37 @@ static bool netdev_parse_sta_info(struct l_genl_attr *attr,
 			info->cur_rssi = *(const int8_t *) data;
 			info->have_cur_rssi = true;
 
+			break;
+		case NL80211_STA_INFO_RX_BITRATE:
+			if (!l_genl_attr_recurse(attr, &nested))
+				return false;
+
+			if (!netdev_parse_bitrate(&nested, &info->rx_mcs_type,
+							&info->rx_bitrate,
+							&info->rx_mcs))
+				return false;
+
+			info->have_rx_bitrate = true;
+
+			if (info->rx_mcs_type != NETDEV_MCS_TYPE_NONE)
+				info->have_rx_mcs = true;
+
+			break;
+
+		case NL80211_STA_INFO_TX_BITRATE:
+			if (!l_genl_attr_recurse(attr, &nested))
+				return false;
+
+			if (!netdev_parse_bitrate(&nested, &info->tx_mcs_type,
+							&info->tx_bitrate,
+							&info->tx_mcs))
+				return false;
+
+			info->have_tx_bitrate = true;
+
+			if (info->tx_mcs_type != NETDEV_MCS_TYPE_NONE)
+				info->have_tx_mcs = true;
+
 			break;
 		}
 	}
diff --git a/src/netdev.h b/src/netdev.h
index 8c2dfee3..daf10bb6 100644
--- a/src/netdev.h
+++ b/src/netdev.h
@@ -114,11 +114,29 @@ typedef void (*netdev_station_watch_func_t)(struct netdev *netdev,
 					const uint8_t *mac, bool added,
 					void *user_data);
 
+enum netdev_mcs_type {
+	NETDEV_MCS_TYPE_NONE,
+	NETDEV_MCS_TYPE_HT,
+	NETDEV_MCS_TYPE_VHT,
+	NETDEV_MCS_TYPE_HE,
+};
+
 struct netdev_station_info {
 	uint8_t addr[6];
 	int8_t cur_rssi;
 
+	enum netdev_mcs_type rx_mcs_type;
+	uint32_t rx_bitrate;
+	uint8_t rx_mcs;
+	enum netdev_mcs_type tx_mcs_type;
+	uint32_t tx_bitrate;
+	uint8_t tx_mcs;
+
 	bool have_cur_rssi : 1;
+	bool have_rx_mcs : 1;
+	bool have_tx_mcs : 1;
+	bool have_rx_bitrate : 1;
+	bool have_tx_bitrate : 1;
 };
 
 typedef void (*netdev_get_station_cb_t)(const struct netdev_station_info *info,
-- 
2.26.2

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v5 2/5] netdev: parse expected throughput in netdev_get_station
  2021-01-14 20:54 [PATCH v5 1/5] netdev: parse rates in netdev_get_station James Prestwood
@ 2021-01-14 20:54 ` James Prestwood
  2021-01-14 20:54 ` [PATCH v5 3/5] station: create StationDiagnostic interface James Prestwood
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: James Prestwood @ 2021-01-14 20:54 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 1079 bytes --]

---
 src/netdev.c | 9 +++++++++
 src/netdev.h | 3 +++
 2 files changed, 12 insertions(+)

diff --git a/src/netdev.c b/src/netdev.c
index 7d36eb77..0fc0600a 100644
--- a/src/netdev.c
+++ b/src/netdev.c
@@ -478,6 +478,15 @@ static bool netdev_parse_sta_info(struct l_genl_attr *attr,
 				info->have_tx_mcs = true;
 
 			break;
+
+		case NL80211_STA_INFO_EXPECTED_THROUGHPUT:
+			if (len != 4)
+				return false;
+
+			info->expected_throughput = l_get_u32(data);
+			info->have_expected_throughput = true;
+
+			break;
 		}
 	}
 
diff --git a/src/netdev.h b/src/netdev.h
index daf10bb6..074dc61f 100644
--- a/src/netdev.h
+++ b/src/netdev.h
@@ -132,11 +132,14 @@ struct netdev_station_info {
 	uint32_t tx_bitrate;
 	uint8_t tx_mcs;
 
+	uint32_t expected_throughput;
+
 	bool have_cur_rssi : 1;
 	bool have_rx_mcs : 1;
 	bool have_tx_mcs : 1;
 	bool have_rx_bitrate : 1;
 	bool have_tx_bitrate : 1;
+	bool have_expected_throughput : 1;
 };
 
 typedef void (*netdev_get_station_cb_t)(const struct netdev_station_info *info,
-- 
2.26.2

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v5 3/5] station: create StationDiagnostic interface
  2021-01-14 20:54 [PATCH v5 1/5] netdev: parse rates in netdev_get_station James Prestwood
  2021-01-14 20:54 ` [PATCH v5 2/5] netdev: parse expected throughput " James Prestwood
@ 2021-01-14 20:54 ` James Prestwood
  2021-01-14 21:14   ` Denis Kenzior
  2021-01-14 20:54 ` [PATCH v5 4/5] test: update get-diagnostics with Rx/TxMode James Prestwood
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 9+ messages in thread
From: James Prestwood @ 2021-01-14 20:54 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 6261 bytes --]

This interface sits aside the regular station interface but
provides low level connection details for diagnostic and
testing purposes.
---
 src/station.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 155 insertions(+)

v5:
 * Changed Rx/TxRateType to Rx/TxMode
 * Removed 'legacy' terminology, the rate mode will not be included
   if the AP is operating in legacy modes.

diff --git a/src/station.c b/src/station.c
index 1e3706af..2b79aaa7 100644
--- a/src/station.c
+++ b/src/station.c
@@ -77,6 +77,7 @@ struct station {
 	struct l_dbus_message *hidden_pending;
 	struct l_dbus_message *disconnect_pending;
 	struct l_dbus_message *scan_pending;
+	struct l_dbus_message *get_station_pending;
 	struct signal_agent *signal_agent;
 	uint32_t dbus_scan_id;
 	uint32_t quick_scan_id;
@@ -3333,6 +3334,9 @@ static struct station *station_create(struct netdev *netdev)
 
 	l_dbus_object_add_interface(dbus, netdev_get_path(netdev),
 					IWD_STATION_INTERFACE, station);
+	l_dbus_object_add_interface(dbus, netdev_get_path(netdev),
+					IWD_STATION_DIAGNOSTIC_INTERFACE,
+					station);
 
 	if (netconfig_enabled)
 		station->netconfig = netconfig_new(netdev_get_ifindex(netdev));
@@ -3455,6 +3459,150 @@ static void station_destroy_interface(void *user_data)
 	station_free(station);
 }
 
+static void station_get_diagnostic_cb(const struct netdev_station_info *info,
+					void *user_data)
+{
+	struct station *station = user_data;
+	struct l_dbus_message *reply;
+	struct l_dbus_message_builder *builder;
+	int16_t rssi;
+
+	if (!info) {
+		reply = dbus_error_aborted(station->get_station_pending);
+		goto done;
+	}
+
+	reply = l_dbus_message_new_method_return(station->get_station_pending);
+
+	rssi = (int16_t)info->cur_rssi;
+
+	builder = l_dbus_message_builder_new(reply);
+
+	l_dbus_message_builder_enter_array(builder, "{sv}");
+
+	dbus_append_dict_basic(builder, "ConnectedBss", 's',
+					util_address_to_string(info->addr));
+
+	if (info->have_cur_rssi)
+		dbus_append_dict_basic(builder, "RSSI", 'n', &rssi);
+
+	if (info->have_rx_mcs) {
+		switch (info->rx_mcs_type) {
+		case NETDEV_MCS_TYPE_HT:
+			dbus_append_dict_basic(builder, "RxMode", 's',
+						"802.11n");
+			dbus_append_dict_basic(builder, "RxMCS", 'y',
+						&info->rx_mcs);
+			break;
+		case NETDEV_MCS_TYPE_VHT:
+			dbus_append_dict_basic(builder, "RxMode", 's',
+						"802.11ac");
+			dbus_append_dict_basic(builder, "RxMCS", 'y',
+						&info->rx_mcs);
+			break;
+		case NETDEV_MCS_TYPE_HE:
+			dbus_append_dict_basic(builder, "RxMode", 's',
+						"802.11ax");
+			dbus_append_dict_basic(builder, "RxMCS", 'y',
+						&info->rx_mcs);
+			break;
+		default:
+			break;
+		}
+	}
+
+	if (info->have_tx_mcs) {
+		switch (info->tx_mcs_type) {
+		case NETDEV_MCS_TYPE_HT:
+			dbus_append_dict_basic(builder, "TxMode", 's',
+						"802.11n");
+			dbus_append_dict_basic(builder, "TxMCS", 'y',
+						&info->tx_mcs);
+			break;
+		case NETDEV_MCS_TYPE_VHT:
+			dbus_append_dict_basic(builder, "TxMode", 's',
+						"802.11ac");
+			dbus_append_dict_basic(builder, "TxMCS", 'y',
+						&info->tx_mcs);
+			break;
+		case NETDEV_MCS_TYPE_HE:
+			dbus_append_dict_basic(builder, "TxMode", 's',
+						"802.11ax");
+			dbus_append_dict_basic(builder, "TxMCS", 'y',
+						&info->tx_mcs);
+			break;
+		default:
+			break;
+		}
+	}
+
+	if (info->have_tx_bitrate)
+		dbus_append_dict_basic(builder, "TxBitrate", 'u',
+					&info->tx_bitrate);
+
+	if (info->have_rx_bitrate)
+		dbus_append_dict_basic(builder, "RxBitrate", 'u',
+					&info->rx_bitrate);
+
+	if (info->have_expected_throughput)
+		dbus_append_dict_basic(builder, "ExpectedThroughput", 'u',
+					&info->expected_throughput);
+
+	l_dbus_message_builder_leave_array(builder);
+	l_dbus_message_builder_finalize(builder);
+	l_dbus_message_builder_destroy(builder);
+
+done:
+	dbus_pending_reply(&station->get_station_pending, reply);
+}
+
+static void station_get_diagnostic_destroy(void *user_data)
+{
+	struct station *station = user_data;
+	struct l_dbus_message *reply;
+
+	if (station->get_station_pending) {
+		reply = dbus_error_aborted(station->get_station_pending);
+		dbus_pending_reply(&station->get_station_pending, reply);
+	}
+}
+
+static struct l_dbus_message *station_get_diagnostics(struct l_dbus *dbus,
+						struct l_dbus_message *message,
+						void *user_data)
+{
+	struct station *station = user_data;
+	int ret;
+
+	/*
+	 * At this time all values depend on a connected state.
+	 */
+	if (station->state != STATION_STATE_CONNECTED)
+		return dbus_error_not_connected(message);
+
+	ret = netdev_get_current_station(station->netdev,
+				station_get_diagnostic_cb, station,
+				station_get_diagnostic_destroy);
+	if (ret < 0)
+		return dbus_error_from_errno(ret, message);
+
+	station->get_station_pending = l_dbus_message_ref(message);
+
+	return NULL;
+}
+
+static void station_setup_diagnostic_interface(
+					struct l_dbus_interface *interface)
+{
+	l_dbus_interface_method(interface, "GetDiagnostics", 0,
+				station_get_diagnostics, "a{sv}", "",
+				"diagnostics");
+}
+
+static void station_destroy_diagnostic_interface(void *user_data)
+{
+}
+
 static void station_netdev_watch(struct netdev *netdev,
 				enum netdev_watch_event event, void *userdata)
 {
@@ -3483,6 +3631,11 @@ static int station_init(void)
 	l_dbus_register_interface(dbus_get_bus(), IWD_STATION_INTERFACE,
 					station_setup_interface,
 					station_destroy_interface, false);
+	l_dbus_register_interface(dbus_get_bus(),
+					IWD_STATION_DIAGNOSTIC_INTERFACE,
+					station_setup_diagnostic_interface,
+					station_destroy_diagnostic_interface,
+					false);
 
 	if (!l_settings_get_uint(iwd_get_config(), "General",
 					"ManagementFrameProtection",
@@ -3521,6 +3674,8 @@ static int station_init(void)
 
 static void station_exit(void)
 {
+	l_dbus_unregister_interface(dbus_get_bus(),
+					IWD_STATION_DIAGNOSTIC_INTERFACE);
 	l_dbus_unregister_interface(dbus_get_bus(), IWD_STATION_INTERFACE);
 	netdev_watch_remove(netdev_watch);
 	l_queue_destroy(station_list, NULL);
-- 
2.26.2

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v5 4/5] test: update get-diagnostics with Rx/TxMode
  2021-01-14 20:54 [PATCH v5 1/5] netdev: parse rates in netdev_get_station James Prestwood
  2021-01-14 20:54 ` [PATCH v5 2/5] netdev: parse expected throughput " James Prestwood
  2021-01-14 20:54 ` [PATCH v5 3/5] station: create StationDiagnostic interface James Prestwood
@ 2021-01-14 20:54 ` James Prestwood
  2021-01-14 21:01   ` Denis Kenzior
  2021-01-14 20:54 ` [PATCH v5 5/5] doc: add RateType's on diagnostic interface James Prestwood
  2021-01-14 21:00 ` [PATCH v5 1/5] netdev: parse rates in netdev_get_station Denis Kenzior
  4 siblings, 1 reply; 9+ messages in thread
From: James Prestwood @ 2021-01-14 20:54 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 609 bytes --]

---
 test/get-diagnostics | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/test/get-diagnostics b/test/get-diagnostics
index 7cb777b3..98078be5 100755
--- a/test/get-diagnostics
+++ b/test/get-diagnostics
@@ -8,8 +8,10 @@ import dbus
 unit_map = {
     "ConnectedBss" : None,
     "RSSI" : "dBm",
+    "RxMode" : None,
     "RxBitrate" : lambda k : str(100 * int(k)) + ' Kbps',
     "RxMCS" : lambda i : str(int(i)),
+    "TxMode" : None,
     "TxBitrate" : lambda k : str(100 * int(k)) + ' Kbps',
     "TxMCS" : lambda i : str(int(i)),
     "ExpectedThroughput" : "Kbps"
-- 
2.26.2

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v5 5/5] doc: add RateType's on diagnostic interface
  2021-01-14 20:54 [PATCH v5 1/5] netdev: parse rates in netdev_get_station James Prestwood
                   ` (2 preceding siblings ...)
  2021-01-14 20:54 ` [PATCH v5 4/5] test: update get-diagnostics with Rx/TxMode James Prestwood
@ 2021-01-14 20:54 ` James Prestwood
  2021-01-14 21:01   ` Denis Kenzior
  2021-01-14 21:00 ` [PATCH v5 1/5] netdev: parse rates in netdev_get_station Denis Kenzior
  4 siblings, 1 reply; 9+ messages in thread
From: James Prestwood @ 2021-01-14 20:54 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 741 bytes --]

---
 doc/diagnostics.txt | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/doc/diagnostics.txt b/doc/diagnostics.txt
index f94ef6f8..10bf470b 100644
--- a/doc/diagnostics.txt
+++ b/doc/diagnostics.txt
@@ -23,10 +23,16 @@ Methods		dict GetDiagnostics()
 
 			RSSI [optional] - The RSSI of the currently connected BSS.
 
+			RxMode [optional] -	The phy technology being used
+						(802.11n, 802.11ac or 802.11ax).
+
 			RxRate [optional] - Receive rate in 100kbit/s
 
 			RxMCS [optional] - Receiving MCS index
 
+			TxMode [optional] -	Same meaning as RxMode, just for
+						transmission.
+
 			TxRate [optional] - Transmission rate in 100kbit/s
 
 			TxMCS [optional] - Transmitting MCS index
-- 
2.26.2

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v5 1/5] netdev: parse rates in netdev_get_station
  2021-01-14 20:54 [PATCH v5 1/5] netdev: parse rates in netdev_get_station James Prestwood
                   ` (3 preceding siblings ...)
  2021-01-14 20:54 ` [PATCH v5 5/5] doc: add RateType's on diagnostic interface James Prestwood
@ 2021-01-14 21:00 ` Denis Kenzior
  4 siblings, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2021-01-14 21:00 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 322 bytes --]

Hi James,

On 1/14/21 2:54 PM, James Prestwood wrote:
> ---
>   src/netdev.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>   src/netdev.h | 18 ++++++++++
>   2 files changed, 112 insertions(+)
> 
> v5:
>   * Renamed some station_info members
> 

Patch 1 & 2 applied, thanks.

Regards,
-Denis

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v5 5/5] doc: add RateType's on diagnostic interface
  2021-01-14 20:54 ` [PATCH v5 5/5] doc: add RateType's on diagnostic interface James Prestwood
@ 2021-01-14 21:01   ` Denis Kenzior
  0 siblings, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2021-01-14 21:01 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 186 bytes --]

Hi James,

On 1/14/21 2:54 PM, James Prestwood wrote:
> ---
>   doc/diagnostics.txt | 6 ++++++
>   1 file changed, 6 insertions(+)
> 

Applied after rewording the commit header

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v5 4/5] test: update get-diagnostics with Rx/TxMode
  2021-01-14 20:54 ` [PATCH v5 4/5] test: update get-diagnostics with Rx/TxMode James Prestwood
@ 2021-01-14 21:01   ` Denis Kenzior
  0 siblings, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2021-01-14 21:01 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 178 bytes --]

Hi James,

On 1/14/21 2:54 PM, James Prestwood wrote:
> ---
>   test/get-diagnostics | 2 ++
>   1 file changed, 2 insertions(+)
> 

Applied, thanks.

Regards,
-Denis

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v5 3/5] station: create StationDiagnostic interface
  2021-01-14 20:54 ` [PATCH v5 3/5] station: create StationDiagnostic interface James Prestwood
@ 2021-01-14 21:14   ` Denis Kenzior
  0 siblings, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2021-01-14 21:14 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 539 bytes --]

Hi James,

On 1/14/21 2:54 PM, James Prestwood wrote:
> This interface sits aside the regular station interface but
> provides low level connection details for diagnostic and
> testing purposes.
> ---
>   src/station.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 155 insertions(+)
> 
> v5:
>   * Changed Rx/TxRateType to Rx/TxMode
>   * Removed 'legacy' terminology, the rate mode will not be included
>     if the AP is operating in legacy modes.
> 

Applied, thanks.

Regards,
-Denis

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2021-01-14 21:14 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-01-14 20:54 [PATCH v5 1/5] netdev: parse rates in netdev_get_station James Prestwood
2021-01-14 20:54 ` [PATCH v5 2/5] netdev: parse expected throughput " James Prestwood
2021-01-14 20:54 ` [PATCH v5 3/5] station: create StationDiagnostic interface James Prestwood
2021-01-14 21:14   ` Denis Kenzior
2021-01-14 20:54 ` [PATCH v5 4/5] test: update get-diagnostics with Rx/TxMode James Prestwood
2021-01-14 21:01   ` Denis Kenzior
2021-01-14 20:54 ` [PATCH v5 5/5] doc: add RateType's on diagnostic interface James Prestwood
2021-01-14 21:01   ` Denis Kenzior
2021-01-14 21:00 ` [PATCH v5 1/5] netdev: parse rates in netdev_get_station Denis Kenzior

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.