10. Etgen to Pktgen Guides

If you are working on etgen, and this document can help you to update your test suites to pktgen rapidly. Etgen is not under maitenance, and it will be removed from DTS some days.

pktgen usage please refer to doc pktgen_prog_guide.

10.1. import new class

  1. import a new module:
from pktgen import PacketGeneratorHelper

10.2. initialize an instance in def set_up_all(self)

def set_up_all(self):
...
   self.pktgen_helper = PacketGeneratorHelper()

10.3. create streams for pktgen instance

each pcap file should only contain one packet.

pcap1 = os.sep.join([self.pktgen.output_path, "{0}.pcap".format(port)])
flow1 = "Ether()/IP()/UDP()/("X")"
self.tester.scapy_append('wrpcap("%s", [flow])' % (pcap1, flow1))
self.tester.scapy_execute()

pcap2 = os.sep.join([self.pktgen.output_path, "{0}.pcap".format(port)])
flow2 = "Ether()/IP()/UDP()/("X")"
self.tester.scapy_append('wrpcap("%s", [flow])' % (pcap2, flow2))
self.tester.scapy_execute()

tgen_input = []
tgen_input.append([tx_port, rx_port, pcap1])
tgen_input.append([tx_port, rx_port, pcap2])

10.4. pcap field variable(optional)

If no protocol layer field vary requirement, ignore this content.

10.4.1. field key definition

  1. ip protocol layer:
# protocol layer name
'mac':  {
   # field name
   'src': {
      # field value vary range
      'range': 64,
      # field value vary step
      'step': 1,
      # action: inc/dec/random
      'action': 'inc'},
   'dst': {'range': 64, 'step': 1, 'action': 'inc'},
    }
  1. mac protocol layer:
# protocol layer name
'mac':  {
   # field name
   'src': {
      # field value vary range
      'range': 64,
      # field value vary step
      'step': 1,
      # action: inc/dec/random
      'action': 'inc'},
   'dst': {'range': 64, 'step': 1, 'action': 'inc'},
    }
  1. vlan protocol layer:
# protocol layer name
'vlan':  {
   '0': {
      # field value vary range
      'range': 64,
      # field value vary step
      'step': 1,
      # action: inc/dec/random
      'action': 'inc'},
    }

10.4.2. usage example

def set_up_all(self):
   ...
   self.pktgen_helper = PacketGeneratorHelper()
   ...

def set_fields(self):
   fields_config = {
      'ip':  {
         'src': {'range': 64, 'action': 'inc'},
         'dst': {'action': 'random'}},}
   return fields_config

def test_perf_xxxx(self):
   ...
   vm_config= self.set_fields() # optional
   # clear streams before add new streams
   self.tester.pktgen.clear_streams()
   # run packet generator
   ratePercent = 100
   streams = self.pktgen_helper.prepare_stream_from_tginput(
                      tgenInput, ratePercent, vm_config, self.tester.pktgen)
   _, pps = self.tester.pktgen.measure_throughput(stream_ids=streams)
   ...

10.5. change etgen interface to pktgen interface

pktgen interface use the same input parameter/return value definition as etgen interface.

10.5.1. throughput

etgen:

self.tester.traffic_generator_throughput(tgen_input)

pktgen:

vm_config= self.set_fields() # optional
# clear streams before add new streams
self.tester.pktgen.clear_streams()
# run packet generator
ratePercent = 100
streams = self.pktgen_helper.prepare_stream_from_tginput(
                     tgenInput, ratePercent, vm_config, self.tester.pktgen)
_, pps = self.tester.pktgen.measure_throughput(stream_ids=streams)

10.5.2. loss

etgen:

self.tester.traffic_generator_loss(tgen_input)

pktgen:

vm_config= self.set_fields() # optional
# clear streams before add new streams
self.tester.pktgen.clear_streams()
# run packet generator
ratePercent = 100
streams = self.pktgen_helper.prepare_stream_from_tginput(
                           tgenInput, ratePercent, vm_config, self.tester.pktgen)
result = self.tester.pktgen.measure_loss(stream_ids=streams)

10.5.3. latency

etgen:

self.tester.traffic_generator_latency(tgen_input)

pktgen:

vm_config= self.set_fields() # optional
# clear streams before add new streams
self.tester.pktgen.clear_streams()
# run packet generator
ratePercent = 100
streams = self.pktgen_helper.prepare_stream_from_tginput(
                     tgenInput, ratePercent, vm_config, self.tester.pktgen)
latencys = self.tester.pktgen.measure_latency(stream_ids=streams)

10.5.4. rfc2544

etgen:

self.tester.run_rfc2544(tgen_input)

pktgen:

vm_config= self.set_fields() # optional
# clear streams before add new streams
self.tester.pktgen.clear_streams()
# run packet generator
ratePercent = 100
streams = self.pktgen_helper.prepare_stream_from_tginput(
                     tgenInput, ratePercent, vm_config, self.tester.pktgen)
# set traffic option
traffic_opt = {'pdr': 0.01, 'duration': 5}
zero_loss_rate, tx_pkts, rx_pkts = \
  self.tester.pktgen.measure_rfc2544(stream_ids=streams, options=traffic_opt)