blob: 9e6c1a4ecae001e0f43ab14f6062ea73dd55e3bf [file] [log] [blame]
From 7794573f915174b5dd2cd22e123ecd63610ccf44 Mon Sep 17 00:00:00 2001
From: Johannes Berg <johannes.berg@intel.com>
Date: Fri, 2 Sep 2022 21:59:31 +0200
Subject: [PATCH 12/28] interface: print links
Print link information in 'iw dev' and 'iw ... info'.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
interface.c | 74 ++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 53 insertions(+), 21 deletions(-)
diff --git a/interface.c b/interface.c
index 84990c9..7e1dd58 100644
--- a/interface.c
+++ b/interface.c
@@ -369,6 +369,30 @@ char *channel_width_name(enum nl80211_chan_width width)
}
}
+static void print_channel(struct nlattr **tb)
+{
+ uint32_t freq = nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]);
+
+ printf("channel %d (%d MHz)",
+ ieee80211_frequency_to_channel(freq), freq);
+
+ if (tb[NL80211_ATTR_CHANNEL_WIDTH]) {
+ printf(", width: %s",
+ channel_width_name(nla_get_u32(tb[NL80211_ATTR_CHANNEL_WIDTH])));
+ if (tb[NL80211_ATTR_CENTER_FREQ1])
+ printf(", center1: %d MHz",
+ nla_get_u32(tb[NL80211_ATTR_CENTER_FREQ1]));
+ if (tb[NL80211_ATTR_CENTER_FREQ2])
+ printf(", center2: %d MHz",
+ nla_get_u32(tb[NL80211_ATTR_CENTER_FREQ2]));
+ } else if (tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
+ enum nl80211_channel_type channel_type;
+
+ channel_type = nla_get_u32(tb[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
+ printf(" %s", channel_type_name(channel_type));
+ }
+}
+
static int print_iface_handler(struct nl_msg *msg, void *arg)
{
struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
@@ -412,27 +436,8 @@ static int print_iface_handler(struct nl_msg *msg, void *arg)
if (!wiphy && tb_msg[NL80211_ATTR_WIPHY])
printf("%s\twiphy %d\n", indent, nla_get_u32(tb_msg[NL80211_ATTR_WIPHY]));
if (tb_msg[NL80211_ATTR_WIPHY_FREQ]) {
- uint32_t freq = nla_get_u32(tb_msg[NL80211_ATTR_WIPHY_FREQ]);
-
- printf("%s\tchannel %d (%d MHz)", indent,
- ieee80211_frequency_to_channel(freq), freq);
-
- if (tb_msg[NL80211_ATTR_CHANNEL_WIDTH]) {
- printf(", width: %s",
- channel_width_name(nla_get_u32(tb_msg[NL80211_ATTR_CHANNEL_WIDTH])));
- if (tb_msg[NL80211_ATTR_CENTER_FREQ1])
- printf(", center1: %d MHz",
- nla_get_u32(tb_msg[NL80211_ATTR_CENTER_FREQ1]));
- if (tb_msg[NL80211_ATTR_CENTER_FREQ2])
- printf(", center2: %d MHz",
- nla_get_u32(tb_msg[NL80211_ATTR_CENTER_FREQ2]));
- } else if (tb_msg[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
- enum nl80211_channel_type channel_type;
-
- channel_type = nla_get_u32(tb_msg[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
- printf(" %s", channel_type_name(channel_type));
- }
-
+ printf("%s\t", indent);
+ print_channel(tb_msg);
printf("\n");
}
@@ -455,6 +460,33 @@ static int print_iface_handler(struct nl_msg *msg, void *arg)
printf("%s\t4addr: on\n", indent);
}
+ if (tb_msg[NL80211_ATTR_MLO_LINKS]) {
+ struct nlattr *link;
+ int n;
+
+ printf("%s\tMLD with links:\n", indent);
+
+ nla_for_each_nested(link, tb_msg[NL80211_ATTR_MLO_LINKS], n) {
+ struct nlattr *tb[NL80211_ATTR_MAX + 1];
+
+ nla_parse_nested(tb, NL80211_ATTR_MAX, link, NULL);
+ printf("%s\t - link", indent);
+ if (tb[NL80211_ATTR_MLO_LINK_ID])
+ printf(" ID %2d", nla_get_u32(tb[NL80211_ATTR_MLO_LINK_ID]));
+ if (tb[NL80211_ATTR_MAC]) {
+ char buf[20];
+
+ mac_addr_n2a(buf, nla_data(tb[NL80211_ATTR_MAC]));
+ printf(" link addr %s", buf);
+ }
+ if (tb[NL80211_ATTR_WIPHY_FREQ]) {
+ printf("\n%s\t ", indent);
+ print_channel(tb);
+ }
+ printf("\n");
+ }
+ }
+
return NL_SKIP;
}
--
2.39.2