summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2019-09-12 17:33:49 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2019-10-10 15:08:16 +0200
commit438a0a9ad5287a82b1872c9783cc8fa4b548d49e (patch)
tree344d72824f82bca623b99b8aaeed48b5c464c413
parent5cf57f452233b1211fcff7c8cf689d9d5cb48092 (diff)
downloadNetworkManager-438a0a9ad5287a82b1872c9783cc8fa4b548d49e.tar.gz
macsec: update MTU according to parent's one
A MACsec connection doesn't have an ordering dependency with its parent connection and so it's possible that the parent gets activated later and sets a greater MTU than the original one. It is reasonable and useful to keep the MACsec MTU configured by default as the maximum allowed by the parent interface, that is the parent MTU minus the encapsulation overhead (32). The user can of course override this by setting an explicit value in the connection. We already do something similar for VLANs. https://bugzilla.redhat.com/show_bug.cgi?id=1723690
-rw-r--r--src/devices/nm-device-macsec.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/devices/nm-device-macsec.c b/src/devices/nm-device-macsec.c
index 17ee53c565..c9592a4971 100644
--- a/src/devices/nm-device-macsec.c
+++ b/src/devices/nm-device-macsec.c
@@ -52,6 +52,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMDeviceMacsec,
typedef struct {
NMPlatformLnkMacsec props;
gulong parent_state_id;
+ gulong parent_mtu_id;
Supplicant supplicant;
guint supplicant_timeout_id;
NMActRequestGetSecretsCallId *macsec_secrets_id;
@@ -100,6 +101,17 @@ parent_state_changed (NMDevice *parent,
}
static void
+parent_mtu_maybe_changed (NMDevice *parent,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ /* the MTU of a MACsec device is limited by the parent's MTU.
+ *
+ * When the parent's MTU changes, try to re-set the MTU. */
+ nm_device_commit_mtu (user_data);
+}
+
+static void
parent_changed_notify (NMDevice *device,
int old_ifindex,
NMDevice *old_parent,
@@ -119,12 +131,16 @@ parent_changed_notify (NMDevice *device,
* because NMDevice's dispose() will unset the parent, which in turn calls
* parent_changed_notify(). */
nm_clear_g_signal_handler (old_parent, &priv->parent_state_id);
+ nm_clear_g_signal_handler (old_parent, &priv->parent_mtu_id);
if (new_parent) {
priv->parent_state_id = g_signal_connect (new_parent,
NM_DEVICE_STATE_CHANGED,
G_CALLBACK (parent_state_changed),
device);
+ priv->parent_mtu_id = g_signal_connect (new_parent, "notify::" NM_DEVICE_MTU,
+ G_CALLBACK (parent_mtu_maybe_changed), device);
+
/* Set parent-dependent unmanaged flag */
nm_device_set_unmanaged_by_flags (device,
@@ -779,11 +795,15 @@ static void
dispose (GObject *object)
{
NMDeviceMacsec *self = NM_DEVICE_MACSEC (object);
+ NMDeviceMacsecPrivate *priv = NM_DEVICE_MACSEC_GET_PRIVATE (self);
macsec_secrets_cancel (self);
supplicant_interface_release (self);
G_OBJECT_CLASS (nm_device_macsec_parent_class)->dispose (object);
+
+ nm_assert (priv->parent_state_id == 0);
+ nm_assert (priv->parent_mtu_id == 0);
}
static const NMDBusInterfaceInfoExtended interface_info_device_macsec = {
@@ -826,6 +846,7 @@ nm_device_macsec_class_init (NMDeviceMacsecClass *klass)
device_class->connection_type_supported = NM_SETTING_MACSEC_SETTING_NAME;
device_class->connection_type_check_compatible = NM_SETTING_MACSEC_SETTING_NAME;
device_class->link_types = NM_DEVICE_DEFINE_LINK_TYPES (NM_LINK_TYPE_MACSEC);
+ device_class->mtu_parent_delta = 32;
device_class->act_stage2_config = act_stage2_config;
device_class->create_and_realize = create_and_realize;
@@ -835,7 +856,7 @@ nm_device_macsec_class_init (NMDeviceMacsecClass *klass)
device_class->is_available = is_available;
device_class->parent_changed_notify = parent_changed_notify;
device_class->state_changed = device_state_changed;
- device_class->get_configured_mtu = nm_device_get_configured_mtu_for_wired;
+ device_class->get_configured_mtu = nm_device_get_configured_mtu_wired_parent;
obj_properties[PROP_SCI] =
g_param_spec_uint64 (NM_DEVICE_MACSEC_SCI, "", "",