## 4 Innovation through SDN-Based Network Applications
### Network Testing, Debugging and Verification  
The SDN framework changes network configuration and operation. Traditionally, network operators configure the network using device-centric configurations, which can be hard to manage and maintain for large networks. With SDN, various software modules and network applications are responsible for programming the network automatically. Network operators will use the abstractions and user interfaces of SDN software to specify network-centric configurations and policies. Obviously, it is vital that the software programs are correct and produce valid device-centric configurations that provide the desired networking behavior. However, such complex software is often susceptible to bugs, and network application programmers must be able to detect and remove bugs from the programs. Many debugging utilities for software programs exist that aid programmers to detect and remove bugs from the code. Inspired by the GNU debugger, _gdb_, the authors of [56] propose a network debugger, called _ndb_. Programmers annotate programs with breakpoints; _gdb_ will stop a running process at the breakpoints, and the programmer can inspect the current program state. _ndb_ provides the same functionality with respect to the networking domain. Network breakpoints can be defined, and _ndb_ generates packet backtraces belonging to the breakpoint. The authors present how _ndb_ modifies flow tables in switches to generate packet traces. This allows network application programmers to reconstruct the sequence of events that caused packets to be falsely forwarded. The OFRewind framework's [57] main goal is to apply network debugging technologies, such as the Simple Network Management Protocol (SNMP), _tcpdump_ and the sampling of network data to OpenFlow-based networks. The tools provided by the framework can be used to reproduce software errors, to identify hardware limitations or to determine the location of configuration errors. The tools provide the means to correctly record the traffic that is sent over the network and allows one to reproduce failure scenarios by replaying the recorded data traffic in a specific test environment. The authors describe the challenge for providing such a scalable and correct platform and how their solution leverages the centralized OpenFlow control plane to implement a controlled testing environment. The authors of [58] propose a solution to test OpenFlow switches. Within each OpenFlow switch, an OpenFlow agent communicates with an OpenFlow controller and accepts programs in the form of flow table entries. There may be various OpenFlow agents in a network, e.g., the switches in the network are provided by different vendors or different OpenFlow versions are installed. The SOFT approach aims to identify inconsistencies between different agents and firmware versions by performing symbolic execution. Then, the results of different OpenFlow agents are crosschecked against each other. The authors were able to identify several inconsistencies between the publicly available reference OpenFlow switch and OpenVSwitch implementations. In [59], the authors propose NICE, a testing method OpenFlow controller application. The authors performed model checking and concolic execution to test unmodified OpenFlow controller applications for the correct behavior. The authors systematically explored the network behavior and network state under various network event orderings. They solved scalability issues by simulating simplified switches and end hosts. The authors improved their bug detection rate by interleaving network events. The effectiveness of NICE is shown by detecting several bugs in three real network applications. A systematic workflow for debugging SDNs is proposed in [60]. The goal of the workflow is to detect errant behavior in the network and to locate its cause. Especially, failure location is a difficult and tedious problem, but is required to fix or work around a bug. Therefore, the workflow tries to classify failures to different layers.