about summary refs log tree commit diff
path: root/src/devices/nm-device-factory.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/nm-device-factory.h')
-rw-r--r--src/devices/nm-device-factory.h124
1 files changed, 102 insertions, 22 deletions
diff --git a/src/devices/nm-device-factory.h b/src/devices/nm-device-factory.h
index ce672b8b..34c056d2 100644
--- a/src/devices/nm-device-factory.h
+++ b/src/devices/nm-device-factory.h
@@ -66,14 +66,19 @@ struct _NMDeviceFactory {
 	GTypeInterface g_iface;
 
 	/**
-	 * get_device_type:
+	 * 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
 	 *
-	 * This function MUST be implemented.
-	 *
-	 * Returns: the #NMDeviceType that this plugin creates
+	 * Returns the #NMLinkType and #NMSetting names that this plugin
+	 * supports.  This function MUST be implemented.
 	 */
-	NMDeviceType (*get_device_type) (NMDeviceFactory *factory);
+	void (*get_supported_types) (NMDeviceFactory *factory,
+	                             const NMLinkType **out_link_types,
+	                             const char ***out_setting_types);
 
 	/**
 	 * start:
@@ -87,20 +92,27 @@ struct _NMDeviceFactory {
 	/**
 	 * new_link:
 	 * @factory: the #NMDeviceFactory
-	 * @link: the new link
+	 * @plink: the new link
+	 * @out_ignore: on return, %TRUE if the link should be ignored
 	 * @error: error if the link could be claimed but an error occurred
 	 *
 	 * The NetworkManager core was notified of a new link which the plugin
 	 * may want to claim and create a #NMDevice subclass for.  If the link
-	 * represents a device the factory is capable of claiming, but the device
-	 * could not be created, %NULL should be returned and @error should be set.
-	 * %NULL should always be returned and @error should never be set if the
-	 * factory cannot create devices for the type which @link represents.
+	 * represents a device which the factory does not support, or the link
+	 * is supported but the device could not be created, %NULL should be
+	 * returned and @error should be set.
+	 *
+	 * If the plugin cannot create a #NMDevice for the link and wants the
+	 * core to ignore it, set @out_ignore to %TRUE and return no error.
+	 *
+	 * @plink is guaranteed to be one of the types the factory returns in
+	 * get_supported_types().
 	 *
 	 * Returns: the #NMDevice if the link was claimed and created, %NULL if not
 	 */
 	NMDevice * (*new_link)        (NMDeviceFactory *factory,
 	                               NMPlatformLink *plink,
+	                               gboolean *out_ignore,
 	                               GError **error);
 
 	/**
@@ -121,6 +133,34 @@ struct _NMDeviceFactory {
 	                                                    NMDevice *parent,
 	                                                    GError **error);
 
+	/**
+	 * get_connection_parent:
+	 * @factory: the #NMDeviceFactory
+	 * @connection: the #NMConnection to return the parent name for, if supported
+	 *
+	 * Given a connection, returns the a parent interface name, parent connection
+	 * UUID, or parent device hardware address for @connection.
+	 *
+	 * Returns: the parent interface name, parent connection UUID, parent
+	 *   device hardware address, or %NULL
+	 */
+	const char * (*get_connection_parent) (NMDeviceFactory *factory,
+	                                       NMConnection *connection);
+
+	/**
+	 * get_virtual_iface_name:
+	 * @factory: the #NMDeviceFactory
+	 * @connection: the #NMConnection to return the virtual interface name for
+	 * @parent_iface: parent interface name
+	 *
+	 * Given a connection, returns the interface name that a device activating
+	 * that connection would have.
+	 *
+	 * Returns: the interface name, or %NULL
+	 */
+	char * (*get_virtual_iface_name) (NMDeviceFactory *factory,
+	                                  NMConnection *connection,
+	                                  const char *parent_iface);
 
 	/* Signals */
 
@@ -151,12 +191,22 @@ struct _NMDeviceFactory {
 
 GType      nm_device_factory_get_type    (void);
 
-NMDeviceType nm_device_factory_get_device_type (NMDeviceFactory *factory);
+void       nm_device_factory_get_supported_types (NMDeviceFactory *factory,
+                                                  const NMLinkType **out_link_types,
+                                                  const char ***out_setting_types);
+
+const char *nm_device_factory_get_connection_parent (NMDeviceFactory *factory,
+                                                     NMConnection *connection);
+
+char *     nm_device_factory_get_virtual_iface_name (NMDeviceFactory *factory,
+                                                     NMConnection *connection,
+                                                     const char *parent_iface);
 
 void       nm_device_factory_start       (NMDeviceFactory *factory);
 
 NMDevice * nm_device_factory_new_link    (NMDeviceFactory *factory,
                                           NMPlatformLink *plink,
+                                          gboolean *out_ignore,
                                           GError **error);
 
 NMDevice * nm_device_factory_create_virtual_device_for_connection (NMDeviceFactory *factory,
@@ -168,15 +218,33 @@ NMDevice * nm_device_factory_create_virtual_device_for_connection (NMDeviceFacto
 gboolean   nm_device_factory_emit_component_added (NMDeviceFactory *factory,
                                                    GObject *component);
 
+#define NM_DEVICE_FACTORY_DECLARE_LINK_TYPES(...) \
+	{ static const NMLinkType _df_links[] = { __VA_ARGS__, NM_LINK_TYPE_NONE }; *out_link_types = _df_links; }
+#define NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES(...) \
+	{ static const char *_df_settings[] = { __VA_ARGS__, NULL }; *out_setting_types = _df_settings; }
+
+extern const NMLinkType _nm_device_factory_no_default_links[];
+extern const char *_nm_device_factory_no_default_settings[];
+
+#define NM_DEVICE_FACTORY_DECLARE_TYPES(...) \
+	static void \
+	get_supported_types (NMDeviceFactory *factory, \
+	                     const NMLinkType **out_link_types, \
+	                     const char ***out_setting_types) \
+	{ \
+		*out_link_types = _nm_device_factory_no_default_links; \
+		*out_setting_types = _nm_device_factory_no_default_settings; \
+ \
+		{ __VA_ARGS__; } \
+	} \
+ \
+
 /**************************************************************************
  * INTERNAL DEVICE FACTORY FUNCTIONS - devices provided by plugins should
  * not use these functions.
  **************************************************************************/
 
-#define DEFINE_DEVICE_FACTORY_INTERNAL(upper, mixed, lower, dfi_code) \
-	DEFINE_DEVICE_FACTORY_INTERNAL_WITH_DEVTYPE(upper, mixed, lower, upper, dfi_code)
-
-#define DEFINE_DEVICE_FACTORY_INTERNAL_WITH_DEVTYPE(upper, mixed, lower, devtype, dfi_code) \
+#define NM_DEVICE_FACTORY_DEFINE_INTERNAL(upper, mixed, lower, st_code, dfi_code) \
 	typedef GObject NM##mixed##Factory; \
 	typedef GObjectClass NM##mixed##FactoryClass; \
  \
@@ -198,16 +266,12 @@ gboolean   nm_device_factory_emit_component_added (NMDeviceFactory *factory,
 		g_type_ensure (NM_TYPE_##upper##_FACTORY); \
 	} \
  \
-	static NMDeviceType \
-	get_device_type (NMDeviceFactory *factory) \
-	{ \
-		return NM_DEVICE_TYPE_##devtype; \
-	} \
+	NM_DEVICE_FACTORY_DECLARE_TYPES(st_code) \
  \
 	static void \
 	device_factory_interface_init (NMDeviceFactory *factory_iface) \
 	{ \
-		factory_iface->get_device_type = get_device_type; \
+		factory_iface->get_supported_types = get_supported_types; \
 		dfi_code \
 	} \
  \
@@ -222,6 +286,22 @@ gboolean   nm_device_factory_emit_component_added (NMDeviceFactory *factory,
 	}
 
 void _nm_device_factory_internal_register_type (GType factory_type);
-const GSList *nm_device_factory_get_internal_factory_types (void);
+
+/**************************************************************************
+ * 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__ */