From 681f339f57d1ae96968b9b28bb1abe989047e529 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 2 Oct 2019 12:14:46 +0200 Subject: core: allow live change of MTU for devices that support it Allow a live change of MTU using the reapply API for device types that support it. --- src/devices/nm-device-bond.c | 9 ++++++++- src/devices/nm-device-bridge.c | 28 ++++++++++++++++++++++++++++ src/devices/nm-device-macsec.c | 28 ++++++++++++++++++++++++++++ src/devices/nm-device-macvlan.c | 28 ++++++++++++++++++++++++++++ src/devices/nm-device-tun.c | 28 ++++++++++++++++++++++++++++ src/devices/nm-device-vlan.c | 28 ++++++++++++++++++++++++++++ src/devices/nm-device-vxlan.c | 28 ++++++++++++++++++++++++++++ src/devices/team/nm-device-team.c | 28 ++++++++++++++++++++++++++++ src/devices/wifi/nm-device-wifi-p2p.c | 2 +- 9 files changed, 205 insertions(+), 2 deletions(-) diff --git a/src/devices/nm-device-bond.c b/src/devices/nm-device-bond.c index c6ecb2e85f..0941a00f09 100644 --- a/src/devices/nm-device-bond.c +++ b/src/devices/nm-device-bond.c @@ -531,7 +531,14 @@ can_reapply_change (NMDevice *device, NMDeviceClass *device_class; NMSettingBond *s_bond_old, *s_bond_new; - /* Only handle bond setting here, delegate other settings to parent class */ + if (nm_streq (setting_name, NM_SETTING_WIRED_SETTING_NAME)) { + return nm_device_hash_check_invalid_keys (diffs, + NM_SETTING_WIRED_SETTING_NAME, + error, + /* reapplied with IP config */ + NM_SETTING_WIRED_MTU); + } + if (nm_streq (setting_name, NM_SETTING_BOND_SETTING_NAME)) { if (!nm_device_hash_check_invalid_keys (diffs, NM_SETTING_BOND_SETTING_NAME, diff --git a/src/devices/nm-device-bridge.c b/src/devices/nm-device-bridge.c index 72a8ce2bb2..6f321b0342 100644 --- a/src/devices/nm-device-bridge.c +++ b/src/devices/nm-device-bridge.c @@ -769,6 +769,33 @@ create_and_realize (NMDevice *device, return TRUE; } +static gboolean +can_reapply_change (NMDevice *device, + const char *setting_name, + NMSetting *s_old, + NMSetting *s_new, + GHashTable *diffs, + GError **error) +{ + NMDeviceClass *device_class; + + if (nm_streq (setting_name, NM_SETTING_WIRED_SETTING_NAME)) { + return nm_device_hash_check_invalid_keys (diffs, + NM_SETTING_WIRED_SETTING_NAME, + error, + /* reapplied with IP config */ + NM_SETTING_WIRED_MTU); + } + + device_class = NM_DEVICE_CLASS (nm_device_bridge_parent_class); + return device_class->can_reapply_change (device, + setting_name, + s_old, + s_new, + diffs, + error); +} + /*****************************************************************************/ static void @@ -816,6 +843,7 @@ nm_device_bridge_class_init (NMDeviceBridgeClass *klass) device_class->act_stage1_prepare_set_hwaddr_ethernet = TRUE; device_class->act_stage1_prepare = act_stage1_prepare; device_class->act_stage2_config = act_stage2_config; + device_class->can_reapply_change = can_reapply_change; device_class->deactivate = deactivate; device_class->enslave_slave = enslave_slave; device_class->release_slave = release_slave; diff --git a/src/devices/nm-device-macsec.c b/src/devices/nm-device-macsec.c index c9592a4971..e6eef6dd57 100644 --- a/src/devices/nm-device-macsec.c +++ b/src/devices/nm-device-macsec.c @@ -733,6 +733,33 @@ device_state_changed (NMDevice *device, macsec_secrets_cancel (NM_DEVICE_MACSEC (device)); } +static gboolean +can_reapply_change (NMDevice *device, + const char *setting_name, + NMSetting *s_old, + NMSetting *s_new, + GHashTable *diffs, + GError **error) +{ + NMDeviceClass *device_class; + + if (nm_streq (setting_name, NM_SETTING_WIRED_SETTING_NAME)) { + return nm_device_hash_check_invalid_keys (diffs, + NM_SETTING_WIRED_SETTING_NAME, + error, + /* reapplied with IP config */ + NM_SETTING_WIRED_MTU); + } + + device_class = NM_DEVICE_CLASS (nm_device_macsec_parent_class); + return device_class->can_reapply_change (device, + setting_name, + s_old, + s_new, + diffs, + error); +} + /******************************************************************/ static void @@ -849,6 +876,7 @@ nm_device_macsec_class_init (NMDeviceMacsecClass *klass) device_class->mtu_parent_delta = 32; device_class->act_stage2_config = act_stage2_config; + device_class->can_reapply_change = can_reapply_change; device_class->create_and_realize = create_and_realize; device_class->deactivate = deactivate; device_class->get_generic_capabilities = get_generic_capabilities; diff --git a/src/devices/nm-device-macvlan.c b/src/devices/nm-device-macvlan.c index 3633f02d46..955727c477 100644 --- a/src/devices/nm-device-macvlan.c +++ b/src/devices/nm-device-macvlan.c @@ -416,6 +416,33 @@ update_connection (NMDevice *device, NMConnection *connection) NULL); } +static gboolean +can_reapply_change (NMDevice *device, + const char *setting_name, + NMSetting *s_old, + NMSetting *s_new, + GHashTable *diffs, + GError **error) +{ + NMDeviceClass *device_class; + + if (nm_streq (setting_name, NM_SETTING_WIRED_SETTING_NAME)) { + return nm_device_hash_check_invalid_keys (diffs, + NM_SETTING_WIRED_SETTING_NAME, + error, + /* reapplied with IP config */ + NM_SETTING_WIRED_MTU); + } + + device_class = NM_DEVICE_CLASS (nm_device_macvlan_parent_class); + return device_class->can_reapply_change (device, + setting_name, + s_old, + s_new, + diffs, + error); +} + /*****************************************************************************/ static void @@ -508,6 +535,7 @@ nm_device_macvlan_class_init (NMDeviceMacvlanClass *klass) device_class->mtu_parent_delta = 0; device_class->act_stage1_prepare_set_hwaddr_ethernet = TRUE; + device_class->can_reapply_change = can_reapply_change; device_class->check_connection_compatible = check_connection_compatible; device_class->complete_connection = complete_connection; device_class->create_and_realize = create_and_realize; diff --git a/src/devices/nm-device-tun.c b/src/devices/nm-device-tun.c index 77b46a599c..f8e515858e 100644 --- a/src/devices/nm-device-tun.c +++ b/src/devices/nm-device-tun.c @@ -359,6 +359,33 @@ unrealize_notify (NMDevice *device) update_properties_from_struct (NM_DEVICE_TUN (device), NULL); } +static gboolean +can_reapply_change (NMDevice *device, + const char *setting_name, + NMSetting *s_old, + NMSetting *s_new, + GHashTable *diffs, + GError **error) +{ + NMDeviceClass *device_class; + + if (nm_streq (setting_name, NM_SETTING_WIRED_SETTING_NAME)) { + return nm_device_hash_check_invalid_keys (diffs, + NM_SETTING_WIRED_SETTING_NAME, + error, + /* reapplied with IP config */ + NM_SETTING_WIRED_MTU); + } + + device_class = NM_DEVICE_CLASS (nm_device_tun_parent_class); + return device_class->can_reapply_change (device, + setting_name, + s_old, + s_new, + diffs, + error); +} + /*****************************************************************************/ static void @@ -440,6 +467,7 @@ nm_device_tun_class_init (NMDeviceTunClass *klass) device_class->connection_type_check_compatible = NM_SETTING_TUN_SETTING_NAME; device_class->link_types = NM_DEVICE_DEFINE_LINK_TYPES (NM_LINK_TYPE_TUN); + device_class->can_reapply_change = can_reapply_change; device_class->link_changed = link_changed; device_class->complete_connection = complete_connection; device_class->check_connection_compatible = check_connection_compatible; diff --git a/src/devices/nm-device-vlan.c b/src/devices/nm-device-vlan.c index b6efeb81a5..8e2c01879e 100644 --- a/src/devices/nm-device-vlan.c +++ b/src/devices/nm-device-vlan.c @@ -502,6 +502,33 @@ act_stage1_prepare (NMDevice *device, NMDeviceStateReason *out_failure_reason) return NM_ACT_STAGE_RETURN_SUCCESS; } +static gboolean +can_reapply_change (NMDevice *device, + const char *setting_name, + NMSetting *s_old, + NMSetting *s_new, + GHashTable *diffs, + GError **error) +{ + NMDeviceClass *device_class; + + if (nm_streq (setting_name, NM_SETTING_WIRED_SETTING_NAME)) { + return nm_device_hash_check_invalid_keys (diffs, + NM_SETTING_WIRED_SETTING_NAME, + error, + /* reapplied with IP config */ + NM_SETTING_WIRED_MTU); + } + + device_class = NM_DEVICE_CLASS (nm_device_vlan_parent_class); + return device_class->can_reapply_change (device, + setting_name, + s_old, + s_new, + diffs, + error); +} + /*****************************************************************************/ static void @@ -559,6 +586,7 @@ nm_device_vlan_class_init (NMDeviceVlanClass *klass) 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->can_reapply_change = can_reapply_change; device_class->create_and_realize = create_and_realize; device_class->link_changed = link_changed; device_class->unrealize_notify = unrealize_notify; diff --git a/src/devices/nm-device-vxlan.c b/src/devices/nm-device-vxlan.c index 29be6854be..6e41399a00 100644 --- a/src/devices/nm-device-vxlan.c +++ b/src/devices/nm-device-vxlan.c @@ -467,6 +467,33 @@ update_connection (NMDevice *device, NMConnection *connection) } } +static gboolean +can_reapply_change (NMDevice *device, + const char *setting_name, + NMSetting *s_old, + NMSetting *s_new, + GHashTable *diffs, + GError **error) +{ + NMDeviceClass *device_class; + + if (nm_streq (setting_name, NM_SETTING_WIRED_SETTING_NAME)) { + return nm_device_hash_check_invalid_keys (diffs, + NM_SETTING_WIRED_SETTING_NAME, + error, + /* reapplied with IP config */ + NM_SETTING_WIRED_MTU); + } + + device_class = NM_DEVICE_CLASS (nm_device_vxlan_parent_class); + return device_class->can_reapply_change (device, + setting_name, + s_old, + s_new, + diffs, + error); +} + /*****************************************************************************/ static void @@ -584,6 +611,7 @@ nm_device_vxlan_class_init (NMDeviceVxlanClass *klass) device_class->connection_type_check_compatible = NM_SETTING_VXLAN_SETTING_NAME; device_class->link_types = NM_DEVICE_DEFINE_LINK_TYPES (NM_LINK_TYPE_VXLAN); + device_class->can_reapply_change = can_reapply_change; device_class->link_changed = link_changed; device_class->unrealize_notify = unrealize_notify; device_class->create_and_realize = create_and_realize; diff --git a/src/devices/team/nm-device-team.c b/src/devices/team/nm-device-team.c index fb9c9c6963..5d6dd8217d 100644 --- a/src/devices/team/nm-device-team.c +++ b/src/devices/team/nm-device-team.c @@ -852,6 +852,33 @@ create_and_realize (NMDevice *device, return TRUE; } +static gboolean +can_reapply_change (NMDevice *device, + const char *setting_name, + NMSetting *s_old, + NMSetting *s_new, + GHashTable *diffs, + GError **error) +{ + NMDeviceClass *device_class; + + if (nm_streq (setting_name, NM_SETTING_WIRED_SETTING_NAME)) { + return nm_device_hash_check_invalid_keys (diffs, + NM_SETTING_WIRED_SETTING_NAME, + error, + /* reapplied with IP config */ + NM_SETTING_WIRED_MTU); + } + + device_class = NM_DEVICE_CLASS (nm_device_team_parent_class); + return device_class->can_reapply_change (device, + setting_name, + s_old, + s_new, + diffs, + error); +} + /*****************************************************************************/ static void @@ -969,6 +996,7 @@ nm_device_team_class_init (NMDeviceTeamClass *klass) device_class->master_update_slave_connection = master_update_slave_connection; device_class->act_stage1_prepare = act_stage1_prepare; + device_class->can_reapply_change = can_reapply_change; device_class->get_configured_mtu = nm_device_get_configured_mtu_for_wired; device_class->deactivate = deactivate; device_class->enslave_slave = enslave_slave; diff --git a/src/devices/wifi/nm-device-wifi-p2p.c b/src/devices/wifi/nm-device-wifi-p2p.c index 34ff70fa0e..7f6107c108 100644 --- a/src/devices/wifi/nm-device-wifi-p2p.c +++ b/src/devices/wifi/nm-device-wifi-p2p.c @@ -1279,7 +1279,7 @@ nm_device_wifi_p2p_class_init (NMDeviceWifiP2PClass *klass) device_class->act_stage2_config = act_stage2_config; device_class->get_configured_mtu = get_configured_mtu; device_class->get_auto_ip_config_method = get_auto_ip_config_method; - device_class->act_stage3_ip_config_start = act_stage3_ip_config_start; + device_class->act_stage3_ip_config_start = act_stage3_ip_config_start; device_class->deactivate = deactivate; device_class->unmanaged_on_quit = unmanaged_on_quit; -- cgit v1.2.1