<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<title type="text">Ostinato Traffic Generator for Network Engineers</title>
<generator uri="https://github.com/jekyll/jekyll">Jekyll</generator>
<link rel="self" type="application/atom+xml" href="https://ostinato.org/feed.xml" />
<link rel="alternate" type="text/html" href="https://ostinato.org" />
<updated>2026-04-14T05:24:06+00:00</updated>
<id>https://ostinato.org/</id>
<author>
  <name>Ostinato</name>
  <uri>https://ostinato.org/</uri>
  
</author>


<entry>
  <title type="html"><![CDATA[Data Rate vs Line Rate]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/data-rate-vs-line-rate" />
  <id>https://ostinato.org/guides/data-rate-vs-line-rate</id>
  <published>2026-04-14T00:00:00+00:00</published>
  <updated>2026-04-14T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;To understand the difference between data rate and line rate, we need to first look at the Ethernet frame format.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This guide will explain in context of Ethernet frames, but the same principles apply to other link layer protocols.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;ethernet-frame-format&quot;&gt;Ethernet Frame Format&lt;/h2&gt;

&lt;p&gt;This is the Ethernet frame format that we are all familiar with:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;+=========+=========+=========+===============+=========+
|   DMAC  |   SMAC  |   Type  |    Payload    |   FCS   |
| 6 bytes | 6 bytes | 2 bytes | 46-1500 bytes | 4 bytes |
+=========+=========+=========+===============+=========+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When this frame is carried on the Ethernet link, additional fields are added to the frame.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;+=========+=========+=========+===============+=========+
|   DMAC  |   SMAC  |   Type  |    Payload    |   FCS   |
| 6 bytes | 6 bytes | 2 bytes | 46-1500 bytes | 4 bytes |
+=========+=========+=========+===============+=========+
 \                                                     /
  \                                                   /
   +--------------+                    +-------------+
                   \                  /
+==========+========+================+=================+
| Preamble |   SFD  | Ethernet Frame | Inter-Frame Gap |
|  7 bytes | 1 byte |  64-1518 bytes |    12 bytes     |
+==========+========+================+=================+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This adds 20 bytes of overhead per Ethernet frame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When we talk about Ethernet frame sizes, we always talk about the frame size including FCS but without this overhead.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ostinato also uses this frame size definition when configuring the stream’s frame size.&lt;/p&gt;

&lt;p&gt;The rest of this guide will also mean this when referring to “frame size”.&lt;/p&gt;

&lt;h2 id=&quot;data-rate-and-line-rate&quot;&gt;Data Rate and Line Rate&lt;/h2&gt;

&lt;p&gt;When you calculate bit rate using frame size (without overhead) you get the data rate.&lt;/p&gt;

&lt;p&gt;When you calculate bit rate using frame size (with overhead) you get the line rate.&lt;/p&gt;

&lt;p&gt;The data rate will ALWAYS be less than the line rate.&lt;/p&gt;

&lt;p&gt;Let’s see an example.&lt;/p&gt;

&lt;p&gt;For an Ethernet port transmitting 512-byte frames at 1000 frames per second,&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The data rate is 1000 frames/second * 512 bytes/frame * 8bits/byte = 4,096,000 bits/s or 4.1 Mbps.&lt;/li&gt;
  &lt;li&gt;The line rate is 1000 frames/second * (512 bytes/frame + 20 bytes/frame overhead) * 8bits/byte = 4,256,000 bits/s or 4.3 Mbps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That difference of 0.2 Mbps between data rate and line rate may not seem like much, but the difference changes depending on the frame size and sometimes significantly.&lt;/p&gt;

&lt;p&gt;To understand more let’s compare the percentage overhead.&lt;/p&gt;

&lt;h2 id=&quot;percentage-overhead&quot;&gt;Percentage Overhead&lt;/h2&gt;

&lt;p&gt;The overhead of 20 bytes is always fixed for all frame sizes. But the percentage overhead changes depending on the frame size.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;20 byte overhead for 1518-byte frame = 20/1518 = 1.32%&lt;/li&gt;
  &lt;li&gt;20 byte overhead for 512-byte frame = 20/512 = 3.91%&lt;/li&gt;
  &lt;li&gt;20 byte overhead for 64-byte frame = 20/64 = 31.25%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s see the impact of this overhead with an example.&lt;/p&gt;

&lt;p&gt;For a 1G Ethernet port transmitting 64-byte frames at full line rate (1000 Mbps),&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Frame rate = 1000 Mbps / ((64 bytes/frame + 20 bytes/frame overhead) * 8bits/byte) = 1,488,095 frames/second or 1.49 million frames/second&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Converting this frame rate to data rate,&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Data rate = 1,488,095 frames/s * 64 bytes/frame * 8bits/byte = 761,904,640 bits/s or 761.9 Mbps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In summary, for 64-byte frames, the line rate of 1000 Mbps corresponds to data rate of only 761.9 Mbps. This is because of the high overhead for small frames.&lt;/p&gt;

&lt;h2 id=&quot;which-rate-does-ostinato-use&quot;&gt;Which rate does Ostinato use?&lt;/h2&gt;

&lt;p&gt;When configuring port or stream bitrate, you are configuring the line rate.&lt;/p&gt;

&lt;p&gt;When displaying Port Stats and Stream Stats, Ostinato displays line rate.&lt;/p&gt;

&lt;p&gt;Why does Ostinato always use line rate?&lt;/p&gt;

&lt;p&gt;This is because when we talk about 1G or 10G NIC speeds, we are talking about the line rate. So Ostinato always uses line rate to make it easier to compare the actual Tx/Rx rate against the maximum possible rate for the port.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/data-rate-vs-line-rate&quot;&gt;Data Rate vs Line Rate&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on April 14, 2026.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[How to generate a TCP SYN flood with Ostinato]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/syn-flood" />
  <id>https://ostinato.org/guides/syn-flood</id>
  <published>2026-03-24T00:00:00+00:00</published>
  <updated>2026-03-24T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;h2 id=&quot;what-is-a-syn-flood&quot;&gt;What is a SYN Flood&lt;/h2&gt;

&lt;p&gt;A SYN flood is a type of network attack where an attacker sends a large number of TCP SYN packets to a target device in an attempt to overwhelm its resources and cause it to crash or become unresponsive.&lt;/p&gt;

&lt;p&gt;A TCP SYN packet is the first packet in a TCP three-way handshake to establish a TCP connection. You can review the TCP three-way handshake in &lt;a href=&quot;/guides/tcp-vs-udp-understanding-differences-and-use-cases&quot;&gt;TCP vs UDP: Understanding Differences and Use Cases&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The recipient opens a socket to listen for the incoming connection and sends a SYN-ACK packet back to the sender. If the sender does not respond with an ACK packet, the recipient will wait for a timeout and then close the socket. If in this timeout window, the sender sends a flood of SYN packets corresponding to different connections, the recipient may run out of resources and/or may get overwhelmed and become unresponsive.&lt;/p&gt;

&lt;p&gt;The SYN flood may not only affect the recipient device, but also any network devices in the path which may track TCP connections e.g. NAT, stateful firewalls etc.&lt;/p&gt;

&lt;p&gt;Please note that although Ostinato is stateless and cannot establish a TCP connection, it can still generate a TCP SYN flood since sending a SYN packet can be done statelessly. It can also &lt;a href=&quot;https://ostinato.org/guides/ostinato-conntrack-tcp&quot;&gt;verify NAT scale for TCP connections&lt;/a&gt; in NAT and stateful firewall scenarios.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;⚠️ SYN flood traffic should only be generated in controlled lab environments for legitimate testing purposes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This includes testing your own devices, network infrastructure, or security defenses.&lt;/p&gt;

&lt;p&gt;Generating SYN flood traffic against systems you do not own or have explicit permission to test is illegal and unethical. Always ensure you have proper authorization and are working in an isolated test environment before generating any flood traffic.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;how-to-generate-a-tcp-syn-flood-with-ostinato&quot;&gt;How to generate a TCP SYN flood with Ostinato&lt;/h2&gt;

&lt;p&gt;Ostinato can be used to generate a TCP SYN flood as follows:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Create a new stream and set protocols as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mac | Eth | IP | TCP&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Set the IP source address to the source port’s IP address or an &lt;a href=&quot;https://userguide.ostinato.org/device-emulation/&quot;&gt;emulated device&lt;/a&gt; IP address&lt;/li&gt;
  &lt;li&gt;Set the IP destination address to the target device IP address&lt;/li&gt;
  &lt;li&gt;Set the TCP destination port to a known open TCP port on the target device (e.g. 80 for HTTP)&lt;/li&gt;
  &lt;li&gt;Set the TCP flags to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SYN&lt;/code&gt;&lt;br /&gt;
&lt;img src=&quot;/images/guides/syn-flood/tcp-config.png&quot; alt=&quot;TCP Configuration&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Go to the Variable Fields tab and create a variable field for the TCP source port (see guidelines below)&lt;br /&gt;
&lt;img src=&quot;/images/guides/syn-flood/tcp-source-port-variable-field.png&quot; alt=&quot;Variable Fields Configuration&quot; /&gt;&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Set the stream packet rate to a high rate (see guidelines below)&lt;/li&gt;
  &lt;li&gt;Click &lt;em&gt;Apply&lt;/em&gt; followed by &lt;em&gt;Start Transmit&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;em&gt;flood&lt;/em&gt; part is done by setting the TCP source variable field count to a high number. The packet rate of the stream should also be set to a high rate for the flood to be effective.&lt;/p&gt;

&lt;p&gt;What is “high” is determined by the target device and the network infrastructure in between. Here are a few guidelines -&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;L4 port numbers are 2 bytes long, so the maximum value is 65535&lt;/li&gt;
  &lt;li&gt;A TCP source port variable range of 10K to 50K is a good starting point&lt;/li&gt;
  &lt;li&gt;1Kpps to 10Kpps is a good starting point for the packet rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of (or in addition to) varying the TCP source port, you can also vary the source IP address.&lt;/p&gt;

&lt;h2 id=&quot;verifying-the-syn-flood&quot;&gt;Verifying the SYN Flood&lt;/h2&gt;

&lt;p&gt;Once configured, start transmitting the stream and monitor the target device. You should see:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;High CPU usage on the target device&lt;/li&gt;
  &lt;li&gt;Connection table exhaustion (if applicable)&lt;/li&gt;
  &lt;li&gt;Potential service degradation or timeouts&lt;/li&gt;
  &lt;li&gt;Increased SYN-ACK responses from the target&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monitor the target device’s connection state table and resource utilization to verify the SYN flood is having the intended effect. You can also check Ostinato’s &lt;a href=&quot;https://userguide.ostinato.org/port-statistics/&quot;&gt;port statistics&lt;/a&gt; to confirm packets are being transmitted at the expected rate.&lt;/p&gt;

&lt;h2 id=&quot;testing-tips&quot;&gt;Testing Tips&lt;/h2&gt;

&lt;p&gt;When testing with SYN floods:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Start with lower packet rates and gradually increase to find your device’s limits&lt;/li&gt;
  &lt;li&gt;Monitor both the target device and any intermediate network devices (firewalls, NAT devices)&lt;/li&gt;
  &lt;li&gt;Use multiple source IP addresses to simulate distributed attacks&lt;/li&gt;
  &lt;li&gt;Verify your test environment is isolated from production networks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more information on configuring variable fields in Ostinato, see the &lt;a href=&quot;https://userguide.ostinato.org/stream-config/#variable-fields&quot;&gt;Variable Fields&lt;/a&gt; section of the stream configuration documentation.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/syn-flood&quot;&gt;How to generate a TCP SYN flood with Ostinato&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on March 24, 2026.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Duplicate packets in Wireshark on Windows]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/duplicate-packets-windows" />
  <id>https://ostinato.org/guides/duplicate-packets-windows</id>
  <published>2026-03-10T00:00:00+00:00</published>
  <updated>2026-03-10T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;&lt;img src=&quot;/images/kb/duplicate-packets-windows/duplicate-packets-wireshark.png&quot; alt=&quot;Duplicate packets in Wireshark&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you are running Ostinato on Windows and you are seeing duplicate packets in Wireshark, this article is for you.&lt;/p&gt;

&lt;h2 id=&quot;why-are-the-packets-duplicated&quot;&gt;Why are the packets duplicated?&lt;/h2&gt;

&lt;p&gt;Actually, Ostinato is sending only one packet, not duplicates.&lt;/p&gt;

&lt;p&gt;However, Wireshark MAY show duplicate packets. This isn’t Wireshark’s fault either.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This happens when both WinPcap and Npcap are installed on the same machine and both services are running.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When both packet capture libraries are active simultaneously, they can both capture the same packet, causing Wireshark to display duplicates even though only one packet was actually sent.&lt;/p&gt;

&lt;p&gt;You can find out if both services are running by executing the following command -&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&quot;C:\Program Files (x86)\Ostinato\drone.exe&quot; -v

Ostinato Drone 1.2.0 rev c82cccc5eb4f@

PCAP Lib: WinPcap version 4.1.3 (packet.dll version 4.1.0.2980), based on libpcap version 1.0 branch 1_0_rel0b (20091008)

Service npf status running
Service npcap status running
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note: newer versions of Ostinato Drone are at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C:\Program Files\Ostinato\drone.exe&lt;/code&gt;. They may also be at a custom location if you chose a non-default installation path.&lt;/p&gt;

&lt;p&gt;As can be seen from the output, both WinPcap (service &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npf&lt;/code&gt;) and Npcap are running.&lt;/p&gt;

&lt;p&gt;Note that &lt;strong&gt;this is not an Ostinato problem&lt;/strong&gt; and is seen with other tools as well.&lt;/p&gt;

&lt;p&gt;If you are seeing duplicate packets in Wireshark and Ostinato is not installed, you can check the service status using the following commands -&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sc query npf
sc query npcap
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;temporary-fix&quot;&gt;Temporary fix&lt;/h2&gt;

&lt;p&gt;You can temporarily fix this issue by stopping the WinPcap &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npf&lt;/code&gt; service.&lt;/p&gt;

&lt;p&gt;From an &lt;strong&gt;elevated command prompt&lt;/strong&gt; (Run as Administrator), run the following command -&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;net stop npf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Restart Wireshark and check if the issue is fixed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This temporary fix may not work in all cases, depending on how your system is configured. Even if it works, the service will be restarted automatically when you reboot the machine.&lt;/p&gt;

&lt;p&gt;It’s better to fix the issue permanently.&lt;/p&gt;

&lt;h2 id=&quot;permanent-fix&quot;&gt;Permanent fix&lt;/h2&gt;

&lt;p&gt;The last release of WinPcap was in 2018. It is no longer developed or maintained. Npcap is the recommended replacement.&lt;/p&gt;

&lt;p&gt;From the &lt;a href=&quot;https://www.winpcap.org/&quot;&gt;winpcap.org website&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/kb/duplicate-packets-windows/winpcap-eol-notice.png&quot; alt=&quot;WinPcap EOL Notice&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The permanent fix is to uninstall WinPcap and reboot the machine.&lt;/p&gt;

&lt;p&gt;Rerun the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;drone -v&lt;/code&gt; command to verify that the npf service is no longer running (the status may be reported as unknown which means the service is not installed and not running).&lt;/p&gt;

&lt;p&gt;If after uninstalling WinPcap, Ostinato does not start because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wpcap.dll&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;packet.dll&lt;/code&gt; is not found, please see the following FAQ for steps to fix it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://ostinato.org/docs/faq/#q-ostinato-on-windows-does-not-start-because-wpcapdll-or-packetdll-is-not-found&quot;&gt;FAQ: Npcap DLL not found&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If despite everything suggested here, the issue is still not fixed, &lt;a href=&quot;https://ostinato.org/contact&quot;&gt;contact support&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/duplicate-packets-windows&quot;&gt;Duplicate packets in Wireshark on Windows&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on March 10, 2026.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[MTU Sweep Test]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/mtu-sweep-test" />
  <id>https://ostinato.org/guides/mtu-sweep-test</id>
  <published>2026-02-24T00:00:00+00:00</published>
  <updated>2026-02-24T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;The Path Maximum Transmission Unit (MTU) is the largest packet size that can traverse a network path without fragmentation. If packets are larger than the path MTU, they get fragmented or dropped. This leads to performance issues and connectivity problems. Knowing the path MTU is essential when configuring MPLS tunnels, VPNs, or troubleshooting network connectivity.&lt;/p&gt;

&lt;p&gt;To find out the MTU for a network path, you can use a sweep test. Some platform have a ping sweep command e.g. here’s Juniper’s RSVP LSP ping sweep -&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ping mpls rsvp &amp;lt;lsp-name&amp;gt; sweep
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you want to do something similar in Ostinato, here’s how -&lt;/p&gt;

&lt;h2 id=&quot;using-the-gui&quot;&gt;Using the GUI&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Using the GUI, create a UDP stream towards the destination IP address&lt;/li&gt;
  &lt;li&gt;In the IP header, enable the &lt;em&gt;Don’t Fragment&lt;/em&gt; (DF) configuration
&lt;img src=&quot;/images/guides/mtu-sweep/ip-dont-fragment-config.png&quot; alt=&quot;IP Header DF Configuration&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Verify the stream is working by sending a few packets and ensuring that the packets are received at the destination&lt;/li&gt;
  &lt;li&gt;Now, set the frame length &lt;em&gt;mode&lt;/em&gt; to &lt;em&gt;Increment&lt;/em&gt; with suitable minimum and maximum frame lengths
&lt;img src=&quot;/images/guides/mtu-sweep/mtu-sweep-inc-frame-size.png&quot; alt=&quot;MTU Sweep Test GUI&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Make sure you set the number of packets to at least &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;frameLengthMax - frameLengthMin + 1&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Change the &lt;em&gt;packet rate&lt;/em&gt; from the default &lt;em&gt;1 packet/second&lt;/em&gt; to &lt;em&gt;1000 packets/second&lt;/em&gt; so that the transmit is faster and the test completes faster
&lt;img src=&quot;/images/guides/mtu-sweep/mtu-sweep-stream-control.png&quot; alt=&quot;Stream Control Config&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;Send all packets&lt;/li&gt;
  &lt;li&gt;On the receiver, capture the packets and note the frame length of the packets that are received
&lt;img src=&quot;/images/guides/mtu-sweep/mtu-sweep-rx-capture.png&quot; alt=&quot;MTU Sweep Rx Capture&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The highest frame length that is received is the MTU for the network path.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note that the Ostinato stream’s frame length includes FCS while Wireshark’s frame length does not - so make sure to adjust for those 4 bytes!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Some tips -&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If there’s a firewall in between the sender and receiver, set the UDP ports to values that are allowed by the firewall - this is why reachability verification in step 3 is important&lt;/li&gt;
  &lt;li&gt;If the highest frame length that is received is same as the maximum frame length (&lt;em&gt;after adjusting for the 4-byte FCS&lt;/em&gt;), the MTU may be higher than the maximum frame length - so try increasing the maximum frame length and re-running the test.&lt;/li&gt;
  &lt;li&gt;Varying the frame length in the stream will lead to &lt;a href=&quot;/guides/streams-vs-flows&quot;&gt;multiple flows&lt;/a&gt; being generated - if the number of flows exceeds your license limit, you may need to run the test multiple times with different min/max frame lengths&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;using-the-python-api&quot;&gt;Using the Python API&lt;/h2&gt;

&lt;p&gt;Instead of sending packets for all frame lengths from minimum to maximum, you can send a single packet with the minimum and maximum frame lengths and then use a binary search to find the MTU.&lt;/p&gt;

&lt;p&gt;This approach avoid generating multiple flows and is therefore more efficient.&lt;/p&gt;

&lt;p&gt;You can use the GUI to first verify reachability of the stream (similar to step 3 in the GUI approach above) then use the Python API for the binary search algo with just start/stop transmit/capture commands - see &lt;a href=&quot;/guides/api-easy-start&quot;&gt;Python API Easy Start&lt;/a&gt; for more details on how to do this.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/mtu-sweep-test&quot;&gt;MTU Sweep Test&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on February 24, 2026.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Why Ostinato TX uses only one core - or does it?]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/one-core-per-tx-port" />
  <id>https://ostinato.org/guides/one-core-per-tx-port</id>
  <published>2026-02-10T00:00:00+00:00</published>
  <updated>2026-02-10T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;&lt;img src=&quot;/images/kb/one-core-per-tx-port/cpu-util.png&quot; alt=&quot;Ostinato CPU Utilization&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I have a multi-core CPU, but Ostinato is using only one core while the rest are idle&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a question we get asked often.&lt;/p&gt;

