feat(astf): Support framesizes for ASTF
[csit.git] / GPL / traffic_profiles / trex / trex-astf-ethip4udp-1024h.py
1 # Copyright (c) 2022 Cisco and/or its affiliates.
2 #
3 # SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
4 #
5 # Licensed under the Apache License 2.0 or
6 # GNU General Public License v2.0 or later;  you may not use this file
7 # except in compliance with one of these Licenses. You
8 # may obtain a copy of the Licenses at:
9 #
10 #     http://www.apache.org/licenses/LICENSE-2.0
11 #     https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 #
13 # Note: If this file is linked with Scapy, which is GPLv2+, your use of it
14 # must be under GPLv2+.  If at any point in the future it is no longer linked
15 # with Scapy (or other GPLv2+ licensed software), you are free to choose
16 # Apache 2.
17 #
18 # Unless required by applicable law or agreed to in writing, software
19 # distributed under the License is distributed on an "AS IS" BASIS,
20 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 # See the License for the specific language governing permissions and
22 # limitations under the License.
23
24 """Traffic profile for T-rex advanced stateful (astf) traffic generator.
25
26 Traffic profile:
27  - Two streams sent in directions 0 --> 1 (client -> server, requests) and
28    1 --> 0 (server -> client, responses) at the same time.
29  - Packet: ETH / IP / UDP
30  - Direction 0 --> 1:
31    - Source IP address range:      192.168.0.0 - 192.168.3.255
32    - Destination IP address range: 20.0.0.0 - 20.0.3.255
33  - Direction 1 --> 0:
34    - Source IP address range:      destination IP address from packet received
35      on port 1
36    - Destination IP address range: source IP address from packet received
37      on port 1
38
39 This is a profile for CPS tests, it only sets up UDP session.
40 No delays, no data transfer.
41 Keepalive mechanism cannot be disabled, so it is at least set to long waits.
42 """
43
44 from trex.astf.api import *
45
46 from profile_trex_astf_base_class import TrafficProfileBaseClass
47
48
49 class TrafficProfile(TrafficProfileBaseClass):
50     """Traffic profile."""
51
52     def define_profile(self):
53         """Define profile to be used by advanced stateful traffic generator.
54
55         This method MUST return:
56             return ip_gen, templates, None
57
58         :returns: IP generator and profile templates ASTFProfile().
59         :rtype: tuple
60         """
61         # IPs used in packet headers.
62         p1_src_start_ip = u"192.168.0.0"
63         p1_src_end_ip = u"192.168.3.255"
64         p1_dst_start_ip = u"20.0.0.0"
65         p1_dst_end_ip = u"20.0.3.255"
66
67         # Headers length
68         headers_size = 46  # 18B L2 + 20B IPv4 + 8B UDP.
69
70         # UDP messages, not padded yet.
71         udp_req = u"GET"
72         udp_res = u"ACK"
73
74         # Padd to the required frame size.
75         udp_req += self._gen_padding(headers_size + len(udp_req))
76         udp_res += self._gen_padding(headers_size + len(udp_res))
77
78         # No need to set keepalive, both programs end just after start&send.
79
80         # client commands
81         prog_c = ASTFProgram(stream=False)
82         # send REQ message
83         prog_c.send_msg(udp_req)
84         # No need to process the response, seeing L2 counter is enough.
85         # Client program can end here.
86
87         # server commands
88         prog_s = ASTFProgram(stream=False)
89         # When server instance is created means REQ is visible in L2 counter.
90         # No need to receive explicitly?
91         # send RES message
92         prog_s.send_msg(udp_res)
93         # Server program can end here.
94
95         # ip generators
96         ip_gen_c = ASTFIPGenDist(
97             ip_range=[p1_src_start_ip, p1_src_end_ip],
98             distribution=u"seq",
99         )
100         ip_gen_s = ASTFIPGenDist(
101             ip_range=[p1_dst_start_ip, p1_dst_end_ip],
102             distribution=u"seq",
103         )
104         ip_gen = ASTFIPGen(
105             glob=ASTFIPGenGlobal(ip_offset=u"0.0.0.1"),
106             dist_client=ip_gen_c,
107             dist_server=ip_gen_s,
108         )
109
110         # server association
111         s_assoc = ASTFAssociation(rules=ASTFAssociationRule(port=8080))
112
113         # template
114         temp_c = ASTFTCPClientTemplate(
115             program=prog_c,
116             ip_gen=ip_gen,
117             limit=64512,  # TODO: set via input parameter ?
118             port=8080,
119         )
120         temp_s = ASTFTCPServerTemplate(program=prog_s, assoc=s_assoc)
121         template = ASTFTemplate(client_template=temp_c, server_template=temp_s)
122
123         return ip_gen, template, None
124
125
126 def register():
127     """Register this traffic profile to T-Rex.
128
129     Do not change this function.
130
131     :return: Traffic Profiles.
132     :rtype: Object
133     """
134     return TrafficProfile()