From 85a6fc25f11533d88feae3e22780227a346c90a7 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Sat, 18 Sep 2021 14:19:41 -0500 Subject: [PATCH] nl80211util: Add chandef parser Parse chandef elements from NL80211_CMD_GET_INTERFACE. This provides information on the current operating channel. --- src/band.h | 16 ++++++++++++++++ src/nl80211util.c | 30 ++++++++++++++++++++++++++++++ src/nl80211util.h | 4 ++++ 3 files changed, 50 insertions(+) diff --git a/src/band.h b/src/band.h index 4958a63a..dfb348eb 100644 --- a/src/band.h +++ b/src/band.h @@ -27,6 +27,22 @@ enum ofdm_channel_width { OFDM_CHANNEL_WIDTH_160MHZ, }; +enum band_chandef_width { + BAND_CHANDEF_WIDTH_20NOHT = 0, + BAND_CHANDEF_WIDTH_20, + BAND_CHANDEF_WIDTH_40, + BAND_CHANDEF_WIDTH_80, + BAND_CHANDEF_WIDTH_80P80, + BAND_CHANDEF_WIDTH_160, +}; + +struct band_chandef { + uint32_t frequency; + uint32_t channel_width; + uint32_t center1_frequency; + uint32_t center2_frequency; +}; + struct band { uint8_t vht_mcs_set[8]; uint8_t vht_capabilities[4]; diff --git a/src/nl80211util.c b/src/nl80211util.c index 7a752a66..d9d4819d 100644 --- a/src/nl80211util.c +++ b/src/nl80211util.c @@ -31,6 +31,7 @@ #include "linux/nl80211.h" #include "src/nl80211util.h" +#include "src/band.h" typedef bool (*attr_handler)(const void *data, uint16_t len, void *o); @@ -138,6 +139,11 @@ static attr_handler handler_for_type(enum nl80211_attrs type) case NL80211_ATTR_ACK: return extract_flag; case NL80211_ATTR_WIPHY_FREQ: + case NL80211_ATTR_WIPHY_FREQ_OFFSET: + case NL80211_ATTR_WIPHY_CHANNEL_TYPE: + case NL80211_ATTR_CHANNEL_WIDTH: + case NL80211_ATTR_CENTER_FREQ1: + case NL80211_ATTR_CENTER_FREQ2: return extract_uint32; default: break; @@ -430,3 +436,27 @@ struct l_genl_msg *nl80211_build_cmd_frame(uint32_t ifindex, return msg; } + +int nl80211_parse_chandef(struct l_genl_msg *msg, struct band_chandef *out) +{ + struct band_chandef t; + + if (nl80211_parse_attrs(msg, + NL80211_ATTR_WIPHY_FREQ, &t.frequency, + NL80211_ATTR_CHANNEL_WIDTH, &t.channel_width, + NL80211_ATTR_CENTER_FREQ1, &t.center1_frequency, + NL80211_ATTR_UNSPEC) < 0) + return -ENOENT; + + t.center2_frequency = 0; + + /* Try to parse CENTER_FREQ2, but it is given only for 80P80 */ + if (t.channel_width == NL80211_CHAN_WIDTH_80P80 && + nl80211_parse_attrs(msg, + NL80211_ATTR_CENTER_FREQ2, &t.center2_frequency, + NL80211_ATTR_UNSPEC) < 0) + return -ENOENT; + + memcpy(out, &t, sizeof(t)); + return 0; +} diff --git a/src/nl80211util.h b/src/nl80211util.h index 70de0897..01777195 100644 --- a/src/nl80211util.h +++ b/src/nl80211util.h @@ -22,6 +22,8 @@ #include +struct band_chandef; + int nl80211_parse_attrs(struct l_genl_msg *msg, int tag, ...); struct l_genl_msg *nl80211_build_new_key_group(uint32_t ifindex, @@ -51,3 +53,5 @@ struct l_genl_msg *nl80211_build_cmd_frame(uint32_t ifindex, uint32_t freq, struct iovec *iov, size_t iov_len); + +int nl80211_parse_chandef(struct l_genl_msg *msg, struct band_chandef *out);