&lt;p&gt;This observation is not entirely true, though.&lt;/p&gt;

&lt;p&gt;The Ostinato TX code is single-threaded and therefore only one core is used - &lt;em&gt;for one port&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you have multiple ports and you start transmit on them in parallel, then Ostinato will use &lt;strong&gt;one core per transmitting port&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;why-single-core-tx-per-port&quot;&gt;Why single-core TX per port?&lt;/h2&gt;

&lt;p&gt;So why does a single port TX not use more cores?&lt;/p&gt;

&lt;p&gt;To start with, it’s historical - Ostinato was first written in 2007 and at that time multi-core CPUs were not yet commonplace.&lt;/p&gt;

&lt;p&gt;Subsequently though, we did revisit this design and did some research to see if we can improve the performance of a single port TX using multiple cores.&lt;/p&gt;

&lt;p&gt;Here’s what we found.&lt;/p&gt;

&lt;p&gt;As a cross-platform tool, Ostinato uses libpcap for packet transmission. libpcap by itself is not multi-threaded. Also, the underlying OS mechanisms (different for each OS) used by libpcap are not generally designed for multi-threading.&lt;/p&gt;

&lt;p&gt;We could still open the same port multiple times (one per thread) and transmit on them in parallel. But this would lead to contention in the kernel’s network stack and likely not improve the performance much.&lt;/p&gt;

&lt;p&gt;Instead, we took a different approach - rather than attempting a 2x or 3x performance improvement, we did a 10x (&lt;em&gt;and more!&lt;/em&gt;) performance improvement by using packet acceleration technology.&lt;/p&gt;

&lt;h2 id=&quot;turbo-transmit---the-multi-core-solution&quot;&gt;Turbo Transmit - the multi-core solution&lt;/h2&gt;

&lt;p&gt;Ostinato Turbo Transmit uses the in-kernel packet acceleration technology - AF_XDP built into the Linux kernel.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;You may be familiar with DPDK (Data Plane Development Kit) which is a kernel bypass library for accelerating packet processing. While we did a prototype using DPDK, we productized Turbo Transmit using AF_XDP instead.&lt;/p&gt;

&lt;p&gt;Ostinato does not use DPDK for Turbo Transmit.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;AF_XDP (and DPDK for that matter) does not have the contention issue because it targets NICs (typically 10G or higher) which have multiple hardware queues. By distributing the queues across multiple cores and using a Linux driver that supports AF_XDP, we can achieve higher throughput for both Tx and Rx - without any contention.&lt;/p&gt;

&lt;p&gt;Launched for 10G ports in 2021, Ostinato now uses the same &lt;a href=&quot;/pricing/turbo&quot;&gt;Turbo Transmit&lt;/a&gt; technology to scale and support line rate on 100G and 400G ports.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/turbo-perf.png&quot; alt=&quot;Ostinato Turbo Transmit Performance&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You &lt;strong&gt;need an add-on Turbo license&lt;/strong&gt; to use this feature. Also, this is a Linux-only feature.&lt;/p&gt;

&lt;p&gt;You may not need the Turbo license though - the base license, which uses max-one-core-per-port code for TX, may actually be sufficient for your use case.&lt;/p&gt;

&lt;h2 id=&quot;how-to-increase-tx-rate-with-single-core-tx&quot;&gt;How to increase TX rate with single-core TX&lt;/h2&gt;

&lt;p&gt;The trick is to increase the packet size.&lt;/p&gt;

&lt;p&gt;Like most networking devices and software, the Ostinato TX processing is primarily pps (packets per second) bound and independent of the packet size.&lt;/p&gt;

&lt;p&gt;The larger the packet size, the higher the TX bitrate.&lt;/p&gt;

&lt;p&gt;The default packet size for Ostinato streams is 64 bytes (the smallest possible Ethernet frame size). If packet size does not matter to you, increase the packet size to a larger size - up to the maximum possible Ethernet frame size (1518 bytes) or jumbo frames (9000 bytes). This will likely give you the higher Tx throughput you are looking for.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;/guides/ethernet-packet-size-and-throughput&quot;&gt;The cheat-code for high throughput&lt;/a&gt; for more details.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Operating System Note&lt;/em&gt;: Please &lt;strong&gt;use Ostinato on Linux or MacOS for higher performance&lt;/strong&gt;. Ostinato on Windows is not as performant due to the underlying Windows platform limitations.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;For higher throughput, use the largest packet size possible.&lt;/p&gt;

&lt;p&gt;If you want higher throughput for smaller packets, use the Turbo Transmit feature.&lt;/p&gt;

&lt;p&gt;You can also review other &lt;a href=&quot;/guides/tags#Performance-testing&quot;&gt;performance related guides&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/one-core-per-tx-port&quot;&gt;Why Ostinato TX uses only one core - or does it?&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on February 10, 2026.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Emulating multiple networks on a single port]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/one-port-multiple-networks" />
  <id>https://ostinato.org/guides/one-port-multiple-networks</id>
  <published>2026-01-27T00:00:00+00:00</published>
  <updated>2026-01-27T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;A few months ago, we got this question from Ide - a network engineer working on a multicast demo.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I’m running low on [Ostinato] server interfaces—I’ve used all four and only have one left. I need to simulate two receivers on different VLANs using this single interface.&lt;/p&gt;

  &lt;p&gt;Would it be possible to configure this [Ostinato] server interface as a trunk port to the switch and assign VLAN 111 (IP: 10.11.11.11) and VLAN 222 (IP: 10.12.12.12) in Ostinato? This way, I can set this port as a receiver and configure IGMP joins for two different multicast groups—for example, 239.1.1.1 on VLAN 111 and 239.2.2.2 on VLAN 222.&lt;/p&gt;

  &lt;p&gt;If this is feasible, could you guide me on how to set it up?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is yes, it is possible to emulate multiple networks (identified by different VLAN IDs) on a single port using Ostinato.&lt;/p&gt;

&lt;p&gt;Not only is it possible, it’s actually quite easy to do.&lt;/p&gt;

&lt;p&gt;For anyone else wanting to do something similar, here’s how you can do it.&lt;/p&gt;

&lt;h2 id=&quot;topology&quot;&gt;Topology&lt;/h2&gt;

&lt;p&gt;Here’s the logical test topology the user wants to emulate -&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/one-port-multiple-networks/logical-test-topo.png&quot; alt=&quot;Logical topology&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And here’s the actual physical test topology where Ostinato will emulate both the VLANs and the receivers -&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/one-port-multiple-networks/physical-test-topo.png&quot; alt=&quot;Physical topology&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;device-configuration&quot;&gt;Device Configuration&lt;/h2&gt;

&lt;p&gt;Configure two different devices on the same port with the required VLANs and IP addresses -&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/one-port-multiple-networks/vlan111-device.png&quot; alt=&quot;Device configuration&quot; /&gt;
&lt;img src=&quot;/images/guides/one-port-multiple-networks/vlan222-device.png&quot; alt=&quot;Device configuration&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;stream-configuration&quot;&gt;Stream Configuration&lt;/h2&gt;

