1 package PVE
::Network
::SDN
::Zones
::EvpnPlugin
;
5 use PVE
::Network
::SDN
::Zones
::VxlanPlugin
;
6 use PVE
::Tools
qw($IPV4RE);
8 use PVE
::Network
::SDN
::Controllers
::EvpnPlugin
;
10 use base
('PVE::Network::SDN::Zones::VxlanPlugin');
20 description
=> "l3vni.",
24 description
=> "Frr router name",
32 nodes
=> { optional
=> 1},
33 'vrf-vxlan' => { optional
=> 0 },
34 'controller' => { optional
=> 0 },
35 mtu
=> { optional
=> 1 },
39 # Plugin implementation
40 sub generate_sdn_config
{
41 my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $subnet_cfg, $interfaces_config, $config) = @_;
43 my $tag = $vnet->{tag
};
44 my $alias = $vnet->{alias
};
45 my $ipv4 = $vnet->{ipv4
};
46 my $ipv6 = $vnet->{ipv6
};
47 my $mac = $vnet->{mac
};
49 my $vrf_iface = "vrf_$zoneid";
50 my $vrfvxlan = $plugin_config->{'vrf-vxlan'};
52 die "missing vxlan tag" if !$tag;
53 warn "vlan-aware vnet can't be enabled with evpn plugin" if $vnet->{vlanaware
};
55 my @peers = PVE
::Tools
::split_list
($controller->{'peers'});
56 my ($ifaceip, $iface) = PVE
::Network
::SDN
::Zones
::Plugin
::find_local_ip_interface_peers
(\
@peers);
59 $mtu = $interfaces_config->{$iface}->{mtu
} - 50 if $interfaces_config->{$iface}->{mtu
};
60 $mtu = $plugin_config->{mtu
} if $plugin_config->{mtu
};
63 my $vxlan_iface = "vxlan_$vnetid";
64 my @iface_config = ();
65 push @iface_config, "vxlan-id $tag";
66 push @iface_config, "vxlan-local-tunnelip $ifaceip" if $ifaceip;
67 push @iface_config, "bridge-learning off";
68 push @iface_config, "bridge-arp-nd-suppress on";
70 push @iface_config, "mtu $mtu" if $mtu;
71 push(@{$config->{$vxlan_iface}}, @iface_config) if !$config->{$vxlan_iface};
76 my @subnets = PVE
::Tools
::split_list
($vnet->{subnets
}) if $vnet->{subnets
};
77 foreach my $subnet (@subnets) {
78 next if !defined($subnet_cfg->{ids
}->{$subnet});
79 push @iface_config, "address $subnet_cfg->{ids}->{$subnet}->{gateway}" if $subnet_cfg->{ids
}->{$subnet}->{gateway
};
82 push @iface_config, "hwaddress $mac" if $mac;
83 push @iface_config, "bridge_ports $vxlan_iface";
84 push @iface_config, "bridge_stp off";
85 push @iface_config, "bridge_fd 0";
86 push @iface_config, "mtu $mtu" if $mtu;
87 push @iface_config, "alias $alias" if $alias;
88 push @iface_config, "ip-forward on" if $ipv4;
89 push @iface_config, "ip6-forward on" if $ipv6;
90 push @iface_config, "arp-accept on" if $ipv4||$ipv6;
91 push @iface_config, "vrf $vrf_iface" if $vrf_iface;
92 push(@{$config->{$vnetid}}, @iface_config) if !$config->{$vnetid};
97 push @iface_config, "vrf-table auto";
98 push(@{$config->{$vrf_iface}}, @iface_config) if !$config->{$vrf_iface};
101 #l3vni vxlan interface
102 my $iface_vrf_vxlan = "vrfvx_$zoneid";
104 push @iface_config, "vxlan-id $vrfvxlan";
105 push @iface_config, "vxlan-local-tunnelip $ifaceip" if $ifaceip;
106 push @iface_config, "bridge-learning off";
107 push @iface_config, "bridge-arp-nd-suppress on";
108 push @iface_config, "mtu $mtu" if $mtu;
109 push(@{$config->{$iface_vrf_vxlan}}, @iface_config) if !$config->{$iface_vrf_vxlan};
112 my $brvrf = "vrfbr_$zoneid";
114 push @iface_config, "bridge-ports $iface_vrf_vxlan";
115 push @iface_config, "bridge_stp off";
116 push @iface_config, "bridge_fd 0";
117 push @iface_config, "mtu $mtu" if $mtu;
118 push @iface_config, "vrf $vrf_iface";
119 push(@{$config->{$brvrf}}, @iface_config) if !$config->{$brvrf};
127 my ($class, $zoneid, $zone_cfg, $controller_cfg) = @_;
129 # verify that controller exist
130 my $controller = $zone_cfg->{ids
}->{$zoneid}->{controller
};
131 if (!defined($controller_cfg->{ids
}->{$controller})) {
132 die "controller $controller don't exist";
134 die "$controller is not a evpn controller type" if $controller_cfg->{ids
}->{$controller}->{type
} ne 'evpn';
137 #vrf-vxlan need to be defined
139 my $vrfvxlan = $zone_cfg->{ids
}->{$zoneid}->{'vrf-vxlan'};
140 # verify that vrf-vxlan is not already declared in another zone
141 foreach my $id (keys %{$zone_cfg->{ids
}}) {
142 next if $id eq $zoneid;
143 die "vrf-vxlan $vrfvxlan is already declared in $id"
144 if (defined($zone_cfg->{ids
}->{$id}->{'vrf-vxlan'}) && $zone_cfg->{ids
}->{$id}->{'vrf-vxlan'} eq $vrfvxlan);
149 my ($class, $tag) = @_;
151 raise_param_exc
({ tag
=> "missing vxlan tag"}) if !defined($tag);
152 raise_param_exc
({ tag
=> "vxlan tag max value is 16777216"}) if $tag > 16777216;