From 73e72978f3886fa589bd36e773551d92de73010a Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Mon, 21 Oct 2024 22:52:14 -0300 Subject: [PATCH] isis: originate hello and link-state PDUs with IPv6 TLVs Signed-off-by: Renato Westphal --- holo-isis/src/interface.rs | 12 +++++++++++- holo-isis/src/lib.rs | 2 +- holo-isis/src/lsdb.rs | 34 ++++++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/holo-isis/src/interface.rs b/holo-isis/src/interface.rs index 5fe6b77c..3e05705c 100644 --- a/holo-isis/src/interface.rs +++ b/holo-isis/src/interface.rs @@ -445,6 +445,7 @@ impl Interface { // Set IP information. let mut protocols_supported = vec![]; let mut ipv4_addrs = vec![]; + let mut ipv6_addrs = vec![]; if self .config .is_af_enabled(AddressFamily::Ipv4, instance.config) @@ -454,6 +455,15 @@ impl Interface { self.system.ipv4_addr_list.iter().map(|addr| addr.ip()), ); } + if self + .config + .is_af_enabled(AddressFamily::Ipv6, instance.config) + { + protocols_supported.push(Nlpid::Ipv6 as u8); + ipv6_addrs.extend( + self.system.ipv6_addr_list.iter().map(|addr| addr.ip()), + ); + } Pdu::Hello(Hello::new( level, @@ -466,7 +476,7 @@ impl Interface { area_addrs, neighbors, ipv4_addrs, - [], + ipv6_addrs, ), )) } diff --git a/holo-isis/src/lib.rs b/holo-isis/src/lib.rs index abd65ba6..2af67cbd 100644 --- a/holo-isis/src/lib.rs +++ b/holo-isis/src/lib.rs @@ -11,7 +11,7 @@ feature = "testing", allow(dead_code, unused_variables, unused_imports) )] -#![feature(let_chains)] +#![feature(ip, let_chains)] pub mod adjacency; pub mod collections; diff --git a/holo-isis/src/lsdb.rs b/holo-isis/src/lsdb.rs index e075ff80..82f8065e 100644 --- a/holo-isis/src/lsdb.rs +++ b/holo-isis/src/lsdb.rs @@ -13,7 +13,7 @@ use std::time::Instant; use bitflags::bitflags; use derive_new::new; -use holo_utils::ip::{AddressFamily, Ipv4NetworkExt}; +use holo_utils::ip::{AddressFamily, Ipv4NetworkExt, Ipv6NetworkExt}; use holo_utils::task::TimeoutTask; use holo_utils::UnboundedSender; @@ -25,7 +25,9 @@ use crate::interface::{Interface, InterfaceType}; use crate::northbound::notification; use crate::packet::consts::LspFlags; use crate::packet::pdu::{Lsp, LspTlvs}; -use crate::packet::tlv::{ExtIpv4Reach, ExtIsReach, Ipv4Reach, IsReach, Nlpid}; +use crate::packet::tlv::{ + ExtIpv4Reach, ExtIsReach, Ipv4Reach, Ipv6Reach, IsReach, Nlpid, +}; use crate::packet::{LanId, LevelNumber, LspId}; use crate::tasks::messages::input::LspPurgeMsg; use crate::{spf, tasks}; @@ -171,11 +173,16 @@ fn lsp_build_tlvs( let mut ipv4_addrs = vec![]; let mut ipv4_internal_reach = vec![]; let mut ext_ipv4_reach = vec![]; + let mut ipv6_addrs = vec![]; + let mut ipv6_reach = vec![]; // Add supported protocols. if instance.config.is_af_enabled(AddressFamily::Ipv4) { protocols_supported.push(Nlpid::Ipv4 as u8); } + if instance.config.is_af_enabled(AddressFamily::Ipv6) { + protocols_supported.push(Nlpid::Ipv6 as u8); + } // Iterate over all active interfaces. for iface in arenas.interfaces.iter().filter(|iface| iface.state.active) { @@ -247,6 +254,25 @@ fn lsp_build_tlvs( } } } + + // Add IPv6 information. + if instance.config.is_af_enabled(AddressFamily::Ipv6) { + for addr in iface + .system + .ipv6_addr_list + .iter() + .filter(|addr| !addr.ip().is_unicast_link_local()) + { + ipv6_addrs.push(addr.ip()); + ipv6_reach.push(Ipv6Reach { + metric, + up_down: false, + external: false, + prefix: addr.apply_mask(), + sub_tlvs: Default::default(), + }); + } + } } LspTlvs::new( protocols_supported, @@ -257,8 +283,8 @@ fn lsp_build_tlvs( ipv4_internal_reach, [], ext_ipv4_reach, - [], - [], + ipv6_addrs, + ipv6_reach, ) }