<?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-03-06T14:53:53+00:00</updated>
<id>https://ostinato.org/</id>
<author>
  <name>Ostinato</name>
  <uri>https://ostinato.org/</uri>
  
</author>


<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>


<entry>
  <title type="html"><![CDATA[Testing a home router]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/home-router" />
  <id>https://ostinato.org/guides/home-router</id>
  <published>2025-04-29T00:00:00+00:00</published>
  <updated>2025-04-29T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;h1 id=&quot;home-router&quot;&gt;Home Router&lt;/h1&gt;
&lt;p&gt;A typical home router consists of a bunch of wired and wireless ports towards the LAN and one port towards the WAN connected to the service provider.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/home-router/home-router.png&quot; alt=&quot;Home Router&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The LAN ports are typically 100/1000M Ethernet and 802.11 Wireless.&lt;/p&gt;

&lt;p&gt;The WAN port depends on the last mile technology used by the service provider e.g. DSL, PON or Fibre and sometimes even Ethernet.&lt;/p&gt;

&lt;p&gt;Internally the home router consists largely of two major forwarding blocks - a Bridge to forward traffic between the LAN devices and a NAT to exchange traffic from the LAN devices and the Internet.&lt;/p&gt;

&lt;p&gt;The LAN side bridge also has a companion DHCP server to allocate IP addresses to the devices connected to the LAN ports.&lt;/p&gt;

&lt;p&gt;The WAN side has a companion DHCP client to request and receive an IP address from the service provider.&lt;/p&gt;

&lt;h1 id=&quot;testing-the-home-router&quot;&gt;Testing the home router&lt;/h1&gt;
&lt;p&gt;To verify the functionality of the router, you can use the following test topology with Ostinato running on a PC or server acting as the traffic tester.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/home-router/test-topology.png&quot; alt=&quot;Test Topology&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If the traffic tester supports only Ethernet and WiFi ports, you will need to connect suitable equipment like DSLAM or OLT/ONU between the WAN port and the traffic tester Ethernet port to convert the WAN Traffic to Ethernet.&lt;/p&gt;

&lt;h2 id=&quot;ip-address-configuration&quot;&gt;IP address configuration&lt;/h2&gt;

&lt;p&gt;By default, the home router will use DHCP to acquire an IP address from the service provider and assign local IP addresses to the LAN ports.&lt;/p&gt;

&lt;p&gt;However, Ostinato currently does not support DHCP and you will need to use the &lt;a href=&quot;https://userguide.ostinato.org/device-emulation/&quot;&gt;Ostinato device emulation feature&lt;/a&gt; to manually configure the IP addresses of the devices manually.&lt;/p&gt;

&lt;p&gt;A sample configuration is shown below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/home-router/static-ip-address-assignment.png&quot; alt=&quot;Static IP Address Assignment&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;testing-the-bridge&quot;&gt;Testing the bridge&lt;/h2&gt;

&lt;p&gt;Generate traffic from one (or more) LAN ports towards the other LAN ports and verify that the traffic is correctly forwarded.&lt;/p&gt;

&lt;p&gt;Some possible test cases are&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Verify two hosts on the LAN ports are able to ping each other&lt;/li&gt;
  &lt;li&gt;Verify Unicast traffic between two hosts at various rates and packet sizes&lt;/li&gt;
  &lt;li&gt;Verify broadcast traffic is forwarded to all other LAN ports&lt;/li&gt;
  &lt;li&gt;Verify unknown unicast traffic is flooded to all other LAN ports&lt;/li&gt;
  &lt;li&gt;Verify traffic between wired and wireless ports&lt;/li&gt;
  &lt;li&gt;Verify both IPv4 and IPv6 traffic&lt;/li&gt;
  &lt;li&gt;Verify latency and jitter between LAN ports is insignificant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For all bridge tests, verify that the trafic is NOT forwarded to the WAN port.&lt;/p&gt;

&lt;h2 id=&quot;testing-the-nat&quot;&gt;Testing the NAT&lt;/h2&gt;

&lt;p&gt;If you are new to NAT, you can read more about it in &lt;a href=&quot;https://ostinato.org/guides/understanding-nat-pat&quot;&gt;NAT Overview and Fundamentals&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Generate traffic from one of the LAN ports towards the WAN port and verify that the traffic is correctly forwarded to the Internet.&lt;/p&gt;

&lt;p&gt;Some possible test cases are&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Use ping to verify a host on the LAN port can reach a public IP address on the Internet&lt;/li&gt;
  &lt;li&gt;Use a traffic analyzer like Wireshark to verify that NAT changes the IP address and L4 port numbers&lt;/li&gt;
  &lt;li&gt;Verify traffic at various rates and packet sizes&lt;/li&gt;
  &lt;li&gt;Verify both IPv4 and IPv6 traffic&lt;/li&gt;
  &lt;li&gt;Verify latency and jitter between WAN and LAN port is within acceptable limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For all NAT tests, verify that the incoming traffic from the WAN port is correctly forwarded to only one LAN port.&lt;/p&gt;

&lt;h2 id=&quot;testing-security-features&quot;&gt;Testing security features&lt;/h2&gt;

&lt;p&gt;If the router supports security features like firewall, you can use Ostinato to generate traffic that should be blocked by the firewall and verify that the firewall correctly blocks (or allows) the traffic.&lt;/p&gt;

&lt;h2 id=&quot;testing-the-quality-of-service-qos&quot;&gt;Testing the Quality of Service (QOS)&lt;/h2&gt;

&lt;p&gt;To verify the Quality of Service (QOS) functionality of the router, you can use Ostinato to generate traffic with different DSCP (DiffServ Code Point) values for IPv4 and Traffic Class values for IPv6. This allows you to test how the router prioritizes traffic based on these values. For a detailed guide on how to verify network QOS using Ostinato, refer to &lt;a href=&quot;https://ostinato.org/guides/how-to-verify-network-qos-using-ostinato&quot;&gt;How to Verify Network QOS Using Ostinato&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Are there other home router features that you’d like to test and need help with? Reach out to us!&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/home-router&quot;&gt;Testing a home router&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 29, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[FPGA Testing with Ostinato]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/fpga" />
  <id>https://ostinato.org/guides/fpga</id>
  <published>2025-04-15T00:00:00+00:00</published>
  <updated>2025-04-15T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;p&gt;The worlds of networking and FPGA design have become increasingly intertwined. Modern FPGAs are now powering everything from high-speed network interfaces to complex packet processing pipelines and industrial automation systems. Whether you’re implementing a custom Ethernet MAC, building a network security appliance, or developing a specialized network function, your FPGA design needs thorough testing and verification.&lt;/p&gt;

&lt;p&gt;Ostinato can help you with that.&lt;/p&gt;

&lt;p&gt;No need for expensive and complex test equipment. A simple PC and a network interface card (NIC) is all you need to run Ostinato and test your FPGA design.&lt;/p&gt;

&lt;p&gt;Let’s explore how Ostinato can be used across different aspects of FPGA development.&lt;/p&gt;

&lt;h2 id=&quot;network-interface-testing&quot;&gt;Network Interface Testing&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/fpga/generic-chip.png&quot; alt=&quot;FPGA Chip&quot; /&gt;&lt;/p&gt;

&lt;p&gt;At the heart of many FPGA designs is the network interface. Whether you’re implementing a standard Ethernet MAC or a custom network interface, you need to verify its functionality under various conditions. Ostinato’s ability to generate traffic patterns (valid and invalid) at various rates including line rate makes it ideal for this purpose.&lt;/p&gt;

&lt;p&gt;You can use Ostinato to test your FPGA’s network interface by&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Creating specific packet patterns to test basic functionality&lt;/li&gt;
  &lt;li&gt;Generating traffic at different rates to verify performance&lt;/li&gt;
  &lt;li&gt;Testing error handling with malformed packets&lt;/li&gt;
  &lt;li&gt;Verifying flow control mechanisms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href=&quot;https://userguide.ostinato.org/stream-config/&quot;&gt;Stream Configuration&lt;/a&gt;, &lt;a href=&quot;https://userguide.ostinato.org/port-config/&quot;&gt;Port Configuration&lt;/a&gt; and &lt;a href=&quot;https://userguide.ostinato.org/port-statistics/&quot;&gt;Port Statistics&lt;/a&gt; features are particularly useful here, allowing you to create specific packet patterns, monitor interface performance and identify potential issues.&lt;/p&gt;

&lt;h2 id=&quot;protocol-implementation-verification&quot;&gt;Protocol Implementation Verification&lt;/h2&gt;

&lt;p&gt;When implementing network protocols in FPGAs, it’s essential to ensure they handle all protocol requirements and edge cases correctly.&lt;/p&gt;

&lt;p&gt;You can use Ostinato to verify your FPGA’s protocol implementation by&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Testing support for various network protocols to ensure compatibility and correct processing&lt;/li&gt;
  &lt;li&gt;Verifying protocol conformance using standard test patterns to ensure the FPGA processes packets as expected&lt;/li&gt;
  &lt;li&gt;Injecting errors into packet streams to test the FPGA’s error handling capabilities&lt;/li&gt;
  &lt;li&gt;Validating protocol timing requirements by measuring the timing of packet processing and ensuring it meets specifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ostinato’s &lt;a href=&quot;https://userguide.ostinato.org/stream-config/&quot;&gt;Stream Configuration&lt;/a&gt; allows you to craft protocol packets as per your specific requirements. You can also use the Ostinato Hexdump and &lt;a href=&quot;https://userguide.ostinato.org/user-script/&quot;&gt;userscript&lt;/a&gt; features to add support for custom or unimplemented protocols.&lt;/p&gt;

&lt;p&gt;You can also &lt;a href=&quot;https://userguide.ostinato.org/pcap-replay/&quot;&gt;import, edit and replay PCAP files&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Please note that Ostinato is stateless and does not support stateful protocols yet.&lt;/p&gt;

&lt;h2 id=&quot;performance-analysis&quot;&gt;Performance Analysis&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/fpga/abstract-chips.jpg&quot; alt=&quot;FPGA Chip&quot; /&gt;&lt;/p&gt;

&lt;p&gt;FPGA designs often need to meet strict performance requirements. Ostinato helps you measure and analyze:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Throughput at different packet sizes&lt;/li&gt;
  &lt;li&gt;Latency under various load conditions&lt;/li&gt;
  &lt;li&gt;Jitter in packet processing&lt;/li&gt;
  &lt;li&gt;Resource utilization impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For line rate support, you can use the &lt;a href=&quot;https://ostinato.org/pricing/turbo&quot;&gt;Turbo Transmit add-on&lt;/a&gt; and run standard RFC 2544 tests using the &lt;a href=&quot;https://userguide.ostinato.org/perf-bench&quot;&gt;Performance Benchmark&lt;/a&gt; automated test suite.&lt;/p&gt;

&lt;h2 id=&quot;security-testing&quot;&gt;Security Testing&lt;/h2&gt;

&lt;p&gt;For FPGAs implementing security functions, Ostinato can help verify:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Firewall rule implementations&lt;/li&gt;
  &lt;li&gt;DDoS protection mechanisms&lt;/li&gt;
  &lt;li&gt;Security protocol handling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;test-automation&quot;&gt;Test Automation&lt;/h2&gt;

&lt;p&gt;Modern FPGA development requires automated testing. Ostinato’s &lt;a href=&quot;https://apiguide.ostinato.org/&quot;&gt;Python API&lt;/a&gt; allows you to do all that you can using the Ostinato GUI and more that is not possible using the GUI.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Create automated test scenarios&lt;/li&gt;
  &lt;li&gt;Integrate with your verification environment&lt;/li&gt;
  &lt;li&gt;Generate test reports&lt;/li&gt;
  &lt;li&gt;Perform regression testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;use-with-emulated-designs&quot;&gt;Use with Emulated Designs&lt;/h2&gt;

&lt;p&gt;Ostinato can integrate with FPGA/ASIC designs running on emulation via a speedbridge. This integration allows for comprehensive testing and verification of your design in a controlled environment before deploying it on actual hardware.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Detect issues early in the development cycle, reducing the risk of costly errors later on&lt;/li&gt;
  &lt;li&gt;Enjoy a flexible testing environment where you can easily modify and test different configurations and scenarios without the need for physical hardware changes&lt;/li&gt;
  &lt;li&gt;Use Ostinato to generate and send traffic to the emulated design, configuring specific traffic patterns, rates, and protocols to match your testing requirements&lt;/li&gt;
  &lt;li&gt;Ensure your design correctly implements and handles various network protocols by simulating different protocol scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By leveraging Ostinato in an emulated environment, you can enhance the reliability and performance of your FPGA/ASIC designs, ensuring they are ready for deployment in real-world applications.&lt;/p&gt;

&lt;h2 id=&quot;troubleshooting&quot;&gt;Troubleshooting&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Craft specific test patterns to reproduce issues&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://userguide.ostinato.org/pcap-replay/&quot;&gt;Replay known-to-cause-problem PCAP files&lt;/a&gt; to help identify and fix issues with your FPGA design&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;case-studies&quot;&gt;Case Studies&lt;/h2&gt;

&lt;p&gt;Here are some publicly available case studies that have used Ostinato for their FPGA development and troubleshooting.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/lucky-packet-outlier-filters-way-increased-synchronization-oktze/&quot;&gt;Increasing PTP accuracy and resiliency&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.garlandtechnology.com/blog/full-duplex-capture-in-industrial-networks&quot;&gt;Analysing full duplex capture in Industrial Ethernet&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://guides.krisk.org/2013/02/packets-of-death.html&quot;&gt;Packets of Death for an Ethernet Controller&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want to discuss how Ostinato can help your FPGA/ASIC development? Reach out to us!&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/fpga&quot;&gt;FPGA Testing 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 April 15, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Generate HSR/PRP traffic using a custom protocol script]]></title>
  <link rel="alternate" type="text/html" href="https://ostinato.org/guides/hsr-prp-user-script" />
  <id>https://ostinato.org/guides/hsr-prp-user-script</id>
  <published>2025-03-26T00:00:00+00:00</published>
  <updated>2025-03-26T00:00:00+00:00</updated>
  <author>
    <name>Ostinato Team</name>
    <uri>https://ostinato.org</uri>
    
  </author>
  <content type="html">
    &lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;If you are using Ostinato on Linux, see “&lt;a href=&quot;/guides/hsr-prp-linux&quot;&gt;How to generate HSR/PRP traffic on Linux&lt;/a&gt;” - it is easier than using the custom protocol user-script described in this guides&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;In this post we will see how to generate the industrial-ethernet protocols &lt;a href=&quot;/guides/prp-hsr&quot;&gt;HSR/PRP&lt;/a&gt; traffic using Ostinato custom protocol user-script.&lt;/p&gt;

&lt;p&gt;The Ostinato custom protocol user-script is a powerful tool that allows you to generate traffic for any protocol - even if it is not supported by Ostinato natively.&lt;/p&gt;

&lt;p&gt;All you need to do is write a few lines of Javascript code. We will show the code for HSR/PRP in this post that you can simply copy-paste into your Ostinato user-script.&lt;/p&gt;

&lt;h2 id=&quot;hsr-high-availability-seamless-redundancy&quot;&gt;HSR (High-availability Seamless Redundancy)&lt;/h2&gt;

&lt;p&gt;Let’s begin with the frame format for HSR.&lt;/p&gt;

&lt;p&gt;HSR is added as a header to an Ethernet frame similar to VLAN tags.&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 Header | HSR Tag | Payload | FCS |
+-----------------+---------+---------+-----+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The HSR tag is 6 bytes long and contains the following fields.&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;+----------+-------------+------------+-----------------+
|  Path Id |  Frame Size | Seq Number | Payload EthType |
|  4 bits  |    12 bits  |   16 bits  |     16 bits     |
+----------+-------------+------------+-----------------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;First create a Ostinato stream with all the protocols that you need, except the HSR protocol.&lt;/p&gt;

&lt;p&gt;e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mac | Ethernet | IP | UDP | Pattern Payload&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then switch to the advanced mode of protocol selection and insert &lt;em&gt;{Script}&lt;/em&gt; between the Ethernet and IP protocols.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/hsr-prp-user-script/hsr-user-script-protocols.png&quot; alt=&quot;Ostinato HSR stream protocols&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For the user-script, copy the following code and paste it into the user-script field.&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;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;HSR&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;6&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;pathId&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Change if required&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;frameSz&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;protocolFramePayloadSize&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;o&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;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;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;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;ProtocolIdEth&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;mi&quot;&gt;6&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;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;pathId&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&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;frameSz&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xF00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&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;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;frameSz&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;c1&quot;&gt;// Seq # will be set/incremented by variable fields; set to zero here&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;0&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;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;mi&quot;&gt;0&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;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;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;type&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;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;nx&quot;&gt;type&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;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;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;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;ProtocolIdEth&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;mh&quot;&gt;0x892f&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The code is pretty much self-explanatory. In case of any questions, please refer to the &lt;a href=&quot;https://userguide.ostinato.org/user-script/&quot;&gt;Ostinato custom protocols’ user-script documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pathId&lt;/code&gt; value as required.&lt;/p&gt;

&lt;p&gt;For incrementing the sequence number with every packet, we will use the &lt;a href=&quot;https://userguide.ostinato.org/stream-config/#variable-fields&quot;&gt;Variable Fields&lt;/a&gt; feature as shown below.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Protocol: HSR&lt;/li&gt;
  &lt;li&gt;Field: Custom&lt;/li&gt;
  &lt;li&gt;Type: Counter16&lt;/li&gt;
  &lt;li&gt;Offset: 2&lt;/li&gt;
  &lt;li&gt;Mode: Increment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/hsr-prp-user-script/hsr-seq-var-field.png&quot; alt=&quot;HSR Sequence Number Variable Field&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here’s a &lt;a href=&quot;/images/guides/hsr-prp-user-script/hsr-example.ostm&quot;&gt;sample HSR stream&lt;/a&gt; that you can download and open in Ostinato.&lt;/p&gt;

&lt;h2 id=&quot;prp-parallel-redundancy-protocol&quot;&gt;PRP (Parallel Redundancy Protocol)&lt;/h2&gt;

&lt;p&gt;PRP is added as a trailer (RCT - &lt;em&gt;Redundancy Control Trailer&lt;/em&gt;) instead of a header. Let’s look at the frame format first.&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 Header | Payload | PRP RCT | FCS |
+-----------------+---------+---------+-----+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The PRP RCT is 6 bytes long and contains similar fields as the HSR tag but in a different order.&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;+-------------+--------+------------+------------+
|  Seq Number | Lan Id | Frame Size | PRP Suffix |
|   16 bits   | 4 bits |   12 bits  |  16 bits   |
+-------------+--------+------------+------------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The PRP suffix is a fixed value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0x88fb&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To create a PRP packet, first create a Ostinato stream with all the protocols that you need, except the PRP protocol.&lt;/p&gt;

&lt;p&gt;e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mac | Ethernet | IP | UDP | Pattern Payload&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then switch to the advanced mode of protocol selection and insert &lt;em&gt;{Script}&lt;/em&gt; at the very end - after the Pattern payload protocol (DATA).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/hsr-prp-user-script/prp-user-script-protocols.png&quot; alt=&quot;Ostinato PRP stream protocols&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For the user-script, copy the following code and paste it into the user-script field.&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;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;PRP&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;6&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;lan&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xA&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;frameSz&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;protocolFrameOffset&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;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;12&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;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Seq # will be set/incremented by variable fields; don&apos;t care here&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;mi&quot;&gt;0&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;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;mi&quot;&gt;0&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;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;nx&quot;&gt;lan&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&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;frameSz&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xF00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&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;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;frameSz&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;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;mh&quot;&gt;0x88&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;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;mh&quot;&gt;0xfb&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;You can change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lan&lt;/code&gt; value as required.&lt;/p&gt;

&lt;p&gt;For incrementing the sequence number with every packet, we will again use the &lt;a href=&quot;https://userguide.ostinato.org/stream-config/#variable-fields&quot;&gt;Variable Fields&lt;/a&gt; feature as we did for HSR (&lt;em&gt;but with a different offset value&lt;/em&gt;)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Protocol: PRP&lt;/li&gt;
  &lt;li&gt;Field: Custom&lt;/li&gt;
  &lt;li&gt;Type: Counter16&lt;/li&gt;
  &lt;li&gt;Offset: 0&lt;/li&gt;
  &lt;li&gt;Mode: Increment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/hsr-prp-user-script/prp-seq-var-field.png&quot; alt=&quot;PRP Sequence Number Variable Field&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;a-few-more-prp-adjustments&quot;&gt;A few more PRP adjustments&lt;/h3&gt;
&lt;p&gt;In case of PRP, we need to adjust the IP/UDP length to ignore the PRP RCT.&lt;/p&gt;

&lt;p&gt;A quick way to figure out the adjustments to make is to send the packets as it is, capture in Wireshark and note down the following values:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;IP Total Length&lt;/li&gt;
  &lt;li&gt;UDP Length&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then overwrite the value of the above fields in Ostinato by &lt;strong&gt;subtracting 6 (PRP RCT length) from each of the values as shown in Wireshark&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/hsr-prp-user-script/prp-override-ip-length.png&quot; alt=&quot;PRP IP Length Overrides&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/guides/hsr-prp-user-script/prp-override-udp-length-cksum.png&quot; alt=&quot;PRP UDP Length Overrides&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We also need to override the UDP checksum as shown above. Again send the packets after adjusting the IP/UDP lengths, capture in Wireshark and note down the value that Wireshark says is the expected checksum and use that to fill the UDP checksum field.&lt;/p&gt;

&lt;p class=&quot;notice&quot;&gt;📌 Please note that if you change the Ostinato stream frame length, you will need to adjust the IP/UDP length and checksum overrides accordingly.&lt;/p&gt;

&lt;p&gt;Here’s a &lt;a href=&quot;/images/guides/hsr-prp-user-script/prp-rct-example.ostm&quot;&gt;sample PRP stream&lt;/a&gt; that you can download and open in Ostinato.&lt;/p&gt;


    &lt;p&gt;&lt;a href=&quot;https://ostinato.org/guides/hsr-prp-user-script&quot;&gt;Generate HSR/PRP traffic using a custom protocol script&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 26, 2025.&lt;/p&gt;
  </content>
</entry>

</feed>