How to generate MPLS packets using Ostinato HexDump

3 minute read

Ostinato includes and supports a lot of the commonly used protocols to generate packets. However, from time to time, one may come across a protocol that is not available in Ostinato.

Fear not, Ostinato provides a way to generate packets for protocols that are not available out of the box. Actually it provides two ways, not one.

In this post we will see how to create a MPLS packet by using the first of the two ways - hexdump.

Although this post talks about MPLS, the same method is applicable for any protocol, MPLS is used just as an example here

Let’s look at the MPLS frame format. Let’s assume we need to generate a IP/UDP packet encapsulated inside a MPLS tunnel. So the frame format would consist of the following protocol headers in this order -

+----------+------+----+-----+
| Ethernet | MPLS | IP | UDP |
+----------+------+----+-----+

All the protocols in the above frame except MPLS are already supported in Ostinato.

To create this packet in Ostinato, we create a stream and select the protocols - Ethernet II, IPv4, UDP, Hex Dump and then switch to the advanced protocol selection mode -

Simple Protocols

Select the HexDump protocol in the Selected Protocols list and use the up/down arrows to move it between Eth II and IPv4

Advanced Protocols

Now that we have the HexDump header at the correct place in the packet, let’s switch to the Protocol Data tab and click on HexDump -

Protocol Data

We need to enter the MPLS header bytes here in hex format. To calculate these, we need to know the MPLS header format.

The MPLS header consists of one or more MPLS tags comprising a tag stack -

+-------+-------+-------+-----+
| Tag 1 | Tag 2 | Tag 3 | ... |
+-------+-------+-------+-----+

Each tag is 32-bit wide and is composed of the following fields -

+------------+-----+-----+-----+
| MPLS Label | Exp |  S  | TTL |
|    (20)    | (3) | (1) | (8) |
+------------+-----+-----+-----+

The numbers in () represents the bit-width of each field. The S bit is set to 1 for the last (innermost) tag and is 0 for all the other tags

Let’s create a single tag MPLS header with the following values -

Label = 12701
EXP = 5
S = 1
TTL = 64

First, let’s convert each of those values to hexadecimal -

Label = 12701 (0x319D)
EXP = 5 (0x5)
S = 1 (0x1)
TTL = 64 (0x40)

Looking at the tag encoding above and some bit arithmetic, we can now calculate the 32-bit hex encoded tag for these values -

0x0319DB40

So, we enter these bytes in the hexdump editor, and uncheck the padding -

HexDump

We need to do one last thing - go to the Ethernet II tab, tick the checkbox and enter the MPLS ethertype 8847 -

Ethertype

To verify if the MPLS header is correct, we apply our changes, transmit the stream, capture the transmitted packet and view it in Wireshark -

Wireshark MPLS single tag

Voila, Wireshark decodes that perfectly!

What if you need more than one tag? Just calculate the 4-byte (32-bit) hex value for each tag (make sure S=0 in all tags except the last one) and enter the same in the hexdump.

Here’s an example -

Tag 1:
Label = 12701 (0x319D)
EXP = 5 (0x5)
S = 0 (0x0)
TTL = 64 (0x40)

Tag 2:
Label = 972 (0x3CC)
EXP = 1 (0x1)
S = 0 (0x0)
TTL = 128 (0x80)

Tag 3:
Label = 19 (0x13)
EXP = 3 (0x3)
S = 1 (0x1)
TTL = 255 (0xff)

Hex Encoded value -

0319DA40 003CC280 000137FF

Here’s the 3-tag stack mpls frame in Wireshark -

Wireshark MPLS tag stack

In the next post, we’ll see how to use a Ostinato userscript to do the same thing so that we don’t need to do all this manual hex calculation which is prone to errors.

Interested in more Ostinato tips and tricks? Subscribe to receive email updates!

Leave a Comment