aboutsummaryrefslogtreecommitdiffstats
path: root/resources/tools/t-rex/stream_profiles/trex-sl-2n-ethip4-ip4src253.py
diff options
context:
space:
mode:
authorTibor Frank <tifrank@cisco.com>2017-04-04 10:06:00 +0200
committerTibor Frank <tifrank@cisco.com>2017-06-05 07:40:28 +0200
commitb92b5be7d4bbbf523812f774bb2e539ab2081cf6 (patch)
tree61d967364e6eb9952616434b913648742e70fbc9 /resources/tools/t-rex/stream_profiles/trex-sl-2n-ethip4-ip4src253.py
parent78e999f1203dc8b7c29c24b0178bb8c23edf4c52 (diff)
CSIT-524: Traffic generator using python profiles
Profile name structure: [trex|ixia]-[sl|sf]-[topo]-[packet structure]-[scale] - Traffic generator - T-rex (trex) or Ixia (ixia) - Stateless (sl) or statefull (sf) - Topology - 2-node topology (2n) or 3-node topology (3n) - Packet structure - eth | ip4/6 | udp - Scale - e.g. ip4dst1, ip6dst10000, 4000u15p Traffic types changed to stream profiles: - From: 2-node-bridge To: trex-sl-2n-ethip4-ip4src253 - From: 3-node-bridge To: trex-sl-3n-ethip4-ip4src254 - From: 3-node-IPv4-dst-1000000 To: trex-sl-3n-ethip4-ip4dst1000000 - From: 3-node-IPv4-dst-100000 To: trex-sl-3n-ethip4-ip4dst100000 - From: 3-node-IPv4-dst-10000 To: trex-sl-3n-ethip4-ip4dst10000 - From: 3-node-IPv4-dst-1000 To: trex-sl-3n-ethip4-ip4dst1000 - From: 3-node-IPv4-dst-100 To: trex-sl-3n-ethip4-ip4dst100 - From: 3-node-IPv4-dst-1 To: trex-sl-3n-ethip4-ip4dst1 - From: 3-node-IPv4 To: trex-sl-3n-ethip4-ip4src253 - From: 3-node-IPv6-dst-1000000 To: trex-sl-3n-ethip6-ip6dst1000000 - From: 3-node-IPv6-dst-100000 To: trex-sl-3n-ethip6-ip6dst100000 - From: 3-node-IPv6-dst-10000 To: trex-sl-3n-ethip6-ip6dst10000 - From: 3-node-IPv6 To: trex-sl-3n-ethip6-ip6src253 - From: 3-node-xconnect To: trex-sl-3n-ethip4-ip4src254 - From: 3-node-IPv4-SNAT-1000u-15p To: trex-sl-3n-ethip4udp-1000u15p - From: 3-node-IPv4-SNAT-100u-15p To: trex-sl-3n-ethip4udp-100u15p - From: 3-node-IPv4-SNAT-10u-15p To: trex-sl-3n-ethip4udp-10u15p - From: 3-node-IPv4-SNAT-1u-15p To: trex-sl-3n-ethip4udp-1u15p - From: 3-node-IPv4-SNAT-1u-1p To: trex-sl-3n-ethip4udp-1u1p - From: 3-node-IPv4-SNAT-2000u-15p To: trex-sl-3n-ethip4udp-2000u15p - From: 3-node-IPv4-SNAT-4000u-15p To: trex-sl-3n-ethip4udp-4000u15p Change-Id: If6a3cf204c93ff9f2cdccc5fd395e26b05483b58 Signed-off-by: Tibor Frank <tifrank@cisco.com>
Diffstat (limited to 'resources/tools/t-rex/stream_profiles/trex-sl-2n-ethip4-ip4src253.py')
-rwxr-xr-xresources/tools/t-rex/stream_profiles/trex-sl-2n-ethip4-ip4src253.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/resources/tools/t-rex/stream_profiles/trex-sl-2n-ethip4-ip4src253.py b/resources/tools/t-rex/stream_profiles/trex-sl-2n-ethip4-ip4src253.py
new file mode 100755
index 0000000000..f9a030b9eb
--- /dev/null
+++ b/resources/tools/t-rex/stream_profiles/trex-sl-2n-ethip4-ip4src253.py
@@ -0,0 +1,94 @@
+# Copyright (c) 2017 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Stream profile for T-rex traffic generator.
+
+Stream profile:
+ - Two streams sent in directions 0 --> 1 and 1 --> 0 at the same time.
+ - Packet: ETH / IP /
+ - Direction 0 --> 1:
+ - Source IP address range: 10.10.10.2 - 10.10.10.254
+ - Destination IP address range: 20.20.20.2
+ - Direction 1 --> 0:
+ - Source IP address range: 20.20.20.2 - 20.20.20.254
+ - Destination IP address range: 10.10.10.2
+"""
+
+from trex_stl_lib.api import *
+from profile_trex_stateless_base_class import TrafficStreamsBaseClass
+
+
+class TrafficStreams(TrafficStreamsBaseClass):
+ """Stream profile."""
+
+ def __init__(self):
+ """Initialization and setting of streams' parameters."""
+
+ super(TrafficStreamsBaseClass, self).__init__()
+
+ # IPs used in packet headers.
+ self.p1_src_start_ip = '10.10.10.2'
+ self.p1_src_end_ip = '10.10.10.254'
+ self.p1_dst_start_ip = '20.20.20.2'
+
+ self.p2_src_start_ip = '20.20.20.2'
+ self.p2_src_end_ip = '20.20.20.254'
+ self.p2_dst_start_ip = '10.10.10.2'
+
+ def define_packets(self):
+ """Defines the packets to be sent from the traffic generator.
+
+ Packet definition: | ETH | IP |
+
+ :returns: Packets to be sent from the traffic generator.
+ :rtype: tuple
+ """
+
+ # Direction 0 --> 1
+ base_pkt_a = Ether() / IP(src=self.p1_src_start_ip,
+ dst=self.p1_dst_start_ip,
+ proto=61)
+ # Direction 1 --> 0
+ base_pkt_b = Ether() / IP(src=self.p2_src_start_ip,
+ dst=self.p2_dst_start_ip,
+ proto=61)
+
+ # Direction 0 --> 1
+ vm1 = STLScVmRaw([STLVmFlowVar(name="src",
+ min_value=self.p1_src_start_ip,
+ max_value=self.p1_src_end_ip,
+ size=4, op="inc"),
+ STLVmWrFlowVar(fv_name="src", pkt_offset="IP.src"),
+ STLVmFixIpv4(offset="IP")],
+ split_by_field="src")
+ # Direction 1 --> 0
+ vm2 = STLScVmRaw([STLVmFlowVar(name="src",
+ min_value=self.p2_src_start_ip,
+ max_value=self.p2_src_end_ip,
+ size=4, op="inc"),
+ STLVmWrFlowVar(fv_name="src", pkt_offset="IP.src"),
+ STLVmFixIpv4(offset="IP")],
+ split_by_field="src")
+
+ return base_pkt_a, base_pkt_b, vm1, vm2
+
+
+def register():
+ """Register this traffic profile to T-rex.
+
+ Do not change this function.
+
+ :return: Traffic streams.
+ :rtype: Object
+ """
+ return TrafficStreams()
span> u8 *a = va_arg (*args, u8 *); return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]); } /* Format an IP4 route destination and length. */ u8 * format_ip4_address_and_length (u8 * s, va_list * args) { u8 *a = va_arg (*args, u8 *); u8 l = va_arg (*args, u32); return format (s, "%U/%d", format_ip4_address, a, l); } /* Parse an IP4 address %d.%d.%d.%d. */ uword unformat_ip4_address (unformat_input_t * input, va_list * args) { u8 *result = va_arg (*args, u8 *); unsigned a[4]; if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])) return 0; if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256) return 0; result[0] = a[0]; result[1] = a[1]; result[2] = a[2]; result[3] = a[3]; return 1; } /* Format an IP4 header. */ u8 * format_ip4_header (u8 * s, va_list * args) { ip4_header_t *ip = va_arg (*args, ip4_header_t *); u32 max_header_bytes = va_arg (*args, u32); u32 ip_version, header_bytes; uword indent; /* Nothing to do. */ if (max_header_bytes < sizeof (ip[0])) return format (s, "IP header truncated"); indent = format_get_indent (s); indent += 2; ip_version = (ip->ip_version_and_header_length >> 4); header_bytes = (ip->ip_version_and_header_length & 0xf) * sizeof (u32); s = format (s, "%U: %U -> %U", format_ip_protocol, ip->protocol, format_ip4_address, ip->src_address.data, format_ip4_address, ip->dst_address.data); /* Show IP version and header length only with unexpected values. */ if (ip_version != 4 || header_bytes != sizeof (ip4_header_t)) s = format (s, "\n%Uversion %d, header length %d", format_white_space, indent, ip_version, header_bytes); s = format (s, "\n%Utos 0x%02x, ttl %d, length %d, checksum 0x%04x", format_white_space, indent, ip->tos, ip->ttl, clib_net_to_host_u16 (ip->length), clib_net_to_host_u16 (ip->checksum)); /* Check and report invalid checksums. */ { u16 c = ip4_header_checksum (ip); if (c != ip->checksum) s = format (s, " (should be 0x%04x)", clib_net_to_host_u16 (c)); } { u32 f = clib_net_to_host_u16 (ip->flags_and_fragment_offset); u32 o; s = format (s, "\n%Ufragment id 0x%04x", format_white_space, indent, clib_net_to_host_u16 (ip->fragment_id)); /* Fragment offset. */ o = 8 * (f & 0x1fff); f ^= o; if (o != 0) s = format (s, " offset %d", o); if (f != 0) { s = format (s, ", flags "); #define _(l) if (f & IP4_HEADER_FLAG_##l) s = format (s, #l); _(MORE_FRAGMENTS); _(DONT_FRAGMENT); _(CONGESTION); #undef _ } } /* Recurse into next protocol layer. */ if (max_header_bytes != 0 && header_bytes < max_header_bytes) { ip_main_t *im = &ip_main; ip_protocol_info_t *pi = ip_get_protocol_info (im, ip->protocol); if (pi && pi->format_header) s = format (s, "\n%U%U", format_white_space, indent - 2, pi->format_header, /* next protocol header */ (void *) ip + header_bytes, max_header_bytes - header_bytes); } return s; } /* Parse an IP4 header. */ uword unformat_ip4_header (unformat_input_t * input, va_list * args) { u8 **result = va_arg (*args, u8 **); ip4_header_t *ip; int old_length; /* Allocate space for IP header. */ { void *p; old_length = vec_len (*result); vec_add2 (*result, p, sizeof (ip4_header_t)); ip = p; } memset (ip, 0, sizeof (ip[0])); ip->ip_version_and_header_length = IP4_VERSION_AND_HEADER_LENGTH_NO_OPTIONS; if (!unformat (input, "%U: %U -> %U", unformat_ip_protocol, &ip->protocol, unformat_ip4_address, &ip->src_address, unformat_ip4_address, &ip->dst_address)) return 0; /* Parse options. */ while (1) { int i, j; if (unformat (input, "tos %U", unformat_vlib_number, &i)) ip->tos = i; else if (unformat (input, "ttl %U", unformat_vlib_number, &i)) ip->ttl = i; else if (unformat (input, "fragment id %U offset %U", unformat_vlib_number, &i, unformat_vlib_number, &j)) { ip->fragment_id = clib_host_to_net_u16 (i); ip->flags_and_fragment_offset |= clib_host_to_net_u16 ((i / 8) & 0x1fff); } /* Flags. */ else if (unformat (input, "mf") || unformat (input, "MF")) ip->flags_and_fragment_offset |= clib_host_to_net_u16 (IP4_HEADER_FLAG_MORE_FRAGMENTS); else if (unformat (input, "df") || unformat (input, "DF")) ip->flags_and_fragment_offset |= clib_host_to_net_u16 (IP4_HEADER_FLAG_DONT_FRAGMENT); else if (unformat (input, "ce") || unformat (input, "CE")) ip->flags_and_fragment_offset |= clib_host_to_net_u16 (IP4_HEADER_FLAG_CONGESTION); /* Can't parse input: try next protocol level. */ else break; } /* Fill in checksum. */ ip->checksum = ip4_header_checksum (ip); /* Recurse into next protocol layer. */ { ip_main_t *im = &ip_main; ip_protocol_info_t *pi = ip_get_protocol_info (im, ip->protocol); if (pi && pi->unformat_header) { if (!unformat_user (input, pi->unformat_header, result)) return 0; /* Result may have moved. */ ip = (void *) *result + old_length; } } /* Fill in IP length. */ ip->length = clib_host_to_net_u16 (vec_len (*result) - old_length); return 1; } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */