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; }
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; } }
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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
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); }
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; }