Revert "fix(jobspec): Delete ipsec nfv density tests"
[csit.git] / resources / libraries / python / Memif.py
index 24fda52..32096d0 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2019 Cisco and/or its affiliates.
+# Copyright (c) 2023 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:
@@ -15,6 +15,7 @@
 
 
 from enum import IntEnum
+
 from robot.api import logger
 
 from resources.libraries.python.topology import NodeType, Topology
@@ -27,7 +28,7 @@ class MemifRole(IntEnum):
     SLAVE = 1
 
 
-class Memif(object):
+class Memif:
     """Memif interface class"""
 
     def __init__(self):
@@ -42,18 +43,18 @@ class Memif(object):
         :returns: List of memif interfaces extracted from Papi response.
         :rtype: list
         """
-        cmd = "memif_dump"
+        cmd = u"memif_dump"
         with PapiSocketExecutor(node) as papi_exec:
             details = papi_exec.add(cmd).get_details()
 
         for memif in details:
-            memif["hw_addr"] = str(memif["hw_addr"])
-            memif["role"] = memif["role"].value
-            memif["mode"] = memif["mode"].value
-            memif["flags"] = memif["flags"].value \
-                if hasattr(memif["flags"], 'value') else int(memif["flags"])
+            memif[u"hw_addr"] = str(memif[u"hw_addr"])
+            memif[u"role"] = memif[u"role"].value
+            memif[u"mode"] = memif[u"mode"].value
+            memif[u"flags"] = memif[u"flags"].value \
+                if hasattr(memif[u"flags"], u"value") else int(memif[u"flags"])
 
-        logger.debug("MEMIF details:\n{details}".format(details=details))
+        logger.debug(f"MEMIF details:\n{details}")
 
         return details
 
@@ -73,19 +74,18 @@ class Memif(object):
             includes only retval.
         :rtype: dict
         """
-        cmd = 'memif_socket_filename_add_del'
-        err_msg = 'Failed to create memif socket on host {host}'.format(
-            host=node['host'])
+        cmd = u"memif_socket_filename_add_del_v2"
+        err_msg = f"Failed to create memif socket on host {node[u'host']}"
         args = dict(
             is_add=is_add,
             socket_id=int(sid),
-            socket_filename=str('/tmp/' + filename)
+            socket_filename=str(u"/tmp/" + filename)
         )
         with PapiSocketExecutor(node) as papi_exec:
             return papi_exec.add(cmd, **args).get_reply(err_msg)
 
     @staticmethod
-    def _memif_create(node, mid, sid, rxq=1, txq=1, role=1):
+    def _memif_create(node, mid, sid, rxq=1, txq=1, role=1, use_dma=False):
         """Create Memif interface on the given node, return its sw_if_index.
 
         :param node: Given node to create Memif interface on.
@@ -94,32 +94,36 @@ class Memif(object):
         :param rxq: Number of RX queues; 0 means do not set.
         :param txq: Number of TX queues; 0 means do not set.
         :param role: Memif interface role [master=0|slave=1]. Default is slave.
+        :param use_dma: Use DMA acceleration. Requires hardware support.
         :type node: dict
         :type mid: str
         :type sid: str
         :type rxq: int
         :type txq: int
         :type role: int
+        :type use_dma: bool
         :returns: sw_if_index
         :rtype: int
         """
-        cmd = 'memif_create'
-        err_msg = 'Failed to create memif interface on host {host}'.format(
-            host=node['host'])
+        cmd = u"memif_create_v2"
+        err_msg = f"Failed to create memif interface on host {node[u'host']}"
         args = dict(
             role=role,
             rx_queues=int(rxq),
             tx_queues=int(txq),
             socket_id=int(sid),
             id=int(mid),
-            secret=""
+            secret=u"",
+            use_dma=use_dma,
         )
+
         with PapiSocketExecutor(node) as papi_exec:
             return papi_exec.add(cmd, **args).get_sw_if_index(err_msg)
 
     @staticmethod
-    def create_memif_interface(node, filename, mid, sid, rxq=1, txq=1,
-                               role="SLAVE"):
+    def create_memif_interface(
+            node, filename, mid, sid, rxq=1, txq=1, role=u"SLAVE", use_dma=False
+    ):
         """Create Memif interface on the given node.
 
         :param node: Given node to create Memif interface on.
@@ -129,6 +133,7 @@ class Memif(object):
         :param rxq: Number of RX queues; 0 means do not set.
         :param txq: Number of TX queues; 0 means do not set.
         :param role: Memif interface role [master=0|slave=1]. Default is master.
+        :param use_dma: Use DMA acceleration. Requires hardware support.
         :type node: dict
         :type filename: str
         :type mid: str
@@ -136,11 +141,11 @@ class Memif(object):
         :type rxq: int
         :type txq: int
         :type role: str
+        :type use_dma: bool
         :returns: SW interface index.
         :rtype: int
         :raises ValueError: If command 'create memif' fails.
         """
-
         role = getattr(MemifRole, role.upper()).value
 
         # Create socket
@@ -148,10 +153,11 @@ class Memif(object):
 
         # Create memif
         sw_if_index = Memif._memif_create(
-            node, mid, sid, rxq=rxq, txq=txq, role=role)
+            node, mid, sid, rxq=rxq, txq=txq, role=role, use_dma=use_dma
+        )
 
         # Update Topology
-        if_key = Topology.add_new_port(node, 'memif')
+        if_key = Topology.add_new_port(node, u"memif")
         Topology.update_interface_sw_if_index(node, if_key, sw_if_index)
 
         ifc_name = Memif.vpp_get_memif_interface_name(node, sw_if_index)
@@ -160,7 +166,9 @@ class Memif(object):
         ifc_mac = Memif.vpp_get_memif_interface_mac(node, sw_if_index)
         Topology.update_interface_mac_address(node, if_key, ifc_mac)
 
-        Topology.update_interface_memif_socket(node, if_key, '/tmp/' + filename)
+        Topology.update_interface_memif_socket(
+            node, if_key, u"/tmp/" + filename
+        )
         Topology.update_interface_memif_id(node, if_key, mid)
         Topology.update_interface_memif_role(node, if_key, str(role))
 
@@ -173,7 +181,6 @@ class Memif(object):
         :param node: Given node to show Memif data on.
         :type node: dict
         """
-
         Memif._memif_details(node)
 
     @staticmethod
@@ -184,7 +191,7 @@ class Memif(object):
         :type nodes: dict
         """
         for node in nodes.values():
-            if node['type'] == NodeType.DUT:
+            if node[u"type"] == NodeType.DUT:
                 Memif.show_memif(node)
 
     @staticmethod
@@ -198,12 +205,11 @@ class Memif(object):
         :returns: Memif interface name, or None if not found.
         :rtype: str
         """
-
         details = Memif._memif_details(node)
 
         for memif in details:
-            if memif["sw_if_index"] == sw_if_index:
-                return memif["if_name"]
+            if memif[u"sw_if_index"] == sw_if_index:
+                return memif[u"if_name"]
         return None
 
     @staticmethod
@@ -217,10 +223,9 @@ class Memif(object):
         :returns: Memif interface MAC address, or None if not found.
         :rtype: str
         """
-
         details = Memif._memif_details(node)
 
         for memif in details:
-            if memif["sw_if_index"] == sw_if_index:
-                return memif["hw_addr"]
+            if memif[u"sw_if_index"] == sw_if_index:
+                return memif[u"hw_addr"]
         return None