merge: branch 'bg/ip-tunnel-gretap-bgo796645'
https://bugzilla.gnome.org/show_bug.cgi?id=796645
This commit is contained in:
@@ -7778,6 +7778,7 @@ const NMMetaSettingInfoEditor nm_meta_setting_infos_editor[] = {
|
||||
.valid_parts = NM_META_SETTING_VALID_PARTS (
|
||||
NM_META_SETTING_VALID_PART_ITEM (CONNECTION, TRUE),
|
||||
NM_META_SETTING_VALID_PART_ITEM (IP_TUNNEL, TRUE),
|
||||
NM_META_SETTING_VALID_PART_ITEM (WIRED, FALSE),
|
||||
),
|
||||
),
|
||||
SETTING_INFO (MACSEC,
|
||||
|
@@ -1157,6 +1157,26 @@ _normalize_ovs_interface_type (NMConnection *self, GHashTable *parameters)
|
||||
return modified;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_normalize_ip_tunnel_wired_setting (NMConnection *self, GHashTable *parameters)
|
||||
{
|
||||
NMSettingIPTunnel *s_ip_tunnel;
|
||||
|
||||
s_ip_tunnel = nm_connection_get_setting_ip_tunnel (self);
|
||||
if (!s_ip_tunnel)
|
||||
return FALSE;
|
||||
|
||||
if ( nm_connection_get_setting_wired (self)
|
||||
&& !NM_IN_SET (nm_setting_ip_tunnel_get_mode (s_ip_tunnel),
|
||||
NM_IP_TUNNEL_MODE_GRETAP,
|
||||
NM_IP_TUNNEL_MODE_IP6GRETAP)) {
|
||||
nm_connection_remove_setting (self, NM_TYPE_SETTING_WIRED);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_normalize_required_settings (NMConnection *self, GHashTable *parameters)
|
||||
{
|
||||
@@ -1502,6 +1522,7 @@ nm_connection_normalize (NMConnection *connection,
|
||||
was_modified |= _normalize_team_port_config (connection, parameters);
|
||||
was_modified |= _normalize_bluetooth_type (connection, parameters);
|
||||
was_modified |= _normalize_ovs_interface_type (connection, parameters);
|
||||
was_modified |= _normalize_ip_tunnel_wired_setting (connection, parameters);
|
||||
|
||||
/* Verify anew. */
|
||||
success = _nm_connection_verify (connection, error);
|
||||
|
@@ -809,16 +809,18 @@ typedef enum /*< flags >*/ {
|
||||
|
||||
/**
|
||||
* NMIPTunnelMode:
|
||||
* @NM_IP_TUNNEL_MODE_UNKNOWN: Unknown/unset tunnel mode
|
||||
* @NM_IP_TUNNEL_MODE_IPIP: IP in IP tunnel
|
||||
* @NM_IP_TUNNEL_MODE_GRE: GRE tunnel
|
||||
* @NM_IP_TUNNEL_MODE_SIT: SIT tunnel
|
||||
* @NM_IP_TUNNEL_MODE_ISATAP: ISATAP tunnel
|
||||
* @NM_IP_TUNNEL_MODE_VTI: VTI tunnel
|
||||
* @NM_IP_TUNNEL_MODE_IP6IP6: IPv6 in IPv6 tunnel
|
||||
* @NM_IP_TUNNEL_MODE_IPIP6: IPv4 in IPv6 tunnel
|
||||
* @NM_IP_TUNNEL_MODE_IP6GRE: IPv6 GRE tunnel
|
||||
* @NM_IP_TUNNEL_MODE_VTI6: IPv6 VTI tunnel
|
||||
* @NM_IP_TUNNEL_MODE_UNKNOWN: Unknown/unset tunnel mode
|
||||
* @NM_IP_TUNNEL_MODE_IPIP: IP in IP tunnel
|
||||
* @NM_IP_TUNNEL_MODE_GRE: GRE tunnel
|
||||
* @NM_IP_TUNNEL_MODE_SIT: SIT tunnel
|
||||
* @NM_IP_TUNNEL_MODE_ISATAP: ISATAP tunnel
|
||||
* @NM_IP_TUNNEL_MODE_VTI: VTI tunnel
|
||||
* @NM_IP_TUNNEL_MODE_IP6IP6: IPv6 in IPv6 tunnel
|
||||
* @NM_IP_TUNNEL_MODE_IPIP6: IPv4 in IPv6 tunnel
|
||||
* @NM_IP_TUNNEL_MODE_IP6GRE: IPv6 GRE tunnel
|
||||
* @NM_IP_TUNNEL_MODE_VTI6: IPv6 VTI tunnel
|
||||
* @NM_IP_TUNNEL_MODE_GRETAP: GRETAP tunnel
|
||||
* @NM_IP_TUNNEL_MODE_IP6GRETAP: IPv6 GRETAP tunnel
|
||||
*
|
||||
* The tunneling mode.
|
||||
*
|
||||
@@ -835,6 +837,8 @@ typedef enum {
|
||||
NM_IP_TUNNEL_MODE_IPIP6 = 7,
|
||||
NM_IP_TUNNEL_MODE_IP6GRE = 8,
|
||||
NM_IP_TUNNEL_MODE_VTI6 = 9,
|
||||
NM_IP_TUNNEL_MODE_GRETAP = 10,
|
||||
NM_IP_TUNNEL_MODE_IP6GRETAP = 11,
|
||||
} NMIPTunnelMode;
|
||||
|
||||
/**
|
||||
|
@@ -319,12 +319,14 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
|
||||
case NM_IP_TUNNEL_MODE_ISATAP:
|
||||
case NM_IP_TUNNEL_MODE_GRE:
|
||||
case NM_IP_TUNNEL_MODE_VTI:
|
||||
case NM_IP_TUNNEL_MODE_GRETAP:
|
||||
family = AF_INET;
|
||||
break;
|
||||
case NM_IP_TUNNEL_MODE_IP6IP6:
|
||||
case NM_IP_TUNNEL_MODE_IPIP6:
|
||||
case NM_IP_TUNNEL_MODE_IP6GRE:
|
||||
case NM_IP_TUNNEL_MODE_VTI6:
|
||||
case NM_IP_TUNNEL_MODE_IP6GRETAP:
|
||||
family = AF_INET6;
|
||||
break;
|
||||
case NM_IP_TUNNEL_MODE_UNKNOWN:
|
||||
@@ -387,8 +389,11 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
|
||||
|
||||
if ( (priv->input_key && priv->input_key[0])
|
||||
|| (priv->output_key && priv->output_key[0])) {
|
||||
if ( priv->mode != NM_IP_TUNNEL_MODE_GRE
|
||||
&& priv->mode != NM_IP_TUNNEL_MODE_IP6GRE) {
|
||||
if (!NM_IN_SET (priv->mode,
|
||||
NM_IP_TUNNEL_MODE_GRE,
|
||||
NM_IP_TUNNEL_MODE_GRETAP,
|
||||
NM_IP_TUNNEL_MODE_IP6GRE,
|
||||
NM_IP_TUNNEL_MODE_IP6GRETAP)) {
|
||||
g_set_error_literal (error,
|
||||
NM_CONNECTION_ERROR,
|
||||
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
||||
@@ -453,6 +458,20 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( nm_connection_get_setting_wired (connection)
|
||||
&& !NM_IN_SET (priv->mode,
|
||||
NM_IP_TUNNEL_MODE_GRETAP,
|
||||
NM_IP_TUNNEL_MODE_IP6GRETAP)) {
|
||||
g_set_error (error,
|
||||
NM_CONNECTION_ERROR,
|
||||
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
||||
_("wired setting not allowed for mode %s"),
|
||||
nm_utils_enum_to_str (nm_ip_tunnel_mode_get_type (), priv->mode));
|
||||
g_prefix_error (error, "%s.%s: ", NM_SETTING_IP_TUNNEL_SETTING_NAME,
|
||||
NM_SETTING_IP_TUNNEL_MODE);
|
||||
return NM_SETTING_VERIFY_NORMALIZABLE_ERROR;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@@ -179,10 +179,13 @@ clear:
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (priv->mode == NM_IP_TUNNEL_MODE_GRE) {
|
||||
if (NM_IN_SET (priv->mode, NM_IP_TUNNEL_MODE_GRE, NM_IP_TUNNEL_MODE_GRETAP)) {
|
||||
const NMPlatformLnkGre *lnk;
|
||||
|
||||
lnk = nm_platform_link_get_lnk_gre (nm_device_get_platform (device), ifindex, NULL);
|
||||
if (priv->mode == NM_IP_TUNNEL_MODE_GRE)
|
||||
lnk = nm_platform_link_get_lnk_gre (nm_device_get_platform (device), ifindex, NULL);
|
||||
else
|
||||
lnk = nm_platform_link_get_lnk_gretap (nm_device_get_platform (device), ifindex, NULL);
|
||||
if (!lnk) {
|
||||
_LOGW (LOGD_PLATFORM, "could not read %s properties", "gre");
|
||||
goto clear;
|
||||
@@ -254,11 +257,21 @@ clear:
|
||||
ttl = lnk->ttl;
|
||||
tos = lnk->tos;
|
||||
pmtud = lnk->path_mtu_discovery;
|
||||
} else if ( priv->mode == NM_IP_TUNNEL_MODE_IPIP6
|
||||
|| priv->mode == NM_IP_TUNNEL_MODE_IP6IP6) {
|
||||
} else if (NM_IN_SET (priv->mode,
|
||||
NM_IP_TUNNEL_MODE_IPIP6,
|
||||
NM_IP_TUNNEL_MODE_IP6IP6,
|
||||
NM_IP_TUNNEL_MODE_IP6GRE,
|
||||
NM_IP_TUNNEL_MODE_IP6GRETAP)) {
|
||||
const NMPlatformLnkIp6Tnl *lnk;
|
||||
NMPlatform *plat = nm_device_get_platform (device);
|
||||
|
||||
if (priv->mode == NM_IP_TUNNEL_MODE_IP6GRE)
|
||||
lnk = nm_platform_link_get_lnk_ip6gre (plat, ifindex, NULL);
|
||||
else if (priv->mode == NM_IP_TUNNEL_MODE_IP6GRETAP)
|
||||
lnk = nm_platform_link_get_lnk_ip6gretap (plat, ifindex, NULL);
|
||||
else
|
||||
lnk = nm_platform_link_get_lnk_ip6tnl (plat, ifindex, NULL);
|
||||
|
||||
lnk = nm_platform_link_get_lnk_ip6tnl (nm_device_get_platform (device), ifindex, NULL);
|
||||
if (!lnk) {
|
||||
_LOGW (LOGD_PLATFORM, "could not read %s properties", "ip6tnl");
|
||||
goto clear;
|
||||
@@ -272,6 +285,40 @@ clear:
|
||||
encap_limit = lnk->encap_limit;
|
||||
flow_label = lnk->flow_label;
|
||||
flags = ip6tnl_flags_plat_to_setting (lnk->flags);
|
||||
|
||||
if (NM_IN_SET (priv->mode,
|
||||
NM_IP_TUNNEL_MODE_IP6GRE,
|
||||
NM_IP_TUNNEL_MODE_IP6GRETAP)) {
|
||||
if (NM_FLAGS_HAS (lnk->input_flags, NM_GRE_KEY)) {
|
||||
key = g_strdup_printf ("%u", lnk->input_key);
|
||||
if (g_strcmp0 (priv->input_key, key)) {
|
||||
g_free (priv->input_key);
|
||||
priv->input_key = key;
|
||||
_notify (self, PROP_INPUT_KEY);
|
||||
} else
|
||||
g_free (key);
|
||||
} else {
|
||||
if (priv->input_key) {
|
||||
g_clear_pointer (&priv->input_key, g_free);
|
||||
_notify (self, PROP_INPUT_KEY);
|
||||
}
|
||||
}
|
||||
|
||||
if (NM_FLAGS_HAS (lnk->output_flags, NM_GRE_KEY)) {
|
||||
key = g_strdup_printf ("%u", lnk->output_key);
|
||||
if (g_strcmp0 (priv->output_key, key)) {
|
||||
g_free (priv->output_key);
|
||||
priv->output_key = key;
|
||||
_notify (self, PROP_OUTPUT_KEY);
|
||||
} else
|
||||
g_free (key);
|
||||
} else {
|
||||
if (priv->output_key) {
|
||||
g_clear_pointer (&priv->output_key, g_free);
|
||||
_notify (self, PROP_OUTPUT_KEY);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else
|
||||
g_return_if_reached ();
|
||||
|
||||
@@ -456,7 +503,11 @@ update_connection (NMDevice *device, NMConnection *connection)
|
||||
NULL);
|
||||
}
|
||||
|
||||
if (priv->mode == NM_IP_TUNNEL_MODE_GRE || priv->mode == NM_IP_TUNNEL_MODE_IP6GRE) {
|
||||
if (NM_IN_SET (priv->mode,
|
||||
NM_IP_TUNNEL_MODE_GRE,
|
||||
NM_IP_TUNNEL_MODE_GRETAP,
|
||||
NM_IP_TUNNEL_MODE_IP6GRE,
|
||||
NM_IP_TUNNEL_MODE_IP6GRETAP)) {
|
||||
if (g_strcmp0 (nm_setting_ip_tunnel_get_input_key (s_ip_tunnel), priv->input_key)) {
|
||||
g_object_set (G_OBJECT (s_ip_tunnel),
|
||||
NM_SETTING_IP_TUNNEL_INPUT_KEY,
|
||||
@@ -535,6 +586,8 @@ platform_link_to_tunnel_mode (const NMPlatformLink *link)
|
||||
switch (link->type) {
|
||||
case NM_LINK_TYPE_GRE:
|
||||
return NM_IP_TUNNEL_MODE_GRE;
|
||||
case NM_LINK_TYPE_GRETAP:
|
||||
return NM_IP_TUNNEL_MODE_GRETAP;
|
||||
case NM_LINK_TYPE_IP6TNL:
|
||||
lnk = nm_platform_link_get_lnk_ip6tnl (NM_PLATFORM_GET, link->ifindex, NULL);
|
||||
if (lnk) {
|
||||
@@ -544,6 +597,10 @@ platform_link_to_tunnel_mode (const NMPlatformLink *link)
|
||||
return NM_IP_TUNNEL_MODE_IP6IP6;
|
||||
}
|
||||
return NM_IP_TUNNEL_MODE_UNKNOWN;
|
||||
case NM_LINK_TYPE_IP6GRE:
|
||||
return NM_IP_TUNNEL_MODE_IP6GRE;
|
||||
case NM_LINK_TYPE_IP6GRETAP:
|
||||
return NM_IP_TUNNEL_MODE_IP6GRETAP;
|
||||
case NM_LINK_TYPE_IPIP:
|
||||
return NM_IP_TUNNEL_MODE_IPIP;
|
||||
case NM_LINK_TYPE_SIT:
|
||||
@@ -559,15 +616,20 @@ tunnel_mode_to_link_type (NMIPTunnelMode tunnel_mode)
|
||||
switch (tunnel_mode) {
|
||||
case NM_IP_TUNNEL_MODE_GRE:
|
||||
return NM_LINK_TYPE_GRE;
|
||||
case NM_IP_TUNNEL_MODE_GRETAP:
|
||||
return NM_LINK_TYPE_GRETAP;
|
||||
case NM_IP_TUNNEL_MODE_IPIP6:
|
||||
case NM_IP_TUNNEL_MODE_IP6IP6:
|
||||
return NM_LINK_TYPE_IP6TNL;
|
||||
case NM_IP_TUNNEL_MODE_IP6GRE:
|
||||
return NM_LINK_TYPE_IP6GRE;
|
||||
case NM_IP_TUNNEL_MODE_IP6GRETAP:
|
||||
return NM_LINK_TYPE_IP6GRETAP;
|
||||
case NM_IP_TUNNEL_MODE_IPIP:
|
||||
return NM_LINK_TYPE_IPIP;
|
||||
case NM_IP_TUNNEL_MODE_SIT:
|
||||
return NM_LINK_TYPE_SIT;
|
||||
case NM_IP_TUNNEL_MODE_VTI:
|
||||
case NM_IP_TUNNEL_MODE_IP6GRE:
|
||||
case NM_IP_TUNNEL_MODE_VTI6:
|
||||
case NM_IP_TUNNEL_MODE_ISATAP:
|
||||
return NM_LINK_TYPE_UNKNOWN;
|
||||
@@ -595,11 +657,16 @@ create_and_realize (NMDevice *device,
|
||||
NMPlatformLnkIp6Tnl lnk_ip6tnl = { };
|
||||
const char *str;
|
||||
gint64 val;
|
||||
NMIPTunnelMode mode;
|
||||
|
||||
s_ip_tunnel = nm_connection_get_setting_ip_tunnel (connection);
|
||||
g_assert (s_ip_tunnel);
|
||||
|
||||
switch (nm_setting_ip_tunnel_get_mode (s_ip_tunnel)) {
|
||||
mode = nm_setting_ip_tunnel_get_mode (s_ip_tunnel);
|
||||
switch (mode) {
|
||||
case NM_IP_TUNNEL_MODE_GRETAP:
|
||||
lnk_gre.is_tap = TRUE;
|
||||
/* fall-through */
|
||||
case NM_IP_TUNNEL_MODE_GRE:
|
||||
if (parent)
|
||||
lnk_gre.parent_ifindex = nm_device_get_ifindex (parent);
|
||||
@@ -700,6 +767,8 @@ create_and_realize (NMDevice *device,
|
||||
break;
|
||||
case NM_IP_TUNNEL_MODE_IPIP6:
|
||||
case NM_IP_TUNNEL_MODE_IP6IP6:
|
||||
case NM_IP_TUNNEL_MODE_IP6GRE:
|
||||
case NM_IP_TUNNEL_MODE_IP6GRETAP:
|
||||
if (parent)
|
||||
lnk_ip6tnl.parent_ifindex = nm_device_get_ifindex (parent);
|
||||
|
||||
@@ -715,13 +784,44 @@ create_and_realize (NMDevice *device,
|
||||
lnk_ip6tnl.tclass = nm_setting_ip_tunnel_get_tos (s_ip_tunnel);
|
||||
lnk_ip6tnl.encap_limit = nm_setting_ip_tunnel_get_encapsulation_limit (s_ip_tunnel);
|
||||
lnk_ip6tnl.flow_label = nm_setting_ip_tunnel_get_flow_label (s_ip_tunnel);
|
||||
lnk_ip6tnl.proto = nm_setting_ip_tunnel_get_mode (s_ip_tunnel) == NM_IP_TUNNEL_MODE_IPIP6 ? IPPROTO_IPIP : IPPROTO_IPV6;
|
||||
lnk_ip6tnl.flags = ip6tnl_flags_setting_to_plat (nm_setting_ip_tunnel_get_flags (s_ip_tunnel));
|
||||
|
||||
plerr = nm_platform_link_ip6tnl_add (nm_device_get_platform (device), iface, &lnk_ip6tnl, out_plink);
|
||||
if (NM_IN_SET (mode, NM_IP_TUNNEL_MODE_IP6GRE, NM_IP_TUNNEL_MODE_IP6GRETAP)) {
|
||||
val = _nm_utils_ascii_str_to_int64 (nm_setting_ip_tunnel_get_input_key (s_ip_tunnel),
|
||||
10,
|
||||
0,
|
||||
G_MAXUINT32,
|
||||
-1);
|
||||
if (val != -1) {
|
||||
lnk_ip6tnl.input_key = val;
|
||||
lnk_ip6tnl.input_flags = NM_GRE_KEY;
|
||||
}
|
||||
|
||||
val = _nm_utils_ascii_str_to_int64 (nm_setting_ip_tunnel_get_output_key (s_ip_tunnel),
|
||||
10,
|
||||
0,
|
||||
G_MAXUINT32,
|
||||
-1);
|
||||
if (val != -1) {
|
||||
lnk_ip6tnl.output_key = val;
|
||||
lnk_ip6tnl.output_flags = NM_GRE_KEY;
|
||||
}
|
||||
|
||||
lnk_ip6tnl.is_gre = TRUE;
|
||||
lnk_ip6tnl.is_tap = (mode == NM_IP_TUNNEL_MODE_IP6GRETAP);
|
||||
|
||||
plerr = nm_platform_link_ip6gre_add (nm_device_get_platform (device),
|
||||
iface, &lnk_ip6tnl, out_plink);
|
||||
} else {
|
||||
lnk_ip6tnl.proto = nm_setting_ip_tunnel_get_mode (s_ip_tunnel) == NM_IP_TUNNEL_MODE_IPIP6
|
||||
? IPPROTO_IPIP
|
||||
: IPPROTO_IPV6;
|
||||
plerr = nm_platform_link_ip6tnl_add (nm_device_get_platform (device),
|
||||
iface, &lnk_ip6tnl, out_plink);
|
||||
}
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS) {
|
||||
g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
|
||||
"Failed to create IPIP interface '%s' for '%s': %s",
|
||||
"Failed to create IPv6 tunnel interface '%s' for '%s': %s",
|
||||
iface,
|
||||
nm_connection_get_id (connection),
|
||||
nm_platform_error_to_string_a (plerr));
|
||||
@@ -852,6 +952,21 @@ set_property (GObject *object, guint prop_id,
|
||||
}
|
||||
}
|
||||
|
||||
static NMActStageReturn
|
||||
act_stage1_prepare (NMDevice *device, NMDeviceStateReason *out_failure_reason)
|
||||
{
|
||||
NMActStageReturn ret;
|
||||
|
||||
ret = NM_DEVICE_CLASS (nm_device_ip_tunnel_parent_class)->act_stage1_prepare (device, out_failure_reason);
|
||||
if (ret != NM_ACT_STAGE_RETURN_SUCCESS)
|
||||
return ret;
|
||||
|
||||
if (!nm_device_hw_addr_set_cloned (device, nm_device_get_applied_connection (device), FALSE))
|
||||
return NM_ACT_STAGE_RETURN_FAILURE;
|
||||
|
||||
return NM_ACT_STAGE_RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
@@ -864,8 +979,11 @@ constructed (GObject *object)
|
||||
{
|
||||
NMDeviceIPTunnelPrivate *priv = NM_DEVICE_IP_TUNNEL_GET_PRIVATE ((NMDeviceIPTunnel *) object);
|
||||
|
||||
if ( priv->mode == NM_IP_TUNNEL_MODE_IPIP6
|
||||
|| priv->mode == NM_IP_TUNNEL_MODE_IP6IP6)
|
||||
if (NM_IN_SET (priv->mode,
|
||||
NM_IP_TUNNEL_MODE_IPIP6,
|
||||
NM_IP_TUNNEL_MODE_IP6IP6,
|
||||
NM_IP_TUNNEL_MODE_IP6GRE,
|
||||
NM_IP_TUNNEL_MODE_IP6GRETAP))
|
||||
priv->addr_family = AF_INET6;
|
||||
else
|
||||
priv->addr_family = AF_INET;
|
||||
@@ -925,6 +1043,7 @@ nm_device_ip_tunnel_class_init (NMDeviceIPTunnelClass *klass)
|
||||
|
||||
dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_device_ip_tunnel);
|
||||
|
||||
device_class->act_stage1_prepare = act_stage1_prepare;
|
||||
device_class->link_changed = link_changed;
|
||||
device_class->can_reapply_change = can_reapply_change;
|
||||
device_class->complete_connection = complete_connection;
|
||||
@@ -938,7 +1057,10 @@ nm_device_ip_tunnel_class_init (NMDeviceIPTunnelClass *klass)
|
||||
NM_DEVICE_CLASS_DECLARE_TYPES (klass,
|
||||
NM_SETTING_IP_TUNNEL_SETTING_NAME,
|
||||
NM_LINK_TYPE_GRE,
|
||||
NM_LINK_TYPE_GRETAP,
|
||||
NM_LINK_TYPE_IP6TNL,
|
||||
NM_LINK_TYPE_IP6GRE,
|
||||
NM_LINK_TYPE_IP6GRETAP,
|
||||
NM_LINK_TYPE_IPIP,
|
||||
NM_LINK_TYPE_SIT);
|
||||
|
||||
@@ -1084,7 +1206,13 @@ get_connection_iface (NMDeviceFactory *factory,
|
||||
}
|
||||
|
||||
NM_DEVICE_FACTORY_DEFINE_INTERNAL (IP_TUNNEL, IPTunnel, ip_tunnel,
|
||||
NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_GRE, NM_LINK_TYPE_SIT, NM_LINK_TYPE_IPIP)
|
||||
NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_GRE,
|
||||
NM_LINK_TYPE_GRETAP,
|
||||
NM_LINK_TYPE_SIT,
|
||||
NM_LINK_TYPE_IPIP,
|
||||
NM_LINK_TYPE_IP6TNL,
|
||||
NM_LINK_TYPE_IP6GRE,
|
||||
NM_LINK_TYPE_IP6GRETAP)
|
||||
NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_IP_TUNNEL_SETTING_NAME),
|
||||
factory_class->create_device = create_device;
|
||||
factory_class->get_connection_parent = get_connection_parent;
|
||||
|
@@ -3008,7 +3008,6 @@ nm_utils_get_ipv6_interface_identifier (NMLinkType link_type,
|
||||
out_iid->id_u8[0] |= 0x02;
|
||||
return TRUE;
|
||||
case NM_LINK_TYPE_GRE:
|
||||
case NM_LINK_TYPE_GRETAP:
|
||||
/* Hardware address is the network-endian IPv4 address */
|
||||
g_return_val_if_fail (hwaddr_len == 4, FALSE);
|
||||
addr = * (guint32 *) hwaddr;
|
||||
|
@@ -160,6 +160,8 @@ typedef enum {
|
||||
NM_LINK_TYPE_GRETAP,
|
||||
NM_LINK_TYPE_IFB,
|
||||
NM_LINK_TYPE_IP6TNL,
|
||||
NM_LINK_TYPE_IP6GRE,
|
||||
NM_LINK_TYPE_IP6GRETAP,
|
||||
NM_LINK_TYPE_IPIP,
|
||||
NM_LINK_TYPE_LOOPBACK,
|
||||
NM_LINK_TYPE_MACSEC,
|
||||
@@ -194,8 +196,11 @@ typedef enum {
|
||||
NMP_OBJECT_TYPE_TFILTER,
|
||||
|
||||
NMP_OBJECT_TYPE_LNK_GRE,
|
||||
NMP_OBJECT_TYPE_LNK_GRETAP,
|
||||
NMP_OBJECT_TYPE_LNK_INFINIBAND,
|
||||
NMP_OBJECT_TYPE_LNK_IP6TNL,
|
||||
NMP_OBJECT_TYPE_LNK_IP6GRE,
|
||||
NMP_OBJECT_TYPE_LNK_IP6GRETAP,
|
||||
NMP_OBJECT_TYPE_LNK_IPIP,
|
||||
NMP_OBJECT_TYPE_LNK_MACSEC,
|
||||
NMP_OBJECT_TYPE_LNK_MACVLAN,
|
||||
|
@@ -233,8 +233,6 @@ G_STATIC_ASSERT (RTA_MAX == (__RTA_MAX - 1));
|
||||
} \
|
||||
} G_STMT_END
|
||||
|
||||
#define LOG_FMT_IP_TUNNEL "adding %s '%s' parent %u local %s remote %s"
|
||||
|
||||
/******************************************************************
|
||||
* Forward declarations and enums
|
||||
******************************************************************/
|
||||
@@ -551,6 +549,8 @@ static const LinkDesc linktypes[] = {
|
||||
{ NM_LINK_TYPE_GRETAP, "gretap", "gretap", NULL },
|
||||
{ NM_LINK_TYPE_IFB, "ifb", "ifb", NULL },
|
||||
{ NM_LINK_TYPE_IP6TNL, "ip6tnl", "ip6tnl", NULL },
|
||||
{ NM_LINK_TYPE_IP6GRE, "ip6gre", "ip6gre", NULL },
|
||||
{ NM_LINK_TYPE_IP6GRETAP, "ip6gretap", "ip6gretap", NULL },
|
||||
{ NM_LINK_TYPE_IPIP, "ipip", "ipip", NULL },
|
||||
{ NM_LINK_TYPE_LOOPBACK, "loopback", NULL, NULL },
|
||||
{ NM_LINK_TYPE_MACSEC, "macsec", "macsec", NULL },
|
||||
@@ -1074,15 +1074,23 @@ _parse_lnk_gre (const char *kind, struct nlattr *info_data)
|
||||
int err;
|
||||
NMPObject *obj;
|
||||
NMPlatformLnkGre *props;
|
||||
gboolean is_tap;
|
||||
|
||||
if (!info_data || g_strcmp0 (kind, "gre"))
|
||||
if (!info_data || !kind)
|
||||
return NULL;
|
||||
|
||||
if (nm_streq (kind, "gretap"))
|
||||
is_tap = TRUE;
|
||||
else if (nm_streq (kind, "gre"))
|
||||
is_tap = FALSE;
|
||||
else
|
||||
return NULL;
|
||||
|
||||
err = nla_parse_nested (tb, IFLA_GRE_MAX, info_data, policy);
|
||||
if (err < 0)
|
||||
return NULL;
|
||||
|
||||
obj = nmp_object_new (NMP_OBJECT_TYPE_LNK_GRE, NULL);
|
||||
obj = nmp_object_new (is_tap ? NMP_OBJECT_TYPE_LNK_GRETAP : NMP_OBJECT_TYPE_LNK_GRE, NULL);
|
||||
props = &obj->lnk_gre;
|
||||
|
||||
props->parent_ifindex = tb[IFLA_GRE_LINK] ? nla_get_u32 (tb[IFLA_GRE_LINK]) : 0;
|
||||
@@ -1095,6 +1103,7 @@ _parse_lnk_gre (const char *kind, struct nlattr *info_data)
|
||||
props->tos = tb[IFLA_GRE_TOS] ? nla_get_u8 (tb[IFLA_GRE_TOS]) : 0;
|
||||
props->ttl = tb[IFLA_GRE_TTL] ? nla_get_u8 (tb[IFLA_GRE_TTL]) : 0;
|
||||
props->path_mtu_discovery = !tb[IFLA_GRE_PMTUDISC] || !!nla_get_u8 (tb[IFLA_GRE_PMTUDISC]);
|
||||
props->is_tap = is_tap;
|
||||
|
||||
return obj;
|
||||
}
|
||||
@@ -1215,6 +1224,79 @@ _parse_lnk_ip6tnl (const char *kind, struct nlattr *info_data)
|
||||
return obj;
|
||||
}
|
||||
|
||||
static NMPObject *
|
||||
_parse_lnk_ip6gre (const char *kind, struct nlattr *info_data)
|
||||
{
|
||||
static const struct nla_policy policy[IFLA_GRE_MAX + 1] = {
|
||||
[IFLA_GRE_LINK] = { .type = NLA_U32 },
|
||||
[IFLA_GRE_IFLAGS] = { .type = NLA_U16 },
|
||||
[IFLA_GRE_OFLAGS] = { .type = NLA_U16 },
|
||||
[IFLA_GRE_IKEY] = { .type = NLA_U32 },
|
||||
[IFLA_GRE_OKEY] = { .type = NLA_U32 },
|
||||
[IFLA_GRE_LOCAL] = { .type = NLA_UNSPEC,
|
||||
.minlen = sizeof (struct in6_addr)},
|
||||
[IFLA_GRE_REMOTE] = { .type = NLA_UNSPEC,
|
||||
.minlen = sizeof (struct in6_addr)},
|
||||
[IFLA_GRE_TTL] = { .type = NLA_U8 },
|
||||
[IFLA_GRE_ENCAP_LIMIT] = { .type = NLA_U8 },
|
||||
[IFLA_GRE_FLOWINFO] = { .type = NLA_U32 },
|
||||
[IFLA_GRE_FLAGS] = { .type = NLA_U32 },
|
||||
};
|
||||
struct nlattr *tb[IFLA_GRE_MAX + 1];
|
||||
int err;
|
||||
NMPObject *obj;
|
||||
NMPlatformLnkIp6Tnl *props;
|
||||
guint32 flowinfo;
|
||||
gboolean is_tap;
|
||||
|
||||
if (!info_data || !kind)
|
||||
return NULL;
|
||||
|
||||
if (nm_streq (kind, "ip6gre"))
|
||||
is_tap = FALSE;
|
||||
else if (nm_streq (kind, "ip6gretap"))
|
||||
is_tap = TRUE;
|
||||
else
|
||||
return NULL;
|
||||
|
||||
err = nla_parse_nested (tb, IFLA_GRE_MAX, info_data, policy);
|
||||
if (err < 0)
|
||||
return NULL;
|
||||
|
||||
obj = nmp_object_new (is_tap ? NMP_OBJECT_TYPE_LNK_IP6GRETAP : NMP_OBJECT_TYPE_LNK_IP6GRE, NULL);
|
||||
props = &obj->lnk_ip6tnl;
|
||||
props->is_gre = TRUE;
|
||||
props->is_tap = is_tap;
|
||||
|
||||
if (tb[IFLA_GRE_LINK])
|
||||
props->parent_ifindex = nla_get_u32 (tb[IFLA_GRE_LINK]);
|
||||
if (tb[IFLA_GRE_IFLAGS])
|
||||
props->input_flags = ntohs (nla_get_u16 (tb[IFLA_GRE_IFLAGS]));
|
||||
if (tb[IFLA_GRE_OFLAGS])
|
||||
props->output_flags = ntohs (nla_get_u16 (tb[IFLA_GRE_OFLAGS]));
|
||||
if (tb[IFLA_GRE_IKEY])
|
||||
props->input_key = ntohl (nla_get_u32 (tb[IFLA_GRE_IKEY]));
|
||||
if (tb[IFLA_GRE_OKEY])
|
||||
props->output_key = ntohl (nla_get_u32 (tb[IFLA_GRE_OKEY]));
|
||||
if (tb[IFLA_GRE_LOCAL])
|
||||
memcpy (&props->local, nla_data (tb[IFLA_GRE_LOCAL]), sizeof (props->local));
|
||||
if (tb[IFLA_GRE_REMOTE])
|
||||
memcpy (&props->remote, nla_data (tb[IFLA_GRE_REMOTE]), sizeof (props->remote));
|
||||
if (tb[IFLA_GRE_TTL])
|
||||
props->ttl = nla_get_u8 (tb[IFLA_GRE_TTL]);
|
||||
if (tb[IFLA_GRE_ENCAP_LIMIT])
|
||||
props->encap_limit = nla_get_u8 (tb[IFLA_GRE_ENCAP_LIMIT]);
|
||||
if (tb[IFLA_GRE_FLOWINFO]) {
|
||||
flowinfo = ntohl (nla_get_u32 (tb[IFLA_GRE_FLOWINFO]));
|
||||
props->flow_label = flowinfo & IP6_FLOWINFO_FLOWLABEL_MASK;
|
||||
props->tclass = (flowinfo & IP6_FLOWINFO_TCLASS_MASK) >> IP6_FLOWINFO_TCLASS_SHIFT;
|
||||
}
|
||||
if (tb[IFLA_GRE_FLAGS])
|
||||
props->flags = nla_get_u32 (tb[IFLA_GRE_FLAGS]);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static NMPObject *
|
||||
@@ -1854,6 +1936,7 @@ _new_from_nl_link (NMPlatform *platform, const NMPCache *cache, struct nlmsghdr
|
||||
|
||||
switch (obj->link.type) {
|
||||
case NM_LINK_TYPE_GRE:
|
||||
case NM_LINK_TYPE_GRETAP:
|
||||
lnk_data = _parse_lnk_gre (nl_info_kind, nl_info_data);
|
||||
break;
|
||||
case NM_LINK_TYPE_INFINIBAND:
|
||||
@@ -1862,6 +1945,10 @@ _new_from_nl_link (NMPlatform *platform, const NMPCache *cache, struct nlmsghdr
|
||||
case NM_LINK_TYPE_IP6TNL:
|
||||
lnk_data = _parse_lnk_ip6tnl (nl_info_kind, nl_info_data);
|
||||
break;
|
||||
case NM_LINK_TYPE_IP6GRE:
|
||||
case NM_LINK_TYPE_IP6GRETAP:
|
||||
lnk_data = _parse_lnk_ip6gre (nl_info_kind, nl_info_data);
|
||||
break;
|
||||
case NM_LINK_TYPE_IPIP:
|
||||
lnk_data = _parse_lnk_ipip (nl_info_kind, nl_info_data);
|
||||
break;
|
||||
@@ -3997,7 +4084,10 @@ cache_on_change (NMPlatform *platform,
|
||||
|
||||
if ( !obj_new->_link.netlink.lnk
|
||||
&& NM_IN_SET (obj_new->link.type, NM_LINK_TYPE_GRE,
|
||||
NM_LINK_TYPE_GRETAP,
|
||||
NM_LINK_TYPE_IP6TNL,
|
||||
NM_LINK_TYPE_IP6GRE,
|
||||
NM_LINK_TYPE_IP6GRETAP,
|
||||
NM_LINK_TYPE_INFINIBAND,
|
||||
NM_LINK_TYPE_MACVLAN,
|
||||
NM_LINK_TYPE_MACVLAN,
|
||||
@@ -4906,8 +4996,6 @@ link_set_netns (NMPlatform *platform,
|
||||
{
|
||||
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||
|
||||
_LOGD ("link: move link %d to network namespace with fd %d", ifindex, netns_fd);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
0,
|
||||
ifindex,
|
||||
@@ -5107,10 +5195,6 @@ link_set_address (NMPlatform *platform, int ifindex, gconstpointer address, size
|
||||
if (!address || !length)
|
||||
g_return_val_if_reached (NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
_LOGD ("link: change %d: address: %s (%lu bytes)", ifindex,
|
||||
(mac = nm_utils_hwaddr_ntoa (address, length)),
|
||||
(unsigned long) length);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
0,
|
||||
ifindex,
|
||||
@@ -5132,8 +5216,6 @@ link_set_name (NMPlatform *platform, int ifindex, const char *name)
|
||||
{
|
||||
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||
|
||||
_LOGD ("link: change %d: name: %s", ifindex, name);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
0,
|
||||
ifindex,
|
||||
@@ -5169,8 +5251,6 @@ link_set_mtu (NMPlatform *platform, int ifindex, guint32 mtu)
|
||||
{
|
||||
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||
|
||||
_LOGD ("link: change %d: mtu: %u", ifindex, (unsigned) mtu);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
0,
|
||||
ifindex,
|
||||
@@ -5278,7 +5358,7 @@ link_get_dev_id (NMPlatform *platform, int ifindex)
|
||||
16, 0, G_MAXUINT16, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
static gboolean
|
||||
vlan_add (NMPlatform *platform,
|
||||
const char *name,
|
||||
int parent,
|
||||
@@ -5294,10 +5374,6 @@ vlan_add (NMPlatform *platform,
|
||||
G_STATIC_ASSERT (NM_VLAN_FLAG_MVRP == (guint32) VLAN_FLAG_MVRP);
|
||||
|
||||
vlan_flags &= (guint32) NM_VLAN_FLAGS_ALL;
|
||||
|
||||
_LOGD ("link: add vlan '%s', parent %d, vlan id %d, flags %X",
|
||||
name, parent, vlan_id, (unsigned) vlan_flags);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
NLM_F_CREATE | NLM_F_EXCL,
|
||||
0,
|
||||
@@ -5324,7 +5400,7 @@ nla_put_failure:
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
|
||||
static int
|
||||
static gboolean
|
||||
link_gre_add (NMPlatform *platform,
|
||||
const char *name,
|
||||
const NMPlatformLnkGre *props,
|
||||
@@ -5333,14 +5409,6 @@ link_gre_add (NMPlatform *platform,
|
||||
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||
struct nlattr *info;
|
||||
struct nlattr *data;
|
||||
char buffer[INET_ADDRSTRLEN];
|
||||
|
||||
_LOGD (LOG_FMT_IP_TUNNEL,
|
||||
"gre",
|
||||
name,
|
||||
props->parent_ifindex,
|
||||
nm_utils_inet4_ntop (props->local, NULL),
|
||||
nm_utils_inet4_ntop (props->remote, buffer));
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
NLM_F_CREATE | NLM_F_EXCL,
|
||||
@@ -5354,7 +5422,7 @@ link_gre_add (NMPlatform *platform,
|
||||
if (!(info = nla_nest_start (nlmsg, IFLA_LINKINFO)))
|
||||
goto nla_put_failure;
|
||||
|
||||
NLA_PUT_STRING (nlmsg, IFLA_INFO_KIND, "gre");
|
||||
NLA_PUT_STRING (nlmsg, IFLA_INFO_KIND, props->is_tap ? "gretap" : "gre");
|
||||
|
||||
if (!(data = nla_nest_start (nlmsg, IFLA_INFO_DATA)))
|
||||
goto nla_put_failure;
|
||||
@@ -5368,18 +5436,20 @@ link_gre_add (NMPlatform *platform,
|
||||
NLA_PUT_U8 (nlmsg, IFLA_GRE_PMTUDISC, !!props->path_mtu_discovery);
|
||||
NLA_PUT_U32 (nlmsg, IFLA_GRE_IKEY, htonl (props->input_key));
|
||||
NLA_PUT_U32 (nlmsg, IFLA_GRE_OKEY, htonl (props->output_key));
|
||||
NLA_PUT_U32 (nlmsg, IFLA_GRE_IFLAGS, htons (props->input_flags));
|
||||
NLA_PUT_U32 (nlmsg, IFLA_GRE_OFLAGS, htons (props->output_flags));
|
||||
NLA_PUT_U16 (nlmsg, IFLA_GRE_IFLAGS, htons (props->input_flags));
|
||||
NLA_PUT_U16 (nlmsg, IFLA_GRE_OFLAGS, htons (props->output_flags));
|
||||
|
||||
nla_nest_end (nlmsg, data);
|
||||
nla_nest_end (nlmsg, info);
|
||||
|
||||
return do_add_link_with_lookup (platform, NM_LINK_TYPE_GRE, name, nlmsg, out_link);
|
||||
return do_add_link_with_lookup (platform,
|
||||
props->is_tap ? NM_LINK_TYPE_GRETAP : NM_LINK_TYPE_GRE,
|
||||
name, nlmsg, out_link);
|
||||
nla_put_failure:
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
|
||||
static int
|
||||
static gboolean
|
||||
link_ip6tnl_add (NMPlatform *platform,
|
||||
const char *name,
|
||||
const NMPlatformLnkIp6Tnl *props,
|
||||
@@ -5388,15 +5458,9 @@ link_ip6tnl_add (NMPlatform *platform,
|
||||
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||
struct nlattr *info;
|
||||
struct nlattr *data;
|
||||
char buffer[INET_ADDRSTRLEN];
|
||||
guint32 flowinfo;
|
||||
|
||||
_LOGD (LOG_FMT_IP_TUNNEL,
|
||||
"ip6tnl",
|
||||
name,
|
||||
props->parent_ifindex,
|
||||
nm_utils_inet6_ntop (&props->local, NULL),
|
||||
nm_utils_inet6_ntop (&props->remote, buffer));
|
||||
g_return_val_if_fail (!props->is_gre, FALSE);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
NLM_F_CREATE | NLM_F_EXCL,
|
||||
@@ -5441,7 +5505,69 @@ nla_put_failure:
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
|
||||
static int
|
||||
static gboolean
|
||||
link_ip6gre_add (NMPlatform *platform,
|
||||
const char *name,
|
||||
const NMPlatformLnkIp6Tnl *props,
|
||||
const NMPlatformLink **out_link)
|
||||
{
|
||||
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||
struct nlattr *info;
|
||||
struct nlattr *data;
|
||||
guint32 flowinfo;
|
||||
|
||||
g_return_val_if_fail (props->is_gre, FALSE);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
NLM_F_CREATE | NLM_F_EXCL,
|
||||
0,
|
||||
name,
|
||||
0,
|
||||
0);
|
||||
if (!nlmsg)
|
||||
return FALSE;
|
||||
|
||||
if (!(info = nla_nest_start (nlmsg, IFLA_LINKINFO)))
|
||||
goto nla_put_failure;
|
||||
|
||||
NLA_PUT_STRING (nlmsg, IFLA_INFO_KIND, props->is_tap ? "ip6gretap" : "ip6gre");
|
||||
|
||||
if (!(data = nla_nest_start (nlmsg, IFLA_INFO_DATA)))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (props->parent_ifindex)
|
||||
NLA_PUT_U32 (nlmsg, IFLA_GRE_LINK, props->parent_ifindex);
|
||||
|
||||
NLA_PUT_U32 (nlmsg, IFLA_GRE_IKEY, htonl (props->input_key));
|
||||
NLA_PUT_U32 (nlmsg, IFLA_GRE_OKEY, htonl (props->output_key));
|
||||
NLA_PUT_U16 (nlmsg, IFLA_GRE_IFLAGS, htons (props->input_flags));
|
||||
NLA_PUT_U16 (nlmsg, IFLA_GRE_OFLAGS, htons (props->output_flags));
|
||||
|
||||
if (memcmp (&props->local, &in6addr_any, sizeof (in6addr_any)))
|
||||
NLA_PUT (nlmsg, IFLA_GRE_LOCAL, sizeof (props->local), &props->local);
|
||||
if (memcmp (&props->remote, &in6addr_any, sizeof (in6addr_any)))
|
||||
NLA_PUT (nlmsg, IFLA_GRE_REMOTE, sizeof (props->remote), &props->remote);
|
||||
|
||||
NLA_PUT_U8 (nlmsg, IFLA_GRE_TTL, props->ttl);
|
||||
NLA_PUT_U8 (nlmsg, IFLA_GRE_ENCAP_LIMIT, props->encap_limit);
|
||||
|
||||
flowinfo = props->flow_label & IP6_FLOWINFO_FLOWLABEL_MASK;
|
||||
flowinfo |= (props->tclass << IP6_FLOWINFO_TCLASS_SHIFT)
|
||||
& IP6_FLOWINFO_TCLASS_MASK;
|
||||
NLA_PUT_U32 (nlmsg, IFLA_GRE_FLOWINFO, htonl (flowinfo));
|
||||
NLA_PUT_U32 (nlmsg, IFLA_GRE_FLAGS, props->flags);
|
||||
|
||||
nla_nest_end (nlmsg, data);
|
||||
nla_nest_end (nlmsg, info);
|
||||
|
||||
return do_add_link_with_lookup (platform,
|
||||
props->is_tap ? NM_LINK_TYPE_IP6GRETAP : NM_LINK_TYPE_IP6GRE,
|
||||
name, nlmsg, out_link);
|
||||
nla_put_failure:
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
link_ipip_add (NMPlatform *platform,
|
||||
const char *name,
|
||||
const NMPlatformLnkIpIp *props,
|
||||
@@ -5450,14 +5576,6 @@ link_ipip_add (NMPlatform *platform,
|
||||
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||
struct nlattr *info;
|
||||
struct nlattr *data;
|
||||
char buffer[INET_ADDRSTRLEN];
|
||||
|
||||
_LOGD (LOG_FMT_IP_TUNNEL,
|
||||
"ipip",
|
||||
name,
|
||||
props->parent_ifindex,
|
||||
nm_utils_inet4_ntop (props->local, NULL),
|
||||
nm_utils_inet4_ntop (props->remote, buffer));
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
NLM_F_CREATE | NLM_F_EXCL,
|
||||
@@ -5492,7 +5610,7 @@ nla_put_failure:
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
|
||||
static int
|
||||
static gboolean
|
||||
link_macsec_add (NMPlatform *platform,
|
||||
const char *name,
|
||||
int parent,
|
||||
@@ -5503,11 +5621,6 @@ link_macsec_add (NMPlatform *platform,
|
||||
struct nlattr *info;
|
||||
struct nlattr *data;
|
||||
|
||||
_LOGD ("adding macsec '%s' parent %u sci %llx",
|
||||
name,
|
||||
parent,
|
||||
(unsigned long long) props->sci);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
NLM_F_CREATE | NLM_F_EXCL,
|
||||
0,
|
||||
@@ -5554,7 +5667,7 @@ nla_put_failure:
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
|
||||
static int
|
||||
static gboolean
|
||||
link_macvlan_add (NMPlatform *platform,
|
||||
const char *name,
|
||||
int parent,
|
||||
@@ -5565,12 +5678,6 @@ link_macvlan_add (NMPlatform *platform,
|
||||
struct nlattr *info;
|
||||
struct nlattr *data;
|
||||
|
||||
_LOGD ("adding %s '%s' parent %u mode %u",
|
||||
props->tap ? "macvtap" : "macvlan",
|
||||
name,
|
||||
parent,
|
||||
props->mode);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
NLM_F_CREATE | NLM_F_EXCL,
|
||||
0,
|
||||
@@ -5603,7 +5710,7 @@ nla_put_failure:
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
|
||||
static int
|
||||
static gboolean
|
||||
link_sit_add (NMPlatform *platform,
|
||||
const char *name,
|
||||
const NMPlatformLnkSit *props,
|
||||
@@ -5612,14 +5719,6 @@ link_sit_add (NMPlatform *platform,
|
||||
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||
struct nlattr *info;
|
||||
struct nlattr *data;
|
||||
char buffer[INET_ADDRSTRLEN];
|
||||
|
||||
_LOGD (LOG_FMT_IP_TUNNEL,
|
||||
"sit",
|
||||
name,
|
||||
props->parent_ifindex,
|
||||
nm_utils_inet4_ntop (props->local, NULL),
|
||||
nm_utils_inet4_ntop (props->remote, buffer));
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
NLM_F_CREATE | NLM_F_EXCL,
|
||||
@@ -5723,9 +5822,6 @@ link_vxlan_add (NMPlatform *platform,
|
||||
|
||||
g_return_val_if_fail (props, FALSE);
|
||||
|
||||
_LOGD ("link: add vxlan '%s', parent %d, vxlan id %d",
|
||||
name, props->parent_ifindex, props->id);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
NLM_F_CREATE | NLM_F_EXCL,
|
||||
0,
|
||||
@@ -5912,9 +6008,6 @@ link_vlan_change (NMPlatform *platform,
|
||||
guint new_n_egress_map = 0;
|
||||
gs_free NMVlanQosMapping *new_ingress_map = NULL;
|
||||
gs_free NMVlanQosMapping *new_egress_map = NULL;
|
||||
char s_flags[64];
|
||||
char s_ingress[256];
|
||||
char s_egress[256];
|
||||
|
||||
obj_cache = nmp_cache_lookup_link (nm_platform_get_cache (platform), ifindex);
|
||||
if ( !obj_cache
|
||||
@@ -5945,26 +6038,6 @@ link_vlan_change (NMPlatform *platform,
|
||||
&new_egress_map,
|
||||
&new_n_egress_map);
|
||||
|
||||
_LOGD ("link: change %d: vlan:%s%s%s",
|
||||
ifindex,
|
||||
flags_mask
|
||||
? nm_sprintf_buf (s_flags, " flags 0x%x/0x%x", (unsigned) flags_set, (unsigned) flags_mask)
|
||||
: "",
|
||||
new_n_ingress_map
|
||||
? nm_platform_vlan_qos_mapping_to_string (" ingress-qos-map",
|
||||
new_ingress_map,
|
||||
new_n_ingress_map,
|
||||
s_ingress,
|
||||
sizeof (s_ingress))
|
||||
: "",
|
||||
new_n_egress_map
|
||||
? nm_platform_vlan_qos_mapping_to_string (" egress-qos-map",
|
||||
new_egress_map,
|
||||
new_n_egress_map,
|
||||
s_egress,
|
||||
sizeof (s_egress))
|
||||
: "");
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
0,
|
||||
ifindex,
|
||||
@@ -5991,8 +6064,6 @@ link_enslave (NMPlatform *platform, int master, int slave)
|
||||
nm_auto_nlmsg struct nl_msg *nlmsg = NULL;
|
||||
int ifindex = slave;
|
||||
|
||||
_LOGD ("link: change %d: enslave: master %d", slave, master);
|
||||
|
||||
nlmsg = _nl_msg_new_link (RTM_NEWLINK,
|
||||
0,
|
||||
ifindex,
|
||||
@@ -7388,6 +7459,7 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
|
||||
|
||||
platform_class->link_gre_add = link_gre_add;
|
||||
platform_class->link_ip6tnl_add = link_ip6tnl_add;
|
||||
platform_class->link_ip6gre_add = link_ip6gre_add;
|
||||
platform_class->link_macsec_add = link_macsec_add;
|
||||
platform_class->link_macvlan_add = link_macvlan_add;
|
||||
platform_class->link_ipip_add = link_ipip_add;
|
||||
|
@@ -74,8 +74,6 @@ G_STATIC_ASSERT (G_STRUCT_OFFSET (NMPlatformIPRoute, network_ptr) == G_STRUCT_OF
|
||||
} \
|
||||
} G_STMT_END
|
||||
|
||||
#define LOG_FMT_IP_TUNNEL "adding %s '%s' parent %u local %s remote %s"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static guint signals[_NM_PLATFORM_SIGNAL_ID_LAST] = { 0 };
|
||||
@@ -902,7 +900,7 @@ nm_platform_link_add (NMPlatform *self,
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD ("link: adding link '%s' of type '%s' (%d)"
|
||||
_LOGD ("link: adding link '%s': %s (%d)"
|
||||
"%s%s" /* address */
|
||||
"%s%s" /* veth peer */
|
||||
"",
|
||||
@@ -986,7 +984,7 @@ nm_platform_link_set_netns (NMPlatform *self, int ifindex, int netns_fd)
|
||||
if (!pllink)
|
||||
return FALSE;
|
||||
|
||||
_LOGD ("link: ifindex %d changing network namespace to %d", ifindex, netns_fd);
|
||||
_LOGD ("link: move link %d to network namespace with fd %d", ifindex, netns_fd);
|
||||
return klass->link_set_netns (self, ifindex, netns_fd);
|
||||
}
|
||||
|
||||
@@ -1355,15 +1353,18 @@ nm_platform_link_set_user_ipv6ll_enabled (NMPlatform *self, int ifindex, gboolea
|
||||
NMPlatformError
|
||||
nm_platform_link_set_address (NMPlatform *self, int ifindex, gconstpointer address, size_t length)
|
||||
{
|
||||
gs_free char *mac = NULL;
|
||||
|
||||
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
g_return_val_if_fail (ifindex > 0, NM_PLATFORM_ERROR_BUG);
|
||||
g_return_val_if_fail (address, NM_PLATFORM_ERROR_BUG);
|
||||
g_return_val_if_fail (length > 0, NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
_LOGD ("link: setting %s (%d) hardware address",
|
||||
_LOGD ("link: setting %s (%d) hardware address to %s",
|
||||
nm_strquote_a (20, nm_platform_link_get_name (self, ifindex)),
|
||||
ifindex);
|
||||
ifindex,
|
||||
(mac = nm_utils_hwaddr_ntoa (address, length)));
|
||||
return klass->link_set_address (self, ifindex, address, length);
|
||||
}
|
||||
|
||||
@@ -1853,6 +1854,12 @@ nm_platform_link_get_lnk_gre (NMPlatform *self, int ifindex, const NMPlatformLin
|
||||
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_GRE, out_link);
|
||||
}
|
||||
|
||||
const NMPlatformLnkGre *
|
||||
nm_platform_link_get_lnk_gretap (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
||||
{
|
||||
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_GRETAP, out_link);
|
||||
}
|
||||
|
||||
const NMPlatformLnkInfiniband *
|
||||
nm_platform_link_get_lnk_infiniband (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
||||
{
|
||||
@@ -1865,6 +1872,18 @@ nm_platform_link_get_lnk_ip6tnl (NMPlatform *self, int ifindex, const NMPlatform
|
||||
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_IP6TNL, out_link);
|
||||
}
|
||||
|
||||
const NMPlatformLnkIp6Tnl *
|
||||
nm_platform_link_get_lnk_ip6gre (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
||||
{
|
||||
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_IP6GRE, out_link);
|
||||
}
|
||||
|
||||
const NMPlatformLnkIp6Tnl *
|
||||
nm_platform_link_get_lnk_ip6gretap (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
||||
{
|
||||
return _link_get_lnk (self, ifindex, NM_LINK_TYPE_IP6GRETAP, out_link);
|
||||
}
|
||||
|
||||
const NMPlatformLnkIpIp *
|
||||
nm_platform_link_get_lnk_ipip (NMPlatform *self, int ifindex, const NMPlatformLink **out_link)
|
||||
{
|
||||
@@ -1997,8 +2016,9 @@ nm_platform_link_vlan_add (NMPlatform *self,
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD ("link: adding vlan '%s' parent %d vlanid %d vlanflags %x",
|
||||
_LOGD ("link: adding link '%s': vlan parent %d vlanid %d vlanflags %x",
|
||||
name, parent, vlanid, vlanflags);
|
||||
|
||||
if (!klass->vlan_add (self, name, parent, vlanid, vlanflags, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
return NM_PLATFORM_ERROR_SUCCESS;
|
||||
@@ -2029,8 +2049,9 @@ nm_platform_link_vxlan_add (NMPlatform *self,
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD ("link: adding vxlan '%s' parent %d id %d",
|
||||
name, props->parent_ifindex, props->id);
|
||||
_LOGD ("link: adding link '%s': %s",
|
||||
name, nm_platform_lnk_vxlan_to_string (props, NULL, 0));
|
||||
|
||||
if (!klass->link_vxlan_add (self, name, props, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
return NM_PLATFORM_ERROR_SUCCESS;
|
||||
@@ -2081,8 +2102,9 @@ nm_platform_link_tun_add (NMPlatform *self,
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD ("link: adding tun '%s' %s",
|
||||
_LOGD ("link: adding link '%s': %s",
|
||||
name, nm_platform_lnk_tun_to_string (props, b, sizeof (b)));
|
||||
|
||||
if (!klass->link_tun_add (self, name, props, out_link, out_fd))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
return NM_PLATFORM_ERROR_SUCCESS;
|
||||
@@ -2113,7 +2135,7 @@ nm_platform_link_6lowpan_add (NMPlatform *self,
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD ("adding 6lowpan '%s' parent %u", name, parent);
|
||||
_LOGD ("adding link '%s': 6lowpan parent %u", name, parent);
|
||||
|
||||
if (!klass->link_6lowpan_add (self, name, parent, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
@@ -2375,23 +2397,18 @@ nm_platform_link_gre_add (NMPlatform *self,
|
||||
const NMPlatformLink **out_link)
|
||||
{
|
||||
NMPlatformError plerr;
|
||||
char buffer[INET_ADDRSTRLEN];
|
||||
|
||||
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
||||
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_GRE, out_link);
|
||||
plerr = _link_add_check_existing (self, name, props->is_tap ? NM_LINK_TYPE_GRETAP : NM_LINK_TYPE_GRE, out_link);
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD (LOG_FMT_IP_TUNNEL,
|
||||
"gre",
|
||||
name,
|
||||
props->parent_ifindex,
|
||||
nm_utils_inet4_ntop (props->local, NULL),
|
||||
nm_utils_inet4_ntop (props->remote, buffer));
|
||||
_LOGD ("adding link '%s': %s",
|
||||
name, nm_platform_lnk_gre_to_string (props, NULL, 0));
|
||||
|
||||
if (!klass->link_gre_add (self, name, props, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
@@ -2437,6 +2454,9 @@ _infiniband_add_add_or_delete (NMPlatform *self,
|
||||
if (!klass->infiniband_partition_add (self, parent, p_key, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
} else {
|
||||
_LOGD ("link: deleting infiniband partition %s for parent '%s' (%d), key %d",
|
||||
name, parent_link->name, parent, p_key);
|
||||
|
||||
if (!klass->infiniband_partition_delete (self, parent, p_key))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
}
|
||||
@@ -2537,29 +2557,65 @@ nm_platform_link_ip6tnl_add (NMPlatform *self,
|
||||
const NMPlatformLink **out_link)
|
||||
{
|
||||
NMPlatformError plerr;
|
||||
char buffer[INET6_ADDRSTRLEN];
|
||||
|
||||
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
||||
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
||||
g_return_val_if_fail (!props->is_gre, NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_IP6TNL, out_link);
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD (LOG_FMT_IP_TUNNEL,
|
||||
"ip6tnl",
|
||||
name,
|
||||
props->parent_ifindex,
|
||||
nm_utils_inet6_ntop (&props->local, NULL),
|
||||
nm_utils_inet6_ntop (&props->remote, buffer));
|
||||
_LOGD ("adding link '%s': %s",
|
||||
name, nm_platform_lnk_ip6tnl_to_string (props, NULL, 0));
|
||||
|
||||
if (!klass->link_ip6tnl_add (self, name, props, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
return NM_PLATFORM_ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_platform_ip6gre_add:
|
||||
* @self: platform instance
|
||||
* @name: name of the new interface
|
||||
* @props: interface properties
|
||||
* @out_link: on success, the link object
|
||||
*
|
||||
* Create an IPv6 GRE/GRETAP tunnel.
|
||||
*/
|
||||
NMPlatformError
|
||||
nm_platform_link_ip6gre_add (NMPlatform *self,
|
||||
const char *name,
|
||||
const NMPlatformLnkIp6Tnl *props,
|
||||
const NMPlatformLink **out_link)
|
||||
{
|
||||
NMPlatformError plerr;
|
||||
|
||||
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
g_return_val_if_fail (props, NM_PLATFORM_ERROR_BUG);
|
||||
g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
|
||||
g_return_val_if_fail (props->is_gre, NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
plerr = _link_add_check_existing (self,
|
||||
name,
|
||||
props->is_tap
|
||||
? NM_LINK_TYPE_IP6GRETAP
|
||||
: NM_LINK_TYPE_IP6GRE,
|
||||
out_link);
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD ("adding link '%s': %s",
|
||||
name, nm_platform_lnk_ip6tnl_to_string (props, NULL, 0));
|
||||
|
||||
if (!klass->link_ip6gre_add (self, name, props, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
return NM_PLATFORM_ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_platform_ipip_add:
|
||||
* @self: platform instance
|
||||
@@ -2576,7 +2632,6 @@ nm_platform_link_ipip_add (NMPlatform *self,
|
||||
const NMPlatformLink **out_link)
|
||||
{
|
||||
NMPlatformError plerr;
|
||||
char buffer[INET_ADDRSTRLEN];
|
||||
|
||||
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
@@ -2587,12 +2642,8 @@ nm_platform_link_ipip_add (NMPlatform *self,
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD (LOG_FMT_IP_TUNNEL,
|
||||
"ipip",
|
||||
name,
|
||||
props->parent_ifindex,
|
||||
nm_utils_inet4_ntop (props->local, NULL),
|
||||
nm_utils_inet4_ntop (props->remote, buffer));
|
||||
_LOGD ("adding link '%s': %s",
|
||||
name, nm_platform_lnk_ipip_to_string (props, NULL, 0));
|
||||
|
||||
if (!klass->link_ipip_add (self, name, props, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
@@ -2627,10 +2678,8 @@ nm_platform_link_macsec_add (NMPlatform *self,
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD ("adding macsec '%s' parent %u sci %llx",
|
||||
name,
|
||||
parent,
|
||||
(unsigned long long) props->sci);
|
||||
_LOGD ("adding link '%s': %s",
|
||||
name, nm_platform_lnk_macsec_to_string (props, NULL, 0));
|
||||
|
||||
if (!klass->link_macsec_add (self, name, parent, props, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
@@ -2667,11 +2716,8 @@ nm_platform_link_macvlan_add (NMPlatform *self,
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD ("adding %s '%s' parent %u mode %u",
|
||||
props->tap ? "macvtap" : "macvlan",
|
||||
name,
|
||||
parent,
|
||||
props->mode);
|
||||
_LOGD ("adding link '%s': %s",
|
||||
name, nm_platform_lnk_macvlan_to_string (props, NULL, 0));
|
||||
|
||||
if (!klass->link_macvlan_add (self, name, parent, props, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
@@ -2694,7 +2740,6 @@ nm_platform_link_sit_add (NMPlatform *self,
|
||||
const NMPlatformLink **out_link)
|
||||
{
|
||||
NMPlatformError plerr;
|
||||
char buffer[INET_ADDRSTRLEN];
|
||||
|
||||
_CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
|
||||
|
||||
@@ -2705,12 +2750,8 @@ nm_platform_link_sit_add (NMPlatform *self,
|
||||
if (plerr != NM_PLATFORM_ERROR_SUCCESS)
|
||||
return plerr;
|
||||
|
||||
_LOGD (LOG_FMT_IP_TUNNEL,
|
||||
"sit",
|
||||
name,
|
||||
props->parent_ifindex,
|
||||
nm_utils_inet4_ntop (props->local, NULL),
|
||||
nm_utils_inet4_ntop (props->remote, buffer));
|
||||
_LOGD ("adding link '%s': %s",
|
||||
name, nm_platform_lnk_sit_to_string (props, NULL, 0));
|
||||
|
||||
if (!klass->link_sit_add (self, name, props, out_link))
|
||||
return NM_PLATFORM_ERROR_UNSPECIFIED;
|
||||
@@ -5073,7 +5114,7 @@ nm_platform_lnk_gre_to_string (const NMPlatformLnkGre *lnk, char *buf, gsize len
|
||||
return buf;
|
||||
|
||||
g_snprintf (buf, len,
|
||||
"gre"
|
||||
lnk->is_tap ? "gretap" : "gre"
|
||||
"%s" /* remote */
|
||||
"%s" /* local */
|
||||
"%s" /* parent_ifindex */
|
||||
@@ -5130,12 +5171,18 @@ nm_platform_lnk_ip6tnl_to_string (const NMPlatformLnkIp6Tnl *lnk, char *buf, gsi
|
||||
char str_encap[30];
|
||||
char str_proto[30];
|
||||
char str_parent_ifindex[30];
|
||||
char *str_type;
|
||||
|
||||
if (!nm_utils_to_string_buffer_init_null (lnk, &buf, &len))
|
||||
return buf;
|
||||
|
||||
if (lnk->is_gre)
|
||||
str_type = lnk->is_tap ? "ip6gretap" : "ip6gre";
|
||||
else
|
||||
str_type = "ip6tnl";
|
||||
|
||||
g_snprintf (buf, len,
|
||||
"ip6tnl"
|
||||
"%s" /* type */
|
||||
"%s" /* remote */
|
||||
"%s" /* local */
|
||||
"%s" /* parent_ifindex */
|
||||
@@ -5146,6 +5193,7 @@ nm_platform_lnk_ip6tnl_to_string (const NMPlatformLnkIp6Tnl *lnk, char *buf, gsi
|
||||
"%s" /* proto */
|
||||
" flags 0x%x"
|
||||
"",
|
||||
str_type,
|
||||
nm_sprintf_buf (str_remote, " remote %s", nm_utils_inet6_ntop (&lnk->remote, str_remote1)),
|
||||
nm_sprintf_buf (str_local, " local %s", nm_utils_inet6_ntop (&lnk->local, str_local1)),
|
||||
lnk->parent_ifindex ? nm_sprintf_buf (str_parent_ifindex, " dev %d", lnk->parent_ifindex) : "",
|
||||
@@ -5230,7 +5278,8 @@ nm_platform_lnk_macvlan_to_string (const NMPlatformLnkMacvlan *lnk, char *buf, g
|
||||
return buf;
|
||||
|
||||
g_snprintf (buf, len,
|
||||
"macvlan mode %u %s",
|
||||
"%s mode %u %s",
|
||||
lnk->tap ? "macvtap" : "macvlan",
|
||||
lnk->mode,
|
||||
lnk->no_promisc ? "not-promisc" : "promisc");
|
||||
return buf;
|
||||
@@ -5959,7 +6008,8 @@ nm_platform_lnk_gre_hash_update (const NMPlatformLnkGre *obj, NMHashState *h)
|
||||
obj->output_key,
|
||||
obj->ttl,
|
||||
obj->tos,
|
||||
(bool) obj->path_mtu_discovery);
|
||||
(bool) obj->path_mtu_discovery,
|
||||
(bool) obj->is_tap);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -5976,6 +6026,7 @@ nm_platform_lnk_gre_cmp (const NMPlatformLnkGre *a, const NMPlatformLnkGre *b)
|
||||
NM_CMP_FIELD (a, b, ttl);
|
||||
NM_CMP_FIELD (a, b, tos);
|
||||
NM_CMP_FIELD_BOOL (a, b, path_mtu_discovery);
|
||||
NM_CMP_FIELD_BOOL (a, b, is_tap);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6007,7 +6058,13 @@ nm_platform_lnk_ip6tnl_hash_update (const NMPlatformLnkIp6Tnl *obj, NMHashState
|
||||
obj->encap_limit,
|
||||
obj->proto,
|
||||
obj->flow_label,
|
||||
obj->flags);
|
||||
obj->flags,
|
||||
obj->input_flags,
|
||||
obj->output_flags,
|
||||
obj->input_key,
|
||||
obj->output_key,
|
||||
(bool) obj->is_gre,
|
||||
(bool) obj->is_tap);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -6023,6 +6080,12 @@ nm_platform_lnk_ip6tnl_cmp (const NMPlatformLnkIp6Tnl *a, const NMPlatformLnkIp6
|
||||
NM_CMP_FIELD (a, b, flow_label);
|
||||
NM_CMP_FIELD (a, b, proto);
|
||||
NM_CMP_FIELD (a, b, flags);
|
||||
NM_CMP_FIELD (a, b, input_flags);
|
||||
NM_CMP_FIELD (a, b, output_flags);
|
||||
NM_CMP_FIELD (a, b, input_key);
|
||||
NM_CMP_FIELD (a, b, output_key);
|
||||
NM_CMP_FIELD_BOOL (a, b, is_gre);
|
||||
NM_CMP_FIELD_BOOL (a, b, is_tap);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -618,6 +618,7 @@ typedef struct {
|
||||
guint8 ttl;
|
||||
guint8 tos;
|
||||
bool path_mtu_discovery:1;
|
||||
bool is_tap:1;
|
||||
} NMPlatformLnkGre;
|
||||
|
||||
typedef struct {
|
||||
@@ -635,6 +636,14 @@ typedef struct {
|
||||
guint8 proto;
|
||||
guint flow_label;
|
||||
guint32 flags;
|
||||
|
||||
/* IP6GRE only */
|
||||
guint32 input_key;
|
||||
guint32 output_key;
|
||||
guint16 input_flags;
|
||||
guint16 output_flags;
|
||||
bool is_tap:1;
|
||||
bool is_gre:1;
|
||||
} NMPlatformLnkIp6Tnl;
|
||||
|
||||
typedef struct {
|
||||
@@ -829,6 +838,10 @@ typedef struct {
|
||||
const char *name,
|
||||
const NMPlatformLnkIp6Tnl *props,
|
||||
const NMPlatformLink **out_link);
|
||||
gboolean (*link_ip6gre_add) (NMPlatform *,
|
||||
const char *name,
|
||||
const NMPlatformLnkIp6Tnl *props,
|
||||
const NMPlatformLink **out_link);
|
||||
gboolean (*link_ipip_add) (NMPlatform *,
|
||||
const char *name,
|
||||
const NMPlatformLnkIpIp *props,
|
||||
@@ -1198,7 +1211,10 @@ char *nm_platform_sysctl_slave_get_option (NMPlatform *self, int ifindex, const
|
||||
|
||||
const NMPObject *nm_platform_link_get_lnk (NMPlatform *self, int ifindex, NMLinkType link_type, const NMPlatformLink **out_link);
|
||||
const NMPlatformLnkGre *nm_platform_link_get_lnk_gre (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||
const NMPlatformLnkGre *nm_platform_link_get_lnk_gretap (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||
const NMPlatformLnkIp6Tnl *nm_platform_link_get_lnk_ip6tnl (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||
const NMPlatformLnkIp6Tnl *nm_platform_link_get_lnk_ip6gre (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||
const NMPlatformLnkIp6Tnl *nm_platform_link_get_lnk_ip6gretap (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||
const NMPlatformLnkIpIp *nm_platform_link_get_lnk_ipip (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||
const NMPlatformLnkInfiniband *nm_platform_link_get_lnk_infiniband (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||
const NMPlatformLnkIpIp *nm_platform_link_get_lnk_ipip (NMPlatform *self, int ifindex, const NMPlatformLink **out_link);
|
||||
@@ -1283,6 +1299,10 @@ NMPlatformError nm_platform_link_ip6tnl_add (NMPlatform *self,
|
||||
const char *name,
|
||||
const NMPlatformLnkIp6Tnl *props,
|
||||
const NMPlatformLink **out_link);
|
||||
NMPlatformError nm_platform_link_ip6gre_add (NMPlatform *self,
|
||||
const char *name,
|
||||
const NMPlatformLnkIp6Tnl *props,
|
||||
const NMPlatformLink **out_link);
|
||||
NMPlatformError nm_platform_link_ipip_add (NMPlatform *self,
|
||||
const char *name,
|
||||
const NMPlatformLnkIpIp *props,
|
||||
|
@@ -2712,6 +2712,17 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
|
||||
.cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_gre_hash_update,
|
||||
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_gre_cmp,
|
||||
},
|
||||
[NMP_OBJECT_TYPE_LNK_GRETAP - 1] = {
|
||||
.parent = DEDUP_MULTI_OBJ_CLASS_INIT(),
|
||||
.obj_type = NMP_OBJECT_TYPE_LNK_GRETAP,
|
||||
.sizeof_data = sizeof (NMPObjectLnkGre),
|
||||
.sizeof_public = sizeof (NMPlatformLnkGre),
|
||||
.obj_type_name = "gretap",
|
||||
.lnk_link_type = NM_LINK_TYPE_GRETAP,
|
||||
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_gre_to_string,
|
||||
.cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_gre_hash_update,
|
||||
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_gre_cmp,
|
||||
},
|
||||
[NMP_OBJECT_TYPE_LNK_INFINIBAND - 1] = {
|
||||
.parent = DEDUP_MULTI_OBJ_CLASS_INIT(),
|
||||
.obj_type = NMP_OBJECT_TYPE_LNK_INFINIBAND,
|
||||
@@ -2734,6 +2745,28 @@ const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
|
||||
.cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_ip6tnl_hash_update,
|
||||
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ip6tnl_cmp,
|
||||
},
|
||||
[NMP_OBJECT_TYPE_LNK_IP6GRE - 1] = {
|
||||
.parent = DEDUP_MULTI_OBJ_CLASS_INIT(),
|
||||
.obj_type = NMP_OBJECT_TYPE_LNK_IP6GRE,
|
||||
.sizeof_data = sizeof (NMPObjectLnkIp6Tnl),
|
||||
.sizeof_public = sizeof (NMPlatformLnkIp6Tnl),
|
||||
.obj_type_name = "ip6gre",
|
||||
.lnk_link_type = NM_LINK_TYPE_IP6GRE,
|
||||
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_ip6tnl_to_string,
|
||||
.cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_ip6tnl_hash_update,
|
||||
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ip6tnl_cmp,
|
||||
},
|
||||
[NMP_OBJECT_TYPE_LNK_IP6GRETAP - 1] = {
|
||||
.parent = DEDUP_MULTI_OBJ_CLASS_INIT(),
|
||||
.obj_type = NMP_OBJECT_TYPE_LNK_IP6GRETAP,
|
||||
.sizeof_data = sizeof (NMPObjectLnkIp6Tnl),
|
||||
.sizeof_public = sizeof (NMPlatformLnkIp6Tnl),
|
||||
.obj_type_name = "ip6gretap",
|
||||
.lnk_link_type = NM_LINK_TYPE_IP6GRETAP,
|
||||
.cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj, char *buf, gsize len)) nm_platform_lnk_ip6tnl_to_string,
|
||||
.cmd_plobj_hash_update = (void (*) (const NMPlatformObject *obj, NMHashState *h)) nm_platform_lnk_ip6tnl_hash_update,
|
||||
.cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_lnk_ip6tnl_cmp,
|
||||
},
|
||||
[NMP_OBJECT_TYPE_LNK_IPIP - 1] = {
|
||||
.parent = DEDUP_MULTI_OBJ_CLASS_INIT(),
|
||||
.obj_type = NMP_OBJECT_TYPE_LNK_IPIP,
|
||||
|
@@ -1243,21 +1243,29 @@ nmtstp_link_gre_add (NMPlatform *platform,
|
||||
const NMPlatformLink *pllink = NULL;
|
||||
gboolean success;
|
||||
char buffer[INET_ADDRSTRLEN];
|
||||
NMLinkType link_type;
|
||||
|
||||
g_assert (nm_utils_is_valid_iface_name (name, NULL));
|
||||
|
||||
external_command = nmtstp_run_command_check_external (external_command);
|
||||
link_type = lnk->is_tap ? NM_LINK_TYPE_GRETAP : NM_LINK_TYPE_GRE;
|
||||
|
||||
_init_platform (&platform, external_command);
|
||||
|
||||
if (external_command) {
|
||||
gs_free char *dev = NULL;
|
||||
char *obj, *type;
|
||||
|
||||
if (lnk->parent_ifindex)
|
||||
dev = g_strdup_printf ("dev %s", nm_platform_link_get_name (platform, lnk->parent_ifindex));
|
||||
|
||||
success = !nmtstp_run_command ("ip tunnel add %s mode gre %s local %s remote %s ttl %u tos %02x %s",
|
||||
obj = lnk->is_tap ? "link" : "tunnel";
|
||||
type = lnk->is_tap ? "type gretap" : "mode gre";
|
||||
|
||||
success = !nmtstp_run_command ("ip %s add %s %s %s local %s remote %s ttl %u tos %02x %s",
|
||||
obj,
|
||||
name,
|
||||
type,
|
||||
dev ?: "",
|
||||
nm_utils_inet4_ntop (lnk->local, NULL),
|
||||
nm_utils_inet4_ntop (lnk->remote, buffer),
|
||||
@@ -1265,11 +1273,11 @@ nmtstp_link_gre_add (NMPlatform *platform,
|
||||
lnk->tos,
|
||||
lnk->path_mtu_discovery ? "pmtudisc" : "nopmtudisc");
|
||||
if (success)
|
||||
pllink = nmtstp_assert_wait_for_link (platform, name, NM_LINK_TYPE_GRE, 100);
|
||||
pllink = nmtstp_assert_wait_for_link (platform, name, link_type, 100);
|
||||
} else
|
||||
success = nm_platform_link_gre_add (platform, name, lnk, &pllink) == NM_PLATFORM_ERROR_SUCCESS;
|
||||
|
||||
_assert_pllink (platform, success, pllink, name, NM_LINK_TYPE_GRE);
|
||||
_assert_pllink (platform, success, pllink, name, link_type);
|
||||
|
||||
return pllink;
|
||||
}
|
||||
@@ -1289,6 +1297,7 @@ nmtstp_link_ip6tnl_add (NMPlatform *platform,
|
||||
gboolean tclass_inherit;
|
||||
|
||||
g_assert (nm_utils_is_valid_iface_name (name, NULL));
|
||||
g_assert (!lnk->is_gre);
|
||||
|
||||
external_command = nmtstp_run_command_check_external (external_command);
|
||||
|
||||
@@ -1335,6 +1344,56 @@ nmtstp_link_ip6tnl_add (NMPlatform *platform,
|
||||
return pllink;
|
||||
}
|
||||
|
||||
const NMPlatformLink *
|
||||
nmtstp_link_ip6gre_add (NMPlatform *platform,
|
||||
gboolean external_command,
|
||||
const char *name,
|
||||
const NMPlatformLnkIp6Tnl *lnk)
|
||||
{
|
||||
const NMPlatformLink *pllink = NULL;
|
||||
gboolean success;
|
||||
char buffer[INET6_ADDRSTRLEN];
|
||||
char tclass[20];
|
||||
gboolean tclass_inherit;
|
||||
|
||||
g_assert (nm_utils_is_valid_iface_name (name, NULL));
|
||||
g_assert (lnk->is_gre);
|
||||
|
||||
external_command = nmtstp_run_command_check_external (external_command);
|
||||
|
||||
_init_platform (&platform, external_command);
|
||||
|
||||
if (external_command) {
|
||||
gs_free char *dev = NULL;
|
||||
|
||||
if (lnk->parent_ifindex)
|
||||
dev = g_strdup_printf ("dev %s", nm_platform_link_get_name (platform, lnk->parent_ifindex));
|
||||
|
||||
tclass_inherit = NM_FLAGS_HAS (lnk->flags, IP6_TNL_F_USE_ORIG_TCLASS);
|
||||
|
||||
success = !nmtstp_run_command ("ip link add %s type %s %s local %s remote %s ttl %u tclass %s flowlabel %x",
|
||||
name,
|
||||
lnk->is_tap ? "ip6gretap" : "ip6gre",
|
||||
dev,
|
||||
nm_utils_inet6_ntop (&lnk->local, NULL),
|
||||
nm_utils_inet6_ntop (&lnk->remote, buffer),
|
||||
lnk->ttl,
|
||||
tclass_inherit ? "inherit" : nm_sprintf_buf (tclass, "%02x", lnk->tclass),
|
||||
lnk->flow_label);
|
||||
if (success) {
|
||||
pllink = nmtstp_assert_wait_for_link (platform,
|
||||
name,
|
||||
lnk->is_tap ? NM_LINK_TYPE_IP6GRETAP : NM_LINK_TYPE_IP6GRE,
|
||||
100);
|
||||
}
|
||||
} else
|
||||
success = nm_platform_link_ip6gre_add (platform, name, lnk, &pllink) == NM_PLATFORM_ERROR_SUCCESS;
|
||||
|
||||
_assert_pllink (platform, success, pllink, name, lnk->is_tap ? NM_LINK_TYPE_IP6GRETAP : NM_LINK_TYPE_IP6GRE);
|
||||
|
||||
return pllink;
|
||||
}
|
||||
|
||||
const NMPlatformLink *
|
||||
nmtstp_link_ipip_add (NMPlatform *platform,
|
||||
gboolean external_command,
|
||||
|
@@ -297,6 +297,10 @@ const NMPlatformLink *nmtstp_link_ip6tnl_add (NMPlatform *platform,
|
||||
gboolean external_command,
|
||||
const char *name,
|
||||
const NMPlatformLnkIp6Tnl *lnk);
|
||||
const NMPlatformLink *nmtstp_link_ip6gre_add (NMPlatform *platform,
|
||||
gboolean external_command,
|
||||
const char *name,
|
||||
const NMPlatformLnkIp6Tnl *lnk);
|
||||
const NMPlatformLink *nmtstp_link_ipip_add (NMPlatform *platform,
|
||||
gboolean external_command,
|
||||
const char *name,
|
||||
|
@@ -699,6 +699,7 @@ test_software_detect (gconstpointer user_data)
|
||||
guint i_step;
|
||||
const gboolean ext = test_data->external_command;
|
||||
NMPlatformLnkTun lnk_tun;
|
||||
NMPlatformLnkGre lnk_gre = { };
|
||||
nm_auto_close int tun_fd = -1;
|
||||
|
||||
nmtstp_run_command_check ("ip link add %s type dummy", PARENT_NAME);
|
||||
@@ -706,7 +707,6 @@ test_software_detect (gconstpointer user_data)
|
||||
|
||||
switch (test_data->link_type) {
|
||||
case NM_LINK_TYPE_GRE: {
|
||||
NMPlatformLnkGre lnk_gre = { };
|
||||
gboolean gracefully_skip = FALSE;
|
||||
|
||||
lnk_gre.local = nmtst_inet4_from_string ("192.168.233.204");
|
||||
@@ -730,6 +730,31 @@ test_software_detect (gconstpointer user_data)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NM_LINK_TYPE_GRETAP: {
|
||||
gboolean gracefully_skip = FALSE;
|
||||
|
||||
lnk_gre.local = nmtst_inet4_from_string ("192.168.1.133");
|
||||
lnk_gre.remote = nmtst_inet4_from_string ("172.168.101.2");
|
||||
lnk_gre.parent_ifindex = ifindex_parent;
|
||||
lnk_gre.ttl = 39;
|
||||
lnk_gre.tos = 12;
|
||||
lnk_gre.path_mtu_discovery = FALSE;
|
||||
lnk_gre.is_tap = TRUE;
|
||||
|
||||
if (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, "gretap0")) {
|
||||
/* Seems that the ip_gre module is not loaded... try to load it. */
|
||||
gracefully_skip = nm_utils_modprobe (NULL, TRUE, "ip_gre", NULL) != 0;
|
||||
}
|
||||
|
||||
if (!nmtstp_link_gre_add (NULL, ext, DEVICE_NAME, &lnk_gre)) {
|
||||
if (gracefully_skip) {
|
||||
g_test_skip ("Cannot create gretap tunnel because of missing ip_gre module (modprobe ip_gre)");
|
||||
goto out_delete_parent;
|
||||
}
|
||||
g_error ("Failed adding GRETAP tunnel");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NM_LINK_TYPE_IPIP: {
|
||||
NMPlatformLnkIpIp lnk_ipip = { };
|
||||
gboolean gracefully_skip = FALSE;
|
||||
@@ -794,6 +819,58 @@ test_software_detect (gconstpointer user_data)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NM_LINK_TYPE_IP6GRE: {
|
||||
NMPlatformLnkIp6Tnl lnk_ip6tnl = { };
|
||||
gboolean gracefully_skip = FALSE;
|
||||
|
||||
if (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, "ip6gre0")) {
|
||||
/* Seems that the ip6_tunnel module is not loaded... try to load it. */
|
||||
gracefully_skip = nm_utils_modprobe (NULL, TRUE, "ip6_gre", NULL) != 0;
|
||||
}
|
||||
|
||||
lnk_ip6tnl.local = *nmtst_inet6_from_string ("fd01::42");
|
||||
lnk_ip6tnl.remote = *nmtst_inet6_from_string ("fd01::aaaa");
|
||||
lnk_ip6tnl.parent_ifindex = ifindex_parent;
|
||||
lnk_ip6tnl.tclass = 21;
|
||||
lnk_ip6tnl.flow_label = 1338;
|
||||
lnk_ip6tnl.is_gre = TRUE;
|
||||
|
||||
if (!nmtstp_link_ip6gre_add (NULL, ext, DEVICE_NAME, &lnk_ip6tnl)) {
|
||||
if (gracefully_skip) {
|
||||
g_test_skip ("Cannot create ip6gre tunnel because of missing ip6_gre module (modprobe ip6_gre)");
|
||||
goto out_delete_parent;
|
||||
}
|
||||
g_error ("Failed adding IP6GRE tunnel");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NM_LINK_TYPE_IP6GRETAP: {
|
||||
NMPlatformLnkIp6Tnl lnk_ip6tnl = { };
|
||||
gboolean gracefully_skip = FALSE;
|
||||
|
||||
if (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, "ip6gre0")) {
|
||||
/* Seems that the ip6_tunnel module is not loaded... try to load it. */
|
||||
gracefully_skip = nm_utils_modprobe (NULL, TRUE, "ip6_gre", NULL) != 0;
|
||||
}
|
||||
|
||||
lnk_ip6tnl.local = *nmtst_inet6_from_string ("fe80::abcd");
|
||||
lnk_ip6tnl.remote = *nmtst_inet6_from_string ("fc01::bbbb");
|
||||
lnk_ip6tnl.parent_ifindex = ifindex_parent;
|
||||
lnk_ip6tnl.ttl = 10;
|
||||
lnk_ip6tnl.tclass = 22;
|
||||
lnk_ip6tnl.flow_label = 1339;
|
||||
lnk_ip6tnl.is_gre = TRUE;
|
||||
lnk_ip6tnl.is_tap = TRUE;
|
||||
|
||||
if (!nmtstp_link_ip6gre_add (NULL, ext, DEVICE_NAME, &lnk_ip6tnl)) {
|
||||
if (gracefully_skip) {
|
||||
g_test_skip ("Cannot create ip6gretap tunnel because of missing ip6_gre module (modprobe ip6_gre)");
|
||||
goto out_delete_parent;
|
||||
}
|
||||
g_error ("Failed adding IP6GRETAP tunnel");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NM_LINK_TYPE_MACVLAN: {
|
||||
NMPlatformLnkMacvlan lnk_macvlan = { };
|
||||
const NMPlatformLink *dummy;
|
||||
@@ -970,16 +1047,15 @@ test_software_detect (gconstpointer user_data)
|
||||
const NMPlatformLnkGre *plnk = &lnk->lnk_gre;
|
||||
|
||||
g_assert (plnk == nm_platform_link_get_lnk_gre (NM_PLATFORM_GET, ifindex, NULL));
|
||||
g_assert_cmpint (plnk->parent_ifindex, ==, ifindex_parent);
|
||||
g_assert_cmpint (plnk->input_flags, ==, 0);
|
||||
g_assert_cmpint (plnk->output_flags, ==, 0);
|
||||
g_assert_cmpint (plnk->input_key, ==, 0);
|
||||
g_assert_cmpint (plnk->output_key, ==, 0);
|
||||
nmtst_assert_ip4_address (plnk->local, "192.168.233.204");
|
||||
nmtst_assert_ip4_address (plnk->remote, "172.168.10.25");
|
||||
g_assert_cmpint (plnk->ttl, ==, 174);
|
||||
g_assert_cmpint (plnk->tos, ==, 37);
|
||||
g_assert_cmpint (plnk->path_mtu_discovery, ==, TRUE);
|
||||
g_assert (nm_platform_lnk_gre_cmp (plnk, &lnk_gre) == 0);
|
||||
|
||||
break;
|
||||
}
|
||||
case NM_LINK_TYPE_GRETAP: {
|
||||
const NMPlatformLnkGre *plnk = &lnk->lnk_gre;
|
||||
|
||||
g_assert (plnk == nm_platform_link_get_lnk_gretap (NM_PLATFORM_GET, ifindex, NULL));
|
||||
g_assert (nm_platform_lnk_gre_cmp (plnk, &lnk_gre) == 0);
|
||||
break;
|
||||
}
|
||||
case NM_LINK_TYPE_IP6TNL: {
|
||||
@@ -1012,6 +1088,33 @@ test_software_detect (gconstpointer user_data)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NM_LINK_TYPE_IP6GRE: {
|
||||
const NMPlatformLnkIp6Tnl *plnk = &lnk->lnk_ip6tnl;
|
||||
|
||||
g_assert (plnk == nm_platform_link_get_lnk_ip6gre (NM_PLATFORM_GET, ifindex, NULL));
|
||||
g_assert_cmpint (plnk->parent_ifindex, ==, ifindex_parent);
|
||||
nmtst_assert_ip6_address (&plnk->local, "fd01::42");
|
||||
nmtst_assert_ip6_address (&plnk->remote, "fd01::aaaa");
|
||||
g_assert_cmpint (plnk->tclass, ==, 21);
|
||||
g_assert_cmpint (plnk->flow_label, ==, 1338);
|
||||
g_assert_cmpint (plnk->is_gre, ==, TRUE);
|
||||
g_assert_cmpint (plnk->is_tap, ==, FALSE);
|
||||
break;
|
||||
}
|
||||
case NM_LINK_TYPE_IP6GRETAP: {
|
||||
const NMPlatformLnkIp6Tnl *plnk = &lnk->lnk_ip6tnl;
|
||||
|
||||
g_assert (plnk == nm_platform_link_get_lnk_ip6gretap (NM_PLATFORM_GET, ifindex, NULL));
|
||||
g_assert_cmpint (plnk->parent_ifindex, ==, ifindex_parent);
|
||||
nmtst_assert_ip6_address (&plnk->local, "fe80::abcd");
|
||||
nmtst_assert_ip6_address (&plnk->remote, "fc01::bbbb");
|
||||
g_assert_cmpint (plnk->ttl, ==, 10);
|
||||
g_assert_cmpint (plnk->tclass, ==, 22);
|
||||
g_assert_cmpint (plnk->flow_label, ==, 1339);
|
||||
g_assert_cmpint (plnk->is_gre, ==, TRUE);
|
||||
g_assert_cmpint (plnk->is_tap, ==, TRUE);
|
||||
break;
|
||||
}
|
||||
case NM_LINK_TYPE_IPIP: {
|
||||
const NMPlatformLnkIpIp *plnk = &lnk->lnk_ipip;
|
||||
|
||||
@@ -2641,8 +2744,11 @@ _nmtstp_setup_tests (void)
|
||||
g_test_add_func ("/link/external", test_external);
|
||||
|
||||
test_software_detect_add ("/link/software/detect/gre", NM_LINK_TYPE_GRE, 0);
|
||||
test_software_detect_add ("/link/software/detect/gretap", NM_LINK_TYPE_GRETAP, 0);
|
||||
test_software_detect_add ("/link/software/detect/ip6tnl/0", NM_LINK_TYPE_IP6TNL, 0);
|
||||
test_software_detect_add ("/link/software/detect/ip6tnl/1", NM_LINK_TYPE_IP6TNL, 1);
|
||||
test_software_detect_add ("/link/software/detect/ip6gre", NM_LINK_TYPE_IP6GRE, 0);
|
||||
test_software_detect_add ("/link/software/detect/ip6gretap", NM_LINK_TYPE_IP6GRETAP, 0);
|
||||
test_software_detect_add ("/link/software/detect/ipip", NM_LINK_TYPE_IPIP, 0);
|
||||
test_software_detect_add ("/link/software/detect/macvlan", NM_LINK_TYPE_MACVLAN, 0);
|
||||
test_software_detect_add ("/link/software/detect/macvtap", NM_LINK_TYPE_MACVTAP, 0);
|
||||
|
Reference in New Issue
Block a user