my $options = $config->{options} = [];
my $options_alternatives = {
+ 'ovs_mtu' => 'mtu',
'bond-slaves' => 'slaves',
'bond_slaves' => 'slaves',
'bond-xmit-hash-policy' => 'bond_xmit_hash_policy',
'bridge-multicast-flood' => 1,
'bond_miimon' => 1,
'bond_xmit_hash_policy' => 1,
+ 'bond-primary' => 1,
'uplink-id' => 1,
'vlan-protocol' => 1,
+ 'vlan-raw-device' => 1,
+ 'vlan-id' => 1,
'vxlan-id' => 1,
'vxlan-svcnodeip' => 1,
'vxlan-physdev' => 1,
$ifaces->{$1}->{exists} = 0;
$d->{exists} = 0;
}
- } elsif ($iface =~ m/^(\S+)\.\d+$/) {
+ } elsif ($iface =~ m/^(\S+)\.\d+$/ || $d->{'vlan-raw-device'}) {
$d->{type} = 'vlan';
- if (defined ($ifaces->{$1})) {
- $d->{exists} = $ifaces->{$1}->{exists};
+
+ my $raw_iface = $d->{'vlan-raw-device'} ? $d->{'vlan-raw-device'} : $1;
+ if (defined ($ifaces->{$raw_iface})) {
+ $d->{exists} = $ifaces->{$raw_iface}->{exists};
} else {
- $ifaces->{$1}->{exists} = 0;
+ $ifaces->{$raw_iface}->{exists} = 0;
$d->{exists} = 0;
}
} elsif ($iface =~ m/^$PVE::Network::PHYSICAL_NIC_RE$/) {
$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;
$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';
}
$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') {
$raw .= "\tovs_bridge $bridge\n";
$done->{ovs_bridge} = 1;
}
+
+ $raw .= "\tovs_mtu $d->{mtu}\n" if $d->{mtu};
+ $done->{mtu} = 1;
}
if ($first_block) {
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' - 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;
}
}
# check vlan
foreach my $iface (keys %$ifaces) {
my $d = $ifaces->{$iface};
- if ($d->{type} eq 'vlan' && $iface =~ m/^(\S+)\.\d+$/) {
- my $p = $1;
+ if ($d->{type} eq 'vlan') {
+
+ my $p = undef;
+ my $vlanid = undef;
+
+ if ($iface =~ m/^(\S+)\.(\d+)$/) {
+ $p = $1;
+ $vlanid = $2;
+ delete $d->{'vlan-raw-device'} if $d->{'vlan-raw-device'};
+ } else {
+ die "missing vlan-raw-device option" if !$d->{'vlan-raw-device'};
+ $p = $d->{'vlan-raw-device'};
+
+ if ($iface =~ m/^vlan(\d+)$/) {
+ $vlanid = $1;
+ delete $d->{'vlan-id'} if $d->{'vlan-id'};
+ } else {
+ die "custom vlan interface name need ifupdown2" if !$ifupdown2;
+ die "missing vlan-id option" if !$d->{'vlan-id'};
+ $vlanid = $d->{'vlan-id'};
+ }
+ }
my $n = $ifaces->{$p};
+ die "vlan '$iface' - vlan-id $vlanid should be <= 4094\n" if $vlanid > 4094;
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";
}
foreach my $p (split (/\s+/, $d->{bridge_ports})) {
$p =~ s/\.\d+$//;
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 "\:\:");
+ 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;
bond => 300000,
bridge => 400000,
OVSBridge => 400000,
+ vlan => 500000,
vxlan => 500000,
};