]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/INotify.pm
Inotify : add vxlan interface support
[pve-common.git] / src / PVE / INotify.pm
index 0b9ea4adc3e078a47369cd97bc6c271a45f16870..dbc986841529daf100ec6b6a0a214ba7b2ef8a1d 100644 (file)
@@ -914,6 +914,11 @@ sub __read_etc_network_interfaces {
                            }
                        }
                        $d->{$id} = $value;
+                   } elsif ($id eq 'vxlan-id' || $id eq 'vxlan-svcnodeip' || 
+                            $id eq 'vxlan-physdev' || $id eq 'vxlan-local-tunnelip') {
+                       $d->{$id} = $value;
+                   } elsif ($id eq 'vxlan-remoteip') {
+                       push @{$d->{$id}}, $value;
                    } else {
                        push @{$f->{options}}, $option;
                    }
@@ -1010,7 +1015,9 @@ sub __read_etc_network_interfaces {
        } elsif ($iface =~ m/^lo$/) {
            $d->{type} = 'loopback';
        } else {
-           if (!$d->{ovs_type}) {
+           if ($d->{'vxlan-id'}) {
+               $d->{type} = 'vxlan';
+           } elsif (!$d->{ovs_type}) {
                $d->{type} = 'unknown';
            } elsif ($d->{ovs_type} eq 'OVSIntPort') {
                $d->{type} = $d->{ovs_type};
@@ -1118,6 +1125,19 @@ sub __interface_to_string {
            $raw .= "\tbond-xmit-hash-policy $d->{'bond_xmit_hash_policy'}\n";
        }
        $done->{'bond_xmit_hash_policy'} = 1;
+    } elsif ($d->{type} eq 'vxlan') {
+
+        foreach my $k (qw(vxlan-id vxlan-svcnodeip vxlan-physdev vxlan-local-tunnelip)) {
+            $raw .= "\t$k $d->{$k}\n" if $d->{$k};
+           $done->{$k} = 1;
+        }
+
+       if ($d->{'vxlan-remoteip'}) {
+           foreach my $remoteip (@{$d->{'vxlan-remoteip'}}) {
+               $raw .= "\tvxlan-remoteip $remoteip\n";
+           }
+           $done->{'vxlan-remoteip'} = 1;
+       }
 
     } elsif ($d->{type} eq 'OVSBridge') {
 
@@ -1290,6 +1310,30 @@ sub __write_etc_network_interfaces {
        }
     }
 
+    # check vxlan
+    my $vxlans = {};
+    foreach my $iface (keys %$ifaces) {
+       my $d = $ifaces->{$iface};
+
+       if ($d->{type} eq 'vxlan' && $d->{'vxlan-id'}) {
+           my $vxlanid = $d->{'vxlan-id'};
+           die "iface $iface : duplicate vxlan-id $vxlanid already used in $vxlans->{$vxlanid}\n" if $vxlans->{$vxlanid};
+           $vxlans->{$vxlanid} = $iface;
+       }
+
+       my $ips = 0;
+       ++$ips if defined $d->{'vxlan-svcnodeip'};
+       ++$ips if defined $d->{'vxlan-remoteip'};
+       ++$ips if defined $d->{'vxlan-local-tunnelip'};
+       if ($ips > 1) {
+            die "ifac $iface : vxlan-svcnodeip, vxlan-remoteip and vxlan-localtunnelip are mutually exclusive\n";
+       }
+
+       if (defined($d->{'vxlan-svcnodeip'}) != defined($d->{'vxlan-physdev'})) {
+           die "iface $iface : vxlan-svcnodeip and vxlan-physdev must be define together\n";
+       }
+    }
+
     my $raw = <<'NETWORKDOC';
 # network interface settings; autogenerated
 # Please do NOT modify this file directly, unless you know what
@@ -1311,6 +1355,7 @@ NETWORKDOC
        eth => 200000,
        bond => 300000,
        bridge => 400000,
+       vxlan => 500000,
    };
 
     my $lookup_type_prio = sub {