From c5c5d3d675f255452c596167ed28e2ce88383af6 Mon Sep 17 00:00:00 2001 From: Deepak S Date: Tue, 20 Jun 2017 14:15:18 -0700 Subject: [PATCH] Sample CGNAPT VNF Change-Id: I0f5555a1674a5ecb7e2afb508d495b7872c90757 Signed-off-by: Deepak S Signed-off-by: Edward MacGillivray Signed-off-by: Ross Brattain --- .../nsut/cgnapt/cgnapt-vnf-topology-3node.yaml | 53 + .../nsut/cgnapt/cgnapt-vnf-topology.yaml | 50 + .../nsut/cgnapt/cgnapt_vnf_topology_ixia.yaml | 50 + .../nsut/cgnapt/cgnapt_vnf_topology_ixload.yaml | 50 + samples/vnf_samples/nsut/cgnapt/cgnat.cfg | 90 ++ samples/vnf_samples/nsut/cgnapt/ixia_traffic.cfg | 51 + ..._http_ixload_1b_Requests-65000_Concurrency.yaml | 39 + .../tc_baremetal_rfc2544_ipv4_1flow_64B_ixia.yaml | 43 + .../tc_baremetal_rfc2544_ipv4_1flow_64B_trex.yaml | 42 + ...2544_ipv4_1flow_64B_trex_corelated_traffic.yaml | 45 + ...metal_rfc2544_ipv4_1flow_64B_trex_scale_up.yaml | 44 + ...l_rfc2544_with_latency_ipv4_1flow_64B_trex.yaml | 43 + .../cgnapt/HTTP-vCGNAPT_IPv4_2Ports.rxf | 1335 ++++++++++++++++++++ .../cgnapt/cgnat_ipv4_profile_1flows.ixncfg | Bin 0 -> 71988 bytes .../traffic_profiles/ipv4_throughput_cgnapt.yaml | 89 ++ .../vnf_samples/vnf_descriptors/cgnapt_vnf.yaml | 79 ++ .../vnf_generic/vnf/test_cgnapt_vnf.py | 481 +++++++ .../network_services/vnf_generic/vnf/cgnapt_vnf.py | 123 ++ 18 files changed, 2707 insertions(+) create mode 100644 samples/vnf_samples/nsut/cgnapt/cgnapt-vnf-topology-3node.yaml create mode 100644 samples/vnf_samples/nsut/cgnapt/cgnapt-vnf-topology.yaml create mode 100644 samples/vnf_samples/nsut/cgnapt/cgnapt_vnf_topology_ixia.yaml create mode 100644 samples/vnf_samples/nsut/cgnapt/cgnapt_vnf_topology_ixload.yaml create mode 100644 samples/vnf_samples/nsut/cgnapt/cgnat.cfg create mode 100644 samples/vnf_samples/nsut/cgnapt/ixia_traffic.cfg create mode 100644 samples/vnf_samples/nsut/cgnapt/tc_baremetal_http_ixload_1b_Requests-65000_Concurrency.yaml create mode 100644 samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_ixia.yaml create mode 100644 samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex.yaml create mode 100644 samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex_corelated_traffic.yaml create mode 100644 samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex_scale_up.yaml create mode 100644 samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_with_latency_ipv4_1flow_64B_trex.yaml create mode 100644 samples/vnf_samples/traffic_profiles/cgnapt/HTTP-vCGNAPT_IPv4_2Ports.rxf create mode 100644 samples/vnf_samples/traffic_profiles/cgnapt/cgnat_ipv4_profile_1flows.ixncfg create mode 100644 samples/vnf_samples/traffic_profiles/ipv4_throughput_cgnapt.yaml create mode 100644 samples/vnf_samples/vnf_descriptors/cgnapt_vnf.yaml create mode 100644 tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py create mode 100644 yardstick/network_services/vnf_generic/vnf/cgnapt_vnf.py diff --git a/samples/vnf_samples/nsut/cgnapt/cgnapt-vnf-topology-3node.yaml b/samples/vnf_samples/nsut/cgnapt/cgnapt-vnf-topology-3node.yaml new file mode 100644 index 000000000..24407dc88 --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/cgnapt-vnf-topology-3node.yaml @@ -0,0 +1,53 @@ +# Copyright (c) 2016 Intel Corporation +# +# 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. + +nsd:nsd-catalog: + nsd: + - id: 3tg-topology + name: 3tg-topology + short-name: 3tg-topology + description: 3tg-topology + constituent-vnfd: + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml #VNF type + - member-vnf-index: '2' + vnfd-id-ref: vnf__1 + VNF model: ../../vnf_descriptors/cgnapt_vnf.yaml #VNF type + - member-vnf-index: '3' + vnfd-id-ref: tg__2 + VNF model: ../../vnf_descriptors/udp_replay_vnf.yaml #VNF type + + vld: + - id: private_1 + name: tg__1 to vnf__1 link 1 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__1 + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__1 + + - id: public_1 + name: vnf__1 to tg__2 link 2 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__1 + - member-vnf-index-ref: '3' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__2 diff --git a/samples/vnf_samples/nsut/cgnapt/cgnapt-vnf-topology.yaml b/samples/vnf_samples/nsut/cgnapt/cgnapt-vnf-topology.yaml new file mode 100644 index 000000000..e668c2eb9 --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/cgnapt-vnf-topology.yaml @@ -0,0 +1,50 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +nsd:nsd-catalog: + nsd: + - id: 3tg-topology + name: 3tg-topology + short-name: 3tg-topology + description: 3tg-topology + constituent-vnfd: + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml #VNF type + - member-vnf-index: '2' + vnfd-id-ref: vnf__1 + VNF model: ../../vnf_descriptors/cgnapt_vnf.yaml #VNF type + + vld: + - id: private_1 + name: tg__1 to vnf__1 link 1 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__1 + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__1 + + - id: public_1 + name: vnf__1 to tg__1 link 2 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__1 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__1 diff --git a/samples/vnf_samples/nsut/cgnapt/cgnapt_vnf_topology_ixia.yaml b/samples/vnf_samples/nsut/cgnapt/cgnapt_vnf_topology_ixia.yaml new file mode 100644 index 000000000..a13a64fd5 --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/cgnapt_vnf_topology_ixia.yaml @@ -0,0 +1,50 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +nsd:nsd-catalog: + nsd: + - id: vCGNAPT + name: vCGNAPT + short-name: vCGNAPT + description: scenario with vCGNAPT VNF + constituent-vnfd: + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/ixia_rfc2544_tpl.yaml + - member-vnf-index: '2' + vnfd-id-ref: vnf__1 + VNF model: ../../vnf_descriptors/cgnapt_vnf.yaml + + vld: + - id: private_1 + name: tg__1 to vnf__1 link 1 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__1 + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__1 + + - id: public_1 + name: vnf__1 to tg__1 link 2 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__1 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__1 diff --git a/samples/vnf_samples/nsut/cgnapt/cgnapt_vnf_topology_ixload.yaml b/samples/vnf_samples/nsut/cgnapt/cgnapt_vnf_topology_ixload.yaml new file mode 100644 index 000000000..b4feaf03d --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/cgnapt_vnf_topology_ixload.yaml @@ -0,0 +1,50 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +nsd:nsd-catalog: + nsd: + - id: VCGNAPT + name: VCGNAPT + short-name: VCGNAPT + description: scenario with HTTP and vCGNAPT VNF + constituent-vnfd: + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/tg_ixload.yaml + - member-vnf-index: '2' + vnfd-id-ref: vnf__1 + VNF model: ../../vnf_descriptors/cgnapt_vnf.yaml + + vld: + - id: private_1 + name: tg__1 to vnf__1 link 1 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__1 # HTTP Client + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__1 # VNF + + - id: public_1 + name: vnf__1 to tg__1 link 2 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__1 # HTTP Server + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__1 # VCGNAPT VNF diff --git a/samples/vnf_samples/nsut/cgnapt/cgnat.cfg b/samples/vnf_samples/nsut/cgnapt/cgnat.cfg new file mode 100644 index 000000000..8b16f57f6 --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/cgnat.cfg @@ -0,0 +1,90 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +[PIPELINE0] +type = MASTER +core = 0 +[PIPELINE1] +type = ARPICMP +core = 1 + +pktq_in = SWQ4 +pktq_out = TXQ0.0 TXQ1.0 TXQ2.0 TXQ3.0 +; ARP route table entries (ip, mask, if_port, nh) hex values with no 0x +arp_route_tbl = (c0102814,fffff000,1,c0102814) (c0106414,fffff000,0,c0106414) +;arp_route_tbl = (c0122814,fffff000,3,c0122814) (c0126414,fffff000,1,c0126414) +; Link MAC addresses in order aa:bb:cc:dd:ee:ff separated by space +nd_route_tbl = (0064:ff9b:0:0:0:0:9810:6414,120,0,0064:ff9b:0:0:0:0:9810:6414) +; +; Hex values with no leading 0x, MACs in ascending port order starting @P0 +;ports_mac_list = 00:05:CA:30:21:F0 00:05:CA:30:21:F1 ;00:05:CA:30:21:F2 00:05:CA:30:21:F3 +; +; egress (private interface) info +pktq_in_prv = RXQ0.0 +; +;for pub port <-> prv port mapping (prv, pub) +prv_to_pub_map = (0,1) +;lib_arp_debug = 0 +[PIPELINE2] +type = TIMER +core = 2 +n_flows = 1048576 +[PIPELINE3] +type = TXRX +core = 3 +pipeline_txrx_type = RXRX +dest_if_offset = 176 +pktq_in = RXQ0.0 RXQ1.0 RXQ2.0 RXQ3.0 +pktq_out = SWQ0 SWQ1 SWQ2 SWQ3 SWQ4 +; +[PIPELINE4] +type = LOADB +core = 4 +pktq_in = SWQ0 SWQ1 SWQ2 SWQ3 +pktq_out = SWQ4 SWQ5 SWQ6 SWQ7 SWQ8 SWQ9 SWQ10 SWQ11 +outport_offset = 136; 8 +n_vnf_threads = 2 +;loadb_debug = 0 +[PIPELINE5] +type = CGNAPT +core = 5 +pktq_in = SWQ4 SWQ5 SWQ6 SWQ7 +pktq_out = SWQ12 SWQ13 SWQ14 SWQ15 +; +; to make pipeline timer as 1-sec granularity +; +phyport_offset = 204 +n_flows = 1048576 +key_offset = 192;64 +key_size = 8 +hash_offset = 200;72 +;cgnapt_debug = 2 +; +timer_period = 100 +max_clients_per_ip = 65535 +max_port_per_client = 10 +public_ip_port_range = 98103214:(1, 65535) +vnf_set = (3,4,5) +pkt_type = ipv4 +cgnapt_meta_offset = 128 +prv_que_handler = (0) + + +[PIPELINE7] +type = TXRX +core = 7 +pipeline_txrx_type = TXTX +dest_if_offset = 176 +pktq_in = SWQ12 SWQ13 SWQ14 SWQ15 SWQ16 SWQ17 SWQ18 SWQ19 +pktq_out = TXQ0.1 TXQ1.1 TXQ2.1 TXQ3.1 TXQ0.2 TXQ1.2 TXQ2.2 TXQ3.2 diff --git a/samples/vnf_samples/nsut/cgnapt/ixia_traffic.cfg b/samples/vnf_samples/nsut/cgnapt/ixia_traffic.cfg new file mode 100644 index 000000000..f749865c5 --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/ixia_traffic.cfg @@ -0,0 +1,51 @@ +{ + "private_1": { + "id": 1, + "bidir": "False", + "duration": 60, + "iload": "100", + "outer_l2": { + "dstmac": "00:00:00:00:00:03", + "framesPerSecond": true, + "framesize": 64, + "srcmac": "00:00:00:00:00:01" + }, + "outer_l3": { + "dscp": 0, + "dstip4": "152.16.40.20", + "proto": "udp", + "srcip4": "152.16.100.20", + "ttl": 32 + }, + "outer_l4": { + "dstport": "2001", + "srcport": "1234" + }, + "traffic_type": "continuous" + }, + "public_1": { + "id": 2, + "bidir": "False", + "duration": 60, + "iload": "100", + "outer_l2": { + "dstmac": "00:00:00:00:00:04", + "framesPerSecond": true, + "framesize": 64, + "srcmac": "00:00:00:00:00:01" + }, + "outer_l3": { + "count": 1024, + "dscp": 0, + "dstip4": "152.16.100.20", + "proto": "udp", + "srcip4": "152.16.40.20", + "ttl": 32 + }, + "outer_l4": { + "dstport": "1234", + "srcport": "2001" + }, + "traffic_type": "continuous" + } +} diff --git a/samples/vnf_samples/nsut/cgnapt/tc_baremetal_http_ixload_1b_Requests-65000_Concurrency.yaml b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_http_ixload_1b_Requests-65000_Concurrency.yaml new file mode 100644 index 000000000..7e9a589ad --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_http_ixload_1b_Requests-65000_Concurrency.yaml @@ -0,0 +1,39 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +--- +schema: yardstick:task:0.1 +scenarios: +- type: NSPerf + traffic_profile: "../../traffic_profiles/http_tests/HTTP_1b-requests_65000_concurrency.yaml" + topology: cgnapt_vnf_topology_ixload.yaml + nodes: + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + options: + packetsize: 64 + traffic_type: 4 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf__1: + vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1} + runner: + type: Duration + duration: 5 + ixia_profile: ../../traffic_profiles/cgnapt/HTTP-vCGNAPT_IPv4_2Ports.rxf # Need vlan update +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod.yaml diff --git a/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_ixia.yaml b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_ixia.yaml new file mode 100644 index 000000000..5203e8d0a --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_ixia.yaml @@ -0,0 +1,43 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +--- +schema: yardstick:task:0.1 +scenarios: +- type: NSPerf + traffic_profile: "../../traffic_profiles/ixia_ipv4_latency.yaml" + topology: cgnapt_vnf_topology_ixia.yaml + nodes: + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + options: + packetsize: 64 + traffic_type: 4 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf__1: + vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1} + runner: + type: Iteration + iterations: 10 + interval: 35 + traffic_options: + flow: "../../traffic_profiles/ipv4_1flow_Packets.yaml" + imix: "../../traffic_profiles/imix_voice.yaml" + ixia_profile: ../../traffic_profiles/cgnapt/cgnat_ipv4_profile_1flows.ixncfg +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod.yaml diff --git a/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex.yaml b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex.yaml new file mode 100644 index 000000000..feeacf5b0 --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex.yaml @@ -0,0 +1,42 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +--- +schema: yardstick:task:0.1 +scenarios: +- type: NSPerf + traffic_profile: ../../traffic_profiles/ipv4_throughput_cgnapt.yaml + topology: cgnapt-vnf-topology.yaml + nodes: + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + options: + packetsize: 64 + traffic_type: 4 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf__1: + vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1} + runner: + type: Iteration + iterations: 10 + interval: 35 + traffic_options: + flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml + imix: ../../traffic_profiles/imix_voice.yaml +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod.yaml diff --git a/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex_corelated_traffic.yaml b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex_corelated_traffic.yaml new file mode 100644 index 000000000..b5548d5ba --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex_corelated_traffic.yaml @@ -0,0 +1,45 @@ +# Copyright (c) 2016 Intel Corporation +# +# 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. + +--- +schema: yardstick:task:0.1 +scenarios: +- type: NSPerf + traffic_profile: ../../traffic_profiles/ipv4_throughput_cgnapt.yaml + topology: cgnapt-vnf-topology-3node.yaml + nodes: + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + tg__2: trafficgen_2.yardstick + options: + packetsize: 64 + traffic_type: 4 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + corelated_traffic: true + vnf__1: + vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1} + napt: 'dynamic' + runner: + type: Iteration + iterations: 10 + interval: 35 + traffic_options: + flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml + imix: ../../traffic_profiles/imix_voice.yaml +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod_3node.yaml diff --git a/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex_scale_up.yaml b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex_scale_up.yaml new file mode 100644 index 000000000..7d746f0de --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_ipv4_1flow_64B_trex_scale_up.yaml @@ -0,0 +1,44 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +--- +schema: yardstick:task:0.1 +scenarios: +{% for worker_thread in [1, 2 ,3 , 4, 5, 6] %} +- type: NSPerf + traffic_profile: ../../traffic_profiles/ipv4_throughput_cgnapt.yaml + topology: cgnapt-vnf-topology.yaml + nodes: + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + options: + packetsize: 64 + traffic_type: 4 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf__1: + vnf_config: {lb_config: 'HW', lb_count: 1, worker_config: '1C/1T', worker_threads: {{worker_thread}}} + runner: + type: Iteration + iterations: 10 + interval: 35 + traffic_options: + flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml + imix: ../../traffic_profiles/imix_voice.yaml +{% endfor %} +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod.yaml diff --git a/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_with_latency_ipv4_1flow_64B_trex.yaml b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_with_latency_ipv4_1flow_64B_trex.yaml new file mode 100644 index 000000000..16d0d08cd --- /dev/null +++ b/samples/vnf_samples/nsut/cgnapt/tc_baremetal_rfc2544_with_latency_ipv4_1flow_64B_trex.yaml @@ -0,0 +1,43 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +--- +schema: yardstick:task:0.1 +scenarios: +- type: NSPerf + traffic_profile: ../../traffic_profiles/ipv4_throughput_cgnapt.yaml + topology: cgnapt-vnf-topology.yaml + nodes: + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + options: + packetsize: 64 + traffic_type: 4 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + latency: true + vnf__1: + vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1} + runner: + type: Iteration + iterations: 28 + interval: 35 + traffic_options: + flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml + imix: ../../traffic_profiles/imix_voice.yaml +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod.yaml diff --git a/samples/vnf_samples/traffic_profiles/cgnapt/HTTP-vCGNAPT_IPv4_2Ports.rxf b/samples/vnf_samples/traffic_profiles/cgnapt/HTTP-vCGNAPT_IPv4_2Ports.rxf new file mode 100644 index 000000000..a454beba7 --- /dev/null +++ b/samples/vnf_samples/traffic_profiles/cgnapt/HTTP-vCGNAPT_IPv4_2Ports.rxf @@ -0,0 +1,1335 @@ + + + <_smSessionXml ver="[0, [1, [0, [0]]]]" type="ixSMSessionXML"> + <rpf> <Ixia.Aptixia.StackManager.SMSession type="Ixia.Aptixia.StackManager.SMSession" objectid="a1e46af9-15aa-4923-8410-c81d0cdf0836" version="6.70.420"> <doWaitLinkUp type="Bool">0</doWaitLinkUp> <doGratArp type="Bool">0</doGratArp> <subscribeToGratArpNotifications type="Bool">0</subscribeToGratArpNotifications> <doInterfaceCheck type="Bool">0</doInterfaceCheck> <rebootPortsBeforeConfigure type="Bool">0</rebootPortsBeforeConfigure> <testDuration type="Int">10000</testDuration> <checkLinkState type="Bool">0</checkLinkState> <portGroupList type="ListNode"> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="865be042-32d5-426a-9e75-0908c943801f" version="6.70.420"> <name type="String">client network</name> <category type="String" /> <stack type="Ixia.Aptixia.StackManager.L1EthernetPlugin" objectid="1dcd6e1b-17cd-45a1-875a-cbea40d3468c" version="6.70.420"> <autoNegotiate type="Bool">1</autoNegotiate> <speed type="String">k100FD</speed> <advertise10Half type="Bool">1</advertise10Half> <advertise10Full type="Bool">1</advertise10Full> <advertise100Half type="Bool">1</advertise100Half> <advertise100Full type="Bool">1</advertise100Full> <advertise1000Full type="Bool">1</advertise1000Full> <cardDualPhy type="Ixia.Aptixia.StackManager.DualPhyPlugin" objectid="b458c333-b4d4-48ef-bd38-3b456f72f8c8" version="6.70.420"> <medium type="String">auto</medium> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </cardDualPhy> <cardElm type="Ixia.Aptixia.StackManager.EthernetELMPlugin" objectid="28c0383a-76a7-4750-8162-2ad946ddac97" version="6.70.420"> <negotiateMasterSlave type="Bool">1</negotiateMasterSlave> <negotiationType type="String">master</negotiationType> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </cardElm> <enableFlowControl type="Bool">0</enableFlowControl> <directedAddress type="String">01:80:C2:00:00:01</directedAddress> <dataCenter type="Ixia.Aptixia.StackManager.DataCenterSettings" objectid="b9a0be2e-3880-4100-9e29-9b474f9301f4" version="6.70.420"> <dcSupported type="Bool">1</dcSupported> <dcEnabled type="Bool">0</dcEnabled> <dcFlowControl type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType">0</dcFlowControl> <dcMode type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode">2</dcMode> <dcPfcMapping type="IntList" /> <dcPfcPauseEnable type="Bool">0</dcPfcPauseEnable> <dcPfcPauseDelay type="Int">1</dcPfcPauseDelay> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </dataCenter> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.L2EthernetPlugin type="Ixia.Aptixia.StackManager.L2EthernetPlugin" objectid="e0232591-010e-492c-8a28-75e436f4adb2" version="6.70.420"> <macRangeList type="ListNode"> <Ixia.Aptixia.StackManager.MacRange type="Ixia.Aptixia.StackManager.MacRange" objectid="3011c8a8-a9fd-4b76-a27d-91948113ed4f" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">MAC-R1</name> <mac type="String">00:98:10:64:14:00</mac> <incrementBy type="String">00:00:00:00:00:01</incrementBy> <mtu type="Int">1500</mtu> <count type="Int">1</count> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="adb27552-7165-46a3-bc9e-04914adf40ac" version="6.70.420"> <name type="String">VLAN-R1</name> <enabled type="Bool">0</enabled> <firstId type="Int">1</firstId> <incrementStep type="Int">100</incrementStep> <increment type="Int">1</increment> <uniqueCount type="Int">4094</uniqueCount> <priority type="Int">0</priority> <tpid type="String">0x8100</tpid> <innerEnable type="Bool">0</innerEnable> <innerFirstId type="Int">1</innerFirstId> <innerIncrementStep type="Int">1</innerIncrementStep> <innerIncrement type="Int">1</innerIncrement> <innerUniqueCount type="Int">4094</innerUniqueCount> <innerPriority type="Int">0</innerPriority> <idIncrMode type="Int">1</idIncrMode> <innerTpid type="String">0x8100</innerTpid> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </vlanRange> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MacRange> </macRangeList> <vlanRangeList type="ListNode"> <Ixia.Aptixia.StackManager.VlanIdRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="adb27552-7165-46a3-bc9e-04914adf40ac" version="6.70.420" /> </vlanRangeList> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Plugin type="Ixia.Aptixia.StackManager.IpV4V6Plugin" objectid="a916ae0f-0731-405d-ad19-eaade6c515f1" version="6.70.420"> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="a3559674-8d95-4020-90b3-b42eacaef105" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">IP-R1</name> <ipType type="String">IPv4</ipType> <ipAddress type="String">152.16.100.20</ipAddress> <prefix type="Int">24</prefix> <incrementBy type="String">0.0.0.1</incrementBy> <count type="Int">1</count> <autoCountEnabled type="Bool">0</autoCountEnabled> <gatewayAddress type="String">152.16.100.10</gatewayAddress> <gatewayIncrement type="String">0.0.0.0</gatewayIncrement> <gatewayIncrementMode type="String">perSubnet</gatewayIncrementMode> <enableGatewayArp type="Bool">0</enableGatewayArp> <generateStatistics type="Bool">0</generateStatistics> <mss type="Int">1460</mss> <randomizeAddress type="Bool">0</randomizeAddress> <randomizeSeed type="Int">2596329041</randomizeSeed> <autoMacGeneration type="Bool">1</autoMacGeneration> <macRange type="Ixia.Aptixia.StackManager.MacRange" objectid="3011c8a8-a9fd-4b76-a27d-91948113ed4f" version="6.70.420" /> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="adb27552-7165-46a3-bc9e-04914adf40ac" version="6.70.420" /> <atmRange type="Ixia.Aptixia.StackManager.AtmRange" objectid="00000000-0000-0000-0000-000000000000" /> <pvcRange type="Ixia.Aptixia.StackManager.PvcRange" objectid="00000000-0000-0000-0000-000000000000" /> <autoIpTypeEnabled type="Bool">0</autoIpTypeEnabled> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Range> </rangeList> <rangeGroups type="ListNode"> <Ixia.Aptixia.StackManager.RangeGroup type="Ixia.Aptixia.StackManager.RangeGroup" objectid="aa33a76b-9c7f-48d9-a537-8d6eeec03662" version="6.70.420"> <name type="String">DistGroup1</name> <distribType type="Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType">0</distribType> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="a3559674-8d95-4020-90b3-b42eacaef105" version="6.70.420" /> </rangeList> </Ixia.Aptixia.StackManager.RangeGroup> </rangeGroups> <childrenList type="ListNode" /> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">IP-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Plugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">MAC/VLAN-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.L2EthernetPlugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">Ethernet-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </stack> <globalPluginList type="ListNode"> <Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type="Ixia.Aptixia.StackManager.IxLoadSettingsPlugin" objectid="9c6c8594-548e-4ea5-a478-0bfb6252c1ce" version="1.0.0"> <teardownInterfaceWithUser type="Bool">0</teardownInterfaceWithUser> <interfaceBehavior type="Int">0</interfaceBehavior> <name type="String">Settings-2</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IxLoadSettingsPlugin> <Ixia.Aptixia.StackManager.DnsPlugin type="Ixia.Aptixia.StackManager.DnsPlugin" objectid="693c7b7b-327b-4d59-b187-57d7600308e3" version="6.70.420"> <domain type="String" /> <timeout type="Int">30000</timeout> <nameServerList type="ListNode" /> <searchList type="ListNode" /> <hostList type="ListNode" /> <name type="String">DNS-2</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.DnsPlugin> <Ixia.Aptixia.StackManager.FilterPlugin type="Ixia.Aptixia.StackManager.FilterPlugin" objectid="0f6ebdb4-7909-447a-b80a-e132dae33a9b" version="6.70.420"> <auto type="Bool">1</auto> <all type="Bool">0</all> <pppoecontrol type="Bool">0</pppoecontrol> <pppoenetwork type="Bool">0</pppoenetwork> <isis type="Bool">0</isis> <ip type="String" /> <tcp type="String" /> <udp type="String" /> <mac type="String" /> <icmp type="String" /> <name type="String">Filter-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.FilterPlugin> <Ixia.Aptixia.StackManager.TCPPlugin type="Ixia.Aptixia.StackManager.TCPPlugin" objectid="7a893f25-0ac6-41c7-ab5a-511c2068582a" version="6.70.420"> <bestPerfSettings type="Bool">0</bestPerfSettings> <accept_ra_all type="Bool">0</accept_ra_all> <tcp_abort_on_overflow type="Bool">0</tcp_abort_on_overflow> <tcp_adv_win_scale type="Int">2</tcp_adv_win_scale> <tcp_app_win type="Int">31</tcp_app_win> <tcp_bic type="Int">0</tcp_bic> <tcp_bic_fast_convergence type="Int">1</tcp_bic_fast_convergence> <tcp_bic_low_window type="Int">14</tcp_bic_low_window> <tcp_dsack type="Bool">1</tcp_dsack> <tcp_ecn type="Bool">0</tcp_ecn> <tcp_fack type="Bool">1</tcp_fack> <tcp_fin_timeout type="Int">60</tcp_fin_timeout> <tcp_frto type="Int">0</tcp_frto> <tcp_keepalive_intvl type="Int">7200</tcp_keepalive_intvl> <tcp_keepalive_probes type="Int">75</tcp_keepalive_probes> <tcp_keepalive_time type="Int">9</tcp_keepalive_time> <tcp_low_latency type="Int">0</tcp_low_latency> <tcp_max_orphans type="Int">8192</tcp_max_orphans> <tcp_max_syn_backlog type="Int">1024</tcp_max_syn_backlog> <tcp_max_tw_buckets type="Int">180000</tcp_max_tw_buckets> <tcp_mem_low type="Int">24576</tcp_mem_low> <tcp_mem_pressure type="Int">32768</tcp_mem_pressure> <tcp_mem_high type="Int">49152</tcp_mem_high> <tcp_moderate_rcvbuf type="Int">0</tcp_moderate_rcvbuf> <tcp_no_metrics_save type="Bool">0</tcp_no_metrics_save> <tcp_orphan_retries type="Int">0</tcp_orphan_retries> <tcp_reordering type="Int">3</tcp_reordering> <tcp_retrans_collapse type="Bool">1</tcp_retrans_collapse> <tcp_retries1 type="Int">3</tcp_retries1> <tcp_retries2 type="Int">15</tcp_retries2> <tcp_rfc1337 type="Bool">0</tcp_rfc1337> <tcp_rmem_min type="Int">4096</tcp_rmem_min> <tcp_rmem_default type="Int">1024</tcp_rmem_default> <tcp_rmem_max type="Int">262144</tcp_rmem_max> <tcp_sack type="Bool">1</tcp_sack> <tcp_stdurg type="Bool">0</tcp_stdurg> <tcp_synack_retries type="Int">5</tcp_synack_retries> <tcp_syn_retries type="Int">5</tcp_syn_retries> <tcp_timestamps type="Bool">1</tcp_timestamps> <tcp_tw_recycle type="Bool">1</tcp_tw_recycle> <tcp_tw_reuse type="Bool">0</tcp_tw_reuse> <tcp_vegas_alpha type="Int">2</tcp_vegas_alpha> <tcp_vegas_beta type="Int">6</tcp_vegas_beta> <tcp_vegas_cong_avoid type="Int">0</tcp_vegas_cong_avoid> <tcp_vegas_gamma type="Int">2</tcp_vegas_gamma> <tcp_westwood type="Int">0</tcp_westwood> <tcp_window_scaling type="Bool">0</tcp_window_scaling> <ip_no_pmtu_disc type="Bool">1</ip_no_pmtu_disc> <tcp_wmem_min type="Int">4096</tcp_wmem_min> <tcp_wmem_default type="Int">1024</tcp_wmem_default> <tcp_wmem_max type="Int">262144</tcp_wmem_max> <tcp_ipfrag_time type="Int">30</tcp_ipfrag_time> <tcp_port_min type="Int">1024</tcp_port_min> <tcp_port_max type="Int">65535</tcp_port_max> <tcp_rto_min type="Int">1000</tcp_rto_min> <tcp_rto_max type="Int">120000</tcp_rto_max> <tcp_tw_rfc1323_strict type="Bool">0</tcp_tw_rfc1323_strict> <udp_port_randomization type="Bool">0</udp_port_randomization> <disable_min_max_buffer_size type="Bool">1</disable_min_max_buffer_size> <llm_hdr_gap type="Int">8</llm_hdr_gap> <llm_hdr_gap_ns type="Int">10</llm_hdr_gap_ns> <inter_packet_granular_delay type="Double">0</inter_packet_granular_delay> <delayed_acks type="Bool">1</delayed_acks> <accept_ra_default type="Bool">0</accept_ra_default> <rps_needed type="Bool">0</rps_needed> <delayed_acks_segments type="Int">0</delayed_acks_segments> <delayed_acks_timeout type="Int">0</delayed_acks_timeout> <tcp_large_icwnd type="Int">0</tcp_large_icwnd> <tcp_mgmt_rmem type="Int">87380</tcp_mgmt_rmem> <tcp_mgmt_wmem type="Int">32768</tcp_mgmt_wmem> <adjust_tcp_buffers type="Bool">1</adjust_tcp_buffers> <name type="String">TCP-2</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.TCPPlugin> <Ixia.Aptixia.StackManager.GratArpPlugin type="Ixia.Aptixia.StackManager.GratArpPlugin" objectid="fc54eec4-41ef-4b6c-9415-bf639013b52d" version="6.70.420"> <enabled type="Bool">1</enabled> <forwardGratArp type="Bool">0</forwardGratArp> <rateControlEnabled type="Bool">0</rateControlEnabled> <maxFramesPerSecond type="Int">0</maxFramesPerSecond> <name type="String">GratARP-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.GratArpPlugin> <Ixia.Aptixia.StackManager.MeshingPlugin type="Ixia.Aptixia.StackManager.MeshingPlugin" objectid="b0ccbeae-9db2-4416-bbed-80dcb2a7a9ed" version="6.70.420"> <trafficMaps type="ListNode"> <Ixia.Aptixia.StackManager.MeshingTrafficMap type="Ixia.Aptixia.StackManager.MeshingTrafficMap" objectid="ea086372-6f3e-4867-932d-bfa5aff92921" version="6.70.420"> <name type="String">newClientActivity1!HTTP server_newServerActivity1</name> <configMapFilename type="String">newClientActivity1Script.configmap</configMapFilename> <sourceActivityId type="Int">0</sourceActivityId> <ipPreference type="Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eIpPreference">2</ipPreference> <portRangesString type="String" /> <meshingType type="Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eMeshingType">2</meshingType> <destinationActivityId type="Int">0</destinationActivityId> </Ixia.Aptixia.StackManager.MeshingTrafficMap> </trafficMaps> <activityRangeMapInfoList type="ListNode" /> <name type="String">Meshing-2</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MeshingPlugin> </globalPluginList> <portList type="StringList"> <String>10.223.166.127;2;5</String> </portList> <typeSpecificData type="ListNode"> <Ixia.Aptixia.StackManager.IPSecPortGroupData type="Ixia.Aptixia.StackManager.IPSecPortGroupData" objectid="df783f7c-615e-47c1-b7f0-1174985ea22e" version="8.1.7"> <role type="String">Initiator</role> <associates type="ListNode" /> <overrideGlobalOptions type="Bool">0</overrideGlobalOptions> <useMaxInitiationRate type="Bool">0</useMaxInitiationRate> <maxInitiationRate type="Int">50</maxInitiationRate> <useMaxPendingTunnels type="Bool">0</useMaxPendingTunnels> <maxPendingTunnels type="Int">50</maxPendingTunnels> <teardownRate type="Int">10</teardownRate> <enableESPPerStreamStats type="Bool">0</enableESPPerStreamStats> <enableESPReplayStats type="Bool">0</enableESPReplayStats> <activities type="ListNode" /> <pcpuLogLevel type="String">0</pcpuLogLevel> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IPSecPortGroupData> </typeSpecificData> <virtualMode type="Bool">0</virtualMode> <allowedVirtualModeTypes type="StringList" /> <doOwnership type="Bool">0</doOwnership> <branchToNicMap type="ListNode" /> <cpuAggregation type="Bool">0</cpuAggregation> <activePort type="String" /> <networkLayersManager type="Ixia.Aptixia.StackManager.NetworkLayersManager" objectid="3d3cf9ef-8aab-4388-9252-4baea80122d3" version="6.70.420" /> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.PortGroup> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="c4ecfc60-64ac-4dc2-9410-e0f58d84f229" version="6.70.420"> <name type="String">server network</name> <category type="String" /> <stack type="Ixia.Aptixia.StackManager.L1EthernetPlugin" objectid="1bd9f1bc-9959-464e-b1e8-ddb0bb4d0181" version="6.70.420"> <autoNegotiate type="Bool">1</autoNegotiate> <speed type="String">k100FD</speed> <advertise10Half type="Bool">1</advertise10Half> <advertise10Full type="Bool">1</advertise10Full> <advertise100Half type="Bool">1</advertise100Half> <advertise100Full type="Bool">1</advertise100Full> <advertise1000Full type="Bool">1</advertise1000Full> <cardDualPhy type="Ixia.Aptixia.StackManager.DualPhyPlugin" objectid="4fe8412b-7d4c-4ebe-a0d4-480a4401b3d0" version="6.70.420"> <medium type="String">auto</medium> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </cardDualPhy> <cardElm type="Ixia.Aptixia.StackManager.EthernetELMPlugin" objectid="4dfec118-30e8-4494-b7c7-e28518e7848a" version="6.70.420"> <negotiateMasterSlave type="Bool">1</negotiateMasterSlave> <negotiationType type="String">master</negotiationType> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </cardElm> <enableFlowControl type="Bool">0</enableFlowControl> <directedAddress type="String">01:80:C2:00:00:01</directedAddress> <dataCenter type="Ixia.Aptixia.StackManager.DataCenterSettings" objectid="123fecc5-cb5e-43e9-92a1-b053dc56d0f3" version="6.70.420"> <dcSupported type="Bool">1</dcSupported> <dcEnabled type="Bool">0</dcEnabled> <dcFlowControl type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType">0</dcFlowControl> <dcMode type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode">2</dcMode> <dcPfcMapping type="IntList" /> <dcPfcPauseEnable type="Bool">0</dcPfcPauseEnable> <dcPfcPauseDelay type="Int">1</dcPfcPauseDelay> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </dataCenter> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.L2EthernetPlugin type="Ixia.Aptixia.StackManager.L2EthernetPlugin" objectid="35ff711b-53f7-4c74-9e8b-98d35adaa6bf" version="6.70.420"> <macRangeList type="ListNode"> <Ixia.Aptixia.StackManager.MacRange type="Ixia.Aptixia.StackManager.MacRange" objectid="f91c9f52-8150-4d0f-b657-498ed241835c" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">MAC-R2</name> <mac type="String">00:98:28:28:14:00</mac> <incrementBy type="String">00:00:00:00:00:01</incrementBy> <mtu type="Int">1500</mtu> <count type="Int">1</count> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="57fa3f41-7695-42d7-ac26-68924bb1e8bb" version="6.70.420"> <name type="String">VLAN-R2</name> <enabled type="Bool">0</enabled> <firstId type="Int">1</firstId> <incrementStep type="Int">32</incrementStep> <increment type="Int">1</increment> <uniqueCount type="Int">4094</uniqueCount> <priority type="Int">0</priority> <tpid type="String">0x8100</tpid> <innerEnable type="Bool">0</innerEnable> <innerFirstId type="Int">1</innerFirstId> <innerIncrementStep type="Int">1</innerIncrementStep> <innerIncrement type="Int">1</innerIncrement> <innerUniqueCount type="Int">4094</innerUniqueCount> <innerPriority type="Int">0</innerPriority> <idIncrMode type="Int">1</idIncrMode> <innerTpid type="String">0x8100</innerTpid> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </vlanRange> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MacRange> </macRangeList> <vlanRangeList type="ListNode"> <Ixia.Aptixia.StackManager.VlanIdRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="57fa3f41-7695-42d7-ac26-68924bb1e8bb" version="6.70.420" /> </vlanRangeList> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Plugin type="Ixia.Aptixia.StackManager.IpV4V6Plugin" objectid="b85b184d-9bb4-48c2-a029-e633fee7a3c8" version="6.70.420"> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="1d9bf537-0c3d-4fdf-9b85-0a622cc77649" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">IP-R2</name> <ipType type="String">IPv4</ipType> <ipAddress type="String">152.40.40.20</ipAddress> <prefix type="Int">24</prefix> <incrementBy type="String">0.0.0.1</incrementBy> <count type="Int">1</count> <autoCountEnabled type="Bool">0</autoCountEnabled> <gatewayAddress type="String">152.40.40.10</gatewayAddress> <gatewayIncrement type="String">0.0.0.0</gatewayIncrement> <gatewayIncrementMode type="String">perSubnet</gatewayIncrementMode> <enableGatewayArp type="Bool">0</enableGatewayArp> <generateStatistics type="Bool">0</generateStatistics> <mss type="Int">1460</mss> <randomizeAddress type="Bool">0</randomizeAddress> <randomizeSeed type="Int">463911585</randomizeSeed> <autoMacGeneration type="Bool">1</autoMacGeneration> <macRange type="Ixia.Aptixia.StackManager.MacRange" objectid="f91c9f52-8150-4d0f-b657-498ed241835c" version="6.70.420" /> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="57fa3f41-7695-42d7-ac26-68924bb1e8bb" version="6.70.420" /> <atmRange type="Ixia.Aptixia.StackManager.AtmRange" objectid="00000000-0000-0000-0000-000000000000" /> <pvcRange type="Ixia.Aptixia.StackManager.PvcRange" objectid="00000000-0000-0000-0000-000000000000" /> <autoIpTypeEnabled type="Bool">0</autoIpTypeEnabled> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Range> </rangeList> <rangeGroups type="ListNode"> <Ixia.Aptixia.StackManager.RangeGroup type="Ixia.Aptixia.StackManager.RangeGroup" objectid="b2c21c73-bfe3-4fbc-9804-b5a8b307d893" version="6.70.420"> <name type="String">DistGroup1</name> <distribType type="Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType">0</distribType> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="1d9bf537-0c3d-4fdf-9b85-0a622cc77649" version="6.70.420" /> </rangeList> </Ixia.Aptixia.StackManager.RangeGroup> </rangeGroups> <childrenList type="ListNode" /> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">IP-2</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Plugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">MAC/VLAN-2</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.L2EthernetPlugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">Ethernet-2</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </stack> <globalPluginList type="ListNode"> <Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type="Ixia.Aptixia.StackManager.IxLoadSettingsPlugin" objectid="993e33c6-e1f7-4967-982e-82a032f8c61a" version="1.0.0"> <teardownInterfaceWithUser type="Bool">0</teardownInterfaceWithUser> <interfaceBehavior type="Int">0</interfaceBehavior> <name type="String">Settings-4</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IxLoadSettingsPlugin> <Ixia.Aptixia.StackManager.DnsPlugin type="Ixia.Aptixia.StackManager.DnsPlugin" objectid="36ca84d7-ff44-45b7-b75d-aec38b753161" version="6.70.420"> <domain type="String" /> <timeout type="Int">30000</timeout> <nameServerList type="ListNode" /> <searchList type="ListNode" /> <hostList type="ListNode" /> <name type="String">DNS-4</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.DnsPlugin> <Ixia.Aptixia.StackManager.FilterPlugin type="Ixia.Aptixia.StackManager.FilterPlugin" objectid="25c5acdd-9dd3-4802-93b6-b10651820b66" version="6.70.420"> <auto type="Bool">1</auto> <all type="Bool">0</all> <pppoecontrol type="Bool">0</pppoecontrol> <pppoenetwork type="Bool">0</pppoenetwork> <isis type="Bool">0</isis> <ip type="String" /> <tcp type="String" /> <udp type="String" /> <mac type="String" /> <icmp type="String" /> <name type="String">Filter-2</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.FilterPlugin> <Ixia.Aptixia.StackManager.TCPPlugin type="Ixia.Aptixia.StackManager.TCPPlugin" objectid="6259328b-97c2-4390-8ab1-f16bf3459219" version="6.70.420"> <bestPerfSettings type="Bool">0</bestPerfSettings> <accept_ra_all type="Bool">0</accept_ra_all> <tcp_abort_on_overflow type="Bool">0</tcp_abort_on_overflow> <tcp_adv_win_scale type="Int">2</tcp_adv_win_scale> <tcp_app_win type="Int">31</tcp_app_win> <tcp_bic type="Int">0</tcp_bic> <tcp_bic_fast_convergence type="Int">1</tcp_bic_fast_convergence> <tcp_bic_low_window type="Int">14</tcp_bic_low_window> <tcp_dsack type="Bool">1</tcp_dsack> <tcp_ecn type="Bool">0</tcp_ecn> <tcp_fack type="Bool">1</tcp_fack> <tcp_fin_timeout type="Int">60</tcp_fin_timeout> <tcp_frto type="Int">0</tcp_frto> <tcp_keepalive_intvl type="Int">7200</tcp_keepalive_intvl> <tcp_keepalive_probes type="Int">75</tcp_keepalive_probes> <tcp_keepalive_time type="Int">9</tcp_keepalive_time> <tcp_low_latency type="Int">0</tcp_low_latency> <tcp_max_orphans type="Int">8192</tcp_max_orphans> <tcp_max_syn_backlog type="Int">1024</tcp_max_syn_backlog> <tcp_max_tw_buckets type="Int">180000</tcp_max_tw_buckets> <tcp_mem_low type="Int">24576</tcp_mem_low> <tcp_mem_pressure type="Int">32768</tcp_mem_pressure> <tcp_mem_high type="Int">49152</tcp_mem_high> <tcp_moderate_rcvbuf type="Int">0</tcp_moderate_rcvbuf> <tcp_no_metrics_save type="Bool">0</tcp_no_metrics_save> <tcp_orphan_retries type="Int">0</tcp_orphan_retries> <tcp_reordering type="Int">3</tcp_reordering> <tcp_retrans_collapse type="Bool">1</tcp_retrans_collapse> <tcp_retries1 type="Int">3</tcp_retries1> <tcp_retries2 type="Int">15</tcp_retries2> <tcp_rfc1337 type="Bool">0</tcp_rfc1337> <tcp_rmem_min type="Int">4096</tcp_rmem_min> <tcp_rmem_default type="Int">1024</tcp_rmem_default> <tcp_rmem_max type="Int">262144</tcp_rmem_max> <tcp_sack type="Bool">1</tcp_sack> <tcp_stdurg type="Bool">0</tcp_stdurg> <tcp_synack_retries type="Int">5</tcp_synack_retries> <tcp_syn_retries type="Int">5</tcp_syn_retries> <tcp_timestamps type="Bool">1</tcp_timestamps> <tcp_tw_recycle type="Bool">1</tcp_tw_recycle> <tcp_tw_reuse type="Bool">0</tcp_tw_reuse> <tcp_vegas_alpha type="Int">2</tcp_vegas_alpha> <tcp_vegas_beta type="Int">6</tcp_vegas_beta> <tcp_vegas_cong_avoid type="Int">0</tcp_vegas_cong_avoid> <tcp_vegas_gamma type="Int">2</tcp_vegas_gamma> <tcp_westwood type="Int">0</tcp_westwood> <tcp_window_scaling type="Bool">0</tcp_window_scaling> <ip_no_pmtu_disc type="Bool">1</ip_no_pmtu_disc> <tcp_wmem_min type="Int">4096</tcp_wmem_min> <tcp_wmem_default type="Int">1024</tcp_wmem_default> <tcp_wmem_max type="Int">262144</tcp_wmem_max> <tcp_ipfrag_time type="Int">30</tcp_ipfrag_time> <tcp_port_min type="Int">1024</tcp_port_min> <tcp_port_max type="Int">65535</tcp_port_max> <tcp_rto_min type="Int">1000</tcp_rto_min> <tcp_rto_max type="Int">120000</tcp_rto_max> <tcp_tw_rfc1323_strict type="Bool">0</tcp_tw_rfc1323_strict> <udp_port_randomization type="Bool">0</udp_port_randomization> <disable_min_max_buffer_size type="Bool">1</disable_min_max_buffer_size> <llm_hdr_gap type="Int">8</llm_hdr_gap> <llm_hdr_gap_ns type="Int">10</llm_hdr_gap_ns> <inter_packet_granular_delay type="Double">0</inter_packet_granular_delay> <delayed_acks type="Bool">1</delayed_acks> <accept_ra_default type="Bool">0</accept_ra_default> <rps_needed type="Bool">0</rps_needed> <delayed_acks_segments type="Int">0</delayed_acks_segments> <delayed_acks_timeout type="Int">0</delayed_acks_timeout> <tcp_large_icwnd type="Int">0</tcp_large_icwnd> <tcp_mgmt_rmem type="Int">87380</tcp_mgmt_rmem> <tcp_mgmt_wmem type="Int">32768</tcp_mgmt_wmem> <adjust_tcp_buffers type="Bool">1</adjust_tcp_buffers> <name type="String">TCP-4</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.TCPPlugin> <Ixia.Aptixia.StackManager.GratArpPlugin type="Ixia.Aptixia.StackManager.GratArpPlugin" objectid="3eedf749-efa4-43a0-87ae-e110a77c88d4" version="6.70.420"> <enabled type="Bool">1</enabled> <forwardGratArp type="Bool">0</forwardGratArp> <rateControlEnabled type="Bool">0</rateControlEnabled> <maxFramesPerSecond type="Int">0</maxFramesPerSecond> <name type="String">GratARP-2</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.GratArpPlugin> <Ixia.Aptixia.StackManager.MeshingPlugin type="Ixia.Aptixia.StackManager.MeshingPlugin" objectid="284f9992-65d8-4027-a155-709f1965f892" version="6.70.420"> <trafficMaps type="ListNode" /> <activityRangeMapInfoList type="ListNode" /> <name type="String">Meshing-1</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MeshingPlugin> </globalPluginList> <portList type="StringList"> <String>10.223.166.127;2;6</String> </portList> <typeSpecificData type="ListNode"> <Ixia.Aptixia.StackManager.IPSecPortGroupData type="Ixia.Aptixia.StackManager.IPSecPortGroupData" objectid="f65f12f2-018c-46f5-a9c5-a1f6f7151909" version="8.1.7"> <role type="String">Initiator</role> <associates type="ListNode" /> <overrideGlobalOptions type="Bool">0</overrideGlobalOptions> <useMaxInitiationRate type="Bool">0</useMaxInitiationRate> <maxInitiationRate type="Int">50</maxInitiationRate> <useMaxPendingTunnels type="Bool">0</useMaxPendingTunnels> <maxPendingTunnels type="Int">50</maxPendingTunnels> <teardownRate type="Int">10</teardownRate> <enableESPPerStreamStats type="Bool">0</enableESPPerStreamStats> <enableESPReplayStats type="Bool">0</enableESPReplayStats> <activities type="ListNode" /> <pcpuLogLevel type="String">0</pcpuLogLevel> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IPSecPortGroupData> </typeSpecificData> <virtualMode type="Bool">0</virtualMode> <allowedVirtualModeTypes type="StringList" /> <doOwnership type="Bool">0</doOwnership> <branchToNicMap type="ListNode" /> <cpuAggregation type="Bool">0</cpuAggregation> <activePort type="String" /> <networkLayersManager type="Ixia.Aptixia.StackManager.NetworkLayersManager" objectid="60b1273d-78d3-4813-8cea-ec9a7101b8a3" version="6.70.420" /> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.PortGroup> </portGroupList> <externalProperties type="Ixia.Aptixia.StackManager.ExternalPropertyManager" objectid="1f2452bf-e52a-4db2-ba47-e5cc8bf61b5e" version="6.70.420"> <properties type="ListNode"> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="145671ff-93a5-4ecc-8c83-59b2c3c67be9" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatLTEUEUeRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="9f07a941-ad2f-46b0-8c75-911862a21039" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">SixRdRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="a221ab5c-faae-4940-bfad-5d41d44f1427" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">L2tpRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="d811442b-bfb8-42f0-bbf8-6bdb6fc9b66b" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DHCPServerRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="f252cff3-b919-4e74-9f62-9e9c5ab5d324" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">MobileSubscribersRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="493ce043-b982-4a43-a2d4-619e51fbc5a6" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IPSecRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="500dfc8b-2e6a-401f-84c0-f6907f60c00e" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPSgsnS3RangeUe</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="693cb176-f3d8-4073-8a02-fabdc0bdd3fb" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPRange_SGW</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="ec983bf9-07f0-46b2-99a0-354114f42501" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EmulatedRouterRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="5d0f0eb8-40af-4292-8ff2-a57e7903601d" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">PppoxRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="653fae09-ba19-443c-8f8b-9483c0b86b9a" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPNGAPRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="c886be8c-c207-4bb4-90d5-17be54556d58" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatRNCIuPSUeRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="00e75214-5166-406b-90e5-2b83567ae5cf" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPNGUERange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="50d10ee7-45ce-46d2-ae8d-ecd3b1806067" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPUERange_S5S8_SGW</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="c2f310a4-6ea4-4459-be3b-f3b3365c590a" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPGRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="7e458bed-5e36-42d6-812d-3794be52766e" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPPcrfRange_S5S8_PGW</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="7d225fda-6432-4de3-9750-c19bbc957703" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DSLiteRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="e25dd669-ffc5-493d-a2b5-fd5627bf2ee8" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPSGSNRangeUe</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="7ac0b7d4-6df9-4e1f-86d2-f0a494b3f20b" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">SlaacRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="25699a2c-ab22-417b-9072-894523e98008" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPUERange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="05f1053a-5774-409f-b07e-add07df64338" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">PSTNDigitalRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="482a10c3-0ac7-44d9-9fa9-b43ba3a9901d" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DHCPRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="a0f03753-923d-4421-8c4f-0ed78f00fc44" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">AtmRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="fb5cd68e-b4b0-4fd4-ae18-4100c0035642" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatMMEApnRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="62677b6a-080e-4cc3-919b-71fa90ae410f" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatENodeBUuApnRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="2e0fd6e3-470e-48df-ab8d-cc21b9d80393" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPSUERange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="175f3104-0d2a-44f9-b712-fed3b170f8cb" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IpV4V6Range</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="d1f37e1e-db44-4bac-acb8-b242dee8e371" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">MacRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="61ccdebc-84e6-464d-be14-2b3ddedab9d2" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DualStackIPRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="d0678cd8-998e-42ab-8f0d-bfcb5370eac2" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPUERange_S2a_TWAN</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="d8350364-51c6-4a1b-af9f-72c9c235a636" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatSGSNIuPSApnRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="613d02a1-db1e-415d-b4bb-8b73b4477cf4" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatENodeBSimUeRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="9a41f718-b55e-44c7-a0cc-b1fcf8204c20" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">S6dRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="4c26fe62-a63d-4c40-8e15-c58ad8fba8d0" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">UERangeBase</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="5c2ca63f-3335-4ab7-963e-440817448538" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPMmeS10RangeUe</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="51a5eccc-a68d-4730-8a48-32019c547c28" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">S6aRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="3010c4ad-f31e-4676-9e61-bb25cf9c1bbb" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">BmScRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="ef1677e4-f390-4a78-b61a-f7650cf5faea" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">MBmsGwRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="24322b98-7a2a-4d2d-a4ee-4cde0f0e8b64" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">PptpRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> </properties> <values type="ListNode"> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="6804ae67-3bd7-471b-8796-ee1e4773c2f1" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="a3559674-8d95-4020-90b3-b42eacaef105" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="7efcd429-2c48-41bd-bdc5-489dbfcfc49a" version="6.70.420"> <value type="Bool">0</value> </value> <enabled type="Bool">1</enabled> </Ixia.Aptixia.StackManager.ExternalProperty> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="a63d8276-65bc-4bc2-8202-6461c6399ef9" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="1d9bf537-0c3d-4fdf-9b85-0a622cc77649" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="09d7b134-2921-4759-bbdb-ff3a5a1966d7" version="6.70.420"> <value type="Bool">0</value> </value> <enabled type="Bool">1</enabled> </Ixia.Aptixia.StackManager.ExternalProperty> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="0cd9f099-242e-4b03-965f-d343c60181e6" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.MacRange" objectid="3011c8a8-a9fd-4b76-a27d-91948113ed4f" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="503aa008-2481-419f-a223-c90b2c25c17e" version="6.70.420"> <value type="Bool">0</value> </value> <enabled type="Bool">0</enabled> </Ixia.Aptixia.StackManager.ExternalProperty> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="0b8d2c01-19ac-4f28-924e-660676d978da" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.MacRange" objectid="f91c9f52-8150-4d0f-b657-498ed241835c" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="41c694b3-bb55-48fe-9604-8b003540242f" version="6.70.420"> <value type="Bool">0</value> </value> <enabled type="Bool">0</enabled> </Ixia.Aptixia.StackManager.ExternalProperty> </values> </externalProperties> <availableNetworkTimelines type="ListNode" /> <typeSpecificData type="ListNode"> <Ixia.Aptixia.StackManager.MacSessionData type="Ixia.Aptixia.StackManager.MacSessionData" objectid="a9c7aa59-e015-4ffd-bb82-5d877ae9c1a8" version="6.70.420"> <duplicateCheckingScope type="Ixia.Aptixia.StackManager.MacSessionDataSkeleton+eMacValidationOptions">2</duplicateCheckingScope> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MacSessionData> <Ixia.Aptixia.StackManager.IpSessionData type="Ixia.Aptixia.StackManager.IpSessionData" objectid="34a78d72-1fc5-4875-9fe1-b4db66b1b4c4" version="6.70.420"> <duplicateCheckingScope type="Ixia.Aptixia.StackManager.IpSessionDataSkeleton+eIpValidationOptions">2</duplicateCheckingScope> <enableGatewayArp type="Bool">0</enableGatewayArp> <gatewayArpRequestRate type="Int">300</gatewayArpRequestRate> <maxOutstandingGatewayArpRequests type="Int">300</maxOutstandingGatewayArpRequests> <ignoreUnresolvedIPs type="Bool">0</ignoreUnresolvedIPs> <sendAllRequests type="Bool">0</sendAllRequests> <individualARPTimeOut type="Int">500</individualARPTimeOut> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpSessionData> <Ixia.Aptixia.StackManager.IxLoadSessionData type="Ixia.Aptixia.StackManager.IxLoadSessionData" objectid="1e24447f-69f1-4030-8b2d-25a18c7160ca" version="1.0.0"> <portGroupList type="ListNode"> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="865be042-32d5-426a-9e75-0908c943801f" version="6.70.420" /> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="c4ecfc60-64ac-4dc2-9410-e0f58d84f229" version="6.70.420" /> </portGroupList> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IxLoadSessionData> <Ixia.Aptixia.StackManager.ImpairSessionData type="Ixia.Aptixia.StackManager.ImpairSessionData" objectid="94b53c2c-0747-41c2-838d-0e0e15f31766" version="6.70.13"> <profiles type="ListNode"> <Ixia.Aptixia.StackManager.ImpairProfile type="Ixia.Aptixia.StackManager.ImpairProfile" objectid="90dd3511-93c1-49fa-8e38-db774db9fe17" version="6.70.13"> <name type="String">DefaultProfile</name> <defaultp type="Bool">1</defaultp> <seed type="Int">0</seed> <addDelay type="Bool">1</addDelay> <delay type="Int">20</delay> <jitter type="Int">0</jitter> <addDrop type="Bool">0</addDrop> <drop type="Double">10</drop> <addDropSequence type="Bool">0</addDropSequence> <dropSequenceSkip type="Int">10</dropSequenceSkip> <dropSequenceLength type="Int">1</dropSequenceLength> <addReorder type="Bool">0</addReorder> <gap type="Int">10</gap> <reorder type="Int">20</reorder> <reorderLength type="Int">1</reorderLength> <addReorderPI type="Bool">0</addReorderPI> <reorderPISkip type="Int">10</reorderPISkip> <reorderPILength type="Int">1</reorderPILength> <reorderPIInterval type="Int">1</reorderPIInterval> <reorderPITimeout type="Int">1000</reorderPITimeout> <addDuplicate type="Bool">0</addDuplicate> <duplicate type="Double">10</duplicate> <addFragment type="Bool">0</addFragment> <fragment type="Double">10</fragment> <mtu type="Int">1000</mtu> <addFragmentSequence type="Bool">0</addFragmentSequence> <fragmentSequenceSkip type="Int">10</fragmentSequenceSkip> <fragmentSequenceLength type="Int">1</fragmentSequenceLength> <mtuSequence type="Int">1000</mtuSequence> <sendFragmentsInReverseOrder type="Bool">0</sendFragmentsInReverseOrder> <sendFirstFragmentOnly type="Bool">0</sendFirstFragmentOnly> <sendOverlappingFragments type="Bool">0</sendOverlappingFragments> <addBandwidth type="Bool">0</addBandwidth> <bandwidth type="Double">1</bandwidth> <bandwidthUnits type="String">mbps</bandwidthUnits> <addBandwidthIn type="Bool">0</addBandwidthIn> <bandwidthIn type="Double">1</bandwidthIn> <bandwidthUnitsIn type="String">mbps</bandwidthUnitsIn> <destinationIp type="String">any</destinationIp> <sourceIp type="String">any</sourceIp> <sourcePort type="Int">0</sourcePort> <destinationPort type="Int">0</destinationPort> <protocol type="String">any</protocol> <typeOfService type="String">any</typeOfService> <addTcpFlagsFilter type="Bool">0</addTcpFlagsFilter> <selectTcpFlags type="String">SYN;RST;ACK</selectTcpFlags> <expectTcpFlags type="String">SYN</expectTcpFlags> <impairOrder type="String">Delay;Drop;DropSeq;Reorder;ReorderPI;Duplicate;Fragment;FragmentSeq;Bandwidth</impairOrder> </Ixia.Aptixia.StackManager.ImpairProfile> </profiles> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.ImpairSessionData> <Ixia.Aptixia.StackManager.IPSecSessionData type="Ixia.Aptixia.StackManager.IPSecSessionData" objectid="bd2f0ea4-4278-49c8-9600-18cd2c8ed639" version="8.1.7"> <ipsecTunnelSetup type="Ixia.Aptixia.StackManager.IPSecTunnelSetup" objectid="1bacc8a0-dda0-4e0c-b013-4d8618dc80b6" version="8.1.7"> <tunnelSetupTimeout type="Int">30</tunnelSetupTimeout> <tunnelRetransmissionTimeout type="Int">30</tunnelRetransmissionTimeout> <numRetries type="Int">0</numRetries> <retryInterval type="Int">10</retryInterval> <retryDelay type="Int">10</retryDelay> <testType type="String">P2D</testType> <sendCiscoVid type="Bool">0</sendCiscoVid> <useMaxInitiationRate type="Bool">0</useMaxInitiationRate> <useMaxPendingTunnels type="Bool">0</useMaxPendingTunnels> <enableRekey type="Bool">1</enableRekey> <rekeyRetries type="Int">3</rekeyRetries> <rekeyFuzzPercentage type="Int">0</rekeyFuzzPercentage> <rekeyMargin type="Int">10</rekeyMargin> </ipsecTunnelSetup> <ipsecCertificates type="Ixia.Aptixia.StackManager.IPSecCertificates" objectid="2e324324-bf74-4ad3-afbb-62e44f01c31a" version="8.1.7"> <uniqueCert type="Bool">0</uniqueCert> <certSource type="String">kNewCert</certSource> <caURL type="String" /> <caDN type="String" /> <certSubjectDN type="String" /> <certSubjectAltDN type="String" /> <remoteIkeId type="String" /> <bitSize type="String">k512</bitSize> <saveCert type="Bool">1</saveCert> <cacheCertFolder type="String">C:\Program Files\Ixia\CachedCerts</cacheCertFolder> <certParentFolder type="String">C:\Program Files\Ixia\CachedCerts</certParentFolder> <certNumber type="String" /> <caCertNumber type="String" /> <earlyExpDate type="String" /> <lateExpDate type="String" /> <usePerRangeCertNameExp type="Bool">0</usePerRangeCertNameExp> <checkCrl type="Bool">0</checkCrl> <crlOverrideEnable type="Bool">0</crlOverrideEnable> <crlOverrideUrl type="String" /> <checkOcsp type="Bool">0</checkOcsp> <ocspOverrideEnable type="Bool">0</ocspOverrideEnable> <ocspOverrideUrl type="String" /> <unknownIsRevoked type="Bool">0</unknownIsRevoked> <certProto type="String">kSCEP</certProto> </ipsecCertificates> <ipsecCertManager type="Ixia.Aptixia.StackManager.IPSecCertManager" objectid="f3dc4ef0-e9a1-48a2-b69f-c5d2b485e897" version="8.1.7"> <caURL type="String" /> <caDN type="String">CN=RootCA,C=RO,L=Bucharest,O=Ixia,OU=IxLoad,IP:201.121.87.2,email:ixia@ixiacom.com</caDN> <certSubjectDN type="String">CN=IxiaVPN,C=RO,L=Bucharest,O=Ixia</certSubjectDN> <keyGenAlgo type="String">kRSA_512</keyGenAlgo> <cacheCertFolder type="String">C:\Program Files\Ixia\CachedCerts</cacheCertFolder> <caKeyFile type="String">C:\Program Files\Ixia\ca-priv.key</caKeyFile> <caCrtFile type="String">C:\Program Files\Ixia\ca-cert.crt</caCrtFile> <certNumber type="Int">1</certNumber> <certProto type="String">kSCEP</certProto> <createRootCA type="Bool">0</createRootCA> <uniqueCert type="Bool">0</uniqueCert> <descFilePath type="String">C:\Program Files\Ixia\CachedCerts\sample.desc</descFilePath> <useDescFile type="Bool">0</useDescFile> </ipsecCertManager> <eapSimTuples type="ListNode" /> <eapAkaTuples type="ListNode" /> <maxInitiationRate type="Int">50</maxInitiationRate> <maxPendingTunnels type="Int">50</maxPendingTunnels> <negotiationStartDelay type="Int">0</negotiationStartDelay> <teardownRate type="Int">10</teardownRate> <burstInitiation type="Bool">0</burstInitiation> <parallelInitiation type="Bool">0</parallelInitiation> <enableExtraPortLogging type="Bool">0</enableExtraPortLogging> <enableWildcardTsi type="Bool">0</enableWildcardTsi> <enableWildcardTsr type="Bool">0</enableWildcardTsr> <enablePlutoWildcardTsi type="Bool">0</enablePlutoWildcardTsi> <enablePlutoModeCfgWildcardTsr type="Bool">1</enablePlutoModeCfgWildcardTsr> <enablePlutoS2SWildcardTsr type="Bool">0</enablePlutoS2SWildcardTsr> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IPSecSessionData> </typeSpecificData> <statViewManager type="Ixia.Aptixia.StackManager.StatViewManager" objectid="7256ce27-286c-475d-b198-09b4ae306f73" version="6.70.420"> <enableStats type="Bool">1</enableStats> <enableOverviewStats type="Bool">1</enableOverviewStats> <enablePerSessionStats type="Bool">1</enablePerSessionStats> </statViewManager> <waitForLinkUp type="Bool">0</waitForLinkUp> <overloadProtection type="Bool">1</overloadProtection> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.SMSession> </rpf> + + <_composerConfig ver="[0, [1, [0, [0]]]]" type="ixComposerConfig"> + + + <_quickTestConfig ver="[0, [1, [0, [0]]]]" type="ixQuickTestConfig"> + <?xml version="1.0" encoding="utf-16"?> <Config> <configs Version="5.0" /> </Config> + + 15481 + 8.01.106.3 + HTTP-vCGNAPT_IPv4_2Ports.rxf + + C:\Users\ds1\Desktop\yardstick + HTTP-vFW_IPv4_2Ports.rxf + Test1 + + + + 10.223.166.127 + 1 + None + + + <_apiUniqueId type="int">12991 + + + 1 + + + + None + + + + + + + + Test1 + + False + False + 1 + False + 0 + + 0 + 4 + 0 + + 1 + 0 + 30 + 0 + 0 + <_apiUniqueId type="int">12941 + + + + TrafficFlow1 + + + Client + + + HTTP client@client network + None + netTraffic + 1 + Client + ethernet + ipTrafficAgent + Client + + + + None + HTTP client + Client + ipTrafficAgent + None + + + 1 + newClientActivity1 + ipTrafficAgent + False + None + 0 + + 1 + + <_apiUniqueId type="int">12943 + + + + + HTTP server_newServerActivity1 + portPairs + + + portPairs + portMesh + customMesh + + True + None + + + HTTP server@server network + None + netTraffic + 1 + Server + ethernet + ipTrafficAgent + Server + + + + None + HTTP server + Server + ipTrafficAgent + None + + + 1 + newServerActivity1 + ipTrafficAgent + False + None + 1 + 0 + None + + + 100.0 + 80 + 443 + 300 + 0 + 0 + 0 + 0 + 0 + 16384 + 10 + 100 + 0 + 1460 + False + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 200_OK + OK + 200 + text/plain + 2 + 2014/11/22 07:27:01 + False + 5 + 1 + GMT + 0 + 2005/03/04 21:55:04 + 3600 + 3600 + 1 + 2005/02/02 21:55:04 + False + 5 + 1 + + True + False + 0 + <_apiUniqueId type="int">12972 + + + 404_PageNotFound + Page not found + 404 + text/plain + 2 + 2014/11/22 07:27:01 + False + 5 + 1 + GMT + 0 + 2005/03/04 21:55:04 + 3600 + 3600 + 1 + 2005/02/02 21:55:04 + False + 5 + 1 + + True + False + 1 + <_apiUniqueId type="int">12973 + + + + + UserCookie + Name of User + 2 + 3 + + + firstName + Joe + + + + + 0 + + + lastName + Smith + + + + + 1 + + + True + 0 + <_apiUniqueId type="int">12987 + + + LoginCookie + Login name and password + 2 + 2 + + + name + joesmith + + + + + 0 + + + password + foobar + + + + + 1 + + + True + 1 + <_apiUniqueId type="int">12988 + + + + + /1b.html + + 200_OK + OK + 200 + text/plain + 2 + 2014/11/22 07:27:01 + False + 5 + 1 + GMT + 0 + 2005/03/04 21:55:04 + 3600 + 3600 + 1 + 2005/02/02 21:55:04 + False + 5 + 1 + + True + False + <_apiUniqueId type="int">12984 + + range + 1-1 + <specify file> + None + -1 + 3 + 512-1024 + 0 + <_apiUniqueId type="int">12974 + + + /4k.html + + range + 4096-4096 + <specify file> + None + -1 + 3 + 512-1024 + 1 + <_apiUniqueId type="int">12975 + + + /8k.html + + range + 8192-8192 + <specify file> + None + -1 + 3 + 512-1024 + 2 + <_apiUniqueId type="int">12976 + + + /16k.html + + range + 16536-16536 + <specify file> + None + -1 + 3 + 512-1024 + 3 + <_apiUniqueId type="int">12977 + + + /32k.html + + range + 32768 + <specify file> + None + -1 + 3 + 512-1024 + 4 + <_apiUniqueId type="int">12978 + + + /64k.html + + range + 65536 + <specify file> + None + -1 + 3 + 512-1024 + 5 + <_apiUniqueId type="int">12979 + + + /128k.html + + range + 131072 + <specify file> + None + -1 + 3 + 512-1024 + 6 + <_apiUniqueId type="int">12980 + + + /256k.html + + range + 262144 + <specify file> + None + -1 + 3 + 512-1024 + 7 + <_apiUniqueId type="int">12981 + + + /512k.html + + range + 524288 + <specify file> + None + -1 + 3 + 512-1024 + 8 + <_apiUniqueId type="int">12982 + + + /1024k.html + + range + 1048576 + <specify file> + None + -1 + 3 + 512-1024 + 9 + <_apiUniqueId type="int">12983 + + + DEFAULT + + + + + 0 + 0 + + 0 + + + + 0 + AsciiCustomPayload + Start With + 0 + Ixia-Ixload-Http-Server-Custom-Payload + + 0 + 1 + True + 0 + <_apiUniqueId type="int">12985 + + + 1 + HexCustomPayload + Start With + 1 + + 49 78 69 61 2d 49 78 6c 6f 61 64 2d 48 74 74 70 2d 53 65 72 76 65 72 2d 43 75 73 74 6f 6d 2d 50 61 79 6c 6f 61 64 + 0 + 1 + True + 1 + <_apiUniqueId type="int">12986 + + + False + Custom MD5 + 2 + False + 512-1024 + 1024 + False + False + False + 0 + <_apiUniqueId type="int">12971 + 0 + + + <_dict type="list"/> + + HTTP + + + + + + None + server network + Server + none + 0 + Default + False + + FLEXAP1040SQ + + + + 1 + 2 + 6 + False + FLEXAP10G16S + + + + + newServerActivity1 + + HTTP + tcp port 80 + + + + + + <_apiUniqueId type="int">15432 + + False;8191 + + <_apiUniqueId type="int">15431 + None + + + + + + <_smRangeObjectId type="str">1d9bf537-0c3d-4fdf-9b85-0a622cc77649 + Network Range IP-R2 in server network (152.40.40.20+1) + + DistGroup1 + consecutiveIps + 0 + <_apiUniqueId type="int">12961 + <_networkRangeList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixWeakrefSequenceContainer" itemtype="ixBasicNetworkRange"> + + + <_rangeGroupObjectId type="str">b2c21c73-bfe3-4fbc-9804-b5a8b307d893 + <_smPluginObjectId type="str">b85b184d-9bb4-48c2-a029-e633fee7a3c8 + + False + + + None + None + + + + 0 + 0 + 1024 + 65535 + 0.0.0.0 + 255.255.255.0 + :: + FFFF:FFFF:FFFF:FFFF:FFFF:FFFF::0 + + 0 + + True + False + + + 0 + 30000 + + + + + + False + True + True + False + False + 0 + 1024 + False + 0 + 1024 + 60 + 7200 + 75 + 9 + 5 + 5 + 15 + 1024 + 1024 + True + False + 1000 + 120000 + + + + + False + True + False + False + False + False + 1 + 1 + 1 + 0 + 0 + 1 + 1 + 0 + 1 + any + any + any + False + FragmentationPercent + 50 + 1000 + 1 + 1 + <_seed type="int">1 + + <_portGroupId type="str">c4ecfc60-64ac-4dc2-9410-e0f58d84f229 + <_smExternalLinks ver="[0, [1, [0, [0]]]]" type="_smExternalLinkersMap"> + + + 1 + + + + + HTTP Server + newServerActivity1 + True + + None + Server + Server + 100.0 + 0 + <_apiUniqueId type="int">12989 + <_objectiveValue type="int">100 + 1.0 + + + + + + + + + + True + <_apiUniqueId type="int">12970 + + None + + + <_apiUniqueId type="int">12956 + + <_dict type="list"> + + + + + + + <_dict type="list"> + + + + + + + <_dict type="list"> + + HTTP Server + + HTTP Server + True + + + + + + + + + + + + + + True + 1 + 0 + 0 + 83 + 83 + 83 + 0 + <_apiUniqueId type="int">12955 + True + + <_portOperationModesAllowed type="dict"> + + 0 + True + + + 1 + True + + + 2 + False + + + 3 + True + + + 4 + True + + + 8 + True + + + <_tcpAccelerationAllowed type="dict"> + + 0 + True + + + 1 + False + + + + newServerActivity1 + + + 80 + 0 + 80 + 1 + + + 1 + + + 100.0 + 1 + 1 + 1 + False + 0 + 0 + 0 + 1 + 10 + 0 + :80 + 0 + :443 + 1 + Custom1 + 0 + 3 + 0 + 0 + 0 + 0 + 16384 + 0 + 0 + + + + + DEFAULT + 0 + 0 + 0 + 0 + 1460 + 0 + 0 + False + 0 + 0 + 0 + 0 + 0 + 600 + 0 + 0 + 0 + 0 + 0 + + + -2 + START + Start + + + Output1 + 0 + 1 + 0 + <_apiUniqueId type="int">12948 + 1 + + + 0 + <_apiUniqueId type="int">12945 + + + 1 + GET + Get 1 + + + Output1 + 0 + -3 + 0 + <_apiUniqueId type="int">12949 + 2 + + + HTTP server_newServerActivity1:80 + /1b.html + None + + + -1 + 0 + 0 + None + -1 + -1 + False + 65536 + 3 + 10 + 1 + <_apiUniqueId type="int">12946 + + + -3 + STOP + Stop + + 2 + <_apiUniqueId type="int">12947 + + + + + Accept: */* + 0 + <_apiUniqueId type="int">12950 + + + Accept-Language: en-us + 1 + <_apiUniqueId type="int">12951 + + + Accept-Encoding: gzip, deflate + 2 + <_apiUniqueId type="int">12952 + + + User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) + 3 + <_apiUniqueId type="int">12953 + + + + + 10 + 0.0 + 2 + 0 + 1 + 0 + 1024 + 0 + 0 + 0 + 0 + 1 + 0 + + 0.0.0.0 + 0 + 0 + 0 + <_apiUniqueId type="int">12942 + 1 + 1 + + + <_dict type="list"/> + + HTTP + + + + + + None + client network + Client + none + 0 + Default + False + + FLEXAP1040SQ + + + + 1 + 2 + 5 + False + FLEXAP10G16S + + None + <_apiUniqueId type="int">15428 + + False;8191 + + <_apiUniqueId type="int">15427 + None + + + + + + <_smRangeObjectId type="str">a3559674-8d95-4020-90b3-b42eacaef105 + Network Range IP-R1 in client network (152.16.100.20+1) + + DistGroup1 + consecutiveIps + 0 + <_apiUniqueId type="int">12931 + <_networkRangeList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixWeakrefSequenceContainer" itemtype="ixBasicNetworkRange"> + + + <_rangeGroupObjectId type="str">aa33a76b-9c7f-48d9-a537-8d6eeec03662 + <_smPluginObjectId type="str">a916ae0f-0731-405d-ad19-eaade6c515f1 + + False + + + None + None + + + + 0 + 0 + 1024 + 65535 + 0.0.0.0 + 255.255.255.0 + :: + FFFF:FFFF:FFFF:FFFF:FFFF:FFFF::0 + + 0 + + True + False + + + 0 + 30000 + + + + + + False + True + True + False + False + 0 + 1024 + False + 0 + 1024 + 60 + 7200 + 75 + 9 + 5 + 5 + 15 + 1024 + 1024 + True + False + 1000 + 120000 + + + + + False + True + False + False + False + False + 1 + 1 + 1 + 0 + 0 + 1 + 1 + 0 + 1 + any + any + any + False + FragmentationPercent + 50 + 1000 + 1 + 1 + <_seed type="int">1 + + <_portGroupId type="str">865be042-32d5-426a-9e75-0908c943801f + <_smExternalLinks ver="[0, [1, [0, [0]]]]" type="_smExternalLinkersMap"> + + + 1 + + + + + HTTP Client + newClientActivity1 + True + + Timeline1 + 83 + 83 + 1 + 0 + 0 + 60 + 0 + 30000 + 1 + 3 + 20 + 32000 + 0 + 0 + + None + Client + Client + 100.0 + simulatedUsers + 64000 + simulatedUsers + 64000 + ConnectionRateConstraint + 100 + 100 + False + SimulatedUserConstraint + 100 + False + portMesh + 1 + 0 + 1:1 + Consecutive + + 0 + <_apiUniqueId type="int">12954 + <_objectiveValue type="int">64000 + 1.0 + + + + + + + + + + False + <_apiUniqueId type="int">12940 + + None + + + <_apiUniqueId type="int">12926 + + <_dict type="list"> + + + + + + + <_dict type="list"> + + + + + + + <_dict type="list"> + + HTTP Client + + HTTP Client + True + + + + + + + + + + + + + + True + 1 + 0 + 0 + 60 + 83 + 83 + portPairs + simulatedUsers + 64000 + 0 + 30000 + 1 + 3 + 20 + simulatedUsers + 64000 + 64000 + 0 + <_apiUniqueId type="int">12925 + True + + <_portOperationModesAllowed type="dict"> + + 0 + True + + + 1 + True + + + 2 + False + + + 3 + True + + + 4 + True + + + 8 + True + + + <_tcpAccelerationAllowed type="dict"> + + 0 + True + + + 1 + False + + + + + 0 + <_apiUniqueId type="int">12922 + + + DUT + + 1 + <_apiUniqueId type="int">12923 + + + Server + + + + 2 + <_apiUniqueId type="int">12924 + + + + + 0 + <_apiUniqueId type="int">12921 + + + 2 + True + False + False + False + False + False + False + False + Kbps + + False + + + + <_apiUniqueId type="int">12990 + + False + None + 0 + 0 + 0 + + + + Playlist + playlist + + + + 0 + + + Random Data + rdge + + + 0 + 1 + + + 1 + + + Real File + realfile + + None + + 2 + + + Unified File System + ufs + + None + + 3 + + + <_profileMru type="str"> + + None + True + True + 0 + <_apiUniqueId type="int">12920 + + + 2 + False + False + begin 666 <data> M>)SMG7MOVS@2P+^*D<,5>[BE+8J41*6/19ND;;!I$\1I=X'KH2"I4:*K(WDE M.8\[W'<_4I)MV9:=[.U672SFC]:2.#-\B#,_CBPSSWZXNYX,;B ODBQ]OD>' MSMX/+YZ-2UE^3. 6\F61/_2=H3-TF;MG!*"P5T^2HAS\"/?/]^2T3.X2.2QN MAE.K4920:ABVY'[*Y=04&>6#T_<71^\O!J,7S\[.C\;F\.7%\>G[]?//1X?' M%R]?G1S9@H/3=Z^.WQ\=+JHN%D>/:<!&Y2^>O<[AEYF1N1_<R,D,GN^Y>U5% MQ<U)=GF9I)?SZZ_EI("J["*YAO%]JE_!E;Q)LGPNX2Q*BU)>3\]RT$G5LJ:< M5>5'E[EIC!W6B_LIS,MH579JAGF2R>@LSTK094OW(I_!6L/>)E$$J354;+;Q M*)5J H>RE.,RRV%3X&PY.NUV\"[MG369!IW.RNFL7(SDN]FD3*:3];Y50H?C M!\3>R3L[[0K3OH-946;7;\P]NUK(^/,Z7R<3.)/EHN1@_].'PO3I4U303X>9 MGEU#6A:?CLUD,/^=F$'])(8.'5+''[)/YU"8VHM/;R\NSLC-ZY\^'Y_=\,_N M69:7Q6?7H8'C.>%GZKB"U?/AY01,T?QS8+PE+?;OBN3YWE593O='H]O;V^$M M&V;YY<AU'#KZ^=W)6%_!M21):J:#&>:]A5;TL%95Z6A>ZR'$TK2WN@,[SE[8 M]@\.SCX,[!":NYOHXMFH+; B?>(25DD6@]C,XH-)8H9L4(W!X[7&D)M)^SBM MBZL\FUU>F6E0&UB3'ZUV;.WT(,\:M\D!3.G:^;F,DNR-L3]=*TC2\H7[;&0_ MGHVV2M6=?YWEU[.)'$-9&@=;3/;_//G+W>%3\]_+IT]^F67ETX]U-*Q/]NL/ M.O3J@^\WI&T'&ME_+ O_N3S\[_*PCB$F@IS/TO5V/)F43U<"];QFISX8&+?* M(J/1%,S*F%"_/O[AR67YM-4R8ZJIY3B-,W,7$SE)_BUMS'DE+UL3O%9_]"QO M6K*<ZH_3KZ56VS@8V%9>?RZ;T;!S6IO0."W6Y6I)VY_W\AILJ3VF]N*H?;5; MYT"6<)GE]U;"QKR1C0H+W7;IIOY!?#F/1%9@-0I!\:7,II_N91Y97_S2&6Z& M^5U<5;9FJKNMD,_[8FI8M'%Y=5/K<%9U?S#:6OSVMIG/.V3&#\G89IRJ?UEJ MW4"Q2^IM<GDU,?_*K5(+-I7'ACME$B>06TE%E1(TC(DO&"<\9(I(JB2!V('( M =\13EB-R38#FU69>=6>,N:44J\VTBK:U+-W>7Q\: O'A!*/N)0PQAGS/1ZX MQ VH\"@/'$%$R'P6^AZA9L)7AENZG0TR$STO(3I-K82%$7$\XH07U-EWQ3X+ MAIY/.67B[XZWSYQY6U>TMMC-S.K'2 R,7^^GR:3QS=*L+1JWW7)#ZNCX3NJK M)(7YH!R;%=0).3NH)V^7Q .&7D:170I926I6E"X;4M\?FHXM]6(0SOZ^$J': M=YGF^^ &<C]R]%^IMQK+1MLL;[;A^.X]E+=9_F4>Q8W4<FE0&>L2V6'H'"8@ MBWI0JJ7&P*Z2!T<O5XVUQ'88:X42$^LN<WD]L&&A&'QW)_R_;2QHR)NU6K;' MC^.[<YB:D -YJUNL7L_38-[S#IEN/_[P;JSE!.K;YSB+8-2ZOJDXOFD5_ZA, M*+=J*U<[YVYW@/T]EWES/^H:OZKL,2!J :NN^G1JB;IE)AYDDXD)F';]7;$' M2FGN=%3/Y]6RK<HG(/,4(@MQ*Q?;=7G;P%KY5CNO)]EMM3 J.LVL%F^U8@*O ME:Q6=U:P"BTM,^OENPPU.=LN6^LBV\V9A"K3V>0X-3,[EAJZ+79*;35ZGLU* M.)?I9;>UM>(N,]=3&Z8N%M-E?>B[RK?-RYWSK9Z7T7UJ9ZU)E#O0NR+RT2XX M-X06+KYEU6BEZ\1ED5[_'YE]L]ZW'W5.WY'5M#-X&P^ZD^HZ(6\6]>:NS*[M M\X+5\ZJYZR)O\B0ZR-(XN32#$1N?-#(=UVQ]/U]/3.'B:/.YP2)SMTO+PJ;3 M=78=;4O:H\V</TOM6J99U<BUE/U+<_TXK1863<ZP6N69F9+F:I-R)Y"O)MVF MU0](C%,Y+:ZRTDC.:_C9)B++Q"2?QEU3RD;FX<OFJ<SR@=*PP^"@-+UJUB2_ M0JU9NF3UXG.><"CJQD"E1W3D,\(]"41%'B,NL(!YH1=S=YXUK693]0.N[GRD M[M*L@#>33,E)5\-?9=EDJ5PO^#84NNT6\[[5MWMU/-)R:;5F[;IXMU%M)Z2N M/+1M;USFIB%+D_-Q'1R,/U;66WI;#5=YQ0ZC'8X[M[U]B6@*+^!Z.C%IUV,: M/#<XU]EJU"ZBWD *N;2WX%T6P0/CVZG3;3Z;0FIF9/.L]('9L"*\TU[7C5NU MZ+0M[KY?R65J H'ID6&;#4\/V%P3WS*L,GTYG4[NCQ]KNQZ!+6J==/LU@6 3 M5DU06@UAXX^-QA@LIR&JGV8UL:R2?0^W1NS</JDT:6UZD667DXZ'J$;&3I'4 M^D%;O>I=_?#N(CLR"6@.Y]GMIOYOX&2E7C\W6Y)RQQ,])"82<S<Q&:<.59R1 M@$N7<.V'1*A($AEZU(E\CVE-D9A?EY@['!C)B>1$<O9$SO:W6DA.).=N<OJN MXP2<><0/G(!P#B$)(T9)+%U'.V'@J<!#<O9*SK8#(SF1G$C.KTK.]3<[?@LS MD9!_/D(R3S#&8TY\CU/"%?A$N2;!U%H&H:L"H9B/A.R!D.N.BFQ$-B(;OQ8; M[7L'\X<X9+!\/>H/B\?E4" ?^^2C&W#/I0XCD2<DX4)%1 DPN:3K1U10+5V. MSUZ_,A^W.2LB$A&)B.P'D:WEZ<(!$98(RQ58:E_$D@E!=,P] TNFB @T)8$* MN:"1$!!RA&6?L.QR6\0F8A.QV1,V<YD6LO[!Z+EQ#4PPD9EK7U$J;= (/@D] MSS!34D44"SAQ-*6N4DR)&)"9O3)SW6<1F A,!&;OP$16(BM761F'3L!BSR24 M3(2$^V#R2]=C) QDX )W7?#QIR/?BI6(2<0D8K(G3)Y(NT%0@ODD,G*-D=)W ME)(B)J$K L*%9$1*CY-(:ZI\JAP5,61DGXQ<^"H"$@&)@.P'D/3N[ON!>W<W MD&DT8.;S'(JI6:0B,9&8:\2,0L4A=!T2!X$VQ(P"HGQSZH7,"6+F:^V'2,P^ MB;G=>1&AB%!$:#\(K<Y>RV0RRY&:2,TU:HK(H^ &#J$T< EW7$U"#@%A6CDR M#$ +A=3LE9HK_HJ@1% B*/L!Y<'5+/TR.&JV>!Y\-U^M_@VAB=!<@:;#:,2% M%Q+A:X_PB$8D9&%(/.5)Z2HMW3! :/8)S:V^BP!%@") OQ5 J^X@/Y&?J_P$ M'V0@78-. "#<CR,B0^81%H344T' HF[%7QE?E9.S!"/B$?$8T_OQ!Z8DRQ- M 5^+12IV994BH(I1(#2FW%!1*!)R 212+&1.&+INA%EEKUGEFL<B+!&6",O^ M8(E?6B(IMY"2ASX(36C@*[N;CTO", 82A$+;%!*8'R,I^R8E?F>)F$1,]HM) M@X?!A_.3/RPA<3O8;P)(C]L_BLHH >F'A(<Z($I[,8EE0+4((59<(R#[!&3C MJ,A&9".R\:NRL?G+!+AI#V+R04QZL><Z4A!?:TVX#( H<!GQI>?Y@8I=C^++ MKWU@<KO/(C 1F C,WH&)K$16KOU0A-) @=B<DM!>* C(@1P(@%\Y0;4BP W M[?E6K$1,(B81DSUATD( $TJ$9 <D.0T#1SN<F+P2"(\%(\*CE%"/.8%R0D]0 MW#F]5T@NG141B8A$1/:#R,5&'^926B(F$9,KF*21)[60F@@:^X0KZA&E)"6" M"\^3@9*1PLW2>\7DJL,B*A&5B,I^4(F[#B U'T=-ES,E0D\3J3V37-JM[D(M M8A*X3FS_R+.G-":7O5(3=QU @") _W Q5T'D)\=_ 2F :0(B2\I)9P% 0D5 M:,*\4 BJ(]_1"OGY=?E9.3%%/"(>$8_]X!&W?T4F[F B=5@4 A"IPHAP"#A1 M'%Q"(53:"V-&8\PI>\TI<?M7!"6"\EN\_8K;\R J=Z R5+'G P\,*A4CW#/I MHY2A) [X+C@Q,-=W$95]HA*WYT%8(BR_&2PQJ412=I*2<1$SFT7&+BC"8QT1 MZ2F?""5B;FD9<TPJ>R<EYI2(2<1DOYC\';;G63VOZL0->_YTR(P#[OL0!T2[ MD4<X4Y0(%SS"5" <&L2*>_C=9*_(Q U[D)9(RUYI>7IFM<>#=U!>91&FE<C( MU5^-!$"CT%5$R# TC/0%44H 850Y0L6&DK@#02_O[R 3D8G(Q-^7B=5'4<7M MTW1R7YU16WZ2I%\@JLZ;VFI=<S@V/#1397E4=):?&))8 F:SZ<#V\OE>96UO M$24-$%;+#V8&,==[@RR/(*]X(;4VQD[@!B;/]]RJWVV%0XBEP4RQ4''65-9K ML.#?(5SUM))??H[3ZVF]:I#-3"INAM,:E& .K0"+:"VUP^VJ$;]+*^]L86Y MPA1J4UA-O>;\1N9U2YO 92XU:+$;KMS,KY>&Y\WU" J=)]-RB9T6<*R;7263 E*(=T,)I?&345M>N-X.8!A9;$J-WRWV4NVG[:CX6+OO@?3*V*E@ end + + + 2 + <_scenarioElementFactory ver="[0, [1, [0, [0]]]]" type="ixScenarioElementFactory"> + + + + qovCoprocessor + 0 + + + Impairment + 0 + + + asrCoprocessor + 0 + + + + + + diff --git a/samples/vnf_samples/traffic_profiles/cgnapt/cgnat_ipv4_profile_1flows.ixncfg b/samples/vnf_samples/traffic_profiles/cgnapt/cgnat_ipv4_profile_1flows.ixncfg new file mode 100644 index 0000000000000000000000000000000000000000..d24204385570725f6d0fe74a0692e70e0b8a620a GIT binary patch literal 71988 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

