diff options
-rw-r--r-- | docs/tag_documentation.rst | 4 | ||||
-rw-r--r-- | resources/libraries/python/QemuManager.py | 8 | ||||
-rw-r--r-- | resources/libraries/python/QemuUtils.py | 18 | ||||
-rw-r--r-- | resources/libraries/python/VhostUser.py | 74 | ||||
-rw-r--r-- | resources/libraries/robot/ip/ip4.robot | 9 | ||||
-rw-r--r-- | resources/libraries/robot/ip/ip6.robot | 5 | ||||
-rw-r--r-- | resources/libraries/robot/l2/l2_bridge_domain.robot | 29 | ||||
-rw-r--r-- | resources/libraries/robot/l2/l2_xconnect.robot | 22 | ||||
-rw-r--r-- | resources/libraries/robot/shared/default.robot | 1 | ||||
-rw-r--r-- | resources/libraries/robot/shared/interfaces.robot | 10 |
10 files changed, 155 insertions, 25 deletions
diff --git a/docs/tag_documentation.rst b/docs/tag_documentation.rst index 36550d4f5c..43ee5b17be 100644 --- a/docs/tag_documentation.rst +++ b/docs/tag_documentation.rst @@ -527,6 +527,10 @@ Interface Tags All test cases which use physical interface(s). +.. topic:: GSO + + All test cases which uses Generic Segmentation Offload. + .. topic:: VHOST All test cases which uses VHOST. diff --git a/resources/libraries/python/QemuManager.py b/resources/libraries/python/QemuManager.py index 547250e283..6436f69aec 100644 --- a/resources/libraries/python/QemuManager.py +++ b/resources/libraries/python/QemuManager.py @@ -144,6 +144,8 @@ class QemuManager: """ qemu_id = kwargs[u"qemu_id"] name = kwargs[u"name"] + virtio_feature_mask = kwargs[u"virtio_feature_mask"] \ + if u"virtio_feature_mask" in kwargs else None self.machines[name] = QemuUtils( node=self.nodes[kwargs[u"node"]], @@ -168,16 +170,14 @@ class QemuManager: jumbo_frames=kwargs[u"jumbo"], queues=kwargs[u"queues"], queue_size=kwargs[u"perf_qemu_qsz"], - csum=kwargs[u"enable_csum"], - gso=kwargs[u"enable_gso"] + virtio_feature_mask=virtio_feature_mask ) self.machines[name].add_vhost_user_if( f"/run/vpp/sock-{qemu_id}-2", jumbo_frames=kwargs[u"jumbo"], queues=kwargs[u"queues"], queue_size=kwargs[u"perf_qemu_qsz"], - csum=kwargs[u"enable_csum"], - gso=kwargs[u"enable_gso"] + virtio_feature_mask=virtio_feature_mask ) def _c_vpp_2vfpt_ip4base_plen24(self, **kwargs): diff --git a/resources/libraries/python/QemuUtils.py b/resources/libraries/python/QemuUtils.py index 7491c71021..c215dfd96f 100644 --- a/resources/libraries/python/QemuUtils.py +++ b/resources/libraries/python/QemuUtils.py @@ -27,6 +27,8 @@ from resources.libraries.python.DUTSetup import DUTSetup from resources.libraries.python.OptionString import OptionString from resources.libraries.python.ssh import exec_cmd, exec_cmd_no_error from resources.libraries.python.topology import NodeType, Topology +from resources.libraries.python.VhostUser import VirtioFeaturesFlags +from resources.libraries.python.VhostUser import VirtioFeatureMask from resources.libraries.python.VppConfigGenerator import VppConfigGenerator __all__ = [u"QemuUtils"] @@ -219,7 +221,7 @@ class QemuUtils: def add_vhost_user_if( self, socket, server=True, jumbo_frames=False, queue_size=None, - queues=1, csum=False, gso=False): + queues=1, virtio_feature_mask=None): """Add Vhost-user interface. :param socket: Path of the unix socket. @@ -227,15 +229,13 @@ class QemuUtils: :param jumbo_frames: Set True if jumbo frames are used in the test. :param queue_size: Vring queue size. :param queues: Number of queues. - :param csum: Checksum offloading. - :param gso: Generic segmentation offloading. + :param virtio_feature_mask: Mask of virtio features to be enabled. :type socket: str :type server: bool :type jumbo_frames: bool :type queue_size: int :type queues: int - :type csum: bool - :type gso: bool + :type virtio_feature_mask: int """ self._nic_id += 1 self._params.add_with_value( @@ -250,6 +250,14 @@ class QemuUtils: f"{self._nic_id:02x}" queue_size = f"rx_queue_size={queue_size},tx_queue_size={queue_size}" \ if queue_size else u"" + if virtio_feature_mask is None: + gso = False + csum = False + else: + gso = VirtioFeatureMask.is_feature_enabled( + virtio_feature_mask, VirtioFeaturesFlags.VIRTIO_NET_F_API_GSO) + csum = VirtioFeatureMask.is_feature_enabled( + virtio_feature_mask, VirtioFeaturesFlags.VIRTIO_NET_F_API_CSUM) self._params.add_with_value( u"device", f"virtio-net-pci,netdev=vhost{self._nic_id},mac={mac}," f"addr={self._nic_id+5}.0,mq=on,vectors={2 * queues + 2}," diff --git a/resources/libraries/python/VhostUser.py b/resources/libraries/python/VhostUser.py index cc9685d74d..22528b2b7f 100644 --- a/resources/libraries/python/VhostUser.py +++ b/resources/libraries/python/VhostUser.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019 Cisco and/or its affiliates. +# Copyright (c) 2020 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -13,6 +13,8 @@ """Vhost-user interfaces library.""" +from enum import IntEnum + from robot.api import logger from resources.libraries.python.PapiExecutor import PapiSocketExecutor @@ -20,28 +22,53 @@ from resources.libraries.python.topology import NodeType, Topology from resources.libraries.python.InterfaceUtil import InterfaceUtil +class VirtioFeaturesFlags(IntEnum): + """Virtio Features Flags.""" + VIRTIO_NET_F_API_CSUM = 0 + VIRTIO_NET_F_API_GUEST_CSUM = 1 + VIRTIO_NET_F_API_GSO = 6 + VIRTIO_NET_F_API_GUEST_TSO4 = 7 + VIRTIO_NET_F_API_GUEST_TSO6 = 8 + VIRTIO_NET_F_API_GUEST_UFO = 10 + VIRTIO_NET_F_API_HOST_TSO4 = 11 + VIRTIO_NET_F_API_HOST_TSO6 = 12 + VIRTIO_NET_F_API_HOST_UFO = 14 + VIRTIO_NET_F_API_MRG_RXBUF = 15 + VIRTIO_NET_F_API_CTRL_VQ = 17 + VIRTIO_NET_F_API_GUEST_ANNOUNCE = 21 + VIRTIO_NET_F_API_MQ = 22 + VIRTIO_F_API_ANY_LAYOUT = 27 + VIRTIO_F_API_INDIRECT_DESC = 28 + + class VhostUser: """Vhost-user interfaces L1 library.""" @staticmethod def vpp_create_vhost_user_interface( - node, socket, is_server=False, enable_gso=False): + node, socket, is_server=False, virtio_feature_mask=None): """Create Vhost-user interface on VPP node. :param node: Node to create Vhost-user interface on. :param socket: Vhost-user interface socket path. :param is_server: Server side of connection. Default: False - :param enable_gso: Generic segmentation offloading. Default: False + :param virtio_feature_mask: Mask of virtio features to be enabled. :type node: dict :type socket: str :type is_server: bool - :type enable_gso: bool + :type virtio_feature_mask: int :returns: SW interface index. :rtype: int """ cmd = u"create_vhost_user_if" err_msg = f"Failed to create Vhost-user interface " \ f"on host {node[u'host']}" + if virtio_feature_mask is None: + enable_gso = False + else: + enable_gso = VirtioFeatureMask.is_feature_enabled( + virtio_feature_mask, VirtioFeaturesFlags.VIRTIO_NET_F_API_GSO + ) args = dict( is_server=bool(is_server), sock_filename=str(socket), @@ -123,3 +150,42 @@ class VhostUser: logger.debug(f"Vhost-user details:\n{details}") return details + + +class VirtioFeatureMask: + """Virtio features utilities""" + + @staticmethod + def create_virtio_feature_mask(**kwargs): + """Create virtio feature mask with feature bits set according to kwargs. + :param kwargs: Key-value pairs of feature names and it's state + :type kwargs: dict + """ + virtio_feature_mask = 0 + + if u"all" in kwargs and kwargs[u"all"] is True: + for virtio_feature_flag in VirtioFeaturesFlags: + virtio_feature_mask |= 1 << virtio_feature_flag.value + else: + for feature_name, enabled in kwargs.items(): + virtio_feature_name = \ + u"VIRTIO_NET_F_API_" + feature_name.upper() + if virtio_feature_name not in VirtioFeaturesFlags.__members__: + raise ValueError(u"Unsupported virtio feature flag name") + if enabled: + virtio_feature_mask |= \ + 1 << VirtioFeaturesFlags[virtio_feature_name].value + + return virtio_feature_mask + + @staticmethod + def is_feature_enabled(virtio_feature_mask, virtio_feature_flag): + """Checks if concrete virtio feature is enabled within + virtio_feature_mask + :param virtio_feature_mask: Mask of enabled virtio features + :param virtio_feature_flag: Checked virtio feature + :type virtio_feature_mask: int + :type virtio_feature_flag: VirtioFeaturesFlags + """ + feature_flag_bit = 1 << virtio_feature_flag.value + return (virtio_feature_mask & feature_flag_bit) > 0 diff --git a/resources/libraries/robot/ip/ip4.robot b/resources/libraries/robot/ip/ip4.robot index f61466bf4e..0220fe29f6 100644 --- a/resources/libraries/robot/ip/ip4.robot +++ b/resources/libraries/robot/ip/ip4.robot @@ -319,6 +319,8 @@ | | ... | - nf_nodes - Number of guest VMs. Type: integer | | ... | - testpmd_mac - Switch for testpmd_mac test configuration. | | ... | Type: boolean +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Note:* | | ... | Socket paths for VM are defined in following format: @@ -331,6 +333,7 @@ | | ... | topology \| 1 \| | | | | [Arguments] | ${nf_nodes}=${1} | ${testpmd_mac}=${FALSE} +| | ... | ${virtio_feature_mask}=${None} | | | | Set interfaces in path up | | ${fib_table_1}= | Set Variable | ${101} @@ -359,6 +362,7 @@ | | | Configure vhost interfaces | ${dut1} | | | ... | /var/run/vpp/sock-${number}-1 | /var/run/vpp/sock-${number}-2 | | | ... | dut1-vhost-${number}-if1 | dut1-vhost-${number}-if2 +| | | ... | virtio_feature_mask=${virtio_feature_mask} | | | Set Interface State | ${dut1} | ${dut1-vhost-${number}-if1} | up | | | Set Interface State | ${dut1} | ${dut1-vhost-${number}-if2} | up | | | Add Fib Table | ${dut1} | ${fib_table_1} @@ -404,6 +408,8 @@ | | | | ... | *Arguments:* | | ... | - nf_nodes - Number of guest VMs. Type: integer +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Note:* | | ... | Socket paths for VM are defined in following format: @@ -416,6 +422,7 @@ | | ... | topology \| 1 \| | | | | [Arguments] | ${nf_nodes}=${1} | ${testpmd_mac}=${FALSE} +| | ... | ${virtio_feature_mask}=${None} | | | | Set interfaces in path up | | ${fib_table_1}= | Set Variable | ${101} @@ -458,11 +465,13 @@ | | | Configure vhost interfaces | ${dut1} | | | ... | /var/run/vpp/sock-${number}-1 | /var/run/vpp/sock-${number}-2 | | | ... | dut1-vhost-${number}-if1 | dut1-vhost-${number}-if2 +| | | ... | virtio_feature_mask=${virtio_feature_mask} | | | Set Interface State | ${dut1} | ${dut1-vhost-${number}-if1} | up | | | Set Interface State | ${dut1} | ${dut1-vhost-${number}-if2} | up | | | Configure vhost interfaces | ${dut2} | | | ... | /var/run/vpp/sock-${number}-1 | /var/run/vpp/sock-${number}-2 | | | ... | dut2-vhost-${number}-if1 | dut2-vhost-${number}-if2 +| | | ... | virtio_feature_mask=${virtio_feature_mask} | | | Set Interface State | ${dut2} | ${dut2-vhost-${number}-if1} | up | | | Set Interface State | ${dut2} | ${dut2-vhost-${number}-if2} | up | | | Add Fib Table | ${dut1} | ${fib_table_1} diff --git a/resources/libraries/robot/ip/ip6.robot b/resources/libraries/robot/ip/ip6.robot index 8ba0689dc9..ec22c5511b 100644 --- a/resources/libraries/robot/ip/ip6.robot +++ b/resources/libraries/robot/ip/ip6.robot @@ -175,6 +175,8 @@ | | | | ... | *Arguments:* | | ... | - nf_nodes - Number of guest VMs. Type: integer +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Note:* | | ... | Socket paths for VM are defined in following format: @@ -186,7 +188,7 @@ | | ... | \| IPv6 forwarding with Vhost-User initialized in a 2-node circular\ | | ... | topology \| 1 \| | | -| | [Arguments] | ${nf_nodes}=${1} +| | [Arguments] | ${nf_nodes}=${1} | ${virtio_feature_mask}=${None} | | | | Vpp Interfaces RA Suppress On All Nodes | ${nodes} | | Set interfaces in path up @@ -221,6 +223,7 @@ | | | Configure vhost interfaces | ${dut1} | | | ... | /var/run/vpp/sock-${number}-1 | /var/run/vpp/sock-${number}-2 | | | ... | dut1-vhost-${number}-if1 | dut1-vhost-${number}-if2 +| | | ... | virtio_feature_mask=${virtio_feature_mask} | | | Set Interface State | ${dut1} | ${dut1-vhost-${number}-if1} | up | | | Set Interface State | ${dut1} | ${dut1-vhost-${number}-if2} | up | | | Add Fib Table | ${dut1} | ${fib_table_1} | ipv6=${True} diff --git a/resources/libraries/robot/l2/l2_bridge_domain.robot b/resources/libraries/robot/l2/l2_bridge_domain.robot index bb533e3e05..543c01c3ba 100644 --- a/resources/libraries/robot/l2/l2_bridge_domain.robot +++ b/resources/libraries/robot/l2/l2_bridge_domain.robot @@ -100,6 +100,8 @@ | | ... | - dut - DUT node. Type: string | | ... | - nf_chain - NF chain. Type: integer | | ... | - nf_nodes - Number of NFs nodes per chain. Type: integer +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Note:* | | ... | Socket paths for VM are defined in following format: @@ -112,6 +114,7 @@ | | ... | \| 1 \| 1 \| | | | | [Arguments] | ${dut} | ${nf_chain}=${1} | ${nf_nodes}=${1} +| | ... | ${virtio_feature_mask}=${None} | | | | ${bd_id1}= | Evaluate | ${nf_nodes} * (${nf_chain} - 1) + ${nf_chain} | | ${bd_id2}= | Evaluate | ${nf_nodes} * ${nf_chain} + ${nf_chain} @@ -127,6 +130,7 @@ | | | ... | ${nodes['${dut}']} | | | ... | /var/run/vpp/sock-${qemu_id}-1 | /var/run/vpp/sock-${qemu_id}-2 | | | ... | ${dut}-vhost-${qemu_id}-if1 | ${dut}-vhost-${qemu_id}-if2 +| | | ... | virtio_feature_mask=${virtio_feature_mask} | | | ${bd_id1}= | Evaluate | ${qemu_id} + (${nf_chain} - 1) | | | ${bd_id2}= | Evaluate | ${bd_id1} + 1 | | | Add interface to bridge domain @@ -145,16 +149,20 @@ | | ... | *Arguments:* | | ... | - nf_chain - NF chain. Type: integer | | ... | - nf_nodes - Number of NFs nodes per chain. Type: integer +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Example:* | | | | ... | \| Initialize L2 bridge domains with Vhost-User \| 1 \| 1 \| | | | | [Arguments] | ${nf_chain}=${1} | ${nf_nodes}=${1} +| | ... | ${virtio_feature_mask}=${None} | | | | FOR | ${dut} | IN | @{duts} | | | Initialize L2 bridge domains with Vhost-User on node | | | ... | ${dut} | nf_chain=${nf_chain} | nf_nodes=${nf_nodes} +| | | ... | virtio_feature_mask=${virtio_feature_mask} | | END | Initialize L2 bridge domains for multiple chains with Vhost-User @@ -170,6 +178,8 @@ | | ... | - nf_nodes - Number of NFs nodes per chain. Type: integer | | ... | - start - Id of first chain, allows to add chains during test. | | ... | Type: integer +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Example:* | | @@ -177,11 +187,13 @@ | | ... | \| 3 \| 1 \| 2 \| | | | | [Arguments] | ${nf_chains}=${1} | ${nf_nodes}=${1} | ${start}=${1} +| | ... | ${virtio_feature_mask}=${None} | | | | Set interfaces in path up | | FOR | ${nf_chain} | IN RANGE | ${start} | ${nf_chains} + 1 | | | Initialize L2 bridge domains with Vhost-User | | | ... | nf_chain=${nf_chain} | nf_nodes=${nf_nodes} +| | | ... | virtio_feature_mask=${virtio_feature_mask} | | END | Initialize L2 bridge domain with VXLANoIPv4 in 3-node circular topology @@ -281,13 +293,15 @@ | | ... | *Arguments:* | | ... | - bd_id1 - Bridge domain ID. Type: integer | | ... | - bd_id2 - Bridge domain ID. Type: integer +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Example:* | | | | ... | \| L2 bridge domains with Vhost-User and VXLANoIPv4 initialized in a\ | | ... | 3-node circular topology \| 1 \| 2 \| | | -| | [Arguments] | ${bd_id1} | ${bd_id2} +| | [Arguments] | ${bd_id1} | ${bd_id2} | ${virtio_feature_mask}=${None} | | | | VPP Interface Set IP Address | | ... | ${dut1} | ${DUT1_${int}2}[0] | 172.16.0.1 | 24 @@ -300,6 +314,7 @@ | | ... | ${dut2} | 24 | 172.16.0.2 | 172.16.0.1 | | Configure vhost interfaces | ${dut1} | | ... | /var/run/vpp/sock-1-${bd_id1} | /var/run/vpp/sock-1-${bd_id2} +| | ... | virtio_feature_mask=${virtio_feature_mask} | | Add interface to bridge domain | | ... | ${dut1} | ${DUT1_${int}1}[0] | ${bd_id1} | | Add interface to bridge domain @@ -310,6 +325,7 @@ | | ... | ${dut1} | ${dut1s_vxlan} | ${bd_id2} | | Configure vhost interfaces | ${dut2} | | ... | /var/run/vpp/sock-1-${bd_id1} | /var/run/vpp/sock-1-${bd_id2} +| | ... | virtio_feature_mask=${virtio_feature_mask} | | Add interface to bridge domain | | ... | ${dut2} | ${dut2s_vxlan} | ${bd_id1} | | Add interface to bridge domain @@ -387,6 +403,8 @@ | | ... | - bd_id2 - Bridge domain ID. Type: integer | | ... | - subid - ID of the sub-interface to be created. Type: string | | ... | - tag_rewrite - Method of tag rewrite. Type: string +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Example:* | | @@ -394,6 +412,7 @@ | | ... | topology \| 1 \| 2 \| 10 \| pop-1 \| | | | | [Arguments] | ${bd_id1} | ${bd_id2} | ${subid} | ${tag_rewrite} +| | ... | ${virtio_feature_mask}=${None} | | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} @@ -414,6 +433,7 @@ | | ... | ${dut1} | ${subif_index_1} | TAG_REWRITE_METHOD=${tag_rewrite} | | Configure vhost interfaces | ${dut1} | | ... | /var/run/vpp/sock-1-${bd_id1} | /var/run/vpp/sock-1-${bd_id2} +| | ... | virtio_feature_mask=${virtio_feature_mask} | | Add interface to bridge domain | | ... | ${dut1} | ${DUT1_${int}1}[0] | ${bd_id1} | | Add interface to bridge domain @@ -425,6 +445,7 @@ | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Configure vhost interfaces | ${dut2} | | ... | /var/run/vpp/sock-1-${bd_id1} | /var/run/vpp/sock-1-${bd_id2} +| | ... | virtio_feature_mask=${virtio_feature_mask} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Add interface to bridge domain | ${dut2} | ${subif_index_2} | | ... | ${bd_id1} @@ -454,6 +475,8 @@ | | ... | - tag_rewrite - Method of tag rewrite. Type: string | | ... | - bond_mode - Link bonding mode. Type: string | | ... | - lb_mode - Load balance mode. Type: string +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Example:* | | @@ -462,7 +485,7 @@ | | ... | \| 10 \| pop-1 \| xor \| l34 \| | | | | [Arguments] | ${bd_id1} | ${bd_id2} | ${subid} | ${tag_rewrite} -| | ... | ${bond_mode} | ${lb_mode} +| | ... | ${bond_mode} | ${lb_mode} | ${virtio_feature_mask}=${None} | | | | Set interfaces in path up | | ${dut1_eth_bond_if1}= | VPP Create Bond Interface @@ -494,6 +517,7 @@ | | ... | ${dut2} | ${subif_index_2} | ${tag_rewrite} | | Configure vhost interfaces | ${dut1} | | ... | /var/run/vpp/sock-1-${bd_id1} | /var/run/vpp/sock-1-${bd_id2} +| | ... | virtio_feature_mask=${virtio_feature_mask} | | Add interface to bridge domain | | ... | ${dut1} | ${DUT1_${int}1}[0] | ${bd_id1} | | Add interface to bridge domain @@ -504,6 +528,7 @@ | | ... | ${dut1} | ${subif_index_1} | ${bd_id2} | | Configure vhost interfaces | ${dut2} | | ... | /var/run/vpp/sock-1-${bd_id1} | /var/run/vpp/sock-1-${bd_id2} +| | ... | virtio_feature_mask=${virtio_feature_mask} | | Add interface to bridge domain | | ... | ${dut2} | ${subif_index_2} | ${bd_id1} | | Add interface to bridge domain diff --git a/resources/libraries/robot/l2/l2_xconnect.robot b/resources/libraries/robot/l2/l2_xconnect.robot index ea4d6afcef..fdbd1dca61 100644 --- a/resources/libraries/robot/l2/l2_xconnect.robot +++ b/resources/libraries/robot/l2/l2_xconnect.robot @@ -108,6 +108,8 @@ | | ... | *Arguments:* | | ... | - dut - DUT node. Type: string | | ... | - nf_nodes - VM count. Type: integer +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Note:* | | ... | Socket paths for VM are defined in following format: @@ -118,7 +120,7 @@ | | | | ... | \| Initialize L2 xconnect with Vhost-User on node \| DUT1 \| 1 \| | | -| | [Arguments] | ${dut} | ${nf_nodes}=${1} +| | [Arguments] | ${dut} | ${nf_nodes}=${1} | ${virtio_feature_mask}=${None} | | | | FOR | ${number} | IN RANGE | 1 | ${nf_nodes}+1 | | | ${sock1}= | Set Variable | /run/vpp/sock-${number}-1 @@ -127,6 +129,7 @@ | | | Configure vhost interfaces | ${nodes['${dut}']} | | | ... | ${sock1} | ${sock2} | ${dut}-vhost-${number}-if1 | | | ... | ${dut}-vhost-${number}-if2 +| | | ... | virtio_feature_mask=${virtio_feature_mask} | | | ${dut_xconnect_if1}= | Set Variable If | ${number}==1 | | | ... | ${${dut}_${int}1}[0] | | | ... | ${${dut}-vhost-${prev_index}-if2} @@ -145,16 +148,18 @@ | | | | ... | *Arguments:* | | ... | - nf_nodes - VM count. Type: integer +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Example:* | | | | ... | \| Initialize L2 xconnect with Vhost-User \| 1 \| | | -| | [Arguments] | ${nf_nodes}=${1} +| | [Arguments] | ${nf_nodes}=${1} | ${virtio_feature_mask}=${None} | | | | FOR | ${dut} | IN | @{duts} | | | Initialize L2 xconnect with Vhost-User on node | ${dut} -| | | ... | nf_nodes=${nf_nodes} +| | | ... | nf_nodes=${nf_nodes} | virtio_feature_mask=${virtio_feature_mask} | | END | Initialize L2 xconnect with Vhost-User and VLAN in circular topology @@ -166,13 +171,15 @@ | | ... | *Arguments:* | | ... | - subid - ID of the sub-interface to be created. Type: string | | ... | - tag_rewrite - Method of tag rewrite. Type: string +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Example:* | | | | ... | \| L2 xconnect with Vhost-User and VLAN initialized in a 3-node\ | | ... | circular topology \| 10 \| pop-1 \| | | -| | [Arguments] | ${subid} | ${tag_rewrite} +| | [Arguments] | ${subid} | ${tag_rewrite} | ${virtio_feature_mask}=${None} | | | | ${dut2_status} | ${value}= | Run Keyword And Ignore Error | | ... | Variable Should Exist | ${dut2} @@ -193,6 +200,7 @@ | | ... | ${dut1} | ${subif_index_1} | TAG_REWRITE_METHOD=${tag_rewrite} | | Configure vhost interfaces | | ... | ${dut1} | /run/vpp/sock-1-1 | /run/vpp/sock-1-2 +| | ... | virtio_feature_mask=${virtio_feature_mask} | | Configure L2XC | | ... | ${dut1} | ${DUT1_${int}1}[0] | ${vhost_if1} | | Configure L2XC @@ -200,6 +208,7 @@ | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Configure vhost interfaces | | ... | ${dut2} | /run/vpp/sock-1-1 | /run/vpp/sock-1-2 +| | ... | virtio_feature_mask=${virtio_feature_mask} | | Run Keyword If | '${dut2_status}' == 'PASS' | | ... | Configure L2XC | ${dut2} | ${subif_index_2} | ${vhost_if1} | | Run Keyword If | '${dut2_status}' == 'PASS' @@ -219,6 +228,8 @@ | | ... | - tag_rewrite - Method of tag rewrite. Type: string | | ... | - bond_mode - Link bonding mode. Type: string | | ... | - lb_mode - Load balance mode. Type: string +| | ... | - virtio_feature_mask - Enabled Virtio features (Optional). +| | ... | Type: integer | | | | ... | *Example:* | | @@ -226,6 +237,7 @@ | | ... | bonding in 3-node circular topology \| 10 \| pop-1 \| xor \| l34 \| | | | | [Arguments] | ${subid} | ${tag_rewrite} | ${bond_mode} | ${lb_mode} +| | ... | ${virtio_feature_mask}=${None} | | | | Set interfaces in path up | | ${dut1_eth_bond_if1}= | VPP Create Bond Interface @@ -257,12 +269,14 @@ | | ... | ${dut2} | ${subif_index_2} | ${tag_rewrite} | | Configure vhost interfaces | | ... | ${dut1} | /run/vpp/sock-1-1 | /run/vpp/sock-1-2 +| | ... | virtio_feature_mask=${virtio_feature_mask} | | Configure L2XC | | ... | ${dut1} | ${DUT1_${int}1}[0] | ${vhost_if1} | | Configure L2XC | | ... | ${dut1} | ${subif_index_1} | ${vhost_if2} | | Configure vhost interfaces | | ... | ${dut2} | /run/vpp/sock-1-1 | /run/vpp/sock-1-2 +| | ... | virtio_feature_mask=${virtio_feature_mask} | | Configure L2XC | | ... | ${dut2} | ${subif_index_2} | ${vhost_if1} | | Configure L2XC diff --git a/resources/libraries/robot/shared/default.robot b/resources/libraries/robot/shared/default.robot index 641cfa5cb1..f060032b0c 100644 --- a/resources/libraries/robot/shared/default.robot +++ b/resources/libraries/robot/shared/default.robot @@ -38,6 +38,7 @@ | Library | resources.libraries.python.TGSetup | Library | resources.libraries.python.topology.Topology | Library | resources.libraries.python.Trace +| Library | resources.libraries.python.VhostUser.VirtioFeatureMask | Library | resources.libraries.python.VppCounters | Library | resources.libraries.python.VPPUtil | diff --git a/resources/libraries/robot/shared/interfaces.robot b/resources/libraries/robot/shared/interfaces.robot index 4fdc1ee0a6..b842f276ef 100644 --- a/resources/libraries/robot/shared/interfaces.robot +++ b/resources/libraries/robot/shared/interfaces.robot @@ -661,8 +661,8 @@ | | ... | Type: string | | ... | - ${is_server} - Server side of connection (Optional). | | ... | Type: boolean -| | ... | - ${enable_gso} - Generic segmentation offloading (Optional). -| | ... | Type: boolean +| | ... | - ${virtio_feature_mask} - Enabled Virtio feature flags (Optional). +| | ... | Type: integer | | | | ... | _NOTE:_ This KW sets following test case variable: | | ... | - ${${vhost_if1}} - First Vhost-User interface. @@ -675,14 +675,14 @@ | | | | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${vhost_if1}=vhost_if1 | | ... | ${vhost_if2}=vhost_if2 | ${is_server}=${False} -| | ... | ${enable_gso}=${False} +| | ... | ${virtio_feature_mask}=${None} | | | | ${vhost_1}= | Vpp Create Vhost User Interface | | ... | ${dut_node} | ${sock1} | is_server=${is_server} -| | ... | enable_gso=${enable_gso} +| | ... | virtio_feature_mask=${virtio_feature_mask} | | ${vhost_2}= | Vpp Create Vhost User Interface | | ... | ${dut_node} | ${sock2} | is_server=${is_server} -| | ... | enable_gso=${enable_gso} +| | ... | virtio_feature_mask=${virtio_feature_mask} | | ${vhost_1_key}= | Get Interface By SW Index | ${dut_node} | ${vhost_1} | | ${vhost_2_key}= | Get Interface By SW Index | ${dut_node} | ${vhost_2} | | ${vhost_1_mac}= | Get Interface MAC | ${dut_node} | ${vhost_1_key} |