static gboolean check_connection_compatible (NMDevice *device, NMConnection *connection, GError **error) { const char *iface; NMSettingBridge *s_bridge; if (!NM_DEVICE_CLASS (nm_device_bridge_parent_class)->check_connection_compatible (device, connection, error)) return FALSE; s_bridge = nm_connection_get_setting_bridge (connection); if (!s_bridge || !nm_connection_is_type (connection, NM_SETTING_BRIDGE_SETTING_NAME)) { g_set_error (error, NM_BRIDGE_ERROR, NM_BRIDGE_ERROR_CONNECTION_NOT_BRIDGE, "The connection was not a bridge connection."); return FALSE; } /* Bridge connections must specify the virtual interface name */ iface = nm_connection_get_virtual_iface_name (connection); if (!iface || strcmp (nm_device_get_iface (device), iface)) { g_set_error (error, NM_BRIDGE_ERROR, NM_BRIDGE_ERROR_CONNECTION_INVALID, "The bridge connection virtual interface name did not match."); return FALSE; } return TRUE; }
NMDevice * nm_device_bridge_new_for_connection (NMConnection *connection) { const char *iface; g_return_val_if_fail (connection != NULL, NULL); iface = nm_connection_get_virtual_iface_name (connection); g_return_val_if_fail (iface != NULL, NULL); if ( !nm_platform_bridge_add (iface) && nm_platform_get_error () != NM_PLATFORM_ERROR_EXISTS) { nm_log_warn (LOGD_DEVICE | LOGD_BRIDGE, "(%s): failed to create bridge master interface for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_get_error_msg ()); return NULL; } return (NMDevice *) g_object_new (NM_TYPE_DEVICE_BRIDGE, NM_DEVICE_IFACE, iface, NM_DEVICE_DRIVER, "bridge", NM_DEVICE_TYPE_DESC, "Bridge", NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_BRIDGE, NM_DEVICE_IS_MASTER, TRUE, NULL); }
static gboolean nmt_slave_list_connection_filter (NmtEditConnectionList *list, NMConnection *connection, gpointer user_data) { NmtSlaveListPrivate *priv = NMT_SLAVE_LIST_GET_PRIVATE (list); NMSettingConnection *s_con; const char *master, *master_ifname, *slave_type; s_con = nm_connection_get_setting_connection (connection); g_return_val_if_fail (s_con != NULL, FALSE); slave_type = nm_setting_connection_get_slave_type (s_con); if (g_strcmp0 (slave_type, priv->master_type) != 0) return FALSE; master = nm_setting_connection_get_master (s_con); if (!master) return FALSE; master_ifname = nm_connection_get_virtual_iface_name (priv->master); if (g_strcmp0 (master, master_ifname) != 0 && g_strcmp0 (master, priv->master_uuid) != 0) return FALSE; return TRUE; }
static gboolean check_connection_compatible (NMDevice *device, NMConnection *connection, GError **error) { const char *iface; NMSettingBond *s_bond; if (!NM_DEVICE_CLASS (nm_device_bond_parent_class)->check_connection_compatible (device, connection, error)) return FALSE; s_bond = nm_connection_get_setting_bond (connection); if (!s_bond || !nm_connection_is_type (connection, NM_SETTING_BOND_SETTING_NAME)) { g_set_error (error, NM_BOND_ERROR, NM_BOND_ERROR_CONNECTION_NOT_BOND, "The connection was not a bond connection."); return FALSE; } /* Bond connections must specify the virtual interface name */ iface = nm_connection_get_virtual_iface_name (connection); if (!iface || strcmp (nm_device_get_iface (device), iface)) { g_set_error (error, NM_BOND_ERROR, NM_BOND_ERROR_CONNECTION_NOT_BOND, "The bond connection virtual interface name did not match."); return FALSE; } /* FIXME: match bond properties like mode, etc? */ return TRUE; }
static void delete_slaves_of_connection (NMConnectionList *list, NMConnection *connection) { const char *uuid, *iface; GtkTreeIter iter, types_iter; if (!gtk_tree_model_get_iter_first (list->model, &types_iter)) return; uuid = nm_connection_get_uuid (connection); iface = nm_connection_get_virtual_iface_name (connection); do { if (!gtk_tree_model_iter_children (list->model, &iter, &types_iter)) continue; do { NMRemoteConnection *candidate = NULL; NMSettingConnection *s_con; const char *master; gtk_tree_model_get (list->model, &iter, COL_CONNECTION, &candidate, -1); s_con = nm_connection_get_setting_connection (NM_CONNECTION (candidate)); master = nm_setting_connection_get_master (s_con); if (master) { if (!g_strcmp0 (master, uuid) || !g_strcmp0 (master, iface)) nm_remote_connection_delete (candidate, NULL, NULL); } g_object_unref (candidate); } while (gtk_tree_model_iter_next (list->model, &iter)); } while (gtk_tree_model_iter_next (list->model, &types_iter)); }