dpdk: bump to dpdk 19.02
[vpp.git] / src / plugins / dpdk / ipsec / ipsec.c
index 1bd46d5..698f3b5 100644 (file)
 #include <vlib/node_funcs.h>
 
 #include <dpdk/device/dpdk.h>
+#include <dpdk/buffer.h>
 #include <dpdk/ipsec/ipsec.h>
 
 dpdk_crypto_main_t dpdk_crypto_main;
 
 #define EMPTY_STRUCT {0}
+#define NUM_CRYPTO_MBUFS 16384
 
 static void
 algos_init (u32 n_mains)
@@ -407,7 +409,7 @@ static void __attribute__ ((unused)) clear_and_free_obj (void *obj)
 {
   struct rte_mempool *mp = rte_mempool_from_obj (obj);
 
-  memset (obj, 0, mp->elt_size);
+  clib_memset (obj, 0, mp->elt_size);
 
   rte_mempool_put (mp, obj);
 }
@@ -417,7 +419,14 @@ static inline void *
 get_session_private_data (const struct rte_cryptodev_sym_session *sess,
                          uint8_t driver_id)
 {
+#if RTE_VERSION < RTE_VERSION_NUM(19, 2, 0, 0)
   return sess->sess_private_data[driver_id];
+#else
+  if (unlikely (sess->nb_drivers <= driver_id))
+    return 0;
+
+  return sess->sess_data[driver_id].data;
+#endif
 }
 
 /* This is from rte_cryptodev_pmd.h */
@@ -425,7 +434,13 @@ static inline void
 set_session_private_data (struct rte_cryptodev_sym_session *sess,
                          uint8_t driver_id, void *private_data)
 {
+#if RTE_VERSION < RTE_VERSION_NUM(19, 2, 0, 0)
   sess->sess_private_data[driver_id] = private_data;
+#else
+  if (unlikely (sess->nb_drivers <= driver_id))
+    return;
+  sess->sess_data[driver_id].data = private_data;
+#endif
 }
 
 static clib_error_t *
@@ -647,7 +662,11 @@ crypto_dev_conf (u8 dev, u16 n_qp, u8 numa)
   qp_conf.nb_descriptors = DPDK_CRYPTO_N_QUEUE_DESC;
   for (qp = 0; qp < n_qp; qp++)
     {
+#if RTE_VERSION < RTE_VERSION_NUM(19, 2, 0, 0)
       ret = rte_cryptodev_queue_pair_setup (dev, qp, &qp_conf, numa, NULL);
+#else
+      ret = rte_cryptodev_queue_pair_setup (dev, qp, &qp_conf, numa);
+#endif
       if (ret < 0)
        return clib_error_return (0, error_str, dev, qp);
     }
@@ -704,7 +723,7 @@ crypto_scan_devs (u32 n_mains)
          continue;
        }
 
-      max_res_idx = (dev->max_qp / 2) - 1;
+      max_res_idx = dev->max_qp - 1;
 
       vec_validate (dev->free_resources, max_res_idx);
 
@@ -713,13 +732,13 @@ crypto_scan_devs (u32 n_mains)
                                       (crypto_resource_t) EMPTY_STRUCT,
                                       CLIB_CACHE_LINE_BYTES);
 
-      for (j = 0; j <= max_res_idx; j++, res_idx++)
+      for (j = 0; j <= max_res_idx; j++)
        {
-         vec_elt (dev->free_resources, max_res_idx - j) = res_idx;
-         res = &dcm->resource[res_idx];
+         vec_elt (dev->free_resources, max_res_idx - j) = res_idx + j;
+         res = &dcm->resource[res_idx + j];
          res->dev_id = i;
          res->drv_id = drv_id;
-         res->qp_id = j * 2;
+         res->qp_id = j;
          res->numa = dev->numa;
          res->thread_idx = (u16) ~ 0;
        }
@@ -826,8 +845,6 @@ crypto_create_crypto_op_pool (vlib_main_t * vm, u8 numa)
   u32 pool_priv_size = sizeof (struct rte_crypto_op_pool_private);
   struct rte_crypto_op_pool_private *priv;
   struct rte_mempool *mp;
