[pve-devel] superseded: [PATCH qemu-server 1/1] net: pass host_mtu parameter when mtu is unset in netdev config
Stefan Hanreich
s.hanreich at proxmox.com
Thu Apr 17 12:50:17 CEST 2025
superseded by v2:
https://lore.proxmox.com/pve-devel/20250417104855.144882-1-s.hanreich@proxmox.com/T
On 4/17/25 11:59, Stefan Hanreich wrote:
> When creating a new network device from the UI and leaving the MTU
> field empty, the field hints that this means that the MTU is inherited
> from the bridge. Since leaving the field empty omits the key from the
> network device configuration, we need to inherit from the bridge MTU
> when this key is missing as well, instead of only inheriting from the
> bridge when the field is explicitly set to 1.
>
> The common case where this was encountered was with creating network
> devices on SDN VXLAN vnets. There the default MTU for bridges is 1450,
> since VXLAN adds some overhead and we automatically subtract that
> overhead from the default bridge MTU (1500) if no MTU is explicitly
> set in the zone configuration.
>
> I decided to fix this here, instead of in the UI, since the fix then
> also works for existing network devices where MTU is unset. This means
> that users would not have to re-apply the setting from the UI. It also
> seems like the sensible default to inherit the MTU value from the
> bridge when this key doesn't exist instead of just not setting
> host_mtu at all.
>
> Signed-off-by: Stefan Hanreich <s.hanreich at proxmox.com>
> ---
> PVE/QemuServer.pm | 28 +++++++++++++++-------------
> test/cfg2cmd/netdev_vxlan.conf | 8 ++++++++
> test/cfg2cmd/netdev_vxlan.conf.cmd | 26 ++++++++++++++++++++++++++
> test/run_config2command_tests.pl | 6 ++++++
> 4 files changed, 55 insertions(+), 13 deletions(-)
> create mode 100644 test/cfg2cmd/netdev_vxlan.conf
> create mode 100644 test/cfg2cmd/netdev_vxlan.conf.cmd
>
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index ccdceedc..6a55d59f 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -1596,20 +1596,22 @@ sub print_netdevice_full {
>
> $tmpstr .= ",bootindex=$net->{bootindex}" if $net->{bootindex} ;
>
> - if (my $mtu = $net->{mtu}) {
> - if ($net->{model} eq 'virtio' && $net->{bridge}) {
> - my $bridge_mtu = PVE::Network::read_bridge_mtu($net->{bridge});
> - if ($mtu == 1) {
> - $mtu = $bridge_mtu;
> - } elsif ($mtu < 576) {
> - die "netdev $netid: MTU '$mtu' is smaller than the IP minimum MTU '576'\n";
> - } elsif ($mtu > $bridge_mtu) {
> - die "netdev $netid: MTU '$mtu' is bigger than the bridge MTU '$bridge_mtu'\n";
> - }
> - $tmpstr .= ",host_mtu=$mtu";
> - } else {
> - warn "WARN: netdev $netid: ignoring MTU '$mtu', not using VirtIO or no bridge configured.\n";
> + my $mtu = $net->{mtu};
> +
> + if ($net->{model} eq 'virtio' && $net->{bridge}) {
> + my $bridge_mtu = PVE::Network::read_bridge_mtu($net->{bridge});
> +
> + if (!defined($mtu) || $mtu == 1) {
> + $mtu = $bridge_mtu;
> + } elsif ($mtu < 576) {
> + die "netdev $netid: MTU '$mtu' is smaller than the IP minimum MTU '576'\n";
> + } elsif ($mtu > $bridge_mtu) {
> + die "netdev $netid: MTU '$mtu' is bigger than the bridge MTU '$bridge_mtu'\n";
> }
> +
> + $tmpstr .= ",host_mtu=$mtu" if $mtu != 1500;
> + } elsif (defined($mtu)) {
> + warn "WARN: netdev $netid: ignoring MTU '$mtu', not using VirtIO or no bridge configured.\n";
> }
>
> if ($use_old_bios_files) {
> diff --git a/test/cfg2cmd/netdev_vxlan.conf b/test/cfg2cmd/netdev_vxlan.conf
> new file mode 100644
> index 00000000..222a66d4
> --- /dev/null
> +++ b/test/cfg2cmd/netdev_vxlan.conf
> @@ -0,0 +1,8 @@
> +# TEST: Simple test for netdev related stuff
> +# QEMU_VERSION: 5.0
> +bootdisk: scsi0
> +cores: 3
> +memory: 768
> +name: netdev
> +net0: virtio=A2:C0:43:77:08:A0,bridge=vxlan_bridge
> +ostype: l26
> diff --git a/test/cfg2cmd/netdev_vxlan.conf.cmd b/test/cfg2cmd/netdev_vxlan.conf.cmd
> new file mode 100644
> index 00000000..a9db44bf
> --- /dev/null
> +++ b/test/cfg2cmd/netdev_vxlan.conf.cmd
> @@ -0,0 +1,26 @@
> +/usr/bin/kvm \
> + -id 8006 \
> + -name 'netdev,debug-threads=on' \
> + -no-shutdown \
> + -chardev 'socket,id=qmp,path=/var/run/qemu-server/8006.qmp,server=on,wait=off' \
> + -mon 'chardev=qmp,mode=control' \
> + -chardev 'socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect=5' \
> + -mon 'chardev=qmp-event,mode=control' \
> + -pidfile /var/run/qemu-server/8006.pid \
> + -daemonize \
> + -smp '3,sockets=1,cores=3,maxcpus=3' \
> + -nodefaults \
> + -boot 'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg' \
> + -vnc 'unix:/var/run/qemu-server/8006.vnc,password=on' \
> + -cpu kvm64,enforce,+kvm_pv_eoi,+kvm_pv_unhalt,+lahf_lm,+sep \
> + -m 768 \
> + -device 'pci-bridge,id=pci.1,chassis_nr=1,bus=pci.0,addr=0x1e' \
> + -device 'pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f' \
> + -device 'piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2' \
> + -device 'usb-tablet,id=tablet,bus=uhci.0,port=1' \
> + -device 'VGA,id=vga,bus=pci.0,addr=0x2' \
> + -device 'virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3' \
> + -iscsi 'initiator-name=iqn.1993-08.org.debian:01:aabbccddeeff' \
> + -netdev 'type=tap,id=net0,ifname=tap8006i0,script=/usr/libexec/qemu-server/pve-bridge,downscript=/usr/libexec/qemu-server/pve-bridgedown,vhost=on' \
> + -device 'virtio-net-pci,mac=A2:C0:43:77:08:A0,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300,host_mtu=1450' \
> + -machine 'type=pc+pve0'
> diff --git a/test/run_config2command_tests.pl b/test/run_config2command_tests.pl
> index 209122c2..c2dfbd31 100755
> --- a/test/run_config2command_tests.pl
> +++ b/test/run_config2command_tests.pl
> @@ -316,6 +316,12 @@ my $pve_common_network;
> $pve_common_network = Test::MockModule->new('PVE::Network');
> $pve_common_network->mock(
> read_bridge_mtu => sub {
> + my ($bridge_name) = @_;
> +
> + if ($bridge_name eq 'vxlan_bridge') {
> + return 1450;
> + }
> +
> return 1500;
> },
> );
More information about the pve-devel
mailing list