&lt;p&gt;Create two IGMP streams with the above IP as source IP and the multicast group as destination.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/one-port-multiple-networks/igmp-vlan111.png&quot; alt=&quot;VLAN 111 IGMP stream&quot; /&gt;
&lt;img src=&quot;/images/guides/one-port-multiple-networks/igmp-vlan222.png&quot; alt=&quot;VLAN 222 IGMP stream&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For a step-by-step guide on setting up IGMP streams and configuring multicast data traffic, check out the resources available under &lt;a href=&quot;/guides/tags#IGMP&quot;&gt;IGMP&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;port-configuration&quot;&gt;Port Configuration&lt;/h2&gt;

&lt;p&gt;Double click the port to set Transmit mode to &lt;a href=&quot;https://userguide.ostinato.org/port-config/#transmit-mode&quot;&gt;interleaved&lt;/a&gt; instead of sequential (interleaved -&amp;gt; all streams sent together instead of one after other)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/one-port-multiple-networks/tx-mode-interleaved.png&quot; alt=&quot;Interleaved Tx mode&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;trunk-vlan-configuration&quot;&gt;Trunk VLAN Configuration&lt;/h3&gt;

&lt;p&gt;The Ostinato/Drone port does not require any Trunk VLAN configuration.&lt;/p&gt;

&lt;p&gt;However, you do need to configure the Trunk VLAN on the DUT switch.&lt;/p&gt;

&lt;h2 id=&quot;not-just-igmp&quot;&gt;Not just IGMP&lt;/h2&gt;

&lt;p&gt;Note that this example is specific to IGMP and multicast. You can use the same technique to emulate multiple networks on a single port for other scenarios and &lt;a href=&quot;/guides/tags#Use-Cases&quot;&gt;use-cases&lt;/a&gt; as well.&lt;/p&gt;

&lt;p&gt;Do reach out to us if you have any questions or need any help.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/one-port-multiple-networks&quot;&gt;Emulating multiple networks on a single port&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on January 27, 2026.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Why Ostinato traffic is not reaching the destination]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/traffic-not-reaching-destination" />
  <id>https://ostinato.org/guides/traffic-not-reaching-destination</id>
  <published>2026-01-13T00:00:00+00:00</published>
  <updated>2026-01-13T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;Many first-time Ostinato users encounter the issue of traffic not reaching their destination. This is a common issue and there are a few reasons why this might happen.&lt;/p&gt;

&lt;p&gt;This guide will walk you through the most common reasons why your traffic might not be reaching your destination and how to fix them.&lt;/p&gt;

&lt;h2 id=&quot;double-check-the-ip-address-in-the-stream-configuration&quot;&gt;Double-check the IP address in the stream configuration&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This one trips up even experienced engineers!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you use Ostinato &lt;a href=&quot;https://userguide.ostinato.org/device-emulation/&quot;&gt;emulated devices&lt;/a&gt; to simulate a source or destination device, the default IP address used is in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;198.18.x.x&lt;/code&gt; range. This looks deceptively similar to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.x.x&lt;/code&gt; private IP range which most network engineers are familiar with and use in their testing. They look similar, but they are different in both the octets!&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;198.18.x.x != 192.168.x.x
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ensure you are using the correct IP address in the stream configuration.&lt;/p&gt;

&lt;h2 id=&quot;error-and-warning-logs&quot;&gt;Error and Warning Logs&lt;/h2&gt;
&lt;p&gt;Make sure to review the error and warning logs in the Ostinato GUI to see if there are any clues as to why your traffic might not be reaching your destination.&lt;/p&gt;

&lt;p&gt;If you see any error or warning logs, jump to the relevant section below to troubleshoot the issue.&lt;/p&gt;

&lt;h2 id=&quot;error-source-mac-resolve-failure&quot;&gt;ERROR: Source MAC Resolve failure&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/kb/src-mac-resolve-failed/error-source-mac-resolve-failed.png&quot; alt=&quot;Source MAC Resolve Failed&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By default, Ostinato streams are set to resolve the source and destination MAC addresses based on the source and destination IP address set in the stream configuration.&lt;/p&gt;

&lt;p&gt;Specifically, the source IP (along with any VLAN tags) MUST match either the IP address assigned to the port by the OS or an emulated device IP address. Make sure this is the case. For VLAN-tagged traffic, ensure stream and device VLANs match - see &lt;a href=&quot;/guides/vlans&quot;&gt;generate VLAN tagged traffic&lt;/a&gt; for how VLANs work in Ostinato and review the KB article &lt;a href=&quot;/guides/src-mac-resolve-failed&quot;&gt;Source MAC Resolve Failed&lt;/a&gt; for troubleshooting steps.&lt;/p&gt;

&lt;p&gt;Destination MAC resolve will be attempted only if the source MAC resolve is successful. Ensure you fix your source MAC resolve failure before moving forward.&lt;/p&gt;

&lt;h2 id=&quot;error-destination-mac-resolve-failure&quot;&gt;ERROR: Destination MAC Resolve failure&lt;/h2&gt;

&lt;p&gt;Only if the source MAC resolve is successful, Ostinato will attempt to resolve the destination MAC address based on the destination IP address (along with any VLAN tags).&lt;/p&gt;

&lt;p&gt;Ensure the destination IP address (along with any VLAN tags) matches the IP address (and expected VLAN tags) of the destination device. If you determine these are correct and match the destination device, run a packet capture on the local port to monitor ARP requests and responses.&lt;/p&gt;

&lt;p&gt;If you don’t see any ARP requests being sent out by the local port, in the Ostinato GUI devices tab - clear the ARP cache and retry ARP resolution.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/kb/traffic-not-reaching-destination/arp-resolve-clear.png&quot; alt=&quot;ARP Clear and Resolve&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you see ARP requests in the packet capture, but no ARP response, start a packet capture on the destination device to monitor ARP requests and responses. Verify the following -&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;ARP requests are reaching the destination device&lt;/li&gt;
  &lt;li&gt;The destination device is responding to the ARP requests with a valid ARP response&lt;/li&gt;
  &lt;li&gt;Contents of ARP requests and responses are valid&lt;/li&gt;
  &lt;li&gt;VLAN Tags match the expected VLAN tags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please note that, if the destination (or source) MAC address is not resolved, Ostinato will still send the traffic stream with src/dst MAC set to 0 - which will be dropped by the next hop in the path. Therefore, ensure you fix your source and/or destination MAC resolve failure before moving forward.&lt;/p&gt;

&lt;h2 id=&quot;ostinato-tx-port-statistics-are-not-increasing&quot;&gt;Ostinato TX port statistics are not increasing&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/kb/traffic-not-reaching-destination/traffic-rate-zero.png&quot; alt=&quot;Ostinato TX rate zero&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By default, Ostinato transmits 10 packets per stream and then stops. Depending on the packet rate, the TX may have finished and the current send rates may show as zero when you check them.&lt;/p&gt;

&lt;p&gt;While troubleshooting, you might want to have a continuous stream of traffic - this can be achieved by setting the stream’s &lt;em&gt;Goto&lt;/em&gt; to &lt;em&gt;Goto First&lt;/em&gt; (instead of &lt;em&gt;Stop&lt;/em&gt;) - so that the stream loops continuously.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/kb/traffic-not-reaching-destination/stream-goto.png&quot; alt=&quot;Ostinato Stream Goto&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After making and applying the change, check the TX port statistics again - the send rates should now be increasing.&lt;/p&gt;

&lt;h2 id=&quot;still-not-reaching-the-destination&quot;&gt;Still not reaching the destination?&lt;/h2&gt;

&lt;p&gt;If you have followed all the steps above and the traffic is still not reaching the intended destination, you need to put on your network engineering hat and start troubleshooting the issue.&lt;/p&gt;

&lt;p&gt;Here are a few things you can try and check -&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Verify using stats that Ostinato generated packets are going out of the local port&lt;/li&gt;
  &lt;li&gt;Verify using packet capture on the local port that Ostinato generated packets have the correct source and destination MAC and IP addresses&lt;/li&gt;
  &lt;li&gt;Verify each node on the path that the packets are being forwarded. You can use packet capture on the node; if packet capture is not available, send a specific rate of traffic from Ostinato. At each node check the traffic rates on ingress and egress ports to check if the node is forwarding or dropping the traffic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are still not able to reach your destination, you can post on the &lt;a href=&quot;https://jump.ostinato.org/forum&quot;&gt;Ostinato Forum&lt;/a&gt; and get help from the community.&lt;/p&gt;


    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/traffic-not-reaching-destination&quot;&gt;Why Ostinato traffic is not reaching the destination&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on January 13, 2026.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Streams vs Flows in Ostinato]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/streams-vs-flows" />
  <id>https://ostinato.org/guides/streams-vs-flows</id>
  <published>2025-12-16T00:00:00+00:00</published>
  <updated>2025-12-16T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;Some Ostinato users get confused between streams and flows.&lt;/p&gt;

&lt;p&gt;These are fundamental concepts and it’s important to understand the difference between them.&lt;/p&gt;

&lt;p&gt;This post will help you do that.&lt;/p&gt;

&lt;h2 id=&quot;what-is-a-stream&quot;&gt;What is a stream?&lt;/h2&gt;

&lt;p&gt;A stream is what you - as a user - configure in Ostinato. It defines the properties of the traffic to be generated. e.g. the type of traffic, the source and destination IP addresses, the port, the protocol, the rate, the duration, etc.&lt;/p&gt;

&lt;p&gt;You configure the various properties of the stream when creating a new stream or editing an existing stream using the stream configuration dialog.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/streams-vs-flows/stream-config-dialog.gif&quot; alt=&quot;Stream configuration dialog&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The term stream is commonly used for a similar purpose in most traffic generators.&lt;/p&gt;

&lt;h2 id=&quot;what-is-a-flow&quot;&gt;What is a flow?&lt;/h2&gt;

&lt;p&gt;Traditionally in networking, a flow is a sequence of packets that share the same properties. e.g. the same source and destination IP addresses, the same port, the same protocol etc.&lt;/p&gt;

&lt;p&gt;The standard 5-tuple used in NAT e.g. is -&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;(source IP, source port, destination IP, destination port, protocol = TCP/UDP)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The 5-tuple is essentially a unique identifier for a sequence of packets that share the same properties. Once a flow is identified, the packets in the flow are treated as a single entity and are processed similarly.&lt;/p&gt;

&lt;p&gt;Note that VLAN tags, MPLS labels etc. can also be part of the flow identifier. Or ICMP ID fields etc.&lt;/p&gt;

&lt;p&gt;It really depends on the use case and application.&lt;/p&gt;

&lt;p&gt;But at it’s core, it is about identifying a sequence of packets that share the same properties.&lt;/p&gt;

&lt;h3 id=&quot;ostinato-flows&quot;&gt;Ostinato flows&lt;/h3&gt;

&lt;p&gt;A flow in Ostinato is also similar - but more granular.&lt;/p&gt;

&lt;p&gt;As a synthetic traffic generator, Ostinato classifies every unique packet as a separate flow. Any packet field that varies will generate multiple flows. A few examples will make it clearer -&lt;/p&gt;

&lt;p&gt;This stream with incrementing destination IP address will generate 16 flows - one for each destination IP address.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/streams-vs-flows/incrementing-dest-ip.png&quot; alt=&quot;Incrementing destination IP address&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This stream with incrementing VLAN ID will generate 4 flows - one for each VLAN ID.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/streams-vs-flows/incrementing-vlan-id.png&quot; alt=&quot;Incrementing VLAN ID&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note that in the above examples, we assume that only one packet field is varying - the rest are kept constant.&lt;/p&gt;

&lt;p&gt;If you have multiple packet fields varying, the number of flows will be the lowest common multiple (LCM) of the number of flows for each varying packet field.&lt;/p&gt;

&lt;p&gt;For our above examples, if you have both the destination IP address and the VLAN ID varying, the number of flows will be LCM (16, 4) = 16.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A single Ostinato stream can generate multiple flows.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This makes it easy to generate a large number of flows from a single stream for use cases like testing &lt;a href=&quot;/guides/understanding-nat-pat&quot;&gt;NAT&lt;/a&gt; or &lt;a href=&quot;/guides/nat-scaling&quot;&gt;NAT scale&lt;/a&gt;, &lt;a href=&quot;/guides/network-basics-link-aggregation-ecmp&quot;&gt;load-balancing&lt;/a&gt; and &lt;a href=&quot;/guides/load-balancing-problems-and-solutions&quot;&gt;load-balancing problems&lt;/a&gt;, or &lt;a href=&quot;/guides/testing-l2-switch&quot;&gt;MAC learning and L2 switch testing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This understanding of streams and flows will help you plan your testing scenarios more effectively. Do reach out to us if you have any questions or need any help.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/streams-vs-flows&quot;&gt;Streams vs Flows in Ostinato&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on December 16, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Python API Easy Start]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/api-easy-start" />
  <id>https://ostinato.org/guides/api-easy-start</id>
  <published>2025-11-28T00:00:00+00:00</published>
  <updated>2025-11-28T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;Ostinato user &lt;em&gt;Stephen&lt;/em&gt; asked -&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If I setup on the Ostinato manager GUI the streams and emulated devices, but I would like to start, stop, and log a test with the Python API is that possible?&lt;/p&gt;

  &lt;p&gt;So, basically I would use the manager GUI to define my test parameters (streams, emulated devices, etc.), but use the Python API to help automate the test and logging.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes, that is an easy way to get started with the Python API without having to figure out the full stream and protocol configuration API details.&lt;/p&gt;

&lt;p&gt;Here are some more details on this approach.&lt;/p&gt;

