aboutsummaryrefslogtreecommitdiffstats
path: root/resources
diff options
context:
space:
mode:
Diffstat (limited to 'resources')
-rw-r--r--resources/libraries/python/DpdkUtil.py10
-rw-r--r--resources/libraries/python/QemuUtils.py13
-rw-r--r--resources/libraries/robot/performance/performance_configuration.robot161
3 files changed, 117 insertions, 67 deletions
diff --git a/resources/libraries/python/DpdkUtil.py b/resources/libraries/python/DpdkUtil.py
index 79e7209364..b8c1d15a9f 100644
--- a/resources/libraries/python/DpdkUtil.py
+++ b/resources/libraries/python/DpdkUtil.py
@@ -79,8 +79,11 @@ class DpdkUtil(object):
# Set the hexadecimal bitmask of TX queue flags.
pmd_txqflags = '--txqflags=0xf00 '
# Set the number of mbufs to be allocated in the mbuf pools.
- pmd_total_num_mbufs = '--total-num-mbufs={} '.format(\
+ pmd_total_num_mbufs = '--total-num-mbufs={} '.format(
args['pmd_num_mbufs']) if args.get('pmd_num_mbufs', '') else ''
+ # Set the max packet length.
+ pmd_max_pkt_len = "--max-pkt-len={0}".format(args["pmd_max_pkt_len"]) \
+ if args.get("pmd_max_pkt_len", "") else ""
# Set the hexadecimal bitmask of the ports for forwarding.
pmd_portmask = '--portmask={} '.format(args['pmd_portmask'])\
if args.get('pmd_portmask', '') else ''
@@ -96,7 +99,7 @@ class DpdkUtil(object):
pmd_eth_peer_1 = '--eth-peer={} '.format(args['pmd_eth_peer_1'])\
if args.get('pmd_eth_peer_1', '') else ''
# Set the number of forwarding cores based on coremask.
- pmd_nb_cores = '--nb-cores={} '.format(\
+ pmd_nb_cores = '--nb-cores={} '.format(
bin(int(args['eal_coremask'], 0)).count('1')-1)\
if args.get('eal_coremask', '') else ''
pmd_options = '-- '\
@@ -113,7 +116,8 @@ class DpdkUtil(object):
+ pmd_disable_rss\
+ pmd_eth_peer_0\
+ pmd_eth_peer_1\
- + pmd_nb_cores
+ + pmd_nb_cores\
+ + pmd_max_pkt_len
return pmd_options
@staticmethod
diff --git a/resources/libraries/python/QemuUtils.py b/resources/libraries/python/QemuUtils.py
index aa45ce08ef..a8c26d6898 100644
--- a/resources/libraries/python/QemuUtils.py
+++ b/resources/libraries/python/QemuUtils.py
@@ -192,16 +192,19 @@ class QemuUtils(object):
arch = Topology.get_node_arch(node)
self._qemu_bin = 'qemu-system-{arch}'.format(arch=arch)
- def qemu_add_vhost_user_if(self, socket, server=True, mac=None):
+ def qemu_add_vhost_user_if(self, socket, server=True, mac=None,
+ jumbo_frames=False):
"""Add Vhost-user interface.
:param socket: Path of the unix socket.
:param server: If True the socket shall be a listening socket.
:param mac: Vhost-user interface MAC address (optional, otherwise is
- used auto-generated MAC 52:54:00:00:xx:yy).
+ used auto-generated MAC 52:54:00:00:xx:yy).
+ :param jumbo_frames: Set True if jumbo frames are used in the test.
:type socket: str
:type server: bool
:type mac: str
+ :type jumbo_frames: bool
"""
self._vhost_id += 1
# Create unix socket character device.
@@ -221,7 +224,11 @@ class QemuUtils(object):
mac = '52:54:00:00:{0:02x}:{1:02x}'.\
format(self._qemu_id, self._vhost_id)
extend_options = 'mq=on,csum=off,gso=off,guest_tso4=off,'\
- 'guest_tso6=off,guest_ecn=off,mrg_rxbuf=off'
+ 'guest_tso6=off,guest_ecn=off'
+ if jumbo_frames:
+ extend_options += ",mrg_rxbuf=on"
+ else:
+ extend_options += ",mrg_rxbuf=off"
# Create Virtio network device.
device = ' -device virtio-net-pci,netdev=vhost{0},mac={1},{2}'.format(
self._vhost_id, mac, extend_options)
diff --git a/resources/libraries/robot/performance/performance_configuration.robot b/resources/libraries/robot/performance/performance_configuration.robot
index ba6c7967bb..43e1a3265b 100644
--- a/resources/libraries/robot/performance/performance_configuration.robot
+++ b/resources/libraries/robot/performance/performance_configuration.robot
@@ -890,40 +890,40 @@
| | ${port_limit}= | Set Variable | ${65535}
| | ${acl}= | Set Variable | ipv4 permit
| | :FOR | ${nr} | IN RANGE | 0 | ${no_hit_aces_number}
-| | | ${src_ip_int} = | Evaluate | $src_ip_int + $ip_step
-| | | ${dst_ip_int} = | Evaluate | $dst_ip_int + $ip_step
-| | | ${sport}= | Evaluate | $sport + $port_step
-| | | ${dport}= | Evaluate | $dport + $port_step
-| | | ${ipv4_limit_reached}= | Set Variable If
-| | | ... | $src_ip_int > $ip_limit_int or $src_ip_int > $ip_limit_int
-| | | ... | ${True}
-| | | ${udp_limit_reached}= | Set Variable If
-| | | ... | $sport > $port_limit or $dport > $port_limit | ${True}
-| | | Run Keyword If | $ipv4_limit_reached is True | Log
-| | | ... | Can't do more iterations - IPv4 address limit has been reached.
-| | | ... | WARN
-| | | Run Keyword If | $udp_limit_reached is True | Log
-| | | ... | Can't do more iterations - UDP port limit has been reached.
-| | | ... | WARN
-| | | ${src_ip} = | Run Keyword If | $ipv4_limit_reached is True
-| | | ... | Set Variable | ${ip_limit}
-| | | ... | ELSE | Evaluate | str(ipaddress.ip_address($src_ip_int))
-| | | ... | modules=ipaddress
-| | | ${dst_ip} = | Run Keyword If | $ipv4_limit_reached is True
-| | | ... | Set Variable | ${ip_limit}
-| | | ... | ELSE | Evaluate | str(ipaddress.ip_address($dst_ip_int))
-| | | ... | modules=ipaddress
-| | | ${sport}= | Set Variable If | ${sport} > $port_limit | $port_limit
-| | | ... | ${sport}
-| | | ${dport}= | Set Variable If | ${dport} > $port_limit | $port_limit
-| | | ... | ${dport}
-| | | ${acl}= | Catenate | ${acl} | src ${src_ip}/32 dst ${dst_ip}/32
-| | | ... | sport ${sport} | dport ${dport},
-| | | Exit For Loop If
-| | | ... | $ipv4_limit_reached is True or $udp_limit_reached is True
+| | | ${src_ip_int} = | Evaluate | $src_ip_int + $ip_step
+| | | ${dst_ip_int} = | Evaluate | $dst_ip_int + $ip_step
+| | | ${sport}= | Evaluate | $sport + $port_step
+| | | ${dport}= | Evaluate | $dport + $port_step
+| | | ${ipv4_limit_reached}= | Set Variable If
+| | | ... | $src_ip_int > $ip_limit_int or $src_ip_int > $ip_limit_int
+| | | ... | ${True}
+| | | ${udp_limit_reached}= | Set Variable If
+| | | ... | $sport > $port_limit or $dport > $port_limit | ${True}
+| | | Run Keyword If | $ipv4_limit_reached is True | Log
+| | | ... | Can't do more iterations - IPv4 address limit has been reached.
+| | | ... | WARN
+| | | Run Keyword If | $udp_limit_reached is True | Log
+| | | ... | Can't do more iterations - UDP port limit has been reached.
+| | | ... | WARN
+| | | ${src_ip} = | Run Keyword If | $ipv4_limit_reached is True
+| | | ... | Set Variable | ${ip_limit}
+| | | ... | ELSE | Evaluate | str(ipaddress.ip_address($src_ip_int))
+| | | ... | modules=ipaddress
+| | | ${dst_ip} = | Run Keyword If | $ipv4_limit_reached is True
+| | | ... | Set Variable | ${ip_limit}
+| | | ... | ELSE | Evaluate | str(ipaddress.ip_address($dst_ip_int))
+| | | ... | modules=ipaddress
+| | | ${sport}= | Set Variable If | ${sport} > $port_limit | $port_limit
+| | | ... | ${sport}
+| | | ${dport}= | Set Variable If | ${dport} > $port_limit | $port_limit
+| | | ... | ${dport}
+| | | ${acl}= | Catenate | ${acl} | src ${src_ip}/32 dst ${dst_ip}/32
+| | | ... | sport ${sport} | dport ${dport},
+| | | Exit For Loop If
+| | | ... | $ipv4_limit_reached is True or $udp_limit_reached is True
| | ${acl}= | Catenate | ${acl}
-| | ... | ipv4 ${acl_action} src ${trex_stream1_subnet},
-| | ... | ipv4 ${acl_action} src ${trex_stream2_subnet}
+| | ... | ipv4 ${acl_action} src ${trex_stream1_subnet},
+| | ... | ipv4 ${acl_action} src ${trex_stream2_subnet}
| | Add Replace Acl Multi Entries | ${dut} | rules=${acl}
| | @{acl_list}= | Create List | ${0}
| | Run Keyword If | 'input' in $acl_apply_type and $dut_if1 is not None
@@ -1433,6 +1433,8 @@
| | ... | Type: integer
| | ... | - qemu_id - Qemu Id when starting more then one guest VM on DUT node.
| | ... | Type: integer
+| | ... | - jumbo_frames - Set True if jumbo frames are used in the test.
+| | ... | Type: bool
| | ...
| | ... | *Example:*
| | ...
@@ -1444,7 +1446,7 @@
| | ... | \| qemu_id=${2} \|
| | ...
| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${vm_name} | ${skip}=${6}
-| | ... | ${count}=${5} | ${qemu_id}=${1}
+| | ... | ${count}=${5} | ${qemu_id}=${1} | ${jumbo_frames}=${False}
| | ...
| | Import Library | resources.libraries.python.QemuUtils | qemu_id=${qemu_id}
| | ... | WITH NAME | ${vm_name}
@@ -1458,7 +1460,9 @@
| | ${qemu_cpus}= | Cpu slice of list per node | ${dut_node} | ${dut_numa}
| | ... | skip_cnt=${skip_cnt} | cpu_cnt=${count} | smt_used=${False}
| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock1}
+| | ... | jumbo_frames=${jumbo_frames}
| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock2}
+| | ... | jumbo_frames=${jumbo_frames}
| | ${apply_patch}= | Set Variable If | "${perf_qemu_qsz}" == "256" | ${False}
| | ... | ${True}
| | Run Keyword Unless | ${qemu_built} | ${vm_name}.Build QEMU | ${dut_node}
@@ -1471,9 +1475,11 @@
| | ${vm}= | Run keyword | ${vm_name}.Qemu Start
| | Run keyword | ${vm_name}.Qemu Set Affinity | @{qemu_cpus}
| | Run keyword If | ${use_tuned_cfs} | ${vm_name}.Qemu Set Scheduler Policy
+| | ${max_pkt_len}= | Set Variable If | ${jumbo_frames} | 9000 | ${EMPTY}
| | Dpdk Testpmd Start | ${vm} | eal_coremask=0x1f | eal_mem_channels=4
| | ... | pmd_fwd_mode=io | pmd_disable_hw_vlan=${True}
| | ... | pmd_txd=${perf_qemu_qsz} | pmd_rxd=${perf_qemu_qsz}
+| | ... | pmd_max_pkt_len=${max_pkt_len}
| | Return From Keyword | ${vm}
| Configure '${nr}' guest VMs with dpdk-testpmd connected via vhost-user in 3-node circular topology
@@ -1488,10 +1494,12 @@
| | ... | - ${system_cpus} - Number of CPUs allocated for OS itself.
| | ... | - ${vpp_cpus} - Number of CPUs allocated for VPP.
| | ... | - ${vm_cpus} - Number of CPUs to be allocated per QEMU instance.
+| | ... | - ${jumbo_frames} - Jumbo frames are used (True) or are not used
+| | ... | (False) in the test.
| | ...
| | ... | *Example:*
| | ...
-| | ... | \| Configure '2' guest VMs with dpdk-testpmd connected via vhost-user \
+| | ... | \| Configure '2' guest VMs with dpdk-testpmd connected via vhost-user\
| | ... | in 3-node circular topology \|
| | ...
| | :FOR | ${number} | IN RANGE | 1 | ${nr}+1
@@ -1501,10 +1509,12 @@
| | | ${vm1}= | Configure guest VM with dpdk-testpmd connected via vhost-user
| | | ... | ${dut1} | ${sock1} | ${sock2} | DUT1_VM${number}
| | | ... | skip=${skip_cpus} | count=${vm_cpus} | qemu_id=${number}
+| | | ... | jumbo_frames=${jumbo_frames}
| | | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM${number} | ${vm1}
| | | ${vm2}= | Configure guest VM with dpdk-testpmd connected via vhost-user
| | | ... | ${dut2} | ${sock1} | ${sock2} | DUT2_VM${number}
| | | ... | skip=${skip_cpus} | count=${vm_cpus} | qemu_id=${number}
+| | | ... | jumbo_frames=${jumbo_frames}
| | | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM${number} | ${vm2}
| | | Run Keyword Unless | ${qemu_built} | Set Suite Variable | ${qemu_built}
| | | ... | ${True}
@@ -1524,6 +1534,8 @@
| | ... | - vm_name - QemuUtil instance name. Type: string
| | ... | - skip - number of cpus which will be skipped. Type: int
| | ... | - count - number of cpus which will be allocated for qemu. Type: int
+| | ... | - jumbo_frames - Set True if jumbo frames are used in the test.
+| | ... | Type: bool
| | ...
| | ... | *Example:*
| | ...
@@ -1532,7 +1544,7 @@
| | ... | \| ${6} \| ${5} \|
| | ...
| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${vm_name} | ${skip}=${6}
-| | ... | ${count}=${5}
+| | ... | ${count}=${5} | ${jumbo_frames}=${False}
| | ...
| | Import Library | resources.libraries.python.QemuUtils
| | ... | WITH NAME | ${vm_name}
@@ -1542,6 +1554,10 @@
| | ... | skip_cnt=${skip} | cpu_cnt=${count} | smt_used=${True}
| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock1}
| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock2}
+| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock1}
+| | ... | jumbo_frames=${jumbo_frames}
+| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock2}
+| | ... | jumbo_frames=${jumbo_frames}
| | ${apply_patch}= | Set Variable If | "${perf_qemu_qsz}" == "256" | ${False}
| | ... | ${True}
| | Run Keyword Unless | ${qemu_built} | ${vm_name}.Build QEMU | ${dut_node}
@@ -1554,9 +1570,11 @@
| | ${vm}= | Run keyword | ${vm_name}.Qemu Start
| | Run keyword | ${vm_name}.Qemu Set Affinity | @{qemu_cpus}
| | Run keyword If | ${use_tuned_cfs} | ${vm_name}.Qemu Set Scheduler Policy
+| | ${max_pkt_len}= | Set Variable If | ${jumbo_frames} | 9000 | ${EMPTY}
| | Dpdk Testpmd Start | ${vm} | eal_coremask=0x1f | eal_mem_channels=4
| | ... | pmd_fwd_mode=io | pmd_disable_hw_vlan=${True}
| | ... | pmd_txd=${perf_qemu_qsz} | pmd_rxd=${perf_qemu_qsz}
+| | ... | pmd_max_pkt_len=${max_pkt_len}
| | Return From Keyword | ${vm}
| Configure guest VM with dpdk-testpmd-mac connected via vhost-user
@@ -1579,6 +1597,8 @@
| | ... | Type: integer
| | ... | - qemu_id - Qemu Id when starting more then one guest VM on DUT node.
| | ... | Type: integer
+| | ... | - jumbo_frames - Set True if jumbo frames are used in the test.
+| | ... | Type: bool
| | ...
| | ... | *Example:*
| | ...
@@ -1592,7 +1612,7 @@
| | ...
| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${vm_name}
| | ... | ${eth0_mac} | ${eth1_mac} | ${skip}=${6} | ${count}=${5}
-| | ... | ${qemu_id}=${1}
+| | ... | ${qemu_id}=${1} | ${jumbo_frames}=${False}
| | ...
| | Import Library | resources.libraries.python.QemuUtils | qemu_id=${qemu_id}
| | ... | WITH NAME | ${vm_name}
@@ -1607,6 +1627,10 @@
| | ... | skip_cnt=${skip_cnt} | cpu_cnt=${count} | smt_used=${False}
| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock1}
| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock2}
+| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock1}
+| | ... | jumbo_frames=${jumbo_frames}
+| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock2}
+| | ... | jumbo_frames=${jumbo_frames}
| | ${apply_patch}= | Set Variable If | "${perf_qemu_qsz}" == "256" | ${False}
| | ... | ${True}
| | Run Keyword Unless | ${qemu_built} | ${vm_name}.Build QEMU | ${dut_node}
@@ -1619,10 +1643,12 @@
| | ${vm}= | Run keyword | ${vm_name}.Qemu Start
| | Run keyword | ${vm_name}.Qemu Set Affinity | @{qemu_cpus}
| | Run keyword If | ${use_tuned_cfs} | ${vm_name}.Qemu Set Scheduler Policy
+| | ${max_pkt_len}= | Set Variable If | ${jumbo_frames} | 9000 | ${EMPTY}
| | Dpdk Testpmd Start | ${vm} | eal_coremask=0x1f
| | ... | eal_mem_channels=4 | pmd_fwd_mode=mac | pmd_eth_peer_0=0,${eth0_mac}
| | ... | pmd_eth_peer_1=1,${eth1_mac} | pmd_disable_hw_vlan=${True}
| | ... | pmd_txd=${perf_qemu_qsz} | pmd_rxd=${perf_qemu_qsz}
+| | ... | pmd_max_pkt_len=${max_pkt_len}
| | Return From Keyword | ${vm}
| Configure '${nr}' guest VMs with dpdk-testpmd-mac connected via vhost-user in 3-node circular topology
@@ -1638,10 +1664,12 @@
| | ... | - ${system_cpus} - Number of CPUs allocated for OS itself.
| | ... | - ${vpp_cpus} - Number of CPUs allocated for VPP.
| | ... | - ${vm_cpus} - Number of CPUs to be allocated per QEMU instance.
+| | ... | - ${jumbo_frames} - Jumbo frames are used (True) or are not used
+| | ... | (False) in the test.
| | ...
| | ... | *Example:*
| | ...
-| | ... | \| Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user \
+| | ... | \| Configure '2' guest VMs with dpdk-testpmd-mac connected via vhost-user\
| | ... | in 3-node circular topology \|
| | ...
| | :FOR | ${number} | IN RANGE | 1 | ${nr}+1
@@ -1654,6 +1682,7 @@
| | | ... | ${dut1-vhost-${number}-if1_mac}
| | | ... | ${dut1-vhost-${number}-if2_mac} | skip=${skip_cpus}
| | | ... | count=${vm_cpus} | qemu_id=${number}
+| | | ... | jumbo_frames=${jumbo_frames}
| | | Set To Dictionary | ${dut1_vm_refs} | DUT1_VM${number} | ${vm1}
| | | ${vm2}=
| | | ... | Configure guest VM with dpdk-testpmd-mac connected via vhost-user
@@ -1661,6 +1690,7 @@
| | | ... | ${dut2-vhost-${number}-if1_mac}
| | | ... | ${dut2-vhost-${number}-if2_mac} | skip=${skip_cpus}
| | | ... | count=${vm_cpus} | qemu_id=${number}
+| | | ... | jumbo_frames=${jumbo_frames}
| | | Set To Dictionary | ${dut2_vm_refs} | DUT2_VM${number} | ${vm2}
| | | Run Keyword Unless | ${qemu_built} | Set Suite Variable | ${qemu_built}
| | | ... | ${True}
@@ -1682,6 +1712,8 @@
| | ... | - eth1_mac - MAC address of second Vhost interface. Type: string
| | ... | - skip - number of cpus which will be skipped. Type: int
| | ... | - count - number of cpus which will be allocated for qemu. Type: int
+| | ... | - jumbo_frames - Set True if jumbo frames are used in the test.
+| | ... | Type: bool
| | ...
| | ... | *Example:*
| | ...
@@ -1691,6 +1723,7 @@
| | ...
| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${vm_name}
| | ... | ${eth0_mac} | ${eth1_mac} | ${skip}=${6} | ${count}=${5}
+| | ... | ${jumbo_frames}=${False}
| | ...
| | Import Library | resources.libraries.python.QemuUtils
| | ... | WITH NAME | ${vm_name}
@@ -1700,6 +1733,10 @@
| | ... | skip_cnt=${skip} | cpu_cnt=${count} | smt_used=${True}
| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock1}
| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock2}
+| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock1}
+| | ... | jumbo_frames=${jumbo_frames}
+| | Run keyword | ${vm_name}.Qemu Add Vhost User If | ${sock2}
+| | ... | jumbo_frames=${jumbo_frames}
| | ${apply_patch}= | Set Variable If | "${perf_qemu_qsz}" == "256" | ${False}
| | ... | ${True}
| | Run Keyword Unless | ${qemu_built} | ${vm_name}.Build QEMU | ${dut_node}
@@ -1712,10 +1749,12 @@
| | ${vm}= | Run keyword | ${vm_name}.Qemu Start
| | Run keyword | ${vm_name}.Qemu Set Affinity | @{qemu_cpus}
| | Run keyword If | ${use_tuned_cfs} | ${vm_name}.Qemu Set Scheduler Policy
+| | ${max_pkt_len}= | Set Variable If | ${jumbo_frames} | 9000 | ${EMPTY}
| | Dpdk Testpmd Start | ${vm} | eal_coremask=0x1f
| | ... | eal_mem_channels=4 | pmd_fwd_mode=mac | pmd_eth_peer_0=0,${eth0_mac}
| | ... | pmd_eth_peer_1=1,${eth1_mac} | pmd_disable_hw_vlan=${True}
| | ... | pmd_txd=${perf_qemu_qsz} | pmd_rxd=${perf_qemu_qsz}
+| | ... | pmd_max_pkt_len=${max_pkt_len}
| | Return From Keyword | ${vm}
| Configure guest VM with linux bridge connected via vhost-user
@@ -2103,29 +2142,29 @@
| | Set Interface State | ${dut2} | ${dut2_if1} | up
| | Set Interface State | ${dut2} | ${dut2_if2} | up
| | :FOR | ${number} | IN RANGE | 1 | ${nr}+1
-| | | ${sock1}= | Set Variable | memif-DUT1_VNF
-| | | ${sock2}= | Set Variable | memif-DUT1_VNF
-| | | ${prev_index}= | Evaluate | ${number}-1
-| | | Set up memif interfaces on DUT node | ${dut1}
-| | | ... | ${sock1} | ${sock2} | ${number} | dut1-memif-${number}-if1
-| | | ... | dut1-memif-${number}-if2
-| | | ${dut1_xconnect_if1}= | Set Variable If | ${number}==1 | ${dut1_if1}
-| | | ... | ${dut1-memif-${prev_index}-if2}
-| | | Configure L2XC | ${dut1} | ${dut1_xconnect_if1}
-| | | ... | ${dut1-memif-${number}-if1}
-| | | ${sock1}= | Set Variable | memif-DUT2_VNF
-| | | ${sock2}= | Set Variable | memif-DUT2_VNF
-| | | Set up memif interfaces on DUT node | ${dut2}
-| | | ... | ${sock1} | ${sock2} | ${number} | dut2-memif-${number}-if1
-| | | ... | dut2-memif-${number}-if2
-| | | ${dut2_xconnect_if1}= | Set Variable If | ${number}==1 | ${dut2_if1}
-| | | ... | ${dut2-memif-${prev_index}-if2}
-| | | Configure L2XC | ${dut2} | ${dut2_xconnect_if1}
-| | | ... | ${dut2-memif-${number}-if1}
-| | | Run Keyword If | ${number}==${nr} | Configure L2XC
-| | | ... | ${dut1} | ${dut1-memif-${number}-if2} | ${dut1_if2}
-| | | Run Keyword If | ${number}==${nr} | Configure L2XC
-| | | ... | ${dut2} | ${dut2-memif-${number}-if2} | ${dut2_if2}
+| | | ${sock1}= | Set Variable | memif-DUT1_VNF
+| | | ${sock2}= | Set Variable | memif-DUT1_VNF
+| | | ${prev_index}= | Evaluate | ${number}-1
+| | | Set up memif interfaces on DUT node | ${dut1}
+| | | ... | ${sock1} | ${sock2} | ${number} | dut1-memif-${number}-if1
+| | | ... | dut1-memif-${number}-if2
+| | | ${dut1_xconnect_if1}= | Set Variable If | ${number}==1 | ${dut1_if1}
+| | | ... | ${dut1-memif-${prev_index}-if2}
+| | | Configure L2XC | ${dut1} | ${dut1_xconnect_if1}
+| | | ... | ${dut1-memif-${number}-if1}
+| | | ${sock1}= | Set Variable | memif-DUT2_VNF
+| | | ${sock2}= | Set Variable | memif-DUT2_VNF
+| | | Set up memif interfaces on DUT node | ${dut2}
+| | | ... | ${sock1} | ${sock2} | ${number} | dut2-memif-${number}-if1
+| | | ... | dut2-memif-${number}-if2
+| | | ${dut2_xconnect_if1}= | Set Variable If | ${number}==1 | ${dut2_if1}
+| | | ... | ${dut2-memif-${prev_index}-if2}
+| | | Configure L2XC | ${dut2} | ${dut2_xconnect_if1}
+| | | ... | ${dut2-memif-${number}-if1}
+| | | Run Keyword If | ${number}==${nr} | Configure L2XC
+| | | ... | ${dut1} | ${dut1-memif-${number}-if2} | ${dut1_if2}
+| | | Run Keyword If | ${number}==${nr} | Configure L2XC
+| | | ... | ${dut2} | ${dut2-memif-${number}-if2} | ${dut2_if2}
| Initialize L2 Bridge Domain for '${nr}' memif pairs in 3-node circular topology
| | [Documentation]