summaryrefslogtreecommitdiffstats
path: root/scripts/stl/bench.py
blob: b1a6f89f91b63f59a1bf4f2edfa599212ac03e3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from trex_stl_lib.api import *

class STLBench(object):
    ip_range = {}
    ip_range['src'] = {'start': '16.0.0.0', 'end': '16.0.255.255'}
    ip_range['dst'] = {'start': '48.0.0.0', 'end': '48.0.255.255'}
    ports = {'min': 1234, 'max': 65500}
    pkt_size = {'min': 64, 'max': 9216}
    imix_table = [ {'size': 60,   'pps': 28,  'isg':0 },
                   {'size': 590,  'pps': 20,  'isg':0.1 },
                   {'size': 1514, 'pps': 4,   'isg':0.2 } ]

    def create_stream (self, size, vm, src, dst, pps = 1, isg = 0):
        # Create base packet and pad it to size
        base_pkt = Ether()/IP(src = src, dst = dst)/UDP()
        pad = max(0, size - len(base_pkt) - 4) * 'x'

        pkt = STLPktBuilder(pkt = base_pkt/pad,
                            vm = vm)

        return STLStream(packet = pkt,
                         mode = STLTXCont(pps = pps),
                         isg = isg)


    def get_streams (self, size=64, vm=None, direction=0, **kwargs):
        if direction == 0:
            src, dst = self.ip_range['src'], self.ip_range['dst']
        else:
            src, dst = self.ip_range['dst'], self.ip_range['src']

        if not vm or vm == 'none':
            vm_var = None
        elif vm == 'var1':
            vm_var =[
                STLVmFlowVar(name = 'src', min_value = src['start'], max_value = src['end'], size = 4, op = 'inc'),
                STLVmWrFlowVar(fv_name = 'src', pkt_offset = 'IP.src'),
                STLVmFixIpv4(offset = 'IP')
            ]
        elif vm == 'var2':
            vm_var =[
                STLVmFlowVar(name = 'src', min_value = src['start'], max_value = src['end'], size = 4, op = 'inc'),
                STLVmWrFlowVar(fv_name = 'src', pkt_offset = 'IP.src'),
                STLVmFlowVar(name = 'dst', min_value = dst['start'], max_value = dst['end'], size = 4, op = 'inc'),
                STLVmWrFlowVar(fv_name = 'dst', pkt_offset = 'IP.dst'),
                STLVmFixIpv4(offset = 'IP')
            ]
        elif vm == 'random':
            vm_var =[
                STLVmFlowVar(name = 'src', min_value = src['start'], max_value = src['end'], size = 4, op = 'random'),
                STLVmWrFlowVar(fv_name = 'src', pkt_offset = 'IP.src'),
                STLVmFixIpv4(offset = 'IP')
            ]
        elif vm == 'tuple':
            vm_var =[
                STLVmTupleGen(ip_min = src['start'], ip_max = src['end'], port_min = self.ports['min'], port_max = self.ports['max'], name = 'tuple'),
                STLVmWrFlowVar(fv_name = 'tuple.ip', pkt_offset =  'IP.src'),
                STLVmWrFlowVar(fv_name = 'tuple.port', pkt_offset =  'UDP.sport'),
                STLVmFixIpv4(offset = 'IP')
            ]
        elif vm == 'size':
            if size == 'imix':
                raise STLError("Can't use VM of type 'size' with IMIX.")
            size = self.pkt_size['max']
            l3_len_fix = -len(Ether())
            l4_len_fix = l3_len_fix - len(IP())
            vm_var = [
                STLVmFlowVar(name = 'fv_rand', min_value = (self.pkt_size['min'] - 4), max_value = (self.pkt_size['max'] - 4), size = 2, op = 'random'),
                STLVmTrimPktSize('fv_rand'),
                STLVmWrFlowVar(fv_name = 'fv_rand', pkt_offset = 'IP.len', add_val = l3_len_fix),
                STLVmWrFlowVar(fv_name = 'fv_rand', pkt_offset = 'UDP.len', add_val = l4_len_fix),
                STLVmFixIpv4(offset = 'IP')
            ]
        elif vm == 'cached':
            vm_raw =[
                STLVmFlowVar(name = 'src', min_value = src['start'], max_value = src['end'], size = 4, op = 'inc'),
                STLVmWrFlowVar(fv_name = 'src', pkt_offset = 'IP.src'),
                STLVmFixIpv4(offset = 'IP')
            ]
            vm_var = STLScVmRaw(vm_raw, cache_size = 255);
        else:
            raise Exception("VM '%s' not available" % vm)
        if size == 'imix':
            return [self.create_stream(p['size'], vm_var, src = src['start'], dst = dst['start'], pps = p['pps'], isg = p['isg']) for p in self.imix_table]
        return [self.create_stream(size, vm_var, src = src['start'], dst = dst['start'])]



# dynamic load - used for trex console or simulator
def register():
    return STLBench()