lib,zebra: Allow class E prefixes in RIB

Changes allow ipv4 class E addresses and prefixes in the 240.0.0.0/4
range to be configured on interfaces, imported from the kernel routing
table and redistributed as connected routes in zebra by default.

Changes also fix routes with class E prefixes in kernel routing table
getting rejected by zebra during early daemon startup.

Drivin this change in default behavior are cloud providers (with
customers still using obsolete ipv4 protocol, i.e. Azure, AWS) running
out of ip space and abusing class E for addressing instances (announced
via BGP) over tunneling connections back to customers on premise
infrastructure.

Signed-off-by: David Schweizer <dschweizer@opensourcerouting.org>
This commit is contained in:
David Schweizer 2025-02-12 13:07:38 +01:00
parent 196b7f1c31
commit 1eef3a77e3
No known key found for this signature in database
GPG key ID: A07D97BEEE79EF7F
2 changed files with 7 additions and 5 deletions

View file

@ -1439,10 +1439,13 @@ bool ipv4_unicast_valid(const struct in_addr *addr)
{
in_addr_t ip = ntohl(addr->s_addr);
if (IPV4_CLASS_E(ip))
return true;
if (IPV4_CLASS_D(ip))
return false;
if (IPV4_NET0(ip) || IPV4_NET127(ip) || IPV4_CLASS_E(ip)) {
if (IPV4_NET0(ip) || IPV4_NET127(ip)) {
if (cmd_allow_reserved_ranges_get())
return true;
else

View file

@ -391,11 +391,10 @@ int zebra_check_addr(const struct prefix *p)
if (p->family == AF_INET) {
uint32_t addr;
addr = p->u.prefix4.s_addr;
addr = ntohl(addr);
addr = ntohl(p->u.prefix4.s_addr);
if (IPV4_NET127(addr) || IN_CLASSD(addr)
|| IPV4_LINKLOCAL(addr))
if (IPV4_NET127(addr) || IN_CLASSD(addr) ||
(IPV4_LINKLOCAL(addr) && !IPV4_CLASS_E(addr)))
return 0;
}
if (p->family == AF_INET6) {