about summary refs log tree commit diff
path: root/src/core/platform/wifi/nm-wifi-utils.c
diff options
context:
space:
mode:
authorSebastien Bacher <seb128@ubuntu.com>2021-02-25 11:35:01 +0100
committerSebastien Bacher <seb128@ubuntu.com>2021-02-25 11:49:48 +0100
commit77dea84aa6e816f66dc622cec8ae2668eba3c068 (patch)
tree755536a0ed1fb36c2899e9bff9e092c4008a25c4 /src/core/platform/wifi/nm-wifi-utils.c
parent47f08826b44eed651b44dc8bacb5b46bc4c52067 (diff)
parentfd80297a396cc4dd7da4da20208fb360aa369aa7 (diff)
Merge branch 'debian/master' into ubuntu/master
Diffstat (limited to 'src/core/platform/wifi/nm-wifi-utils.c')
-rw-r--r--src/core/platform/wifi/nm-wifi-utils.c211
1 files changed, 211 insertions, 0 deletions
diff --git a/src/core/platform/wifi/nm-wifi-utils.c b/src/core/platform/wifi/nm-wifi-utils.c
new file mode 100644
index 00000000..49ae1811
--- /dev/null
+++ b/src/core/platform/wifi/nm-wifi-utils.c
@@ -0,0 +1,211 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2005 - 2018 Red Hat, Inc.
+ * Copyright (C) 2006 - 2008 Novell, Inc.
+ */
+
+#include "src/core/nm-default-daemon.h"
+
+#include "nm-wifi-utils.h"
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <fcntl.h>
+
+#include "nm-wifi-utils-private.h"
+#include "nm-wifi-utils-nl80211.h"
+#if HAVE_WEXT
+    #include "nm-wifi-utils-wext.h"
+#endif
+#include "nm-core-utils.h"
+
+#include "nm-platform/nm-platform-utils.h"
+
+G_DEFINE_ABSTRACT_TYPE(NMWifiUtils, nm_wifi_utils, G_TYPE_OBJECT)
+
+/*****************************************************************************/
+
+static void
+nm_wifi_utils_init(NMWifiUtils *self)
+{}
+
+static void
+nm_wifi_utils_class_init(NMWifiUtilsClass *klass)
+{}
+
+NMWifiUtils *
+nm_wifi_utils_new(int ifindex, struct nl_sock *genl, gboolean check_scan)
+{
+    NMWifiUtils *ret;
+
+    g_return_val_if_fail(ifindex > 0, NULL);
+
+    ret = nm_wifi_utils_nl80211_new(ifindex, genl);
+
+#if HAVE_WEXT
+    if (ret == NULL)
+        ret = nm_wifi_utils_wext_new(ifindex, check_scan);
+#endif
+
+    return ret;
+}
+
+NMDeviceWifiCapabilities
+nm_wifi_utils_get_caps(NMWifiUtils *data)
+{
+    g_return_val_if_fail(data != NULL, NM_WIFI_DEVICE_CAP_NONE);
+
+    return data->caps;
+}
+
+NM80211Mode
+nm_wifi_utils_get_mode(NMWifiUtils *data)
+{
+    g_return_val_if_fail(data != NULL, NM_802_11_MODE_UNKNOWN);
+    return NM_WIFI_UTILS_GET_CLASS(data)->get_mode(data);
+}
+
+gboolean
+nm_wifi_utils_set_mode(NMWifiUtils *data, const NM80211Mode mode)
+{
+    NMWifiUtilsClass *klass;
+
+    g_return_val_if_fail(data != NULL, FALSE);
+    g_return_val_if_fail((mode == NM_802_11_MODE_INFRA) || (mode == NM_802_11_MODE_AP)
+                             || (mode == NM_802_11_MODE_ADHOC) || (mode == NM_802_11_MODE_MESH),
+                         FALSE);
+
+    klass = NM_WIFI_UTILS_GET_CLASS(data);
+
+    /* nl80211 probably doesn't need this */
+    return klass->set_mode ? klass->set_mode(data, mode) : TRUE;
+}
+
+gboolean
+nm_wifi_utils_set_powersave(NMWifiUtils *data, guint32 powersave)
+{
+    NMWifiUtilsClass *klass;
+
+    g_return_val_if_fail(data != NULL, FALSE);
+
+    klass = NM_WIFI_UTILS_GET_CLASS(data);
+    return klass->set_powersave ? klass->set_powersave(data, powersave) : TRUE;
+}
+
+NMSettingWirelessWakeOnWLan
+nm_wifi_utils_get_wake_on_wlan(NMWifiUtils *data)
+{
+    NMWifiUtilsClass *klass;
+
+    g_return_val_if_fail(data != NULL, NM_SETTING_WIRELESS_WAKE_ON_WLAN_IGNORE);
+
+    klass = NM_WIFI_UTILS_GET_CLASS(data);
+
+    return klass->get_wake_on_wlan ? klass->get_wake_on_wlan(data)
+                                   : NM_SETTING_WIRELESS_WAKE_ON_WLAN_IGNORE;
+}
+
+gboolean
+nm_wifi_utils_set_wake_on_wlan(NMWifiUtils *data, NMSettingWirelessWakeOnWLan wowl)
+{
+    NMWifiUtilsClass *klass;
+
+    g_return_val_if_fail(data != NULL, FALSE);
+
+    klass = NM_WIFI_UTILS_GET_CLASS(data);
+    return klass->set_wake_on_wlan ? klass->set_wake_on_wlan(data, wowl) : FALSE;
+}
+
+guint32
+nm_wifi_utils_get_freq(NMWifiUtils *data)
+{
+    g_return_val_if_fail(data != NULL, 0);
+    return NM_WIFI_UTILS_GET_CLASS(data)->get_freq(data);
+}
+
+guint32
+nm_wifi_utils_find_freq(NMWifiUtils *data, const guint32 *freqs)
+{
+    g_return_val_if_fail(data != NULL, 0);
+    g_return_val_if_fail(freqs != NULL, 0);
+    return NM_WIFI_UTILS_GET_CLASS(data)->find_freq(data, freqs);
+}
+
+gboolean
+nm_wifi_utils_get_station(NMWifiUtils *data,
+                          NMEtherAddr *out_bssid,
+                          int *        out_quality,
+                          guint32 *    out_rate)
+{
+    g_return_val_if_fail(data != NULL, FALSE);
+
+    return NM_WIFI_UTILS_GET_CLASS(data)->get_station(data, out_bssid, out_quality, out_rate);
+}
+
+gboolean
+nm_wifi_utils_is_wifi(int dirfd, const char *ifname)
+{
+    g_return_val_if_fail(dirfd >= 0, FALSE);
+
+    if (faccessat(dirfd, "phy80211", F_OK, 0) == 0)
+        return TRUE;
+#if HAVE_WEXT
+    if (nm_wifi_utils_wext_is_wifi(ifname))
+        return TRUE;
+#endif
+    return FALSE;
+}
+
+/* OLPC Mesh-only functions */
+
+guint32
+nm_wifi_utils_get_mesh_channel(NMWifiUtils *data)
+{
+    NMWifiUtilsClass *klass;
+
+    g_return_val_if_fail(data != NULL, FALSE);
+
+    klass = NM_WIFI_UTILS_GET_CLASS(data);
+    g_return_val_if_fail(klass->get_mesh_channel != NULL, FALSE);
+
+    return klass->get_mesh_channel(data);
+}
+
+gboolean
+nm_wifi_utils_set_mesh_channel(NMWifiUtils *data, guint32 channel)
+{
+    NMWifiUtilsClass *klass;
+
+    g_return_val_if_fail(data != NULL, FALSE);
+    g_return_val_if_fail(channel <= 13, FALSE);
+
+    klass = NM_WIFI_UTILS_GET_CLASS(data);
+    g_return_val_if_fail(klass->set_mesh_channel != NULL, FALSE);
+
+    return klass->set_mesh_channel(data, channel);
+}
+
+gboolean
+nm_wifi_utils_set_mesh_ssid(NMWifiUtils *data, const guint8 *ssid, gsize len)
+{
+    NMWifiUtilsClass *klass;
+
+    g_return_val_if_fail(data != NULL, FALSE);
+
+    klass = NM_WIFI_UTILS_GET_CLASS(data);
+    g_return_val_if_fail(klass->set_mesh_ssid != NULL, FALSE);
+
+    return klass->set_mesh_ssid(data, ssid, len);
+}
+
+gboolean
+nm_wifi_utils_indicate_addressing_running(NMWifiUtils *data, gboolean running)
+{
+    NMWifiUtilsClass *klass;
+
+    g_return_val_if_fail(data != NULL, FALSE);
+
+    klass = NM_WIFI_UTILS_GET_CLASS(data);
+    return klass->indicate_addressing_running ? klass->indicate_addressing_running(data, running)
+                                              : FALSE;
+}