Blame src/core/devices/wifi/nm-wifi-factory.c

Packit Service 5ffa24
/* SPDX-License-Identifier: GPL-2.0-or-later */
Packit Service 5ffa24
/*
Packit Service 5ffa24
 * Copyright (C) 2011 - 2014 Red Hat, Inc.
Packit Service 5ffa24
 */
Packit Service 5ffa24
Packit Service 5ffa24
#include "nm-default.h"
Packit Service 5ffa24
Packit Service 5ffa24
#include <gmodule.h>
Packit Service 5ffa24
Packit Service 5ffa24
#include "devices/nm-device-factory.h"
Packit Service 5ffa24
#include "nm-setting-wireless.h"
Packit Service 5ffa24
#include "nm-setting-olpc-mesh.h"
Packit Service 5ffa24
#include "nm-device-wifi.h"
Packit Service 5ffa24
#include "nm-device-wifi-p2p.h"
Packit Service 5ffa24
#include "nm-device-olpc-mesh.h"
Packit Service 5ffa24
#include "nm-device-iwd.h"
Packit Service 5ffa24
#include "settings/nm-settings-connection.h"
Packit Service 5ffa24
#include "platform/nm-platform.h"
Packit Service 5ffa24
#include "nm-config.h"
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
#define NM_TYPE_WIFI_FACTORY (nm_wifi_factory_get_type())
Packit Service 5ffa24
#define NM_WIFI_FACTORY(obj) \
Packit Service 5ffa24
    (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_WIFI_FACTORY, NMWifiFactory))
Packit Service 5ffa24
#define NM_WIFI_FACTORY_CLASS(klass) \
Packit Service 5ffa24
    (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_WIFI_FACTORY, NMWifiFactoryClass))
Packit Service 5ffa24
#define NM_IS_WIFI_FACTORY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_WIFI_FACTORY))
Packit Service 5ffa24
#define NM_IS_WIFI_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_WIFI_FACTORY))
Packit Service 5ffa24
#define NM_WIFI_FACTORY_GET_CLASS(obj) \
Packit Service 5ffa24
    (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_WIFI_FACTORY, NMWifiFactoryClass))
Packit Service 5ffa24
Packit Service 5ffa24
typedef struct {
Packit Service 5ffa24
    NMDeviceFactory parent;
Packit Service 5ffa24
} NMWifiFactory;
Packit Service 5ffa24
Packit Service 5ffa24
typedef struct {
Packit Service 5ffa24
    NMDeviceFactoryClass parent;
Packit Service 5ffa24
} NMWifiFactoryClass;
Packit Service 5ffa24
Packit Service 5ffa24
static GType nm_wifi_factory_get_type(void);
Packit Service 5ffa24
Packit Service 5ffa24
G_DEFINE_TYPE(NMWifiFactory, nm_wifi_factory, NM_TYPE_DEVICE_FACTORY)
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
NM_DEVICE_FACTORY_DECLARE_TYPES(
Packit Service 5ffa24
    NM_DEVICE_FACTORY_DECLARE_LINK_TYPES(NM_LINK_TYPE_WIFI, NM_LINK_TYPE_OLPC_MESH)
Packit Service 5ffa24
        NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES(NM_SETTING_WIRELESS_SETTING_NAME,
Packit Service 5ffa24
                                                NM_SETTING_OLPC_MESH_SETTING_NAME))
Packit Service 5ffa24
Packit Service 5ffa24
G_MODULE_EXPORT NMDeviceFactory *
Packit Service 5ffa24
                nm_device_factory_create(GError **error)
