core: remove non-NM-created bridge workarounds
Handle bridges like any other devices since soon we'll be able to take them over without changing their existing configuration.
This commit is contained in:

committed by
Dan Williams

parent
93ad84a498
commit
ce810d3660
109
src/nm-manager.c
109
src/nm-manager.c
@@ -248,8 +248,6 @@ typedef struct {
|
|||||||
|
|
||||||
guint timestamp_update_id;
|
guint timestamp_update_id;
|
||||||
|
|
||||||
GHashTable *nm_bridges;
|
|
||||||
|
|
||||||
/* Track auto-activation for software devices */
|
/* Track auto-activation for software devices */
|
||||||
GHashTable *noauto_sw_devices;
|
GHashTable *noauto_sw_devices;
|
||||||
|
|
||||||
@@ -1103,90 +1101,6 @@ connection_needs_virtual_device (NMConnection *connection)
|
|||||||
|
|
||||||
/***************************/
|
/***************************/
|
||||||
|
|
||||||
/* FIXME: remove when we handle bridges non-destructively */
|
|
||||||
|
|
||||||
#define NM_BRIDGE_FILE NMRUNDIR "/nm-bridges"
|
|
||||||
|
|
||||||
static void
|
|
||||||
read_nm_created_bridges (NMManager *self)
|
|
||||||
{
|
|
||||||
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
||||||
char *contents;
|
|
||||||
char **lines, **iter;
|
|
||||||
GTimeVal tv;
|
|
||||||
glong ts;
|
|
||||||
|
|
||||||
if (!g_file_get_contents (NM_BRIDGE_FILE, &contents, NULL, NULL))
|
|
||||||
return;
|
|
||||||
|
|
||||||
g_get_current_time (&tv);
|
|
||||||
|
|
||||||
lines = g_strsplit_set (contents, "\n", 0);
|
|
||||||
g_free (contents);
|
|
||||||
|
|
||||||
for (iter = lines; iter && *iter; iter++) {
|
|
||||||
if (g_str_has_prefix (*iter, "ts=")) {
|
|
||||||
errno = 0;
|
|
||||||
ts = strtol (*iter + 3, NULL, 10);
|
|
||||||
/* allow 30 minutes time difference before we ignore the file */
|
|
||||||
if (errno || ABS (tv.tv_sec - ts) > 1800)
|
|
||||||
goto out;
|
|
||||||
} else if (g_str_has_prefix (*iter, "iface="))
|
|
||||||
g_hash_table_insert (priv->nm_bridges, g_strdup (*iter + 6), GUINT_TO_POINTER (1));
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
g_strfreev (lines);
|
|
||||||
unlink (NM_BRIDGE_FILE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
write_nm_created_bridges (NMManager *self)
|
|
||||||
{
|
|
||||||
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
||||||
GString *br_list;
|
|
||||||
GSList *iter;
|
|
||||||
GError *error = NULL;
|
|
||||||
GTimeVal tv;
|
|
||||||
gboolean found = FALSE;
|
|
||||||
|
|
||||||
/* write out nm-created bridges list */
|
|
||||||
br_list = g_string_sized_new (50);
|
|
||||||
|
|
||||||
/* Timestamp is first line */
|
|
||||||
g_get_current_time (&tv);
|
|
||||||
g_string_append_printf (br_list, "ts=%ld\n", tv.tv_sec);
|
|
||||||
|
|
||||||
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
|
|
||||||
NMDevice *device = iter->data;
|
|
||||||
|
|
||||||
if (nm_device_get_device_type (device) == NM_DEVICE_TYPE_BRIDGE) {
|
|
||||||
g_string_append_printf (br_list, "iface=%s\n", nm_device_get_iface (device));
|
|
||||||
found = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found) {
|
|
||||||
if (!g_file_set_contents (NM_BRIDGE_FILE, br_list->str, -1, &error)) {
|
|
||||||
nm_log_warn (LOGD_BRIDGE, "Failed to write NetworkManager-created bridge list; "
|
|
||||||
"on restart bridges may not be recognized. (%s)",
|
|
||||||
error ? error->message : "unknown");
|
|
||||||
g_clear_error (&error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_string_free (br_list, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
bridge_created_by_nm (NMManager *self, const char *iface)
|
|
||||||
{
|
|
||||||
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
|
||||||
|
|
||||||
return (priv->nm_bridges && g_hash_table_lookup (priv->nm_bridges, iface));
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* system_create_virtual_device:
|
* system_create_virtual_device:
|
||||||
* @self: the #NMManager
|
* @self: the #NMManager
|
||||||
@@ -1236,11 +1150,6 @@ system_create_virtual_device (NMManager *self, NMConnection *connection)
|
|||||||
} else if (nm_connection_is_type (connection, NM_SETTING_TEAM_SETTING_NAME)) {
|
} else if (nm_connection_is_type (connection, NM_SETTING_TEAM_SETTING_NAME)) {
|
||||||
device = nm_device_team_new_for_connection (connection);
|
device = nm_device_team_new_for_connection (connection);
|
||||||
} else if (nm_connection_is_type (connection, NM_SETTING_BRIDGE_SETTING_NAME)) {
|
} else if (nm_connection_is_type (connection, NM_SETTING_BRIDGE_SETTING_NAME)) {
|
||||||
/* FIXME: remove when we handle bridges non-destructively */
|
|
||||||
if (nm_platform_link_get_ifindex (iface) > 0 && !bridge_created_by_nm (self, iface)) {
|
|
||||||
nm_log_warn (LOGD_DEVICE, "(%s): cannot use existing bridge for '%s'",
|
|
||||||
iface, nm_connection_get_id (connection));
|
|
||||||
} else
|
|
||||||
device = nm_device_bridge_new_for_connection (connection);
|
device = nm_device_bridge_new_for_connection (connection);
|
||||||
} else if (nm_connection_is_type (connection, NM_SETTING_VLAN_SETTING_NAME)) {
|
} else if (nm_connection_is_type (connection, NM_SETTING_VLAN_SETTING_NAME)) {
|
||||||
device = nm_device_vlan_new_for_connection (connection, parent);
|
device = nm_device_vlan_new_for_connection (connection, parent);
|
||||||
@@ -2271,11 +2180,7 @@ platform_link_added_cb (NMPlatform *platform,
|
|||||||
device = nm_device_team_new (plink);
|
device = nm_device_team_new (plink);
|
||||||
break;
|
break;
|
||||||
case NM_LINK_TYPE_BRIDGE:
|
case NM_LINK_TYPE_BRIDGE:
|
||||||
/* FIXME: always create device when we handle bridges non-destructively */
|
|
||||||
if (bridge_created_by_nm (self, plink->name))
|
|
||||||
device = nm_device_bridge_new (plink);
|
device = nm_device_bridge_new (plink);
|
||||||
else
|
|
||||||
nm_log_info (LOGD_BRIDGE, "(%s): ignoring bridge not created by NetworkManager", plink->name);
|
|
||||||
break;
|
break;
|
||||||
case NM_LINK_TYPE_VLAN:
|
case NM_LINK_TYPE_VLAN:
|
||||||
/* Have to find the parent device */
|
/* Have to find the parent device */
|
||||||
@@ -4151,13 +4056,6 @@ nm_manager_start (NMManager *self)
|
|||||||
system_unmanaged_devices_changed_cb (priv->settings, NULL, self);
|
system_unmanaged_devices_changed_cb (priv->settings, NULL, self);
|
||||||
system_hostname_changed_cb (priv->settings, NULL, self);
|
system_hostname_changed_cb (priv->settings, NULL, self);
|
||||||
|
|
||||||
/* FIXME: remove when we handle bridges non-destructively */
|
|
||||||
/* Read a list of bridges NM managed when it last quit, and only
|
|
||||||
* manage those bridges to avoid conflicts with external tools.
|
|
||||||
*/
|
|
||||||
priv->nm_bridges = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
|
||||||
read_nm_created_bridges (self);
|
|
||||||
|
|
||||||
nm_platform_query_devices ();
|
nm_platform_query_devices ();
|
||||||
nm_atm_manager_query_devices (priv->atm_mgr);
|
nm_atm_manager_query_devices (priv->atm_mgr);
|
||||||
nm_bluez_manager_query_devices (priv->bluez_mgr);
|
nm_bluez_manager_query_devices (priv->bluez_mgr);
|
||||||
@@ -4168,10 +4066,6 @@ nm_manager_start (NMManager *self)
|
|||||||
*/
|
*/
|
||||||
system_create_virtual_devices (self);
|
system_create_virtual_devices (self);
|
||||||
|
|
||||||
/* FIXME: remove when we handle bridges non-destructively */
|
|
||||||
g_hash_table_unref (priv->nm_bridges);
|
|
||||||
priv->nm_bridges = NULL;
|
|
||||||
|
|
||||||
check_if_startup_complete (self);
|
check_if_startup_complete (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4617,9 +4511,6 @@ dispose (GObject *object)
|
|||||||
|
|
||||||
nm_auth_changed_func_unregister (authority_changed_cb, manager);
|
nm_auth_changed_func_unregister (authority_changed_cb, manager);
|
||||||
|
|
||||||
/* FIXME: remove when we handle bridges non-destructively */
|
|
||||||
write_nm_created_bridges (manager);
|
|
||||||
|
|
||||||
/* Remove all devices */
|
/* Remove all devices */
|
||||||
while (priv->devices)
|
while (priv->devices)
|
||||||
remove_device (manager, NM_DEVICE (priv->devices->data), TRUE);
|
remove_device (manager, NM_DEVICE (priv->devices->data), TRUE);
|
||||||
|
Reference in New Issue
Block a user