diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2022-07-13 17:07:18 +0200 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2022-07-25 13:42:50 +0200 |
commit | 8e8fed433f22675601de1ea774a755e4876927c8 (patch) | |
tree | 1d8ee284fd512683435a3d56172bf362dd72dcf4 | |
parent | b2a6d9d2aa9d4d25221f1242f55b450d9f9ea9a9 (diff) | |
download | NetworkManager-8e8fed433f22675601de1ea774a755e4876927c8.tar.gz |
bridge: add reapply support
We're able to reapply all properties in the bridge setting, aside from
"mac-address" which is used for matching the device.
https://bugzilla.redhat.com/show_bug.cgi?id=2092762
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1296
-rw-r--r-- | src/core/devices/nm-device-bridge.c | 97 |
1 files changed, 82 insertions, 15 deletions
diff --git a/src/core/devices/nm-device-bridge.c b/src/core/devices/nm-device-bridge.c index dcdd160195..c1ca723816 100644 --- a/src/core/devices/nm-device-bridge.c +++ b/src/core/devices/nm-device-bridge.c @@ -836,30 +836,33 @@ _platform_lnk_bridge_init_from_setting(NMSettingBridge *s_bridge, NMPlatformLnkB to_sysfs_group_address_sys(nm_setting_bridge_get_group_address(s_bridge), &props->group_addr); } -static NMActStageReturn -act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason) +static gboolean +link_config(NMDevice *device, NMConnection *connection) { - NMConnection *connection; + int ifindex = nm_device_get_ifindex(device); NMSettingBridge *s_bridge; NMPlatformLnkBridge props; - int r; - int ifindex = nm_device_get_ifindex(device); - - connection = nm_device_get_applied_connection(device); - g_return_val_if_fail(connection, NM_ACT_STAGE_RETURN_FAILURE); s_bridge = nm_connection_get_setting_bridge(connection); - g_return_val_if_fail(s_bridge, NM_ACT_STAGE_RETURN_FAILURE); + g_return_val_if_fail(s_bridge, FALSE); _platform_lnk_bridge_init_from_setting(s_bridge, &props); - r = nm_platform_link_bridge_change(nm_device_get_platform(device), ifindex, &props); - if (r < 0) { - NM_SET_OUT(out_failure_reason, NM_DEVICE_STATE_REASON_CONFIG_FAILED); - return NM_ACT_STAGE_RETURN_FAILURE; - } + if (nm_platform_link_bridge_change(nm_device_get_platform(device), ifindex, &props) < 0) + return FALSE; + + return bridge_set_vlan_options(device, s_bridge); +} + +static NMActStageReturn +act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason) +{ + NMConnection *connection; - if (!bridge_set_vlan_options(device, s_bridge)) { + connection = nm_device_get_applied_connection(device); + g_return_val_if_fail(connection, NM_ACT_STAGE_RETURN_FAILURE); + + if (!link_config(device, connection)) { NM_SET_OUT(out_failure_reason, NM_DEVICE_STATE_REASON_CONFIG_FAILED); return NM_ACT_STAGE_RETURN_FAILURE; } @@ -1148,6 +1151,68 @@ create_and_realize(NMDevice *device, /*****************************************************************************/ +static gboolean +can_reapply_change(NMDevice *device, + const char *setting_name, + NMSetting *s_old, + NMSetting *s_new, + GHashTable *diffs, + GError **error) +{ + /* Delegate changes to other settings to parent class */ + if (!nm_streq(setting_name, NM_SETTING_BRIDGE_SETTING_NAME)) { + NM_DEVICE_CLASS(nm_device_bridge_parent_class) + ->can_reapply_change(device, setting_name, s_old, s_new, diffs, error); + } + + return nm_device_hash_check_invalid_keys(diffs, + NM_SETTING_BRIDGE_SETTING_NAME, + error, + NM_SETTING_BRIDGE_STP, + NM_SETTING_BRIDGE_PRIORITY, + NM_SETTING_BRIDGE_FORWARD_DELAY, + NM_SETTING_BRIDGE_HELLO_TIME, + NM_SETTING_BRIDGE_MAX_AGE, + NM_SETTING_BRIDGE_AGEING_TIME, + NM_SETTING_BRIDGE_GROUP_FORWARD_MASK, + NM_SETTING_BRIDGE_MULTICAST_HASH_MAX, + NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT, + NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL, + NM_SETTING_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL, + NM_SETTING_BRIDGE_MULTICAST_SNOOPING, + NM_SETTING_BRIDGE_MULTICAST_ROUTER, + NM_SETTING_BRIDGE_MULTICAST_QUERIER, + NM_SETTING_BRIDGE_MULTICAST_QUERIER_INTERVAL, + NM_SETTING_BRIDGE_MULTICAST_QUERY_INTERVAL, + NM_SETTING_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL, + NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR, + NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT, + NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL, + NM_SETTING_BRIDGE_GROUP_ADDRESS, + NM_SETTING_BRIDGE_VLAN_PROTOCOL, + NM_SETTING_BRIDGE_VLAN_STATS_ENABLED, + NM_SETTING_BRIDGE_VLAN_FILTERING, + NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID, + NM_SETTING_BRIDGE_VLANS); +} + +static void +reapply_connection(NMDevice *device, NMConnection *con_old, NMConnection *con_new) +{ + NMDeviceBridge *self = NM_DEVICE_BRIDGE(device); + NMSettingBridge *s_bridge; + + NM_DEVICE_CLASS(nm_device_bridge_parent_class)->reapply_connection(device, con_old, con_new); + + _LOGD(LOGD_BRIDGE, "reapplying bridge settings"); + s_bridge = nm_connection_get_setting_bridge(con_new); + g_return_if_fail(s_bridge); + + link_config(device, con_new); +} + +/*****************************************************************************/ + static void nm_device_bridge_init(NMDeviceBridge *self) { @@ -1192,6 +1257,8 @@ nm_device_bridge_class_init(NMDeviceBridgeClass *klass) device_class->attach_port = attach_port; device_class->detach_port = detach_port; device_class->get_configured_mtu = nm_device_get_configured_mtu_for_wired; + device_class->can_reapply_change = can_reapply_change; + device_class->reapply_connection = reapply_connection; } /*****************************************************************************/ |