&lt;p&gt;Save the Ostinato GUI configuration as a session file.&lt;/p&gt;

&lt;p&gt;Write a simple Python script using the following &lt;a href=&quot;https://apiguide.ostinato.org/module_core/#class-DroneProxy&quot;&gt;Ostinato Python APIs&lt;/a&gt; -&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;startTransmit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;stopTransmit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;getStats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;getStreamStatsDict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here’s an example - using the above mentioned Ostinato Python APIs to start/stop transmit and log the stats.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ostinato.core&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DroneProxy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ost_pb&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;time&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Get ...
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;drone&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DroneProxy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;localhost&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# ... set ...
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_port&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ost_pb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PortIdList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tx_port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;rx_port&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ost_pb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PortIdList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rx_port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;all_ports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ost_pb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PortIdList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;all_ports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;all_ports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rx_port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;guids&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ost_pb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StreamGuidList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;guids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;all_ports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;tx_config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ost_pb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TransmitConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tx_config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# ... GO!
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;drone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clearStats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;all_ports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;drone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startTransmit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;drone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stopTransmit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;drone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getStats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;all_ports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;stream_stats&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;drone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getStreamStatsDict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stream_stats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This script assumes that the Drone has already been configured using the Ostinato GUI.&lt;/p&gt;

&lt;p&gt;If you are using v2.0 or higher, instead of sleep, you can set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tx_config.tx_duration&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;waitForTransmitFinish&lt;/code&gt; -&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;tx_config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ost_pb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TransmitConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tx_config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;port_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;tx_config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_duration&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# seconds
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;drone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startTransmit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;waitForTransmitFinish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tx_port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that the Ostinato session file CANNOT be loaded via the Python API. It can only be loaded in the GUI.&lt;/p&gt;

&lt;p&gt;Also, the session file is not portable across setups if the drone hostname/IP is different and/or the port names are different.&lt;/p&gt;

&lt;p&gt;This is a quick and easy way to get started with the Ostinato Python API.&lt;/p&gt;

&lt;h2 id=&quot;full-scripting---easy-start&quot;&gt;Full scripting - easy start&lt;/h2&gt;
&lt;p&gt;If you want full automation, without having to use the GUI to configure the Drone, but also want to avoid writing a python script from scratch, here’s a modified approach.&lt;/p&gt;

&lt;p&gt;Use the GUI to configure everything. Then go to &lt;strong&gt;Ports &amp;gt; Save Port Configuration&lt;/strong&gt; and select the output format as &lt;em&gt;Python script&lt;/em&gt;. You can then modify the script to add your own logic to automate the test.&lt;/p&gt;

&lt;p&gt;You will need to save a python script for each Tx/Rx test port and then modify/combine them to build an automated test suite.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/api-easy-start&quot;&gt;Python API Easy Start&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on November 28, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Error: Source mac resolve failed for one or more streams]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/src-mac-resolve-failed" />
  <id>https://ostinato.org/guides/src-mac-resolve-failed</id>
  <published>2025-11-13T00:00:00+00:00</published>
  <updated>2025-11-13T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;blockquote&gt;
  &lt;p&gt;Source mac resolve failed for one or more streams - Device matching stream’s source IP not found&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;/images/kb/src-mac-resolve-failed/error-source-mac-resolve-failed.png&quot; alt=&quot;Source MAC resolve failed error&quot; /&gt;&lt;/p&gt;

&lt;p&gt;New Ostinato users who encounter this error often get confused.&lt;/p&gt;

&lt;p&gt;This kb/src-mac-resolve-failed article will explain what it means and how to fix it.&lt;/p&gt;

&lt;h2 id=&quot;root-cause&quot;&gt;Root cause&lt;/h2&gt;
&lt;p&gt;When you create a new Ostinato stream, by default the source and destination Mac addresses are set to &lt;em&gt;Resolve&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/kb/src-mac-resolve-failed/mac-config-resolve.png&quot; alt=&quot;Mac address resolve setting&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This configuration setting tells Ostinato to auto populate the source and destination MAC addresses in the packet based on the source and destination IP addresses configured in the traffic stream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does Ostinato do that?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It uses the stream’s source IP address to find the source device. To do that, it will look up the list of devices configured on the same port and find a device with the same source IP address as configured in the stream.&lt;/p&gt;

&lt;p&gt;Once it knows the source device (which can be the physical port itself or an emulated device), it will use the source device’s MAC address to populate the source MAC address in the packet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If a source device is not found, Ostinato is not able to resolve the source MAC address and will display this error.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Note that without first identifying a &lt;em&gt;source device&lt;/em&gt; for the stream, Ostinato cannot do a destination MAC address resolution using ARP/NDP either since it needs to know the gateway IP address to do that.&lt;/p&gt;

&lt;h2 id=&quot;how-to-fix-it&quot;&gt;How to fix it?&lt;/h2&gt;

&lt;p&gt;Follow these steps to troubleshoot and fix the issue -&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Note the source IP address configured in the stream&lt;/li&gt;
  &lt;li&gt;Go to the &lt;strong&gt;Devices &amp;gt; Information&lt;/strong&gt; tab and look for a device with the same source IP address&lt;/li&gt;
  &lt;li&gt;If you find a device, carefully check if the &lt;strong&gt;source IP is exactly the same as the one configured in the stream&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;If you don’t find a device, create an emulated device with this source IP address&lt;/li&gt;
  &lt;li&gt;Apply the changes and verify the error is not seen now&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: If you have multiple streams with different source IP addresses, you can disable all streams and enable them one by one, click Apply button after each enable to see which stream is causing the issue.&lt;/p&gt;

&lt;h2 id=&quot;vlan-tagged-traffic&quot;&gt;VLAN tagged traffic&lt;/h2&gt;

&lt;p&gt;For VLAN tagged traffic, the &lt;strong&gt;VLAN ID in the stream MUST match the VLAN ID in the device&lt;/strong&gt; configuration. In other words, the device must also be configured with the same VLAN ID(s).&lt;/p&gt;

&lt;p&gt;For Q-in-Q or multiple VLAN tags, &lt;strong&gt;ALL the VLAN IDs in the stream must match the number, order and values of the VLAN IDs in the device configuration - including the TPIDs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For how to configure VLAN tagged streams and devices in Ostinato, see &lt;a href=&quot;/guides/vlans&quot;&gt;generate VLAN tagged traffic&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;example&quot;&gt;Example&lt;/h2&gt;

&lt;p&gt;Here’s an example showing a stream with a source IP address that matches a device configured -&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/kb/src-mac-resolve-failed/stream-ip-addr-config.png&quot; alt=&quot;Stream IP address configuration&quot; /&gt;
&lt;img src=&quot;/images/kb/src-mac-resolve-failed/device-ip-addr-config.png&quot; alt=&quot;Device IP address configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note that the source IP address in the stream is exactly the same as the device IP address configured.&lt;/p&gt;

&lt;p&gt;Here’s another example with Q-in-Q VLAN tagged traffic -
&lt;img src=&quot;/images/kb/src-mac-resolve-failed/stream-vlan-ip-addr-config.png&quot; alt=&quot;Stream VLAN and IP address configuration&quot; /&gt;
&lt;img src=&quot;/images/kb/src-mac-resolve-failed/device-vlan-ip-addr-config.png&quot; alt=&quot;Device VLAN and IP address configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note that apart from the same source IP address, the VLAN IDs in the stream is exactly the same as the VLAN IDs in the device configuration - in number, order, values and TPIDs.&lt;/p&gt;

&lt;h2 id=&quot;common-pitfall&quot;&gt;Common pitfall&lt;/h2&gt;

&lt;p&gt;When creating devices with IPv4, Ostinato uses the IP address &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;198.18.x.y&lt;/code&gt; by default - this is a reserved range of IP addresses for benchmarking and testing purposes.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.x.y&lt;/code&gt; is a reserved range of IP addresses for local network use.&lt;/p&gt;

&lt;p&gt;Both these IP address can look similar at first glance and may trigger this error if you used the default IP address in the device configuration and set the stream source IP address to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.x.y&lt;/code&gt;!&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/src-mac-resolve-failed&quot;&gt;Error: Source mac resolve failed for one or more streams&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on November 13, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[How to create SRv6 traffic using Ostinato]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/srv6-protocol-script" />
  <id>https://ostinato.org/guides/srv6-protocol-script</id>
  <published>2025-10-23T00:00:00+00:00</published>
  <updated>2025-10-23T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;&lt;strong&gt;Segment Routing over IPv6 (SRv6)&lt;/strong&gt; enables source routing by encoding path information directly in IPv6 packet headers. It uses the Segment Routing Header (SRH) - IPv6 extension header to carry a list of segments (identified by a segment-id SID) that define the network path. Each segment represents a network instruction, allowing precise control over packet forwarding through the network.&lt;/p&gt;

&lt;p&gt;We’ll not go into more details about SRv6 here - if you are here you likely already know what it is and how it works.&lt;/p&gt;

&lt;p&gt;What you want to know is how to create SRv6 traffic.&lt;/p&gt;

&lt;p&gt;Ostinato doesn’t support SRv6 natively, but we can use a Ostinato &lt;a href=&quot;https://userguide.ostinato.org/user-script/&quot;&gt;protocol script&lt;/a&gt; to create the SRH.&lt;/p&gt;

&lt;p&gt;Let’s start with the SRv6 packet structure.&lt;/p&gt;

&lt;h2 id=&quot;srv6-packet-structure&quot;&gt;SRv6 Packet Structure&lt;/h2&gt;

&lt;p&gt;A SRv6 packet is a IPv6 packet with a SRv6 header (SRH) following the IPv6 header.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;+----------+------+-----+--------//-------+
| Ethernet | IPv6 | SRH |     Payload     |
+----------+------+-----+--------//-------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The SRH structure is specified in &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8754&quot;&gt;RFC8754&lt;/a&gt; as follows -&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 | Next Header   |  Hdr Ext Len  | Routing Type  | Segments Left |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |  Last Entry   |     Flags     |              Tag              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                                                               |
 |            Segment List[0] (128-bit IPv6 address)             |
 |                                                               |
 |                                                               |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                                                               |
 |                                                               |
 |                             ...
 |                                                               |
 |                                                               |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                                                               |
 |            Segment List[n] (128-bit IPv6 address)             |
 |                                                               |
 |                                                               |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //                                                             //
 //         Optional Type Length Value objects (variable)       //
 //                                                             //
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To create a SRv6 packet in Ostinato, follow these steps -&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Create a new stream and select the protocols &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mac | EthII | IPv6 | UDP | Payload&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Go to Advanced mode of selecting protocols and insert Userscript in between IPv6 and UDP&lt;/li&gt;
  &lt;li&gt;Configure other protocol fields (e.g. IPv6 src/dest) and stream fields (e.g. frame size)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/srv6/ostinato-srv6-headers.png&quot; alt=&quot;SRv6 Packet Headers&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;srv6-protocol-script&quot;&gt;SRv6 Protocol Script&lt;/h2&gt;

&lt;p&gt;Go to Protocol Data tab and enter the below script in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UserScript&lt;/code&gt; header.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sids&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;mh&quot;&gt;0x0001020304050607&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x08090a0b0c0d0e1f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mh&quot;&gt;0x0001020304050607&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x08090a0b0c0d0e2f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mh&quot;&gt;0x0001020304050607&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x08090a0b0c0d0e4f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mh&quot;&gt;0x0001020304050607&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x08090a0b0c0d0e4f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;mh&quot;&gt;0x0001020304050607&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x08090a0b0c0d0e5f&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;SRv6 SRH&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;protocolFrameSize&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;protocolId&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id_type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id_type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ProtocolIdIp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;43&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;protocolFrameValue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;segmentsLeft&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;tag&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xabcd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;pfv&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;protocolFrameSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// next header (8)&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;pfv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;payloadProtocolId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ProtocolIdIp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// hdr ext len (8)&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;pfv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 2 quad-words per SID&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// routing type (8)&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;pfv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// segments left (8)&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;pfv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;segmentsLeft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// last entry (8)&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;pfv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sids&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// flags (8)&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;pfv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Tag (16)&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;pfv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;tag&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xFF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;pfv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;tag&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xFF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;pfv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sids&lt;/code&gt; array to the list of SRv6 segments you want to use.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Each element in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sids&lt;/code&gt; array is a 128-bit IPv6 address&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tag&lt;/code&gt; is a 16-bit value that is used to identify the SRv6 packet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚜️ If you want to understand what the script does, see the &lt;a href=&quot;https://userguide.ostinato.org/user-script/&quot;&gt;Ostinato User-Script documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apply the stream changes and start transmitting the SRv6 packets.&lt;/p&gt;

&lt;h2 id=&quot;srv6-packet-verification&quot;&gt;SRv6 Packet Verification&lt;/h2&gt;

&lt;p&gt;To verify the SRv6 packets, start a packet capture and view them in Wireshark.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/srv6/wireshark-srv6-srh.png&quot; alt=&quot;Ostinato generated SRv6 in Wireshark&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You should see the SRv6 packets with the SRH and the segments.&lt;/p&gt;

&lt;p&gt;Something not as expected? Reach out to us.&lt;/p&gt;


    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/srv6-protocol-script&quot;&gt;How to create SRv6 traffic using Ostinato&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on October 23, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Labbing with Ostinato - Minus the VNC pain]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/virtual-lab-skip-vnc" />
  <id>https://ostinato.org/guides/virtual-lab-skip-vnc</id>
  <published>2025-09-09T00:00:00+00:00</published>
  <updated>2025-09-09T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;Ostinato’s primary mode of configuration and monitoring is through the GUI.&lt;/p&gt;

&lt;p&gt;When using Ostinato for labbing (irrespective of the labbing platform - GNS3, EVE-NG, CML, Containerlab, etc.), the GUI is displayed via VNC.&lt;/p&gt;

