Beispiel #1
0
    def vpp_create_vhost_user_interface(node, socket):
        """Create Vhost-user interface on VPP node.

        :param node: Node to create Vhost-user interface on.
        :param socket: Vhost-user interface socket path.
        :type node: dict
        :type socket: str
        :returns: SW interface index.
        :rtype: int
        """
        cmd = 'create_vhost_user_if'
        err_msg = 'Failed to create Vhost-user interface on host {host}'.format(
            host=node['host'])
        args = dict(sock_filename=str(socket))
        with PapiExecutor(node) as papi_exec:
            sw_if_index = papi_exec.add(cmd, **args).get_sw_if_index(err_msg)

        # Update the Topology:
        if_key = Topology.add_new_port(node, 'vhost')
        Topology.update_interface_sw_if_index(node, if_key, sw_if_index)

        ifc_name = InterfaceUtil.vpp_get_interface_name(node, sw_if_index)
        Topology.update_interface_name(node, if_key, ifc_name)

        ifc_mac = InterfaceUtil.vpp_get_interface_mac(node, sw_if_index)
        Topology.update_interface_mac_address(node, if_key, ifc_mac)

        Topology.update_interface_vhost_socket(node, if_key, socket)

        return sw_if_index
Beispiel #2
0
    def vpp_create_vhost_user_interface(node, socket):
        """Create Vhost-user interface on VPP node.

        :param node: Node to create Vhost-user interface on.
        :param socket: Vhost-user interface socket path.
        :type node: dict
        :type socket: str
        :returns: SW interface index.
        :rtype: int
        :raises RuntimeError: If Vhost-user interface creation failed.
        """
        out = VatExecutor.cmd_from_template(node,
                                            'create_vhost_user_if.vat',
                                            sock=socket)
        if out[0].get('retval') == 0:
            sw_if_idx = int(out[0].get('sw_if_index'))
            if_key = Topology.add_new_port(node, 'vhost')
            Topology.update_interface_sw_if_index(node, if_key, sw_if_idx)
            ifc_name = InterfaceUtil.vpp_get_interface_name(node, sw_if_idx)
            Topology.update_interface_name(node, if_key, ifc_name)
            ifc_mac = InterfaceUtil.vpp_get_interface_mac(node, sw_if_idx)
            Topology.update_interface_mac_address(node, if_key, ifc_mac)
            Topology.update_interface_vhost_socket(node, if_key, socket)
            return sw_if_idx
        else:
            raise RuntimeError('Create Vhost-user interface failed on node '
                               '"{}"'.format(node['host']))
Beispiel #3
0
    def add_geneve_tunnel(node,
                          local_address,
                          remote_address,
                          vni,
                          multicast_if=None,
                          encap_vrf=0,
                          l3_mode=False,
                          next_index=None):
        """Add GENEVE tunnel on the specified VPP node.

        :param node: Topology node.
        :param local_address: Local IP address.
        :param remote_address: Remote IP address.
        :param vni: Virtual network ID.
        :param multicast_if: Interface key of multicast interface; used only if
            remote is multicast. (Default value = None)
        :param encap_vrf: The FIB ID for sending unicast GENEVE encap packets or
            receiving multicast packets. (Default value = 0)
        :param l3_mode: Use geneve tunnel in L3 mode (ip routing) if Tue else in
            L2 mode (L2 switching). (Default value = False)
        :param next_index: The index of the next node.
        :type node: dict
        :type local_address: str
        :type remote_address: str
        :type vni: int
        :type multicast_if: str
        :type encap_vrf: int
        :type l3_mode: bool
        :type next_index: int
        :returns: SW interface index of created geneve tunnel.
        :rtype: int
        """
        cmd = u"geneve_add_del_tunnel2"
        args = dict(is_add=True,
                    local_address=IPAddress.create_ip_address_object(
                        ip_address(local_address)),
                    remote_address=IPAddress.create_ip_address_object(
                        ip_address(remote_address)),
                    mcast_sw_if_index=Topology.get_interface_sw_index(
                        node, multicast_if)
                    if multicast_if else Constants.BITWISE_NON_ZERO,
                    encap_vrf_id=int(encap_vrf),
                    decap_next_index=next_index
                    if l3_mode else Constants.BITWISE_NON_ZERO,
                    vni=int(vni),
                    l3_mode=l3_mode)
        err_msg = f"Failed to configure GENEVE tunnel on host {node[u'host']}!"
        with PapiSocketExecutor(node) as papi_exec:
            sw_if_index = papi_exec.add(cmd, **args).get_sw_if_index(err_msg)

        if_key = Topology.add_new_port(node, u"geneve_tunnel")
        Topology.update_interface_sw_if_index(node, if_key, sw_if_index)

        ifc_name = InterfaceUtil.vpp_get_interface_name(node, sw_if_index)
        Topology.update_interface_name(node, if_key, ifc_name)

        ifc_mac = InterfaceUtil.vpp_get_interface_mac(node, sw_if_index)
        Topology.update_interface_mac_address(node, if_key, ifc_mac)

        return sw_if_index
