コード例 #1
0
static const char *
get_virtual_iface_name (NMSetting *setting)
{
	NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE (setting);

	if (priv->p_key == -1 || !priv->parent)
		return NULL;

	if (!priv->virtual_iface_name)
		priv->virtual_iface_name = g_strdup_printf ("%s.%04x", priv->parent, priv->p_key);

	return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->virtual_iface_name;
}
コード例 #2
0
static void
set_property (GObject *object, guint prop_id,
              const GValue *value, GParamSpec *pspec)
{
	NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE (object);

	switch (prop_id) {
	case PROP_MAC_ADDRESS:
		if (priv->mac_address)
			g_byte_array_free (priv->mac_address, TRUE);
		priv->mac_address = g_value_dup_boxed (value);
		break;
	case PROP_MTU:
		priv->mtu = g_value_get_uint (value);
		break;
	case PROP_TRANSPORT_MODE:
		g_free (priv->transport_mode);
		priv->transport_mode = g_value_dup_string (value);
		break;
	case PROP_P_KEY:
		priv->p_key = g_value_get_int (value);
		g_clear_pointer (&priv->virtual_iface_name, NULL);
		break;
	case PROP_PARENT:
		g_free (priv->parent);
		priv->parent = g_value_dup_string (value);
		g_clear_pointer (&priv->virtual_iface_name, NULL);
		break;
	default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
		break;
	}
}
コード例 #3
0
static gboolean
verify (NMSetting *setting, GSList *all_settings, GError **error)
{
	NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE (setting);

	if (priv->mac_address && priv->mac_address->len != INFINIBAND_ALEN) {
		g_set_error_literal (error,
		                     NM_SETTING_INFINIBAND_ERROR,
		                     NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY,
		                     _("property is invalid"));
		g_prefix_error (error, "%s.%s: ", NM_SETTING_INFINIBAND_SETTING_NAME, NM_SETTING_INFINIBAND_MAC_ADDRESS);
		return FALSE;
	}

	if (!g_strcmp0 (priv->transport_mode, "datagram")) {
		if (priv->mtu > 2044)
			priv->mtu = 2044;
	} else if (!g_strcmp0 (priv->transport_mode, "connected")) {
		if (priv->mtu > 65520)
			priv->mtu = 65520;
	} else {
		g_set_error_literal (error,
		                     NM_SETTING_INFINIBAND_ERROR,
		                     NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY,
		                     _("property is invalid"));
		g_prefix_error (error, "%s.%s: ", NM_SETTING_INFINIBAND_SETTING_NAME, NM_SETTING_INFINIBAND_TRANSPORT_MODE);
		return FALSE;
	}

	if (priv->parent) {
		if (!nm_utils_iface_valid_name (priv->parent)) {
			g_set_error_literal (error,
			                     NM_SETTING_INFINIBAND_ERROR,
			                     NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY,
			                     _("not a valid interface name"));
			g_prefix_error (error, "%s: ", NM_SETTING_INFINIBAND_PARENT);
			return FALSE;
		}
		if (priv->p_key == -1) {
			g_set_error_literal (error,
			                     NM_SETTING_INFINIBAND_ERROR,
			                     NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY,
			                     _("Must specify a P_Key if specifying parent"));
			g_prefix_error (error, "%s: ", NM_SETTING_INFINIBAND_PARENT);
		}
	}

	if (priv->p_key != -1) {
		if (!priv->mac_address && !priv->parent) {
			g_set_error_literal (error,
			                     NM_SETTING_INFINIBAND_ERROR,
			                     NM_SETTING_INFINIBAND_ERROR_MISSING_PROPERTY,
			                     _("InfiniBand P_Key connection did not specify parent interface name"));
			g_prefix_error (error, "%s: ", NM_SETTING_INFINIBAND_PARENT);
			return FALSE;
		}
	}

	return TRUE;
}
コード例 #4
0
/**
 * nm_setting_infiniband_get_p_key:
 * @setting: the #NMSettingInfiniband
 *
 * Returns the P_Key to use for this device. A value of -1 means to
 * use the default P_Key (aka "the P_Key at index 0"). Otherwise it is
 * a 16-bit unsigned integer.
 *
 * Returns: the IPoIB P_Key
 **/
int
nm_setting_infiniband_get_p_key (NMSettingInfiniband *setting)
{
	g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (setting), -1);

	return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->p_key;
}
コード例 #5
0
/**
 * nm_setting_infiniband_get_parent:
 * @setting: the #NMSettingInfiniband
 *
 * Returns the parent interface name for this device, if set.
 *
 * Returns: the parent interface name
 **/
const char *
nm_setting_infiniband_get_parent (NMSettingInfiniband *setting)
{
	g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (setting), NULL);

	return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->parent;
}
コード例 #6
0
/**
 * nm_setting_infiniband_get_transport_mode:
 * @setting: the #NMSettingInfiniband
 *
 * Returns the transport mode for this device. Either 'datagram' or
 * 'connected'.
 *
 * Returns: the IPoIB transport mode
 **/
const char *
nm_setting_infiniband_get_transport_mode (NMSettingInfiniband *setting)
{
	g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (setting), NULL);

	return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->transport_mode;
}
コード例 #7
0
/**
 * nm_setting_infiniband_get_mtu:
 * @setting: the #NMSettingInfiniband
 *
 * Returns: the #NMSettingInfiniband:mtu property of the setting
 **/