&lt;p&gt;While usable, the VNC experience can sometimes feel a bit - &lt;em&gt;wanting&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;you are not stuck with just VNC&lt;/strong&gt; - there’s another option.&lt;/p&gt;

&lt;p&gt;You can use Ostinato for Windows/MacOS GUI on your laptop and connect to the Ostinato node in the lab over the management network – thanks to the &lt;a href=&quot;https://userguide.ostinato.org/architecture/&quot;&gt;Ostinato controller-agent architecture&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;🛒 You may need to purchase a separate license for Ostinato on Windows or MacOS&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;This guide will show you how to use the Ostinato GUI on Windows/MacOS to configure, control and monitor the Ostinato nodes in your virtual lab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR - Connect the Ostinato node in your virtual lab to the external/mgmt network and then use Ostinato GUI on your Windows/MacOS laptop to access it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are detailed steps.&lt;/p&gt;

&lt;h2 id=&quot;step-1---connect-the-ostinato-node-to-the-host-network&quot;&gt;Step 1 - Connect the Ostinato node to the host network&lt;/h2&gt;

&lt;p&gt;Here are instructions to do so for all the supported labbing platforms.&lt;/p&gt;

&lt;h3 id=&quot;cml&quot;&gt;CML&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;External Connector&lt;/code&gt; node to the lab&lt;/li&gt;
  &lt;li&gt;Configure the just added &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ext-conn-0&lt;/code&gt; node to use bridge mode (not NAT mode)&lt;/li&gt;
  &lt;li&gt;Add a link betweeen the  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ext-conn-0&lt;/code&gt; node and the Ostinato node&lt;/li&gt;
  &lt;li&gt;Make sure to select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth0/mgmt&lt;/code&gt; interface on the Ostinato node for the link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/labbing-ext-gui/cml-external-network.png&quot; alt=&quot;CML External Connector to Ostinato GUI configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Start the lab, open the Ostinato console and run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ifconfig eth0&lt;/code&gt; to verify that the Ostinato node is assigned a DHCP IP address.&lt;/p&gt;

&lt;h3 id=&quot;eve-ng&quot;&gt;EVE-NG&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Add a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Network&lt;/code&gt; to the lab of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Management(Cloud0)&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Add a link betweeen the network node and the Ostinato node&lt;/li&gt;
  &lt;li&gt;Make sure to select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth0/mgmt&lt;/code&gt; interface on the Ostinato node for the link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/labbing-ext-gui/eveng-mgmt-network.png&quot; alt=&quot;EVE-NG External Connector to Ostinato GUI configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Start the lab, open the Ostinato console and run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ifconfig eth0&lt;/code&gt; to verify that the Ostinato node is assigned a DHCP IP address.&lt;/p&gt;

&lt;h3 id=&quot;gns3&quot;&gt;GNS3&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Add a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NAT&lt;/code&gt; node to the lab&lt;/li&gt;
  &lt;li&gt;Add a link betweeen the NAT node and the Ostinato node&lt;/li&gt;
  &lt;li&gt;Make sure to select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eth0/mgmt&lt;/code&gt; interface on the Ostinato node for the link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/labbing-ext-gui/gns3-nat-network.png&quot; alt=&quot;GNS3 NAT to Ostinato GUI configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Start the lab, connect to the Ostinato VNC, open a terminal and run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ifconfig eth0&lt;/code&gt; to verify that the Ostinato node is assigned a DHCP IP address.&lt;/p&gt;

&lt;h3 id=&quot;containerlab&quot;&gt;Containerlab&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Edit your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clab.yml&lt;/code&gt; file to add the below port mappings for the Ostinato node.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s&quot;&gt;. . .&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;topology&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nodes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ost&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;linux&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ostinato/ostinato:{tag}&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;5900:5900/tcp&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;7878:7878/tcp&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;binds&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;.:/root/shared&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;. . .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ul&gt;
  &lt;li&gt;Deploy the lab with the usual &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clab deploy&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Use VNC to connect to the Ostinato node using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;host-ip&amp;gt;:5900&lt;/code&gt; address – &lt;strong&gt;even if you plan to connect to the Ostinato node over the management network using a Windows/MacOS native GUI, you need to first connect via VNC&lt;/strong&gt; – this is due to the way Ostinato integration for containerlab is implemented&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;📛 To connect to the Containerlab Ostinato node from the GUI, &lt;strong&gt;use the Host’s IP address in the next step&lt;/strong&gt; - this is because we have mapped the container’s ports to the host ports&lt;/p&gt;

&lt;hr /&gt;

&lt;p class=&quot;notice--warning&quot;&gt;During lab deployment, if you see an error like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bind: address already in use&lt;/code&gt; - it means that the port 7878 is already in use. Maybe a native instance of Drone is running on the host or some other application on the host is using port 7878. You can change the port mapping to a different port e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8878:7878&lt;/code&gt; and redeploy the lab. With this mapping, you should use port &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8878&lt;/code&gt; when connecting from the GUI.&lt;/p&gt;

&lt;h2 id=&quot;step-2---connect-from-gui-to-the-ostinato-node&quot;&gt;Step 2 - Connect from GUI to the Ostinato node&lt;/h2&gt;

&lt;p&gt;Run a ping from your laptop to the Ostinato node to verify that the connection is working.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;🔁 If ping is not working - &lt;em&gt;troubleshoot this connectivity before proceeding&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Once you verify connectivity, use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;File | New PortGroup&lt;/code&gt; from the Ostinato GUI running on your laptop and enter the IP address of the Ostinato node.
You should see the Ostinato node in the Ostinato port list. The ports listed under the port group are the ports on the Ostinato node in your lab.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/labbing-ext-gui/ostinato-with-remote-agent.png&quot; alt=&quot;Ostinato labbing node in the Ostinato GUI&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can now use the Ostinato GUI on your laptop to configure, control and monitor the Ostinato node.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;🔥 If ping is working, but Ostinato GUI is not able to connect to the Ostinato node - check if the firewall is blocking TCP port 7878. If required, add a rule to allow traffic on this port.&lt;/p&gt;

&lt;hr /&gt;


    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/virtual-lab-skip-vnc&quot;&gt;Labbing with Ostinato - Minus the VNC pain&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on September 09, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[How to cheat and get more traffic tester ports]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/test-port-fan-out" />
  <id>https://ostinato.org/guides/test-port-fan-out</id>
  <published>2025-08-19T00:00:00+00:00</published>
  <updated>2025-08-19T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;Traffic generators and testers are great tools for testing network functionality and performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But they are expensive – some prohibitively so!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Network Testers and QA engineers have always found workarounds and solutions to get more bang for their buck and work with limited resources.&lt;/p&gt;

&lt;p&gt;One such ingenious solution is the &lt;a href=&quot;/guides/snake-test-for-l2-switch-using-ostinato&quot;&gt;Snake Test Topology&lt;/a&gt; to use just two traffic generator ports to &lt;strong&gt;test ALL 32 (or 48 or 96) ports of a switch at line rate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post explains another oldie but goodie solution to get more traffic generator and tester ports - using a switch as a port multiplexer to fan-out the traffic generator ports.&lt;/p&gt;

&lt;p&gt;The concept is simple - send VLAN-tagged traffic from a single traffic generator port to a switch trunk port; the switch demultiplexes the traffic based on the VLAN tag (1 VLAN tag = 1 switch port) and sends it out of the corresponding access port after stripping the VLAN tag. The switch ports are connected to the various devices under test.&lt;/p&gt;

&lt;p&gt;Here’s an example test topology using &lt;strong&gt;only 2 traffic generator ports to test a DSLAM AND 48 CPE devices&lt;/strong&gt; - from back in the day.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/test-port-fan-out/dslam-cpe-port-fan-out.png&quot; alt=&quot;DSLAM with 48 CPE devices Test Topology with Traffic Tester port fan-out&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This example can be easily extended to a PON or other FTTH deployment, even wireless APs and wifi routers! The concept remains just as applicable.&lt;/p&gt;

&lt;p&gt;Using a switch to multiplex and demultiplex test traffic is an effective way to get more traffic generator and tester ports without having to buy more hardware.&lt;/p&gt;

&lt;h2 id=&quot;limitations&quot;&gt;Limitations&lt;/h2&gt;

&lt;p&gt;Like every workaround, this approach has its limitations though.&lt;/p&gt;

&lt;h3 id=&quot;results&quot;&gt;Results&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Packet drops within the switch may affect the results&lt;/li&gt;
  &lt;li&gt;The single traffic generator port may not be able to break down the incoming aggregate traffic into individual VLANs to account for individual port stats&lt;/li&gt;
  &lt;li&gt;You may need to fetch statistics from the switch ports&lt;/li&gt;
  &lt;li&gt;Traffic passing through a switch introduces additional latency and potential jitter compared to direct connections&lt;/li&gt;
  &lt;li&gt;You may not be able to get latency/jitter stats for individual ports - you may only get aggregate stats for the switch trunk port&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;complexity&quot;&gt;Complexity&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;While VLAN configuration on the switch is simple, it is still additional configuration compared to direct port connections&lt;/li&gt;
  &lt;li&gt;Configuring multiple VLAN-tagged streams on a single traffic generator port makes it harder to manage and correlate which stream targets which port compared to using individual tester ports&lt;/li&gt;
  &lt;li&gt;The switch must be performant enough to handle the aggregate traffic from all access VLAN ports and the trunk port in both directions&lt;/li&gt;
  &lt;li&gt;Port related operations such as link state up/down, speed and duplex, etc. need to be done on the switch ports and not the traffic generator port - the traffic generator will be unaware of these changes&lt;/li&gt;
  &lt;li&gt;Existing scripting/automation frameworks may need to be modified to support this approach&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;debugging&quot;&gt;Debugging&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Troubleshooting becomes more complex when traffic is multiplexed through VLANs, making it harder to isolate issues&lt;/li&gt;
  &lt;li&gt;Correlating the traffic streams to the switch access ports is more complex than using individual tester ports&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;The port fan-out using a switch is a good workaround to get more test ports - but it is not without its limitations.&lt;/p&gt;

&lt;p&gt;One way to remove the limitations is to use affordable and cost-effective software traffic testers like Ostinato on COTS hardware with real full-featured traffic tester ports rather than having to work with an external switch and switch ports.&lt;/p&gt;

&lt;p&gt;Finally, we would be remiss if we didn’t mention that although Ostinato is much more economical than the competition, it may still be too expensive for someone. If so, you can use this same approach to fan-out Ostinato traffic generator ports!&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/test-port-fan-out&quot;&gt;How to cheat and get more traffic tester ports&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on August 19, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[How to persist Ostinato config in Containerlab]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/clab-persistence" />
  <id>https://ostinato.org/guides/clab-persistence</id>
  <published>2025-08-05T00:00:00+00:00</published>
  <updated>2025-08-05T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;When using &lt;a href=&quot;/pricing/clab&quot;&gt;Ostinato for Containerlab&lt;/a&gt;, you might want to save and restore your Ostinato session across lab restarts.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;This guide is specific for Containerlab.  See the &lt;a href=&quot;/guides/labbing-session&quot;&gt;guide for GNS3 EVE-NG or CML&lt;/a&gt; if you are using those platforms.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;As we know containers are ephemeral by design. When you destroy a container, all its data is lost.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Unless, you mount a host directory as a volume to the container!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here’s what you need to do in 4 easy steps.&lt;/p&gt;

&lt;h2 id=&quot;step-1---edit-clabyml-file&quot;&gt;Step 1 - Edit clab.yml file&lt;/h2&gt;
&lt;p&gt;Edit the Ostinato node section in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clab.yml&lt;/code&gt; file to add a volume mount (called bind in containerlab).&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s&quot;&gt;. . .&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;topology&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nodes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ost&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;linux&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ostinato/ostinato:{tag}&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;5900:5900/tcp&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;7878:7878/tcp&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;binds&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;.:/root/shared&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;. . .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The above bind configuration mounts the host current directory &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.&lt;/code&gt; as a volume to the container. Inside the container it can be accessed at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/root/shared&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Run (or restart) the lab with the usual &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clab (re)deploy&lt;/code&gt; command.&lt;/p&gt;

&lt;h2 id=&quot;step-2---configure-ostinato-and-save-session-file&quot;&gt;Step 2 - Configure Ostinato and save session file&lt;/h2&gt;

&lt;p&gt;Configure Ostinato using the GUI as usual.&lt;/p&gt;

&lt;p&gt;Then use &lt;em&gt;File | Save Session&lt;/em&gt; to save the Ostinato session configuration to a file. &lt;strong&gt;Make sure you save it in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/root/shared&lt;/code&gt; directory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/labbing-session/session-menu-items.png&quot; alt=&quot;Save Ostinato session configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you make further changes to the Ostinato session, you can save it again to the same file.&lt;/p&gt;

&lt;h2 id=&quot;step-3---destroy-lab-and-verify-session-file-is-saved&quot;&gt;Step 3 - Destroy lab and verify session file is saved&lt;/h2&gt;

&lt;p&gt;When you destroy the lab, the session file will remain saved on the host’s current directory - you can run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls&lt;/code&gt; to verify.&lt;/p&gt;

&lt;h2 id=&quot;step-4---run-lab-again-and-restore-session&quot;&gt;Step 4 - Run lab again and restore session&lt;/h2&gt;

&lt;p&gt;Next time you run the lab, use &lt;em&gt;File | Open Session&lt;/em&gt; from the Ostinato GUI to open the session file from the same &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/root/shared&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;All the Ostinato configuration will be restored.&lt;/p&gt;

&lt;p&gt;That’s all there is to it!&lt;/p&gt;