X!2{o78=^1W(skyX5(sy@*%Y|jvGd-tOXwT7_ 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 H0RR915>zUf literal 0 HcmV?d00001 diff --git a/samples/vnf_samples/traffic_profiles/ipv4_throughput_cgnapt.yaml b/samples/vnf_samples/traffic_profiles/ipv4_throughput_cgnapt.yaml new file mode 100644 index 000000000..2ea8d3c44 --- /dev/null +++ b/samples/vnf_samples/traffic_profiles/ipv4_throughput_cgnapt.yaml @@ -0,0 +1,89 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +# flow definition for ACL tests - 1K flows - ipv4 only +# +# the number of flows defines the widest range of parameters +# for example if srcip_range=1.0.0.1-1.0.0.255 and dst_ip_range=10.0.0.1-10.0.1.255 +# and it should define only 16 flows +# +#there is assumption that packets generated will have a random sequences of following addresses pairs +# in the packets +# 1. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512) +# 2. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512) +# ... +# 512. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512) +# +# not all combination should be filled +# Any other field with random range will be added to flow definition +# +# the example.yaml provides all possibilities for traffic generation +# +# the profile defines a public and private side to make limited traffic correlation +# between private and public side same way as it is made by IXIA solution. +# +schema: "nsb:traffic_profile:0.1" + +# This file is a template, it will be filled with values from tc.yaml before passing to the traffic generator + +name: rfc2544 +description: Traffic profile to run RFC2544 latency +traffic_profile: + traffic_type : RFC2544Profile # defines traffic behavior - constant or look for highest possible throughput + frame_rate : 100 # pc of linerate + # that specifies a range (e.g. ipv4 address, port) + + +private_1: + ipv4: + outer_l2: + framesize: + 64B: "{{ get(imix, 'imix.private.imix_small', '0') }}" + 128B: "{{ get(imix, 'imix.private.imix_128B', '0') }}" + 256B: "{{ get(imix, 'imix.private.imix_256B', '0') }}" + 373b: "{{ get(imix, 'imix.private.imix_373B', '0') }}" + 570B: "{{get(imix, 'imix.private.imix_570B', '0') }}" + 1400B: "{{get(imix, 'imix.private.imix_1400B', '0') }}" + 1518B: "{{get(imix, 'imix.private.imix_1500B', '0') }}" + + outer_l3v4: + proto: "udp" + srcip4: "{{get(flow, 'flow.srcip4_range', '10.0.2.1-10.0.2.255') }}" + dstip4: "{{get(flow, 'flow.dstip4_range', '10.0.3.1-10.0.3.255') }}" + ttl: 32 + dscp: 0 + outer_l4: + srcport: "{{get(flow, 'flow.srcport_range', '1234') }}" + dstport: "{{get(flow, 'flow.dstport_range', '2001') }}" +public_1: + ipv4: + outer_l2: + framesize: + 64B: "{{ get(imix, 'imix.private.imix_small', '0') }}" + 128B: "{{ get(imix, 'imix.private.imix_128B', '0') }}" + 256B: "{{ get(imix, 'imix.private.imix_256B', '0') }}" + 373b: "{{ get(imix, 'imix.private.imix_373B', '0') }}" + 570B: "{{get(imix, 'imix.private.imix_570B', '0') }}" + 1400B: "{{get(imix, 'imix.private.imix_1400B', '0') }}" + 1518B: "{{get(imix, 'imix.private.imix_1500B', '0') }}" + + outer_l3v4: + proto: "udp" + srcip4: "{{get(flow, 'flow.dstip4_range', '10.0.3.1-10.0.3.255') }}" + dstip4: "{{get(flow, 'flow.srcip4_range', '10.0.2.1-10.0.2.255') }}" + ttl: 32 + dscp: 0 + outer_l4: + srcport: "{{get(flow, 'flow.dstport_range', '1234') }}" + dstport: "{{get(flow, 'flow.srcport_range', '2001') }}" diff --git a/samples/vnf_samples/vnf_descriptors/cgnapt_vnf.yaml b/samples/vnf_samples/vnf_descriptors/cgnapt_vnf.yaml new file mode 100644 index 000000000..b42fb4d4e --- /dev/null +++ b/samples/vnf_samples/vnf_descriptors/cgnapt_vnf.yaml @@ -0,0 +1,79 @@ +# Copyright 2016-2017 Intel Corporation +# +# 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. +# +# This needs to be adjusted for every hardware setup +# +vnfd:vnfd-catalog: + vnfd: + - id: CgnaptApproxVnf + name: CgnaptVnfSshIntel + short-name: CgnaptVnf + description: CGNAPT approximation using DPDK + mgmt-interface: + vdu-id: cgnatvnf-baremetal + {% if user is defined %} + user: '{{user}}' # Value filled by vnfdgen + {% endif %} + {% if password is defined %} + password: '{{password}}' # Value filled by vnfdgen + {% endif %} + {% if ip is defined %} + ip: '{{ip}}' # Value filled by vnfdgen + {% endif %} + {% if key_filename is defined %} + key_filename: '{{key_filename}}' # Value filled by vnfdgen + {% endif %} + connection-point: + - name: xe0 + type: VPORT + - name: xe1 + type: VPORT + vdu: + - id: cgnaptvnf-baremetal + name: cgnaptvnf-baremetal + description: CGNAPT approximation using DPDK + external-interface: + - name: xe0 + virtual-interface: + type: PCI-PASSTHROUGH + # Substitution variables MUST be quoted. Otherwise Python can misinterpet them. + vpci: '{{ interfaces.xe0.vpci }}' # Value filled by vnfdgen + dpdk_port_num: '{{ interfaces.xe0.dpdk_port_num }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe0.local_ip }}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe0.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe0.local_mac }}' # Value filled by vnfdgen + netmask: '{{ interfaces.xe0.netmask }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe0.dst_mac }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe0 + - name: xe1 + virtual-interface: + type: PCI-PASSTHROUGH + # Substitution variables MUST be quoted. Otherwise Python can misinterpet them. + vpci: '{{ interfaces.xe1.vpci }}' # Value filled by vnfdgen + dpdk_port_num: '{{ interfaces.xe1.dpdk_port_num }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe1.local_ip }}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe1.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe1.local_mac }}' # Value filled by vnfdgen + netmask: '{{ interfaces.xe1.netmask }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe1.dst_mac }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe1 + routing_table: {{ routing_table }} + nd_route_tbl: {{ nd_route_tbl }} + benchmark: + kpi: + - packets_in + - packets_fwd + - packets_dropped diff --git a/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py new file mode 100644 index 000000000..bf226d2c8 --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py @@ -0,0 +1,481 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. +# + +from __future__ import absolute_import + +import os +import unittest + +import mock + +STL_MOCKS = { + 'stl': mock.MagicMock(), + 'stl.trex_stl_lib': mock.MagicMock(), + 'stl.trex_stl_lib.base64': mock.MagicMock(), + 'stl.trex_stl_lib.binascii': mock.MagicMock(), + 'stl.trex_stl_lib.collections': mock.MagicMock(), + 'stl.trex_stl_lib.copy': mock.MagicMock(), + 'stl.trex_stl_lib.datetime': mock.MagicMock(), + 'stl.trex_stl_lib.functools': mock.MagicMock(), + 'stl.trex_stl_lib.imp': mock.MagicMock(), + 'stl.trex_stl_lib.inspect': mock.MagicMock(), + 'stl.trex_stl_lib.json': mock.MagicMock(), + 'stl.trex_stl_lib.linecache': mock.MagicMock(), + 'stl.trex_stl_lib.math': mock.MagicMock(), + 'stl.trex_stl_lib.os': mock.MagicMock(), + 'stl.trex_stl_lib.platform': mock.MagicMock(), + 'stl.trex_stl_lib.pprint': mock.MagicMock(), + 'stl.trex_stl_lib.random': mock.MagicMock(), + 'stl.trex_stl_lib.re': mock.MagicMock(), + 'stl.trex_stl_lib.scapy': mock.MagicMock(), + 'stl.trex_stl_lib.socket': mock.MagicMock(), + 'stl.trex_stl_lib.string': mock.MagicMock(), + 'stl.trex_stl_lib.struct': mock.MagicMock(), + 'stl.trex_stl_lib.sys': mock.MagicMock(), + 'stl.trex_stl_lib.threading': mock.MagicMock(), + 'stl.trex_stl_lib.time': mock.MagicMock(), + 'stl.trex_stl_lib.traceback': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(), + 'stl.trex_stl_lib.types': mock.MagicMock(), + 'stl.trex_stl_lib.utils': mock.MagicMock(), + 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(), + 'stl.trex_stl_lib.utils.collections': mock.MagicMock(), + 'stl.trex_stl_lib.utils.common': mock.MagicMock(), + 'stl.trex_stl_lib.utils.json': mock.MagicMock(), + 'stl.trex_stl_lib.utils.os': mock.MagicMock(), + 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(), + 'stl.trex_stl_lib.utils.random': mock.MagicMock(), + 'stl.trex_stl_lib.utils.re': mock.MagicMock(), + 'stl.trex_stl_lib.utils.string': mock.MagicMock(), + 'stl.trex_stl_lib.utils.sys': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(), + 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(), + 'stl.trex_stl_lib.warnings': mock.MagicMock(), + 'stl.trex_stl_lib.yaml': mock.MagicMock(), + 'stl.trex_stl_lib.zlib': mock.MagicMock(), + 'stl.trex_stl_lib.zmq': mock.MagicMock(), +} + +STLClient = mock.MagicMock() +stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) +stl_patch.start() + +if stl_patch: + from yardstick.network_services.vnf_generic.vnf.cgnapt_vnf import CgnaptApproxVnf, \ + CgnaptApproxSetupEnvHelper + from yardstick.network_services.vnf_generic.vnf import cgnapt_vnf + from yardstick.network_services.nfvi.resource import ResourceProfile + +TEST_FILE_YAML = 'nsb_test_case.yaml' + + +name = 'vnf__1' + + +class TestCgnaptApproxSetupEnvHelper(unittest.TestCase): + + def test__generate_ip_from_pool(self): + + ip = CgnaptApproxSetupEnvHelper._generate_ip_from_pool("1.2.3.4") + self.assertEqual(next(ip), '1.2.3.4') + self.assertEqual(next(ip), '1.2.4.4') + self.assertEqual(next(ip), '1.2.5.4') + + def test__update_cgnat_script_file(self): + + sample = """\ +# See the License for the specific language governing permissions and +# limitations under the License. + +link 0 down +link 0 config {port0_local_ip} {port0_prefixlen} +link 0 up +link 1 down +link 1 config {port1_local_ip} {port1_prefixlen} +link 1 up +""" + header = "This is a header" + + out = CgnaptApproxSetupEnvHelper._update_cgnat_script_file(header, sample.splitlines(), "") + self.assertNotIn("This is a header", out) + + def test__get_cgnapt_confgi(self): + + c = CgnaptApproxSetupEnvHelper(mock.MagicMock(), mock.MagicMock(), mock.MagicMock()) + c._get_ports_gateway = mock.Mock(return_value=3) + ret = c._get_cgnapt_config([{"name": 'a'}, {}, {"name": "b"}, {}, {"name": "c"}]) + self.assertEqual(ret, [3, 3, 3]) + + +@mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Process") +class TestCgnaptApproxVnf(unittest.TestCase): + VNFD = {'vnfd:vnfd-catalog': + {'vnfd': + [{'short-name': 'VpeVnf', + 'vdu': + [{'routing_table': + [{'network': '152.16.100.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'if': 'xe0'}, + {'network': '152.16.40.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'if': 'xe1'}], + 'description': 'VPE approximation using DPDK', + 'name': 'vpevnf-baremetal', + 'nd_route_tbl': + [{'network': '0064:ff9b:0:0:0:0:9810:6414', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'network': '0064:ff9b:0:0:0:0:9810:2814', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'id': 'vpevnf-baremetal', + 'external-interface': + [{'virtual-interface': + {'dst_mac': '00:00:00:00:00:04', + 'vpci': '0000:05:00.0', + 'local_ip': '152.16.100.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '0', + 'bandwidth': '10 Gbps', + 'driver': "i40e", + 'dst_ip': '152.16.100.20', + 'local_iface_name': 'xe0', + 'local_mac': '00:00:00:00:00:02'}, + 'vnfd-connection-point-ref': 'xe0', + 'name': 'xe0'}, + {'virtual-interface': + {'dst_mac': '00:00:00:00:00:03', + 'vpci': '0000:05:00.1', + 'local_ip': '152.16.40.19', + 'type': 'PCI-PASSTHROUGH', + 'driver': "i40e", + 'netmask': '255.255.255.0', + 'dpdk_port_num': '1', + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.40.20', + 'local_iface_name': 'xe1', + 'local_mac': '00:00:00:00:00:01'}, + 'vnfd-connection-point-ref': 'xe1', + 'name': 'xe1'}]}], + 'description': 'Vpe approximation using DPDK', + 'mgmt-interface': + {'vdu-id': 'vpevnf-baremetal', + 'host': '1.2.1.1', + 'password': 'r00t', + 'user': 'root', + 'ip': '1.2.1.1'}, + 'benchmark': + {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, + 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, + {'type': 'VPORT', 'name': 'xe1'}], + 'id': 'CgnaptApproxVnf', 'name': 'VPEVnfSsh'}]}} + + scenario_cfg = {'options': {'packetsize': 64, 'traffic_type': 4, + 'rfc2544': {'allowed_drop_rate': '0.8 - 1'}, + 'vnf__1': {'rules': 'acl_1rule.yaml', + 'vnf_config': {'lb_config': 'SW', + 'lb_count': 1, + 'worker_config': + '1C/1T', + 'worker_threads': 1}} + }, + 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7', + 'task_path': '/tmp', + 'tc': 'tc_ipv4_1Mflow_64B_packetsize', + 'runner': {'object': 'NetworkServiceTestCase', + 'interval': 35, + 'output_filename': '/tmp/yardstick.out', + 'runner_id': 74476, 'duration': 400, + 'type': 'Duration'}, + 'traffic_profile': 'ipv4_throughput_acl.yaml', + 'traffic_options': {'flow': 'ipv4_Packets_acl.yaml', + 'imix': 'imix_voice.yaml'}, + 'type': 'ISB', + 'nodes': {'tg__2': 'trafficgen_2.yardstick', + 'tg__1': 'trafficgen_1.yardstick', + 'vnf__1': 'vnf.yardstick'}, + 'topology': 'vpe-tg-topology-baremetal.yaml'} + + context_cfg = {'nodes': {'tg__2': + {'member-vnf-index': '3', + 'role': 'TrafficGen', + 'name': 'trafficgen_2.yardstick', + 'vnfd-id-ref': 'tg__2', + 'ip': '1.2.1.1', + 'interfaces': + {'xe0': {'local_iface_name': 'ens513f0', + 'vld_id': 'public', + 'netmask': '255.255.255.0', + 'local_ip': '152.16.40.20', + 'dst_mac': '00:00:00:00:00:01', + 'local_mac': '00:00:00:00:00:03', + 'dst_ip': '152.16.40.19', + 'driver': 'ixgbe', + 'vpci': '0000:02:00.0', + 'dpdk_port_num': 0}, + 'xe1': {'local_iface_name': 'ens513f1', + 'netmask': '255.255.255.0', + 'network': '202.16.100.0', + 'local_ip': '202.16.100.20', + 'local_mac': '00:1e:67:d0:60:5d', + 'driver': 'ixgbe', + 'vpci': '0000:02:00.1', + 'dpdk_port_num': 1}}, + 'password': 'r00t', + 'VNF model': 'l3fwd_vnf.yaml', + 'user': 'root'}, + 'tg__1': + {'member-vnf-index': '1', + 'role': 'TrafficGen', + 'name': 'trafficgen_1.yardstick', + 'vnfd-id-ref': 'tg__1', + 'ip': '1.2.1.1', + 'interfaces': + {'xe0': {'local_iface_name': 'ens785f0', + 'vld_id': 'private', + 'netmask': '255.255.255.0', + 'local_ip': '152.16.100.20', + 'dst_mac': '00:00:00:00:00:02', + 'local_mac': '00:00:00:00:00:04', + 'dst_ip': '152.16.100.19', + 'driver': 'i40e', + 'vpci': '0000:05:00.0', + 'dpdk_port_num': 0}, + 'xe1': {'local_iface_name': 'ens785f1', + 'netmask': '255.255.255.0', + 'local_ip': '152.16.100.21', + 'local_mac': '00:00:00:00:00:01', + 'driver': 'i40e', + 'vpci': '0000:05:00.1', + 'dpdk_port_num': 1}}, + 'password': 'r00t', + 'VNF model': 'tg_rfc2544_tpl.yaml', + 'user': 'root'}, + 'vnf__1': + {'name': 'vnf.yardstick', + 'vnfd-id-ref': 'vnf__1', + 'ip': '1.2.1.1', + 'interfaces': + {'xe0': {'local_iface_name': 'ens786f0', + 'vld_id': 'private', + 'netmask': '255.255.255.0', + 'local_ip': '152.16.100.19', + 'dst_mac': '00:00:00:00:00:04', + 'local_mac': '00:00:00:00:00:02', + 'dst_ip': '152.16.100.20', + 'driver': 'i40e', + 'vpci': '0000:05:00.0', + 'dpdk_port_num': 0}, + 'xe1': {'local_iface_name': 'ens786f1', + 'vld_id': 'public', + 'netmask': '255.255.255.0', + 'local_ip': '152.16.40.19', + 'dst_mac': '00:00:00:00:00:03', + 'local_mac': '00:00:00:00:00:01', + 'dst_ip': '152.16.40.20', + 'driver': 'i40e', + 'vpci': '0000:05:00.1', + 'dpdk_port_num': 1}}, + 'routing_table': + [{'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'network': '152.16.100.20', + 'if': 'xe0'}, + {'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'network': '152.16.40.20', + 'if': 'xe1'}], + 'member-vnf-index': '2', + 'host': '1.2.1.1', + 'role': 'vnf', + 'user': 'root', + 'nd_route_tbl': + [{'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'network': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'network': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'password': 'r00t', + 'VNF model': 'cgnapt_vnf.yaml'}}} + + def test___init__(self, mock_process): + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) + self.assertIsNone(cgnapt_approx_vnf._vnf_process) + + @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") + def test_collect_kpi(self, mock_time, mock_process): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.from_node.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) + cgnapt_approx_vnf.q_in = mock.MagicMock() + cgnapt_approx_vnf.q_out = mock.MagicMock() + cgnapt_approx_vnf.q_out.qsize = mock.Mock(return_value=0) + cgnapt_approx_vnf.resource = mock.Mock(autospec=ResourceProfile) + result = {'packets_dropped': 0, 'packets_fwd': 0, 'packets_in': 0} + self.assertEqual(result, cgnapt_approx_vnf.collect_kpi()) + + @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") + def test_vnf_execute_command(self, mock_time, mock_process): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.from_node.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) + cgnapt_approx_vnf.q_in = mock.MagicMock() + cgnapt_approx_vnf.q_out = mock.MagicMock() + cgnapt_approx_vnf.q_out.qsize = mock.Mock(return_value=0) + cmd = "quit" + self.assertEqual("", cgnapt_approx_vnf.vnf_execute(cmd)) + + def test_get_stats(self, mock_process): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.from_node.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) + cgnapt_approx_vnf.q_in = mock.MagicMock() + cgnapt_approx_vnf.q_out = mock.MagicMock() + cgnapt_approx_vnf.q_out.qsize = mock.Mock(return_value=0) + mock_result = \ + "CG-NAPT(.*\n)*Received 100, Missed 0, Dropped 0,Translated 100,ingress" + cgnapt_approx_vnf.vnf_execute = mock.Mock(return_value=mock_result) + self.assertListEqual(list(mock_result), list(cgnapt_approx_vnf.get_stats())) + + def _get_file_abspath(self, filename): + curr_path = os.path.dirname(os.path.abspath(__file__)) + file_path = os.path.join(curr_path, filename) + return file_path + + @mock.patch("yardstick.network_services.vnf_generic.vnf.cgnapt_vnf.hex") + @mock.patch("yardstick.network_services.vnf_generic.vnf.cgnapt_vnf.eval") + @mock.patch('yardstick.network_services.vnf_generic.vnf.cgnapt_vnf.open') + def test_run_vcgnapt(self, hex, eval, mock_open, mock_process): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.from_node.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) + cgnapt_approx_vnf._build_config = mock.MagicMock() + cgnapt_approx_vnf.queue_wrapper = mock.MagicMock() + cgnapt_approx_vnf.ssh_helper = mock.MagicMock() + cgnapt_approx_vnf.ssh_helper.run = mock.MagicMock() + cgnapt_approx_vnf.scenario_helper.scenario_cfg = self.scenario_cfg + cgnapt_approx_vnf._run() + cgnapt_approx_vnf.ssh_helper.run.assert_called_once() + + @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") + def test_instantiate(self, mock_context, mock_process): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.from_node.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) + cgnapt_approx_vnf.ssh_helper = ssh + cgnapt_approx_vnf.deploy_helper = mock.MagicMock() + cgnapt_approx_vnf.resource_helper = mock.MagicMock() + cgnapt_approx_vnf._build_config = mock.MagicMock() + self.scenario_cfg['vnf_options'] = {'acl': {'cfg': "", + 'rules': ""}} + cgnapt_approx_vnf.q_out.put("pipeline>") + cgnapt_vnf.WAIT_TIME = 3 + self.scenario_cfg.update({"nodes": {"vnf__1": ""}}) + self.assertIsNone(cgnapt_approx_vnf.instantiate(self.scenario_cfg, + self.context_cfg)) + + def test_scale(self, mock_process): + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) + flavor = "" + self.assertRaises(NotImplementedError, cgnapt_approx_vnf.scale, flavor) + + @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") + def test_terminate(self, mock_time, mock_process): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.from_node.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) + cgnapt_approx_vnf._vnf_process = mock.MagicMock() + cgnapt_approx_vnf._vnf_process.terminate = mock.Mock() + cgnapt_approx_vnf.used_drivers = {"01:01.0": "i40e", + "01:01.1": "i40e"} + cgnapt_approx_vnf.vnf_execute = mock.MagicMock() + cgnapt_approx_vnf.ssh_helper = ssh_mock + cgnapt_approx_vnf.dpdk_nic_bind = "dpdk_nic_bind.py" + cgnapt_approx_vnf._resource_collect_stop = mock.Mock() + self.assertEqual(None, cgnapt_approx_vnf.terminate()) + + @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") + @mock.patch("yardstick.network_services.vnf_generic.vnf.cgnapt_vnf.time") + def test__vnf_up_post(self, mock_time, mock_cgnapt_time, mock_process): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.from_node.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) + cgnapt_approx_vnf._vnf_process = mock.MagicMock() + cgnapt_approx_vnf._vnf_process.terminate = mock.Mock() + cgnapt_approx_vnf.vnf_execute = mock.MagicMock() + cgnapt_approx_vnf.ssh_helper = ssh_mock + cgnapt_approx_vnf.scenario_helper.scenario_cfg = self.scenario_cfg + cgnapt_approx_vnf._resource_collect_stop = mock.Mock() + cgnapt_approx_vnf._vnf_up_post() + cgnapt_approx_vnf.vnf_execute.assert_called_once() + + +if __name__ == '__main__': + unittest.main() diff --git a/yardstick/network_services/vnf_generic/vnf/cgnapt_vnf.py b/yardstick/network_services/vnf_generic/vnf/cgnapt_vnf.py new file mode 100644 index 000000000..f9980b165 --- /dev/null +++ b/yardstick/network_services/vnf_generic/vnf/cgnapt_vnf.py @@ -0,0 +1,123 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. + +from __future__ import absolute_import +import time +import logging + +from six.moves import zip +from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF, DpdkVnfSetupEnvHelper + +LOG = logging.getLogger(__name__) + +# CGNAPT should work the same on all systems, we can provide the binary +CGNAPT_PIPELINE_COMMAND = 'sudo {tool_path} -p {ports_len_hex} -f {cfg_file} -s {script}' +WAIT_FOR_STATIC_NAPT = 4 + +CGNAPT_COLLECT_KPI = """\ +CG-NAPT(.*\n)*\ +Received\s(\d+),\ +Missed\s(\d+),\ +Dropped\s(\d+),\ +Translated\s(\d+),\ +ingress\ +""" + + +class CgnaptApproxSetupEnvHelper(DpdkVnfSetupEnvHelper): + + APP_NAME = "vCGNAPT" + CFG_CONFIG = "/tmp/cgnapt_config" + CFG_SCRIPT = "/tmp/cgnapt_script" + DEFAULT_CONFIG_TPL_CFG = "cgnat.cfg" + PIPELINE_COMMAND = CGNAPT_PIPELINE_COMMAND + SW_DEFAULT_CORE = 6 + HW_DEFAULT_CORE = 3 + VNF_TYPE = "CGNAPT" + + @staticmethod + def _generate_ip_from_pool(ip): + ip_parts = ip.split('.') + assert len(ip_parts) == 4 + iter1 = (str(n) for n in range(int(ip_parts[2]), 256)) + for ip_parts[2] in iter1: + yield '.'.join(ip_parts) + + @staticmethod + def _update_cgnat_script_file(ip_pipeline_cfg, mcpi, vnf_str): + pipeline_config_str = str(ip_pipeline_cfg) + input_cmds = '\n'.join(mcpi) + icmp_flag = 'link 0 down' in input_cmds + if icmp_flag: + pipeline_config_str = '' + return '\n'.join([pipeline_config_str, input_cmds]) + + def scale(self, flavor=""): + raise NotImplementedError + + def _get_cgnapt_config(self, interfaces=None): + if interfaces is None: + interfaces = self.vnfd_helper.interfaces + + gateway_ips = [] + + # fixme: Get private port and gateway from port list + priv_ports = interfaces[::2] + for interface in priv_ports: + gateway_ips.append(self._get_ports_gateway(interface["name"])) + return gateway_ips + + +class CgnaptApproxVnf(SampleVNF): + + APP_NAME = "vCGNAPT" + APP_WORD = 'cgnapt' + COLLECT_KPI = CGNAPT_COLLECT_KPI + + COLLECT_MAP = { + "packets_in": 2, + "packets_fwd": 5, + "packets_dropped": 4, + } + + def __init__(self, name, vnfd, setup_env_helper_type=None, resource_helper_type=None): + if setup_env_helper_type is None: + setup_env_helper_type = CgnaptApproxSetupEnvHelper + + super(CgnaptApproxVnf, self).__init__(name, vnfd, setup_env_helper_type, + resource_helper_type) + + def _vnf_up_post(self): + super(CgnaptApproxVnf, self)._vnf_up_post() + if self.scenario_helper.options.get('napt', 'static') != 'static': + return + + ip_iter = self.setup_helper._generate_ip_from_pool("152.16.40.10") + gw_ips = self.setup_helper._get_cgnapt_config() + if self.scenario_helper.vnf_cfg.get("lb_config", "SW") == 'HW': + pipeline = self.setup_helper.HW_DEFAULT_CORE + offset = 3 + else: + pipeline = self.setup_helper.SW_DEFAULT_CORE - 1 + offset = 0 + + worker_threads = int(self.scenario_helper.vnf_cfg["worker_threads"]) + cmd_template = "p {0} entry addm {1} 1 {2} 1 0 32 65535 65535 65535" + for gw, ip in zip(gw_ips, ip_iter): + cmd = cmd_template.format(pipeline, gw, ip) + pipeline += worker_threads + pipeline += offset + self.vnf_execute(cmd) + + time.sleep(WAIT_FOR_STATIC_NAPT) -- 2.16.6