-  clib_error_t *error = NULL;
-  vlib_physmem_region_index_t pri;
 
   data = vec_elt_at_index (dcm->data, numa);
 
@@ -837,23 +854,23 @@ crypto_create_crypto_op_pool (vlib_main_t * vm, u8 numa)
 
   pool_name = format (0, "crypto_pool_numa%u%c", numa, 0);
 
-  error =
-    dpdk_pool_create (vm, pool_name, crypto_op_len (), conf->num_mbufs,
-                     pool_priv_size, 512, numa, &mp, &pri);
+  if (conf->num_crypto_mbufs == 0)
+    conf->num_crypto_mbufs = NUM_CRYPTO_MBUFS;
+
+  mp = rte_mempool_create ((char *) pool_name, conf->num_crypto_mbufs,
+                          crypto_op_len (), 512, pool_priv_size, NULL, NULL,
+                          crypto_op_init, NULL, numa, 0);
 
   vec_free (pool_name);
 
-  if (error)
-    return error;
+  if (!mp)
+    return clib_error_return (0, "failed to create crypto op mempool");
 
   /* Initialize mempool private data */
   priv = rte_mempool_get_priv (mp);
   priv->priv_size = pool_priv_size;
   priv->type = RTE_CRYPTO_OP_TYPE_SYMMETRIC;
 
-  /* call the object initializers */
-  rte_mempool_obj_iter (mp, crypto_op_init, 0);
-
   data->crypto_op = mp;
 
   return NULL;
@@ -866,8 +883,6 @@ crypto_create_session_h_pool (vlib_main_t * vm, u8 numa)
   crypto_data_t *data;
   u8 *pool_name;
   struct rte_mempool *mp;
-  clib_error_t *error = NULL;
-  vlib_physmem_region_index_t pri;
   u32 elt_size;
 
   data = vec_elt_at_index (dcm->data, numa);
@@ -880,14 +895,14 @@ crypto_create_session_h_pool (vlib_main_t * vm, u8 numa)
 
   elt_size = rte_cryptodev_sym_get_header_session_size ();
 
-  error =
-    dpdk_pool_create (vm, pool_name, elt_size, DPDK_CRYPTO_NB_SESS_OBJS,
-                     0, 512, numa, &mp, &pri);
+  mp =
+    rte_mempool_create ((char *) pool_name, DPDK_CRYPTO_NB_SESS_OBJS,
+                       elt_size, 512, 0, NULL, NULL, NULL, NULL, numa, 0);
 
   vec_free (pool_name);
 
-  if (error)
-    return error;
+  if (!mp)
+    return clib_error_return (0, "failed to create crypto session mempool");
 
   data->session_h = mp;
 
@@ -901,8 +916,6 @@ crypto_create_session_drv_pool (vlib_main_t * vm, crypto_dev_t * dev)
   crypto_data_t *data;
   u8 *pool_name;
   struct rte_mempool *mp;
-  clib_error_t *error = NULL;
-  vlib_physmem_region_index_t pri;
   u32 elt_size;
   u8 numa = dev->numa;
 
@@ -919,15 +932,14 @@ crypto_create_session_drv_pool (vlib_main_t * vm, crypto_dev_t * dev)
   pool_name = format (0, "session_drv%u_pool_numa%u%c", dev->drv_id, numa, 0);
 
   elt_size = rte_cryptodev_sym_get_private_session_size (dev->id);
-
-  error =
-    dpdk_pool_create (vm, pool_name, elt_size, DPDK_CRYPTO_NB_SESS_OBJS,
-                     0, 512, numa, &mp, &pri);
+  mp =
+    rte_mempool_create ((char *) pool_name, DPDK_CRYPTO_NB_SESS_OBJS,
+                       elt_size, 512, 0, NULL, NULL, NULL, NULL, numa, 0);
 
   vec_free (pool_name);
 
