diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/contrail/meson.build | 34 | ||||
-rw-r--r-- | src/devices/contrail/nm-contrail-factory.c | 116 | ||||
-rw-r--r-- | src/devices/contrail/nm-device-contrail-vrouter.c | 282 | ||||
-rw-r--r-- | src/devices/contrail/nm-device-contrail-vrouter.h | 22 | ||||
-rw-r--r-- | src/devices/meson.build | 4 | ||||
-rw-r--r-- | src/devices/nm-device.c | 2 | ||||
-rw-r--r-- | src/nm-types.h | 1 | ||||
-rw-r--r-- | src/platform/nm-linux-platform.c | 78 |
8 files changed, 502 insertions, 37 deletions
diff --git a/src/devices/contrail/meson.build b/src/devices/contrail/meson.build new file mode 100644 index 0000000000..c3bdf80666 --- /dev/null +++ b/src/devices/contrail/meson.build @@ -0,0 +1,34 @@ +sources = files( + 'nm-device-contrail-vrouter.c', + 'nm-contrail-factory.c' +) + +deps = [ + nm_deps +] + +libnm_device_plugin_contrail = shared_module( + 'nm-device-plugin-contrail', + sources: sources, + dependencies: deps, + c_args: daemon_c_flags, + link_args: ldflags_linker_script_devices, + link_depends: linker_script_devices, + install: true, + install_dir: nm_plugindir +) + +core_plugins += libnm_device_plugin_contrail + +test( + 'check-local-devices-contrail', + check_exports, + args: [libnm_device_plugin_contrail.full_path(), linker_script_devices], +) + +# FIXME: check_so_symbols replacement +''' +check-local-devices-contrail: src/devices/contrail/libnm-device-plugin-contrail.la + $(srcdir)/tools/check-exports.sh $(builddir)/src/devices/contrail/.libs/libnm-device-plugin-contrail.so "$(srcdir)/linker-script-devices.ver" + $(call check_so_symbols,$(builddir)/src/devices/contrail/.libs/libnm-device-plugin-contrail.so) +''' diff --git a/src/devices/contrail/nm-contrail-factory.c b/src/devices/contrail/nm-contrail-factory.c new file mode 100644 index 0000000000..dd8124849b --- /dev/null +++ b/src/devices/contrail/nm-contrail-factory.c @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: LGPL-2.1+ +/* + * Copyright (C) 2007 - 2013 Red Hat, Inc. + * Copyright (C) 2007 - 2008 Novell, Inc. + */ + +#include "nm-default.h" + +#include "nm-manager.h" +#include "nm-device-contrail-vrouter.h" +#include "platform/nm-platform.h" +#include "nm-core-internal.h" +#include "devices/nm-device-factory.h" + +/*****************************************************************************/ + +typedef struct { + NMDeviceFactory parent; +} NMContrailFactory; + +typedef struct { + NMDeviceFactoryClass parent; +} NMContrailFactoryClass; + +#define NM_TYPE_CONTRAIL_FACTORY (nm_contrail_factory_get_type ()) +#define NM_CONTRAIL_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CONTRAIL_FACTORY, NMContrailFactory)) +#define NM_CONTRAIL_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CONTRAIL_FACTORY, NMContrailFactoryClass)) +#define NM_IS_CONTRAIL_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CONTRAIL_FACTORY)) +#define NM_IS_CONTRAIL_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CONTRAIL_FACTORY)) +#define NM_CONTRAIL_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CONTRAIL_FACTORY, NMContrailFactoryClass)) + +static GType nm_contrail_factory_get_type (void); +G_DEFINE_TYPE (NMContrailFactory, nm_contrail_factory, NM_TYPE_DEVICE_FACTORY) + +/*****************************************************************************/ + +#define _NMLOG_DOMAIN LOGD_DEVICE +#define _NMLOG(level, ...) __NMLOG_DEFAULT (level, _NMLOG_DOMAIN, "contrail", __VA_ARGS__) + +/*****************************************************************************/ + +NM_DEVICE_FACTORY_DECLARE_TYPES ( + NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_CONTRAILVROUTER) + NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_CONTRAIL_VROUTER_SETTING_NAME) +) + +G_MODULE_EXPORT NMDeviceFactory * +nm_device_factory_create (GError **error) +{ + return (NMDeviceFactory *) g_object_new (NM_TYPE_CONTRAIL_FACTORY, NULL); +} + +static NMDevice * +new_device_from_type (const char *name, NMDeviceType device_type) +{ + GType type; + const char *type_desc; + NMLinkType link_type = NM_LINK_TYPE_NONE; + + if (nm_manager_get_device (nm_manager_get (), name, device_type)) + return NULL; + + if (device_type == NM_DEVICE_TYPE_CONTRAIL_VROUTER) { + type = NM_TYPE_DEVICE_CONTRAIL_VROUTER; + type_desc = "Contrail Vrouter"; + link_type = NM_LINK_TYPE_CONTRAILVROUTER; + } else { + return NULL; + } + + return g_object_new (type, + NM_DEVICE_IFACE, name, + NM_DEVICE_DRIVER, "vrouter", + NM_DEVICE_DEVICE_TYPE, device_type, + NM_DEVICE_TYPE_DESC, type_desc, + NM_DEVICE_LINK_TYPE, link_type, + NULL); +} + +static NMDevice * +create_device (NMDeviceFactory *self, + const char *iface, + const NMPlatformLink *plink, + NMConnection *connection, + gboolean *out_ignore) +{ + NMDeviceType device_type = NM_DEVICE_TYPE_UNKNOWN; + const char *connection_type = NULL; + + if (connection) + connection_type = nm_connection_get_connection_type (connection); + + if (plink) + device_type = NM_DEVICE_TYPE_CONTRAIL_VROUTER; + else if (g_strcmp0 (connection_type, NM_SETTING_CONTRAIL_VROUTER_SETTING_NAME) == 0) + device_type = NM_DEVICE_TYPE_CONTRAIL_VROUTER; + + return new_device_from_type (iface, device_type); +} + +static void +nm_contrail_factory_init (NMContrailFactory *self) +{ +} + +static void +nm_contrail_factory_class_init (NMContrailFactoryClass *klass) +{ + NMDeviceFactoryClass *factory_class = NM_DEVICE_FACTORY_CLASS (klass); + + factory_class->get_supported_types = get_supported_types; + factory_class->create_device = create_device; + // TODO reload funcs: +// factory_class->device_removed = device_removed; +// factory_class->device_added = device_added; +} diff --git a/src/devices/contrail/nm-device-contrail-vrouter.c b/src/devices/contrail/nm-device-contrail-vrouter.c new file mode 100644 index 0000000000..773d631855 --- /dev/null +++ b/src/devices/contrail/nm-device-contrail-vrouter.c @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: LGPL-2.1+ +/* + * Copyright (C) 2007 - 2013 Red Hat, Inc. + * Copyright (C) 2007 - 2008 Novell, Inc. + */ + +#include <string.h> +#include <sys/socket.h> +#include <sys/ioctl.h> +#include <net/if.h> +#include <unistd.h> + +#include "nm-default.h" + +#include "nm-device-contrail-vrouter.h" + +#include "devices/nm-device-private.h" +#include "nm-active-connection.h" +#include "nm-setting-connection.h" +#include "nm-setting-contrail-vrouter.h" + +#include "devices/nm-device-logging.h" +_LOG_DECLARE_SELF(NMDeviceContrailVrouter); + +/*****************************************************************************/ + +typedef struct { + bool waiting_for_interface:1; +} NMDeviceContrailVrouterPrivate; + +struct _NMDeviceContrailVrouter { + NMDevice parent; + NMDeviceContrailVrouterPrivate _priv; +}; + +struct _NMDeviceContrailVrouterClass { + NMDeviceClass parent; +}; + +G_DEFINE_TYPE (NMDeviceContrailVrouter, nm_device_contrail_vrouter, NM_TYPE_DEVICE) + +#define NM_DEVICE_CONTRAIL_VROUTER_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMDeviceContrailVrouter, NM_IS_DEVICE_CONTRAIL_VROUTER, NMDevice) + +/*****************************************************************************/ + +void _get_command(const char *iface, + const char *physdev, + char *command, + const int command_size); + +void +_get_mac (const char *physdev, char *mac_str); + +void +_get_mac (const char *physdev, char *mac_str) +{ + struct ifreq ifr; + int fd; + unsigned char *mac; + int i; + char *pos; + + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + + memset(&ifr, 0, sizeof(ifr)); + fd = socket(AF_INET, SOCK_DGRAM, 0); + ifr.ifr_addr.sa_family = AF_INET; + strncpy(ifr.ifr_name , physdev , IFNAMSIZ-1); + if (0 == ioctl(fd, SIOCGIFHWADDR, &ifr)) { + mac = (unsigned char *)ifr.ifr_hwaddr.sa_data; + i = 0; + pos = mac_str; + for ( ; i < 6; i++) { + if (i) { + pos += sprintf(pos, ":"); + } + pos += sprintf(pos, "%02X", (unsigned char)mac[i]); + } + } + close(fd); +} + +void +_get_command (const char *iface, + const char *physdev, + char *command, + const int command_size) +{ + char mac_str[19]; + + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + + _get_mac(physdev, mac_str); + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: mac address: %s", mac_str); + + snprintf(command, command_size, + "modprobe vrouter && " + "vif --create %s --mac %s 2>&1 && " + "vif --add %s --mac %s --vrf 0 --vhost-phys --type physical 2>&1 && " + "vif --add %s --mac %s --vrf 0 --type vhost --xconnect %s 2>&1 && " + "ip link set dev %s address %s 2>&1 && " + "ip link set dev %s up 2>&1", + iface, mac_str, + physdev, mac_str, + iface, mac_str, physdev, + iface, mac_str, + iface); +} + +/*********************************************************************************/ + +static const char * +get_type_description (NMDevice *device) +{ + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + + return "contrail-vrouter"; +} + +static gboolean +create_and_realize (NMDevice *device, + NMConnection *connection, + NMDevice *parent, + const NMPlatformLink **out_plink, + GError **error) +{ + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + + return TRUE; +} + +static NMDeviceCapabilities +get_generic_capabilities (NMDevice *device) +{ + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + + return NM_DEVICE_CAP_IS_SOFTWARE; +} + +static gboolean +is_available (NMDevice *device, NMDeviceCheckDevAvailableFlags flags) +{ + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + + return TRUE; +} + +static gboolean +check_connection_compatible (NMDevice *device, NMConnection *connection, GError **error) +{ + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + + return TRUE; +} + +static void +link_changed (NMDevice *device, + const NMPlatformLink *pllink) +{ + NMDeviceContrailVrouterPrivate *priv; + + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + priv = NM_DEVICE_CONTRAIL_VROUTER_GET_PRIVATE (device); + + if (pllink && priv->waiting_for_interface) { + priv->waiting_for_interface = FALSE; + nm_device_bring_up (device, TRUE, NULL); + nm_device_activate_schedule_stage3_ip_config_start (device); + } +} + +static NMActStageReturn +act_stage1_prepare (NMDevice *device, NMDeviceStateReason *out_failure_reason) +{ + FILE *fp; + int COMMAND_OUTPUT_SIZE = 512; + char output[COMMAND_OUTPUT_SIZE]; + const char *iface; + int COMMAND_SIZE = 512; + char command[COMMAND_SIZE]; + const char *physdev; + NMConnection *connection; + + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + + if (!device) { + nm_log_err (LOGD_DEVICE, "CONTRAIL: device is null"); + return NM_ACT_STAGE_RETURN_FAILURE; + } + connection = nm_device_get_applied_connection (device); + if (!connection) { + nm_log_err (LOGD_DEVICE, "CONTRAIL: connection is null"); + return NM_ACT_STAGE_RETURN_FAILURE; + } + nm_connection_dump (connection); + iface = nm_connection_get_interface_name (connection); + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: interface name: %s", iface); + physdev = nm_setting_contrail_vrouter_get_physdev (nm_connection_get_setting_contrail_vrouter (connection)); + if (physdev) { + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: physical device name: %s", physdev); + _get_command(iface, physdev, command, COMMAND_SIZE); + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: vrouter command: %s", command); + fp = popen(command, "r"); + while (fgets(output, COMMAND_OUTPUT_SIZE, fp) != NULL){ + nm_log_err (LOGD_DEVICE, "CONTRAIL: %s", output); + } + pclose(fp); + } + else { + nm_log_err (LOGD_DEVICE, "CONTRAIL: physical device name was not provided."); + return NM_ACT_STAGE_RETURN_FAILURE; + } + return NM_ACT_STAGE_RETURN_SUCCESS; +} + +static NMActStageReturn +act_stage3_ip_config_start (NMDevice *device, + int addr_family, + gpointer *out_config, + NMDeviceStateReason *out_failure_reason) +{ + NMDeviceContrailVrouterPrivate *priv; + + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + priv = NM_DEVICE_CONTRAIL_VROUTER_GET_PRIVATE (device); + + if (!nm_device_get_ip_ifindex (device)) { + priv->waiting_for_interface = TRUE; + return NM_ACT_STAGE_RETURN_POSTPONE; + } + + return NM_DEVICE_CLASS (nm_device_contrail_vrouter_parent_class)->act_stage3_ip_config_start (device, addr_family, out_config, out_failure_reason); +} + +static gboolean +can_unmanaged_external_down (NMDevice *self) +{ + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); + + return FALSE; +} + +/*****************************************************************************/ + +static void +nm_device_contrail_vrouter_init (NMDeviceContrailVrouter *self) +{ + nm_log_dbg (LOGD_DEVICE, "CONTRAIL: %s %s", __FILE__ , __func__); +} + +static const NMDBusInterfaceInfoExtended interface_info_device_contrail_vrouter = { + .parent = NM_DEFINE_GDBUS_INTERFACE_INFO_INIT ( + NM_DBUS_INTERFACE_DEVICE_CONTRAIL_VROUTER, + .signals = NM_DEFINE_GDBUS_SIGNAL_INFOS ( + &nm_signal_info_property_changed_legacy, + ), + ), + .legacy_property_changed = TRUE, +}; + +static void +nm_device_contrail_vrouter_class_init (NMDeviceContrailVrouterClass *klass) +{ + NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (klass); + NMDeviceClass *device_class = NM_DEVICE_CLASS (klass); + + dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_device_contrail_vrouter); + + device_class->connection_type_supported = NM_SETTING_CONTRAIL_VROUTER_SETTING_NAME; + device_class->connection_type_check_compatible = NM_SETTING_CONTRAIL_VROUTER_SETTING_NAME; + device_class->link_types = NM_DEVICE_DEFINE_LINK_TYPES (NM_LINK_TYPE_CONTRAILVROUTER); + + device_class->get_type_description = get_type_description; + device_class->create_and_realize = create_and_realize; + device_class->get_generic_capabilities = get_generic_capabilities; + device_class->is_available = is_available; + device_class->check_connection_compatible = check_connection_compatible; + device_class->link_changed = link_changed; + device_class->act_stage1_prepare = act_stage1_prepare; + device_class->act_stage3_ip_config_start = act_stage3_ip_config_start; + device_class->can_unmanaged_external_down = can_unmanaged_external_down; +} diff --git a/src/devices/contrail/nm-device-contrail-vrouter.h b/src/devices/contrail/nm-device-contrail-vrouter.h new file mode 100644 index 0000000000..05b9dc954a --- /dev/null +++ b/src/devices/contrail/nm-device-contrail-vrouter.h @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: LGPL-2.1+ +/* + * Copyright (C) 2007 - 2013 Red Hat, Inc. + * Copyright (C) 2007 - 2008 Novell, Inc. + */ + +#ifndef __NETWORKMANAGER_DEVICE_CONTRAIL_VROUTER_H__ +#define __NETWORKMANAGER_DEVICE_CONTRAIL_VROUTER_H__ + +#define NM_TYPE_DEVICE_CONTRAIL_VROUTER (nm_device_contrail_vrouter_get_type ()) +#define NM_DEVICE_CONTRAIL_VROUTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_CONTRAIL_VROUTER, NMDeviceContrailVrouter)) +#define NM_DEVICE_CONTRAIL_VROUTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_CONTRAIL_VROUTER, NMDeviceContrailVrouterClass)) +#define NM_IS_DEVICE_CONTRAIL_VROUTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_CONTRAIL_VROUTER)) +#define NM_IS_DEVICE_CONTRAIL_VROUTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_CONTRAIL_VROUTER)) +#define NM_DEVICE_CONTRAIL_VROUTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_CONTRAIL_VROUTER, NMDeviceContrailVrouterClass)) + +typedef struct _NMDeviceContrailVrouter NMDeviceContrailVrouter; +typedef struct _NMDeviceContrailVrouterClass NMDeviceContrailVrouterClass; + +GType nm_device_contrail_vrouter_get_type (void); + +#endif /* __NETWORKMANAGER_DEVICE_CONTRAIL_VROUTER_H__ */ diff --git a/src/devices/meson.build b/src/devices/meson.build index 2d874659c7..d29bf5e5ef 100644 --- a/src/devices/meson.build +++ b/src/devices/meson.build @@ -20,3 +20,7 @@ endif if enable_tests subdir('tests') endif + +if enable_contrail + subdir('contrail') +endif diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 96fc6614ac..6c259f83a0 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -774,6 +774,7 @@ NM_UTILS_LOOKUP_STR_DEFINE (nm_device_state_reason_to_str, NMDeviceStateReason, NM_UTILS_LOOKUP_STR_ITEM (NM_DEVICE_STATE_REASON_IP_METHOD_UNSUPPORTED, "ip-method-unsupported"), NM_UTILS_LOOKUP_STR_ITEM (NM_DEVICE_STATE_REASON_SRIOV_CONFIGURATION_FAILED, "sriov-configuration-failed"), NM_UTILS_LOOKUP_STR_ITEM (NM_DEVICE_STATE_REASON_PEER_NOT_FOUND, "peer-not-found"), + NM_UTILS_LOOKUP_STR_ITEM (NM_DEVICE_STATE_REASON_CONTRAIL_VROUTER_FAILED, "contrail-vrouter-failed"), ); #define reason_to_string_a(reason) NM_UTILS_LOOKUP_STR_A (nm_device_state_reason_to_str, reason) @@ -2134,6 +2135,7 @@ nm_device_get_route_metric_default (NMDeviceType device_type) return 10000; case NM_DEVICE_TYPE_UNUSED1: case NM_DEVICE_TYPE_UNUSED2: + case NM_DEVICE_TYPE_CONTRAIL_VROUTER: /* omit default: to get compiler warning about missing switch cases */ break; } diff --git a/src/nm-types.h b/src/nm-types.h index 2f1ac2dcd5..034f98a565 100644 --- a/src/nm-types.h +++ b/src/nm-types.h @@ -162,6 +162,7 @@ typedef enum { NM_LINK_TYPE_VLAN, NM_LINK_TYPE_VXLAN, NM_LINK_TYPE_WIREGUARD, + NM_LINK_TYPE_CONTRAILVROUTER, /* Software types with slaves */ NM_LINK_TYPE_BRIDGE = 0x10000 | 0x20000, diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 305ae52e3a..8a35e9e979 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -624,43 +624,44 @@ typedef struct { } LinkDesc; static const LinkDesc linktypes[] = { - { NM_LINK_TYPE_NONE, "none", NULL, NULL }, - { NM_LINK_TYPE_UNKNOWN, "unknown", NULL, NULL }, - - { NM_LINK_TYPE_ETHERNET, "ethernet", NULL, NULL }, - { NM_LINK_TYPE_INFINIBAND, "infiniband", NULL, NULL }, - { NM_LINK_TYPE_OLPC_MESH, "olpc-mesh", NULL, NULL }, - { NM_LINK_TYPE_WIFI, "wifi", NULL, "wlan" }, - { NM_LINK_TYPE_WWAN_NET, "wwan", NULL, "wwan" }, - { NM_LINK_TYPE_WIMAX, "wimax", "wimax", "wimax" }, - { NM_LINK_TYPE_WPAN, "wpan", NULL, NULL }, - { NM_LINK_TYPE_6LOWPAN, "6lowpan", NULL, NULL }, - - { NM_LINK_TYPE_BNEP, "bluetooth", NULL, "bluetooth" }, - { NM_LINK_TYPE_DUMMY, "dummy", "dummy", NULL }, - { NM_LINK_TYPE_GRE, "gre", "gre", NULL }, - { NM_LINK_TYPE_GRETAP, "gretap", "gretap", NULL }, - { NM_LINK_TYPE_IFB, "ifb", "ifb", NULL }, - { NM_LINK_TYPE_IP6TNL, "ip6tnl", "ip6tnl", NULL }, - { NM_LINK_TYPE_IP6GRE, "ip6gre", "ip6gre", NULL }, - { NM_LINK_TYPE_IP6GRETAP, "ip6gretap", "ip6gretap", NULL }, - { NM_LINK_TYPE_IPIP, "ipip", "ipip", NULL }, - { NM_LINK_TYPE_LOOPBACK, "loopback", NULL, NULL }, - { NM_LINK_TYPE_MACSEC, "macsec", "macsec", NULL }, - { NM_LINK_TYPE_MACVLAN, "macvlan", "macvlan", NULL }, - { NM_LINK_TYPE_MACVTAP, "macvtap", "macvtap", NULL }, - { NM_LINK_TYPE_OPENVSWITCH, "openvswitch", "openvswitch", NULL }, - { NM_LINK_TYPE_PPP, "ppp", NULL, "ppp" }, - { NM_LINK_TYPE_SIT, "sit", "sit", NULL }, - { NM_LINK_TYPE_TUN, "tun", "tun", NULL }, - { NM_LINK_TYPE_VETH, "veth", "veth", NULL }, - { NM_LINK_TYPE_VLAN, "vlan", "vlan", "vlan" }, - { NM_LINK_TYPE_VXLAN, "vxlan", "vxlan", "vxlan" }, - { NM_LINK_TYPE_WIREGUARD, "wireguard", "wireguard", "wireguard" }, - - { NM_LINK_TYPE_BRIDGE, "bridge", "bridge", "bridge" }, - { NM_LINK_TYPE_BOND, "bond", "bond", "bond" }, - { NM_LINK_TYPE_TEAM, "team", "team", NULL }, + { NM_LINK_TYPE_NONE, "none", NULL, NULL }, + { NM_LINK_TYPE_UNKNOWN, "unknown", NULL, NULL }, + + { NM_LINK_TYPE_ETHERNET, "ethernet", NULL, NULL }, + { NM_LINK_TYPE_INFINIBAND, "infiniband", NULL, NULL }, + { NM_LINK_TYPE_OLPC_MESH, "olpc-mesh", NULL, NULL }, + { NM_LINK_TYPE_WIFI, "wifi", NULL, "wlan" }, + { NM_LINK_TYPE_WWAN_NET, "wwan", NULL, "wwan" }, + { NM_LINK_TYPE_WIMAX, "wimax", "wimax", "wimax" }, + { NM_LINK_TYPE_WPAN, "wpan", NULL, NULL }, + { NM_LINK_TYPE_6LOWPAN, "6lowpan", NULL, NULL }, + + { NM_LINK_TYPE_BNEP, "bluetooth", NULL, "bluetooth" }, + { NM_LINK_TYPE_DUMMY, "dummy", "dummy", NULL }, + { NM_LINK_TYPE_GRE, "gre", "gre", NULL }, + { NM_LINK_TYPE_GRETAP, "gretap", "gretap", NULL }, + { NM_LINK_TYPE_IFB, "ifb", "ifb", NULL }, + { NM_LINK_TYPE_IP6TNL, "ip6tnl", "ip6tnl", NULL }, + { NM_LINK_TYPE_IP6GRE, "ip6gre", "ip6gre", NULL }, + { NM_LINK_TYPE_IP6GRETAP, "ip6gretap", "ip6gretap", NULL }, + { NM_LINK_TYPE_IPIP, "ipip", "ipip", NULL }, + { NM_LINK_TYPE_LOOPBACK, "loopback", NULL, NULL }, + { NM_LINK_TYPE_MACSEC, "macsec", "macsec", NULL }, + { NM_LINK_TYPE_MACVLAN, "macvlan", "macvlan", NULL }, + { NM_LINK_TYPE_MACVTAP, "macvtap", "macvtap", NULL }, + { NM_LINK_TYPE_OPENVSWITCH, "openvswitch", "openvswitch", NULL }, + { NM_LINK_TYPE_PPP, "ppp", NULL, "ppp" }, + { NM_LINK_TYPE_SIT, "sit", "sit", NULL }, + { NM_LINK_TYPE_TUN, "tun", "tun", NULL }, + { NM_LINK_TYPE_VETH, "veth", "veth", NULL }, + { NM_LINK_TYPE_VLAN, "vlan", "vlan", "vlan" }, + { NM_LINK_TYPE_VXLAN, "vxlan", "vxlan", "vxlan" }, + { NM_LINK_TYPE_WIREGUARD, "wireguard", "wireguard", "wireguard" }, + { NM_LINK_TYPE_CONTRAILVROUTER, "contrailvrouter", "contrailvrouter", NULL }, + + { NM_LINK_TYPE_BRIDGE, "bridge", "bridge", "bridge" }, + { NM_LINK_TYPE_BOND, "bond", "bond", "bond" }, + { NM_LINK_TYPE_TEAM, "team", "team", NULL }, }; static const char * @@ -966,6 +967,9 @@ _linktype_get_type (NMPlatform *platform, if (nm_streq (driver_info.driver, "openvswitch")) return NM_LINK_TYPE_OPENVSWITCH; + if (nm_streq (driver_info.driver, "vrouter")) + return NM_LINK_TYPE_CONTRAILVROUTER; + if (arptype == 256) { /* Some s390 CTC-type devices report 256 for the encapsulation type * for some reason, but we need to call them Ethernet. |