diff options
author | Fernando Fernandez Mancera <ffmancera@riseup.net> | 2022-02-22 15:51:09 +0100 |
---|---|---|
committer | Fernando Fernandez Mancera <ffmancera@riseup.net> | 2022-02-23 17:21:34 +0100 |
commit | aa652ba9eba5100b127285fe6fbb1e5c28c0751f (patch) | |
tree | f7ef09dd8198e41954ec8cd0a21eab1d9379eac8 | |
parent | 5a5d9573e1cc3488e5d2450bd20d6c849b6316c6 (diff) | |
download | NetworkManager-ff/dpdk_ovs_mtu.tar.gz |
ovsdb: set DPDK port MTU when creating themff/dpdk_ovs_mtu
The DPDK port will not have a link after the devbind which is needed for
configuring an interface to be a DPDK port. The MTU is being committed
during the link change but for DPDK ports there is no link.
The DPDK port MTU should be set on ovsdb right after the interface is
added to ovsdb. This way the users will be able to set MTU for DPDK
ports and modify it.
Please see the following results:
```
port 2: iface0 (dpdk: configured_rx_queues=1, configured_rxq_descriptors=2048, configured_tx_queues=3,
configured_txq_descriptors=2048, lsc_interrupt_mode=false, mtu=2000, requested_rx_queues=1,
requested_rxq_descriptors=2048, requested_tx_queues=3, requested_txq_descriptors=2048, rx_csum_offload=true, tx_tso_offload=false)
```
-rw-r--r-- | src/core/devices/ovs/nm-device-ovs-port.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/src/core/devices/ovs/nm-device-ovs-port.c b/src/core/devices/ovs/nm-device-ovs-port.c index 500dbc0fdd..8406c3648c 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; } |