[dpdk-users] PktGen Ethertype

Paul Emmerich emmericp at net.in.tum.de
Tue May 9 16:13:30 CEST 2017


I usually don't hijack threads about pktgen with an ad for my packet generator. But I'll make an exception here (sorry) since that kind of weird packet modification requirements was one of the main reasons for me to build my own packet generator:


MoonGen runs Lua code for each single packet that is sent out (instead of just configuring some existing logic in C), so modifying any field is easy.
Also, all fields in commonly used protocol stacks are exposed via sensible names and all these messy offsets are calculated automatically.

You can have a look at one of the example scripts to see packet modifications in action:


Basically, you can add 

   pkt.eth.type = <ethertype> (network byte order)
   pkt.eth:setType(<ethertype>) (automatic byte order swap)

In the main loop at line 92 where it currently modifies the IP addresses.
This is still fast because we dynamically build and compile the necessary structs for the protocol stack.

You can also receive packets to find out which ethertypes are dropped (if any), an example of packet reception can be found in this example:

By default, we use the NIC's hardware counters for rx/tx stats (another important difference from pktgen which receives and drops packets by default).


> Wiles, Keith <keith.wiles at intel.com>:
>> On May 9, 2017, at 3:55 AM, James Bensley <jwbensley at gmail.com> wrote:
>> Hi All,
>> I hope this is a suitable place to ask, if not please point me at
>> somewhere more appropriate.
>> I've been reading through the Pktgen docs
>> (http://pktgen.readthedocs.io/en/latest/commands.html for example) and
>> I'm trying to find out if I can set the EtherType field in the layer 2
>> headers to any value I like. I can't seem to find anything on this.
>> I want to use some Lua scripts to generate traffic with every possible
>> EtherType (from 0x0000 to 0xFFFF) and send that through a switch and
>> test that all frames were received on the other side. Is there a
>> function like pktgen.set_eth_type() so I can wrap it in loop?
>> // Build an entire frame then just loop over the ethertype for each frame:
>> build_entire_frame_with_payload();
>> for (i = 0; i <= 0xFFFF; i++) {
>>   pktgen.set_eth_type(i);
>>   send_frame();
>> }
> Yes this would be nice, but at this point pktgen is not able to do this type of feature.
> This would be a nice feature for scripting, I have not had time to add that support :-(
> The range command can allow you to adjust the type field and then send those in a burst. The problem is pktgen was designed to send packets at a high rate if needed and that means setting up the packets before hand. The number of packets being able to be setup before hand is 8192. The random command can adjust the ether type randomly for each packet with a performance hit. Maybe one of these would help. Also I am more then willing to take patches :-)
>> Cheers,
>> James.
> Regards,
> Keith

Chair of Network Architectures and Services
Department of Informatics
TU München
Boltzmannstr. 3
85748 Garching bei München, Germany 

More information about the users mailing list