mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-09 04:48:10 +02:00
libnm-core: add nm_connection_is_virtual()
Add a method to determine if a connection applies to a virtual device. Perhaps eventually the logic should be spread across the NMSetting classes, but for now it's better off having it in NMConnection than once in NMManager and once in nmcli.
This commit is contained in:
parent
ab26964c56
commit
ee3467e531
5 changed files with 79 additions and 88 deletions
|
|
@ -1861,30 +1861,6 @@ activate_connection_cb (NMClient *client, NMActiveConnection *active, GError *er
|
||||||
g_free (info);
|
g_free (info);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We were using nm_connection_get_virtual_iface_name() to determine whether the
|
|
||||||
* connection is virtual or not. But it did't work for VLANs without
|
|
||||||
* vlan.interface-name. nm_connection_get_virtual_iface_name() returns NULL for those.
|
|
||||||
* So we need to use our own implementation for now.
|
|
||||||
*/
|
|
||||||
static gboolean
|
|
||||||
is_connection_virtual (NMConnection *connection)
|
|
||||||
{
|
|
||||||
if ( nm_connection_is_type (connection, NM_SETTING_BOND_SETTING_NAME)
|
|
||||||
|| nm_connection_is_type (connection, NM_SETTING_TEAM_SETTING_NAME)
|
|
||||||
|| nm_connection_is_type (connection, NM_SETTING_VLAN_SETTING_NAME)
|
|
||||||
|| nm_connection_is_type (connection, NM_SETTING_BRIDGE_SETTING_NAME))
|
|
||||||
return TRUE;
|
|
||||||
if (nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME)) {
|
|
||||||
NMSettingInfiniband *s_infi = nm_connection_get_setting_infiniband (connection);
|
|
||||||
int p_key = nm_setting_infiniband_get_p_key (s_infi);
|
|
||||||
const char *parent = nm_setting_infiniband_get_parent (s_infi);
|
|
||||||
|
|
||||||
if (p_key != -1 && parent)
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
nmc_activate_connection (NmCli *nmc,
|
nmc_activate_connection (NmCli *nmc,
|
||||||
NMConnection *connection,
|
NMConnection *connection,
|
||||||
|
|
@ -1907,7 +1883,7 @@ nmc_activate_connection (NmCli *nmc,
|
||||||
device_found = find_device_for_connection (nmc, connection, ifname, ap, nsp, &device, &spec_object, &local);
|
device_found = find_device_for_connection (nmc, connection, ifname, ap, nsp, &device, &spec_object, &local);
|
||||||
|
|
||||||
/* Virtual connection may not have their interfaces created yet */
|
/* Virtual connection may not have their interfaces created yet */
|
||||||
if (!device_found && !is_connection_virtual (connection)) {
|
if (!device_found && !nm_connection_is_virtual (connection)) {
|
||||||
g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_CON_ACTIVATION,
|
g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_CON_ACTIVATION,
|
||||||
"%s", local && local->message ? local->message : _("unknown error"));
|
"%s", local && local->message ? local->message : _("unknown error"));
|
||||||
g_clear_error (&local);
|
g_clear_error (&local);
|
||||||
|
|
|
||||||
|
|
@ -1473,6 +1473,40 @@ nm_connection_get_connection_type (NMConnection *connection)
|
||||||
return nm_setting_connection_get_connection_type (s_con);
|
return nm_setting_connection_get_connection_type (s_con);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_connection_is_virtual:
|
||||||
|
* @connection: an #NMConnection
|
||||||
|
*
|
||||||
|
* Checks if @connection refers to a virtual device (and thus can potentially be
|
||||||
|
* activated even if the device it refers to doesn't exist).
|
||||||
|
*
|
||||||
|
* Returns: whether @connection refers to a virtual device
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
nm_connection_is_virtual (NMConnection *connection)
|
||||||
|
{
|
||||||
|
const char *type;
|
||||||
|
|
||||||
|
type = nm_connection_get_connection_type (connection);
|
||||||
|
g_return_val_if_fail (type != NULL, FALSE);
|
||||||
|
|
||||||
|
if ( !strcmp (type, NM_SETTING_BOND_SETTING_NAME)
|
||||||
|
|| !strcmp (type, NM_SETTING_TEAM_SETTING_NAME)
|
||||||
|
|| !strcmp (type, NM_SETTING_BRIDGE_SETTING_NAME)
|
||||||
|
|| !strcmp (type, NM_SETTING_VLAN_SETTING_NAME))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (!strcmp (type, NM_SETTING_INFINIBAND_SETTING_NAME)) {
|
||||||
|
NMSettingInfiniband *s_ib;
|
||||||
|
|
||||||
|
s_ib = nm_connection_get_setting_infiniband (connection);
|
||||||
|
g_return_val_if_fail (s_ib != NULL, FALSE);
|
||||||
|
return nm_setting_infiniband_get_virtual_interface_name (s_ib) != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nm_connection_get_virtual_device_description:
|
* nm_connection_get_virtual_device_description:
|
||||||
* @connection: an #NMConnection for a virtual device type
|
* @connection: an #NMConnection for a virtual device type
|
||||||
|
|
|
||||||
|
|
@ -217,6 +217,7 @@ const char * nm_connection_get_uuid (NMConnection *connection);
|
||||||
const char * nm_connection_get_id (NMConnection *connection);
|
const char * nm_connection_get_id (NMConnection *connection);
|
||||||
const char * nm_connection_get_connection_type (NMConnection *connection);
|
const char * nm_connection_get_connection_type (NMConnection *connection);
|
||||||
|
|
||||||
|
gboolean nm_connection_is_virtual (NMConnection *connection);
|
||||||
char * nm_connection_get_virtual_device_description (NMConnection *connection);
|
char * nm_connection_get_virtual_device_description (NMConnection *connection);
|
||||||
|
|
||||||
NMSetting8021x * nm_connection_get_setting_802_1x (NMConnection *connection);
|
NMSetting8021x * nm_connection_get_setting_802_1x (NMConnection *connection);
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,7 @@ global:
|
||||||
nm_connection_get_uuid;
|
nm_connection_get_uuid;
|
||||||
nm_connection_get_virtual_device_description;
|
nm_connection_get_virtual_device_description;
|
||||||
nm_connection_is_type;
|
nm_connection_is_type;
|
||||||
|
nm_connection_is_virtual;
|
||||||
nm_connection_need_secrets;
|
nm_connection_need_secrets;
|
||||||
nm_connection_normalize;
|
nm_connection_normalize;
|
||||||
nm_connection_remove_setting;
|
nm_connection_remove_setting;
|
||||||
|
|
|
||||||
105
src/nm-manager.c
105
src/nm-manager.c
|
|
@ -961,89 +961,68 @@ get_virtual_iface_name (NMManager *self,
|
||||||
NMDevice **out_parent)
|
NMDevice **out_parent)
|
||||||
{
|
{
|
||||||
NMDevice *parent = NULL;
|
NMDevice *parent = NULL;
|
||||||
|
const char *ifname;
|
||||||
|
|
||||||
if (out_parent)
|
if (out_parent)
|
||||||
*out_parent = NULL;
|
*out_parent = NULL;
|
||||||
|
|
||||||
if (nm_connection_is_type (connection, NM_SETTING_BOND_SETTING_NAME))
|
if (!nm_connection_is_virtual (connection))
|
||||||
return g_strdup (nm_connection_get_interface_name (connection));
|
return NULL;
|
||||||
|
|
||||||
if (nm_connection_is_type (connection, NM_SETTING_TEAM_SETTING_NAME))
|
ifname = nm_connection_get_interface_name (connection);
|
||||||
return g_strdup (nm_connection_get_interface_name (connection));
|
|
||||||
|
|
||||||
if (nm_connection_is_type (connection, NM_SETTING_BRIDGE_SETTING_NAME))
|
|
||||||
return g_strdup (nm_connection_get_interface_name (connection));
|
|
||||||
|
|
||||||
if (nm_connection_is_type (connection, NM_SETTING_VLAN_SETTING_NAME)) {
|
if (nm_connection_is_type (connection, NM_SETTING_VLAN_SETTING_NAME)) {
|
||||||
NMSettingVlan *s_vlan;
|
NMSettingVlan *s_vlan;
|
||||||
const char *ifname;
|
|
||||||
char *vname;
|
char *vname;
|
||||||
|
|
||||||
s_vlan = nm_connection_get_setting_vlan (connection);
|
s_vlan = nm_connection_get_setting_vlan (connection);
|
||||||
g_return_val_if_fail (s_vlan != NULL, NULL);
|
g_return_val_if_fail (s_vlan != NULL, NULL);
|
||||||
|
|
||||||
parent = find_vlan_parent (self, connection);
|
parent = find_vlan_parent (self, connection);
|
||||||
if (parent) {
|
if (!parent)
|
||||||
ifname = nm_connection_get_interface_name (connection);
|
return NULL;
|
||||||
|
|
||||||
if (!nm_device_supports_vlans (parent)) {
|
if (!nm_device_supports_vlans (parent)) {
|
||||||
nm_log_warn (LOGD_DEVICE, "(%s): No support for VLANs on interface %s of type %s",
|
nm_log_warn (LOGD_DEVICE, "(%s): No support for VLANs on interface %s of type %s",
|
||||||
ifname ? ifname : nm_connection_get_id (connection),
|
ifname ? ifname : nm_connection_get_id (connection),
|
||||||
nm_device_get_ip_iface (parent),
|
nm_device_get_ip_iface (parent),
|
||||||
nm_device_get_type_desc (parent));
|
nm_device_get_type_desc (parent));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
/* If the connection doesn't specify the interface name for the VLAN
|
|
||||||
* device, we create one for it using the VLAN ID and the parent
|
|
||||||
* interface's name.
|
|
||||||
*/
|
|
||||||
if (ifname)
|
|
||||||
vname = g_strdup (ifname);
|
|
||||||
else {
|
|
||||||
vname = nm_utils_new_vlan_name (nm_device_get_ip_iface (parent),
|
|
||||||
nm_setting_vlan_get_id (s_vlan));
|
|
||||||
}
|
|
||||||
if (out_parent)
|
|
||||||
*out_parent = parent;
|
|
||||||
return vname;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME)) {
|
/* If the connection doesn't specify the interface name for the VLAN
|
||||||
parent = find_infiniband_parent (self, connection);
|
* device, we create one for it using the VLAN ID and the parent
|
||||||
if (parent) {
|
* interface's name.
|
||||||
NMSettingInfiniband *s_infiniband;
|
*/
|
||||||
|
if (ifname)
|
||||||
s_infiniband = nm_connection_get_setting_infiniband (connection);
|
vname = g_strdup (ifname);
|
||||||
if (out_parent)
|
else {
|
||||||
*out_parent = parent;
|
vname = nm_utils_new_vlan_name (nm_device_get_ip_iface (parent),
|
||||||
return g_strdup (nm_setting_infiniband_get_virtual_interface_name (s_infiniband));
|
nm_setting_vlan_get_id (s_vlan));
|
||||||
}
|
}
|
||||||
|
if (out_parent)
|
||||||
|
*out_parent = parent;
|
||||||
|
return vname;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
connection_needs_virtual_device (NMConnection *connection)
|
|
||||||
{
|
|
||||||
if ( nm_connection_is_type (connection, NM_SETTING_BOND_SETTING_NAME)
|
|
||||||
|| nm_connection_is_type (connection, NM_SETTING_TEAM_SETTING_NAME)
|
|
||||||
|| nm_connection_is_type (connection, NM_SETTING_BRIDGE_SETTING_NAME)
|
|
||||||
|| nm_connection_is_type (connection, NM_SETTING_VLAN_SETTING_NAME))
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
if (nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME)) {
|
if (nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME)) {
|
||||||
NMSettingInfiniband *s_infiniband;
|
NMSettingInfiniband *s_infiniband;
|
||||||
|
|
||||||
|
parent = find_infiniband_parent (self, connection);
|
||||||
|
if (!parent)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
s_infiniband = nm_connection_get_setting_infiniband (connection);
|
s_infiniband = nm_connection_get_setting_infiniband (connection);
|
||||||
g_return_val_if_fail (s_infiniband != NULL, FALSE);
|
if (out_parent)
|
||||||
if (nm_setting_infiniband_get_p_key (s_infiniband) != -1)
|
*out_parent = parent;
|
||||||
return TRUE;
|
return g_strdup (nm_setting_infiniband_get_virtual_interface_name (s_infiniband));
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
/* For any other virtual connection, NMSettingConnection:interface-name is
|
||||||
|
* the virtual device name.
|
||||||
|
*/
|
||||||
|
g_return_val_if_fail (ifname != NULL, NULL);
|
||||||
|
return g_strdup (ifname);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************/
|
/***************************/
|
||||||
|
|
@ -1149,7 +1128,7 @@ system_create_virtual_devices (NMManager *self)
|
||||||
NMConnection *connection = iter->data;
|
NMConnection *connection = iter->data;
|
||||||
|
|
||||||
/* We only create a virtual interface if the connection can autoconnect */
|
/* We only create a virtual interface if the connection can autoconnect */
|
||||||
if ( connection_needs_virtual_device (connection)
|
if ( nm_connection_is_virtual (connection)
|
||||||
&& nm_settings_connection_can_autoconnect (NM_SETTINGS_CONNECTION (connection)))
|
&& nm_settings_connection_can_autoconnect (NM_SETTINGS_CONNECTION (connection)))
|
||||||
system_create_virtual_device (self, connection);
|
system_create_virtual_device (self, connection);
|
||||||
}
|
}
|
||||||
|
|
@ -1163,7 +1142,7 @@ connection_added (NMSettings *settings,
|
||||||
{
|
{
|
||||||
NMConnection *connection = NM_CONNECTION (settings_connection);
|
NMConnection *connection = NM_CONNECTION (settings_connection);
|
||||||
|
|
||||||
if (connection_needs_virtual_device (connection)) {
|
if (nm_connection_is_virtual (connection)) {
|
||||||
NMSettingConnection *s_con = nm_connection_get_setting_connection (connection);
|
NMSettingConnection *s_con = nm_connection_get_setting_connection (connection);
|
||||||
|
|
||||||
g_assert (s_con);
|
g_assert (s_con);
|
||||||
|
|
@ -2439,7 +2418,7 @@ find_master (NMManager *self,
|
||||||
NMConnection *candidate = iter->data;
|
NMConnection *candidate = iter->data;
|
||||||
char *vname;
|
char *vname;
|
||||||
|
|
||||||
if (connection_needs_virtual_device (candidate)) {
|
if (nm_connection_is_virtual (candidate)) {
|
||||||
vname = get_virtual_iface_name (self, candidate, NULL);
|
vname = get_virtual_iface_name (self, candidate, NULL);
|
||||||
if ( g_strcmp0 (master, vname) == 0
|
if ( g_strcmp0 (master, vname) == 0
|
||||||
&& is_compatible_with_slave (candidate, connection))
|
&& is_compatible_with_slave (candidate, connection))
|
||||||
|
|
@ -2620,7 +2599,7 @@ ensure_master_active_connection (NMManager *self,
|
||||||
/* Device described by master_connection may be a virtual one that's
|
/* Device described by master_connection may be a virtual one that's
|
||||||
* not created yet.
|
* not created yet.
|
||||||
*/
|
*/
|
||||||
if (!found_device && connection_needs_virtual_device (master_connection)) {
|
if (!found_device && nm_connection_is_virtual (master_connection)) {
|
||||||
master_ac = nm_manager_activate_connection (self,
|
master_ac = nm_manager_activate_connection (self,
|
||||||
master_connection,
|
master_connection,
|
||||||
NULL,
|
NULL,
|
||||||
|
|
@ -2679,7 +2658,7 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError *
|
||||||
|
|
||||||
device = nm_active_connection_get_device (active);
|
device = nm_active_connection_get_device (active);
|
||||||
if (!device) {
|
if (!device) {
|
||||||
if (!connection_needs_virtual_device (connection)) {
|
if (!nm_connection_is_virtual (connection)) {
|
||||||
NMSettingConnection *s_con = nm_connection_get_setting_connection (connection);
|
NMSettingConnection *s_con = nm_connection_get_setting_connection (connection);
|
||||||
|
|
||||||
g_assert (s_con);
|
g_assert (s_con);
|
||||||
|
|
@ -3109,7 +3088,7 @@ validate_activation_request (NMManager *self,
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
gboolean is_software = connection_needs_virtual_device (connection);
|
gboolean is_software = nm_connection_is_virtual (connection);
|
||||||
|
|
||||||
/* VPN and software-device connections don't need a device yet */
|
/* VPN and software-device connections don't need a device yet */
|
||||||
if (!vpn && !is_software) {
|
if (!vpn && !is_software) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue