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:
Pavel Šimerda
2013-08-22 19:17:26 +02:00
committed by Dan Williams
parent 93ad84a498
commit ce810d3660

View File

@@ -248,8 +248,6 @@ typedef struct {
guint timestamp_update_id;
GHashTable *nm_bridges;
/* Track auto-activation for software 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:
* @self: the #NMManager
@@ -1236,12 +1150,7 @@ system_create_virtual_device (NMManager *self, NMConnection *connection)
} else if (nm_connection_is_type (connection, NM_SETTING_TEAM_SETTING_NAME)) {
device = nm_device_team_new_for_connection (connection);
} 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)) {
device = nm_device_vlan_new_for_connection (connection, parent);
} else if (nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME)) {
@@ -2271,11 +2180,7 @@ platform_link_added_cb (NMPlatform *platform,
device = nm_device_team_new (plink);
break;
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);
else
nm_log_info (LOGD_BRIDGE, "(%s): ignoring bridge not created by NetworkManager", plink->name);
device = nm_device_bridge_new (plink);
break;
case NM_LINK_TYPE_VLAN:
/* 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_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_atm_manager_query_devices (priv->atm_mgr);
nm_bluez_manager_query_devices (priv->bluez_mgr);
@@ -4168,10 +4066,6 @@ nm_manager_start (NMManager *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);
}
@@ -4617,9 +4511,6 @@ dispose (GObject *object)
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 */
while (priv->devices)
remove_device (manager, NM_DEVICE (priv->devices->data), TRUE);