guint32
nm_setting_infiniband_get_mtu (NMSettingInfiniband *setting)
{
	g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (setting), 0);

	return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->mtu;
}
コード例 #8
0
/**
 * nm_setting_infiniband_get_mac_address:
 * @setting: the #NMSettingInfiniband
 *
 * Returns: the #NMSettingInfiniband:mac-address property of the setting
 **/
const GByteArray *
nm_setting_infiniband_get_mac_address (NMSettingInfiniband *setting)
{
	g_return_val_if_fail (NM_IS_SETTING_INFINIBAND (setting), NULL);

	return NM_SETTING_INFINIBAND_GET_PRIVATE (setting)->mac_address;
}
コード例 #9
0
static void
finalize (GObject *object)
{
	NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE (object);

	g_free (priv->transport_mode);
	g_free (priv->mac_address);
	g_free (priv->parent);
	g_free (priv->virtual_iface_name);

	G_OBJECT_CLASS (nm_setting_infiniband_parent_class)->finalize (object);
}
コード例 #10
0
static gboolean
verify (NMSetting *setting, NMConnection *connection, GError **error)
{
	NMSettingConnection *s_con;
	NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE (setting);
	guint32 normerr_max_mtu = 0;

	if (priv->mac_address && !nm_utils_hwaddr_valid (priv->mac_address, INFINIBAND_ALEN)) {
		g_set_error_literal (error,
		                     NM_CONNECTION_ERROR,
		                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
		                     _("property is invalid"));
		g_prefix_error (error, "%s.%s: ", NM_SETTING_INFINIBAND_SETTING_NAME, NM_SETTING_INFINIBAND_MAC_ADDRESS);
		return FALSE;
	}

	if (!g_strcmp0 (priv->transport_mode, "datagram")) {
		if (priv->mtu > 2044)
			normerr_max_mtu = 2044;
	} else if (!g_strcmp0 (priv->transport_mode, "connected")) {
		if (priv->mtu > 65520)
			normerr_max_mtu = 65520;
	} else {
		g_set_error_literal (error,
		                     NM_CONNECTION_ERROR,
		                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
		                     _("property is invalid"));
		g_prefix_error (error, "%s.%s: ", NM_SETTING_INFINIBAND_SETTING_NAME, NM_SETTING_INFINIBAND_TRANSPORT_MODE);
		return FALSE;
	}

	if (priv->parent) {
		if (!nm_utils_iface_valid_name (priv->parent)) {
			g_set_error_literal (error,
			                     NM_CONNECTION_ERROR,
			                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
			                     _("not a valid interface name"));
			g_prefix_error (error, "%s: ", NM_SETTING_INFINIBAND_PARENT);
			return FALSE;
		}
		if (priv->p_key == -1) {
			g_set_error_literal (error,
			                     NM_CONNECTION_ERROR,
			                     NM_CONNECTION_ERROR_INVALID_PROPERTY,
			                     _("Must specify a P_Key if specifying parent"));
			g_prefix_error (error, "%s: ", NM_SETTING_INFINIBAND_PARENT);
		}
	}

	if (priv->p_key != -1) {
		if (!priv->mac_address && !priv->parent) {
			g_set_error_literal (error,
			                     NM_CONNECTION_ERROR,
			                     NM_CONNECTION_ERROR_MISSING_PROPERTY,
			                     _("InfiniBand P_Key connection did not specify parent interface name"));
			g_prefix_error (error, "%s: ", NM_SETTING_INFINIBAND_PARENT);
			return FALSE;
		}
	}

	s_con = nm_connection_get_setting_connection (connection);
	if (s_con) {
		const char *interface_name = nm_setting_connection_get_interface_name (s_con);

		if (!interface_name)
			;
		else if (!nm_utils_iface_valid_name (interface_name)) {
			/* report the error for NMSettingConnection:interface-name, because
			 * it's that property that is invalid -- although we currently verify()
			 * NMSettingInfiniband.
			 **/
			g_set_error (error,
			             NM_CONNECTION_ERROR,
			             NM_CONNECTION_ERROR_INVALID_PROPERTY,
			             _("'%s' is not a valid interface name"),
			             interface_name);
			g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME);
			return FALSE;
		} else {
			if (priv->p_key != -1) {
				if (!priv->virtual_iface_name)
					priv->virtual_iface_name = g_strdup_printf ("%s.%04x", priv->parent, priv->p_key);

				if (strcmp (interface_name, priv->virtual_iface_name) != 0) {
					/* We don't support renaming software infiniband devices. Later we might, but
					 * for now just reject such connections.
					 **/
					g_set_error (error,
					             NM_CONNECTION_ERROR,
					             NM_CONNECTION_ERROR_INVALID_PROPERTY,
					             _("interface name of software infiniband device must be '%s' or unset (instead it is '%s')"),
					             priv->virtual_iface_name, interface_name);
					g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME, NM_SETTING_CONNECTION_INTERFACE_NAME);
					return FALSE;
				}
			}
		}
	}

	/* *** errors above here should be always fatal, below NORMALIZABLE_ERROR *** */

	if (normerr_max_mtu > 0) {
		g_set_error (error,
		             NM_CONNECTION_ERROR,
		             NM_CONNECTION_ERROR_INVALID_PROPERTY,
		             _("mtu for transport mode '%s' can be at most %d but it is %d"),
		             priv->transport_mode, normerr_max_mtu, priv->mtu);
		g_prefix_error (error, "%s.%s: ", NM_SETTING_INFINIBAND_SETTING_NAME, NM_SETTING_INFINIBAND_MTU);
		return NM_SETTING_VERIFY_NORMALIZABLE_ERROR;
	}

	return TRUE;
}