]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/SDN/FrrPlugin.pm
add frr plugin
[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.",
22 type => 'string', #fixme: format
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
37sub generate_frr_config {
38 my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks) = @_;
39
40 my $asn = $plugin_config->{'asn'};
41 my @peers = split(',', $plugin_config->{'peers'}) if $plugin_config->{'peers'};
42
43 my $uplink = $plugin_config->{'uplink-id'};
44
45 die "missing peers" if !$plugin_config->{'peers'};
46
47 my $iface = "uplink$uplink";
48 my $ifaceip = "";
49
50 if($uplinks->{$uplink}->{name}) {
51 $iface = $uplinks->{$uplink}->{name};
52 $ifaceip = get_first_local_ipv4_from_interface($iface);
53 }
54
55 my $config = "\n";
56 $config .= "router bgp $asn\n";
57 $config .= "bgp router-id $ifaceip\n";
58 $config .= "no bgp default ipv4-unicast\n";
59 $config .= "coalesce-time 1000\n";
60
61 foreach my $address (@peers) {
62 next if $address eq $ifaceip;
63 $config .= "neighbor $address remote-as $asn\n";
64 }
65 $config .= "!\n";
66 $config .= "address-family l2vpn evpn\n";
67 foreach my $address (@peers) {
68 next if $address eq $ifaceip;
69 $config .= " neighbor $address activate\n";
70 }
71 $config .= " advertise-all-vni\n";
72 $config .= "exit-address-family\n";
73 $config .= "!\n";
74 $config .= "line vty\n";
75 $config .= "!\n";
76
77
78 return $config;
79}
80
81sub on_delete_hook {
82 my ($class, $transportid, $sdn_cfg) = @_;
83
84}
85
86sub on_update_hook {
87 my ($class, $transportid, $sdn_cfg) = @_;
88
89}
90
911;
92
93