diff options
| author | Michael Biebl <biebl@debian.org> | 2022-02-24 19:33:43 +0100 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2022-02-24 19:33:43 +0100 |
| commit | 4e966a21b9ef4fb910a5bd1a5699d404a65cfe55 (patch) | |
| tree | a6fd45f9fe8a937bc3ce766e94b724822da6fc15 /src/core/devices | |
| parent | e3f2ee969d065d2971170563c8aef77d5a0d39b9 (diff) | |
New upstream version 1.36.0 upstream/1.36.0
Diffstat (limited to 'src/core/devices')
| -rw-r--r-- | src/core/devices/nm-device.c | 3 | ||||
| -rw-r--r-- | src/core/devices/ovs/nm-device-ovs-port.c | 57 |
2 files changed, 53 insertions, 7 deletions
diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index aed580ab..35360cee 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -15076,8 +15076,7 @@ nm_device_cleanup(NMDevice *self, NMDeviceStateReason reason, CleanupType cleanu if (ifindex > 0) { NMPlatform *platform = nm_device_get_platform(self); - nm_platform_ip_route_flush(platform, AF_UNSPEC, ifindex); - nm_platform_ip_address_flush(platform, AF_UNSPEC, ifindex); + nm_device_l3cfg_commit(self, NM_L3_CFG_COMMIT_TYPE_REAPPLY, TRUE); if (nm_device_get_applied_setting(self, NM_TYPE_SETTING_TC_CONFIG)) { nm_platform_tc_sync(platform, ifindex, NULL, NULL); diff --git a/src/core/devices/ovs/nm-device-ovs-port.c b/src/core/devices/ovs/nm-device-ovs-port.c index 4419cfe9..8406c364 100644 --- a/src/core/devices/ovs/nm-device-ovs-port.c +++ b/src/core/devices/ovs/nm-device-ovs-port.c @@ -15,7 +15,8 @@ #include "nm-active-connection.h" #include "nm-setting-connection.h" #include "nm-setting-ovs-port.h" -#include "nm-setting-ovs-port.h" +#include "nm-setting-ovs-interface.h" +#include "nm-setting-wired.h" #define _NMLOG_DEVICE_TYPE NMDeviceOvsPort #include "devices/nm-device-logging.h" @@ -88,12 +89,40 @@ add_iface_cb(GError *error, gpointer user_data) } static gboolean +_ovs_interface_is_dpdk(NMDevice *device) +{ + NMSettingOvsInterface *s_ovs_iface; + + s_ovs_iface = nm_device_get_applied_setting(device, NM_TYPE_SETTING_OVS_INTERFACE); + + g_return_val_if_fail(s_ovs_iface, FALSE); + + return nm_streq(nm_setting_ovs_interface_get_interface_type(s_ovs_iface), "dpdk"); +} + +static void +set_mtu_cb(GError *error, gpointer user_data) +{ + NMDevice *self = user_data; + + if (error && !g_error_matches(error, NM_UTILS_ERROR, NM_UTILS_ERROR_CANCELLED_DISPOSING)) { + _LOGW(LOGD_DEVICE, + "could not change mtu of '%s': %s", + nm_device_get_iface(self), + error->message); + } + + g_object_unref(self); +} + +static gboolean enslave_slave(NMDevice *device, NMDevice *slave, NMConnection *connection, gboolean configure) { NMDeviceOvsPort *self = NM_DEVICE_OVS_PORT(device); NMActiveConnection *ac_port = NULL; NMActiveConnection *ac_bridge = NULL; NMDevice *bridge_device; + NMSettingWired *s_wired; if (!configure) return TRUE; @@ -122,6 +151,21 @@ enslave_slave(NMDevice *device, NMDevice *slave, NMConnection *connection, gbool add_iface_cb, g_object_ref(slave)); + /* DPDK ports does not have a link after the devbind, so the MTU must be + * set on ovsdb after adding the interface. */ + if (NM_IS_DEVICE_OVS_INTERFACE(slave) && _ovs_interface_is_dpdk(slave)) { + s_wired = nm_device_get_applied_setting(slave, NM_TYPE_SETTING_WIRED); + + if (!s_wired || !nm_setting_wired_get_mtu(s_wired)) + return TRUE; + + nm_ovsdb_set_interface_mtu(nm_ovsdb_get(), + nm_device_get_ip_iface(slave), + nm_setting_wired_get_mtu(s_wired), + set_mtu_cb, + g_object_ref(slave)); + } + return TRUE; } @@ -145,6 +189,7 @@ static void release_slave(NMDevice *device, NMDevice *slave, gboolean configure) { NMDeviceOvsPort *self = NM_DEVICE_OVS_PORT(device); + bool slave_removed = nm_device_sys_iface_state_get(slave) == NM_DEVICE_SYS_IFACE_STATE_REMOVED; _LOGI(LOGD_DEVICE, "releasing ovs interface %s", nm_device_get_ip_iface(slave)); @@ -152,10 +197,12 @@ release_slave(NMDevice *device, NMDevice *slave, gboolean configure) * removed and thus we're called with configure=FALSE), we still need * to make sure its OVSDB entry is gone. */ - nm_ovsdb_del_interface(nm_ovsdb_get(), - nm_device_get_iface(slave), - del_iface_cb, - g_object_ref(slave)); + if (configure || slave_removed) { + nm_ovsdb_del_interface(nm_ovsdb_get(), + nm_device_get_iface(slave), + del_iface_cb, + g_object_ref(slave)); + } if (configure) { /* Open VSwitch is going to delete this one. We must ignore what happens |