]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/SDN/FrrPlugin.pm
vxlan: frr : remove unneeded prefix-list
[pve-network.git] / PVE / Network / SDN / FrrPlugin.pm
CommitLineData
32602a38
AD
1package PVE::Network::SDN::FrrPlugin;
2
3use strict;
4use warnings;
5use PVE::Network::SDN::Plugin;
6use PVE::Tools;
7
8use base('PVE::Network::SDN::Plugin');
9
10sub type {
11 return 'frr';
12}
13
14sub properties {
15 return {
16 'asn' => {
17 type => 'integer',
18 description => "autonomous system number",
19 },
20 'peers' => {
21 description => "peers address list.",
7d35eaf5 22 type => 'string', #fixme: format
32602a38
AD
23 },
24 };
25}
26
27sub options {
28
29 return {
30 'uplink-id' => { optional => 0 },
31 'asn' => { optional => 0 },
32 'peers' => { optional => 0 },
33 };
34}
35
36# Plugin implementation
87d8b623
AD
37sub generate_frr_config {
38 my ($class, $plugin_config, $asn, $id, $uplinks, $config) = @_;
32602a38 39
32602a38
AD
40 my @peers = split(',', $plugin_config->{'peers'}) if $plugin_config->{'peers'};
41
42 my $uplink = $plugin_config->{'uplink-id'};
43
32602a38
AD
44 my $iface = "uplink$uplink";
45 my $ifaceip = "";
46
47 if($uplinks->{$uplink}->{name}) {
48 $iface = $uplinks->{$uplink}->{name};
87d8b623 49 $ifaceip = PVE::Network::SDN::Plugin::get_first_local_ipv4_from_interface($iface);
32602a38
AD
50 }
51
17854295 52
93dea3aa
AD
53 my @router_config = ();
54
93dea3aa 55 push @router_config, "bgp router-id $ifaceip";
bc49b410
AD
56 push @router_config, "no bgp default ipv4-unicast";
57 push @router_config, "no bgp default ipv6-unicast";
93dea3aa 58 push @router_config, "coalesce-time 1000";
32602a38
AD
59
60 foreach my $address (@peers) {
61 next if $address eq $ifaceip;
93dea3aa 62 push @router_config, "neighbor $address remote-as $asn";
7d35eaf5 63 }
17854295
AD
64 push(@{$config->{router}->{"bgp $asn"}->{""}}, @router_config);
65 @router_config = ();
32602a38
AD
66 foreach my $address (@peers) {
67 next if $address eq $ifaceip;
17854295 68 push @router_config, "neighbor $address activate";
32602a38 69 }
17854295
AD
70 push @router_config, "advertise-all-vni";
71 push(@{$config->{router}->{"bgp $asn"}->{"address-family"}->{"l2vpn evpn"}}, @router_config);
32602a38
AD
72
73 return $config;
74}
75
76sub on_delete_hook {
5bda8607 77 my ($class, $routerid, $sdn_cfg) = @_;
32602a38 78
5bda8607
AD
79 # verify that transport is associated to this router
80 foreach my $id (keys %{$sdn_cfg->{ids}}) {
81 my $sdn = $sdn_cfg->{ids}->{$id};
82 die "router $routerid is used by $id"
83 if (defined($sdn->{router}) && $sdn->{router} eq $routerid);
84 }
32602a38
AD
85}
86
87sub on_update_hook {
5bda8607
AD
88 my ($class, $routerid, $sdn_cfg) = @_;
89
90 # verify that asn is not already used by another router
91 my $asn = $sdn_cfg->{ids}->{$routerid}->{asn};
92 foreach my $id (keys %{$sdn_cfg->{ids}}) {
93 next if $id eq $routerid;
94 my $sdn = $sdn_cfg->{ids}->{$id};
95 die "asn $asn is already used by $id"
96 if (defined($sdn->{asn}) && $sdn->{asn} eq $asn);
97 }
32602a38
AD
98}
99
1001;
101
102