]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/INotify.pm
INotify: network : add ovs_mtu option
[pve-common.git] / src / PVE / INotify.pm
index e224f78e71349e340c19d03a4bdde62bee676ed7..d1731fcba0ebaedace594f36c851c5bf05bdf1e0 100644 (file)
@@ -312,7 +312,7 @@ sub parse_ccache_options {
            # noclone flag for large read-only data chunks like aplinfo
            $ccinfo->{$opt} = $v;
        } elsif ($opt eq 'always_call_parser') {
-           # when set, we call parser even when the file does not exists.
+           # when set, we call parser even when the file does not exist.
            # this allows the parser to return some default
            $ccinfo->{$opt} = $v;
        } else {
@@ -872,6 +872,7 @@ sub __read_etc_network_interfaces {
     my $options = $config->{options} = [];
 
     my $options_alternatives = {
+       'ovs_mtu'     => 'mtu',
        'bond-slaves' => 'slaves',
        'bond_slaves' => 'slaves',
        'bond-xmit-hash-policy' => 'bond_xmit_hash_policy',
@@ -901,6 +902,7 @@ sub __read_etc_network_interfaces {
     SECTION: while (defined ($line = <$fh>)) {
        chomp ($line);
        next if $line =~ m/^\s*#/;
+       next if $line =~ m/^\s*(allow-hotplug)\s+(.*)$/;
 
        if ($line =~ m/^\s*(auto|allow-ovs)\s+(.*)$/) {
            my @aa = split (/\s+/, $2);
@@ -955,6 +957,7 @@ sub __read_etc_network_interfaces {
                        'bridge-multicast-flood' => 1,
                        'bond_miimon' => 1,
                        'bond_xmit_hash_policy' => 1,
+                       'bond-primary' => 1,
                        'uplink-id' => 1,
                        'vlan-protocol' => 1,
                        'vxlan-id' => 1,
@@ -1213,6 +1216,9 @@ sub __interface_to_string {
        $done->{bridge_vlan_aware} = 1;
        $done->{bridge_vids} = 1;
 
+       $raw .= "\tmtu $d->{mtu}\n" if $d->{mtu};
+       $done->{mtu} = 1;
+
     } elsif ($d->{type} eq 'bond') {
 
        $d->{slaves} =~ s/[;,\s]+/ /g;
@@ -1233,6 +1239,15 @@ sub __interface_to_string {
            $raw .= "\tbond-xmit-hash-policy $d->{'bond_xmit_hash_policy'}\n";
        }
        $done->{'bond_xmit_hash_policy'} = 1;
+
+       if ($d->{'bond_mode'} && $d->{'bond_mode'} eq 'active-backup' && $d->{'bond-primary'}) {
+           $raw .= "\tbond-primary $d->{'bond-primary'}\n";
+       }
+       $done->{'bond-primary'} = 1;
+
+       $raw .= "\tmtu $d->{mtu}\n" if $d->{mtu};
+       $done->{mtu} = 1;
+
     } elsif ($d->{type} eq 'vlan') {
        die "$iface: wrong vlan-protocol $d->{'vlan-protocol'}\n"
            if $d->{'vlan-protocol'} && $d->{'vlan-protocol'} ne '802.1ad' && $d->{'vlan-protocol'} ne '802.1q';
@@ -1250,14 +1265,21 @@ sub __interface_to_string {
            }
            $done->{'vxlan-remoteip'} = 1;
        }
+
+       $raw .= "\tmtu $d->{mtu}\n" if $d->{mtu};
+       $done->{mtu} = 1;
+
     } elsif ($d->{type} eq 'OVSBridge') {
 
        $raw .= "\tovs_type $d->{type}\n";
        $done->{ovs_type} = 1;
 
        $raw .= "\tovs_ports $d->{ovs_ports}\n" if $d->{ovs_ports};
-
        $done->{ovs_ports} = 1;
+
+       $raw .= "\tovs_mtu $d->{mtu}\n" if $d->{mtu};
+       $done->{mtu} = 1;
+
     } elsif ($d->{type} eq 'OVSPort' || $d->{type} eq 'OVSIntPort' ||
             $d->{type} eq 'OVSBond') {
 
@@ -1299,6 +1321,9 @@ sub __interface_to_string {
            $raw .= "\tovs_bridge $bridge\n";
            $done->{ovs_bridge} = 1;
        }
+
+       $raw .= "\tovs_mtu $d->{mtu}\n" if $d->{mtu};
+       $done->{mtu} = 1;
     }
 
     if ($first_block) {
@@ -1426,15 +1451,18 @@ sub __write_etc_network_interfaces {
     foreach my $iface (keys %$ifaces) {
        my $d = $ifaces->{$iface};
        if ($d->{type} eq 'bond' && $d->{slaves}) {
+           my $bond_primary_is_slave = undef;
            foreach my $p (split (/\s+/, $d->{slaves})) {
                my $n = $ifaces->{$p};
-
+               
                die "bond '$iface' - unable to find slave '$p'\n"
                    if !$n;
                die "bond '$iface' - wrong interface type on slave '$p' " .
                    "('$n->{type}' != 'eth')\n" if $n->{type} ne 'eth';
                &$check_mtu($ifaces, $iface, $p);
+               $bond_primary_is_slave = 1 if $d->{'bond-primary'} && $d->{'bond-primary'} eq $p;
            }
+           die "bond '$iface' - bond-primary interface is not a slave" if $d->{'bond-primary'} && !$bond_primary_is_slave;
        }
     }
 
@@ -1473,9 +1501,7 @@ sub __write_etc_network_interfaces {
            die "vlan '$iface' - unable to find parent '$p'\n"
                if !$n;
 
-           if ($n->{type} eq 'bridge' && !$n->{bridge_vlan_aware}) {
-               die "vlan '$iface' - bridge vlan aware is not enabled on parent '$p'\n";
-           } elsif ($n->{type} ne 'eth' && $n->{type} ne 'bridge' && $n->{type} ne 'bond' && $n->{type} ne 'vlan') {
+           if ($n->{type} ne 'eth' && $n->{type} ne 'bridge' && $n->{type} ne 'bond' && $n->{type} ne 'vlan') {
                die "vlan '$iface' - wrong interface type on parent '$p' " .
                    "('$n->{type}' != 'eth|bond|bridge|vlan' )\n";
            }
@@ -1511,6 +1537,10 @@ sub __write_etc_network_interfaces {
                my $n = $ifaces->{$p};
                die "bridge '$iface' - unable to find bridge port '$p'\n"
                    if !$n;
+               die "iface $p - ip address can't be set on interface if bridged in $iface\n" 
+                   if ($n->{method} eq 'static' && $n->{address} ne '0.0.0.0') || 
+                       ($n->{method6} eq 'static' && $n->{address} ne "\:\:");
+
                &$check_mtu($ifaces, $iface, $p);
                $bridgeports->{$p} = $iface;
            }