feat(core): crypto support for Octeon DPU 70/41870/12
authorKishor Dhanawade <[email protected]>
Fri, 22 Nov 2024 09:07:04 +0000 (09:07 +0000)
committerPeter Mikus <[email protected]>
Mon, 26 May 2025 11:20:49 +0000 (11:20 +0000)
- Enables crypto device and performance test cases on the OCTEON board.
- Includes startup configuration for OCTEON crypto device.
- Integrates crypto device init virtual funtions for OCTEON.
- Introduces IPSec counters statistics.

Signed-off-by: Kishor Dhanawade <[email protected]>
Change-Id: Iea2446bb836a78b51cc4536bce95a29f68a140dd

resources/libraries/python/Constants.py
resources/libraries/python/OCTEONUtil.py [new file with mode: 0644]
resources/libraries/python/VppConfigGenerator.py
resources/libraries/python/VppCounters.py
resources/libraries/python/topology.py
resources/libraries/robot/shared/default.robot
resources/libraries/robot/shared/suite_setup.robot
resources/libraries/robot/shared/test_teardown.robot

index f2191a9..9c86614 100644 (file)
@@ -619,6 +619,7 @@ class Constants:
         "Intel-E823C": "HW_C4xxx",
         "Intel-X710": "HW_DH895xcc",
         "Intel-XL710": "HW_DH895xcc",
+        "Cavium-A063-100G":"HW_A0FD",
     }
 
     DEVICE_TYPE_TO_KEYWORD = {"scapy": None}
diff --git a/resources/libraries/python/OCTEONUtil.py b/resources/libraries/python/OCTEONUtil.py
new file mode 100644 (file)
index 0000000..2fc2a29
--- /dev/null
@@ -0,0 +1,74 @@
+# Copyright (c) 2025 Marvell.
+# 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:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""OCTEON util library."""
+
+from resources.libraries.python.DUTSetup import DUTSetup
+from resources.libraries.python.topology import NodeType, Topology
+from resources.libraries.python.VPPUtil import VPPUtil
+
+class OCTEONUtil:
+    """Contains methods for setting up OCTEON interfaces."""
+
+    @staticmethod
+    def octeon_crypto_device_verify_on_all_duts(nodes):
+        """Verify if Crypto Octeon device and its virtual functions are
+        initialized on all DUTs.
+
+        :param nodes: Nodes in the topology.
+        :type nodes: dict
+        """
+        VPPUtil.stop_vpp_service_on_all_duts(nodes)
+
+        for node in nodes.values():
+            if node["type"] == NodeType.DUT:
+                cryptodevs = Topology.get_cryptodev(node)
+                if not cryptodevs:
+                    return
+                for device in cryptodevs.values():
+                    OCTEONUtil.crypto_device_init(node, device)
+
+    @staticmethod
+    def crypto_device_init(node, device):
+        """Init Crypto Octeon device virtual functions on DUT.
+
+        :param node: DUT node.
+        :device: Crypto device entry from topology file.
+        :type node: dict
+        :type device: dict
+        """
+        DUTSetup.verify_kernel_module(node, device["module"], force_load=True)
+
+        current_driver = DUTSetup.get_pci_dev_driver(
+            node, device["pci_address"].replace(":", r"\:")
+        )
+        if current_driver is not None:
+            DUTSetup.pci_driver_unbind(node, device["pci_address"])
+        # Bind to kernel driver.
+        DUTSetup.pci_driver_bind(node, device["pci_address"], device["driver"])
+
+        # Initialize VFs.
+        if int(device["numvfs"]) > 0:
+            path = f"drivers/{device['driver']}"
+            DUTSetup.set_sriov_numvfs(
+                node, device["pci_address"], path=path,
+                numvfs=device["numvfs"]
+            )
+            uio_driver = Topology.get_uio_driver(node)
+            for vf in range(int(device["numvfs"])):
+                DUTSetup.pci_vf_driver_unbind(
+                    node, device["pci_address"], vf
+                )
+                DUTSetup.pci_vf_driver_bind(
+                    node, device["pci_address"], vf, uio_driver
+                )
index 11e4c85..550da9a 100644 (file)
@@ -811,6 +811,14 @@ class VppConfigGenerator:
         if verify_vpp:
             VPPUtil.verify_vpp(self._node)
 
