LCOV - code coverage report
Current view: top level - lib/security - rte_security.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 69 184 37.5 %
Date: 2025-05-01 17:49:45 Functions: 9 25 36.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 85 214 39.7 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright 2017 NXP.
       3                 :            :  * Copyright(c) 2017 Intel Corporation.
       4                 :            :  * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
       5                 :            :  */
       6                 :            : 
       7                 :            : #include <stdalign.h>
       8                 :            : #include <ctype.h>
       9                 :            : #include <stdlib.h>
      10                 :            : 
      11                 :            : #include <eal_export.h>
      12                 :            : #include <rte_cryptodev.h>
      13                 :            : #include <dev_driver.h>
      14                 :            : #include <rte_telemetry.h>
      15                 :            : #include "rte_security.h"
      16                 :            : #include "rte_security_driver.h"
      17                 :            : 
      18                 :            : /* Macro to check for invalid pointers */
      19                 :            : #define RTE_PTR_OR_ERR_RET(ptr, retval) do {    \
      20                 :            :         if ((ptr) == NULL)                      \
      21                 :            :                 return retval;                  \
      22                 :            : } while (0)
      23                 :            : 
      24                 :            : /* Macro to check for invalid pointers chains */
      25                 :            : #define RTE_PTR_CHAIN3_OR_ERR_RET(p1, p2, p3, retval, last_retval) do { \
      26                 :            :         RTE_PTR_OR_ERR_RET(p1, retval);                                 \
      27                 :            :         RTE_PTR_OR_ERR_RET(p1->p2, retval);                          \
      28                 :            :         RTE_PTR_OR_ERR_RET(p1->p2->p3, last_retval);                      \
      29                 :            : } while (0)
      30                 :            : 
      31                 :            : #define RTE_SECURITY_DYNFIELD_NAME "rte_security_dynfield_metadata"
      32                 :            : #define RTE_SECURITY_OOP_DYNFIELD_NAME "rte_security_oop_dynfield_metadata"
      33                 :            : 
      34                 :            : RTE_EXPORT_SYMBOL(rte_security_dynfield_offset)
      35                 :            : int rte_security_dynfield_offset = -1;
      36                 :            : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_security_oop_dynfield_offset, 23.11)
      37                 :            : int rte_security_oop_dynfield_offset = -1;
      38                 :            : 
      39                 :            : RTE_EXPORT_INTERNAL_SYMBOL(rte_security_dynfield_register)
      40                 :            : int
      41                 :          0 : rte_security_dynfield_register(void)
      42                 :            : {
      43                 :            :         static const struct rte_mbuf_dynfield dynfield_desc = {
      44                 :            :                 .name = RTE_SECURITY_DYNFIELD_NAME,
      45                 :            :                 .size = sizeof(rte_security_dynfield_t),
      46                 :            :                 .align = alignof(rte_security_dynfield_t),
      47                 :            :         };
      48                 :          0 :         rte_security_dynfield_offset =
      49                 :          0 :                 rte_mbuf_dynfield_register(&dynfield_desc);
      50                 :          0 :         return rte_security_dynfield_offset;
      51                 :            : }
      52                 :            : 
      53                 :            : RTE_EXPORT_INTERNAL_SYMBOL(rte_security_oop_dynfield_register)
      54                 :            : int
      55                 :          0 : rte_security_oop_dynfield_register(void)
      56                 :            : {
      57                 :            :         static const struct rte_mbuf_dynfield dynfield_desc = {
      58                 :            :                 .name = RTE_SECURITY_OOP_DYNFIELD_NAME,
      59                 :            :                 .size = sizeof(rte_security_oop_dynfield_t),
      60                 :            :                 .align = alignof(rte_security_oop_dynfield_t),
      61                 :            :         };
      62                 :            : 
      63                 :          0 :         rte_security_oop_dynfield_offset =
      64                 :          0 :                 rte_mbuf_dynfield_register(&dynfield_desc);
      65                 :          0 :         return rte_security_oop_dynfield_offset;
      66                 :            : }
      67                 :            : 
      68                 :            : RTE_EXPORT_SYMBOL(rte_security_session_create)
      69                 :            : void *
      70                 :         59 : rte_security_session_create(void *ctx,
      71                 :            :                             struct rte_security_session_conf *conf,
      72                 :            :                             struct rte_mempool *mp)
      73                 :            : {
      74                 :         59 :         struct rte_security_session *sess = NULL;
      75                 :            :         struct rte_security_ctx *instance = ctx;
      76                 :            :         uint32_t sess_priv_size;
      77                 :            : 
      78   [ +  +  +  +  :         59 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, session_create, NULL, NULL);
                   +  + ]
      79         [ +  + ]:         56 :         RTE_PTR_OR_ERR_RET(conf, NULL);
      80         [ +  + ]:         55 :         RTE_PTR_OR_ERR_RET(mp, NULL);
      81                 :            : 
      82                 :         54 :         sess_priv_size = instance->ops->session_get_size(instance->device);
      83         [ +  - ]:         54 :         if (mp->elt_size < (sizeof(struct rte_security_session) + sess_priv_size))
      84                 :            :                 return NULL;
      85                 :            : 
      86         [ +  + ]:         54 :         if (rte_mempool_get(mp, (void **)&sess))
      87                 :            :                 return NULL;
      88                 :            : 
      89                 :            :         /* Clear session priv data */
      90                 :         53 :         memset(sess->driver_priv_data, 0, sess_priv_size);
      91                 :            : 
      92                 :         53 :         sess->driver_priv_data_iova = rte_mempool_virt2iova(sess) +
      93                 :            :                         offsetof(struct rte_security_session, driver_priv_data);
      94         [ +  + ]:         53 :         if (instance->ops->session_create(instance->device, conf, sess)) {
      95         [ -  + ]:          1 :                 rte_mempool_put(mp, (void *)sess);
      96                 :          1 :                 return NULL;
      97                 :            :         }
      98                 :         52 :         instance->sess_cnt++;
      99                 :            : 
     100                 :         52 :         return (void *)sess;
     101                 :            : }
     102                 :            : 
     103                 :            : RTE_EXPORT_SYMBOL(rte_security_session_update)
     104                 :            : int
     105                 :          7 : rte_security_session_update(void *ctx, void *sess, struct rte_security_session_conf *conf)
     106                 :            : {
     107                 :            :         struct rte_security_ctx *instance = ctx;
     108                 :            : 
     109   [ +  +  +  +  :          7 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, session_update, -EINVAL,
                   +  + ]
     110                 :            :                         -ENOTSUP);
     111         [ +  + ]:          4 :         RTE_PTR_OR_ERR_RET(sess, -EINVAL);
     112         [ +  + ]:          3 :         RTE_PTR_OR_ERR_RET(conf, -EINVAL);
     113                 :            : 
     114                 :          2 :         return instance->ops->session_update(instance->device, sess, conf);
     115                 :            : }
     116                 :            : 
     117                 :            : RTE_EXPORT_SYMBOL(rte_security_session_get_size)
     118                 :            : unsigned int
     119                 :          6 : rte_security_session_get_size(void *ctx)
     120                 :            : {
     121                 :            :         struct rte_security_ctx *instance = ctx;
     122                 :            : 
     123   [ +  +  +  +  :          6 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, session_get_size, 0, 0);
                   +  + ]
     124                 :            : 
     125                 :          2 :         return (sizeof(struct rte_security_session) +
     126                 :          2 :                         instance->ops->session_get_size(instance->device));
     127                 :            : }
     128                 :            : 
     129                 :            : RTE_EXPORT_SYMBOL(rte_security_session_stats_get)
     130                 :            : int
     131                 :          6 : rte_security_session_stats_get(void *ctx, void *sess, struct rte_security_stats *stats)
     132                 :            : {
     133                 :            :         struct rte_security_ctx *instance = ctx;
     134                 :            : 
     135   [ +  +  +  +  :          6 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, session_stats_get, -EINVAL,
                   +  + ]
     136                 :            :                         -ENOTSUP);
     137                 :            :         /* Parameter sess can be NULL in case of getting global statistics. */
     138         [ +  + ]:          3 :         RTE_PTR_OR_ERR_RET(stats, -EINVAL);
     139                 :            : 
     140                 :          2 :         return instance->ops->session_stats_get(instance->device, sess, stats);
     141                 :            : }
     142                 :            : 
     143                 :            : RTE_EXPORT_SYMBOL(rte_security_session_destroy)
     144                 :            : int
     145                 :         57 : rte_security_session_destroy(void *ctx, void *sess)
     146                 :            : {
     147                 :            :         struct rte_security_ctx *instance = ctx;
     148                 :            :         int ret;
     149                 :            : 
     150   [ +  +  +  +  :         57 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, session_destroy, -EINVAL,
                   +  + ]
     151                 :            :                         -ENOTSUP);
     152         [ +  + ]:         54 :         RTE_PTR_OR_ERR_RET(sess, -EINVAL);
     153                 :            : 
     154                 :         53 :         ret = instance->ops->session_destroy(instance->device, sess);
     155         [ +  + ]:         53 :         if (ret != 0)
     156                 :            :                 return ret;
     157                 :            : 
     158                 :         52 :         rte_mempool_put(rte_mempool_from_obj(sess), (void *)sess);
     159                 :            : 
     160         [ +  - ]:         52 :         if (instance->sess_cnt)
     161                 :         52 :                 instance->sess_cnt--;
     162                 :            : 
     163                 :            :         return 0;
     164                 :            : }
     165                 :            : 
     166                 :            : RTE_EXPORT_SYMBOL(rte_security_macsec_sc_create)
     167                 :            : int
     168                 :          0 : rte_security_macsec_sc_create(void *ctx, struct rte_security_macsec_sc *conf)
     169                 :            : {
     170                 :            :         struct rte_security_ctx *instance = ctx;
     171                 :            :         int sc_id;
     172                 :            : 
     173   [ #  #  #  #  :          0 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sc_create, -EINVAL, -ENOTSUP);
                   #  # ]
     174         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(conf, -EINVAL);
     175                 :            : 
     176                 :          0 :         sc_id = instance->ops->macsec_sc_create(instance->device, conf);
     177         [ #  # ]:          0 :         if (sc_id >= 0)
     178                 :          0 :                 instance->macsec_sc_cnt++;
     179                 :            : 
     180                 :            :         return sc_id;
     181                 :            : }
     182                 :            : 
     183                 :            : RTE_EXPORT_SYMBOL(rte_security_macsec_sa_create)
     184                 :            : int
     185                 :          0 : rte_security_macsec_sa_create(void *ctx, struct rte_security_macsec_sa *conf)
     186                 :            : {
     187                 :            :         struct rte_security_ctx *instance = ctx;
     188                 :            :         int sa_id;
     189                 :            : 
     190   [ #  #  #  #  :          0 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sa_create, -EINVAL, -ENOTSUP);
                   #  # ]
     191         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(conf, -EINVAL);
     192                 :            : 
     193                 :          0 :         sa_id = instance->ops->macsec_sa_create(instance->device, conf);
     194         [ #  # ]:          0 :         if (sa_id >= 0)
     195                 :          0 :                 instance->macsec_sa_cnt++;
     196                 :            : 
     197                 :            :         return sa_id;
     198                 :            : }
     199                 :            : 
     200                 :            : RTE_EXPORT_SYMBOL(rte_security_macsec_sc_destroy)
     201                 :            : int
     202                 :          0 : rte_security_macsec_sc_destroy(void *ctx, uint16_t sc_id,
     203                 :            :                                enum rte_security_macsec_direction dir)
     204                 :            : {
     205                 :            :         struct rte_security_ctx *instance = ctx;
     206                 :            :         int ret;
     207                 :            : 
     208   [ #  #  #  #  :          0 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sc_destroy, -EINVAL, -ENOTSUP);
                   #  # ]
     209                 :            : 
     210                 :          0 :         ret = instance->ops->macsec_sc_destroy(instance->device, sc_id, dir);
     211         [ #  # ]:          0 :         if (ret != 0)
     212                 :            :                 return ret;
     213                 :            : 
     214         [ #  # ]:          0 :         if (instance->macsec_sc_cnt)
     215                 :          0 :                 instance->macsec_sc_cnt--;
     216                 :            : 
     217                 :            :         return 0;
     218                 :            : }
     219                 :            : 
     220                 :            : RTE_EXPORT_SYMBOL(rte_security_macsec_sa_destroy)
     221                 :            : int
     222                 :          0 : rte_security_macsec_sa_destroy(void *ctx, uint16_t sa_id,
     223                 :            :                                enum rte_security_macsec_direction dir)
     224                 :            : {
     225                 :            :         struct rte_security_ctx *instance = ctx;
     226                 :            :         int ret;
     227                 :            : 
     228   [ #  #  #  #  :          0 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sa_destroy, -EINVAL, -ENOTSUP);
                   #  # ]
     229                 :            : 
     230                 :          0 :         ret = instance->ops->macsec_sa_destroy(instance->device, sa_id, dir);
     231         [ #  # ]:          0 :         if (ret != 0)
     232                 :            :                 return ret;
     233                 :            : 
     234         [ #  # ]:          0 :         if (instance->macsec_sa_cnt)
     235                 :          0 :                 instance->macsec_sa_cnt--;
     236                 :            : 
     237                 :            :         return 0;
     238                 :            : }
     239                 :            : 
     240                 :            : RTE_EXPORT_SYMBOL(rte_security_macsec_sc_stats_get)
     241                 :            : int
     242                 :          0 : rte_security_macsec_sc_stats_get(void *ctx, uint16_t sc_id,
     243                 :            :                                  enum rte_security_macsec_direction dir,
     244                 :            :                                  struct rte_security_macsec_sc_stats *stats)
     245                 :            : {
     246                 :            :         struct rte_security_ctx *instance = ctx;
     247                 :            : 
     248   [ #  #  #  #  :          0 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sc_stats_get, -EINVAL, -ENOTSUP);
                   #  # ]
     249         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(stats, -EINVAL);
     250                 :            : 
     251                 :          0 :         return instance->ops->macsec_sc_stats_get(instance->device, sc_id, dir, stats);
     252                 :            : }
     253                 :            : 
     254                 :            : RTE_EXPORT_SYMBOL(rte_security_macsec_sa_stats_get)
     255                 :            : int
     256                 :          0 : rte_security_macsec_sa_stats_get(void *ctx, uint16_t sa_id,
     257                 :            :                                  enum rte_security_macsec_direction dir,
     258                 :            :                                  struct rte_security_macsec_sa_stats *stats)
     259                 :            : {
     260                 :            :         struct rte_security_ctx *instance = ctx;
     261                 :            : 
     262   [ #  #  #  #  :          0 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, macsec_sa_stats_get, -EINVAL, -ENOTSUP);
                   #  # ]
     263         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(stats, -EINVAL);
     264                 :            : 
     265                 :          0 :         return instance->ops->macsec_sa_stats_get(instance->device, sa_id, dir, stats);
     266                 :            : }
     267                 :            : 
     268                 :            : RTE_EXPORT_SYMBOL(__rte_security_set_pkt_metadata)
     269                 :            : int
     270                 :          3 : __rte_security_set_pkt_metadata(void *ctx, void *sess, struct rte_mbuf *m, void *params)
     271                 :            : {
     272                 :            :         struct rte_security_ctx *instance = ctx;
     273                 :            : #ifdef RTE_DEBUG
     274                 :            :         RTE_PTR_OR_ERR_RET(sess, -EINVAL);
     275                 :            :         RTE_PTR_OR_ERR_RET(instance, -EINVAL);
     276                 :            :         RTE_PTR_OR_ERR_RET(instance->ops, -EINVAL);
     277                 :            : #endif
     278         [ +  + ]:          3 :         if (instance->ops->set_pkt_metadata == NULL)
     279                 :            :                 return -ENOTSUP;
     280                 :          2 :         return instance->ops->set_pkt_metadata(instance->device, sess, m, params);
     281                 :            : }
     282                 :            : 
     283                 :            : RTE_EXPORT_SYMBOL(rte_security_capabilities_get)
     284                 :            : const struct rte_security_capability *
     285                 :          5 : rte_security_capabilities_get(void *ctx)
     286                 :            : {
     287                 :            :         struct rte_security_ctx *instance = ctx;
     288                 :            : 
     289   [ +  +  +  +  :          5 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, capabilities_get, NULL, NULL);
                   +  + ]
     290                 :            : 
     291                 :          2 :         return instance->ops->capabilities_get(instance->device);
     292                 :            : }
     293                 :            : 
     294                 :            : RTE_EXPORT_SYMBOL(rte_security_capability_get)
     295                 :            : const struct rte_security_capability *
     296                 :         16 : rte_security_capability_get(void *ctx, struct rte_security_capability_idx *idx)
     297                 :            : {
     298                 :            :         const struct rte_security_capability *capabilities;
     299                 :            :         const struct rte_security_capability *capability;
     300                 :            :         struct rte_security_ctx *instance = ctx;
     301                 :            :         uint16_t i = 0;
     302                 :            : 
     303   [ +  +  +  +  :         16 :         RTE_PTR_CHAIN3_OR_ERR_RET(instance, ops, capabilities_get, NULL, NULL);
                   +  + ]
     304         [ +  + ]:         13 :         RTE_PTR_OR_ERR_RET(idx, NULL);
     305                 :            : 
     306                 :         12 :         capabilities = instance->ops->capabilities_get(instance->device);
     307                 :            : 
     308         [ +  + ]:         12 :         if (capabilities == NULL)
     309                 :            :                 return NULL;
     310                 :            : 
     311                 :         23 :         while ((capability = &capabilities[i++])->action
     312         [ +  + ]:         23 :                         != RTE_SECURITY_ACTION_TYPE_NONE) {
     313         [ +  + ]:         15 :                 if (capability->action == idx->action &&
     314         [ +  + ]:         10 :                                 capability->protocol == idx->protocol) {
     315                 :            :                         if (idx->protocol == RTE_SECURITY_PROTOCOL_IPSEC) {
     316                 :          4 :                                 if (capability->ipsec.proto ==
     317         [ +  + ]:          4 :                                                 idx->ipsec.proto &&
     318                 :          3 :                                         capability->ipsec.mode ==
     319         [ +  + ]:          3 :                                                         idx->ipsec.mode &&
     320                 :          2 :                                         capability->ipsec.direction ==
     321         [ +  + ]:          2 :                                                         idx->ipsec.direction)
     322                 :          1 :                                         return capability;
     323                 :            :                         } else if (idx->protocol == RTE_SECURITY_PROTOCOL_PDCP) {
     324                 :          2 :                                 if (capability->pdcp.domain ==
     325         [ +  + ]:          2 :                                                         idx->pdcp.domain)
     326                 :          1 :                                         return capability;
     327                 :            :                         } else if (idx->protocol ==
     328                 :            :                                                 RTE_SECURITY_PROTOCOL_DOCSIS) {
     329                 :          2 :                                 if (capability->docsis.direction ==
     330         [ +  + ]:          2 :                                                         idx->docsis.direction)
     331                 :          1 :                                         return capability;
     332                 :            :                         } else if (idx->protocol ==
     333                 :            :                                                 RTE_SECURITY_PROTOCOL_MACSEC) {
     334         [ #  # ]:          0 :                                 if (idx->macsec.alg == capability->macsec.alg)
     335                 :          0 :                                         return capability;
     336                 :            :                         } else if (idx->protocol == RTE_SECURITY_PROTOCOL_TLS_RECORD) {
     337         [ #  # ]:          0 :                                 if (capability->tls_record.ver == idx->tls_record.ver &&
     338         [ #  # ]:          0 :                                     capability->tls_record.type == idx->tls_record.type)
     339                 :          0 :                                         return capability;
     340                 :            :                         }
     341                 :            :                 }
     342                 :            :         }
     343                 :            : 
     344                 :            :         return NULL;
     345                 :            : }
     346                 :            : 
     347                 :            : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_security_rx_inject_configure, 23.11)
     348                 :            : int
     349                 :          0 : rte_security_rx_inject_configure(void *ctx, uint16_t port_id, bool enable)
     350                 :            : {
     351                 :            :         struct rte_security_ctx *instance = ctx;
     352                 :            : 
     353         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(instance, -EINVAL);
     354         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(instance->ops, -ENOTSUP);
     355         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(instance->ops->rx_inject_configure, -ENOTSUP);
     356                 :            : 
     357                 :          0 :         return instance->ops->rx_inject_configure(instance->device, port_id, enable);
     358                 :            : }
     359                 :            : 
     360                 :            : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_security_inb_pkt_rx_inject, 23.11)
     361                 :            : uint16_t
     362                 :          0 : rte_security_inb_pkt_rx_inject(void *ctx, struct rte_mbuf **pkts, void **sess,
     363                 :            :                                uint16_t nb_pkts)
     364                 :            : {
     365                 :            :         struct rte_security_ctx *instance = ctx;
     366                 :            : 
     367                 :          0 :         return instance->ops->inb_pkt_rx_inject(instance->device, pkts,
     368                 :            :                                                 (struct rte_security_session **)sess, nb_pkts);
     369                 :            : }
     370                 :            : 
     371                 :            : static int
     372                 :          0 : security_handle_cryptodev_list(const char *cmd __rte_unused,
     373                 :            :                                const char *params __rte_unused,
     374                 :            :                                struct rte_tel_data *d)
     375                 :            : {
     376                 :            :         int dev_id;
     377                 :            : 
     378         [ #  # ]:          0 :         if (rte_cryptodev_count() < 1)
     379                 :            :                 return -1;
     380                 :            : 
     381                 :          0 :         rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
     382         [ #  # ]:          0 :         for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++)
     383   [ #  #  #  # ]:          0 :                 if (rte_cryptodev_is_valid_dev(dev_id) &&
     384                 :          0 :                     rte_cryptodev_get_sec_ctx(dev_id))
     385                 :          0 :                         rte_tel_data_add_array_int(d, dev_id);
     386                 :            : 
     387                 :            :         return 0;
     388                 :            : }
     389                 :            : 
     390                 :            : #define CRYPTO_CAPS_SZ                                             \
     391                 :            :         (RTE_ALIGN_CEIL(sizeof(struct rte_cryptodev_capabilities), \
     392                 :            :                         sizeof(uint64_t)) /     sizeof(uint64_t))
     393                 :            : 
     394                 :            : static int
     395                 :          0 : crypto_caps_array(struct rte_tel_data *d,
     396                 :            :                   const struct rte_cryptodev_capabilities *capabilities)
     397                 :            : {
     398                 :            :         const struct rte_cryptodev_capabilities *dev_caps;
     399                 :            :         uint64_t caps_val[CRYPTO_CAPS_SZ];
     400                 :            :         unsigned int i = 0, j;
     401                 :            : 
     402                 :          0 :         rte_tel_data_start_array(d, RTE_TEL_UINT_VAL);
     403                 :            : 
     404         [ #  # ]:          0 :         while ((dev_caps = &capabilities[i++])->op !=
     405                 :            :            RTE_CRYPTO_OP_TYPE_UNDEFINED) {
     406                 :            :                 memset(&caps_val, 0, CRYPTO_CAPS_SZ * sizeof(caps_val[0]));
     407                 :            :                 rte_memcpy(caps_val, dev_caps, sizeof(capabilities[0]));
     408         [ #  # ]:          0 :                 for (j = 0; j < CRYPTO_CAPS_SZ; j++)
     409                 :          0 :                         rte_tel_data_add_array_uint(d, caps_val[j]);
     410                 :            :         }
     411                 :            : 
     412                 :          0 :         return (i - 1);
     413                 :            : }
     414                 :            : 
     415                 :            : #define SEC_CAPS_SZ                                             \
     416                 :            :         (RTE_ALIGN_CEIL(sizeof(struct rte_security_capability), \
     417                 :            :                         sizeof(uint64_t)) /     sizeof(uint64_t))
     418                 :            : 
     419                 :            : static int
     420                 :          0 : sec_caps_array(struct rte_tel_data *d,
     421                 :            :                const struct rte_security_capability *capabilities)
     422                 :            : {
     423                 :            :         const struct rte_security_capability *dev_caps;
     424                 :            :         uint64_t caps_val[SEC_CAPS_SZ];
     425                 :            :         unsigned int i = 0, j;
     426                 :            : 
     427                 :          0 :         rte_tel_data_start_array(d, RTE_TEL_UINT_VAL);
     428                 :            : 
     429         [ #  # ]:          0 :         while ((dev_caps = &capabilities[i++])->action !=
     430                 :            :            RTE_SECURITY_ACTION_TYPE_NONE) {
     431                 :            :                 memset(&caps_val, 0, SEC_CAPS_SZ * sizeof(caps_val[0]));
     432                 :            :                 rte_memcpy(caps_val, dev_caps, sizeof(capabilities[0]));
     433         [ #  # ]:          0 :                 for (j = 0; j < SEC_CAPS_SZ; j++)
     434                 :          0 :                         rte_tel_data_add_array_uint(d, caps_val[j]);
     435                 :            :         }
     436                 :            : 
     437                 :          0 :         return i - 1;
     438                 :            : }
     439                 :            : 
     440                 :            : static const struct rte_security_capability *
     441                 :            : security_capability_by_index(const struct rte_security_capability *capabilities,
     442                 :            :                              int index)
     443                 :            : {
     444                 :            :         const struct rte_security_capability *dev_caps = NULL;
     445                 :            :         int i = 0;
     446                 :            : 
     447         [ #  # ]:          0 :         while ((dev_caps = &capabilities[i])->action !=
     448                 :            :            RTE_SECURITY_ACTION_TYPE_NONE) {
     449         [ #  # ]:          0 :                 if (i == index)
     450                 :            :                         return dev_caps;
     451                 :            : 
     452                 :          0 :                 ++i;
     453                 :            :         }
     454                 :            : 
     455                 :            :         return NULL;
     456                 :            : }
     457                 :            : 
     458                 :            : static int
     459                 :          0 : security_capabilities_from_dev_id(int dev_id, const void **caps)
     460                 :            : {
     461                 :            :         const struct rte_security_capability *capabilities;
     462                 :            :         void *sec_ctx;
     463                 :            : 
     464         [ #  # ]:          0 :         if (rte_cryptodev_is_valid_dev(dev_id) == 0)
     465                 :            :                 return -EINVAL;
     466                 :            : 
     467                 :          0 :         sec_ctx = rte_cryptodev_get_sec_ctx(dev_id);
     468         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(sec_ctx, -EINVAL);
     469                 :            : 
     470                 :          0 :         capabilities = rte_security_capabilities_get(sec_ctx);
     471         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(capabilities, -EINVAL);
     472                 :            : 
     473                 :          0 :         *caps = capabilities;
     474                 :          0 :         return 0;
     475                 :            : }
     476                 :            : 
     477                 :            : static int
     478                 :          0 : security_handle_cryptodev_sec_caps(const char *cmd __rte_unused, const char *params,
     479                 :            :                                    struct rte_tel_data *d)
     480                 :            : {
     481                 :            :         const struct rte_security_capability *capabilities;
     482                 :            :         struct rte_tel_data *sec_caps;
     483                 :            :         char *end_param;
     484                 :            :         int sec_caps_n;
     485                 :            :         int dev_id;
     486                 :            :         int rc;
     487                 :            : 
     488   [ #  #  #  #  :          0 :         if (!params || strlen(params) == 0 || !isdigit(*params))
                   #  # ]
     489                 :            :                 return -EINVAL;
     490                 :            : 
     491                 :          0 :         dev_id = strtoul(params, &end_param, 0);
     492         [ #  # ]:          0 :         if (*end_param != '\0')
     493                 :          0 :                 CDEV_LOG_ERR("Extra parameters passed to command, ignoring");
     494                 :            : 
     495                 :          0 :         rc = security_capabilities_from_dev_id(dev_id, (void *)&capabilities);
     496         [ #  # ]:          0 :         if (rc < 0)
     497                 :            :                 return rc;
     498                 :            : 
     499                 :          0 :         sec_caps = rte_tel_data_alloc();
     500         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(sec_caps, -ENOMEM);
     501                 :            : 
     502                 :          0 :         rte_tel_data_start_dict(d);
     503                 :          0 :         sec_caps_n = sec_caps_array(sec_caps, capabilities);
     504                 :          0 :         rte_tel_data_add_dict_container(d, "sec_caps", sec_caps, 0);
     505                 :          0 :         rte_tel_data_add_dict_int(d, "sec_caps_n", sec_caps_n);
     506                 :            : 
     507                 :          0 :         return 0;
     508                 :            : }
     509                 :            : 
     510                 :            : static int
     511                 :          0 : security_handle_cryptodev_crypto_caps(const char *cmd __rte_unused, const char *params,
     512                 :            :                                       struct rte_tel_data *d)
     513                 :            : {
     514                 :            :         const struct rte_security_capability *capabilities;
     515                 :            :         struct rte_tel_data *crypto_caps;
     516                 :            :         const char *capa_param;
     517                 :            :         int dev_id, capa_id;
     518                 :            :         int crypto_caps_n;
     519                 :            :         char *end_param;
     520                 :            :         int rc;
     521                 :            : 
     522   [ #  #  #  #  :          0 :         if (!params || strlen(params) == 0 || !isdigit(*params))
                   #  # ]
     523                 :            :                 return -EINVAL;
     524                 :            : 
     525                 :          0 :         dev_id = strtoul(params, &end_param, 0);
     526                 :          0 :         capa_param = strtok(end_param, ",");
     527   [ #  #  #  #  :          0 :         if (!capa_param || strlen(capa_param) == 0 || !isdigit(*capa_param))
                   #  # ]
     528                 :            :                 return -EINVAL;
     529                 :            : 
     530                 :          0 :         capa_id = strtoul(capa_param, &end_param, 0);
     531         [ #  # ]:          0 :         if (*end_param != '\0')
     532                 :          0 :                 CDEV_LOG_ERR("Extra parameters passed to command, ignoring");
     533                 :            : 
     534                 :          0 :         rc = security_capabilities_from_dev_id(dev_id, (void *)&capabilities);
     535         [ #  # ]:          0 :         if (rc < 0)
     536                 :            :                 return rc;
     537                 :            : 
     538                 :          0 :         capabilities = security_capability_by_index(capabilities, capa_id);
     539         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(capabilities, -EINVAL);
     540                 :            : 
     541                 :          0 :         crypto_caps = rte_tel_data_alloc();
     542         [ #  # ]:          0 :         RTE_PTR_OR_ERR_RET(crypto_caps, -ENOMEM);
     543                 :            : 
     544                 :          0 :         rte_tel_data_start_dict(d);
     545                 :          0 :         crypto_caps_n = crypto_caps_array(crypto_caps, capabilities->crypto_capabilities);
     546                 :            : 
     547                 :          0 :         rte_tel_data_add_dict_container(d, "crypto_caps", crypto_caps, 0);
     548                 :          0 :         rte_tel_data_add_dict_int(d, "crypto_caps_n", crypto_caps_n);
     549                 :            : 
     550                 :          0 :         return 0;
     551                 :            : }
     552                 :            : 
     553                 :        252 : RTE_INIT(security_init_telemetry)
     554                 :            : {
     555                 :        252 :         rte_telemetry_register_cmd("/security/cryptodev/list",
     556                 :            :                 security_handle_cryptodev_list,
     557                 :            :                 "Returns list of available crypto devices by IDs. No parameters.");
     558                 :            : 
     559                 :        252 :         rte_telemetry_register_cmd("/security/cryptodev/sec_caps",
     560                 :            :                 security_handle_cryptodev_sec_caps,
     561                 :            :                 "Returns security capabilities for a cryptodev. Parameters: int dev_id");
     562                 :            : 
     563                 :        252 :         rte_telemetry_register_cmd("/security/cryptodev/crypto_caps",
     564                 :            :                 security_handle_cryptodev_crypto_caps,
     565                 :            :                 "Returns crypto capabilities for a security capability. Parameters: int dev_id, sec_cap_id");
     566                 :        252 : }

Generated by: LCOV version 1.14