-  if (error)
-    return error;
+  if (!mp)
+    return clib_error_return (0, "failed to create session drv mempool");
 
   data->session_drv[dev->drv_id] = mp;
   clib_spinlock_init (&data->lockp);
@@ -1031,9 +1043,9 @@ dpdk_ipsec_process (vlib_main_t * vm, vlib_node_runtime_t * rt,
     {
       vec_validate_init_empty_aligned (cwm->ops, VLIB_FRAME_SIZE - 1, 0,
                                       CLIB_CACHE_LINE_BYTES);
-      memset (cwm->cipher_resource_idx, ~0,
+      clib_memset (cwm->cipher_resource_idx, ~0,
              IPSEC_CRYPTO_N_ALG * sizeof(*cwm->cipher_resource_idx));
-      memset (cwm->auth_resource_idx, ~0,
+      clib_memset (cwm->auth_resource_idx, ~0,
              IPSEC_INTEG_N_ALG * sizeof(*cwm->auth_resource_idx));
     }
   /* *INDENT-ON* */
@@ -1048,45 +1060,18 @@ dpdk_ipsec_process (vlib_main_t * vm, vlib_node_runtime_t * rt,
       return 0;
     }
 
-  /* Add new next node and set it as default */
-  vlib_node_t *node, *next_node;
-
-  next_node = vlib_get_node_by_name (vm, (u8 *) "dpdk-esp4-encrypt");
-  ASSERT (next_node);
-  node = vlib_get_node_by_name (vm, (u8 *) "ipsec4-output");
-  ASSERT (node);
-  im->esp4_encrypt_node_index = next_node->index;
-  im->esp4_encrypt_next_index =
-    vlib_node_add_next (vm, node->index, next_node->index);
-
-  next_node = vlib_get_node_by_name (vm, (u8 *) "dpdk-esp4-decrypt");
-  ASSERT (next_node);
-  node = vlib_get_node_by_name (vm, (u8 *) "ipsec4-input");
-  ASSERT (node);
-  im->esp4_decrypt_node_index = next_node->index;
-  im->esp4_decrypt_next_index =
-    vlib_node_add_next (vm, node->index, next_node->index);
-
-  next_node = vlib_get_node_by_name (vm, (u8 *) "dpdk-esp6-encrypt");
-  ASSERT (next_node);
-  node = vlib_get_node_by_name (vm, (u8 *) "ipsec6-output");
-  ASSERT (node);
-  im->esp6_encrypt_node_index = next_node->index;
-  im->esp6_encrypt_next_index =
-    vlib_node_add_next (vm, node->index, next_node->index);
-
-  next_node = vlib_get_node_by_name (vm, (u8 *) "dpdk-esp6-decrypt");
-  ASSERT (next_node);
-  node = vlib_get_node_by_name (vm, (u8 *) "ipsec6-input");
-  ASSERT (node);
-  im->esp6_decrypt_node_index = next_node->index;
-  im->esp6_decrypt_next_index =
-    vlib_node_add_next (vm, node->index, next_node->index);
 
-  im->cb.check_support_cb = dpdk_ipsec_check_support;
-  im->cb.add_del_sa_sess_cb = add_del_sa_session;
+  u32 idx = ipsec_register_esp_backend (vm, im, "dpdk backend",
+                                       "dpdk-esp4-encrypt",
+                                       "dpdk-esp4-decrypt",
+                                       "dpdk-esp6-encrypt",
+                                       "dpdk-esp6-decrypt",
+                                       dpdk_ipsec_check_support,
+                                       add_del_sa_session);
+  int rv = ipsec_select_esp_backend (im, idx);
+  ASSERT (rv == 0);
 
-  node = vlib_get_node_by_name (vm, (u8 *) "dpdk-crypto-input");
+  vlib_node_t *node = vlib_get_node_by_name (vm, (u8 *) "dpdk-crypto-input");
   ASSERT (node);
   for (i = skip_master; i < n_mains; i++)
     vlib_node_set_state (vlib_mains[i], node->index, VLIB_NODE_STATE_POLLING);