+    def add_octeon_cryptodev(self):
+        """Add Octeon Crypto PCI device configuration.
+        """
+        cryptodict = Topology.get_cryptodev(self._node)
+        cryptodev = cryptodict[u"device1"][u"pci_address"]
+        cryptodev_config = re.sub(r"\d.\d$", f"0.1", cryptodev)
+        path = [u"devices", f"dev pci/{cryptodev_config}", u"driver octeon"]
+        self.add_config_item(self._nodeconfig, u"", path)
 
 class VppInitConfig:
     """VPP Initial Configuration."""
index 6bd0aea..acd9da9 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2021 Cisco and/or its affiliates.
+# Copyright (c) 2025 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:
@@ -270,3 +270,12 @@ class VppCounters:
         for node in nodes.values():
             if node[u"type"] == NodeType.DUT:
                 VppCounters.clear_vpp_statistics(node)
+
+    @staticmethod
+    def vpp_show_ipsec_all(node):
+        """Run "show ipsec all" debug CLI command.
+
+        :param node: Node to run command on.
+        :type node: dict
+        """
+        PapiSocketExecutor.run_cli_cmd_on_all_sockets(node, u"show ipsec all")
index 838ec37..e8c649c 100644 (file)
@@ -1022,6 +1022,20 @@ class Topology:
         except KeyError:
             return None
 
+    @staticmethod
+    def get_eventdev(node):
+        """Return Eventdev configuration of the node.
+
+        :param node: Node created from topology.
+        :type node: dict
+        :returns: Eventdev configuration string.
+        :rtype: str
+        """
+        try:
+            return node[u"eventdev"]
+        except KeyError:
+            return None
+
     def get_bus(node):
         """Return bus configuration of the node.
 
index 1779695..ac4ab59 100644 (file)
@@ -37,6 +37,7 @@
 | Library | resources.libraries.python.Namespaces
 | Library | resources.libraries.python.PapiHistory
 | Library | resources.libraries.python.QATUtil
+| Library | resources.libraries.python.OCTEONUtil
 | Library | resources.libraries.python.SchedUtils
 | Library | resources.libraries.python.Tap
 | Library | resources.libraries.python.Tap.TapFeatureMask
index 445fdc6..15e70ba 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2024 Cisco and/or its affiliates.
+# Copyright (c) 2025 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:
 
 | Additional Suite Setup Action For cryptohw
 | | [Documentation]
-| | ... | Additional Setup for suites which uses QAT HW.
-| |
-| | Crypto Device Verify on all DUTs | ${nodes}
+| | ... | Additional Setup for suites which uses QAT/OCTEON HW.
+| |
+| | ${marvell}= | Get Node Model Bool | ${nodes[('${duts}[0]')]}
+| | ... | Marvell-Octeon
+| | Run Keyword If | not ${marvell}
+| | ... | Run Keyword | Crypto Device Verify on all DUTs | ${nodes}
+| | ... | ELSE
+| | ... | Run Keyword | Octeon Crypto Device Verify on all DUTs | ${nodes}
 
 | Additional Suite Setup Action For nginx
 | | [Documentation]
index 81a9454..5f5fb13 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2024 Cisco and/or its affiliates.
+# Copyright (c) 2025 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:
 | | FOR | ${dut} | IN | @{duts}
 | | | Run Keyword If Test Failed
 | | | ... | Show Ipsec Security Association | ${nodes['${dut}']}
+| | | Run Keyword | Vpp Show Ipsec All | ${nodes['${dut}']}
 | | END
 
 | Additional Test Tear Down Action For ipsec_all