Stateful Programming of High-Speed Network Hardware
Modern networks need to operate at speeds as high as 100Gbps while running sophisticated algorithms and protocols to provide strict performance, security and reliability
guarantees. Moreover, they need to flexibly adapt to the rapidly evolving requirements of online services. Thus, emerging network hardware devices, i.e. switches
inside the network and Network Interface Cards (NICs) at the end hosts, are highspeed and programmable, with on-chip memory accessible on a per-packet basis to
support stateful packet processing.
However, the programming interfaces of these devices are quite low-level, tied to
each device’s architecture, and only suitable for programming a single device. Thus,
programming collections of stateful network devices to realize a local or network-wide
functionality efficiently and correctly is extremely difficult and error-prone. This
dissertation focuses on the design and implementation of high-level programming
abstractions for stateful programming of high-speed network hardware, both at the
end hosts and inside the network.
At the end host, we focus on the transport layer, the most complicated, constantlyevolving, and stateful component of the network stack. Transport-layer algorithms
maintain state across packets to decide what data segments to transmit and when,
and are notoriously difficult to implement on programmable NICs at high-speed.
We propose Tonic, a hardware architecture for transport algorithms that can support 100Gbps for 128-byte packets while being programmable with a simple API.
In designing Tonic, we exploit common patterns across transport algorithms to create efficient fixed-function reusable hardware modules, thus significantly reducing the
functionality programmers must specify.
To facilitate network-wide stateful programming, we propose SNAP, a programming language that abstracts the entire network as “one big stateful switch”. Using
SNAP, operators can program using persistent arrays on one big switch without deiii
ciding how to distribute and access them in the network’s switches. The SNAP
compiler discovers read/write dependencies between arrays, translates one-big-switch
programs into an efficient internal representation based on binary decision diagrams,
and uses it to jointly optimize array placement and routing across the network.
All in all, Tonic’s modular interface and SNAP’s one-big-stateful-switch abstraction relieve programmers from the low-level details of stateful programming of highspeed network hardware throughout the entire network.