Packit Service 5ffa24
{
Packit Service 5ffa24
    return g_object_new(NM_TYPE_WIFI_FACTORY, NULL);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
static void
Packit Service 5ffa24
p2p_device_created(NMDeviceWifi *device, NMDeviceWifiP2P *p2p_device, NMDeviceFactory *self)
Packit Service 5ffa24
{
Packit Service 5ffa24
    nm_log_info(LOGD_PLATFORM | LOGD_WIFI,
Packit Service 5ffa24
                "Wi-Fi P2P device controlled by interface %s created",
Packit Service 5ffa24
                nm_device_get_iface(NM_DEVICE(device)));
Packit Service 5ffa24
Packit Service 5ffa24
    g_signal_emit_by_name(self, NM_DEVICE_FACTORY_DEVICE_ADDED, p2p_device);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static NMDevice *
Packit Service 5ffa24
create_device(NMDeviceFactory *     factory,
Packit Service 5ffa24
              const char *          iface,
Packit Service 5ffa24
              const NMPlatformLink *plink,
Packit Service 5ffa24
              NMConnection *        connection,
Packit Service 5ffa24
              gboolean *            out_ignore)
Packit Service 5ffa24
{
Packit Service 5ffa24
    gs_free char *backend = NULL;
Packit Service 5ffa24
Packit Service 5ffa24
    g_return_val_if_fail(iface != NULL, NULL);
Packit Service 5ffa24
    g_return_val_if_fail(plink != NULL, NULL);
Packit Service 5ffa24
    g_return_val_if_fail(g_strcmp0(iface, plink->name) == 0, NULL);
Packit Service 5ffa24
    g_return_val_if_fail(NM_IN_SET(plink->type, NM_LINK_TYPE_WIFI, NM_LINK_TYPE_OLPC_MESH), NULL);
Packit Service 5ffa24
Packit Service 5ffa24
    if (plink->type != NM_LINK_TYPE_WIFI)
Packit Service 5ffa24
        return nm_device_olpc_mesh_new(iface);
Packit Service 5ffa24
Packit Service 5ffa24
    backend = nm_config_data_get_device_config_by_pllink(NM_CONFIG_GET_DATA,
Packit Service 5ffa24
                                                         NM_CONFIG_KEYFILE_KEY_DEVICE_WIFI_BACKEND,
Packit Service 5ffa24
                                                         plink,
Packit Service 5ffa24
                                                         "wifi",
Packit Service 5ffa24
                                                         NULL);
Packit Service 5ffa24
    nm_strstrip(backend);
Packit Service 5ffa24
Packit Service 5ffa24
    nm_log_dbg(LOGD_PLATFORM | LOGD_WIFI,
Packit Service 5ffa24
               "(%s) config: backend is %s%s%s%s",
Packit Service 5ffa24
               iface,
Packit Service 5ffa24
               NM_PRINT_FMT_QUOTE_STRING(backend),
Packit Service 5ffa24
               WITH_IWD ? " (iwd support enabled)" : "");
Packit Service 5ffa24
    if (!backend || !g_ascii_strcasecmp(backend, "wpa_supplicant")) {
Packit Service 5ffa24
        NMDevice *               device;
Packit Service 5ffa24
        NMDeviceWifiCapabilities capabilities;
Packit Service 5ffa24
        NM80211Mode              mode;
Packit Service 5ffa24
Packit Service 5ffa24
        if (!nm_platform_wifi_get_capabilities(NM_PLATFORM_GET, plink->ifindex, &capabilities)) {
Packit Service 5ffa24
            nm_log_warn(LOGD_PLATFORM | LOGD_WIFI,
Packit Service 5ffa24
                        "(%s) failed to initialize Wi-Fi driver for ifindex %d",
Packit Service 5ffa24
                        iface,
Packit Service 5ffa24
                        plink->ifindex);
Packit Service 5ffa24
            return NULL;
Packit Service 5ffa24
        }
Packit Service 5ffa24
Packit Service 5ffa24
        /* Ignore monitor-mode and other unhandled interface types.
Packit Service 5ffa24
         * FIXME: keep TYPE_MONITOR devices in UNAVAILABLE state and manage
Packit Service 5ffa24
         * them if/when they change to a handled type.
Packit Service 5ffa24
         */
Packit Service 5ffa24
        mode = nm_platform_wifi_get_mode(NM_PLATFORM_GET, plink->ifindex);
Packit Service 5ffa24
        if (mode == NM_802_11_MODE_UNKNOWN) {
Packit Service 5ffa24
            *out_ignore = TRUE;
Packit Service 5ffa24
            return NULL;
Packit Service 5ffa24
        }
Packit Service 5ffa24
Packit Service 5ffa24
        device = nm_device_wifi_new(iface, capabilities);
Packit Service 5ffa24
Packit Service 5ffa24
        g_signal_connect_object(device,
Packit Service 5ffa24
                                NM_DEVICE_WIFI_P2P_DEVICE_CREATED,
Packit Service 5ffa24
                                G_CALLBACK(p2p_device_created),
Packit Service 5ffa24
                                factory,
Packit Service 5ffa24
                                0);
Packit Service 5ffa24
Packit Service 5ffa24
        return device;
Packit Service 5ffa24
    }
Packit Service 5ffa24
#if WITH_IWD
Packit Service 5ffa24
    else if (!g_ascii_strcasecmp(backend, "iwd"))
Packit Service 5ffa24
        return nm_device_iwd_new(iface);
Packit Service 5ffa24
#endif
Packit Service 5ffa24
Packit Service 5ffa24
    nm_log_warn(LOGD_PLATFORM | LOGD_WIFI,
Packit Service 5ffa24
                "(%s) config: unknown or unsupported wifi-backend %s",
Packit Service 5ffa24
                iface,
Packit Service 5ffa24
                backend);
Packit Service 5ffa24
    return NULL;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
static void
Packit Service 5ffa24
nm_wifi_factory_init(NMWifiFactory *self)
Packit Service 5ffa24
{}
Packit Service 5ffa24
Packit Service 5ffa24
static void
Packit Service 5ffa24
nm_wifi_factory_class_init(NMWifiFactoryClass *klass)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMDeviceFactoryClass *factory_class = NM_DEVICE_FACTORY_CLASS(klass);
Packit Service 5ffa24
Packit Service 5ffa24
    factory_class->create_device       = create_device;
Packit Service 5ffa24
    factory_class->get_supported_types = get_supported_types;
Packit Service 5ffa24
}