License: Wrap GPL block to 80 characters
[csit.git] / GPL / traffic_profiles / trex / trex-astf-ethip4udp-262144h.py
1 # Copyright (c) 2021 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:      172.16.0.0 - 172.19.255.255
32    - Destination IP address range: 20.16.0.0 - 20.19.255.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 __init__(self):
53         """Initialization and setting of profile parameters."""
54
55         super(TrafficProfileBaseClass, self).__init__()
56
57         # IPs used in packet headers.
58         self.p1_src_start_ip = u"172.16.0.0"
59         self.p1_src_end_ip = u"172.19.255.255"
60         self.p1_dst_start_ip = u"20.16.0.0"
61         self.p1_dst_end_ip = u"20.19.255.255"
62
63         # UDP messages
64         self.udp_req = u"GET"
65         self.udp_res = u"ACK"
66
67         # Headers length
68         self.headers_size = 42  # 14B l2 + 20B ipv4 + 8B udp
69
70         # No need to set keepalive, both programs end just after start&send.
71
72     def define_profile(self):
73         """Define profile to be used by advanced stateful traffic generator.
74
75         This method MUST return:
76             return ip_gen, templates, None
77
78         :returns: IP generator and profile templates ASTFProfile().
79         :rtype: tuple
80         """
81         self.udp_req += self._gen_padding(self.headers_size + len(self.udp_req))
82         self.udp_res += self._gen_padding(self.headers_size + len(self.udp_res))
83
84         # client commands
85         prog_c = ASTFProgram(stream=False)
86         # send REQ message
87         prog_c.send_msg(self.udp_req)
88         # No need to process the response, seeing L2 counter is enough.
89         # Client program can end here.
90
91         # server commands
92         prog_s = ASTFProgram(stream=False)
93         # When server instance is created means REQ is visible in L2 counter.
94         # No need to receive explicitly?
95         # send RES message
96         prog_s.send_msg(self.udp_res)
97         # Server program can end here.
98
99         # ip generators
100         ip_gen_c = ASTFIPGenDist(
101             ip_range=[self.p1_src_start_ip, self.p1_src_end_ip],
102             distribution=u"seq"
103         )
104         ip_gen_s = ASTFIPGenDist(
105             ip_range=[self.p1_dst_start_ip, self.p1_dst_end_ip],
106             distribution=u"seq"
107         )
108         ip_gen = ASTFIPGen(
109             glob=ASTFIPGenGlobal(ip_offset=u"0.0.0.1"),
110             dist_client=ip_gen_c,
111             dist_server=ip_gen_s
112         )
113
114         # server association
115         s_assoc = ASTFAssociation(rules=ASTFAssociationRule(port=8080))
116
117         # template
118         temp_c = ASTFTCPClientTemplate(
119             program=prog_c,
120             ip_gen=ip_gen,
121             limit=16515072,  # TODO: set via input parameter ?
122             port=8080
123         )
124         temp_s = ASTFTCPServerTemplate(program=prog_s, assoc=s_assoc)
125         template = ASTFTemplate(client_template=temp_c, server_template=temp_s)
126
127         return ip_gen, template, None
128
129
130 def register():
131     """Register this traffic profile to T-Rex.
132
133     Do not change this function.
134
135     :return: Traffic Profiles.
136     :rtype: Object
137     """
138     return TrafficProfile()