9aba56a3e4a772ab45e55028df24d1fca4795467
[csit.git] / GPL / traffic_profiles / trex / trex-astf-ethip4udp-65536h.py
1 # Copyright (c) 2020 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
5 #
6 #     http://www.apache.org/licenses/LICENSE-2.0
7 #
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
13
14 """Traffic profile for T-rex advanced stateful (astf) traffic generator.
15
16 Traffic profile:
17  - Two streams sent in directions 0 --> 1 (client -> server, requests) and
18    1 --> 0 (server -> client, responses) at the same time.
19  - Packet: ETH / IP / UDP
20  - Direction 0 --> 1:
21    - Source IP address range:      192.168.0.0 - 192.168.255.255
22    - Destination IP address range: 20.0.0.0 - 20.0.255.255
23  - Direction 1 --> 0:
24    - Source IP address range:      destination IP address from packet received
25      on port 1
26    - Destination IP address range: source IP address from packet received
27      on port 1
28
29 This is a profile for CPS tests, it only sets up UDP session.
30 No delays, no data transfer.
31 Keepalive mechanism cannot be disabled, so it is at least set to long waits.
32 """
33
34 from trex.astf.api import *
35
36 from profile_trex_astf_base_class import TrafficProfileBaseClass
37
38
39 class TrafficProfile(TrafficProfileBaseClass):
40     """Traffic profile."""
41
42     def __init__(self):
43         """Initialization and setting of profile parameters."""
44
45         super(TrafficProfileBaseClass, self).__init__()
46
47         # IPs used in packet headers.
48         self.p1_src_start_ip = u"192.168.0.0"
49         self.p1_src_end_ip = u"192.168.255.255"
50         self.p1_dst_start_ip = u"20.0.0.0"
51         self.p1_dst_end_ip = u"20.0.255.255"
52
53         # UDP messages
54         self.udp_req = u"GET"
55         self.udp_res = u"ACK"
56
57         # Headers length
58         self.headers_size = 42  # 14B l2 + 20B ipv4 + 8B udp
59
60         # Required UDP keepalive value for T-Rex
61         self.udp_keepalive = 2000*1000*100  # 200000s (200,000,000 msec)
62
63     def define_profile(self):
64         """Define profile to be used by advanced stateful traffic generator.
65
66         This method MUST return:
67             return ip_gen, templates, None
68
69         :returns: IP generator and profile templates ASTFProfile().
70         :rtype: tuple
71         """
72         self.udp_req += self._gen_padding(self.headers_size + len(self.udp_req))
73         self.udp_res += self._gen_padding(self.headers_size + len(self.udp_res))
74
75         # client commands
76         prog_c = ASTFProgram(stream=False)
77         prog_c.set_keepalive_msg(self.udp_keepalive)
78         # send REQ message
79         prog_c.send_msg(self.udp_req)
80         # receive RES message
81         prog_c.recv_msg(1)
82
83         # server commands
84         prog_s = ASTFProgram(stream=False)
85         prog_c.set_keepalive_msg(self.udp_keepalive)
86         # receive REQ message
87         prog_s.recv_msg(1)
88         # send RES message
89         prog_s.send_msg(self.udp_res)
90
91         # ip generators
92         ip_gen_c = ASTFIPGenDist(
93             ip_range=[self.p1_src_start_ip, self.p1_src_end_ip],
94             distribution=u"seq"
95         )
96         ip_gen_s = ASTFIPGenDist(
97             ip_range=[self.p1_dst_start_ip, self.p1_dst_end_ip],
98             distribution=u"seq"
99         )
100         ip_gen = ASTFIPGen(
101             glob=ASTFIPGenGlobal(ip_offset=u"0.0.0.1"),
102             dist_client=ip_gen_c,
103             dist_server=ip_gen_s
104         )
105
106         # server association
107         s_assoc = ASTFAssociation(rules=ASTFAssociationRule(port=8080))
108
109         # template
110         temp_c = ASTFTCPClientTemplate(
111             program=prog_c,
112             ip_gen=ip_gen,
113             limit=4128768,  # TODO: set via input parameter ?
114             port=8080
115         )
116         temp_s = ASTFTCPServerTemplate(program=prog_s, assoc=s_assoc)
117         template = ASTFTemplate(client_template=temp_c, server_template=temp_s)
118
119         return ip_gen, template, None
120
121
122 def register():
123     """Register this traffic profile to T-Rex.
124
125     Do not change this function.
126
127     :return: Traffic Profiles.
128     :rtype: Object
129     """
130     return TrafficProfile()