+my $read_bridge_mtu = sub {
+ my ($bridge) = @_;
+
+ my $mtu = PVE::Tools::file_read_firstline("/sys/class/net/$bridge/mtu");
+ die "bridge '$bridge' does not exist\n" if !$mtu;
+ # avoid insecure dependency;
+ die "unable to parse mtu value" if $mtu !~ /^(\d+)$/;
+ $mtu = int($1);
+
+ return $mtu;
+};
+
+my $parse_tap_devive_name = sub {
+ my ($iface) = @_;
+
+ my ($vmid, $devid);
+
+ if ($iface =~ m/^tap(\d+)i(\d+)$/) {
+ $vmid = $1;
+ $devid = $2;
+ } elsif ($iface =~ m/^veth(\d+)\.(\d+)$/) {
+ $vmid = $1;
+ $devid = $2;
+ } else {
+ die "wrong interface name $iface";
+ }
+
+ return ($vmid, $devid);
+};
+
+my $compute_fwbr_names = sub {
+ my ($vmid, $devid) = @_;
+
+ my $fwbr = "fwbr${vmid}i${devid}";
+ my $vethfw = "link${vmid}i${devid}";
+ my $vethfwpeer = "link${vmid}p${devid}";
+ my $ovsintport = "link${vmid}o${devid}";
+
+ return ($fwbr, $vethfw, $vethfwpeer, $ovsintport);
+};
+
+my $cond_create_bridge = sub {
+ my ($bridge) = @_;
+
+ if (! -d "/sys/class/net/$bridge") {
+ system("/sbin/brctl addbr $bridge") == 0 ||
+ die "can't add bridge '$bridge'\n";
+ }
+};
+
+my $bridge_add_interface = sub {
+ my ($bridge, $iface) = @_;
+
+ system("/sbin/brctl addif $bridge $iface") == 0 ||
+ die "can't add interface 'iface' to bridge '$bridge'\n";
+};
+
+my $ovs_bridge_add_port = sub {
+ my ($bridge, $iface, $tag, $internal) = @_;
+
+ my $cmd = "/usr/bin/ovs-vsctl add-port $bridge $iface";
+ $cmd .= " tag=$tag" if $tag;
+ $cmd .= " -- set Interface $iface type=internal" if $internal;
+ system($cmd) == 0 ||
+ die "can't add ovs port '$iface'\n";
+};
+
+my $activate_interface = sub {
+ my ($iface) = @_;
+
+ system("/sbin/ip link set $iface up") == 0 ||
+ die "can't activate interface '$iface'\n";
+};
+