Everything is designed but only a few things are designed well. Open/R is one of the few. It is primarily designed to facilitate distributed computation on a network of nodes. Routing is a core functionality implemented on the top, unlike other protocols where design is greatly influenced by routing functions.
CPU & Memory
Premature optimization is the root of all evil. Unlike traditional routing
protocol designs, we’re intentionally ignoring the optimization considerations
compute. The design should solely focus on core
functionalities. Further, the processing power and memory size of core
networking devices have improved manyfold over the past few decades.
Make a program do one thing and do it better
(p.s. Unix Philosphy).
Borrowing ideas of
extensibility in the design
of Open/R. Read more about
Avoid complex design patterns. With the modular design, build new things on the top rather than extending existing modules.
Don’t re-invent the wheel. Maximize the reuse of existing and well-tested libraries/components (e.g. thrift, folly). This helps us with rapid development and a lower code footprint to maintain. Hence we strive to focus on solving the right problem.
Use asynchronous communication patterns to bake efficiency in the design itself.
Open/R process consists of multiple modules stitched together with a messaging interface. Below we describe module invariants
Module is a C++ class instantiation
Is independent of other modules. i.e. You can instantiate the module without creating an instance of other modules
It does one thing and does it well
Provides thread-safe public APIs for accessing or modifying internal state for RPC APIs
Uses Messaging interface for talking to other modules
The picture below describes Open/R modules and their interactions
The diagram above doesn’t intend to capture every single detail of the message flow. For more details refer to the module’s documentation.
NOTE: BGP Speaker functionality is not open-sourced, but it is possible for a developer to create integrate with BGP with their own implementation.
Every arrow in the picture above depicts a flow of messages from one module to another. Such flow of messages is powered by Messaging library. Multiple arrows may be supported by just one queue e.g. RIB Updates from the Decision to multiple modules (Fib, Decision, PrefixManager) is supported by single queue instance.
For more details on all the queue types and their message type refer to
openr/Main.cpp. All queue initialization happens in that code.