&lt;p&gt;You can now destroy and re-deploy your lab as many times as you want without losing your Ostinato session - &lt;em&gt;just remember to save the session file in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/root/shared&lt;/code&gt; directory&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A future Ostinato version will auto save the session configuration file so that you don’t have to remember to do it.&lt;/p&gt;


    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/clab-persistence&quot;&gt;How to persist Ostinato config in Containerlab&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on August 05, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[One node to test them all]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/one-node" />
  <id>https://ostinato.org/guides/one-node</id>
  <published>2025-07-22T00:00:00+00:00</published>
  <updated>2025-07-22T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;When creating lab topologies with multiple devices (nodes), we often see Ostinato users use multiple Ostinato nodes in the topology. Here’s an example &lt;a href=&quot;/guides/dmvpn&quot;&gt;DMVPN&lt;/a&gt; topology with multiple Ostinato nodes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/one-node/test-topo-multi-node.png&quot; alt=&quot;Example test topology with multiple Ostinato nodes&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For a traffic generator like Ostinato, this is not necessary. &lt;strong&gt;Not just unnecessary, it’s inconvenient&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This guides will explain what to do instead.&lt;/p&gt;

&lt;h2 id=&quot;single-ostinato-node&quot;&gt;Single Ostinato node&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;One ring to rule them all (Lord of the Rings, JRR Tolkien)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Just like the iconic one ring, you can use a single Ostinato node to test multiple devices in a lab topology (&lt;em&gt;unlike the one ring, the Ostinato node is not evil!&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;How to use a single Ostinato node?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use multiple ports on a single Ostinato node and connect each Ostinato test port to other devices&lt;/strong&gt; in the topology.&lt;/p&gt;

&lt;p&gt;The same topology above can be created with a single Ostinato node with 3 ports as shown below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/dmvpn/dmvpn-test-topo-one-node.png&quot; alt=&quot;Example test topology with one Ostinato node&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;advantages&quot;&gt;Advantages&lt;/h2&gt;
&lt;p&gt;The advantages of this approach is that you can use one single Ostinato GUI for your lab to do all the following -&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Configure all test ports with test devices and streams&lt;/li&gt;
  &lt;li&gt;Control (start/stop transmit and capture) on one or more test ports as required&lt;/li&gt;
  &lt;li&gt;Monitor the real-time traffic statistics and pkt/bit rates on all test ports&lt;/li&gt;
  &lt;li&gt;Use stream statistics to analyze packet drops, latency, jitter, etc.&lt;/li&gt;
  &lt;li&gt;Save and load the configuration of the node and all its ports as a single Ostinato session file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more switching between multiple GUIs - one for each Ostinato node! &lt;em&gt;Phew!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here’s a screenshot of the single Ostinato node GUI with multiple ports for this same topology.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/one-node/one-node-gui.png&quot; alt=&quot;Single Ostinato Node GUI&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To set helpful names like &lt;em&gt;Hub, Spoke A, Spoke B&lt;/em&gt; to each port, edit the &lt;a href=&quot;https://userguide.ostinato.org/port-config/&quot;&gt;port description&lt;/a&gt; to make it more meaningful and relevant to your lab and topology.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/one-node/edit-port-desc.png&quot; alt=&quot;Edit port description&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This makes it easier to identify the port and the test device it is connected to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using a single Ostinato node (with multiple ports) makes it easier to manage your lab and test traffic.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;topology-diagram&quot;&gt;Topology Diagram&lt;/h2&gt;

&lt;p&gt;One downside of using a single Ostinato node with multiple ports is that the topology diagram may become a bit messy and cluttered.&lt;/p&gt;

&lt;p&gt;Depending on what your labbing platform allows, you can do one or more of the following to make the diagram more readable -&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You can draw the Ostinato links so that it does not cross other nodes/links&lt;/li&gt;
  &lt;li&gt;You can hide the Ostinato links in the diagram&lt;/li&gt;
  &lt;li&gt;You can add multiple dummy nodes (shapes) to the topology to represent the endpoint nodes being emulated by the single Ostinato node&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;multiple-ostinato-nodes&quot;&gt;Multiple Ostinato nodes&lt;/h2&gt;

&lt;p&gt;Note that, you can still use multiple Ostinato nodes - if you want to. e.g. if you don’t have enough test ports on the single node.&lt;/p&gt;

&lt;p&gt;You can make managing multiple nodes easier by using a single Ostinato GUI externally and connecting to the Ostinato nodes over the management network.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/dmvpn/dmvpn-test-topo-multi-node.png&quot; alt=&quot;Example test topology with multiple Ostinato node managed by one GUI&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is better than multiple Ostinato GUIs and switching between them, but has limitations compared to a single Ostinato node e.g. you can’t do stream stats accounting between ports on different Ostinato nodes.&lt;/p&gt;

&lt;h2 id=&quot;how-does-a-single-node-with-multiple-ports-work&quot;&gt;How does a single node with multiple ports work?&lt;/h2&gt;
&lt;p&gt;If you are used to using multiple VPC (virtual PC) nodes or Linux nodes to act as hosts or iperf end-points to create lab topologies, you might be wondering how can a single Ostinato node with multiple ports with IP addresses on the same or different subnets work?&lt;/p&gt;

&lt;p&gt;The reason is that Ostinato does not use the OS networking stack. &lt;strong&gt;The IP addresses assigned using &lt;a href=&quot;https://userguide.ostinato.org/device-emulation/&quot;&gt;device emulation&lt;/a&gt; are not visible to the OS networking stack. Ostinato crafts packets and sends them out directly on the network interface bypassing the OS networking stack&lt;/strong&gt;. This makes Ostinato test traffic independent of the OS, network stack and IP addresses assigned to the interfaces by the OS.&lt;/p&gt;

&lt;p&gt;This also makes Ostinato test ports independent of each other.&lt;/p&gt;

&lt;p&gt;You might find this &lt;a href=&quot;/guides/iperf-vs-ostinato-arch&quot;&gt;comparison of iperf vs Ostinato&lt;/a&gt; architecture interesting reading.&lt;/p&gt;

&lt;p&gt;Do you have any suggestions to improve your Ostinato labbing experience? Let us know!&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/one-node&quot;&gt;One node to test them all&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on July 22, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Generate VLAN tagged traffic]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/vlans" />
  <id>https://ostinato.org/guides/vlans</id>
  <published>2025-07-15T00:00:00+00:00</published>
  <updated>2025-07-15T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;VLANs are quite fundamental in most networks today and a great solution for traffic isolation - e.g. to carry different types of traffic (web, VoIP etc.) on the same physical LAN infrastructure or isolate and identify tenants in multi-tenant WAN networks.&lt;/p&gt;

&lt;h2 id=&quot;vlan-tagged&quot;&gt;VLAN tagged&lt;/h2&gt;

&lt;p&gt;To craft and transmit VLAN tagged packets in Ostinato is easy.&lt;/p&gt;

&lt;p&gt;Just create a stream and when selecting protocols, set VLAN to &lt;em&gt;Tagged&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/vlans/tagged-vlan.png&quot; alt=&quot;VLAN Tagged protocol selection&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Next, in the &lt;em&gt;Protocol Data&lt;/em&gt; tab, set the VLAN Id and optionally other fields like &lt;em&gt;priority&lt;/em&gt; and &lt;em&gt;CFI/DEI&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/vlans/tagged-vlan-fields.png&quot; alt=&quot;VLAN fields&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That’s it!&lt;/p&gt;

&lt;h2 id=&quot;dual-vlan-aka-qinq&quot;&gt;Dual VLAN aka QinQ&lt;/h2&gt;

&lt;p&gt;For double tagged VLAN packets,  just select &lt;em&gt;Stacked&lt;/em&gt; instead of &lt;em&gt;Tagged&lt;/em&gt; in the VLAN selection and configure both VLANs under &lt;em&gt;Protocol Data&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/vlans/stacked-vlan.png&quot; alt=&quot;QinQ VLAN&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you want to use a different TPID for SVLAN, you can do that as well -&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/vlans/stacked-vlan-fields-custom-tpid.png&quot; alt=&quot;QinQ TPID&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;more-vlan-tags&quot;&gt;More VLAN Tags&lt;/h2&gt;

&lt;p&gt;Want more than 2 VLAN tags in the packet? We’ve got you covered!&lt;/p&gt;

&lt;p&gt;Switch to &lt;em&gt;Protocol Selection&lt;/em&gt; | &lt;em&gt;Advanced&lt;/em&gt; and insert multiple VLAN headers in the protocol stack between &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAC&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Eth II&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/vlans/3-vlan-tags.png&quot; alt=&quot;3 or more VLAN tags&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can configure values for all the VLAN tags as usual in the &lt;em&gt;Protocol Data&lt;/em&gt; tab.&lt;/p&gt;

&lt;h2 id=&quot;vlan-tagged-streams-with-device-emulation&quot;&gt;VLAN tagged streams with Device Emulation&lt;/h2&gt;

&lt;p&gt;If you are using emulated devices and VLAN tagged streams, ensure that &lt;strong&gt;the VLANs in the streams MUST match the VLANs used by the devices&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without the above matching, Ostinato will not be able to identify the source device for a stream and hence Source/Destination Mac resolution will fail (&lt;em&gt;you can still use fixed mac addresses in your stream&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;/guides/src-mac-resolve-failed&quot;&gt;Source MAC resolve failed&lt;/a&gt; and &lt;a href=&quot;/guides/traffic-not-reaching-destination&quot;&gt;traffic not reaching destination&lt;/a&gt; for troubleshooting.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;https://userguide.ostinato.org/device-emulation/#matching-streams-with-devices&quot;&gt;Matching Streams with Devices&lt;/a&gt; to understand how streams are matched with devices.&lt;/p&gt;

&lt;h2 id=&quot;multiple-vlans&quot;&gt;Multiple VLANs&lt;/h2&gt;

&lt;p&gt;If you want to generate VLAN tagged packets with varying VLAN values, you can use the &lt;em&gt;Variable Fields&lt;/em&gt; tab to generate VLAN IDs in incrementing, decrementing or random sequences.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/vlans/incrementing-vlans.png&quot; alt=&quot;Incrementing VLANs&quot; /&gt;&lt;/p&gt;

&lt;p&gt;💡 If you are generating incrementing/decrementing VLAN values, make sure you have the same varying sequence in the device group configuration too - &lt;em&gt;applicable only if using device emulation&lt;/em&gt;. A random sequence of VLANs will not work with device emulation - for obvious reasons.&lt;/p&gt;

&lt;p&gt;If something is not clear or if there is something more you want to do with VLANs, let us know!&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/vlans&quot;&gt;Generate VLAN tagged traffic&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on July 15, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Testing IMIX traffic with Ostinato]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/imix" />
  <id>https://ostinato.org/guides/imix</id>
  <published>2025-06-27T00:00:00+00:00</published>
  <updated>2025-06-27T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;h1 id=&quot;what-is-imix-traffic&quot;&gt;What is IMIX traffic?&lt;/h1&gt;

&lt;p&gt;IMIX (Internet Mix) is a standardized traffic pattern that simulates real-world internet traffic in a test environment. It consists of packets of different sizes mixed in specific proportions to represent typical internet traffic.&lt;/p&gt;

&lt;p&gt;The concept emerged from studying actual internet traffic patterns and creating a simplified model that could be used for testing network devices and applications.&lt;/p&gt;

&lt;h1 id=&quot;why-is-imix-traffic-important&quot;&gt;Why is IMIX traffic important?&lt;/h1&gt;

&lt;p&gt;Network testing with fixed-size packets doesn’t reflect real-world conditions. Here’s why IMIX matters:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Real-world simulation&lt;/strong&gt;: Internet traffic consists of various packet sizes - from small TCP ACKs to large data transfers&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Better performance metrics&lt;/strong&gt;: Testing with IMIX provides more accurate throughput and latency measurements&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Device stress testing&lt;/strong&gt;: Different packet sizes stress different components of network devices. See &lt;a href=&quot;/guides/ethernet-packet-size-and-throughput&quot;&gt;how packet size affects throughput&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Network planning&lt;/strong&gt;: IMIX helps in capacity planning and network design decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can use IMIX when running &lt;a href=&quot;/guides/bandwidth-testing-with-ostinato&quot;&gt;bandwidth tests with Ostinato&lt;/a&gt; to simulate real-world traffic across a circuit.&lt;/p&gt;

&lt;h1 id=&quot;imix-traffic-profiles&quot;&gt;IMIX traffic profiles&lt;/h1&gt;

&lt;p&gt;While IMIX is widely used in the networking industry, it’s important to note that it’s a de-facto standard, not a de-jure one. This means it evolved through common usage rather than formal standardization.&lt;/p&gt;

&lt;h2 id=&quot;standard-imix&quot;&gt;Standard IMIX&lt;/h2&gt;

&lt;p&gt;The most common IMIX profile uses a 7:4:1 packet ratio. In Ostinato, we use -&lt;/p&gt;

&lt;table class=&quot;table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Packet Size&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;No of Packets&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Percentage&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;64&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;7&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;58.33%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;594&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;33.33%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1518&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;8.33%&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;While this packet ratio (7:4:1) is commonly used across the industry, there can be variations in the packet sizes and load distribution among different vendors.&lt;/p&gt;

&lt;p&gt;These variations in packet sizes don’t significantly impact test results as long as you&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Document which profile you’re using&lt;/li&gt;
  &lt;li&gt;Use the same profile consistently across your tests&lt;/li&gt;
  &lt;li&gt;Account for the differences when comparing results across different tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can create your own profile also if that better suits your needs.&lt;/p&gt;

&lt;h2 id=&quot;imix-genome&quot;&gt;IMIX Genome&lt;/h2&gt;

&lt;p&gt;The IMIX genome concept, introduced in &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc6985&quot;&gt;RFC 6985&lt;/a&gt;, provides a standardized way to specify the exact repeating sequence of packet sizes in a test. The genome notation uses letters to represent standard packet sizes.&lt;/p&gt;

