From a4b19f8c3ed0d573896233d6714535428545aeda Mon Sep 17 00:00:00 2001 From: malmert Date: Sat, 23 May 2026 12:19:22 +0200 Subject: [PATCH] doc --- documentation/thesis/00-acronyms.tex | 30 +- documentation/thesis/02-preliminaries.tex | 121 +- documentation/thesis/ba.bib | 243 +++ .../figures/benchmark/added_one_way_delay.png | Bin 0 -> 60435 bytes .../figures/benchmark/added_one_way_delay.svg | 1143 ++++++++++++++ .../benchmark/benchmark_metric_summary.csv | 91 ++ .../figures/benchmark/benchmark_metrics.csv | 95 ++ .../benchmark/ping_rtt_percentiles.png | Bin 0 -> 54212 bytes .../benchmark/ping_rtt_percentiles.svg | 1327 +++++++++++++++++ .../figures/benchmark/sockperf_latency.png | Bin 0 -> 51284 bytes .../figures/benchmark/sockperf_latency.svg | 910 +++++++++++ .../thesis/figures/benchmark/throughput.png | Bin 0 -> 61219 bytes .../thesis/figures/benchmark/throughput.svg | 1181 +++++++++++++++ .../figures/benchmark/udp_jitter_loss.png | Bin 0 -> 66764 bytes .../figures/benchmark/udp_jitter_loss.svg | 1231 +++++++++++++++ .../notes/style_baseline_bachelor_thesis.md | 136 ++ tools/plot_benchmark_results.py | 549 +++++++ 17 files changed, 7039 insertions(+), 18 deletions(-) create mode 100644 documentation/thesis/figures/benchmark/added_one_way_delay.png create mode 100644 documentation/thesis/figures/benchmark/added_one_way_delay.svg create mode 100644 documentation/thesis/figures/benchmark/benchmark_metric_summary.csv create mode 100644 documentation/thesis/figures/benchmark/benchmark_metrics.csv create mode 100644 documentation/thesis/figures/benchmark/ping_rtt_percentiles.png create mode 100644 documentation/thesis/figures/benchmark/ping_rtt_percentiles.svg create mode 100644 documentation/thesis/figures/benchmark/sockperf_latency.png create mode 100644 documentation/thesis/figures/benchmark/sockperf_latency.svg create mode 100644 documentation/thesis/figures/benchmark/throughput.png create mode 100644 documentation/thesis/figures/benchmark/throughput.svg create mode 100644 documentation/thesis/figures/benchmark/udp_jitter_loss.png create mode 100644 documentation/thesis/figures/benchmark/udp_jitter_loss.svg create mode 100644 documentation/thesis/notes/style_baseline_bachelor_thesis.md create mode 100755 tools/plot_benchmark_results.py diff --git a/documentation/thesis/00-acronyms.tex b/documentation/thesis/00-acronyms.tex index b5d3f02..dc6a439 100644 --- a/documentation/thesis/00-acronyms.tex +++ b/documentation/thesis/00-acronyms.tex @@ -1,20 +1,48 @@ \chapter*{List of Acronyms} \addcontentsline{toc}{chapter}{List of Acronyms} -\begin{acronym}[HTTPS] % Give the longest label here so that the list is nicely aligned +\begin{acronym}[NFQUEUE] % Give the longest label here so that the list is nicely aligned \acro{API}{Application Programming Interface} \acro{ARP}{Address Resolution Protocol} + \acro{BPF}{Berkeley Packet Filter} + \acro{BPDU}{Bridge Protocol Data Unit} + \acro{CA}{Certificate Authority} + \acro{CPU}{Central Processing Unit} + \acro{DMA}{Direct Memory Access} + \acro{eBPF}{extended Berkeley Packet Filter} + \acro{FDB}{Forwarding Database} + \acro{FIB}{Forwarding Information Base} \acro{HTML}{HyperText Markup Language} \acro{HTTPS}{Hypertext Transfer Protocol Secure} \acro{HTTP}{Hypertext Transfer Protocol} + \acro{IEEE}{Institute of Electrical and Electronics Engineers} \acro{IP}{Internet Protocol} + \acro{IPv4}{Internet Protocol version 4} + \acro{IPv6}{Internet Protocol version 6} + \acro{LAN}{Local Area Network} + \acro{LSM}{Linux Security Module} \acro{MAC}{Media Access Control} + \acro{MITM}{Man-in-the-Middle} + \acro{MTU}{Maximum Transmission Unit} + \acro{NAPI}{New API} + \acro{NAT}{Network Address Translation} + \acro{NFQUEUE}{Netfilter Queue} + \acro{NIC}{Network Interface Card} \acro{OSI}{Open Systems Interconnection} + \acro{PVID}{Port VLAN Identifier} + \acro{RSTP}{Rapid Spanning Tree Protocol} + \acro{RSS}{Receive Side Scaling} + \acro{SPAN}{Switched Port Analyzer} \acro{SSID}{Service Set Identifier} \acro{SSL}{Secure Sockets Layer} + \acro{STP}{Spanning Tree Protocol} + \acro{TAP}{Test Access Point} \acro{TCP}{Transmission Control Protocol} \acro{TLS}{Transport Layer Security} + \acro{TTL}{Time To Live} \acro{UDP}{User Datagram Protocol} \acro{URI}{Uniform Resource Identifier} \acro{URL}{Uniform Resource Locator} + \acro{VLAN}{Virtual Local Area Network} + \acro{XDP}{eXpress Data Path} \end{acronym} diff --git a/documentation/thesis/02-preliminaries.tex b/documentation/thesis/02-preliminaries.tex index a3e1a19..aa36b96 100644 --- a/documentation/thesis/02-preliminaries.tex +++ b/documentation/thesis/02-preliminaries.tex @@ -3,7 +3,7 @@ In this chapter, the necessary background and foundational concepts underlying the research presented in this thesis are introduced. First, the theoretical frameworks and methodologies guiding the approach are discussed, followed by an overview of the key technologies and tools used in this work. The chapter is intended to establish a common understanding and provide context for the subsequent chapters, in which the specific contributions and findings of the research are presented. -\section{\ac{OSI} Model} +\section[OSI Model]{\ac{OSI} Model} \label{sec:osi} The \ac{OSI} Basic Reference Model provides a conceptual framework for describing communication between open systems in a structured and interoperable way. Instead of treating network communication as a single process, it divides it into seven layers with clearly separated responsibilities. This layered view simplifies the analysis of communication systems and provides a common terminology for discussing protocols and interfaces. @@ -44,35 +44,122 @@ A key principle of the \ac{OSI} model is that each layer has a defined scope of For the present thesis, the \ac{OSI} model is mainly used as a conceptual orientation for the discussion of communication layers and network functions. Even though the implemented system is better described using the practical \ac{TCP}/\ac{IP} stack, the \ac{OSI} structure remains useful for introducing the general principles of layered communication. -\section{Linux Kernel Networking} -\label{sec:linux-kernel-networking} +\section{Transparent Network Interception Models} +\label{sec:transparent-network-interception-models} -In Linux, networking is handled by a subsystem that spans user space sockets, protocol implementations, filtering and routing logic, network devices, device drivers, and the network interface card. A packet therefore does not move directly from an application to the transport medium or the other way around. Instead, it passes through a sequence of kernel-controlled processing stages on the egress and ingress paths \cite{stephan2024packetpath,linuxkernelnetworkingdocs}. +\subsection{Man-in-the-Middle Terminology} -A central data structure of this subsystem is \texttt{sk\_buff}. In Linux, \texttt{sk\_buff} is the main networking structure representing a packet, but it does not itself contain the packet bytes. Instead, it stores metadata and pointers to associated buffers that hold headers and payload. This design allows Linux to add, inspect, and remove headers efficiently by moving pointers rather than copying the entire packet, and it also enables efficient cloning when multiple processing stages need access to the same packet data \cite{linuxkernelskbuffdocs,stephan2024packetpath}. +The term \ac{MITM} describes a communication setting in which an intermediate system is positioned between two endpoints and can observe, relay, insert, or modify messages exchanged between them \cite{conti2016mitmsurvey}. In security literature, this position is often discussed as an adversarial capability \cite{conti2016mitmsurvey}. In the present thesis, the term is used in a controlled experimental sense: the system is intentionally placed in the communication path in order to observe, correlate, and selectively manipulate traffic. The relevant distinction is therefore not only whether traffic can be observed, but also at which layer the intermediate system is inserted and whether it becomes visible to the endpoints. -\subsection{Layers of a Packet} +\subsection[Passive Capture with TAP and SPAN]{Passive Capture with \ac{TAP} and \ac{SPAN}} -On an Ethernet-based system, a packet on the wire is processed as a stack of protocol layers. At the data link layer, the frame contains the Ethernet header with source and destination \ac{MAC} addresses and an EtherType field. Above this follows the network-layer header, for example an IPv4 header. On top of that is the transport-layer header, such as \ac{TCP} or \ac{UDP}. The remaining bytes form the payload delivered to the application. In Linux, lower-layer headers are added on the egress path when the packet moves toward the wire, whereas they are validated and stripped on the ingress path when the packet moves toward the socket \cite{stephan2024packetpath}. When a Linux system operates as a bridge, forwarding decisions are made at Layer 2 on the basis of the destination \ac{MAC} address, that is, before local delivery to higher layers becomes necessary \cite{linuxkernelbridgedocs}. +Passive monitoring systems obtain a copy of network traffic without becoming the forwarding element. A \ac{TAP} is a dedicated device inserted directly into the monitored physical link, for example between a host and a switch or between two switches. It copies the traffic that crosses this link to one or more monitoring interfaces while the original traffic continues between the connected endpoints. In contrast, \ac{SPAN}, also known as port mirroring, is configured on a switch. The monitored devices remain connected to their normal switch ports, and the switch duplicates selected ingress, egress, or bidirectional traffic from these ports to a separate monitoring port. The main difference is therefore where the traffic copy is produced. A \ac{TAP} observes the link directly at its physical position in the path, whereas \ac{SPAN} observes traffic indirectly from inside the switch forwarding and mirroring implementation. Neither mechanism gives the monitoring device direct control over the original forwarding decision, so passive capture cannot directly block or modify packets in the original stream. Zhang and Moore show that \ac{SPAN}-based monitoring can also introduce measurement artifacts, including inter-packet timings, packet reordering, and packet loss \cite{zhang2007portmirroring}. -\subsection{Egress Path} +\subsection{Layer-3 Routed Interception} -The egress path begins in user space when an application writes data to a socket, for example by using \texttt{write()}, \texttt{send()}, or \texttt{sendto()}. For IPv4 communication, such a socket is typically an \texttt{AF\_INET} socket. The system call enters the kernel and reaches the socket layer, where \texttt{sock\_sendmsg()} retrieves the socket context and forwards the packet to the transport-layer handler. At this point, Linux may already apply security-related checks through Linux Security Modules \cite{stephan2024packetpath}. +In a routed interception model, the intermediate system is part of the \ac{IP} forwarding path. An \ac{IP} router receives a packet, determines the next hop based on the destination \ac{IP} address and routing information, and transmits the packet through the selected outgoing interface \cite{rfc1812}. From the perspective of the endpoints, a routed intermediary therefore behaves as a router or gateway rather than as an Ethernet switch. Traffic must either be configured to use this system as its next hop, for example through a default gateway setting, or the surrounding network must otherwise be changed so that packets are routed through it. -At the transport layer, Linux constructs the transport header and prepares the packet for transmission. For \ac{TCP}, the kernel segments data if necessary, writes it into \texttt{sk\_buff} structures, enqueues it in the socket write queue, builds the \ac{TCP} header, and enforces protocol mechanisms such as maximum segment size, congestion control, and retransmission timers. For \ac{UDP}, the processing path is simpler: the kernel builds the datagram and corresponding transport header with less state and less locking overhead \cite{stephan2024packetpath}. +This placement has visible protocol effects. In \ac{IPv4}, every router that forwards a packet decrements the \ac{TTL} field \cite{rfc1812}. Therefore, a routed intermediary can appear as an additional \ac{IP} hop to tools and diagnostics that inspect hop-count behavior. -After transport-layer preparation, the packet enters the IP layer. Here Linux determines the route, typically by consulting the Forwarding Information Base if no suitable destination information is already cached in the packet context. Once a route is available, the kernel builds the IP header and passes the packet through netfilter hook stages such as \texttt{LOCAL\_OUT} and \texttt{POST\_ROUTING}. If necessary, Linux also resolves the next-hop destination at Layer 2, for example by using the neighbor subsystem and the \ac{ARP} to obtain the destination \ac{MAC} address. After that, the Ethernet header is added to the packet \cite{stephan2024packetpath}. +A routed intermediary may also modify packet headers. If \ac{NAT} is used, address information is rewritten as packets traverse the translator \cite{rfc3022}. Depending on the configuration, this can affect source or destination \ac{IP} addresses, transport-layer ports, and the reverse mapping needed for return traffic \cite{rfc3022}. Even without \ac{NAT}, routed forwarding changes the Layer-2 next hop because the packet is emitted through the outgoing link selected by the routing decision \cite{rfc1812}. Consequently, the intermediary is not merely observing an existing Ethernet segment; it actively participates in \ac{IP} forwarding. This makes routed interception useful when the intermediate system is intended to enforce Layer-3 policy, apply firewalling, perform \ac{NAT}, or deliberately act as a gateway. -The fully constructed frame then enters the network device transmission path. Linux passes it to \texttt{dev\_queue\_xmit()}, where traffic control and queueing disciplines can process it on egress. After queueing and possible post-processing such as checksum handling or VLAN tagging, the kernel calls the driver transmission function \texttt{ndo\_start\_xmit}. The driver places the packet into the transmit ring of the network interface card, maps the packet buffer for Direct Memory Access, and the hardware finally transmits the frame onto the physical medium \cite{stephan2024packetpath}. +\subsection{Proxy-Based Interception} + +Proxy-based interception moves the intermediary even higher in the stack. An \ac{HTTP} proxy terminates or relays application-layer requests rather than merely forwarding Ethernet frames. For \ac{HTTPS}, interception typically requires a \ac{TLS} proxy that presents itself as the server to the client and as the client to the external server, thereby creating two separate \ac{TLS} connections \cite{waked2018tlsinterception}. This model can expose plaintext to the proxy when the client trusts a signing \ac{CA} controlled by the proxy \cite{waked2018tlsinterception}. At the same time, it changes the end-to-end security model of \ac{TLS} \cite{decarnedecarnavalet2023tlsinterception}. Empirical studies show that \ac{HTTPS} interception can be detected through inconsistencies between \ac{HTTP} \texttt{User-Agent} information and \ac{TLS} client behavior \cite{durumeric2017httpsinterception}, and that interception appliances may introduce certificate-validation and parameter-mapping weaknesses \cite{waked2018tlsinterception}. Proxy-based interception is therefore powerful for application-layer inspection, but it is not transparent in the same sense as Layer-2 forwarding. + +\subsection{Transparent Layer-2 Inline Bridges} + +A transparent inline bridge occupies the forwarding path without acting as an \ac{IP} router or application proxy. Such a bridge connects network segments at the data link layer and forwards frames based on bridge state and destination \ac{MAC} addresses \cite{ieee8021q2022}. The Linux bridge implements this behavior by learning source \ac{MAC} addresses, maintaining an \ac{FDB}, and forwarding, filtering, flooding, or locally delivering frames according to the bridge configuration \cite{linuxkernelbridgedocs}. In this model, the bridge does not have to be configured as the endpoints' \ac{IP} gateway or as an application proxy, because forwarding is performed below the \ac{IP} layer. + +\subsection{Transparency and Detectability} + +Transparency should not be understood as complete undetectability. An inline bridge can affect latency, packet ordering, loss behavior, link-state propagation, and bridge-control behavior. If \ac{STP} is enabled, \acp{BPDU} and forwarding-delay behavior may become externally visible \cite{linuxkernelbridgedocs}. If \ac{TLS} proxying is added on top of forwarding, certificate and handshake artifacts can reveal the interception point \cite{durumeric2017httpsinterception}. The transparency goal in this thesis is therefore narrower and technical: the system should forward traffic as a Layer-2 inline bridge without introducing an additional \ac{IP} hop, without requiring endpoint proxy configuration, and without terminating application-layer sessions unless a later manipulation component explicitly does so. + +\section{Linux Packet Processing Path} +\label{sec:linux-packet-processing-path} + +The following section explains how network packets are processed by the Linux kernel. First, the internal packet representation is described. Next, the receive path from the \ac{NIC} into the kernel is outlined. Then, the local delivery, forwarding, and bridge paths are distinguished. Lastly, the relevant programmable hook points are explained because they define where a transparent traffic capture and manipulation platform can observe, mark, forward, or drop packets. + +Linux networking is not a single processing step. Instead, packets move through device drivers, protocol implementations, routing or bridge logic, filtering hooks, queueing disciplines, and user space socket interfaces \cite{linuxkernelnetworkingdocs}. The exact path depends on whether a packet is locally generated, locally delivered, routed, or bridged \cite{stephan2024packetpath}. This distinction is important for the present thesis because a transparent \ac{MITM} system should normally forward frames at Layer 2, while still observing and manipulating packets at selected kernel hook points. + +\subsection{Packet Representation} + +On an Ethernet-based system, the bytes on the wire are structured as a frame. The Ethernet header contains source and destination \ac{MAC} addresses and an \texttt{EtherType} field. Depending on the \texttt{EtherType}, the frame may contain an \ac{ARP} message, an \ac{IPv4} packet, an \ac{IPv6} packet, or another payload. For \ac{IP} traffic, the network-layer header is followed by a transport-layer header such as \ac{TCP} or \ac{UDP}. The remaining bytes form the payload delivered to the application or forwarded to another interface. + +Inside the Linux kernel, packets are mainly represented by \texttt{struct sk\_buff} \cite{linuxkernelskbuffdocs}. This structure does not contain the packet bytes directly. Instead, it stores metadata and pointers to one or more buffers that contain the actual headers and payload \cite{linuxkernelskbuffdocs}. The \texttt{head}, \texttt{data}, \texttt{tail}, and \texttt{end} pointers describe the usable packet buffer, while header offsets such as \texttt{mac\_header}, \texttt{network\_header}, and \texttt{transport\_header} indicate where individual protocol headers begin \cite{linuxkernelskbuffdocs}. As a result, protocol layers can prepend or remove headers by adjusting pointers instead of copying the complete packet \cite{stephan2024packetpath}. + +The \texttt{sk\_buff} also carries processing metadata such as the receiving or transmitting network device, the packet length, protocol information, checksum state, priority values, and marks \cite{linuxkernelskbuffdocs}. Such metadata is not visible on the wire, but it can influence routing, filtering, queueing, and later processing stages. This property is useful for packet correlation because a mark stored in \texttt{skb->mark} can follow a packet through multiple kernel stages without changing the actual Ethernet frame. + +Furthermore, Linux can clone an \texttt{sk\_buff} efficiently. A clone gets its own metadata structure while sharing the packet data buffer until modification becomes necessary. This is relevant for packet capture. Passive observers such as raw packet sockets can receive a clone of the packet while the original packet continues through the normal kernel path. Hence, capturing a packet does not necessarily mean that the packet was consumed by the capture process \cite{linuxkernelskbuffdocs}. \subsection{Ingress Path} -The ingress path begins when the network interface card receives an Ethernet frame from the physical medium. The hardware checks link-layer conditions such as the \ac{MAC} filter and moves the received bytes into system memory by Direct Memory Access. It then notifies the operating system, which allocates an \texttt{sk\_buff} and stores metadata such as the receiving interface, protocol information, and packet type. At this stage, Linux knows the position of the Ethernet header and can record it as the \texttt{mac\_header} of the packet \cite{stephan2024packetpath,linuxkernelskbuffdocs}. +The ingress path begins when the \ac{NIC} receives a frame from the physical medium. Modern \acp{NIC} often use multiple receive queues. With \ac{RSS}, the device can assign packets to queues based on a hash over packet header fields, allowing receive processing to be distributed over multiple \acp{CPU} \cite{linuxkernelscalingdocs}. The received bytes are transferred into main memory using \ac{DMA}, and the driver notifies the kernel that new receive work is available. Drivers commonly process this work through \ac{NAPI}, which combines interrupt notification with polling under load. -The packet is then passed into the receive path through functions such as \texttt{netif\_receive\_skb()}. During this stage, Linux can hand the packet to virtual interfaces, VLAN handling, or a receive handler associated with a master device. This is particularly relevant for bridge configurations, because an interface that is part of a Linux bridge can have its received frame intercepted for Layer-2 forwarding logic instead of immediate local delivery \cite{stephan2024packetpath,linuxkernelbridgedocs}. +Before the regular networking stack processes the packet, \ac{XDP} may run in supported drivers \cite{hoilandjorgensen2018xdp}. Native \ac{XDP} executes an \ac{eBPF} program very early in the receive path, before the kernel allocates the normal \texttt{sk\_buff} structure \cite{hoilandjorgensen2018xdp}. The program can return a verdict to pass the packet to the kernel stack, drop it, transmit it back out, or redirect it to another target \cite{hoilandjorgensen2018xdp}. This makes \ac{XDP} useful for high-performance packet processing \cite{scholz2018ebpfpacketfiltering}. However, the early position also means that normal \texttt{sk\_buff} metadata is not yet available in native mode. -If the packet is processed as an IP packet, Linux continues with \texttt{ip\_rcv()}. There, the kernel validates essential IP header fields such as version, length, and checksum, sets the pointer to the transport header, and applies the netfilter \texttt{PRE\_ROUTING} hook. The routing logic then decides whether the packet should be forwarded, locally delivered, or treated as multicast traffic. For local delivery, Linux may first reassemble fragmented packets and then applies the \texttt{LOCAL\_IN} hook before stripping the IP header and handing the packet to the appropriate transport-layer protocol handler \cite{stephan2024packetpath}. +If the packet continues into the regular networking stack, the driver creates or completes an \texttt{sk\_buff} and passes it into the generic receive path, commonly through functions such as \texttt{netif\_receive\_skb()} \cite{stephan2024packetpath}. At this stage, Linux has metadata about the receiving interface and can expose the packet to early ingress processing. This includes \texttt{tc} ingress programs and the \texttt{nftables} \texttt{netdev} \texttt{ingress} hook \cite{nftableshooks}. In contrast to native \ac{XDP}, these hooks operate after the \texttt{sk\_buff} exists and can therefore read or write metadata such as \texttt{skb->mark}. -At the transport layer, Linux validates the \ac{TCP} or \ac{UDP} header and associates the segment or datagram with the correct socket. For \ac{TCP}, this includes checksum validation, socket lookup, state-machine handling, and enqueuing the packet in the socket receive queue. For \ac{UDP}, the processing path is simpler, but it also includes checksum validation, socket lookup, and datagram consumption. Finally, when the user-space process executes a receiving system call such as \texttt{read()} or \texttt{recv()}, the kernel dequeues the data from the socket receive queue and copies it to user space \cite{stephan2024packetpath}. +After early ingress processing, the packet may be cloned for packet sockets, handled by \ac{VLAN} logic, passed to a receive handler associated with a master device, or delivered to a protocol handler \cite{stephan2024packetpath}. The receive handler is particularly relevant for Linux bridges. If the ingress interface is enslaved to a bridge, the bridge receive handler can take ownership of the packet before the packet is delivered to the local \ac{IP} stack \cite{linuxkernelbridgedocs}. -For the present thesis, this complete packet path is particularly important because the developed system relies on Linux kernel mechanisms at multiple points of the communication path. The system captures traffic at Layer 2, uses bridge-based forwarding, observes and correlates packets while they traverse ingress and egress processing stages, and manipulates traffic by attaching filtering and processing logic within the kernel-controlled forwarding path. +\subsection{Local Delivery and \ac{IP} Forwarding} + +If the packet is an \ac{IP} packet and is not taken over by a bridge or another master device, the \ac{IP} receive function processes it. For \ac{IPv4}, this path includes \texttt{ip\_rcv()}. The kernel validates essential header fields, checks packet length and checksum information, sets the transport header pointer, and invokes the \texttt{netfilter} \texttt{PRE\_ROUTING} hook. Afterwards, the routing decision determines whether the packet is locally delivered, forwarded to another interface, or handled as multicast traffic \cite{stephan2024packetpath}. + +For local delivery, the packet follows the input path. Fragmented packets may first be reassembled. The packet then reaches the \texttt{netfilter} \texttt{LOCAL\_IN} hook and is passed to the appropriate transport-layer handler. For \ac{TCP}, Linux performs socket lookup, checksum validation, state-machine processing, sequence-number handling, and receive-queue insertion. For \ac{UDP}, the path is shorter and mainly consists of checksum validation, socket lookup, and datagram delivery. Finally, a user-space application reads the data through a system call such as \texttt{recv()} or \texttt{read()} \cite{stephan2024packetpath}. + +For routed forwarding, the packet follows a different path. After the routing decision, \texttt{netfilter} can inspect the packet at the \texttt{FORWARD} hook. If the packet is accepted, Linux applies post-routing processing, performs neighbor resolution if necessary, and sends the packet to the selected output device. The kernel documentation on \texttt{netfilter} \texttt{flowtable} processing describes this classic forwarding path as a sequence of ingress, prerouting, routing decision, forward, postrouting, and neighbor transmission, while also describing how \texttt{flowtable} offload can bypass parts of that path for later packets of a flow \cite{linuxkernelflowtabledocs}. + +\subsection{Ethernet Switching Concepts} + +Ethernet switching is based on forwarding at the data link layer. The \ac{IEEE} \texttt{802.1Q-2022} standard specifies the operation of \ac{MAC} bridges and \ac{VLAN} bridges, which interconnect \acp{LAN} below the \ac{MAC} service boundary \cite{ieee8021q2022}. From the perspective of higher-layer protocols, such a bridge should be transparent: endpoints do not need to know that an intermediate bridge forwards the frame. Consequently, forwarding decisions are based on Ethernet destination addresses and bridge state rather than on \ac{IP} routes. + +A learning bridge builds forwarding state from the source address of received frames. When a frame enters a bridge port, the bridge can associate the source \ac{MAC} address with the ingress port and store this association in the \ac{FDB} \cite{linuxkernelbridgedocs}. In \ac{VLAN}-aware operation, the relevant forwarding identity also includes the \ac{VLAN}; the Linux switch device documentation describes a bridge \ac{FDB} entry as a \texttt{\{port, mac, vlan\}} forwarding destination \cite{linuxkernelswitchdevdocs}. This distinction matters because the same \ac{MAC} address can belong to different Layer-2 domains when \acp{VLAN} are used. + +If the destination address is known, the bridge can forward a unicast frame only to the port associated with that destination. If the destination is located on the same port as the source, the frame can be filtered instead of being sent back to the segment from which it arrived. If no matching destination entry exists, the frame is an unknown unicast and must be flooded to eligible ports in the same forwarding domain. Broadcast frames are also flooded within that domain, and multicast frames are flooded or forwarded according to multicast bridge state \cite{linuxkernelswitchdevdocs}. Thus, a bridge extends a broadcast domain unless \ac{VLAN} filtering or another separation mechanism divides the traffic into distinct Layer-2 domains. + +\ac{VLAN} awareness allows one physical or virtual bridge to represent multiple separated broadcast domains. With \texttt{vlan\_filtering} enabled, forwarding decisions depend on both the destination \ac{MAC} address and the \ac{VLAN} tag \cite{linuxkernelbridgedocs}. The \texttt{ip-link(8)} manual describes the same configuration point as \texttt{vlan\_filtering}; when it is disabled, the bridge does not consider the \ac{VLAN} tag during packet handling \cite{man7iplink}. + +Layer-2 loops are especially problematic because Ethernet frames do not contain a hop limit comparable to the \ac{IP} \ac{TTL} field. In a looped topology, flooded broadcast, multicast, or unknown-unicast frames can therefore circulate and be replicated until the network becomes unusable. \ac{STP} was introduced to let bridges compute a loop-free active topology in an extended \ac{LAN} \cite{perlman1985spanningtree}. \ac{RSTP} later improved reconfiguration behavior and is part of the modern bridge standards lineage described by \texttt{802.1Q} \cite{ieee8021q2022}. In Linux, \ac{STP} controls bridge port states such as blocking, learning, and forwarding, and it uses \acp{BPDU} to exchange topology information \cite{linuxkernelbridgedocs}. + +\subsection{Linux Bridge Forwarding Path} + +A Linux bridge implements the switching behavior described above inside the kernel. The bridge receives Ethernet frames from enslaved interfaces, learns source addresses, consults the \ac{FDB}, and either forwards, filters, floods, or locally delivers frames depending on the destination address and bridge configuration \cite{linuxkernelbridgedocs}. The \texttt{bridge} command exposes this state through objects such as \texttt{fdb}, \texttt{vlan}, and \texttt{link} \cite{man7bridge}. + +This Layer-2 behavior is central for transparent interception. When two hosts communicate through a Linux bridge, their packets do not need to be routed by the bridge. Therefore, no additional \ac{IP} hop is introduced and the \ac{TTL} or hop-limit value is not decremented by normal bridge forwarding. From the perspective of the endpoints, the bridge behaves like an Ethernet segment or switch, although the kernel can still inspect, mark, filter, and capture frames while they traverse the bridge. + +The bridge path has its own \texttt{netfilter} integration \cite{nftablesbridgefiltering}. The \texttt{nftables} \texttt{bridge} family provides hook points before and after the \ac{FDB} decision \cite{nftablesbridgefiltering}. In the \texttt{prerouting} hook, packets can be filtered before the bridge decides the output port. In the \texttt{forward} hook, packets can be filtered when they are bridged from one port to another. The \texttt{input} hook covers frames passed to the local stack, \texttt{output} covers frames coming from the local stack toward a bridge port, and \texttt{postrouting} covers both locally generated and forwarded bridge traffic \cite{nftablesbridgefiltering}. + +The distinction between the \texttt{inet}, \texttt{ip}, and \texttt{bridge} \texttt{nftables} families is important. Rules in the \texttt{ip} or \texttt{inet} family operate on packets that enter the \ac{IP} stack. Rules in the \texttt{bridge} family operate on Ethernet frames in the bridge path. A transparent bridge that should inspect traffic without acting as an \ac{IP} router therefore needs \texttt{bridge}-family rules for Layer-2 forwarding decisions. + +For the setup used in the present thesis, \ac{STP} is not required because the bridge is used as a controlled inline bridge between two network segments and no redundant Layer-2 path is intentionally introduced. Disabling \ac{STP} through \texttt{stp\_state} avoids topology negotiation, \ac{BPDU} processing, and forwarding-delay behavior that would otherwise add configuration-dependent effects to packet timing \cite{man7iplink}. This is only safe under the assumption that the physical and virtual topology is loop-free. If additional bridge ports or redundant links are added, \ac{STP} or \ac{RSTP} should remain enabled because Linux uses it to prevent loops and broadcast storms in Ethernet networks \cite{linuxkernelbridgedocs}. + +\subsection{Egress Path} + +The egress path depends on where the packet originates. For locally generated traffic, the path begins when an application writes to a socket. The socket layer calls functions such as \texttt{sock\_sendmsg()}, which select the transport-layer implementation. At this point, \acp{LSM} may already apply security checks. The \ac{TCP} implementation segments data, maintains connection state, enforces congestion-control behavior, and enqueues \texttt{sk\_buff} structures in the socket write queue. The \ac{UDP} implementation builds datagrams with less connection state and less protocol machinery \cite{stephan2024packetpath}. + +After transport-layer processing, the packet enters the \ac{IP} output path. Linux determines the route, often by consulting the \ac{FIB}, and builds the \ac{IP} header. \texttt{Netfilter} can inspect locally generated traffic at \texttt{LOCAL\_OUT} and later at \texttt{POST\_ROUTING}. If the destination is on an Ethernet network, the neighbor subsystem resolves the next-hop \ac{MAC} address, for example through \ac{ARP}. Then the Ethernet header is prepared and the packet is passed to the device transmission path \cite{stephan2024packetpath}. + +For both locally generated and forwarded packets, the final transmission path goes through the network device queueing layer. Linux calls \texttt{dev\_queue\_xmit()}, where queueing disciplines can schedule, delay, classify, or drop packets. \texttt{tc} egress programs can also run at this stage. Afterwards, the driver transmission function, commonly exposed as \texttt{ndo\_start\_xmit}, places the packet into the transmit ring of the \ac{NIC}. The packet buffer is mapped for \ac{DMA}, and the hardware transmits the frame onto the physical medium \cite{stephan2024packetpath}. + +For bridged packets, the local socket and transport-layer construction steps are skipped. The packet already exists as an Ethernet frame. After the bridge has selected an output port and the frame has passed the relevant bridge filtering hooks, the packet enters the output device path and is eventually queued for transmission on the selected interface. Consequently, \texttt{tc} egress and device-level queueing remain relevant even for purely bridged traffic. + +\subsection{Programmable Hook Points} + +Linux provides several hook points that allow packet processing to be extended without modifying the kernel source code. \ac{eBPF}, the successor of \ac{BPF}, is one of the main mechanisms for this \cite{man7tcbpf}. It allows user-supplied programs to be loaded into the kernel and executed at designated hooks after verification by the kernel \cite{gbadamosi2024ebpfruntime}. The verifier is intended to ensure that programs cannot corrupt kernel memory or run without bounds, while just-in-time compilation can provide efficient execution \cite{man7tcbpf}. + +\texttt{Netfilter} and \texttt{nftables} provide another programmable processing layer. The \texttt{nftables} hook model distinguishes packet families, hook names, chain types, and priorities. Locally delivered packets pass through \texttt{prerouting} and \texttt{input}; forwarded routed packets pass through \texttt{prerouting}, \texttt{forward}, and \texttt{postrouting}; locally generated packets pass through \texttt{output} and \texttt{postrouting}. Within a hook, priorities determine the order in which \texttt{nftables} chains and internal \texttt{netfilter} operations run \cite{nftableshooks}. + +The earliest hook point considered here is \ac{XDP}. Native \ac{XDP} programs are executed in the driver receive path before the normal \texttt{sk\_buff} is allocated \cite{hoilandjorgensen2018xdp}. This position allows very early pass, drop, transmit, and redirect decisions \cite{hoilandjorgensen2018xdp}. Because of this position, \ac{XDP} is suitable for high packet-rate processing \cite{scholz2018ebpfpacketfiltering}. However, because the packet has not yet entered the regular \texttt{sk\_buff}-based networking stack, normal \texttt{sk\_buff} metadata is not available in native \ac{XDP} mode. + +After an \texttt{sk\_buff} exists, \texttt{tc} ingress and egress programs can process packets as \ac{eBPF} classifiers \cite{man7tcbpf}. The ingress side is reached shortly after the packet enters the receive path, while the egress side is reached after routing or bridge forwarding has selected an output interface \cite{stephan2024packetpath}. Since these programs operate on an \texttt{\_\_sk\_buff} context, they can inspect packet bytes and use metadata such as \texttt{skb->mark} \cite{man7tcbpf}. This makes \texttt{tc}/\ac{eBPF} useful for low-overhead telemetry and packet correlation without changing the frame transmitted on the wire. + +For bridged traffic, \texttt{nftables} \texttt{bridge} hooks provide the main verdict mechanism. Rules in the \texttt{bridge} family are evaluated in the bridge path and can therefore affect Ethernet frames that are forwarded between bridge ports without entering the routed \ac{IP} path \cite{nftablesbridgefiltering}. In particular, \texttt{bridge}-family rules can be attached before or after the \ac{FDB} decision \cite{nftablesbridgefiltering}. They can be used to accept, drop, or redirect frames at Layer 2 \cite{westphal2016bridgefiltering}. + +For passive raw capture, Linux provides packet sockets through \texttt{AF\_PACKET}. Packet sockets are used to receive or send raw packets at the device-driver level and can be bound to a specific interface \cite{man7packet}. This makes them suitable for Layer-2 observation of Ethernet frames. In the context of a forwarding bridge, such capture is conceptually separate from the bridge forwarding decision, because observing a packet through a packet socket does not itself define the packet's forwarding verdict. + +Lastly, \texttt{tracepoint} hooks expose selected kernel events to tracing tools and \ac{eBPF} programs \cite{linuxkerneltracepointsdocs}. They are useful for events that are difficult to infer from raw packet captures alone, for example packet free or drop paths. In such cases, \texttt{tracepoint}-based telemetry can complement ingress and egress observations by providing metadata about what happened to an \texttt{sk\_buff} inside the kernel \cite{gbadamosi2024ebpfruntime}. + +\ac{NFQUEUE} is built on top of \texttt{netfilter}. A rule can queue a packet to user space, where an application inspects the packet and returns a verdict such as accept, drop, or modified accept. This is more flexible than a purely in-kernel rule, but it also introduces user-kernel transfer overhead and makes packet latency depend on the user-space application. Therefore, \ac{NFQUEUE} is suitable for programmable manipulation, while early in-kernel hooks are better suited for low-overhead telemetry or simple filtering. + +For the present thesis, these hook points explain the structure of the developed system. Raw packet capture observes frame contents, \texttt{tc}/\ac{eBPF} telemetry observes kernel metadata on ingress and egress, \texttt{nftables} \texttt{bridge} rules can decide the fate of bridged packets, and packet marks can connect observations from different stages of the same kernel path. Since a single Ethernet frame can be captured, cloned, forwarded, marked, and later observed again on another interface, reliable correlation requires an explicit packet identity or a stable reconstruction from packet fields. diff --git a/documentation/thesis/ba.bib b/documentation/thesis/ba.bib index 2e082d7..48ef4fc 100644 --- a/documentation/thesis/ba.bib +++ b/documentation/thesis/ba.bib @@ -39,6 +39,26 @@ doi = {10.17487/RFC1122} } +@techreport{rfc1812, + author = {Baker, Fred}, + title = {Requirements for {IP} Version 4 Routers}, + type = {RFC}, + number = {1812}, + institution = {RFC Editor}, + date = {1995-06}, + doi = {10.17487/RFC1812} +} + +@techreport{rfc3022, + author = {Srisuresh, Pyda and Egevang, Kjeld}, + title = {Traditional {IP} Network Address Translator ({Traditional NAT})}, + type = {RFC}, + number = {3022}, + institution = {RFC Editor}, + date = {2001-01}, + doi = {10.17487/RFC3022} +} + @inproceedings{stephan2024packetpath, author = {Stephan, Alexander and W{\"u}strich, Lars}, title = {The Path of a Packet Through the Linux Kernel}, @@ -48,6 +68,149 @@ url = {https://www.net.in.tum.de/fileadmin/TUM/NET/NET-2024-04-1/NET-2024-04-1_16.pdf} } +@inproceedings{hoilandjorgensen2018xdp, + author = {H{\o}iland-J{\o}rgensen, Toke and Brouer, Jesper Dangaard and Borkmann, Daniel and Fastabend, John and Herbert, Tom and Ahern, David and Miller, David}, + title = {The {eXpress} Data Path: Fast Programmable Packet Processing in the Operating System Kernel}, + booktitle = {Proceedings of the 14th International Conference on Emerging Networking Experiments and Technologies}, + series = {CoNEXT '18}, + pages = {54--66}, + publisher = {Association for Computing Machinery}, + location = {Heraklion, Greece}, + date = {2018}, + doi = {10.1145/3281411.3281443}, + url = {https://doi.org/10.1145/3281411.3281443} +} + +@inproceedings{scholz2018ebpfpacketfiltering, + author = {Scholz, Dominik and Raumer, Daniel and Emmerich, Paul and Kurtz, Alexander and Lesiak, Krzysztof and Carle, Georg}, + title = {Performance Implications of Packet Filtering with {Linux eBPF}}, + booktitle = {2018 30th International Teletraffic Congress}, + series = {ITC 30}, + pages = {209--217}, + publisher = {IEEE}, + location = {Vienna, Austria}, + date = {2018}, + doi = {10.1109/ITC30.2018.00039}, + url = {https://www.net.in.tum.de/fileadmin/bibtex/publications/papers/ITC30-Packet-Filtering-eBPF-XDP.pdf} +} + +@online{gbadamosi2024ebpfruntime, + author = {Gbadamosi, Bolaji and Leonardi, Luigi and Pulls, Tobias and H{\o}iland-J{\o}rgensen, Toke and Ferlin-Reiter, Simone and Sorce, Simo and Brunstr{\"o}m, Anna}, + title = {The {eBPF} Runtime in the {Linux} Kernel}, + date = {2024-10-03}, + eprint = {2410.00026}, + eprinttype = {arXiv}, + doi = {10.48550/arXiv.2410.00026}, + url = {https://arxiv.org/abs/2410.00026}, + urldate = {2026-05-15} +} + +@inproceedings{westphal2016bridgefiltering, + author = {Westphal, Florian}, + title = {Bridge Filtering with {nftables}}, + booktitle = {Proceedings of Netdev 1.1}, + location = {Seville, Spain}, + date = {2016}, + url = {https://netdevconf.org/1.1/proceedings/papers/Bridge-filter-with-nftables.pdf}, + urldate = {2026-05-15} +} + +@article{conti2016mitmsurvey, + author = {Conti, Mauro and Dragoni, Nicola and Lesyk, Viktor}, + title = {A Survey of {Man In The Middle} Attacks}, + journaltitle = {IEEE Communications Surveys \& Tutorials}, + volume = {18}, + number = {3}, + pages = {2027--2051}, + date = {2016}, + doi = {10.1109/COMST.2016.2548426}, + url = {https://doi.org/10.1109/COMST.2016.2548426} +} + +@article{nam2012arpmitm, + author = {Nam, Seung Yeob and Jurayev, Sirojiddin and Kim, Seung-Sik and Choi, Kwonhue and Choi, Gyu Sang}, + title = {Mitigating {ARP} Poisoning-Based {Man-in-the-Middle} Attacks in Wired or Wireless {LAN}}, + journaltitle = {EURASIP Journal on Wireless Communications and Networking}, + volume = {2012}, + number = {1}, + eid = {89}, + date = {2012}, + doi = {10.1186/1687-1499-2012-89}, + url = {https://doi.org/10.1186/1687-1499-2012-89} +} + +@inproceedings{zhang2007portmirroring, + author = {Zhang, Jian and Moore, Andrew W.}, + title = {Traffic Trace Artifacts due to Monitoring Via Port Mirroring}, + booktitle = {2007 Workshop on End-to-End Monitoring Techniques and Services}, + series = {E2EMON '07}, + pages = {1--8}, + publisher = {IEEE}, + date = {2007}, + doi = {10.1109/E2EMON.2007.375317}, + url = {https://www.cl.cam.ac.uk/research/srg/netos/papers/2007-zhang2007traffic.pdf}, + urldate = {2026-05-16} +} + +@inproceedings{durumeric2017httpsinterception, + author = {Durumeric, Zakir and Ma, Zane and Springall, Drew and Barnes, Richard and Sullivan, Nick and Bursztein, Elie and Bailey, Michael and Halderman, J. Alex and Paxson, Vern}, + title = {The Security Impact of {HTTPS} Interception}, + booktitle = {Proceedings of the Network and Distributed System Security Symposium}, + series = {NDSS '17}, + date = {2017}, + doi = {10.14722/ndss.2017.23456}, + url = {https://doi.org/10.14722/ndss.2017.23456} +} + +@inproceedings{waked2018tlsinterception, + author = {Waked, Louis and Mannan, Mohammad and Youssef, Amr}, + title = {To Intercept or Not to Intercept: Analyzing {TLS} Interception in Network Appliances}, + booktitle = {Proceedings of the 2018 {ACM Asia} Conference on Computer and Communications Security}, + series = {ASIACCS '18}, + pages = {399--412}, + publisher = {Association for Computing Machinery}, + location = {Incheon, Republic of Korea}, + date = {2018}, + doi = {10.1145/3196494.3196528}, + url = {https://doi.org/10.1145/3196494.3196528} +} + +@article{decarnedecarnavalet2023tlsinterception, + author = {de Carn{\'e} de Carnavalet, Xavier and van Oorschot, Paul C.}, + title = {A Survey and Analysis of {TLS} Interception Mechanisms and Motivations}, + journaltitle = {ACM Computing Surveys}, + volume = {55}, + number = {13s}, + articleno = {269}, + pages = {1--40}, + date = {2023}, + doi = {10.1145/3580522}, + url = {https://doi.org/10.1145/3580522} +} + +@manual{ieee8021q2022, + author = {{IEEE}}, + title = {{IEEE Standard for Local and Metropolitan Area Networks--Bridges and Bridged Networks}}, + organization = {IEEE}, + type = {IEEE Std 802.1Q-2022}, + date = {2022-12-22}, + url = {https://standards.ieee.org/ieee/802.1Q/10323/}, + urldate = {2026-05-16} +} + +@inproceedings{perlman1985spanningtree, + author = {Perlman, Radia}, + title = {An Algorithm for Distributed Computation of a Spanningtree in an Extended {LAN}}, + booktitle = {Proceedings of the Ninth Symposium on Data Communications}, + series = {SIGCOMM '85}, + pages = {44--53}, + publisher = {Association for Computing Machinery}, + location = {Whistler Mountain, British Columbia, Canada}, + date = {1985}, + doi = {10.1145/319056.319004}, + url = {https://doi.org/10.1145/319056.319004} +} + @online{linuxkernelnetworkingdocs, author = {{The Linux Kernel Documentation Authors}}, title = {Networking --- The Linux Kernel documentation}, @@ -71,3 +234,83 @@ url = {https://docs.kernel.org/networking/bridge.html}, urldate = {2026-04-18} } + +@online{linuxkernelswitchdevdocs, + author = {{The Linux Kernel Documentation Authors}}, + title = {Ethernet switch device driver model (switchdev) --- The Linux Kernel documentation}, + year = {2026}, + url = {https://www.kernel.org/doc/html/latest/networking/switchdev.html}, + urldate = {2026-05-16} +} + +@online{linuxkernelflowtabledocs, + author = {{The Linux Kernel Documentation Authors}}, + title = {Netfilter's Flowtable Infrastructure --- The Linux Kernel documentation}, + year = {2026}, + url = {https://docs.kernel.org/networking/nf_flowtable.html}, + urldate = {2026-05-15} +} + +@online{linuxkernelscalingdocs, + author = {{The Linux Kernel Documentation Authors}}, + title = {Scaling in the Linux Networking Stack --- The Linux Kernel documentation}, + year = {2026}, + url = {https://docs.kernel.org/networking/scaling.html}, + urldate = {2026-05-15} +} + +@online{linuxkerneltracepointsdocs, + author = {{The Linux Kernel Documentation Authors}}, + title = {Using the Linux Kernel Tracepoints --- The Linux Kernel documentation}, + year = {2026}, + url = {https://www.kernel.org/doc/html/latest/trace/tracepoints.html}, + urldate = {2026-05-16} +} + +@online{man7packet, + author = {{Linux man-pages project}}, + title = {packet(7) --- Linux manual page}, + date = {2025-09-21}, + url = {https://man7.org/linux/man-pages/man7/packet.7.html}, + urldate = {2026-05-16} +} + +@online{man7tcbpf, + author = {{Linux man-pages project}}, + title = {tc-bpf(8) --- Linux manual page}, + date = {2025-08-08}, + url = {https://man7.org/linux/man-pages/man8/tc-bpf.8.html}, + urldate = {2026-05-16} +} + +@online{man7bridge, + author = {{Linux man-pages project}}, + title = {bridge(8) --- Linux manual page}, + date = {2012-08-01}, + url = {https://man7.org/linux/man-pages/man8/bridge.8.html}, + urldate = {2026-05-16} +} + +@online{man7iplink, + author = {{Linux man-pages project}}, + title = {ip-link(8) --- Linux manual page}, + date = {2012-12-13}, + url = {https://man7.org/linux/man-pages/man8/ip-link.8.html}, + urldate = {2026-05-16} +} + +@online{nftableshooks, + author = {{The nftables Project}}, + title = {Netfilter Hooks}, + year = {2023}, + url = {https://wiki.nftables.org/wiki-nftables/index.php/Netfilter_hooks}, + urldate = {2026-05-15} +} + +@online{nftablesbridgefiltering, + author = {{The nftables Project}}, + title = {Bridge Filtering}, + year = {2021}, + url = {https://wiki.nftables.org/wiki-nftables/index.php/Bridge_filtering}, + urldate = {2026-05-15} +} diff --git a/documentation/thesis/figures/benchmark/added_one_way_delay.png b/documentation/thesis/figures/benchmark/added_one_way_delay.png new file mode 100644 index 0000000000000000000000000000000000000000..99e549cb20e1b0c6051f509e1edfdc89e592eb46 GIT binary patch literal 60435 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 HJ!Ag^v^LvO literal 0 HcmV?d00001 diff --git a/documentation/thesis/figures/benchmark/added_one_way_delay.svg b/documentation/thesis/figures/benchmark/added_one_way_delay.svg new file mode 100644 index 0000000..a493a97 --- /dev/null +++ b/documentation/thesis/figures/benchmark/added_one_way_delay.svg @@ -0,0 +1,1143 @@ + + + + + + + + 2026-05-10T16:24:19.646327 + image/svg+xml + + + Matplotlib v3.6.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/thesis/figures/benchmark/benchmark_metric_summary.csv b/documentation/thesis/figures/benchmark/benchmark_metric_summary.csv new file mode 100644 index 0000000..c9dcd5d --- /dev/null +++ b/documentation/thesis/figures/benchmark/benchmark_metric_summary.csv @@ -0,0 +1,91 @@ +setup,category,metric,unit,direction,payload_size_bytes,protocol,count,mean,median,min,max,std +bridge-new,flent,data_file_exists,bool,,,,3,1.0,1.0,1.0,1.0,0.0 +bridge-new,iperf_tcp,retransmits,count,forward,,,1,0.0,0.0,0.0,0.0, +bridge-new,iperf_tcp,retransmits,count,reverse,,,1,0.0,0.0,0.0,0.0, +bridge-new,iperf_tcp,throughput,Mbit/s,forward,,,1,941.2170773518191,941.2170773518191,941.2170773518191,941.2170773518191, +bridge-new,iperf_tcp,throughput,Mbit/s,reverse,,,1,941.223044856063,941.223044856063,941.223044856063,941.223044856063, +bridge-new,iperf_udp,jitter,ms,forward,,,1,329.1133542566476,329.1133542566476,329.1133542566476,329.1133542566476, +bridge-new,iperf_udp,jitter,ms,reverse,,,1,0.011945675546752457,0.011945675546752457,0.011945675546752457,0.011945675546752457, +bridge-new,iperf_udp,loss,percent,forward,,,1,0.00552541229203311,0.00552541229203311,0.00552541229203311,0.00552541229203311, +bridge-new,iperf_udp,loss,percent,reverse,,,1,0.0,0.0,0.0,0.0, +bridge-new,iperf_udp,throughput,Mbit/s,forward,,,1,691.7975032635362,691.7975032635362,691.7975032635362,691.7975032635362, +bridge-new,iperf_udp,throughput,Mbit/s,reverse,,,1,899.980891114048,899.980891114048,899.980891114048,899.980891114048, +bridge-new,ping,jitter_mean_abs_delta,ms,,56.0,,1,0.25014242848569707,0.25014242848569707,0.25014242848569707,0.25014242848569707, +bridge-new,ping,jitter_mean_abs_delta,ms,,512.0,,1,0.20838367673534708,0.20838367673534708,0.20838367673534708,0.20838367673534708, +bridge-new,ping,jitter_mean_abs_delta,ms,,1472.0,,1,0.18928945789157833,0.18928945789157833,0.18928945789157833,0.18928945789157833, +bridge-new,ping,loss,percent,,56.0,,1,0.0,0.0,0.0,0.0, +bridge-new,ping,loss,percent,,512.0,,1,0.0,0.0,0.0,0.0, +bridge-new,ping,loss,percent,,1472.0,,1,0.0,0.0,0.0,0.0, +bridge-new,ping,rtt_iqr,ms,,56.0,,1,0.20999999999999974,0.20999999999999974,0.20999999999999974,0.20999999999999974, +bridge-new,ping,rtt_iqr,ms,,512.0,,1,0.17000000000000015,0.17000000000000015,0.17000000000000015,0.17000000000000015, +bridge-new,ping,rtt_iqr,ms,,1472.0,,1,0.15999999999999992,0.15999999999999992,0.15999999999999992,0.15999999999999992, +bridge-new,ping,rtt_mad,ms,,56.0,,1,0.06999999999999984,0.06999999999999984,0.06999999999999984,0.06999999999999984, +bridge-new,ping,rtt_mad,ms,,512.0,,1,0.050000000000000266,0.050000000000000266,0.050000000000000266,0.050000000000000266, +bridge-new,ping,rtt_mad,ms,,1472.0,,1,0.040000000000000036,0.040000000000000036,0.040000000000000036,0.040000000000000036, +bridge-new,ping,rtt_max,ms,,56.0,,1,2.24,2.24,2.24,2.24, +bridge-new,ping,rtt_max,ms,,512.0,,1,2.31,2.31,2.31,2.31, +bridge-new,ping,rtt_max,ms,,1472.0,,1,2.36,2.36,2.36,2.36, +bridge-new,ping,rtt_mean,ms,,56.0,,1,1.7996464,1.7996464,1.7996464,1.7996464, +bridge-new,ping,rtt_mean,ms,,512.0,,1,1.866984,1.866984,1.866984,1.866984, +bridge-new,ping,rtt_mean,ms,,1472.0,,1,1.910105,1.910105,1.910105,1.910105, +bridge-new,ping,rtt_median,ms,,56.0,,1,1.98,1.98,1.98,1.98, +bridge-new,ping,rtt_median,ms,,512.0,,1,2.03,2.03,2.03,2.03, +bridge-new,ping,rtt_median,ms,,1472.0,,1,2.08,2.08,2.08,2.08, +bridge-new,ping,rtt_min,ms,,56.0,,1,0.279,0.279,0.279,0.279, +bridge-new,ping,rtt_min,ms,,512.0,,1,0.306,0.306,0.306,0.306, +bridge-new,ping,rtt_min,ms,,1472.0,,1,0.373,0.373,0.373,0.373, +bridge-new,ping,rtt_p95,ms,,56.0,,1,2.09,2.09,2.09,2.09, +bridge-new,ping,rtt_p95,ms,,512.0,,1,2.13,2.13,2.13,2.13, +bridge-new,ping,rtt_p95,ms,,1472.0,,1,2.18,2.18,2.18,2.18, +bridge-new,ping,rtt_p99,ms,,56.0,,1,2.14,2.14,2.14,2.14, +bridge-new,ping,rtt_p99,ms,,512.0,,1,2.17,2.17,2.17,2.17, +bridge-new,ping,rtt_p99,ms,,1472.0,,1,2.21,2.21,2.21,2.21, +bridge-new,ping,rtt_stdev,ms,,56.0,,1,0.42052572542496,0.42052572542496,0.42052572542496,0.42052572542496, +bridge-new,ping,rtt_stdev,ms,,512.0,,1,0.38826014131180947,0.38826014131180947,0.38826014131180947,0.38826014131180947, +bridge-new,ping,rtt_stdev,ms,,1472.0,,1,0.40225082364120024,0.40225082364120024,0.40225082364120024,0.40225082364120024, +bridge-new,sockperf,avg_latency_usec,us,,,tcp,1,242.02,242.02,242.02,242.02, +direct,flent,data_file_exists,bool,,,,3,1.0,1.0,1.0,1.0,0.0 +direct,iperf_tcp,retransmits,count,forward,,,1,0.0,0.0,0.0,0.0, +direct,iperf_tcp,retransmits,count,reverse,,,1,0.0,0.0,0.0,0.0, +direct,iperf_tcp,throughput,Mbit/s,forward,,,1,941.4052500378058,941.4052500378058,941.4052500378058,941.4052500378058, +direct,iperf_tcp,throughput,Mbit/s,reverse,,,1,941.4233862520524,941.4233862520524,941.4233862520524,941.4233862520524, +direct,iperf_udp,jitter,ms,forward,,,1,0.010443516671235937,0.010443516671235937,0.010443516671235937,0.010443516671235937, +direct,iperf_udp,jitter,ms,reverse,,,1,0.010410725838564765,0.010410725838564765,0.010410725838564765,0.010410725838564765, +direct,iperf_udp,loss,percent,forward,,,1,0.0,0.0,0.0,0.0, +direct,iperf_udp,loss,percent,reverse,,,1,0.002895969068476154,0.002895969068476154,0.002895969068476154,0.002895969068476154, +direct,iperf_udp,throughput,Mbit/s,forward,,,1,899.951785108759,899.951785108759,899.951785108759,899.951785108759, +direct,iperf_udp,throughput,Mbit/s,reverse,,,1,899.961104896446,899.961104896446,899.961104896446,899.961104896446, +direct,ping,jitter_mean_abs_delta,ms,,56.0,,1,0.16798879775955192,0.16798879775955192,0.16798879775955192,0.16798879775955192, +direct,ping,jitter_mean_abs_delta,ms,,512.0,,1,0.18655691138227648,0.18655691138227648,0.18655691138227648,0.18655691138227648, +direct,ping,jitter_mean_abs_delta,ms,,1472.0,,1,0.18377075415083016,0.18377075415083016,0.18377075415083016,0.18377075415083016, +direct,ping,loss,percent,,56.0,,1,0.0,0.0,0.0,0.0, +direct,ping,loss,percent,,512.0,,1,0.0,0.0,0.0,0.0, +direct,ping,loss,percent,,1472.0,,1,0.0,0.0,0.0,0.0, +direct,ping,rtt_iqr,ms,,56.0,,1,0.14000000000000012,0.14000000000000012,0.14000000000000012,0.14000000000000012, +direct,ping,rtt_iqr,ms,,512.0,,1,0.16000000000000014,0.16000000000000014,0.16000000000000014,0.16000000000000014, +direct,ping,rtt_iqr,ms,,1472.0,,1,0.1200000000000001,0.1200000000000001,0.1200000000000001,0.1200000000000001, +direct,ping,rtt_mad,ms,,56.0,,1,0.040000000000000036,0.040000000000000036,0.040000000000000036,0.040000000000000036, +direct,ping,rtt_mad,ms,,512.0,,1,0.08000000000000007,0.08000000000000007,0.08000000000000007,0.08000000000000007, +direct,ping,rtt_mad,ms,,1472.0,,1,0.05999999999999983,0.05999999999999983,0.05999999999999983,0.05999999999999983, +direct,ping,rtt_max,ms,,56.0,,1,1.74,1.74,1.74,1.74, +direct,ping,rtt_max,ms,,512.0,,1,1.78,1.78,1.78,1.78, +direct,ping,rtt_max,ms,,1472.0,,1,1.81,1.81,1.81,1.81, +direct,ping,rtt_mean,ms,,56.0,,1,1.3608360000000002,1.3608360000000002,1.3608360000000002,1.3608360000000002, +direct,ping,rtt_mean,ms,,512.0,,1,1.3263896000000002,1.3263896000000002,1.3263896000000002,1.3263896000000002, +direct,ping,rtt_mean,ms,,1472.0,,1,1.335693,1.335693,1.335693,1.335693, +direct,ping,rtt_median,ms,,56.0,,1,1.51,1.51,1.51,1.51, +direct,ping,rtt_median,ms,,512.0,,1,1.48,1.48,1.48,1.48, +direct,ping,rtt_median,ms,,1472.0,,1,1.43,1.43,1.43,1.43, +direct,ping,rtt_min,ms,,56.0,,1,0.027,0.027,0.027,0.027, +direct,ping,rtt_min,ms,,512.0,,1,0.043,0.043,0.043,0.043, +direct,ping,rtt_min,ms,,1472.0,,1,0.077,0.077,0.077,0.077, +direct,ping,rtt_p95,ms,,56.0,,1,1.59,1.59,1.59,1.59, +direct,ping,rtt_p95,ms,,512.0,,1,1.6,1.6,1.6,1.6, +direct,ping,rtt_p95,ms,,1472.0,,1,1.63,1.63,1.63,1.63, +direct,ping,rtt_p99,ms,,56.0,,1,1.66,1.66,1.66,1.66, +direct,ping,rtt_p99,ms,,512.0,,1,1.65,1.65,1.65,1.65, +direct,ping,rtt_p99,ms,,1472.0,,1,1.68,1.68,1.68,1.68, +direct,ping,rtt_stdev,ms,,56.0,,1,0.38241341543944507,0.38241341543944507,0.38241341543944507,0.38241341543944507, +direct,ping,rtt_stdev,ms,,512.0,,1,0.41370645730808175,0.41370645730808175,0.41370645730808175,0.41370645730808175, +direct,ping,rtt_stdev,ms,,1472.0,,1,0.36380108603059363,0.36380108603059363,0.36380108603059363,0.36380108603059363, +direct,sockperf,avg_latency_usec,us,,,tcp,1,21.286,21.286,21.286,21.286, diff --git a/documentation/thesis/figures/benchmark/benchmark_metrics.csv b/documentation/thesis/figures/benchmark/benchmark_metrics.csv new file mode 100644 index 0000000..a4f9b26 --- /dev/null +++ b/documentation/thesis/figures/benchmark/benchmark_metrics.csv @@ -0,0 +1,95 @@ +setup,category,metric,value,unit,direction,payload_size_bytes,protocol,test,source +direct,flent,data_file_exists,1.0,bool,,,,rrul,measurments/20260508-221054-direct/summary.json +direct,flent,data_file_exists,1.0,bool,,,,tcp_upload,measurments/20260508-221054-direct/summary.json +direct,flent,data_file_exists,1.0,bool,,,,tcp_download,measurments/20260508-221054-direct/summary.json +direct,iperf_tcp,retransmits,0.0,count,forward,,,,measurments/20260508-221054-direct/summary.json +direct,iperf_tcp,retransmits,0.0,count,reverse,,,,measurments/20260508-221054-direct/summary.json +direct,iperf_tcp,throughput,941.4052500378058,Mbit/s,forward,,,,measurments/20260508-221054-direct/summary.json +direct,iperf_tcp,throughput,941.4233862520524,Mbit/s,reverse,,,,measurments/20260508-221054-direct/summary.json +direct,iperf_udp,jitter,0.010443516671235937,ms,forward,,,,measurments/20260508-221054-direct/summary.json +direct,iperf_udp,jitter,0.010410725838564765,ms,reverse,,,,measurments/20260508-221054-direct/summary.json +direct,iperf_udp,loss,0.0,percent,forward,,,,measurments/20260508-221054-direct/summary.json +direct,iperf_udp,loss,0.002895969068476154,percent,reverse,,,,measurments/20260508-221054-direct/summary.json +direct,iperf_udp,throughput,899.951785108759,Mbit/s,forward,,,,measurments/20260508-221054-direct/summary.json +direct,iperf_udp,throughput,899.961104896446,Mbit/s,reverse,,,,measurments/20260508-221054-direct/summary.json +direct,ping,jitter_mean_abs_delta,0.16798879775955192,ms,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,jitter_mean_abs_delta,0.18655691138227648,ms,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,jitter_mean_abs_delta,0.18377075415083016,ms,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,loss,0.0,percent,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,loss,0.0,percent,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,loss,0.0,percent,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_iqr,0.14000000000000012,ms,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_iqr,0.16000000000000014,ms,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_iqr,0.1200000000000001,ms,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_mad,0.040000000000000036,ms,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_mad,0.08000000000000007,ms,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_mad,0.05999999999999983,ms,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_max,1.74,ms,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_max,1.78,ms,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_max,1.81,ms,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_mean,1.3608360000000002,ms,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_mean,1.3263896000000002,ms,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_mean,1.335693,ms,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_median,1.51,ms,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_median,1.48,ms,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_median,1.43,ms,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_min,0.027,ms,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_min,0.043,ms,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_min,0.077,ms,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_p95,1.59,ms,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_p95,1.6,ms,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_p95,1.63,ms,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_p99,1.66,ms,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_p99,1.65,ms,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_p99,1.68,ms,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_stdev,0.38241341543944507,ms,,56.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_stdev,0.41370645730808175,ms,,512.0,,,measurments/20260508-221054-direct/summary.json +direct,ping,rtt_stdev,0.36380108603059363,ms,,1472.0,,,measurments/20260508-221054-direct/summary.json +direct,sockperf,avg_latency_usec,21.286,us,,,tcp,,measurments/20260508-221054-direct/summary.json +bridge-new,flent,data_file_exists,1.0,bool,,,,rrul,measurments/20260508-215553-bridge-new/summary.json +bridge-new,flent,data_file_exists,1.0,bool,,,,tcp_upload,measurments/20260508-215553-bridge-new/summary.json +bridge-new,flent,data_file_exists,1.0,bool,,,,tcp_download,measurments/20260508-215553-bridge-new/summary.json +bridge-new,iperf_tcp,retransmits,0.0,count,forward,,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,iperf_tcp,retransmits,0.0,count,reverse,,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,iperf_tcp,throughput,941.2170773518191,Mbit/s,forward,,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,iperf_tcp,throughput,941.223044856063,Mbit/s,reverse,,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,iperf_udp,jitter,329.1133542566476,ms,forward,,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,iperf_udp,jitter,0.011945675546752457,ms,reverse,,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,iperf_udp,loss,0.00552541229203311,percent,forward,,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,iperf_udp,loss,0.0,percent,reverse,,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,iperf_udp,throughput,691.7975032635362,Mbit/s,forward,,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,iperf_udp,throughput,899.980891114048,Mbit/s,reverse,,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,jitter_mean_abs_delta,0.25014242848569707,ms,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,jitter_mean_abs_delta,0.20838367673534708,ms,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,jitter_mean_abs_delta,0.18928945789157833,ms,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,loss,0.0,percent,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,loss,0.0,percent,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,loss,0.0,percent,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_iqr,0.20999999999999974,ms,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_iqr,0.17000000000000015,ms,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_iqr,0.15999999999999992,ms,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_mad,0.06999999999999984,ms,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_mad,0.050000000000000266,ms,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_mad,0.040000000000000036,ms,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_max,2.24,ms,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_max,2.31,ms,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_max,2.36,ms,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_mean,1.7996464,ms,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_mean,1.866984,ms,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_mean,1.910105,ms,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_median,1.98,ms,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_median,2.03,ms,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_median,2.08,ms,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_min,0.279,ms,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_min,0.306,ms,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_min,0.373,ms,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_p95,2.09,ms,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_p95,2.13,ms,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_p95,2.18,ms,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_p99,2.14,ms,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_p99,2.17,ms,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_p99,2.21,ms,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_stdev,0.42052572542496,ms,,56.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_stdev,0.38826014131180947,ms,,512.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,ping,rtt_stdev,0.40225082364120024,ms,,1472.0,,,measurments/20260508-215553-bridge-new/summary.json +bridge-new,sockperf,avg_latency_usec,242.02,us,,,tcp,,measurments/20260508-215553-bridge-new/summary.json diff --git a/documentation/thesis/figures/benchmark/ping_rtt_percentiles.png b/documentation/thesis/figures/benchmark/ping_rtt_percentiles.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ab155a2beca54c6492355febbca36496f6dd19 GIT binary patch literal 54212 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 huD8Gb-} + + + + + + + 2026-05-10T16:24:19.348732 + image/svg+xml + + + Matplotlib v3.6.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/thesis/figures/benchmark/sockperf_latency.png b/documentation/thesis/figures/benchmark/sockperf_latency.png new file mode 100644 index 0000000000000000000000000000000000000000..6be7165a6eef24a3ca18432391ac54e854c508bd GIT binary patch literal 51284 zcmeFa2T)bpwk?X0ZDgAO6~VADl0*TKsBV=-5R{-GQ9vXsQ8MZl-6n8>Lu~Gxw(xOet^r=Opm){C~F9Bvf`?QvN;{yj!N?XMN6M1 zJfow_dqe%}n8Nj^-3`_j3YF8-zx2wsuetfB%JIkR)9!7T5%-ngezAAk`@&6&Hf`1X zrV_3BCSv>k3mq@Z{@MQLVhM&!rhSXnZ~wDQ!nAFKKD$U@hY#fhZN=jeL(ZzBKJg`u z0f&69_8l$h&XjS{VqT1En0>|GR6ENw{};M@Y>UaA&b~DH{Q!b)?y`lci}C`imp7RqT-umRP!>?u&T5D z^Q*LLKU~(YU#}3SLsblwJ60KS{(P>>n#v3tb3T*$3&X?1C)Ie(9{c)+J568{GTQ-%`kD)2~A< zOS$&ru;b+D&ahoaj$AmP6zN8>?5v;;bygmr9VM4`a_MUPF++!owe3l)vS=@T!O?a} zTibGa(&m|%llr1Xi)evwZqav%&5XG|jQBh8ON@r;TBgp*h>%4~mgkq3%UfAlnO)7F znRznv!&R*4+f7Q;#pE-683T_bJ@!8C%X%ypf4P`O8S1GU$y&qQyJ^Rc9j#4wyu6qe zEuo_mUq1Ws?^Ul~PjO*ji*|GSlX}jFSGOWaim5V2LnBD?$vJ!bjGMP^S+Rr&fa)g>9zDDDM;ec3bW{{H^UYG*z^IdEvozUvF;*u+GH-AM1Uqn|S0 z*414MkqzMLI2?z$=5a7y+%9{jPMde2YKgvuk-UIPX6_m1kK*wULnn*V{wPT z!GmYBr^h4sP3l9<+dl0(dQ>Gy%1f!(mv5-qUDn`h&J7#&5T_D<5taDM4~Ki|LbeK+ z?8Wb}va*J&r6;K*8HF`w+C?0{y;7-)dBcWR2em)!<>8T|9X4y0knufC-R(}LRlGPs zfBWyhLzUw%tHf&FAeS~a&~{+^cJcEu>Q8Rnx@Axq9+c%U5$-fI9Ty*8XjybI*+jp9 z#$KCd8SyDVET+BvN@{v~VP4*8wKR*fGt*No?d{$@iJJu?5nEZl0;bW$egcLyak@tx zCsR!7Q(iPT>l6owY2@BvD6ue>khqII=iZSxDB4SQj#7*|CpG+B(7i1JCXwoywq(g9 zWn?OS`3w&mRD`ljcpuiM+5D(050O29C6@B!cpMNAz@?rM`tIFdHgo)$-T(leh@kx@6PySFVIgdUAw~4|N%0{W@zCyVM%uE$m`wkG2U( zesn1RT2Y}eHa3QQAam4qF!XJ1t}e5Su!x9awxff{uXh{p8xg8%YVoQ}%*>&9I8t}k zZY#UJipc^Y`GiCH+@=Fc722*M!8=a4gj)5~3T82NAbPYM0}g#msVGPG&~4nMi8t>b z9!|Qhk#5yfhDbL?hPq<14e}msL&(y| z<&jJmrK0F6Iv$E|z06~^lP>F_OGf~cpZMs-9m9DsDZjB%G;cb4X4+0BKva!3*y5$p z+SRuS`-|asy14Kmb7R>pmr3Mn4|V%rCkNuBI^Mp0yOEJG7>W5xZ++_caGhz(k008v z0}z6lW37I*NUEOZ0w(pP54Q>=n75sYQcLGARHsW_!N5?JJw3#|O~?wD!q=YnaI4FRP6Ofymn`k#;($koE zaTOC+#Zy6ZGly6MW|v0WE>7GFNAg9^jpRvUK`B%b+d(%AA-8Mh=JL|g50s)+eGGHl z&i?h+-=|zzjn&QeH8eTRMB&CS7J6}4xr$APsw5h;)K($k^J%?Z`u@WQUkxb3vc_;I1^P_Y*Mf#Pj@u+!Oy)2p9M1so*OO$FY-a_CIeRRk|BG z(KE1CpltC@ZDnL*i(XD`>?$CLDUSCAR;*s?8#yOkd@ zA3T2Ge6&Y;dis0cENm*{rYtpNB88?b2V?_Ib_(SRz9gGBYkJ&}nw-68a-_+r>jph* z=^Zvl?=S|bCg+m-51Q`w)x?Jc)=3%R%9Tlg;?gW8N3Zc+DcvqRl{xg~;!(5ayPaR6 zB19d=Ls3}LY=^=T<6&5n_S!^4a?^>nLk3Uw$$z*c1{^>D$3{G2RuS7!T#1>5Ma66F zyupdS>;qg}XS%*b$%mZ_8hk^~RzEb=)?DOsXv^U%ZkH}yqEPYEipeGogI{kkkef#} zs+^vhNW_vEiKQcQ&8)1H?lW>$#A=;D-Y+aDpjO3bRCSbxw6wK_1O`$_WROHA_?7B4 zoz5m?6-f!R8E93`I_V^!?l`8qZ0S;ow5gHmY$qoILkbECaQ$ABlan4#pGG467my5< zy^lKHG&3Dy+4Ut1;RQ(Km64gbY15`4KEp3p5VQ9XoQ5%(WQ#C=!PktO zDmq&bz`M#z5G-4SugBiJd6Pn2v*oZ{+oxxWL6Vz-0t4FtELF1XQvu@mu6_RtkS0t% zxh+Mf@R8-W()z$TL=-FM`sOulT<=%OSdLJ=C!ap@;q|vTKLPn<8 zLX@5Ty*ID!z0~6T$GhTt^!l3%TKNIX`A~1;jlI0RuNc+Du@`ocZvhTHz-H0271_Ht zA7PyN4M`tBxa7j?OSj+KQBB*(-^1kdMyE!a;uBV^T6HMRs>i^@OU((jfQQwt`(SQf zUf%WZ|Ll2yFx3%iytnDV1Jo5}TP(j#)kOg zWpy0YBER1b^bl+=WYx`6HG+^3$aCC%=Bamw<8D;dz`#Hq19uM(9cgc#9rAwNI^7}1 zZY}?SWD}o|diC4QUjQL~b-=cl_2W@U2F7#?J#_`0#`<*!#<0UK3kKkKg@-ESTlw)E z`H-UHqQ+W_{XSs%<1(`JN?3R8-o3ldaCI(Ev|9S*!S>I&KY#r?NCLJ+M9ND&_uW4m zIESB@v=;fa4kNLBGIK=IY8{Xj9SgjMDC01;>aEuYfXbij%YT2L$(#i@ly|-DnRQ%6 zfT!o>2it_c)PE=`;jS9zEEpAVZ|FO~on+GB+tT#fvGZJ8=mGqv`^NUy6=6PG0xqzr(=B-&qx7 zN`3+`vA`-4McjMF*q|)%pVugJ_Y>KUTI8oVPT2-ml{p0<+IdjyIn*bNjV@d-XaynsMD zs7>ar()SP1V-vl?GnAxxa$XEhNjY+VC?ze8{D#;4`%?a$+!9XHV1^79!ZB8_*Da+V%^3tW3??slCjg5}Bqc4>8Y)UQA zDcfqAp*3wYG2Ao8DW*}IWbF52dcTYxf2Dbe$R4UnwqvG^_E0+MD+hQLZqYM*xw~#x zoN*hFC7um6E%Rv^Le{+7`lH7_lw3#8DmL5p9muW4!oyDvoR3TJ;WPBKQF@!l<`jtq zQ()R>?z zA3T79bf|C5TE@PbtHue6CNk;w#+*dljxjuXLZ0wEBQ6V8A z(p{GIWU@~q*$NK{qQ2fQd~rlbsH-C+z|&%4k*<}USztUO6)2v=zpwPgEt?JB(RQ~^ zX#ISKDpiyhlhH4EWBA$UU9Q5HL`7`}ue^A;t6}YAnb&^9FOfc5_zZMj_W<4(zo>fV zRAp^D-Vwstd+ThJ3g1BMdu*9>zc}Ol4gq(OyQKZ}njWH{d9$@%T**`>GF+|Qx~A6} zDdV*o8aMNL4#6KZ8Q{rc3oeHymX6_bGG8XseWLN?Tbn|H9JI03^cn@&(|JHLO`5-^ zN86tx<{T0da{1HKu=`Bh1}KH3{ypAxnzvX*LRz{44{Ot(e?B+O8rxl%9CJvty{Kbr zG>zBT#kTE37Qi?UTU*kOE9ypdNisk3T+gFVm-OO_0u9g@{!qK2p~1XC>Nz$G$$*rO z>et$&Wu$bVKDU}K1q#wzsTH?j%N7GsQK#vQ_anbPpJppIpIWvL1POxI-NPp7_$ll- zLjQ130l*dg`3*A7WyZTdg~Vt%bypt*isr7fLRJ67cU`|RBb9WRC}f0tsVdFe(h;D> z%^kxcz*8cFOT*(xK#%qeWqjSbb&PrmI+H~kT^=}9r5a!A?(7Uljk$pS;2fG=lg14F zUn7s}Ce+czsim5|&j^q@yK>E%N@S7*lm^1boIQJ%F*mHVw3Ow9cYUCf3rH5NMq!~n z9XHNcZM_#_SRJeND4vIRdRvpAJm-(qJ}8cD7w)rzq(O=e$QtiF@Jz%`34Q6ujWp^E zlQ5#n?}Q|>rqgy!RO(UsFr_G8_3Pi3W&V7-ig)!1FD|t*K&zp)0H@BF>}i@7^SuWT zDzK=DCJkxQQcMjg*G`o6(EruZ6rLD(>HWR^XJ7uke#3@MjEtTgs^d$_*RxCJ*VPGW zjBEg`B^(2YE08q^xPVBjt%xK>(^frZ3J&XYD?QSbK6+ohFcC7FQl3U zjn!3l#B=s4pvy+$lR~U1ii z(fn%#aS!?@CL|ar8#Zhx-fG!)^305S^YDn*wP88Hr(pBVOCqtaTT}gohWeT`n(PN2 zo|BhHZj6&&bV5$fO)$S5fape%3S#{|Jt4Ys#5@Xg&LtXDDqxR|jgK1uaoYlfqAQQN zd-o4c^^7CsOJWD`LS+pO=g#}vNB48qnr zCY4Q3PjBGb2l~fjHr3wpQ8o^)t5n9vJJ=;X2o&T@>H=0Lj28QzJtXhvU#r=Pk$|p`3cSB?u%F^<0!nVnwjbRzegI`t6_f>_x`q zGs9(KO}E*xfOUP;kM@1m)5dxp*94R7DuFo;gK6CCvIA5c>E~TVhP_cMIhdH325yZ3 zRC()FH;*8!)df782m4N*iDxpC|1-d_!z#2MpJQATchYI{*B#O?547$35l7{4T}qcT zb;lXC{Hy3^q+SAv(dT+m&}0kA=eSM(+=uQ#b}GnpqkWr8QimARyIc(*)Xe^m2YioQ zLy>(sh`epkm|+9n*2I4zzi=wB>AuI<4%H9zaYz|eXfOMPdowTNDG=Tvu&&AMlgX{` z-I1!Pyj9LSfc^4JIWO8e^?7(TDSjwXJZ3_B_RHKpIiLY~#V7anQ&H|^n;$gq#(Ml3 z(WHK;HLHzGJ2KkpXR5>O!otEb*kIj6V17x`v!F~$ugm@W_jm5x*^FA}?CiX_Ys6&J zySAeZ&Wn~L=oT`ft?xvxA^q4BUtfd9svy)5gW3fBtPj|c?-~4r5kU2)d83~=we|C2 z^UzGh{w^}^@F^{o8#u?(^6^O_Qm;)ANG>$}ZRxFq8Uw%vBPWkG+}~liMzxBsr2UhO zU%dPDSGDo%kz*e-JU&133t<%KU|1AoiSAxiptHC~Bx!KEwStRVdsFi{c@qPYM9aJw@kpN%uH}ADnb+snw;%MKRc~y{n2zqXq*AG^x^}?KItNwVJla|!`*%)F zWm)y8yx?|v!h}6_n61q^w+AhfkJtt&FRmw)si7*3)|t%MgkegE!VIRk_6!1|G4WXsc!+73-~ znNK(bmaHa}B@j%%oc=e-8EL69VEKVcFR-bCe^n=&2B4)YD%>S_mQMlZ|5B1F<1LHa4o$2u;9PoqU~s zHS=@yRckf;qa>jM* z_e=+!oSX(~e}Y~3a-TcPyUR&FSo&bh*=!KMEa*=m^6?O3@y%iTU^G`hkZuU7Jnljsd$WwAMT8GFY*aoWDsQ4pbq$bp?nk z-ybIqQ&;}+M`?1Cqv5pR)Ek>LNI~JCys^#h`X043@VxU;UtfQ`{gtalXT?71xk67) z5WZ8=#^DNKFTrC;rA^8F1aaY86;u*E4bJv>>qeW?G>ab})_{ZADJ!)- z>cZ>e=9S=V*bF>Q+QMpB?M9onZ38rMv`$4s7k`(;$kLcdnWHVSZq+)p z9YeK-F)jL3R#Q_`YOwuExtkELhXvSZW9s|)CcMq+Y%oN zuHR3OYw6OZgo9A7Rn4+jMz$^KPtA1q^70xRZ7y&ZOae}gMi0KfW0>}r;MByPhP7PT z6TL!s92|L$1KRZ|*IMN?zrXuO@Y4~(CqWg^`ehI1yCPii05#c*D#^fDQ@@$cd4g#+ zF>W-+)*DBz9YVZ^;|@sMXz(R63>EkQAD<$j@~~SIO`Ajq_+&+f6q1@KGks1o2Q)M^ z-oJZy<;~4yN3VW$CJY~G62SedWZEVoinst}h1k&GC-D)Ej$F$pB#DM}>j?A>ou6Ob zK|{Iy{Q2|X+uG4ZAYr=`0vn;;Jmv_574G4&5hz%uDq5`^y-tGWo14-Miw+Sf5fzH? ztj5)`$F?1{a6@?@G$_d5hKxuVkeG35-(T5}_4|rCqRikhPPnzFMMM;@OC_dgB|f)IhExxubF2Y`l$91a+k|K`mxP@ZIw(a&(N zVL8H6PSY$A2I%6vxI32z%`2Net^z6L2_a6gxcXq233+Hc+#QD2qj_8%wE8I|fC@sV zL3h=yl}N`%v&rJdQv?m(D7+*Pu&@)?1DG3w^+Fbsa&&ZTrSFN!9QH+Hc)2D0d4|YbtIJe#4wj zGi(aF;}Ej5o?RBMn<#mtkVCYoyyT>=u09Uf634N}<5O|53`o;5FXypbKuVV?Pc;;Uy8kCpnvh zh$!YOWF1X%9TAE2K0PhC_HcUeVRYXz5b6A4M|#m7KC)Xc8npx zWJ&J`WAE+lZFSZf{rRmn+bNrfvw&rgCV1p80v|J}Uq1$X{qdltTi~xBd0jzX>gOOK zgPL>iP=!v;%bDBS+8Rvs5cl0OWnil|LYl=^EzVG=e)ja)vzFdo|E|oIyh8454ybt! zV=Z2ia4KLCIeQ;#cQn1RKo?qu<vGK z7$iuCU+J`ZixC}|C^m>GI;N3i?R=RRd zuVoo7k-H8GzB0|y5S1nj%ps#*2-LiZC9_}v<_qCp0|STp?(k~nIPZ*x_^@%_#N-x% z2RksmP4}b6S;YJOl$~^RauwCL&}QPL(>2&p4z5KJVl0Vs5L1$AnIR`k?0(@*okZuH zP;OCZC2BI7Bne0~fE<2OVI8jC>rdh)!4I;aK;{<~N)d9Muqc9pf}1R(USgm zJgc_}UoV|B|MB7Bidi=cF6XQ0hxNGn->?68WgL$w`v9+?NfN3Ts&63b!Ctsfz+iX) z?GbZ_p1;j0)Nk~0=nk9pGX$FKhdfuMcJ115xfeHybSE-Ubg1>}b|EG%RW}NJC470)nVFfz zc_1y$PmK=^*lu06n~$$D{O8iS_m(>hGs~(Vjm0j))reYxN2%xVq=sOHX|5K9hG_qk zMtcc>1KZOTBy+-y^XY!vD0oE2p$p0@JC)EauV=u>`nvAgxw9W1K`^3~l{De2$jjMI zP5pe!YsN(p?p$lgrBZbw=2F>N9bPkXbRY6imxx7L|-F`uAI0V00LeiX?Im= zI4OcS5JkhuQ3WMViiX-{78wT2+WI3UB_%yIYNs}{3kXNBMJg3RUs*4insOuS`$z}B z1x7oo;jlgHZ?ji2rXP{mv4VA zRP~ZYC(zbJt7jTC#=khSbZ=}XJXa@ApN9By5&bq$y}Abv9!xW9xffXX z<|cFjIJaO=lPIM_msw0M4u}XOH+wFRMa#!csO5#l#ZjS!AmhkObJ3#QZ9wotWm4Sw z&<$vTNF(~Nmo59^1YN|kql_I0^gv-MAZj~oG`Ny;j~tfL)9a#wDRHYTsD422Ur$471eED@^?!9|n~fQWK*1FI|^ zz}7cwIC;{dN_aElvh1ONXOP!Wy=u(i23(bpb<+bDQg3f&YBC$^2CnS_So{8;KjA1C zUgdXV?o&p%7Q4)Fb8^ZcjaHCekxC>wWLo?Sb3 z9Gi8A;>kq(_0RfcD%!`eYW!^JX=#jF?0e7fIx6uxy8ONgy84TMFk9HI8HH3HDao<)w*p}-lbEF#2`V+s9P<4B{X0jJwS|R;ySsdF72FED zu+YT7g1mz4{)8yESi&nn1mh4Ci*~#N%B%>ax*JXS3){pkXJCy4kXy5v_b&p-fyp94 zl5;A@{RM}OJ4FQii~*kZv3k+D`=nDk1e4E3%XKHC(5EUTvI&@|dS-4$X^R5G)^hzB zgi@$>gfbUAa^aKJmuR&Jc&ZKn`qT~Jag`&}HGltpNwHz<|B@W(NWb=0Q^6HfVTYrD=`Sq`cKj&}sKf(b3 zn3eT#Fb1L06K6CqJy)mM+|O=Y%x|-Nf9mAa6!EyBDUyV8 zhT2&HmMFT--|h@pFwLZ?)ev#63D}H)dDjOG3IPO009weS~RFKuD*J6P?cE-Qdg8}>N(Ook&Xb*gt&1K z-H?AW5n3G9)+551PH1kcU^_{GmE*RH%YJ@-B{Y#>AcF~p0?DRgUoy+r^$!e`lgG=- z$_4cYOmqZ*!`5IAB5p$%a*lN_o6J7dTBU@VLNdAAhi!YS0^MS6pj6R_JpLTg$O~AJjtE$^X8cV z(Pte)*c62KLX$xH`^!b%FJK{1?%o66ZC~byKTPplxjb=$gmweSlU>EgQA#X-s%)@F zq4PB)uG8^{Ae!+PKC~gk!;qTQ^!pxWb$dCEA~*+;VaQX%ri6iz6B$)%dU~25PE?w~ z4_i%%109Ofg(L@H4E@Q`Un^IxJO>28cDtbX7d;$E~O(mKL>OB-yDM0fM zk3)>)31CBCdbz|uihKh~5y8Ze#N+DQ0L+WO z9S2Xx2Ly{?*4x}Ch8Y7mYvD)f%bNJa!X-TUGnZs#1&|U0W3b>FV9$~L4KZ}^lTcqM zJbO0kNh`1h@5}EvMSgCoI&nXZfbIJRUNO(D(?>Wud3%MHuHMTCYGWvSW{O)r#f{6s z^)^VKy?ggcz>S(TDxM8SomliiyuYwf4m_`J!(QjW2)QT_vYe`{*i^#m+)`wLD{Gm1 zv1S6q2n-av+8*H0=k09^vMY%74ct{H9MQ_XhXB09W+vk)1)$WL97diI@vO(2i13J- z;3`0tgsb0$(p^>buMZrh3# zpE7sg)_MuF0oueaut)cePe0u9B?G0BW>Tm z(|&jp*B2X`pcy4ENl*~B`LPrb1ASr zl>5i!?n6Ro6^J?4s;IPd=HiBAWT>(5UECu9jk`rf)d6RfT<4PJ^Xt1b#b1Bz?ta?F z4|=G^UpC+yWZgT>sfn5K!IQ$8B^P4&el!YR{t#g9=kWOAHXEDlLywN-%w8bGStqg@ z@AC56Qi~geRlO)s1qQAiKYmk@PdDR>%I2=b%k@HeMWgXSZtO9Z%`H=(j+}Drg|bIp z;=lgF{e1)Q6ZDsbGzf}?LWRm}&3EcUm)TZX8tf%kM7hpK*Q-6WX-nBWQFI2W1g5jN zZSgQ%wEh5L-V*UBqu$AOE6T!rsr)KR-c}2FR?uGz%H&wx3?NTh#6j>ydX5rKXlqro z-)F;LH}LD3c5Tg6Q-G4m*6jk=>2;#<@fbRQ;q$W4Wn_usJeZUUUI)Os$enx?vjoM9 zP5^7dWgW>n*R_fNIz>JWBRR;wan~Ioy|?}V3}_fS(oyvRngG4#;DOB}Jo%iVfM3tBL)obqnlOA+xOHloyX~Nv&~w0) zbq@_soN5riq4Oo7l!qJVS^&`2M37*7Cx+yg0)6n$b= z(A0cRAtNaP_Wl2$r;dLhgtiYom;nNg{5TPRuofKnI_gP)7rbM4Dy z{5qcJ7kGT6eff=jfo~!}#dLy_gxksk7ywLc5a2`@Tsq768_}y*0^g9RhE1XZc@I=T zII)&vxrsJi0e*sI;yN_LM6{h`Hxc;_^IIm3&jp1V8yi(%kH+ZH3s6p7P-UU`(;^}w zNH_!Fl6X!1#Jm?)E{t46lQ9SMIK-oe9|uVshymyR|I`+8cUBRyjO{7AHwYFu}<#Uc7jvgYewaj0h}V zUhj^d58t%|gQ|1YmM&+prvwzE-!G+InsZ;#(J5*FLwW997q91vNllY!K?>zBG}#3e zyVD&ugRcokLNkP*ymG~gvmj2;l90y_K_CL?3e3&9q#s7L2~^+-;w=dUjOs)sA~H6T z8&Qst&ZGY9n`54HGM$|lr7(bslt7CmZ)Ro|Tot35`VxaIWJ(b_;%8vZr#(aGqg6ix zpaO|sa^yr+M>9tP6>ZKS=mQvGvgG>ao}u{X9h!9aQt?lnNUOew^d1q)4Hr=ebG!Uj zq4b%HYm9$=e?N|?5=w)A4G+2_c>2y^&l4#ST{@X{1M*g8F^5|iL0(1VXfVk6fO(iP z{erQH1T;L@1qILmugVV&=bfi>Fm4Kj1XA}2q!3Dh4sStaC0|_<#Bs9eDPa(R z(DC_$;xZQ1NVCva3_Ev{%=I9By+3&3_;GAwu`ndD)+#c+i8|O$XdpBj#QM+)sDBpl zc-43Qxs+0`UERDn#gzkD0>GOVNcvd$l&gE_=?llS(S;nky^6?U1V~HJ&Ye4#05oB* zG)Gl`RX>>n(-}qs_RUT}LFlrpnzHDvulb&eW{6l2Xo0YZHx12e1--^gSLZl1BR9}Y zxLrNiph189Wsh>gzOQ_D>0B6*c~<8Mn0y~llO`(Fo{&-#tqJfSX8ex0VS?7WzC-Wisy}k0m4=7~j z3Qbc@(q>E!V5KOtj1p=o=dfNFLx)vPET9)h4C-tbWGrQ333@nX166; z5xENXjm#Gtq=1^(@hqrhJdyAEPt7M>YAQ5L1P~n$^JP~MR<<)!BbJafiAfZ*9LTY^ zg@uL5WY9BVn{$5r#xw+vC=^}JefrsOKBoC7VDeGdBKW~A-u^j4D6g+wq zjkc|AtB+mA?%cbkoaUL667h`-2%@>~|37|x`@^T+8BujGnkO%; zxaa;L;K_r49do}p!sy@lqIA|2sjaPjKX(1bJ)6Z2Y!*8)_wT)&=xYy?gko;)PC0q% z)P7OXth)!^W^y47K7Ra|M!_CJqt9e~Z0%sIgV){!XCBdUc~-;yB{ct;YWPeAI77oRJcp#eKbMD)>h10AFS%BY@W9~! zpys2OJ@?}&0su9oB*-CV0m&#}-y_l7OQY1^f=jl!wRJaumY|RjlcnI?ub82!^1Etf zh$teL?CA$~wRmsgLHfHp?NMI5oh7plyt>?rVg=`sCTR zngw>d-5UdQ_tNgZ{E}>{fj((x9zPl@UyP3VgRf<&L)2q`A4q$uY zKtNRIp%o&NmB?vuRKXDLD`J-fZ;p9n(DtC9pbl`NtpT7Vr1MEE*6(qdnY{Jr@1;zZ zoAFmhk>-}Dv69xwZpLMr z#u&hwL<>Z3X$X(yvWeX!639z)*<~Jyaaf<4ySfaotstUEepS_Z@TXpP?%ctX*$p08 z+8CLk5*-xg^r&b%s(_y2i+HZXwVDW046k)49r?cI*L(KP<%ijI3glj$hc*`y&^6|7mG-7(`_Mb6# zwgd7f*5nGB4&_fU8%UBt9t!x5{Zc90sYC-!wopx zW$mI9tT?E_#}y+;@lVANsFW~}vC5vZABn|)7KloEVE_L8b)o>rim7HTsuOozU8?|H z`mfJH2522DcV2QmPr*pgzvOQVE~IMc541pVlFikw2*R;Zv_q}2;xt$Tw^PGa62lc8 zh(I^8b+0Bi)1?Vg^1lWY1OJ9f;mcSR0|SGzURO)@Mb2oP&T*p$Q&Wzj$WHBS%uHv! z{`H1*8>$SNJ1hY(^&&#UGU$NkD zsW-1a{n6_B@uv@gL&%^B8VFh-F{(iSOsa0ItgOt4go1wIkwa64O}V{lu(XeKTba`* z*?+tA|3V2CRM*zi3jtp)MI*C-+I55~zlNyfeI_+C2B2)+u<+cI#BRrX?lM#`^5bV3@j zh@4pk!r8sW9*KGoE_z9tBT}i+$fZ%BV2sPNQ;CM9_#Z!k=t0DfKp`>*(S|oNF@;oD zR~yX~nyjDza$|&589{<=LB_{P(){`JD$)5crIvChJNnVhqVdgN{e+6V8n8p_qGZQIw7{;0}bubrHi4skU*bs>^5m@>^mOI#>*%(IV zQ{BmX&d18o8>~vm27}arKC<{c8<_)WgmHXv_#bn3?R@in)z|soaju-5ot^!s|MT_l z75d+A9avVrDo4M?cq+MuSoF|}8u4S0=J#uFptBZ6KX`qlZ-2IAMAV-H?l9(^1L+9! zD7nQh7O+EH9^qegaQ?T%FW=q*v*A$%B073xfn-{Bp+rpSjI0m>0JaJwNG>83wXcs+64w!wJX_h+^)dZ8aAa;mb*0*I6 z{;NQE1u#;HS@6`fw2wTik#RcFgexLba~3Wv1Y@=R@>?*Jfd27ssRtfQ1U5pel&D{R z%5JzDLc#=b&E;bp45#G~rQ2AUYyP8SbAlJ;;$A3JWNYP5IPxT)XElC#s!eR>v7etG zB@C$976)S>6M`l;DKuNi49ob}Fhd&OM@4^~Z^lKA4I@V=5E1ui72#RV!EOKI%R+JM z{}8-5sjV(le>J%vV{;3eyyJ)2i!m{1F+@IbOf*; z=%>~gPd{aqMnBAGc6VYhm*pDNn0-jJm2M1E)h40fP(oS zr@QAVv&1FD-&T?~dos>efinPi<2dnvxUtE?fwK}W-0=zyNhul>N8NwF>9t8LML@&= zktCH8V#C>)j*5wBv#VE2VaAGA-GH7MgEV0F$Z0Z398B{cd_l8(^J=2ofRn6KVZvc1mfQq{-nU}7nDZDzhhFS)B<6hEyTS&J(%zNo-Y!(`JVE#+aIZ}&`PGbM=MYphpDPhna zPpU3_jvEDdefu7=y`at^D7J$Hfi^Ph`u=?>;{0ow0YaXJSOI^M^Qa!NiWsP~7GN&w z)oE9*qW-x{rW0qynvsKRq<72v*KKv#K_wG0uJZ~1EQq;V}*=fCybt@^)Bk{s}m@yEGnd#GDPY!g@! zu5X#&?$(}vN9XQMk~v@d`nYlD$T*CrM)AQ7)Ea<*Pa)WZRs}+6x(}ZY8@W zAz!sDR?WXb?>gd>n1Ahc{GWwpkfAbgmO}r?2q_|*cNVhuvZ6Phx5)TAXtqj>>^#S@ zS)}C#ft#Sa5Ma;gsx6k^f>{(E6wm@gL<2ytPY$zz$%-`i7d_{9JYD}A!BkhX0R!^e@I(S{7lF(C_I?5&`0k~ zJ}%9=FB;A2eqrHy&z6Oi7mm}%5q5y8hmnJNs$ZWVaxE;2M*fvo0kVnIYJfwe$Wdj+ z4QYx11BzkuAN_SLe?zmN5bXcNiHu`ho@0ifot)ExrU^$#1jF-cT%U3lT!aFgeQ?^5 zsZGctL7|1D5hbs$SxP#GnBxW@+H_)UrGnf&{tQJLX;ofBv=y*3{uM##tHf!{TAQOSwRvW8z3x}n~;0ck#KS2GLqcsT!YG?elutBfR?Cp2{ zhIB`I9pVK=EKq5J7p}k}xqK~4C{Fq#r8_sScF=jiI{3sekBm4nUkGh`z|UHJtv^al9WG0Ik6fn_d6l0B41@_&; z&FwjAUk5H_ESmIgW4*7Q|G$rC{H-`2!@YV4M0{X0ew<8XLTY zr-^R_C%CkH{rVi&(*8P+wHzdY_FDQl^KWmLQO^Oun|C+W)z#VCBa2`HFa+HP6c?SFBvg z%Z9@M_d>{q`x=lZ$lq~XUk2rU?ONrganK3Wb71Mry0dYxOY4ujckkZZS1SpF!dR^s zsYyAR#h6ctj*gxc&z&n_|M2kiRI1RemxrelQzodr#0`qmzZ75owF2`syJf3{q1=%< zZgLhN5=$6-a<^4m8th=zAmb5a;jr$cs*`gdVcEHY$?!CE6OL0u=SdfU7U83r0|uQa zEn8l~uv2Ew!o+kwR$xA0#aZ!~t8tDFB@7Wl0D3teC|HB?;D=-y73YuG9n~Dg{B~T1 z5>Vb6W*%{ZxZv8b9BeH<2t*$aVJRUpo}$J4EqMzz;Zgf?C$Y?o19q4KbX?*}ff^DDjETX2MYQ ze`kDRY#-4e$jdpsRkQGoE!107h1t=1gy|+6Y6>w|nY2M=XgA`01St3gt2V^3Gu;2~L zam=lYgBLDHdW3Z_#Pt2WyLU^;JOm~_Md0>@NLT^jaoDs`m|Es8D;fqTHe*H4{G-*} z1XG<0C%rHZjwPcRsB!~_WF{5QfoMITs9~7+ltF(3U74k2<;#=z70_%Pk1#~v0?*S) z|5~Wev!kTJRsY?Y3|ffos^cmuzBYaIRASuj?lwBQh`b(^OL7>=%Aulk!1A9V9d zZWWubKkId^>2=5I<<$OPzdno~wX(Gw28Eg@~JgoDE|P4|zlVOseXK7<6r zDz0s!_7{+lh+c|qPPADVY0%A*Q}M_#Ezu6x*fNMGl35b9^VVW$fXwECf>eUP54lo| zwRe8S?s*jJ@dQdyspKeZ91P8XbMLm7KUfZjD#Yfd-`G7I%_zG&0gTrH7abJg5@*98(>b-81^P_T``AB`#1+h*U);o)xQR zkC{@CP@KD^E|U-C%KzaO0vmPM2K)T7ygMsCyjJ6ebnz!S!T3nhOq z1sI6XDTUwWS3-Qp>#={$FFzmMr8)mEbV~6Z>!~$VoJ!DA=tU+Q0OAQ$JE^wNa^#S2N;XII00d^x`h%IH*U3da4)%FZ7IL_n*Mi<<)m}l7p%w>am%)c}N zRTD-AGnz?>?ZV}sEcx9+5y1p8K%f_LdF6qajF)hn)qm$h^uU+;Sc{n)@USLgp`G(Y zB$DQxQh?*`F?W*%nQ6cR33`Y^1tjE5sGa`|@kSJ=Bk*LS*8m1!cQ5d0>%wUw2dLn8 zE^9rRZ*Axz!4B?#35kZ2!*nYxJGB17!10Z$1yUjsaOVwlEgDd_W~C*X9UAdwGF_iH z$I#{2;?W^>Q>f&iU&ShN_A}u<9xjeq=rAwfj!)n)1@L^(Oc}-KS2PIovF& zCRg*y`DY-mPEaJeLHIW|VwPvchTVICWAlcghE$SMDLRJxB>|6PPyUM`Wg@|d5^9UH z9{6zfDLGjc3hr4LRe7OxfjcE<5|X(d$QY}0alBU<(XM%QKUT-7&M%tg4Vfj&spKt? z{Wz!K?j=;pte6Z!iWZ2n>r=M{oQdtX+f0Yyt-9znUqk6QViA%ZIFdIMRp^+jaR1%a zxv`@f06Kh-X$E+y^B?lHQFCDP>JFTE9EB#L3uyl+@y)`eM658#u?Xq&=yerDnv;=BFe8^Qreej%c~CY{(-x)3_U#SIsN z)jFhf@p5#DxN*U9L$WG3#tl=s_-_Ifu*4+C$GgMwGw1gps1z=v+lv2UtB=1}wi*X8 zm*ONP-b|%r6E$iXW?M)z$oQpn{@$OvZBof`dp5Xv4Q5>bb5@1bJc(tYzuLGy{pG^D z(`^*{_Y)ZS)pqWCg@IZ8XGFTto0DT9h;vC^-kfOB#9zW6zQ7n>I7eBOOC|zvp8f&w z+a*=Z6mcrxKLcZB z71=t!YB`y2gJpXdaJmBiGZK7|X>J0~}e%MozG{A`=v>%0qg$L@auyM(MV1u+4B+o(mCZ{67abonJWCCa!#H9il zfB{BbK~v^a!2vzp-Gc!$lczEIRf^Gv1Q^XPK3ND2B5Zs^j-~}7A@h`Xb@&MYkL#v> zfEI!BhV%(j$bre7^WiBT4V)WD{|As!;b0mffwB)LCf0R9=w>G(@9pyo+Zk6X2^mUCX)+Zm zb8|@~Q~a7pNJ(?+z3=bBd*1W@_g?RHz2|zb<2vVD&bC^8htKDE?&rSm=lP(dkw#!* z^uqY<+d${T265osmRGM}Z8>}P>`j$#uel-=nHDYB^QG|V9(vOV`UR{OShuk``hBFB z_Ny+Lh?#b;27e2OZuYoxwk@n4GTp0r{TVOHQ$G`003x=1U-5Wl*7GFp=i%R z0R&&t|4Q}yokT??jeuxEYgSow@ zIIjVbv=GMXym(Z?Z#f?d&>V3ZuZUyiKvDrg(38S)8WvsW|EL@Ey)<$ofKzGOO86n^ zNydD4_IsdM;sl!>3W{VKVRK2?^bIFv{2bP^kH9Mf0zACD0S@?Y39cgJjG_4J`||Vc z@wL$@ngFXU&@RztFla^fkK++AnY=n3E^ zFc|A0h@*jn2P@y2oGY`Bg3y8Pnj@T0hJP!)@+~187=eue!!i$li34mllw!k_bGmGVFko}2+5R}S`v4GSyZg4I&OQ%Nvwf1uC7 zuTT4zz#DXK1F}$9-jnq83;co*T4+y!NC*}dZ8uiO&s%`y7Pw3kY>8fp)4zWB zz;b*ewnhZd$M~^h=gC@2(%Fd{;0h-ZBd0SWChmyVJQR?wx7K~V6~D0*2;oCU!@>h( z4Z4;YRUxqk!(*G02NQA}_%J6_{pcqMMumz4FW8mbvuD_U4Am|D+fXn&fyX0j&+{Z8 zn9i4yn05j{lZtOm77Kk8FkwFg@AAI^9d_l?j{^HRFSF0B%=%RzvUsu+kEH?~@4DpB zw|J*IK1q8QXW6k^4m}Go$SEB028(beuq6=>YR!O{uX8>`2LiU+F5LmN5CgREKO09x znWslvjQ;ku12+7pjLK`@x&=bUG2|eamz+>uWdbVq?b~#_X7ShO|11Qc=J3KZUQJ8U z^h*K+q`H<)b&ROP6E#K88Ru5}P;oFQL33r?*PGn9in|i1Tnb{AeOYW29;Rl;DT3%oi$T!? zF@rkE*yk@kwOns{u@tFu?DOM8zh0im-I4PL9;cJ-FtnQ zbcpedLAPII?EGi+AmahEyUdHZm0SCvU%t!i!Yc~7elMD~Y)UD8YwfJJUG^{McV*kk zlqEZK)Xm-VwA}##s&^T*ujbUBJtOs|W3eqxN(i4r!06lAj!6jd7mO0k7ozTPyU~5H zs?O3^oKFW6=mV&EwO7jbDYVE9HZN7;XFE<7XYHHu{xHt%b4+$C!qL zQ1H|~cVb}Gar~=#;!G1zMh$3Ztbnq#7#nF=>l)!PWGr8?Bj4ui<@>)4vjEqE+B(u7Ac-ki0^Kgx_|34HH zc;Sc$<@5!#(&u&QIsCvs|MV!>DO}}=h$UTjZi5-zYPEw>?WL#db1J4G&U)uhe;Zp| zTzm+#4X!uUYev7f%{u{n?5H=qG5!IsU%KpO)Jd2~7?hb{)G3!j&`XkQgQ^s))1uQ;C zfR@KeFheKUp#4?9@NIi|!!Vt!0~QL|^2kDY@G7rOBVllSw&~so-TKTifnrEoe=MHy z?t=Q~F2eS;8M?N3Xde}6Z?!AGgso3?g4I(h_JkM54Feo}-ggXEH9r8kMDvdAl((_T zi_fENx~R_%P@C1)8uATK8fPMI9e;cNs@ksMZu1{mI363j&mEmJXHrwAV*}+WOnr6$ z$NT6B=7;v0<>?DB)7TwHOI5)NlTSC1>*eR44P-`CPSgFhw)a;<^|pJgb9Odx51(`L0A?F#8T(hJV0?9; z7&T5?u}@#@{p?`N^`TI^?9uGpa!1`K@$u(*29_Pt1>xuwXsAufQ5&jZH=jNQFStmN zcS79-70|M?4_6>7Mn9X_Y1A6(#;+-)iVs7)Xh2i>oSvQSW2QJdF zsFBW9`6o3sb>Y!zQzV`5Gz>v#t6fKlR`LMd*hOVH#_fQ(D-zHO^YrPsho@o!UmC=40tRd)kcV!a6idJUbn(Z;9kY1tVljiqZ( z??t~r=g0lYSSRBw9`An%5i?(}=~*D;+sb~v&9_X#M#q28(WEssHR7yw=i)wxu9>m< zwehwN^mVCYEbN}4vX4^~vr)$^U2@VN-Wo3p3~Gvik!>&9NoSQprwqrP+*MoSpOiiE zoN7q9&TIAC0FsNOELxG4KNz^1-TZBs>!AR()bR$*H~Q6c=yY3|%m?x1>8zk&$NQ=J z&Ylr=tNZy!z6%j!KuX*G{qhW_a1wE@Sl#~uW`(FV{{AU)Qi^+#M7c7p?R^g5mwQ9r z)at`)_Bs7+lAd6HU)grvd+jCk<9(5`RF2M5Ds*UBSLk=r=Z6!(JZhhP=FOY;&mCK* z(33`rcvP6*=>Kd>iM5KIU`Q-_izxA0^B&H%^o?#4nhBC%Dw4e(q7a#sWRfAg_1KM{ z4z8P~(As-bN9uBHHS5}rR;8?{MPZkUJ7_QvV-*$EtGqWTM4Nljo;^lweHv@RmMe2~ z)1aqjvL;!Dyq~i0M@20gp35e+gAfyNeU;KL*D#yL@c9PdPst#ir7M5pP%K4b+0`E_ z;x50Kczq?tT?t6z-U->#BvlU86NLVI!KacKn_N+nWseCi@VThvTpC|!7bW=q+~(-in0#Xa?1 zHdVN3ub&hYC%dFn22U6i;8_zLHE6pp1}RGhsdY5mQtF%x*Tc3!2v`_^H_4#&{{DI_ zv@^!zBcLWJSgg13c)q1X+`vB~}^$bWl=>uN}n z;D3lhu`OHjT==zh^R(7xB;=@F6-%%bm#+9cUgGh@DeBYv=QD7JINN9z`VQhh)s|`k zKj(5~+pP}YQNC}+`B6EOa{A7wJs<#_&gOdt4%onkdvu$gxi7V}49m{W9**E)=u-Aa z`QGF^gDl08^Qkp4k)Lg^R7edqFk4-m_0#Xe6IBi5c++b=@BhlHox13>Z+H;idEwI- z&+8awQ&5UsW1>1Jq&fM?x^tCMLp2G;*9BX;LUVIq94HE(*EZYB?P<|AG0U#>_Dc1o z;|FNKqVI)$Dnw%9KDf_yaaNE!Qj@YIt>fJW-*q4UTGd$};sjZX7VhCb&973h4>Zu~ zat%`rTQF!S90#9hNs`;Zv&j`sbDQjF< zgs-d<^j3?T-UoG`j{$v#YE-!IeU4w?jwCW^%Tw(Vt3YH><%<_D8a_|M3#~+GS!8ct z88uP{z>%r$+me&Z{qgiN&hxRQAdjoM9E9s;KUx@-(3e*l}MpeTpeX3r`uH5U^T?1R2`8>u~@Y$oP==YXCFJe z+fHkb(y?5d2JL`9a?Qv5E;jnKfB!uu2}^_-Ed{=nVfDqr+se==KGB6h*d4sLhV-c_Cc zb4KBnxz7DU;Ck&udf*~JrnOsbj%5)jMop51pD}PRvrROABKNPZwc-sS*(rF+%VZl} zr$WEg7zq9!|HBtGC?jOY7uWXqu&;ly-0|7QoMVSI{-}F76H-v<Zv(ZD zjhXe9hXvQm6rE!ait$pj>%aIs$InINhT6MG%E)5>t_09VoCUxi;we{mX0<3@%W{_j zStQ+srLs*Tg=C?=-%Y;FHMG}e6yi_{aTZKj*-t*ec)VE3mzZ;HobZVgUU;itVkPX( zvS-Od2t}TGH$4YbD0K*P4R-ezKABO?8}w;I{tX2%&o_{@`_Aw|$ZfgN&*uQ4Gj64< zy=rR6w;x#Y@PP7D#J-|*Um3wi%D?|nsfQ=A3WY{4>VXAokY_Qsod~ZY_3il_P#K1= z=0K`f{G#~0T#Dd+Kn!}s;{`5hCd_->81CqfSC;hhpCh%yYgy##>MGqIHhaU>cb6D@ zho#CF0Dk!O&k{)yUe~jYw-j`tdq2SA!=t*>$*O>d52_;cxtzc9?|+bxBTgF1x3vDe z9R)V?r7q^n(N^I|3NSbiFmLzMhcW{+1FqfkvwVve z6oRe1Zo1rBn=iKS%({%bUv%a1OLwRrl(SZ`?bz?l$cqQyv`86cBqvN%d*W?aZMrkC z6k~mpfOo5bVskM0^7(-%xoJ80V2@R!qs>*T0NnGs54Jk++~et_verkJ-S8mn@ir8! z<;%FPJ6=8RdTPaixqT&&k&%G72oc_@E~j_6dOTjeYdB6^N_ltbsm6vE*LJGP_uBZS zC(Ts{4Qq|i*4Flf9f{e-5t}@6)=A^>VxeP`;S0HRA%r^6yB8Ey%Ae0m{4NQoj-!i%?!Q}n|Ii0xgPkkzoPfLSwMrD z8((Jh!HE)>r!)IK782$;s`8KzEH4Ha7QiT8EszT|QLx=rliOd?>J{~D%$K2{b4TE* zDxBLd58OVlfjRrhtOX8L{=*L6{@QwM<(Exgyid z(lrPS&W!D~iNCK2mamBR@ZWk5!93f%XV`f|^}YV!cBv>ghQNu+1SO^e4z^eTZ@1#P zg~D$@)YG#01LdxUS92ZjgBCsDM%B%r#&9<0^3OnUm?IH4%219CvkS4U@sQ1X^{Xt)D43Di_WQ zw#+C*af=9w|6w7L^77B#NvIsF{vNY06K$o2dh)I17gXTZdq`(Xfv*EJAk_bBlJMy$ zbJa8F&#Q4~`XHW00s8B{i3oHnvECY)n!3$1Nd72Pd*;OToGaz96S4|!s3oc}Ry~V@ z4Y9BtFx1r|!DcoO{(|Co28HIEvUFeGPNju>c_r*oE%7_K5=afbrQvwZ`dmergc^$V zU4`R87D#h(g!|l`efXsd+RW$3cbl12&c&>Tq6_PvPwzQmv+;V+67495vUe*VKa46N zq*c3k>P`fJa}9epc#Q!V%tl&OOqK7vmzr2931=ZNR*=KP`7H;DS(pUCTv_xQ#%=%XN9VdrFl|g%LZ6In0Wq^b{RDee;H(b|7OjxldL~bBy4ikwO0eiNP#NSmpTlb@+rAN_B1?LJj2y9Nbb0i z1>?IgfX5S4@k}4-W43T6xQbBQ#KUA)N&m8kMNC&b;^{SzZOox5zz1%bqjuRH!>9T_ z6mnojdQ?_JuYaR{$b`5aDsH*I-)C8`!Gju;!#h-if`SM~RzU*XsrHkw5f*&cN9Awi zim8$!%=#kVY&e3mRY`tGq@*j&U4;+UNxJT=Je!)@>b~C_ek7?FMoUgIGuUE<6PcxA zc!;tgjmna{etDopJ67v9qp%NyFBa3ybXnO$sXXd>sdU`$!#Dkk=9{$J&0l#z$VMRr zGd)Ty{M)vwWwy|2aZM(Ob0R_zpF*J`UmF z%&D8-p*C(#iaC3BKC~%Cgbcr=yl?{pz`(uMcYE0fnVMOs-5WSrbqsXN()Cy0@f;Rb zQmjPrx`J>do-)4?{F1u4;MFloryx_aFggLKO|Sd$qr@k;P)c%zTtthVg@+ z$DcGcGwb!`EB5J|DBM%Ot#B5(n8dBr4$5R?6OXW6q3DEZE#QKIDMD6Wb}m`3yG))} zWXJtZb}=0HzuzDZ)E3F_-5~g+&>Kek6NM{$QrQbLk!6uw>9@8_;UEO`0$i zWgWVpqVL=l7XGX?KjIyI0Lpb-A3oF5Eq_}19x=q5MSNd(E`3P2)%Oi}U1`OB-}W`o zEiT`lLTe+D%W3RF;2D@mIZqlsHSUrvvc$!WH| zF)@j~o0GtJ=ONI9QQ28~kH&F+X&T66^(}2!alxzF|2-HP)V&@a!RoW8_pPwa#o6>h z@G4d3#L6|k=FwbI3>wg7CKl*5ajb_FX6#?^bSY6%GjV}*)>1V!Jrs%Et7=nP!?6!` zIg>8uvec*gfLCs@<)LXZ6pZQpFQ^p1QU6 z(1WHYR})#qrHQ}mld$Jn{rlpXO`k2P-{8-z9SOh6P20vgUwU-@`!9Gd|8*b2rI@>F zenw4?*X*x^#GemFI}8Fs1bt$tLEJ(8*gti>>{?sT*DGr71sr#Rft}P-!1bx%%1Ho{ z#Bhf?%{c5DQ6v9sO!BWqyHu&7D&s}$y4BGEnP2~N-LnZ<^l{2OO!j=(qe$J4zrqpTYI&% z0vADv!S<<&ii)A(7@mYm?n?36Z^DKB2q^j<2|+9Y97+apIcZBS?F}e!XGk<`Z~xun zoPzMd8eR@akwr<9e{EKUFMoxLymr@$;8WX=c|h8z78grFm{e-s!@M+Ii3SWWl%?N1 zPAqqei!)bM``iT35OHdbeo(}PJr8$|m=T#|ytZPUNTmO~_1xBlkU69gmo8m8cy6`* z%N3X;Y;omLhf8D07I38g_J3F-TmFlksgWh;;x0XL-1n~Va9b0kTowl3p2k>eQU2j>5+lwA)_mD!{tS z>yOF7%sy`jHc~MNvX$=@j?0m4AYbN4y=|Cj4}4ZIe0kYV-qg8Yj1~Sp<7fUm+#}jq zH;48D+hS337$lMoXwc8L<-$i!jN*&KOW5EP8bQt_8k)Duc5uI)b-N725;F_?pjw=A ztgv#7aACOn$?TTh@AC;$c4_HA`RfQs;t3dnrs>0EKZojV+bk8zb+9u}|CSHUs53Pk zKPceNU9~^QvPeily>GCk4G--Y%8$4%DgqAi+mFk!q1S^f0g34r^qv>tTc~aA8sT9M zSo`2{rEu+a1HVt2S_ZDA`s|;0kU2b4A8V{MPtcx5T{NR3q-*R$TnX7ltjy#?@q1181Fra$`m9n zDXKh_0n=yHCd}<@@|8`ci$D|W=B^s7U}>Az1A@9h)&`ZiT?(Z;@t{iA<^s%qc&Ty* z-Oajn8QlWKFgGX_!A-%6!4o#16<)m~&r>yzy zIEsxP=X=?-oP{na^4qD6`fR4Gy&)Q49=k9ZMgaa+-I}wflb|r`czEI|n8d`zEjnpz z9vg1~>lRpa*HzHyabD(GvT+PGU}J}!v+}dYDNCYeDL!sp(?+R_6cTDZRr7>jz_G1A zf2}^-5iwniRiv6KD0J8_^*C}t^V zge>$D?x_&qf zJuiD2%$Id`xI-GM1hK2qsB;d~pp^G2kpig)oiFKP=75Ree(Jkh-;^{?oyg*jCMZl= z2J7c=daq74YZsS<8$ASl9p)QS<>Y-^s=|_=uD=?Ix?^wq1lY*$n1bP5zWnm9(;!AJ zH8s8XIQB0t5(#&36fRpL)qZ3?2JZSi@}4*|IRf_2=yT^94)jYXs*fKm@{$xArKdpx zb%P>YxxK7yB~^idyWCyutQRXeRBAgX%%27-OBJz9hX<8>=&M0rZlfo6vNQEj7~929*cL z2;U{RO^FmVd)3vl4l17%;O$XxN`yX!uK$o=hcQIKa%P4GLX2OKmG}5MWJ(J1d8n@3 znCc;Y&|gNyBKGS0R1`LiKX;jf`Z)=UY@CFv40Yt08<<$_7c@K3JQw2l0bqt1)F^N^ z@evp=XJp;e8+7TJTaGv@Kt1iSQpfAx-#|;pvE*SGw_uM6g%T+q>`a`U0F|>*afFTi zXyJM~isoN_=4QyAWq9|habkrLgzS(j7ST$U%sQ4XiSsaLBuv}_zfaojk8i_%>xRXO z1Zw?8G4=fU^@*;?nKRyBS+jWN$J=6o1O|ICP7)nbO3M%pY}ig_9Ib=!JP8KTd|;Ol zT;()L5q8%yQ`1W526;fpf>Ut|Z{T>jLwk9$FQZ%xcN35Ozp z5zjmg=Hdf4tvcdugE{moL8?Q^o<*)3Ps$#axB`s+*MtwmWD@u_^Uq4SJH=9x4q0PE zD&S>YY5Nr7qFddKp4G_F`Pg)g&@X7cYXKd991Wc_)vtdtQA??i#^N2(6qm$u9tO7p zkYWenK~<5|=WX!OWcuMQeRXS>BW{av7Q_XfqKT!YbJgSolZgZFM2He@QvT_Lc3g?= zvp}i^omt8I(-NmP8tR5`%;;jVX0NtXOs^@QIv-(K=jY4r@GW^)eSBL}GbpUy`a?wE z;%tQGtB<$S{J9ULl!@kAJV6al_=Fn}5!8_IIL(%PCVf<)V0ReV39qqffNiq@f5V_- zL+<9gM20qSN4~DaJuCt*+7M;XF#+dR&Dl4zKGP-f&Y%=hvuKVIXMtA<;m$_zAgjf- z2`^72gu=BI8$>SyG(lV_W<}*q9s+8XK3jTt8Imu9jH6e9X@<5EB6wO|Nv+TxAd%wD zO(!zLi8JBoHW1Vb{LatOv*&bdMoL_*=yi;DE3XqDUj(Mzz-ldq4JwMP+$LRqra{1qe%WKFiVn@$jb3+qa%4!lVPfWc!>O}KU(+wkbu#t&=B39GYR2YU z!{>$>h0nnIr@*JzfVW28+i*{R#EOI@Vxd!;>Xl_H4Z5wyQj|z<^_`*0dJ)n-);0VG zLCopdD)G6rbpfA6UHE|Rs^Dqwf#f>q0%j0oWeC@zF4B4qVyIL#?bkQ7{;8b5G8!u2 zPii6+J#@8Y_^w5(Ty$*gLKyTGI47#bbY7q5*v|_59>o{OU>S zuYd4X$MGK?0Ky9lKBrR>h4IdC>g=qW!!S0ZipNv&^gkvqt8H&0Y1ry~o8GB{#qZl! z?^7XxH8&Wy3cAZRU^~d64Q=@5!r4w3f78u-DIP>S;%KDt_(Mm=(&GbXj?>di?|wE6 ze6;HK5@$#tQvVyb;9Z~zq!Lakf>9hxy6saYDQ&jhCzeD1K+ppw7+2Qzq6zUT49et* z&HW~0>C*ESkhk(YZXCzYN$sL>46{mq*`Hl91~0>+CDI;jwQ=?(c+;$)GZtX(yGt;@^c&(4dq6#*AuxE-*iAgs{X70;!Ly)m`wMO z*5Zb^vNrfMgb@$(_t0iZpGBy)vl*PAN5lea0r0oowwK6HeQ&GtN7BQvb>`t^GF}mI zu{5NsMXaAKPanuJa5l3KB0f@HFEc2y~g61 z$as-;wvg?ymhz+Yi^o`r%se^=cJq_X!Ukia2Ux8RTE0?(VPJ+&Yc^O>+xKlRSJH*O zhU~yI3@0viiaO?o5N;1E>!jx=5OXWQUgy)i0xZYQihSk{Z1#xFxe&;v(R+kf9Uqjx z1dg_;ODX4$+BIB?Zssb`Bzd&pb2P{WEfY-Vs3$$nWpm4C36{j3Nv(5z0oEA*=on3@ zi8&`#?K7NS2%rvocy?MI#`^@pE~`%I;rJRtBc@!0^+}gDzfo3tEg7V5vn<`K2>msK z-v$M%9-Vz3A0h~#(;*pljB0{sOk{i{D(f+;ys%=ZNIwdjOqr+JAQxOIO5$mtbLb~` z01$0~?e!4!#I3vElz?HfCX;1(#g*`cst)UQc(JMB^3=fIYH9EMU& zs1S>#{-f?L`F%vt2cM>^!Za)Ysp@b~L{5iuk(yFu@iaAyKLWLV+MCe}qfWaIwoV|d z`P!LVyNg5$_6XG$SZ56oEXK$>%4Emzla;WBECQHs;A4Tck`{ipQiONZI?_2nIEOF< zS7JM|!Um`4({uakithpQ*!KH`f>=%G!As<KK`+l@-O59Z(fF^r z@2`~Cmn+Hs*zHbd0{S~vu1{;J5=-b#A_oWHtRDA+CAO_N^2bpU)Gmqi1i%fOmTZ3I zHzTvYT~^Y2J|&Xi5rBmzNqwbL_nvo(a3wU5JLaSLcRz<)h?;T@ZZxB>Sl z8R%0_Q@ir=PjT-Morwc_1vHu%N>O4}AQ2W|ys10XHFn^16u0uZEm`s^b$GLhrQ6B1 zq7xCgHAxYQXZl{bd12A8c=Cb+ZQ$qx=aOmU+xmdzc4S9QxEuEG^&*%P`6}_2Er9L< zRj)Z&EJHm^2G1TyWs#J{XXcc9!vmo|RbwF4#Jt7koA2JDC8+=6X``s~qQQLm^x!Zk zbZND;2~rIL4c!)$ZvOmPkP! z%?PpfuwYXY@|x;TYBQk&GJR=c!PO#}y(x(=b9{99^~D((Awj_9`g6TE>_G0F$gKq} zTLY#nB%d={Rh-Yo{u*qNF~B%mkTI-N*(M~B5=+Aszx5Ng_*jXP=jn>_ae2gQ*iVPW zLKfue6}07|+P`op8`fYI*cIWm@b7-z`kK3Vn+ptm>ijMRE!Y3j;<}HYa*bWRh?3zPQli=`sQEPP>6d1y9jQ5Foc_# zp_xEivW$F^ZmT-@#g7Id(>|;*=jV6Gr$|Ar7^Y!<IsSirH1vOnb zvc;cQRzGk(C?4R3|)^xocnqwZ|NSR;w5Su$=QOp)3 ztes!TM+%_KK00=;T?5-4xrq%uxVJztxx&GgqoYv@!Z*^mRzRpw}1M*VsLu%yp>)b@5G|&5Dfg`C?uHf-P%!n+T6K- z($N7=+E9wKz9-P(WxKFLbteK;s@B^k5c3P`H*H7;)mnill*ed_W{-#q*C^yZKtC{} zyC?jPj5gEYTm3uujHovbLa>>jU%Idb!=a6!#u7`>^?|ycep|zGyz4LwCXK)l9Byo< zCyl4N+}R2-blI|H{FEoMvnGJt*nCUh(@FRdHqYgeVL{a&1rkdu?<(s<^r_Lq#U(tx zJG^3brpb?1INJk0&PO35)S~n#*MDsEs{g3E6I*C9pz0!GVZfDN;C6D6`uF>8V89(r zLz}?7Cv^C5cM#+Y_9{xo0M5ERb_Db=65=N_QL_Qs*8L*S_Ur!Dl@^Mz#9;cuCtZ3x znv4z_ej`~C&;(P22PN(uWk>$m6JmxNd?*zR!5z)35Q1T`CX-P>4VVr;(vaIe*QPx7 ze7k|BQ#R(aCP7a{0R~?jz$NfG0fx9_Yyhhk9M{?-myr70Ih97ew$Z4>ld=08kuvj0 zUSNXGOoWt`|2~X10W73acn>++6c*d#S?J(7j4k7p=#YzlWooZ9dixNPJn-TB{vz{C zu!!crcJ%p^4iyB0Oj(<+Or4H06mW4fKNZfUYp)*fXRKr;(A*t|DX~Cyp!SWJD`?Gt z6Wl1NZui;NVZnG9I$1aErN8YTc?^h7{o=lP8~)~F!#SPycrt^C(~GddRXU7U`Ch;J zddmiD>*v+ef4ko5+{C$F^ekdakyB!^=Raq4bn+0IS6K#f2pn$s^6kg-oGq6@-tisq z7y8FqLVgkrT7sO6qE6`GK#`w}I9&m!LJkHj(3D&aT$K&$O_-PfpZO4l)5QxiwxNPC z8z)h_{;5bT!Sf*lf|rJoI`-k-pCwX00$AApT^$2=hM7a7=D;r`H|VWNG}*b6H(*J@ z9*BmX?X5N^eRAoE5+9;n)qxK8$3%X+^n$~D_2DXa?&J~a!VLLIZJ8D4(+_|uF zfNe4%(`u`&`1#&8T*1g)gD#q2g8D+xX%$?f~5 z*PN|vP3e+Wi{}1>zk#Bw!LlrtdI4If>UB4b2M#zFo3w!VhMi-yCi4B$S&?ft4`+FA;3F(bYE5vg4V~fP z!YD$b$1}@*!%?AWhKoz?DXa32de7FO>g;Q&|IPcusax; zI*!l+71c_`2e8e3dRwB7Wg$dch9v~!06o2nV9vC1ci}BnMtosE>w#O8E$UlaP*%^E z4&VB06CW>b2i+$}a6U5N89Nqq-(7f6kEUp`#k8EQ0zp5*V#K z^NV?$Tt=}KrOVQ72dW=noprhkQGy{+!q#&~)S`yhM@9GR#Yia@XeF@9A;(Xx!%tm$ zY#TtLQX&QHQ_s5RoYfUt6{?Z-yL;qf%H0|esT&x;7UFTeX-$CuL$Z>R4S{&pJ%i>l zHl0HSbFWRjSA_-_9{kAK82D-=Isjcvod@zS>Hv527hSI!E`S2G=O^60(i&Z?p4My|{qY%3{=q^`9binR2~(5YxP^)o zU@M8;gX{=~+OXsXFni?C?~s5TfzkGI#sCO6Bb2`2vzH&a(T0LytV9RBJOsg9-%RNhba9QvTb$Ir&m_xBx$u=eGG|Y1XB?Fm;GR;n z*cj?%2A}a6_ntBlTieirL}ws5HbP=X2(saPc38sW{d*&#OIVKrLck1`pM@14NHxx) zc~<@p%109(che)~honOGffqJB?fX|xUg#rg)WkLT*~Ai5f85pP-A12qCO5$(<0XfaD5c% zLD?cHzMDv;#}YM>>K(Y>h5l}Ii5k+wj|$KMWmgu6)dS@6Hu$z#QqAF}K|IX^XbHh9 zZ2#Q|9>-a8&u&PvlHHQgF9=tJ9qvL_{I-UgJn zf6Ei8j7KG;IuGDt@$@$lWO`636wt5?LNyAqgrNCE0Q<18mx?hL!eI@k`-EGbG@g$) z3M21vN`Np-Z{Uamp>}!{_w?uTGMJRHD0HbeV@7v)nXI#kUPNgGs~sRu?tZ!~346#I zA|W84sY#?P>{y7hG$u#WbNI$tm~<0_Yp13Zkhhq=UpEeT0FIPkUnPOmoSGZbHDfTv zI-~nw2it2M4RR2JkFqC^PYch24iL6Nli*Uk`YYF_lBfYW5=1)ykR95@J#keUD3Xo>*0A}FV$GL! z5$1Wee&9_zf=*{Mbv@~ig+1+mS(yLf4T5b>s>fmO&1K=Hj z00w4u(O#~2rJxsz;$1EA1KA)`Hl1xV{l9X zx@s(1|K$tZmq&v&rpXHAiBElCxay_QJfkUKa3M97Z> z+%VKSbpFFVxFsf7iOePD!Z<6NvCF^%gLfu@#~cN2^JDZHSYqf6Fu6kXWQDq&N{>58 z{V3>dDBVK!y|;}-2Rb5U+=UN_6043_Pezs?>4kp|@bA+YA0Y37rQQX-E{C))f~LAz zPSKnLt;hTR+1)P)$5`W;$ghFyCdMQ)V25Y zc$qUVgX<$f8r`oa5g6EC!aHG>5U9nmchf+5vuKy9TD?CD2L(2DK%OEjU2gzg>E9Mh z7;^78jEqgrpH6T2F^(0&ZlepPz9C#T6CHw{^hK0)yx*!@n{bQHB~Dj(gZDzB2QnAO zF+jNZQA6bQgZvyxv!6k$(Uqn;+#HhsKD6_qtFr*-H%e24Nf(&CDn3&lv;qfJ- z>G*Pv&4Ev*8gbM-*7qiRu2*%`EN3qaS~7rSy;2+)ki+E9{&9i=Q8iAxhJ zP5l!O=T>?xpN`6I08=^wF!PUM^cPOk?q$ZmfEquf8*m(lbbrY2G05-yjbe(*fp)t~ zziaFm!1^9K4Zavhf)*v#xB|vd8Wx@n9UH_pe0aLAPwZf$Dc>+#6pq-v%H1udDhb0! z+RU`RB1H?Dj`1g>=%HMM=0k$u1Go?d0$7KA@=|C>qd37KnZqOy!t$Z69V58K8Zcso zBF0{c?CitHO;`pk02358C5HZp&1>j3Fh*3VhOv3*+;)t;LLP(t5+O|00L> zg)wST{m0zDVcJ02RnNNVM}a7(C9La-DTi>Q$?Wd13wjCh3B8}hCcFgWhXF3X}1h#6KFxJS!vA5cN4k8r-9rXZ(l z*e&n?34@Xz>!B*7r7QrmK(A}deip6LM zz(EG;9Cc^_Me=OEoCgOTHDMv0bfI`|2+acE(!i(&V zaA*%znUkStxbmrKc@G*(ctE5qoSg&3WI*;ormaO$ZtuHF6lG*@=&#vJL`KX+||rE4)7;(0bBGNKA=>F7-jMO}A`EuezAv&od%lgbsS z1&6qcj}{0P7Z5W`IbVjg3OBwxO1}tf24*X%zd|VdaJT8ZWC%v2GLA_}dok}FvOUFu z1`JV)!15N_k}-dvBWjhBNaY84X3%&95D9u}4C^cM*sP9AfoTW#?oTb3ug(+W;vN7~ zvKC}kdW2k1w26=yExNjtrchtgO&~T@7+f;~N;pk|4HzcofC*fs;5C=ZCylY1#q?1h zp!YOB?;He_V7t|a@53>|Qa!RkecQfB0ML`Ss61gW*dcVZ6r@iRnN5UU5gX0CFQn`1 z0_tVnt5ZRn4(G9;C`DIP{n7$& zG%P#7Fr|E|t|h}Q5&8k! zqB&feU0nE?aS|$%CRYl1PvCjT(^6i?1vwO+m`%Gqjjx!Uq)1Xj?kSY$Yr+jm8B?;L z+WJXDBrzE3p(MCXBJrLZB_kS5`z}x-h3!U# zh7{a+i1VybN`Wl`#jLxyq{Y2=`~!`^4y!C1wQxg$Z>MI~%@+#c4)B7&zXkN1P4Xag z3*6NRGVM=ab`=eRvclJ}_-mUZwoeNTEJ6HT6vUb8XdMmEHhKZkMCjV1^hD0+8UEK3 zGjRgNtk*ALqlzcw`IxU*^LiV0cFUv7X+dHNt)#gNVjt}3E=v1ezD(WV1=Ijmr3nm0 z=VE$QDaimp8YNBs{;X_MI$$2g(`T{wTRhaj$BVV9m@_1jvF7;@i80t&AP(0HSd9#s zgMD!nBM%Ko-5*!#?-$Q1k+1avn0I@;^uF-)~aLSPTBxC%Z@5O#}d%f zCw0LPCcb7VC7ea|rC{)MT#wK^H54dQqhqGX*eHWfEnzt5Hs*998>t-{8Mfb)~8)w2K+1_Z&gRQls2)< z6lbxImtI4pUyz*vd(Va6DTKf)&cax!Wr}o0U~WR}g?Fa{)K<8J8=c;yDa!eRRdspV z%4bMw+~)Yhu0W}3?bQS=6pbs%NdoXXfEkHw!fb7;73-Z4Hc-?a>5(VWQWT!ttZuI{ zPlSUg#97o@P%e1a)cy$_!jboi><8}$HoR;nYg`l->?7sCHVPUFrurh)*}`)w6!B0= zAR0%mO_b?`?9kb-Ubqh5ChUiZ&y?;0#R%5coW+B6wCpu%1klu%!Jz zsG@Ao1x&__vb!!^7EC#noJ};hi{HQ_GDDUQS| + + + + + + + 2026-05-10T16:24:20.591445 + image/svg+xml + + + Matplotlib v3.6.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/thesis/figures/benchmark/throughput.png b/documentation/thesis/figures/benchmark/throughput.png new file mode 100644 index 0000000000000000000000000000000000000000..6b4eab6315bb11f1f50fc0ecd8664882c00a89e9 GIT binary patch literal 61219 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 AEdT%j literal 0 HcmV?d00001 diff --git a/documentation/thesis/figures/benchmark/throughput.svg b/documentation/thesis/figures/benchmark/throughput.svg new file mode 100644 index 0000000..245f25d --- /dev/null +++ b/documentation/thesis/figures/benchmark/throughput.svg @@ -0,0 +1,1181 @@ + + + + + + + + 2026-05-10T16:24:19.890077 + image/svg+xml + + + Matplotlib v3.6.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/thesis/figures/benchmark/udp_jitter_loss.png b/documentation/thesis/figures/benchmark/udp_jitter_loss.png new file mode 100644 index 0000000000000000000000000000000000000000..41a944c61f41018052595934e435e8c821f8a4dd GIT binary patch literal 66764 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 a+}^DnbunX5-gsZNPbhk_K5|!tan(P>r&{U& literal 0 HcmV?d00001 diff --git a/documentation/thesis/figures/benchmark/udp_jitter_loss.svg b/documentation/thesis/figures/benchmark/udp_jitter_loss.svg new file mode 100644 index 0000000..99c0066 --- /dev/null +++ b/documentation/thesis/figures/benchmark/udp_jitter_loss.svg @@ -0,0 +1,1231 @@ + + + + + + + + 2026-05-10T16:24:20.337455 + image/svg+xml + + + Matplotlib v3.6.3, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/thesis/notes/style_baseline_bachelor_thesis.md b/documentation/thesis/notes/style_baseline_bachelor_thesis.md new file mode 100644 index 0000000..34ecd87 --- /dev/null +++ b/documentation/thesis/notes/style_baseline_bachelor_thesis.md @@ -0,0 +1,136 @@ +# Bachelor Thesis Style Baseline + +Source: Marcus Jan Almert, "An Investigation of the Security of Smart Doorbells", bachelor's thesis, 2022. + +Use this note as the baseline when drafting or revising the master's thesis. The goal is not to copy sentences from the bachelor's thesis, but to preserve its academic voice, explanatory rhythm, and technical clarity. + +## Overall Voice + +- Formal, technical, and objective. +- Prefer an impersonal academic perspective: "this thesis", "the present thesis", "the analysis", "the developed system". +- Avoid first-person singular. First-person plural is rare and should only be used when the surrounding section genuinely calls for it. +- Use present tense for general concepts, protocols, system properties, and chapter purpose. +- Use past tense for performed experiments, observations, implementations, and measurements. +- Use cautious language when evidence is partial: "could", "may", "potentially", "was not proven", "was observed". + +## Chapter and Section Openings + +The bachelor's thesis often starts chapters with a short roadmap: + +- State what the chapter or section explains. +- Then list the sequence of topics with "First", "Next", "Then", "Lastly", or "Thereafter". +- Keep the opening practical and close to the technical purpose of the chapter. + +Preferred pattern: + +> The following chapter explains essential concepts used in this thesis. First, ..., Next, ..., Lastly, ... + +For the master's thesis, prefer this direct roadmap style over broader phrases such as "foundational concepts underlying the research". + +## Paragraph Rhythm + +- Begin paragraphs with a clear topic sentence. +- Follow with mechanism, implementation detail, or evidence. +- End with consequence, relevance, or transition to the next point. +- Background paragraphs are medium length and explanatory. +- Analysis and evaluation paragraphs are more compact and evidence-driven. +- Use lists only when they make capabilities, attack effects, requirements, or result categories easier to scan. + +## Common Transitions + +Useful connective phrases matching the bachelor's thesis style: + +- "For this purpose, ..." +- "Using this setup, ..." +- "As described in Section ..." +- "In the following section, ..." +- "Furthermore, ..." +- "Additionally, ..." +- "However, ..." +- "In contrast, ..." +- "Consequently, ..." +- "Therefore, ..." +- "Lastly, ..." +- "This allows ..." +- "This is evidenced by ..." +- "An example of ... is shown in ..." +- "Similar to ..." + +Use these naturally; do not over-stack them in every paragraph. + +## Technical Explanation Style + +- Define a concept before relying on it later. +- Introduce acronyms on first use, then use the acronym consistently. +- In LaTeX, introduce acronyms with the `acronym` package using `\ac{...}` or `\acp{...}`. Do not write acronym short forms manually in running text when an acronym entry exists. +- Write tool names, command names, kernel symbols, hook names, protocol constants, and code-level identifiers in `\texttt{...}`. This includes names such as `\texttt{nftables}`, `\texttt{tc}`, `\texttt{sk_buff}`, and `\texttt{AF_PACKET}`. Acronym short forms such as `NFQUEUE` should still be produced with `\ac{NFQUEUE}`, because the thesis settings render acronym short forms in typewriter font automatically. +- Prefer exact technical nouns over stylistic synonym changes. +- When explaining protocols or implementation paths, move from general role to concrete fields, functions, tools, or messages. +- Use listings, tables, and figures to make protocol messages, APIs, measurements, and system paths concrete. +- Mention tool names and versions when they matter for reproducibility. + +## Evidence and Claim Strength + +- Tie claims to observations, measurements, listings, figures, tables, or cited sources. +- Avoid unsupported adjectives such as "robust", "novel", "seamless", or "powerful" unless the section proves them. +- Distinguish clearly between demonstrated findings and plausible implications. +- For security-related statements, state the adversary capability or system assumption before the impact. + +## Citation Style + +- Use numeric citation style through LaTeX references. +- Place citations near the factual claim they support. +- Standards, protocol details, and external tool behavior should be cited. +- Implementation descriptions and own measurements usually do not need external citations, but should reference the relevant listing, figure, table, or section. + +## Analysis Section Pattern + +The bachelor's thesis uses a repeatable analysis rhythm: + +1. Introduce the investigated object, version, setup, or scope. +2. Describe the observed behavior. +3. Explain the technical mechanism. +4. Demonstrate the issue or result with concrete evidence. +5. State the impact or relevance. +6. If appropriate, compare to earlier sections. + +For the master's thesis, this maps well to platform features and evaluation sections: + +1. Introduce the component or measurement scenario. +2. Describe where it sits in the packet path or application architecture. +3. Explain how it was implemented or measured. +4. Show the relevant data, interface, figure, or listing. +5. State what this means for correctness, timing, usability, or security analysis. + +## Summary and Future Work Pattern + +The conclusion style is concise and retrospective: + +- Restate the thesis goal. +- Summarize the method. +- Summarize the main findings or contributions. +- Name limitations or unresolved questions. +- Present future work as concrete continuation paths. + +Prefer "A future work possibility would be ..." or "Another future work possibility would be ..." when matching the older style, but use it sparingly to avoid repetition. + +## Phrases to Prefer + +- "The goal of this thesis was ..." +- "To achieve this, ..." +- "The analysis considered ..." +- "It was shown that ..." +- "It was discovered that ..." +- "The following section focuses on ..." +- "For the present thesis, ..." +- "This is particularly important because ..." +- "In preparation for ..." +- "The captured data was then examined for ..." + +## Phrases to Avoid or Reduce + +- Marketing-style claims: "seamless", "cutting-edge", "state-of-the-art" unless cited and justified. +- Overly abstract openings: "This chapter establishes the theoretical foundation for ..." +- Personal narration: "I implemented", "we wanted to". +- Unqualified certainty for uncertain findings: use cautious modality where appropriate. +- Long rhetorical motivation before the technical problem is clear. diff --git a/tools/plot_benchmark_results.py b/tools/plot_benchmark_results.py new file mode 100755 index 0000000..253080a --- /dev/null +++ b/tools/plot_benchmark_results.py @@ -0,0 +1,549 @@ +#!/usr/bin/env python3 +"""Create thesis-ready plots from network_timing_benchmark.py results. + +The script reads one or more benchmark result directories containing +`summary.json`, extracts the most relevant metrics, writes CSV files for +checking, and exports publication-friendly figures. +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +from pathlib import Path +from typing import Any + + +def import_plotting_stack() -> tuple[Any, Any, Any]: + try: + import matplotlib.pyplot as plt + import pandas as pd + import seaborn as sns + except ModuleNotFoundError as exc: + missing = exc.name or "plotting dependency" + print( + f"Missing Python package: {missing}\n\n" + "Install the plotting dependencies with:\n" + " python3 -m pip install pandas matplotlib seaborn\n\n" + "On Ubuntu with apt packages, this usually also works:\n" + " sudo apt install python3-pandas python3-matplotlib python3-seaborn", + file=sys.stderr, + ) + raise SystemExit(2) from exc + return pd, plt, sns + + +def safe_name(value: str) -> str: + return re.sub(r"[^A-Za-z0-9_.-]+", "_", value).strip("_") or "plot" + + +def find_summary_files(input_paths: list[Path]) -> list[Path]: + files: list[Path] = [] + for path in input_paths: + if path.is_file() and path.name == "summary.json": + files.append(path) + elif path.is_dir(): + files.extend(path.rglob("summary.json")) + return sorted(set(files)) + + +def infer_setup_name(summary_path: Path, payload: dict[str, Any]) -> str: + label = str(payload.get("label") or "").strip() + if label: + return label + + folder = summary_path.parent.name + match = re.match(r"^\d{8}-\d{6}-(?P