summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2019-09-12 17:29:49 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2019-10-09 15:28:00 +0200
commitdd387785504c1e7d50490c7a1031076ae85d5a71 (patch)
treee565594d562980cbbfeaaef536c637ddce7949f1
parent28fce5877137541ca06a4772ce5ebe9796fe26c0 (diff)
downloadNetworkManager-dd387785504c1e7d50490c7a1031076ae85d5a71.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.
-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 4c38fa7a2a..b4bc6a1bfc 100644
--- a/src/devices/nm-device-private.h
+++ b/src/devices/nm-device-private.h
@@ -168,6 +168,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 02262b21d6..b6efeb81a5 100644
--- a/src/devices/nm-device-vlan.c
+++ b/src/devices/nm-device-vlan.c
@@ -502,26 +502,6 @@ act_stage1_prepare (NMDevice *device, NMDeviceStateReason *out_failure_reason)
return NM_ACT_STAGE_RETURN_SUCCESS;
}
-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
@@ -577,6 +557,7 @@ 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;
@@ -584,7 +565,7 @@ nm_device_vlan_class_init (NMDeviceVlanClass *klass)
device_class->get_generic_capabilities = get_generic_capabilities;
device_class->act_stage1_prepare_set_hwaddr_ethernet = TRUE;
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 440a94c238..b6a00df645 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -9324,6 +9324,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 df8777b720..40d9676d2d 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -225,6 +225,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;