]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/SDN/Vnets.pm
Fix vnet gateway for routed setup + /32 pointopoint subnet
[pve-network.git] / PVE / Network / SDN / Vnets.pm
CommitLineData
f5eabba0
AD
1package PVE::Network::SDN::Vnets;
2
3use strict;
4use warnings;
5
6use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
70b03506
AD
7use Net::IP;
8use PVE::Network::SDN::Subnets;
f5eabba0 9
f5eabba0
AD
10use PVE::Network::SDN::VnetPlugin;
11PVE::Network::SDN::VnetPlugin->register();
12PVE::Network::SDN::VnetPlugin->init();
13
14sub sdn_vnets_config {
15 my ($cfg, $id, $noerr) = @_;
16
17 die "no sdn vnet ID specified\n" if !$id;
18
19 my $scfg = $cfg->{ids}->{$id};
b2d83056 20 die "sdn vnet '$id' does not exist\n" if (!$noerr && !$scfg);
f5eabba0
AD
21
22 return $scfg;
23}
24
25sub config {
dfe17b64 26 return cfs_read_file("sdn/vnets.cfg");
f5eabba0
AD
27}
28
29sub write_config {
30 my ($cfg) = @_;
31
f703d2ae 32 cfs_write_file("sdn/vnets.cfg", $cfg);
f5eabba0
AD
33}
34
f5eabba0
AD
35sub sdn_vnets_ids {
36 my ($cfg) = @_;
37
38 return keys %{$cfg->{ids}};
39}
40
41sub complete_sdn_vnet {
42 my ($cmdname, $pname, $cvalue) = @_;
43
44 my $cfg = PVE::Network::SDN::Vnets::config();
45
46 return $cmdname eq 'add' ? [] : [ PVE::Network::SDN::Vnets::sdn_vnet_ids($cfg) ];
47}
48
eb1549e7
AD
49sub get_vnet {
50 my ($vnetid) = @_;
51
52 my $cfg = PVE::Network::SDN::Vnets::config();
53 my $vnet = PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $vnetid, 1);
54 return $vnet;
55}
56
e612faf6
AD
57sub get_subnets {
58 my ($vnetid) = @_;
59
60 my $subnets = {};
61 my $subnets_cfg = PVE::Network::SDN::Subnets::config();
62 foreach my $subnetid (sort keys %{$subnets_cfg->{ids}}) {
63 my $subnet = $subnets_cfg->{ids}->{$subnetid};
64 next if !$subnet->{vnet} || $subnet->{vnet} ne $vnetid;
65 $subnets->{$subnetid} = $subnet;
66 }
67 return $subnets;
68
69}
70
70b03506 71sub get_next_free_ip {
e612faf6 72 my ($vnetid, $hostname, $ipversion) = @_;
70b03506
AD
73
74 $ipversion = 4 if !$ipversion;
e612faf6 75 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid);
70b03506 76 my $ip = undef;
70b03506 77 my $subnetcount = 0;
e612faf6
AD
78
79 foreach my $subnetid (sort keys %{$subnets}) {
80 my $subnet = $subnets->{$subnetid};
70b03506 81 my ($network, $mask) = split(/-/, $subnetid);
e612faf6 82
70b03506
AD
83 next if $ipversion != Net::IP::ip_get_version($network);
84 $subnetcount++;
e612faf6 85 if ($subnet->{ipam}) {
70b03506 86 eval {
ee4f339e 87 $ip = PVE::Network::SDN::Subnets::next_free_ip($subnetid, $subnet, $hostname);
70b03506
AD
88 };
89 warn $@ if $@;
90 }
91 last if $ip;
92 }
93 die "can't find any free ip" if !$ip && $subnetcount > 0;
94
95 return $ip;
96}
97
98sub add_ip {
e612faf6
AD
99 my ($vnetid, $cidr, $hostname) = @_;
100
101 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid);
70b03506
AD
102
103 my ($ip, $mask) = split(/\//, $cidr);
e612faf6 104 my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $subnets);
70b03506 105
ee4f339e 106 PVE::Network::SDN::Subnets::add_ip($subnetid, $subnet, $ip, $hostname);
70b03506
AD
107}
108
109sub del_ip {
e612faf6
AD
110 my ($vnetid, $cidr, $hostname) = @_;
111
112 my $subnets = PVE::Network::SDN::Vnets::get_subnets($vnetid);
70b03506
AD
113
114 my ($ip, $mask) = split(/\//, $cidr);
e612faf6 115 my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $subnets);
70b03506 116
ee4f339e 117 PVE::Network::SDN::Subnets::del_ip($subnetid, $subnet, $ip, $hostname);
70b03506
AD
118}
119
f5eabba0 1201;