+ def _memif_details(node):
+ """Get the memif dump details on the given node.
+
+ :param node: Given node to get Memif dump from.
+ :type node: dict
+ :returns: List of memif interfaces extracted from Papi response.
+ :rtype: list
+ """
+ cmd = u"memif_dump"
+ with PapiSocketExecutor(node) as papi_exec:
+ details = papi_exec.add(cmd).get_details()
+
+ for memif in details:
+ 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(f"MEMIF details:\n{details}")
+
+ return details
+
+ @staticmethod
+ def _memif_socket_filename_add_del(node, is_add, filename, sid):
+ """Create Memif socket on the given node.
+
+ :param node: Given node to create Memif socket on.
+ :param is_add: If True, socket is added, otherwise deleted.
+ :param filename: Memif interface socket filename.
+ :param sid: Socket ID.
+ :type node: dict
+ :type is_add: bool
+ :type filename: str
+ :type sid: str
+ :returns: Verified data from PAPI response. In this case, the response
+ includes only retval.
+ :rtype: dict
+ """
+ cmd = u"memif_socket_filename_add_del"
+ 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(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):
+ """Create Memif interface on the given node, return its sw_if_index.
+
+ :param node: Given node to create Memif interface on.
+ :param mid: Memif interface ID.
+ :param sid: Socket ID.
+ :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.
+ :type node: dict
+ :type mid: str
+ :type sid: str
+ :type rxq: int
+ :type txq: int
+ :type role: int
+ :returns: sw_if_index
+ :rtype: int
+ """
+ cmd = u"memif_create"
+ 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=u""
+ )
+
+ 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=u"SLAVE"):