&lt;table class=&quot;table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Size (Bytes)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Genome Code Letter&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;64&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;a&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;128&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;b&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;256&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;c&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;512&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;d&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1024&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;e&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1280&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;f&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1518&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;g&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2112&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;h&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;9000&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;i&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;16000&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;j&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;MTU&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;z&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;For example, a sequence of three 64-byte packets followed by two 1280-byte packets and one 1518-byte packet would be written as&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IMIX - aaaffg&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This notation ensures test conditions can be precisely documented and reproduced.&lt;/p&gt;

&lt;h1 id=&quot;generating-imix-with-ostinato&quot;&gt;Generating IMIX with Ostinato&lt;/h1&gt;

&lt;h2 id=&quot;generating-standard-imix&quot;&gt;Generating standard IMIX&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/imix/std-imix-config.png&quot; alt=&quot;Ostinato IMIX Stream Configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ostinato makes it incredibly easy to generate standard IMIX traffic&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Create a new stream&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Frame Length&lt;/strong&gt; section, simply select &lt;em&gt;IMIX&lt;/em&gt; from the dropdown&lt;/li&gt;
  &lt;li&gt;Under &lt;strong&gt;Stream Control&lt;/strong&gt; section, set the stream to &lt;em&gt;Goto first&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Configure other stream parameters as needed&lt;/li&gt;
  &lt;li&gt;Start transmission&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;generating-other-imix-profiles&quot;&gt;Generating other IMIX profiles&lt;/h2&gt;

&lt;p&gt;For custom IMIX profiles, follow these steps&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Set the port &lt;em&gt;Transmit Mode&lt;/em&gt; to &lt;em&gt;Interleaved&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Create a stream for the first packet size&lt;/li&gt;
  &lt;li&gt;Set the appropriate frame length for the stream&lt;/li&gt;
  &lt;li&gt;Configure packet rate to the number of packets of that size per second&lt;/li&gt;
  &lt;li&gt;Configure other stream parameters as needed&lt;/li&gt;
  &lt;li&gt;Duplicate the stream for other packet sizes in the profile&lt;/li&gt;
  &lt;li&gt;Edit the duplicated streams to change the frame length and packet rate appropriately&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After configuring all the streams, you will notice that the port’s aggregate packet rate is the sum of all the stream packet rates - which would be very low.&lt;/p&gt;

&lt;p&gt;You can change it to the desired rate by changing the port’s aggregate packet rate - &lt;strong&gt;the packet ratio for the streams will still be maintained&lt;/strong&gt;. &lt;em&gt;Do not change the individual stream packet rates - only the port’s aggregate packet rate!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IMIX - aaaffg&lt;/code&gt;, here’s the stream configuration that you should configure -&lt;/p&gt;

&lt;table class=&quot;table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Stream&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Frame Length&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Packet Rate&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;64&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3 packets/sec&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1280&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2 packets/sec&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1518&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1 packets/sec&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;After configuring the streams to the above mentioned values, the port’s aggregate packet rate will display &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;6.000 pps&lt;/code&gt; (3+2+1). You can change it to any other value – &lt;em&gt;the packet ratio for the streams will still be maintained. &lt;strong&gt;Do not change the individual stream packet rates - only the port’s aggregate packet rate&lt;/strong&gt;!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/imix/custom-imix-aaaffg.png&quot; alt=&quot;Ostinato Custom IMIX - aaaffg&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;how-to-verify-imix&quot;&gt;How to verify IMIX?&lt;/h1&gt;

&lt;p&gt;To verify your IMIX traffic pattern:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Capture traffic&lt;/strong&gt; using Wireshark or similar tools&lt;/li&gt;
  &lt;li&gt;Use &lt;strong&gt;Wireshark Statistics&lt;/strong&gt; &amp;gt; &lt;strong&gt;Packet Lengths&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Compare the distribution with your intended IMIX profile&lt;/li&gt;
  &lt;li&gt;Look for any anomalies in the distribution&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/imix/imix-verify.png&quot; alt=&quot;Wireshark IMIX Verification&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Notice that the packet lengths shown in Wireshark statistics are for ranges of packet sizes and not the exact packet sizes.&lt;/p&gt;

&lt;p&gt;If you need to verify the exact packet sizes, you can use the following  bash script - the script uses&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tshark&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Also, packet captures by Wireshark and other tools typically don’t include the 4-byte FCS (Frame Check Sequence) in the packet length. So the script adjusts the packet length by subtracting 4 from the packet length.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Usage: ./imix_count.sh capture.pcap&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Bash script to count packets by size (adjusted for FCS) and compute percentages&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$# &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ne&lt;/span&gt; 1 &lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Usage: &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &amp;lt;pcap_file&amp;gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;1
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Uncomment to debug&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#set -x&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;PCAP_FILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;SIZES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=(&lt;/span&gt;64 594 1518&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;declare&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; COUNTS

&lt;span class=&quot;nv&quot;&gt;TOTAL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0
&lt;span class=&quot;nv&quot;&gt;TSHARK&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;tshark

&lt;span class=&quot;c&quot;&gt;# First pass: count packets per size (adjusted for FCS)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;SIZE &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SIZES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ADJ_SIZE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;SIZE &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# Adjust for FCS&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TSHARK&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PCAP_FILE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-Y&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;frame.len == &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ADJ_SIZE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;wc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
    COUNTS[&lt;span class=&quot;nv&quot;&gt;$SIZE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COUNT&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;TOTAL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;TOTAL &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; COUNT&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done

&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$TOTAL&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-eq&lt;/span&gt; 0 &lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;No matching packets found.&quot;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;0
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Output: count and percentage on same line&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;%8s %10s %8s&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Size(B)&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Count&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Percentage&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;------------------------------------&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;SIZE &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SIZES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[@]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COUNTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;PCT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;scale=2; 100 * &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COUNT&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; / &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TOTAL&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; | bc&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;%8s %10s %8s%%&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SIZE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COUNT&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PCT&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SIZES&lt;/code&gt; array to the packet sizes you want to verify.&lt;/p&gt;

&lt;p&gt;Here’s a sample output -&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;./imix-count.sh imix-capture.pcap
&lt;span class=&quot;go&quot;&gt; Size(B)      Count Percentage
------------------------------------
      64       6923    58.33%
     594       3956    33.33%
    1518        989     8.33%
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Remember to capture a significant number of packets to get statistically meaningful results!&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/imix&quot;&gt;Testing IMIX traffic with Ostinato&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on June 27, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Test slow traffic rates to avoid big problems]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/slow-traffic-rates" />
  <id>https://ostinato.org/guides/slow-traffic-rates</id>
  <published>2025-06-10T00:00:00+00:00</published>
  <updated>2025-06-10T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;When testing network devices, we focus on the high speed traffic rates (10Gps or more) for performance and QOS testing and low speed traffic rates like 100 or 1000 packets per second (pps) for functional testing.&lt;/p&gt;

&lt;p&gt;What’s often overlooked is testing with extremely slow rates. Rates at which protocol keep-alives time out leading to an uintended state machine transition (&lt;em&gt;think BGP marking a peer as down due to lack of timely keepalives&lt;/em&gt;). Multi-player online games often require a minimum traffic rate to maintain state in the server. ARP aging may cause traffic drops. Mac aging may cause L2 floods. Policers and shapers may perform incorrectly at low rates due to the nature of their algo. DHCP request timeouts may cause the device going offline.&lt;/p&gt;

&lt;p&gt;You get the idea.&lt;/p&gt;

&lt;p&gt;But it’s not just about negative testing.&lt;/p&gt;

&lt;p&gt;There’s a whole class of IEEE 802.3 slow protocols designed to operate at a fixed, slow rate of 1 packet every 30 seconds or so. Some examples of these protocols are -&lt;/p&gt;

&lt;table class=&quot;table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Protocol&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
      &lt;th&gt;Typical Traffic Rate&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Link Aggregation Control Protocol (LACP)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Used to automatically negotiate and manage link aggregation (port channels)&lt;/td&gt;
      &lt;td&gt;1 packet/sec (fast mode)&lt;br /&gt;1 packet/30 sec (normal mode)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Link Layer Discovery Protocol (LLDP)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Helps network devices discover and advertise their capabilities to neighbors&lt;/td&gt;
      &lt;td&gt;1 packet/30 sec&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Operation, Administration, and Maintenance (OAM)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Provides link monitoring and remote fault indication&lt;/td&gt;
      &lt;td&gt;1 packet/sec&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Port Authentication (802.1X)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Handles port-based network access control&lt;/td&gt;
      &lt;td&gt;1 packet/30 sec during authentication&lt;br /&gt;1 packet/60 sec for keep-alive&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;These protocols are deliberately designed to operate at slow rates to minimize their impact on network bandwidth while still maintaining critical network functions.&lt;/p&gt;

&lt;h2 id=&quot;testing-slow-protocols-with-ostinato&quot;&gt;Testing Slow Protocols with Ostinato&lt;/h2&gt;

&lt;p&gt;Apart from generating high speed traffic (&lt;em&gt;100Gbps or even faster!&lt;/em&gt;), Ostinato can generate traffic at very low rates too. This is useful for scenarios like -&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Testing slow protocol implementations&lt;/li&gt;
  &lt;li&gt;Verifying protocol state machines at boundary conditions&lt;/li&gt;
  &lt;li&gt;Validating timeout behavior&lt;/li&gt;
  &lt;li&gt;Stress testing protocol handlers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To configure Ostinato to generate slow traffic rates, you need to set the paccket rate (packets/sec) to a decimal value &amp;lt; 1.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/slow-rates/ostinato-slow-rate.png&quot; alt=&quot;Ostinato slow traffic rate configuration&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To calculate slow traffic rates, use the below formula -&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Packet Rate = 1 / (Time between packets in seconds)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here are some examples -&lt;/p&gt;

&lt;table class=&quot;table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Rate&lt;/th&gt;
      &lt;th&gt;Calculation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1 packet/sec&lt;/td&gt;
      &lt;td&gt;1 / 1 = 1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1 packet every 30 sec&lt;/td&gt;
      &lt;td&gt;1 / 30 = 0.0333&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1 packet every 60 sec&lt;/td&gt;
      &lt;td&gt;1 / 60 = 0.0167&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1 packet every 5 minutes&lt;/td&gt;
      &lt;td&gt;1 / (5 * 60) = 0.0033&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1 packet every hour&lt;/td&gt;
      &lt;td&gt;1 / (60 * 60) = 0.000278&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;best-practices-for-slow-rate-testing&quot;&gt;Best Practices for Slow Rate Testing&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Duration Matters&lt;/strong&gt;: Run tests long enough to observe timeout behaviors (hours or days)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Background Traffic&lt;/strong&gt;: Consider mixing slow protocol traffic with regular traffic&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Resource Monitoring&lt;/strong&gt;: Watch for memory leaks that only appear with long-running sessions&lt;/li&gt;
&lt;/ul&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/slow-traffic-rates&quot;&gt;Test slow traffic rates to avoid big problems&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on June 10, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Extending Ostinato with Linux Virtual Interfaces]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/linux-virtual-network-interfaces" />
  <id>https://ostinato.org/guides/linux-virtual-network-interfaces</id>
  <published>2025-05-21T00:00:00+00:00</published>
  <updated>2025-05-21T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Linux has a unique way of implementing some network protocols, especially tunneling protocols, as virtual network interfaces. This approach provides a unified way to configure and test various protocols using standard Linux networking tools.&lt;/p&gt;

&lt;p&gt;In this post, we’ll explore this concept and show how to use these interfaces with Ostinato to test various protocols that are not natively supported by Ostinato.&lt;/p&gt;

&lt;h2 id=&quot;understanding-linux-virtual-network-interfaces&quot;&gt;Understanding Linux Virtual Network Interfaces&lt;/h2&gt;

&lt;p&gt;In Linux, many network protocols are implemented as virtual network interfaces rather than just protocol stacks. This means protocols like MACsec, IPsec, VXLAN, and others appear as regular network interfaces in the system. You can configure them using the standard &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ip&lt;/code&gt; command with protocol specific parameters.&lt;/p&gt;

&lt;p&gt;This approach offers several advantages for network testing.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Protocols appear as standard Linux network interfaces&lt;/li&gt;
  &lt;li&gt;Use existing Linux networking commands&lt;/li&gt;
  &lt;li&gt;Easy integration with other networking features&lt;/li&gt;
  &lt;li&gt;Test protocols in a more realistic environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some of the protocols implemented as virtual interfaces in the Linux kernel (Run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;man ip-link&lt;/code&gt; and look for the allowed values for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;type&lt;/code&gt; param to see the full list) -&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Tunneling Protocols&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;IPIP&lt;/strong&gt; - IP-in-IP tunneling&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;SIT&lt;/strong&gt; - IPv6-in-IPv4 tunneling&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;GRE&lt;/strong&gt; - Generic Routing Encapsulation&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;VXLAN&lt;/strong&gt; - Virtual Extensible LAN&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;GTP&lt;/strong&gt; - GPRS Tunneling Protocol&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Geneve&lt;/strong&gt; - Generic Network Virtualization Encapsulation&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Security Protocols&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;MACsec&lt;/strong&gt; (802.1AE) - MAC-layer security&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Container/Virtualization Networking&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;IPVLAN&lt;/strong&gt; - Lightweight L2 container networking&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;MACVLAN&lt;/strong&gt; - Multiple MAC addresses on single interface&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;VETH&lt;/strong&gt; - Virtual Ethernet pairs&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;TAP/TUN&lt;/strong&gt; - Virtual network devices&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Industrial Protocols&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;HSR/PRP&lt;/strong&gt; - High-availability Seamless Redundancy/Parallel Redundancy Protocol&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Bridging and Aggregation&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Bridge&lt;/strong&gt; - Network bridging&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Bonding&lt;/strong&gt; - &lt;a href=&quot;https://ostinato.org/guides/how-to-setup-link-aggregation-on-linux&quot;&gt;Link aggregation&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;VLAN&lt;/strong&gt; - Virtual LAN interface&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Special Purpose&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Dummy&lt;/strong&gt; - Dummy network interface&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since these are virtual interfaces, they are typically ‘stacked’ on top of a physical interface. For example, a MACsec interface is typically stacked on top of a physical interface like eth0.&lt;/p&gt;

