[PATCH] dbus: Add getter for Channel property
Stefan Ursella
stefan.ursella at wolfvision.net
Fri Dec 6 05:50:34 PST 2024
Add "Channel" property to the DBus interface
that allows to get the channel of a BSS.
Signed-off-by: Stefan Ursella <stefan.ursella at wolfvision.net>
---
wpa_supplicant/dbus/dbus_new.c | 5 +++
wpa_supplicant/dbus/dbus_new_handlers.c | 52 +++++++++++++++++++++++++
wpa_supplicant/dbus/dbus_new_handlers.h | 1 +
3 files changed, 58 insertions(+)
diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
index ff7e003cb..fd7958a62 100644
--- a/wpa_supplicant/dbus/dbus_new.c
+++ b/wpa_supplicant/dbus/dbus_new.c
@@ -3096,6 +3096,11 @@ static const struct wpa_dbus_property_desc wpas_dbus_bss_properties[] = {
NULL,
NULL
},
+ { "Channel", WPAS_DBUS_NEW_IFACE_BSS, "y",
+ wpas_dbus_getter_bss_channel,
+ NULL,
+ NULL
+ },
{ "Rates", WPAS_DBUS_NEW_IFACE_BSS, "au",
wpas_dbus_getter_bss_rates,
NULL,
diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c
index 2fad8dd59..6072e97a9 100644
--- a/wpa_supplicant/dbus/dbus_new_handlers.c
+++ b/wpa_supplicant/dbus/dbus_new_handlers.c
@@ -12,6 +12,7 @@
#include "common.h"
#include "common/ieee802_11_defs.h"
+#include "common/ieee802_11_common.h"
#include "common/nan_de.h"
#include "eap_peer/eap_methods.h"
#include "eapol_supp/eapol_supp_sm.h"
@@ -5385,6 +5386,57 @@ dbus_bool_t wpas_dbus_getter_bss_frequency(
&freq, error);
}
+/**
+ * wpas_dbus_getter_bss_channel - Return the channel of a BSS
+ * @iter: Pointer to incoming dbus message iter
+ * @error: Location to store error on failure
+ * @user_data: Function specific data
+ * Returns: TRUE on success, FALSE on failure
+ *
+ * Getter for "Channel" property.
+ */
+dbus_bool_t wpas_dbus_getter_bss_channel(
+ const struct wpa_dbus_property_desc *property_desc,
+ DBusMessageIter *iter, DBusError *error, void *user_data)
+{
+ struct bss_handler_args *args = user_data;
+ const u8 *ie;
+ struct wpa_bss *res;
+ u16 channel = 0, op_class = 0;
+ int sec_chan = 0, vht = 0;
+
+ res = get_bss_helper(args, error, __func__);
+ if (!res)
+ return FALSE;
+
+ ie = wpa_bss_get_ie(res, WLAN_EID_HT_OPERATION);
+ if (ie && ie[2] >= 2) {
+ struct ieee80211_ht_operation *ht_oper = (struct ieee80211_ht_operation *) (ie + 2);
+
+ if (ht_oper->ht_param & HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE)
+ sec_chan = 1;
+ else if (ht_oper->ht_param &
+ HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW)
+ sec_chan = -1;
+ }
+
+ ie = wpa_bss_get_ie(res, WLAN_EID_VHT_OPERATION);
+ if (ie && ie[1] >= 1) {
+ struct ieee80211_vht_operation *vht_oper = (struct ieee80211_vht_operation *) (ie + 2);
+
+ if (vht_oper->vht_op_info_chwidth == CHANWIDTH_80MHZ ||
+ vht_oper->vht_op_info_chwidth == CHANWIDTH_160MHZ ||
+ vht_oper->vht_op_info_chwidth == CHANWIDTH_80P80MHZ)
+ vht = vht_oper->vht_op_info_chwidth;
+ }
+
+ if (ieee80211_freq_to_channel_ext(res->freq, sec_chan, vht, (u8 *)&op_class,
+ (u8 *)&channel) == NUM_HOSTAPD_MODES)
+ return FALSE;
+
+ return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_UINT16,
+ &channel, error);
+}
static int cmp_u8s_desc(const void *a, const void *b)
{
diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h b/wpa_supplicant/dbus/dbus_new_handlers.h
index a5260907a..3391e51f7 100644
--- a/wpa_supplicant/dbus/dbus_new_handlers.h
+++ b/wpa_supplicant/dbus/dbus_new_handlers.h
@@ -214,6 +214,7 @@ DECLARE_ACCESSOR(wpas_dbus_getter_bss_privacy);
DECLARE_ACCESSOR(wpas_dbus_getter_bss_mode);
DECLARE_ACCESSOR(wpas_dbus_getter_bss_signal);
DECLARE_ACCESSOR(wpas_dbus_getter_bss_frequency);
+DECLARE_ACCESSOR(wpas_dbus_getter_bss_channel);
DECLARE_ACCESSOR(wpas_dbus_getter_bss_rates);
DECLARE_ACCESSOR(wpas_dbus_getter_bss_wpa);
DECLARE_ACCESSOR(wpas_dbus_getter_bss_rsn);
--
2.34.1
More information about the Hostap
mailing list