diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2019-09-12 17:29:49 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2020-03-16 11:54:54 +0100 |
commit | bbd5802f00d9021332b91d6357d55e17e93c9ac2 (patch) | |
tree | 4cff632407f683908648cc182f177167447f0c94 | |
parent | da40a78e65b1e120036dd30e17df51cc18a594fd (diff) | |
download | NetworkManager-bbd5802f00d9021332b91d6357d55e17e93c9ac2.tar.gz |
device: introduce generic function to inherit MTU from parent
Introduce a generic function to set a MTU based on parent's one. Also
define a device-specific @mtu_parent_delta value that specifies the
difference from parent MTU that should be set by default. For VLAN it
is zero but other interface types (for example MACsec) require a
positive value due to encapsulation overhead.
(cherry picked from commit 5cf57f452233b1211fcff7c8cf689d9d5cb48092)
(cherry picked from commit 73597864bb0a229ce33d9072a3f73f96443f1fe7)
-rw-r--r-- | src/devices/nm-device-private.h | 3 | ||||
-rw-r--r-- | src/devices/nm-device-vlan.c | 23 | ||||
-rw-r--r-- | src/devices/nm-device.c | 27 | ||||
-rw-r--r-- | src/devices/nm-device.h | 4 |
4 files changed, 36 insertions, 21 deletions
diff --git a/src/devices/nm-device-private.h b/src/devices/nm-device-private.h index dd98e92f73..667ca6fe0f 100644 --- a/src/devices/nm-device-private.h +++ b/src/devices/nm-device-private.h @@ -177,6 +177,9 @@ guint32 nm_device_get_configured_mtu_from_connection (NMDevice *device, guint32 nm_device_get_configured_mtu_for_wired (NMDevice *self, NMDeviceMtuSource *out_source); +guint32 nm_device_get_configured_mtu_wired_parent (NMDevice *self, + NMDeviceMtuSource *out_source); + void nm_device_commit_mtu (NMDevice *self); /*****************************************************************************/ diff --git a/src/devices/nm-device-vlan.c b/src/devices/nm-device-vlan.c index ace6a24bdb..e0f2bd324e 100644 --- a/src/devices/nm-device-vlan.c +++ b/src/devices/nm-device-vlan.c @@ -523,26 +523,6 @@ act_stage1_prepare (NMDevice *device, NMDeviceStateReason *out_failure_reason) return ret; } -static guint32 -get_configured_mtu (NMDevice *self, NMDeviceMtuSource *out_source) -{ - guint32 mtu = 0; - int ifindex; - - mtu = nm_device_get_configured_mtu_for_wired (self, out_source); - if (*out_source != NM_DEVICE_MTU_SOURCE_NONE) - return mtu; - - /* Inherit the MTU from parent device, if any */ - ifindex = nm_device_parent_get_ifindex (self); - if (ifindex > 0) { - mtu = nm_platform_link_get_mtu (nm_device_get_platform (NM_DEVICE (self)), ifindex); - *out_source = NM_DEVICE_MTU_SOURCE_PARENT; - } - - return mtu; -} - /*****************************************************************************/ static void @@ -598,13 +578,14 @@ nm_device_vlan_class_init (NMDeviceVlanClass *klass) device_class->connection_type_supported = NM_SETTING_VLAN_SETTING_NAME; device_class->connection_type_check_compatible = NM_SETTING_VLAN_SETTING_NAME; device_class->link_types = NM_DEVICE_DEFINE_LINK_TYPES (NM_LINK_TYPE_VLAN); + device_class->mtu_parent_delta = 0; /* VLANs can have the same MTU of parent */ device_class->create_and_realize = create_and_realize; device_class->link_changed = link_changed; device_class->unrealize_notify = unrealize_notify; device_class->get_generic_capabilities = get_generic_capabilities; device_class->act_stage1_prepare = act_stage1_prepare; - device_class->get_configured_mtu = get_configured_mtu; + device_class->get_configured_mtu = nm_device_get_configured_mtu_wired_parent; device_class->is_available = is_available; device_class->parent_changed_notify = parent_changed_notify; diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 570c6dc5c7..f6c709d317 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -9075,6 +9075,33 @@ nm_device_get_configured_mtu_for_wired (NMDevice *self, NMDeviceMtuSource *out_s out_source); } +guint32 +nm_device_get_configured_mtu_wired_parent (NMDevice *self, + NMDeviceMtuSource *out_source) +{ + guint32 mtu = 0; + int ifindex; + + mtu = nm_device_get_configured_mtu_for_wired (self, out_source); + if (*out_source != NM_DEVICE_MTU_SOURCE_NONE) { + nm_assert (mtu > 0); + return mtu; + } + + /* Inherit the MTU from parent device, if any */ + ifindex = nm_device_parent_get_ifindex (self); + if (ifindex > 0) { + mtu = nm_platform_link_get_mtu (nm_device_get_platform (self), ifindex); + if (mtu >= NM_DEVICE_GET_CLASS (self)->mtu_parent_delta) { + mtu -= NM_DEVICE_GET_CLASS (self)->mtu_parent_delta; + *out_source = NM_DEVICE_MTU_SOURCE_PARENT; + } else + mtu = 0; + } + + return mtu; +} + /*****************************************************************************/ static void diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h index d11c33ab46..fee3b7e563 100644 --- a/src/devices/nm-device.h +++ b/src/devices/nm-device.h @@ -240,6 +240,10 @@ typedef struct _NMDeviceClass { const NMLinkType *link_types; + /* if the device MTU is set based on parent's one, this specifies + * a delta in the MTU allowed value due the encapsulation overhead */ + guint16 mtu_parent_delta; + /* Whether the device type is a master-type. This depends purely on the * type (NMDeviceClass), not the actual device instance. */ bool is_master:1; |