Skip to content

Commit 5065366

Browse files
committed
isis: use unified map for interface addresses and redistributed routes
Eliminate code duplication by replacing separate IPv4/IPv6 maps with a unified map. Signed-off-by: Renato Westphal <[email protected]>
1 parent 319ef65 commit 5065366

File tree

6 files changed

+67
-64
lines changed

6 files changed

+67
-64
lines changed

holo-isis/src/ibus/rx.rs

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use holo_utils::southbound::{
1616
AddressMsg, InterfaceUpdateMsg, RouteKeyMsg, RouteMsg,
1717
};
1818
use holo_utils::sr::SrCfg;
19-
use ipnetwork::IpNetwork;
2019

2120
use crate::adjacency::{AdjacencyEvent, AdjacencyState};
2221
use crate::error::Error;
@@ -89,14 +88,7 @@ pub(crate) fn process_addr_add(instance: &mut Instance, msg: AddressMsg) {
8988
let iface_idx = iface.index;
9089

9190
// Add address to interface.
92-
match msg.addr {
93-
IpNetwork::V4(addr) => {
94-
iface.system.ipv4_addr_list.insert(addr);
95-
}
96-
IpNetwork::V6(addr) => {
97-
iface.system.ipv6_addr_list.insert(addr);
98-
}
99-
}
91+
iface.system.addr_list.insert(msg.addr);
10092

10193
if let Some((mut instance, arenas)) = instance.as_up() {
10294
let iface = &mut arenas.interfaces[iface_idx];
@@ -122,14 +114,7 @@ pub(crate) fn process_addr_del(instance: &mut Instance, msg: AddressMsg) {
122114
let iface_idx = iface.index;
123115

124116
// Remove address from interface.
125-
match msg.addr {
126-
IpNetwork::V4(addr) => {
127-
iface.system.ipv4_addr_list.remove(&addr);
128-
}
129-
IpNetwork::V6(addr) => {
130-
iface.system.ipv6_addr_list.remove(&addr);
131-
}
132-
}
117+
iface.system.addr_list.remove(&msg.addr);
133118

134119
if let Some((mut instance, arenas)) = instance.as_up() {
135120
let iface = &mut arenas.interfaces[iface_idx];
@@ -173,16 +158,8 @@ pub(crate) fn process_route_add(instance: &mut Instance, msg: RouteMsg) {
173158
tag: msg.tag,
174159
opaque_attrs: msg.opaque_attrs,
175160
};
176-
match prefix {
177-
IpNetwork::V4(prefix) => {
178-
let routes = instance.system.ipv4_routes.get_mut(level);
179-
routes.insert(prefix, route);
180-
}
181-
IpNetwork::V6(prefix) => {
182-
let routes = instance.system.ipv6_routes.get_mut(level);
183-
routes.insert(prefix, route);
184-
}
185-
}
161+
let routes = instance.system.routes.get_mut(level);
162+
routes.insert(prefix, route);
186163

187164
// Schedule LSP reorigination.
188165
if let Some((mut instance, _)) = instance.as_up() {
@@ -212,16 +189,8 @@ pub(crate) fn process_route_del(instance: &mut Instance, msg: RouteKeyMsg) {
212189
})
213190
.collect::<Vec<_>>()
214191
{
215-
match prefix {
216-
IpNetwork::V4(prefix) => {
217-
let routes = instance.system.ipv4_routes.get_mut(level);
218-
routes.remove(&prefix);
219-
}
220-
IpNetwork::V6(prefix) => {
221-
let routes = instance.system.ipv6_routes.get_mut(level);
222-
routes.remove(&prefix);
223-
}
224-
}
192+
let routes = instance.system.routes.get_mut(level);
193+
routes.remove(&prefix);
225194

226195
// Schedule LSP reorigination.
227196
if let Some((mut instance, _)) = instance.as_up() {

holo-isis/src/instance.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ use holo_protocol::{
1919
use holo_utils::ibus::IbusMsg;
2020
use holo_utils::protocol::Protocol;
2121
use holo_utils::task::TimeoutTask;
22-
use ipnetwork::{IpNetwork, Ipv4Network, Ipv6Network};
22+
use ipnetwork::IpNetwork;
23+
use prefix_trie::joint::map::JointPrefixMap;
2324
use tokio::sync::mpsc;
2425
use tokio::sync::mpsc::{Receiver, Sender, UnboundedReceiver, UnboundedSender};
2526

@@ -66,8 +67,7 @@ pub struct InstanceSys {
6667
// System Router ID.
6768
pub router_id: Option<Ipv4Addr>,
6869
// Redistributed routes.
69-
pub ipv4_routes: Levels<BTreeMap<Ipv4Network, RouteSys>>,
70-
pub ipv6_routes: Levels<BTreeMap<Ipv6Network, RouteSys>>,
70+
pub routes: Levels<JointPrefixMap<IpNetwork, RouteSys>>,
7171
}
7272

7373
#[derive(Debug)]

holo-isis/src/interface.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ use std::sync::Arc;
1212
use std::sync::atomic::AtomicU32;
1313

1414
use chrono::{DateTime, Utc};
15-
use holo_utils::ip::AddressFamily;
15+
use holo_utils::ip::{AddressFamily, JointPrefixSetExt};
1616
use holo_utils::socket::{AsyncFd, Socket, SocketExt};
1717
use holo_utils::southbound::InterfaceFlags;
1818
use holo_utils::task::{IntervalTask, Task, TimeoutTask};
19-
use ipnetwork::{Ipv4Network, Ipv6Network};
19+
use ipnetwork::IpNetwork;
20+
use prefix_trie::joint::set::JointPrefixSet;
2021
use tokio::sync::mpsc;
2122
use tokio::sync::mpsc::UnboundedSender;
2223

@@ -51,8 +52,7 @@ pub struct InterfaceSys {
5152
pub ifindex: Option<u32>,
5253
pub mtu: Option<u32>,
5354
pub mac_addr: Option<[u8; 6]>,
54-
pub ipv4_addr_list: BTreeSet<Ipv4Network>,
55-
pub ipv6_addr_list: BTreeSet<Ipv6Network>,
55+
pub addr_list: JointPrefixSet<IpNetwork>,
5656
}
5757

5858
#[derive(Debug, Default)]
@@ -551,7 +551,7 @@ impl Interface {
551551
{
552552
protocols_supported.push(Nlpid::Ipv4 as u8);
553553
ipv4_addrs.extend(
554-
self.system.ipv4_addr_list.iter().map(|addr| addr.ip()),
554+
self.system.addr_list.ipv4().iter().map(|addr| addr.ip()),
555555
);
556556
}
557557
if self
@@ -561,7 +561,8 @@ impl Interface {
561561
protocols_supported.push(Nlpid::Ipv6 as u8);
562562
ipv6_addrs.extend(
563563
self.system
564-
.ipv6_addr_list
564+
.addr_list
565+
.ipv6()
565566
.iter()
566567
.filter(|addr| addr.ip().is_unicast_link_local())
567568
.map(|addr| addr.ip()),

holo-isis/src/lsdb.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ use holo_utils::bier::{
1818
BierEncapId, BierEncapsulationType, BierInBiftId, BiftId,
1919
UnderlayProtocolType,
2020
};
21-
use holo_utils::ip::{AddressFamily, Ipv4NetworkExt, Ipv6NetworkExt};
21+
use holo_utils::ip::{
22+
AddressFamily, Ipv4NetworkExt, Ipv6NetworkExt, JointPrefixMapExt,
23+
JointPrefixSetExt,
24+
};
2225
use holo_utils::mpls::Label;
2326
use holo_utils::sr::{IgpAlgoType, Sid, SidLastHopBehavior, SrCfgPrefixSid};
2427
use holo_utils::task::TimeoutTask;
@@ -639,7 +642,7 @@ fn lsp_build_tlvs_ip_local(
639642
.is_af_enabled(AddressFamily::Ipv4, instance.config)
640643
{
641644
let metric_type = instance.config.metric_type.get(level);
642-
for addr in iface.system.ipv4_addr_list.iter() {
645+
for addr in iface.system.addr_list.ipv4().iter() {
643646
ipv4_addrs.insert(addr.ip());
644647

645648
let prefix = addr.apply_mask();
@@ -693,7 +696,8 @@ fn lsp_build_tlvs_ip_local(
693696
{
694697
for addr in iface
695698
.system
696-
.ipv6_addr_list
699+
.addr_list
700+
.ipv6()
697701
.iter()
698702
.filter(|addr| !addr.ip().is_unicast_link_local())
699703
{
@@ -736,7 +740,7 @@ fn lsp_build_tlvs_ip_redistributed(
736740
) {
737741
if instance.config.is_af_enabled(AddressFamily::Ipv4) {
738742
let metric_type = instance.config.metric_type.get(level);
739-
for (prefix, route) in instance.system.ipv4_routes.get(level) {
743+
for (prefix, route) in instance.system.routes.get(level).ipv4() {
740744
let prefix = prefix.apply_mask();
741745
if metric_type.is_standard_enabled() {
742746
ipv4_external_reach.insert(
@@ -774,7 +778,7 @@ fn lsp_build_tlvs_ip_redistributed(
774778
}
775779
}
776780
if instance.config.is_af_enabled(AddressFamily::Ipv6) {
777-
for (prefix, route) in instance.system.ipv6_routes.get(level) {
781+
for (prefix, route) in instance.system.routes.get(level).ipv6() {
778782
let prefix = prefix.apply_mask();
779783
let prefix_attr_flags = PrefixAttrFlags::empty();
780784
let sub_tlvs = lsp_build_ipv6_reach_stlvs(

holo-isis/src/northbound/configuration.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use holo_northbound::configuration::{
2121
use holo_northbound::yang::control_plane_protocol::isis;
2222
use holo_utils::bfd;
2323
use holo_utils::crypto::CryptoAlgo;
24-
use holo_utils::ip::AddressFamily;
24+
use holo_utils::ip::{AddressFamily, IpNetworkKind};
2525
use holo_utils::keychain::{Key, Keychains};
2626
use holo_utils::protocol::Protocol;
2727
use holo_utils::yang::DataNodeRefExt;
@@ -2176,16 +2176,10 @@ impl Provider for Instance {
21762176
self.tx.ibus.route_redistribute_unsub(protocol, Some(af));
21772177

21782178
// Remove redistributed routes.
2179-
match af {
2180-
AddressFamily::Ipv4 => {
2181-
let routes = self.system.ipv4_routes.get_mut(level);
2182-
routes.retain(|_, route| route.protocol != protocol);
2183-
}
2184-
AddressFamily::Ipv6 => {
2185-
let routes = self.system.ipv6_routes.get_mut(level);
2186-
routes.retain(|_, route| route.protocol != protocol);
2187-
}
2188-
}
2179+
let routes = self.system.routes.get_mut(level);
2180+
routes.retain(|prefix, route| {
2181+
prefix.address_family() != af || route.protocol != protocol
2182+
});
21892183

21902184
// Schedule LSP reorigination.
21912185
if let Some((mut instance, _)) = self.as_up() {

holo-utils/src/ip.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ use arbitrary::Arbitrary;
1313
use holo_yang::{ToYang, TryFromYang};
1414
use ipnetwork::{IpNetwork, IpNetworkError, Ipv4Network, Ipv6Network};
1515
use num_derive::{FromPrimitive, ToPrimitive};
16-
use prefix_trie::PrefixMap;
1716
use prefix_trie::joint::map::JointPrefixMap;
17+
use prefix_trie::joint::set::JointPrefixSet;
18+
use prefix_trie::{PrefixMap, PrefixSet};
1819
use serde::de::DeserializeOwned;
1920
use serde::{Deserialize, Serialize};
2021

@@ -218,6 +219,20 @@ pub trait JointPrefixMapExt<T> {
218219
fn ipv6_mut(&mut self) -> &mut PrefixMap<Ipv6Network, T>;
219220
}
220221

222+
pub trait JointPrefixSetExt {
223+
// Returns a reference to the IPv4 prefix set.
224+
fn ipv4(&self) -> &PrefixSet<Ipv4Network>;
225+
226+
// Returns a mutable reference to the IPv4 prefix set.
227+
fn ipv4_mut(&mut self) -> &mut PrefixSet<Ipv4Network>;
228+
229+
// Returns a reference to the IPv6 prefix set.
230+
fn ipv6(&self) -> &PrefixSet<Ipv6Network>;
231+
232+
// Returns a mutable reference to the IPv6 prefix set.
233+
fn ipv6_mut(&mut self) -> &mut PrefixSet<Ipv6Network>;
234+
}
235+
221236
// ===== impl AddressFamily =====
222237

223238
impl AddressFamily {
@@ -680,7 +695,7 @@ impl SocketAddrKind<Ipv6Addr> for SocketAddrV6 {
680695
}
681696
}
682697

683-
// ===== impl SocketAddrV6 =====
698+
// ===== impl JointPrefixMap =====
684699

685700
impl<T> JointPrefixMapExt<T> for JointPrefixMap<IpNetwork, T> {
686701
fn ipv4(&self) -> &PrefixMap<Ipv4Network, T> {
@@ -699,3 +714,23 @@ impl<T> JointPrefixMapExt<T> for JointPrefixMap<IpNetwork, T> {
699714
&mut self.t2
700715
}
701716
}
717+
718+
// ===== impl JointPrefixSet =====
719+
720+
impl JointPrefixSetExt for JointPrefixSet<IpNetwork> {
721+
fn ipv4(&self) -> &PrefixSet<Ipv4Network> {
722+
&self.t1
723+
}
724+
725+
fn ipv4_mut(&mut self) -> &mut PrefixSet<Ipv4Network> {
726+
&mut self.t1
727+
}
728+
729+
fn ipv6(&self) -> &PrefixSet<Ipv6Network> {
730+
&self.t2
731+
}
732+
733+
fn ipv6_mut(&mut self) -> &mut PrefixSet<Ipv6Network> {
734+
&mut self.t2
735+
}
736+
}

0 commit comments

Comments
 (0)