diff options
| author | Michael Biebl <biebl@debian.org> | 2021-02-11 18:11:46 +0100 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2021-02-11 18:11:46 +0100 |
| commit | 80ec1decc49c72efec2a8b87c06245c92c0ab807 (patch) | |
| tree | e3b229aa94e8dcf0590f2317664176e7b8f7607b /src/core/devices/nm-device-factory.h | |
| parent | 65f86e8f56267192d42f2b629fc6b0c99fb9cd0c (diff) | |
New upstream version 1.29.90 upstream/1.29.90
Diffstat (limited to 'src/core/devices/nm-device-factory.h')
| -rw-r--r-- | src/core/devices/nm-device-factory.h | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/src/core/devices/nm-device-factory.h b/src/core/devices/nm-device-factory.h new file mode 100644 index 00000000..d9b50563 --- /dev/null +++ b/src/core/devices/nm-device-factory.h @@ -0,0 +1,237 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2007 - 2014 Red Hat, Inc. + */ + +#ifndef __NETWORKMANAGER_DEVICE_FACTORY_H__ +#define __NETWORKMANAGER_DEVICE_FACTORY_H__ + +#include "nm-dbus-interface.h" +#include "nm-device.h" + +/* WARNING: this file is private API between NetworkManager and its internal + * device plugins. Its API can change at any time and is not guaranteed to be + * stable. NM and device plugins are distributed together and this API is + * not meant to enable third-party plugins. + */ + +#define NM_TYPE_DEVICE_FACTORY (nm_device_factory_get_type()) +#define NM_DEVICE_FACTORY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_DEVICE_FACTORY, NMDeviceFactory)) +#define NM_DEVICE_FACTORY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_DEVICE_FACTORY, NMDeviceFactoryClass)) +#define NM_IS_DEVICE_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_DEVICE_FACTORY)) +#define NM_IS_DEVICE_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_DEVICE_FACTORY)) +#define NM_DEVICE_FACTORY_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DEVICE_FACTORY, NMDeviceFactoryClass)) + +#define NM_DEVICE_FACTORY_DEVICE_ADDED "device-added" + +typedef struct { + GObject parent; +} NMDeviceFactory; + +typedef struct { + GObjectClass parent; + + /** + * get_supported_types: + * @factory: the #NMDeviceFactory + * @out_link_types: on return, a %NM_LINK_TYPE_NONE terminated + * list of #NMLinkType that the plugin supports + * @out_setting_types: on return, a %NULL terminated list of + * base-type #NMSetting names that the plugin can create devices for + * + * Returns the #NMLinkType and #NMSetting names that this plugin + * supports. This function MUST be implemented. + */ + void (*get_supported_types)(NMDeviceFactory * factory, + const NMLinkType ** out_link_types, + const char *const **out_setting_types); + + /** + * start: + * @factory: the #NMDeviceFactory + * + * Start the factory and discover any existing devices that the factory + * can manage. + */ + void (*start)(NMDeviceFactory *factory); + + /** + * match_connection: + * @connection: the #NMConnection + * + * Check if the factory supports the given connection. + */ + gboolean (*match_connection)(NMDeviceFactory *factory, NMConnection *connection); + + /** + * get_connection_parent: + * @factory: the #NMDeviceFactory + * @connection: the #NMConnection to return the parent name for, if supported + * + * Given a connection, returns the parent interface name, parent connection + * UUID, or parent device permanent hardware address for @connection. + * + * Returns: the parent interface name, parent connection UUID, parent + * device permanent hardware address, or %NULL + */ + const char *(*get_connection_parent)(NMDeviceFactory *factory, NMConnection *connection); + + /** + * get_connection_iface: + * @factory: the #NMDeviceFactory + * @connection: the #NMConnection to return the interface name for + * @parent_iface: optional parent interface name for virtual devices + * + * Given a connection, returns the interface name that a device activating + * that connection would have. + * + * Returns: the interface name, or %NULL + */ + char *(*get_connection_iface)(NMDeviceFactory *factory, + NMConnection * connection, + const char * parent_iface); + + /** + * create_device: + * @factory: the #NMDeviceFactory + * @iface: the interface name of the device + * @plink: the #NMPlatformLink if backed by a kernel device + * @connection: the #NMConnection if not backed by a kernel device + * @out_ignore: on return, %TRUE if the link should be ignored + * + * The plugin should create a new unrealized device using the details given + * by @iface and @plink or @connection. If both @iface and @plink are given, + * they are guaranteed to match. If both @iface and @connection are given, + * @iface is guaranteed to be the interface name that @connection specifies. + * + * If the plugin cannot create a #NMDevice for the link and wants the + * core to ignore it, set @out_ignore to %TRUE and return %NULL. + * + * Returns: the new unrealized #NMDevice, or %NULL + */ + NMDevice *(*create_device)(NMDeviceFactory * factory, + const char * iface, + const NMPlatformLink *plink, + NMConnection * connection, + gboolean * out_ignore); + +} NMDeviceFactoryClass; + +GType nm_device_factory_get_type(void); + +/*****************************************************************************/ + +/** + * nm_device_factory_create: + * @error: an error if creation of the factory failed, or %NULL + * + * Creates a #GObject that implements the #NMDeviceFactory interface. This + * function must not emit any signals or perform any actions that would cause + * devices or components to be created immediately. Instead these should be + * deferred to the "start" interface method. + * + * Returns: the #GObject implementing #NMDeviceFactory or %NULL + */ +NMDeviceFactory *nm_device_factory_create(GError **error); + +/* Should match nm_device_factory_create() */ +typedef NMDeviceFactory *(*NMDeviceFactoryCreateFunc)(GError **error); + +/*****************************************************************************/ + +const char *nm_device_factory_get_connection_parent(NMDeviceFactory *factory, + NMConnection * connection); + +char *nm_device_factory_get_connection_iface(NMDeviceFactory *factory, + NMConnection * connection, + const char * parent_iface, + GError ** error); + +void nm_device_factory_start(NMDeviceFactory *factory); + +NMDevice *nm_device_factory_create_device(NMDeviceFactory * factory, + const char * iface, + const NMPlatformLink *plink, + NMConnection * connection, + gboolean * out_ignore, + GError ** error); + +#define NM_DEVICE_FACTORY_DECLARE_LINK_TYPES(...) \ + { \ + static NMLinkType const _link_types_declared[] = {__VA_ARGS__, NM_LINK_TYPE_NONE}; \ + _link_types = _link_types_declared; \ + } +#define NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES(...) \ + { \ + static const char *const _setting_types_declared[] = {__VA_ARGS__, NULL}; \ + _setting_types = _setting_types_declared; \ + } + +#define NM_DEVICE_FACTORY_DECLARE_TYPES(...) \ + static void get_supported_types(NMDeviceFactory * factory, \ + const NMLinkType ** out_link_types, \ + const char *const **out_setting_types) \ + { \ + static NMLinkType const _link_types_null[1] = {NM_LINK_TYPE_NONE}; \ + static const char *const _setting_types_null[1] = {NULL}; \ + \ + const NMLinkType * _link_types = _link_types_null; \ + const char *const *_setting_types = _setting_types_null; \ + \ + { \ + __VA_ARGS__; \ + } \ + \ + NM_SET_OUT(out_link_types, _link_types); \ + NM_SET_OUT(out_setting_types, _setting_types); \ + } + +/************************************************************************** + * INTERNAL DEVICE FACTORY FUNCTIONS - devices provided by plugins should + * not use these functions. + **************************************************************************/ + +#define NM_DEVICE_FACTORY_DEFINE_INTERNAL(upper, mixed, lower, st_code, dfi_code) \ + typedef struct { \ + NMDeviceFactory parent; \ + } NM##mixed##DeviceFactory; \ + typedef struct { \ + NMDeviceFactoryClass parent; \ + } NM##mixed##DeviceFactoryClass; \ + \ + GType nm_##lower##_device_factory_get_type(void); \ + \ + G_DEFINE_TYPE(NM##mixed##DeviceFactory, nm_##lower##_device_factory, NM_TYPE_DEVICE_FACTORY) \ + \ + NM_DEVICE_FACTORY_DECLARE_TYPES(st_code) \ + \ + static void nm_##lower##_device_factory_init(NM##mixed##DeviceFactory *self) {} \ + \ + static void nm_##lower##_device_factory_class_init(NM##mixed##DeviceFactoryClass *klass) \ + { \ + NMDeviceFactoryClass *factory_class = NM_DEVICE_FACTORY_CLASS(klass); \ + \ + factory_class->get_supported_types = get_supported_types; \ + dfi_code \ + } + +/************************************************************************** + * PRIVATE FACTORY FUNCTIONS - for factory consumers (eg, NMManager). + **************************************************************************/ + +typedef void (*NMDeviceFactoryManagerFactoryFunc)(NMDeviceFactory *factory, gpointer user_data); + +void nm_device_factory_manager_load_factories(NMDeviceFactoryManagerFactoryFunc callback, + gpointer user_data); + +NMDeviceFactory *nm_device_factory_manager_find_factory_for_link_type(NMLinkType link_type); + +NMDeviceFactory *nm_device_factory_manager_find_factory_for_connection(NMConnection *connection); + +void nm_device_factory_manager_for_each_factory(NMDeviceFactoryManagerFactoryFunc callback, + gpointer user_data); + +#endif /* __NETWORKMANAGER_DEVICE_FACTORY_H__ */ |