VeriFlow: Verifying Network-Wide Invariants in Real Time
-
check network-wide invariants in real time, as the network state evolves
-
a layer between a software-defined networking controller and network devices that checks for network-wide invariant violations dynamically
-
incremental algorithms
- slice the network into a set of equivalence classes (ECs) of packets based on the new rule and the existing rules that overlap with the new rule
- build individual forwarding graphs for each of these ECs using the current network state
- traverse these graphs to query the status of one or more invariants
-
reachability checks
- NP-Complete
- packet filters
- arbitrary programs allowed
- real-time checks
- solution
- monitor all the network update events in a live network
- confine our verification activities to only those parts of the network whose actions may be influenced by a new update
- a custom algorithm
- NP-Complete
-
jobs
- track every forwarding-state change event -> intercept all these rules and verify them before they reach the network
- a shim layer between the controller and the network and monitors all communication in either direction
- verify the effect of the rule on the entire network at very high speeds
- slice the network into a set of equivalence classes of packets * based on the new rule and the existing rules that overlap with the new rule * Packets belonging to an equivalence class experience the same forwarding actions throughout the network * data structure to quickly store new network rules and find overlapping rules <- prefix tree or trie (an ordered tree data structure that is used to store an associative array)
- build individual forwarding graphs for every equivalence class using the current network state * a node represents an equivalence class at a particular device * a directed edge from node A to node B if according to the forwarding table at node A, the next hop for the equivalence class is node B * For each equivalence class, we traverse the trie structure to find the devices and rules that match packets from that equivalence class, and build the graph using this information.
- run queries
* an algorithm, which takes as input an invariant to be checked, traverses the forwarding graphs of the affected equivalence classes, and outputs information about whether the invariant holds.
* traverse every forwarding graph using depth-first search
* encounter a node
- twice -> routing loop
- not have any outgoing edge -> black hole * if violated -> execute an associated action that is pre-configured for each invariant by the network operator
- drop the rule
- install the rule but generating an alarm for the operator
-
implementation
- intercept all network events in an OpenFlow network in a transparent manner
- as a proxy application
- determine message boundaries within this stream of bytes and filter out rule insertion/deletion messages
- buffer and check whether a complete OpenFlow message or not
- Flow Modification message -> invokes rule verification module
- use of trie structure
- consider each rule as a binary string and use individual bits to prepare the trie
- each node has three branches
- if the corresponding rule bit is 0 -> 0 and the don’t care branch
- the bit is 1 -> 1 and the don’t care branch
- the bit is don’t care -> explore all the branches of the current node
- the leaves store the actual rules that are represented by the path that leads to a particular leaf starting from the root of the trie.
- graph-cache based strategy to speed up
- maintain a cache of forwarding graphs indexed by their equivalence classes
- some equivalent classes will remain common across multiple rule insertions and their forwarding graphs can be reused by updating the graphs with the new rules.
- maintain a cache of forwarding graphs indexed by their equivalence classes
- intercept all network events in an OpenFlow network in a transparent manner