summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFernando Fernandez Mancera <ffmancera@riseup.net>2022-02-22 15:51:09 +0100
committerFernando Fernandez Mancera <ffmancera@riseup.net>2022-02-23 17:21:34 +0100
commitaa652ba9eba5100b127285fe6fbb1e5c28c0751f (patch)
treef7ef09dd8198e41954ec8cd0a21eab1d9379eac8
parent5a5d9573e1cc3488e5d2450bd20d6c849b6316c6 (diff)
downloadNetworkManager-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.c46
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;
}