summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2019-09-12 17:29:49 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2020-03-16 11:54:54 +0100
commitbbd5802f00d9021332b91d6357d55e17e93c9ac2 (patch)
tree4cff632407f683908648cc182f177167447f0c94
parentda40a78e65b1e120036dd30e17df51cc18a594fd (diff)
downloadNetworkManager-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.h3
-rw-r--r--src/devices/nm-device-vlan.c23
-rw-r--r--src/devices/nm-device.c27
-rw-r--r--src/devices/nm-device.h4
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;