Home

Awesome

MIT licensed Build Status codecov Discord

Holo is a suite of routing protocols designed to support high-scale and automation-driven networks.

For a description of what a routing protocol is, please refer to this Wikipedia page.

Architecture

The image below shows the different logical layers of the Holo software stack:

<p align="center"> <img src="http://westphal.com.br/holo/holo-layers2.png"> </p>

Items with a gray background have not been implemented yet. For more comprehensive and detailed information, please refer to the Architecture page.

Features

Focus on simplicity and correctness

Holo's main goal is to create a reliable, easy-to-maintain, and extensible codebase. With the ever increasing complexity of routing protocols and their extensions, it's crucial to have routing protocol implementations built on a robust foundation. To that end, Holo's codebase prioritizes simplicity, modularity, and thorough documentation. Thanks to the strictness of the Rust compiler and extensive unit tests, it's expected that most regressions will be caught early in the development cycle of new features.

Automation-ready

Holo was developed specifically for high-scale, automation-driven networks that require programmable configuration and monitoring using structured and modeled data. Holo natively implements standard YANG modules from IETF and supports multiple management interfaces, including native gRPC and gNMI. Additionally, Holo features a standalone CLI that dynamically renders commands from YANG modules and communicates with the Holo daemon through gRPC.

The changes made to the configuration are processed as transactions, guaranteeing that either all the changes are applied or none at all. This feature is a significant facilitator of network automation as it eliminates the need for error recovery in management applications. Holo also supports network-wide transactions involving multiple network devices. Additional network automation capabilities include confirmed commits and configuration rollback support.

Security

By virtue of being written in a memory-safe language, Holo is immune to a wide variety of memory-related bugs and security vulnerabilities. Besides the safety guarantees provided by Rust, the Holo daemon runs in a chroot jail and drops privileges at startup. For certain operations, like binding sockets, Linux capabilities are used to gain the minimum required permission for the least amount of time.

Integrated protocol implementations

Some protocols, such as OSPF and RIP, have different versions that are widely deployed, typically one for IPv4 and another for IPv6. Holo leverages Rust's generics to have version-agnostic protocol implementations, where most of the code is shared by the different protocol versions. This approach reduces the maintenance cost of these protocols and facilitates shipping new features that benefit all protocol versions.

Parallelism

Holo makes extensive use of asynchronous operations and relies on the Tokio runtime to schedule tasks and run them on a thread pool. In order to achieve better performance, both I/O requests and CPU-intensive algorithms are offloaded to separate tasks, maximizing the utilization of all available CPU cores. Support for runtime-agnostic code is planned for the future, once the necessary abstractions are standardized by the Rust language team.

Structured logging

Holo generates log messages that contain structured data, which can be presented in various formats such as JSON, text, etc. As logging is carried out through the tracing facade, diverse tracing subscribers can be utilized to meet different user requirements. For instance, logging can be directed to a file, journald, a centralized OpenTelemetry collector, or any combination of these options with potentially varying logging levels.

Reproducible bugs

Holo provides record-and-replay functionality, enabling easy reproduction of any user-reported bug. The Holo daemon can be set up to record the complete lifespan of a protocol instance to a file. That file can then be played back on another machine, reproducing the same sequence of events. While a recording session may last for hours or days, the playback process should take only a few seconds. This is feasible thanks to Holo's modular architecture, where all time-related and I/O operations are performed in separate tasks and abstracted as event messages.

Installation

Holo uses unstable Rust features, so building it from the source code requires a nightly version of the Rust compiler.

For detailed instructions on installation, please refer to the INSTALL.md file.

Supported Platforms

At present, Holo is only compatible with Linux operating systems.

WebAssembly support is planned for the future. This addition will enable simulation of large networks from within your browser, making network experimentation more convenient and accessible to everyone.

Getting Started

The easiest way to start using Holo is by using pre-built Docker containers in combination with the containerlab software. You can find a variety of pre-configured network topologies at this link. These topologies can be deployed with a single command, allowing you to test Holo in various network setups, including interoperability testing with other implementations.

Additionally, Holo can be used wherever a routing stack is required, such as in software routers, provided that the feature set aligns with your specific needs.

Compliance

Holo supports the following IETF RFCs and Internet drafts:

BFD
BGP
MPLS LDP
OSPF
RIP
IETF YANG implementation coverage
ModuleConfigurationStateRPCsNotificationsTotal
ietf-bfd-ip-mh@2022-09-22100.00%100.00%-100.00%100.00%
ietf-bfd-ip-sh@2022-09-22100.00%100.00%-100.00%100.00%
ietf-bfd@2022-09-22100.00%100.00%--100.00%
ietf-bgp-policy@2023-07-05100.00%---100.00%
ietf-bgp@2023-07-0532.38%85.95%--60.40%
ietf-if-extensions@2023-01-26100.00%0.00%--50.00%
ietf-if-vlan-encapsulation@2023-01-2642.86%---42.86%
ietf-interfaces@2018-01-09100.00%0.00%--22.22%
ietf-ip@2018-01-0952.17%0.00%--40.00%
ietf-ipv4-unicast-routing@2018-03-13100.00%100.00%--100.00%
ietf-ipv6-unicast-routing@2018-03-1340.62%100.00%--45.71%
ietf-key-chain@2017-04-18100.00%100.00%--100.00%
ietf-mpls-ldp@2022-03-1486.96%92.31%100.00%100.00%92.38%
ietf-mpls@2020-12-180.00%57.14%--35.29%
ietf-ospf-sr-mpls@2024-01-1825.00%53.95%--52.81%
ietf-ospf@2022-10-1975.00%59.64%100.00%41.94%59.57%
ietf-ospfv3-extended-lsa@2024-01-1650.00%85.28%--84.85%
ietf-rip@2020-02-2027.91%93.33%100.00%-55.41%
ietf-routing-policy@2021-10-11100.00%0.00%--98.11%
ietf-routing@2018-03-13100.00%85.71%--92.31%
ietf-segment-routing-mpls@2021-05-2662.50%0.00%-23.53%32.76%
ietf-segment-routing@2021-05-26100.00%---100.00%
ietf-system@2014-08-0626.67%60.00%0.00%-38.24%

Funding

This project is funded through NGI Zero Core, a fund established by NLnet with financial support from the European Commission's Next Generation Internet program. Learn more at the NLnet project page.

<img src="https://nlnet.nl/logo/banner.png" alt="NLnet foundation logo" width="20%" /> <img src="https://nlnet.nl/image/logos/NGI0_tag.svg" alt="NGI Zero Logo" width="20%" />

License

This project is licensed under the MIT license.

Contribution

We welcome any contributions, from bug reports to Pull Requests. Please refer to our Project Wishlist for ideas on where to contribute.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Holo by you, shall be licensed as MIT, without any additional terms or conditions.