summaryrefslogtreecommitdiffstats
path: root/src/plugins/crypto_native/crypto_native.h
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2020-05-11 14:03:29 +0200
committerDamjan Marion <damarion@cisco.com>2020-05-11 21:09:04 +0200
commit73a60b2da44847f3725d362a49207330d4d22aa5 (patch)
tree28cce70187bb368298dea6f2cfabed573a7e500f /src/plugins/crypto_native/crypto_native.h
parent1ae16c8f3bebe33b2404ad845a2f09f910a06390 (diff)
crypto-native: properly deal with broken or outdated toolchains
Avoids crash due to missing symbol, when build system detects toolchain which is not able to produce binaries for all targets we need.... Type: fix Change-Id: I77ee63cb8dca3c9e4e83a6235c60f1439a472444 Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/plugins/crypto_native/crypto_native.h')
-rw-r--r--src/plugins/crypto_native/crypto_native.h20
1 files changed, 9 insertions, 11 deletions
diff --git a/src/plugins/crypto_native/crypto_native.h b/src/plugins/crypto_native/crypto_native.h
index b83dd773e44..f1153737dea 100644
--- a/src/plugins/crypto_native/crypto_native.h
+++ b/src/plugins/crypto_native/crypto_native.h
@@ -36,17 +36,15 @@ typedef struct
extern crypto_native_main_t crypto_native_main;
-clib_error_t *crypto_native_aes_cbc_init_sse42 (vlib_main_t * vm);
-clib_error_t *crypto_native_aes_cbc_init_avx2 (vlib_main_t * vm);
-clib_error_t *crypto_native_aes_cbc_init_avx512 (vlib_main_t * vm);
-clib_error_t *crypto_native_aes_cbc_init_vaes (vlib_main_t * vm);
-clib_error_t *crypto_native_aes_cbc_init_neon (vlib_main_t * vm);
-
-clib_error_t *crypto_native_aes_gcm_init_sse42 (vlib_main_t * vm);
-clib_error_t *crypto_native_aes_gcm_init_avx2 (vlib_main_t * vm);
-clib_error_t *crypto_native_aes_gcm_init_avx512 (vlib_main_t * vm);
-clib_error_t *crypto_native_aes_gcm_init_vaes (vlib_main_t * vm);
-clib_error_t *crypto_native_aes_gcm_init_neon (vlib_main_t * vm);
+#define foreach_crypto_native_march_variant _(slm) _(hsw) _(skx) _(icl) _(neon)
+
+#define _(v) \
+clib_error_t __clib_weak *crypto_native_aes_cbc_init_##v (vlib_main_t * vm); \
+clib_error_t __clib_weak *crypto_native_aes_gcm_init_##v (vlib_main_t * vm); \
+
+foreach_crypto_native_march_variant;
+#undef _
+
#endif /* __crypto_native_h__ */
/*
ref='#n34'>34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
# Copyright (c) 2019 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:
#
#     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.

"""Tap utilities library."""

from robot.api import logger

from resources.libraries.python.Constants import Constants
from resources.libraries.python.InterfaceUtil import InterfaceUtil
from resources.libraries.python.L2Util import L2Util
from resources.libraries.python.PapiExecutor import PapiSocketExecutor
from resources.libraries.python.topology import Topology


class Tap:
    """Tap utilities."""

    @staticmethod
    def add_tap_interface(node, tap_name, mac=None, num_rx_queues=1):
        """Add tap interface with name and optionally with MAC.

        :param node: Node to add tap on.
        :param tap_name: Tap interface name for linux tap.
        :param mac: Optional MAC address for VPP tap.
        :param num_rx_queues: Number of RX queues.
        :type node: dict
        :type tap_name: str
        :type mac: str
        :type num_rx_queues: int
        :returns: Returns a interface index.
        :rtype: int
        """
        cmd = u"tap_create_v2"
        args = dict(
            id=Constants.BITWISE_NON_ZERO,
            use_random_mac=bool(mac is None),
            mac_address=L2Util.mac_to_bin(mac) if mac else None,
            num_rx_queues=int(num_rx_queues),
            host_mtu_set=False,
            host_mac_addr_set=False,
            host_ip4_prefix_set=False,
            host_ip6_prefix_set=False,
            host_ip4_gw_set=False,
            host_ip6_gw_set=False,
            host_namespace_set=False,
            host_if_name_set=True,
            host_if_name=tap_name,
            host_bridge_set=False
        )
        err_msg = f"Failed to create tap interface {tap_name} " \
            f"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"tap")
        Topology.update_interface_sw_if_index(node, if_key, sw_if_index)
        Topology.update_interface_name(node, if_key, tap_name)
        if mac is None:
            mac = Tap.vpp_get_tap_interface_mac(node, tap_name)
        Topology.update_interface_mac_address(node, if_key, mac)
        tap_dev_name = Tap.vpp_get_tap_dev_name(node, tap_name)
        Topology.update_interface_tap_dev_name(node, if_key, tap_dev_name)

        return sw_if_index

    @staticmethod
    def vpp_get_tap_dev_name(node, host_if_name):
        """Get VPP tap interface name from hardware interfaces dump.

        :param node: DUT node.
        :param host_if_name: Tap host interface name.
        :type node: dict
        :type host_if_name: str
        :returns: VPP tap interface dev_name.
        :rtype: str
        """
        return Tap.tap_dump(node, host_if_name).get(u"dev_name")

    @staticmethod
    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)

    @staticmethod
    def tap_dump(node, name=None):
        """Get all TAP interface data from the given node, or data about
        a specific TAP interface.

        :param node: VPP node to get data from.
        :param name: Optional name of a specific TAP interface.
        :type node: dict
        :type name: str
        :returns: Dictionary of information about a specific TAP interface, or
            a List of dictionaries containing all TAP data for the given node.
        :rtype: dict or list
        """
        def process_tap_dump(tap_dump):
            """Process tap dump.

            :param tap_dump: Tap interface dump.
            :type tap_dump: dict
            :returns: Processed tap interface dump.
            :rtype: dict
            """
            tap_dump[u"host_mac_addr"] = str(tap_dump[u"host_mac_addr"])
            tap_dump[u"host_ip4_prefix"] = str(tap_dump[u"host_ip4_prefix"])
            tap_dump[u"host_ip6_prefix"] = str(tap_dump[u"host_ip6_prefix"])
            tap_dump[u"tap_flags"] = tap_dump[u"tap_flags"].value \
                if hasattr(tap_dump[u"tap_flags"], u"value") \
                else int(tap_dump[u"tap_flags"])
            tap_dump[u"host_namespace"] = None \
                if tap_dump[u"host_namespace"] == u"(nil)" \
                else tap_dump[u"host_namespace"]
            tap_dump[u"host_bridge"] = None \
                if tap_dump[u"host_bridge"] == u"(nil)" \
                else tap_dump[u"host_bridge"]

            return tap_dump

        cmd = u"sw_interface_tap_v2_dump"
        err_msg = f"Failed to get TAP dump on host {node[u'host']}"

        with PapiSocketExecutor(node) as papi_exec:
            details = papi_exec.add(cmd).get_details(err_msg)

        data = list() if name is None else dict()
        for dump in details:
            if name is None:
                data.append(process_tap_dump(dump))
            elif dump.get(u"host_if_name") == name:
                data = process_tap_dump(dump)
                break

        logger.debug(f"TAP data:\n{data}")
        return data