Beispiel #4
0
    def vpp_get_tap_interface_mac(node, interface_name):
        """Get tap interface MAC address from interfaces dump.

        :param node: DUT node.
        :param interface_name: Tap interface name.
        :type node: dict
        :type interface_name: str
        :returns: Tap interface MAC address.
        :rtype: str
        """
        return InterfaceUtil.vpp_get_interface_mac(node, interface_name)
Beispiel #5
0
    def get_vhost_user_mac_by_sw_index(node, sw_if_index):
        """Get Vhost-user l2_address for the given interface from actual
        interface dump.

        :param node: VPP node to get interface data from.
        :param sw_if_index: SW index of the specific interface.
        :type node: dict
        :type sw_if_index: str
        :returns: l2_address of the given interface.
        :rtype: str
        """
        return InterfaceUtil.vpp_get_interface_mac(node, sw_if_index)
Beispiel #6
0
    def vpp_create_vhost_user_interface(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 virtio_feature_mask: Mask of virtio features to be enabled.
        :type node: dict
        :type socket: str
        :type is_server: 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),
                    enable_gso=bool(enable_gso))

        with PapiSocketExecutor(node) as papi_exec:
            sw_if_index = papi_exec.add(cmd, **args).get_sw_if_index(err_msg)

        # Update the Topology:
        if_key = Topology.add_new_port(node, u"vhost")
        Topology.update_interface_sw_if_index(node, if_key, sw_if_index)

        ifc_name = InterfaceUtil.vpp_get_interface_name(node, sw_if_index)
        Topology.update_interface_name(node, if_key, ifc_name)

        ifc_mac = InterfaceUtil.vpp_get_interface_mac(node, sw_if_index)
        Topology.update_interface_mac_address(node, if_key, ifc_mac)

        Topology.update_interface_vhost_socket(node, if_key, socket)

        return sw_if_index
Beispiel #7
0
    def vpp_create_vhost_user_interface(
            node, socket, is_server=False, enable_gso=False):
        """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
        :type node: dict
        :type socket: str
        :type is_server: bool
        :type enable_gso: bool
        :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']}"
        args = dict(
            is_server=bool(is_server),
            sock_filename=str(socket),
            enable_gso=bool(enable_gso)
        )

        with PapiSocketExecutor(node) as papi_exec:
            sw_if_index = papi_exec.add(cmd, **args).get_sw_if_index(err_msg)

        # Update the Topology:
        if_key = Topology.add_new_port(node, u"vhost")
        Topology.update_interface_sw_if_index(node, if_key, sw_if_index)

        ifc_name = InterfaceUtil.vpp_get_interface_name(node, sw_if_index)
        Topology.update_interface_name(node, if_key, ifc_name)

        ifc_mac = InterfaceUtil.vpp_get_interface_mac(node, sw_if_index)
        Topology.update_interface_mac_address(node, if_key, ifc_mac)

        Topology.update_interface_vhost_socket(node, if_key, socket)

        return sw_if_index