&lt;p&gt;Depending on the protocol, the virtual interface may either be an ethernet interface (e.g. macsec) or an IP interface (e.g. GTP).&lt;/p&gt;

&lt;p&gt;The tunneling and security protocols also typically have a similar peer. The peer would be stacked similarly if it is running Linux or can be a vendor device with their own proprietary protocol stack.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/linux-virt-intf/stacked-virt-intf.png&quot; alt=&quot;Linux Virtual Interface stacking&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;how-to-use-virtual-network-interfaces-with-ostinato&quot;&gt;How to use Virtual Network Interfaces with Ostinato&lt;/h2&gt;

&lt;p&gt;Since the virtual interfaces are standard Linux interfaces, Ostinato will list them in its port list. Both the virtual interface and the physical interface would appear in Ostinato’s port list.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/linux-virt-intf/ostinato-intf-list.png&quot; alt=&quot;Ostinato Interface List shows both virtual and physical interfaces&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You MUST &lt;strong&gt;configure traffic streams on the virtual interface&lt;/strong&gt; (&lt;em&gt;NOT the physical interface&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;If the virtual interface is an ethernet interface, you can create standard ethernet streams.&lt;/p&gt;

&lt;p&gt;However, if the virtual interface is an IP interface, you can create a standard Ethernet/IP stream and then using the &lt;em&gt;Advanced Protocol Selection&lt;/em&gt; mode, remove the Ethernet header so that the packet starts directly from the IP header.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/linux-virt-intf/ostinato-ip-stream.gif&quot; alt=&quot;Creating non-Ethernet IP streams using Ostinato&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-about-the-protocol-headers&quot;&gt;What about the protocol headers?&lt;/h2&gt;

&lt;p&gt;The Linux virtual interface will take care of adding the protocol specific headers for you. That’s why you just need to configure an Ethernet or IP stream on the virtual interface.&lt;/p&gt;

&lt;p&gt;That’s the beauty of this approach - you can use the same topology and approach for all these protocols that are implemented as Linux Virtual Network Interfaces.&lt;/p&gt;

&lt;h2 id=&quot;example-using-macsec-interface-with-ostinato&quot;&gt;Example: Using MACsec Interface with Ostinato&lt;/h2&gt;

&lt;p&gt;Let’s look at a practical example using MACsec.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Create MACsec Interface&lt;/strong&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ip &lt;span class=&quot;nb&quot;&gt;link &lt;/span&gt;add &lt;span class=&quot;nb&quot;&gt;link &lt;/span&gt;eth0 macsec0 &lt;span class=&quot;nb&quot;&gt;type &lt;/span&gt;macsec
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ip &lt;span class=&quot;nb&quot;&gt;link set &lt;/span&gt;macsec0 up
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Configure MACsec Parameters&lt;/strong&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ip macsec add macsec0 tx sa 0 pn 1 on key 01 0123456789abcdef0123456789abcdef
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ip macsec add macsec0 rx address &amp;lt;peer-mac-address&amp;gt; port 1 sa 0 pn 1 on key 01 0123456789abcdef0123456789abcdef
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Configure Ostinato Stream&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;macsec0&lt;/code&gt; interface in the Ostinato GUI&lt;/li&gt;
      &lt;li&gt;Create a standard Ethernet stream - don’t worry about macsec header, the macsec interface will add it&lt;/li&gt;
      &lt;li&gt;Set up rest of the stream protocols and rates as needed&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Create and configure the peer&lt;/strong&gt;
If the DUT is the macsec peer, you can proceed to running the test. However, if the DUT is a middle box, you must create a similar MACsec interface on the peer side.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Run Test&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Start traffic generation&lt;/li&gt;
      &lt;li&gt;Monitor interface statistics&lt;/li&gt;
      &lt;li&gt;Verify MACsec encryption/decryption&lt;/li&gt;
      &lt;li&gt;Check for any errors&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;extending-to-other-protocols&quot;&gt;Extending to Other Protocols&lt;/h2&gt;

&lt;p&gt;The same topology and approach can be used for other protocols implemented as virtual interfaces. Here are some key considerations:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Protocol-specific Requirements&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Some protocols may require specific kernel modules&lt;/li&gt;
      &lt;li&gt;Each protocol has specific configuration parameters (check the man page for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ip link&lt;/code&gt;)&lt;/li&gt;
      &lt;li&gt;Each protocol has their own specific headers&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Common Testing Parameters&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Frame size/MTU&lt;/li&gt;
      &lt;li&gt;Traffic rate&lt;/li&gt;
      &lt;li&gt;Protocol-specific fields&lt;/li&gt;
      &lt;li&gt;Error conditions&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Monitoring and Validation&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Interface statistics&lt;/li&gt;
      &lt;li&gt;Protocol-specific counters&lt;/li&gt;
      &lt;li&gt;Error rates&lt;/li&gt;
      &lt;li&gt;Performance metrics&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;open-source-projects&quot;&gt;Open-source projects&lt;/h2&gt;

&lt;p&gt;Beyond the Linux kernel, there are also many open source projects that implement other protocols and applications as virtual interfaces. Some examples are -&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.strongswan.org/&quot;&gt;StrongSWAN&lt;/a&gt; - IPsec&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/aligungr/UERANSIM&quot;&gt;UERANSIM&lt;/a&gt; - 5G RAN&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.srslte.com/&quot;&gt;srsRAN&lt;/a&gt; - 4G/5G RAN&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.wireguard.com/&quot;&gt;Wireguard&lt;/a&gt; - VPN&lt;/li&gt;
  &lt;li&gt;and others&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These could also be used along with Ostinato with a similar approach.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/linux-virtual-network-interfaces&quot;&gt;Extending Ostinato with Linux Virtual Interfaces&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on May 21, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Testing DMVPN with Ostinato]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/dmvpn" />
  <id>https://ostinato.org/guides/dmvpn</id>
  <published>2025-05-13T00:00:00+00:00</published>
  <updated>2025-05-13T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;h1 id=&quot;what-is-dmvpn&quot;&gt;What is DMVPN?&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;DMVPN (Dynamic Multipoint VPN)&lt;/strong&gt; is a Cisco-developed solution that creates a secure, scalable overlay network. It combines the benefits of &lt;strong&gt;IPSec VPN&lt;/strong&gt; and &lt;strong&gt;mGRE (Multipoint Generic Routing Encapsulation)&lt;/strong&gt; tunnels.&lt;/p&gt;

&lt;p&gt;DMVPN solves several challenges in traditional VPN deployments:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Dynamic tunnel establishment&lt;/strong&gt;: Tunnels are created on-demand between sites&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Spoke-to-spoke communication&lt;/strong&gt;: Direct communication between branch offices without going through the hub&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Zero-touch deployment&lt;/strong&gt;: New sites can join the network without manual configuration&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Supports hundreds or thousands of sites with minimal configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A typical DMVPN network has three components:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Hub&lt;/strong&gt;: The central router that maintains the control plane&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Spokes&lt;/strong&gt;: Branch office routers that connect to the hub&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;NHRP (Next Hop Resolution Protocol)&lt;/strong&gt;: Manages the dynamic mapping of tunnel endpoints&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;DMVPN operates in three phases:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Phase 1&lt;/strong&gt;: All traffic flows through the hub (hub-and-spoke)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Phase 2&lt;/strong&gt;: Direct spoke-to-spoke tunnels with hub routing&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Phase 3&lt;/strong&gt;: Direct spoke-to-spoke tunnels with spoke routing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture makes DMVPN ideal for large-scale enterprise networks. It provides &lt;strong&gt;flexibility&lt;/strong&gt;, &lt;strong&gt;scalability&lt;/strong&gt;, and &lt;strong&gt;efficient bandwidth utilization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here’s a DMVPN topology (picture courtesy Cisco)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/dmvpn/dmvpn-topology.jpg&quot; alt=&quot;DMVPN Topology&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;test-topology&quot;&gt;Test topology&lt;/h1&gt;

&lt;p&gt;To test DMVPN, we extend the above topology by connecting Ostinato to the LAN side of the hub and spoke routers.&lt;/p&gt;

&lt;p&gt;If you are labbing this, you can use a &lt;strong&gt;single Ostinato node with multiple links&lt;/strong&gt; as shown below - this will make it easier to see all traffic in a single GUI with all 3 ports.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/dmvpn/dmvpn-test-topo-one-node.png&quot; alt=&quot;DMVPN Topology&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you are testing this in production or a geographically distributed environment, you can use &lt;strong&gt;multiple Ostinato drone agents&lt;/strong&gt; as shown below. All the ostinato drone agents are managed by a single Ostinato GUI controller over a out-of-band management network.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/dmvpn/dmvpn-test-topo-multi-node.png&quot; alt=&quot;DMVPN Topology&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you don’t have out-of-band management access to the hosts running the drone agents, you can run both the Ostinato GUI controller and the drone agent on each node - you will have 3 Ostinato GUI windows - one per node.&lt;/em&gt;&lt;/p&gt;

&lt;h1 id=&quot;test-configuration&quot;&gt;Test Configuration&lt;/h1&gt;

&lt;p&gt;Since the Ostinato node(s) are connected to the LAN side of the routers, we don’t need to worry about the WAN side of the DMVPN and the overlay/underlay IP addresses.&lt;/p&gt;

&lt;p&gt;Configure an &lt;a href=&quot;https://userguide.ostinato.org/device-emulation/&quot;&gt;emulated device&lt;/a&gt; on each of those ports on the Ostinato side. Here’s an example for the Ostinato ethernet port connected to Spoke A -&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/dmvpn/dmvpn-ostinato-device-spoke-a.png&quot; alt=&quot;Emulated Device on Spoke A&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Configure similar devices on the other Ostinato ports/nodes with the appropriate IP addresses.&lt;/p&gt;

&lt;p&gt;Then create IP traffic streams on each port towards the Hub and other Spoke. e.g. for the Ostinato ethernet port connected to Spoke A, create two streams -&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Stream 1 (&lt;em&gt;Spoke A to Hub&lt;/em&gt;): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.1.100&lt;/code&gt; –&amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.0.100&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Stream 2 (&lt;em&gt;Spoke A to Spoke B&lt;/em&gt;): &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.1.100&lt;/code&gt; –&amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.2.100&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can create similar streams for other spoke-spoke and spoke-hub pairs.&lt;/p&gt;

&lt;p&gt;To test the DMVPN, send the traffic streams and verify that the DMVPN is working correctly - use the Ostinato port stats window and monitor the traffic rates on the TX and RX ports -&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/dmvpn/dmvpn-ostinato-port-stats.png&quot; alt=&quot;Ostinato Port Stats&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can also use &lt;a href=&quot;https://userguide.ostinato.org/stream-stats/&quot;&gt;per-stream statistics&lt;/a&gt; if exact packet loss, latency/jitter is of interest.&lt;/p&gt;

&lt;h1 id=&quot;test-scenarios&quot;&gt;Test Scenarios&lt;/h1&gt;

&lt;p&gt;Here are some important scenarios to test your DMVPN setup:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Initial Tunnel Establishment&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Verify direct spoke-to-spoke tunnel creation&lt;/li&gt;
      &lt;li&gt;Measure tunnel setup time&lt;/li&gt;
      &lt;li&gt;Check packet loss during tunnel establishment&lt;/li&gt;
      &lt;li&gt;Verify NHRP registration and resolution&lt;/li&gt;
      &lt;li&gt;Monitor IPsec SA establishment&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Phase Transition Testing&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Test Phase 1 hub-and-spoke operation&lt;/li&gt;
      &lt;li&gt;Verify Phase 2 direct tunnel creation&lt;/li&gt;
      &lt;li&gt;Validate Phase 3 routing capabilities&lt;/li&gt;
      &lt;li&gt;Check NHRP shortcuts and routing table updates&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Failover Testing&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Simulate WAN link failure between spokes&lt;/li&gt;
      &lt;li&gt;Verify traffic fallback to hub-and-spoke mode&lt;/li&gt;
      &lt;li&gt;Test recovery when direct tunnel is restored&lt;/li&gt;
      &lt;li&gt;Monitor NHRP cache timeout behavior&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Performance Testing&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Measure throughput with different packet sizes&lt;/li&gt;
      &lt;li&gt;Test with mixed TCP and UDP traffic&lt;/li&gt;
      &lt;li&gt;Check latency and jitter using stream statistics&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scale Testing&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Add multiple spoke sites gradually&lt;/li&gt;
      &lt;li&gt;Monitor hub resource utilization&lt;/li&gt;
      &lt;li&gt;Test maximum number of concurrent tunnels&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;QoS and MTU&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Test with different DSCP markings&lt;/li&gt;
      &lt;li&gt;Verify large packets and fragmentation&lt;/li&gt;
      &lt;li&gt;Check QoS prioritization across tunnels&lt;/li&gt;
      &lt;li&gt;Account for IPsec and GRE overhead in MTU&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;


    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/dmvpn&quot;&gt;Testing DMVPN with Ostinato&lt;/a&gt; was originally published by Ostinato at &lt;a href=&quot;https://ostinato.org&quot;&gt;Ostinato Traffic Generator for Network Engineers&lt;/a&gt; on May 13, 2025.&lt;/p&gt;
  </content>
</entry>

</feed>