1c75542aeSFan Zhang /* SPDX-License-Identifier: BSD-3-Clause 2c75542aeSFan Zhang * Copyright(c) 2021 Intel Corporation 3c75542aeSFan Zhang */ 4c75542aeSFan Zhang 5c75542aeSFan Zhang #include <string.h> 6b35848bcSKai Ji #include <unistd.h> 7c75542aeSFan Zhang 8c75542aeSFan Zhang #include <rte_common.h> 9c75542aeSFan Zhang #include <rte_malloc.h> 10f59851e0SStephen Hemminger #include <rte_log.h> 11c75542aeSFan Zhang 12c75542aeSFan Zhang #include "ipsec_mb_private.h" 13c75542aeSFan Zhang 14c75542aeSFan Zhang /** Configure device */ 15c75542aeSFan Zhang int 16c75542aeSFan Zhang ipsec_mb_config(__rte_unused struct rte_cryptodev *dev, 17c75542aeSFan Zhang __rte_unused struct rte_cryptodev_config *config) 18c75542aeSFan Zhang { 19c75542aeSFan Zhang return 0; 20c75542aeSFan Zhang } 21c75542aeSFan Zhang 22c75542aeSFan Zhang /** Start device */ 23c75542aeSFan Zhang int 24c75542aeSFan Zhang ipsec_mb_start(__rte_unused struct rte_cryptodev *dev) 25c75542aeSFan Zhang { 26c75542aeSFan Zhang return 0; 27c75542aeSFan Zhang } 28c75542aeSFan Zhang 29c75542aeSFan Zhang /** Stop device */ 30c75542aeSFan Zhang void 31c75542aeSFan Zhang ipsec_mb_stop(__rte_unused struct rte_cryptodev *dev) 32c75542aeSFan Zhang { 33c75542aeSFan Zhang } 34c75542aeSFan Zhang 35c75542aeSFan Zhang /** Close device */ 36c75542aeSFan Zhang int 37c75542aeSFan Zhang ipsec_mb_close(__rte_unused struct rte_cryptodev *dev) 38c75542aeSFan Zhang { 39c75542aeSFan Zhang return 0; 40c75542aeSFan Zhang } 41c75542aeSFan Zhang 42c75542aeSFan Zhang /** Get device statistics */ 43c75542aeSFan Zhang void 44c75542aeSFan Zhang ipsec_mb_stats_get(struct rte_cryptodev *dev, 45c75542aeSFan Zhang struct rte_cryptodev_stats *stats) 46c75542aeSFan Zhang { 47c75542aeSFan Zhang int qp_id; 48c75542aeSFan Zhang 49c75542aeSFan Zhang for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) { 50c75542aeSFan Zhang struct ipsec_mb_qp *qp = dev->data->queue_pairs[qp_id]; 51c75542aeSFan Zhang if (qp == NULL) { 52c75542aeSFan Zhang IPSEC_MB_LOG(DEBUG, "Uninitialised qp %d", qp_id); 53c75542aeSFan Zhang continue; 54c75542aeSFan Zhang } 55c75542aeSFan Zhang 56c75542aeSFan Zhang stats->enqueued_count += qp->stats.enqueued_count; 57c75542aeSFan Zhang stats->dequeued_count += qp->stats.dequeued_count; 58c75542aeSFan Zhang 59c75542aeSFan Zhang stats->enqueue_err_count += qp->stats.enqueue_err_count; 60c75542aeSFan Zhang stats->dequeue_err_count += qp->stats.dequeue_err_count; 61c75542aeSFan Zhang } 62c75542aeSFan Zhang } 63c75542aeSFan Zhang 64c75542aeSFan Zhang /** Reset device statistics */ 65c75542aeSFan Zhang void 66c75542aeSFan Zhang ipsec_mb_stats_reset(struct rte_cryptodev *dev) 67c75542aeSFan Zhang { 68c75542aeSFan Zhang int qp_id; 69c75542aeSFan Zhang 70c75542aeSFan Zhang for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) { 71c75542aeSFan Zhang struct ipsec_mb_qp *qp = dev->data->queue_pairs[qp_id]; 72c75542aeSFan Zhang 73c75542aeSFan Zhang memset(&qp->stats, 0, sizeof(qp->stats)); 74c75542aeSFan Zhang } 75c75542aeSFan Zhang } 76c75542aeSFan Zhang 77c75542aeSFan Zhang /** Get device info */ 78c75542aeSFan Zhang void 79c75542aeSFan Zhang ipsec_mb_info_get(struct rte_cryptodev *dev, 80c75542aeSFan Zhang struct rte_cryptodev_info *dev_info) 81c75542aeSFan Zhang { 82c75542aeSFan Zhang struct ipsec_mb_dev_private *internals = dev->data->dev_private; 83c75542aeSFan Zhang struct ipsec_mb_internals *pmd_info = 84c75542aeSFan Zhang &ipsec_mb_pmds[internals->pmd_type]; 85c75542aeSFan Zhang 86c75542aeSFan Zhang if (dev_info != NULL) { 87c75542aeSFan Zhang dev_info->driver_id = dev->driver_id; 88c75542aeSFan Zhang dev_info->feature_flags = dev->feature_flags; 89c75542aeSFan Zhang dev_info->capabilities = pmd_info->caps; 90c75542aeSFan Zhang dev_info->max_nb_queue_pairs = internals->max_nb_queue_pairs; 91c75542aeSFan Zhang /* No limit of number of sessions */ 92c75542aeSFan Zhang dev_info->sym.max_nb_sessions = 0; 93c75542aeSFan Zhang } 94c75542aeSFan Zhang } 95c75542aeSFan Zhang 96b35848bcSKai Ji static int 97b35848bcSKai Ji ipsec_mb_secondary_qp_op(int dev_id, int qp_id, 98b35848bcSKai Ji const struct rte_cryptodev_qp_conf *qp_conf, 99b35848bcSKai Ji int socket_id, enum ipsec_mb_mp_req_type op_type) 100b35848bcSKai Ji { 101b35848bcSKai Ji int ret; 102b35848bcSKai Ji struct rte_mp_msg qp_req_msg; 103b35848bcSKai Ji struct rte_mp_msg *qp_resp_msg; 104b35848bcSKai Ji struct rte_mp_reply qp_resp; 105b35848bcSKai Ji struct ipsec_mb_mp_param *req_param; 106b35848bcSKai Ji struct ipsec_mb_mp_param *resp_param; 107b35848bcSKai Ji struct timespec ts = {.tv_sec = 1, .tv_nsec = 0}; 108b35848bcSKai Ji 109b35848bcSKai Ji memset(&qp_req_msg, 0, sizeof(IPSEC_MB_MP_MSG)); 110b35848bcSKai Ji memcpy(qp_req_msg.name, IPSEC_MB_MP_MSG, sizeof(IPSEC_MB_MP_MSG)); 111b35848bcSKai Ji req_param = (struct ipsec_mb_mp_param *)&qp_req_msg.param; 112b35848bcSKai Ji 113b35848bcSKai Ji qp_req_msg.len_param = sizeof(struct ipsec_mb_mp_param); 114b35848bcSKai Ji req_param->type = op_type; 115b35848bcSKai Ji req_param->dev_id = dev_id; 116b35848bcSKai Ji req_param->qp_id = qp_id; 117b35848bcSKai Ji req_param->socket_id = socket_id; 118b35848bcSKai Ji req_param->process_id = getpid(); 119b35848bcSKai Ji if (qp_conf) { 120b35848bcSKai Ji req_param->nb_descriptors = qp_conf->nb_descriptors; 121b35848bcSKai Ji req_param->mp_session = (void *)qp_conf->mp_session; 122b35848bcSKai Ji } 123b35848bcSKai Ji 124b35848bcSKai Ji qp_req_msg.num_fds = 0; 125b35848bcSKai Ji ret = rte_mp_request_sync(&qp_req_msg, &qp_resp, &ts); 126b35848bcSKai Ji if (ret) { 127f59851e0SStephen Hemminger IPSEC_MB_LOG(ERR, "Create MR request to primary process failed."); 128b35848bcSKai Ji return -1; 129b35848bcSKai Ji } 130b35848bcSKai Ji qp_resp_msg = &qp_resp.msgs[0]; 131b35848bcSKai Ji resp_param = (struct ipsec_mb_mp_param *)qp_resp_msg->param; 132b35848bcSKai Ji 133b35848bcSKai Ji return resp_param->result; 134b35848bcSKai Ji } 135b35848bcSKai Ji 136c75542aeSFan Zhang /** Release queue pair */ 137c75542aeSFan Zhang int 138c75542aeSFan Zhang ipsec_mb_qp_release(struct rte_cryptodev *dev, uint16_t qp_id) 139c75542aeSFan Zhang { 140c75542aeSFan Zhang struct ipsec_mb_qp *qp = dev->data->queue_pairs[qp_id]; 141c75542aeSFan Zhang 14216d6ebb6SKai Ji if (!qp) 143b35848bcSKai Ji return 0; 144b35848bcSKai Ji 145b35848bcSKai Ji if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 1462245ccf7SStephen Hemminger rte_ring_free(rte_ring_lookup(qp->name)); 14772a16927SCiara Power 14872a16927SCiara Power if (qp->mb_mgr_mz) { 14972a16927SCiara Power rte_memzone_free(qp->mb_mgr_mz); 15072a16927SCiara Power qp->mb_mgr = NULL; 15172a16927SCiara Power } 152c75542aeSFan Zhang rte_free(qp); 153c75542aeSFan Zhang dev->data->queue_pairs[qp_id] = NULL; 154b35848bcSKai Ji } else { /* secondary process */ 155b35848bcSKai Ji return ipsec_mb_secondary_qp_op(dev->data->dev_id, qp_id, 156b35848bcSKai Ji NULL, 0, RTE_IPSEC_MB_MP_REQ_QP_FREE); 157c75542aeSFan Zhang } 158c75542aeSFan Zhang return 0; 159c75542aeSFan Zhang } 160c75542aeSFan Zhang 161c75542aeSFan Zhang /** Set a unique name for the queue pair */ 162c75542aeSFan Zhang int 163c75542aeSFan Zhang ipsec_mb_qp_set_unique_name(struct rte_cryptodev *dev, 164c75542aeSFan Zhang struct ipsec_mb_qp *qp) 165c75542aeSFan Zhang { 166c75542aeSFan Zhang uint32_t n = 167c75542aeSFan Zhang snprintf(qp->name, sizeof(qp->name), "ipsec_mb_pmd_%u_qp_%u", 168c75542aeSFan Zhang dev->data->dev_id, qp->id); 169c75542aeSFan Zhang 170c75542aeSFan Zhang if (n >= sizeof(qp->name)) 171c75542aeSFan Zhang return -1; 172c75542aeSFan Zhang 173c75542aeSFan Zhang return 0; 174c75542aeSFan Zhang } 175c75542aeSFan Zhang 176c75542aeSFan Zhang /** Create a ring to place processed operations on */ 177c75542aeSFan Zhang static struct rte_ring 178c75542aeSFan Zhang *ipsec_mb_qp_create_processed_ops_ring( 179c75542aeSFan Zhang struct ipsec_mb_qp *qp, unsigned int ring_size, int socket_id) 180c75542aeSFan Zhang { 181c75542aeSFan Zhang struct rte_ring *r; 182c75542aeSFan Zhang char ring_name[RTE_CRYPTODEV_NAME_MAX_LEN]; 183c75542aeSFan Zhang 184c75542aeSFan Zhang unsigned int n = rte_strlcpy(ring_name, qp->name, sizeof(ring_name)); 185c75542aeSFan Zhang 186c75542aeSFan Zhang if (n >= sizeof(ring_name)) 187c75542aeSFan Zhang return NULL; 188c75542aeSFan Zhang 189c75542aeSFan Zhang r = rte_ring_lookup(ring_name); 190c75542aeSFan Zhang if (r) { 191c75542aeSFan Zhang if (rte_ring_get_size(r) >= ring_size) { 192c75542aeSFan Zhang IPSEC_MB_LOG( 193c75542aeSFan Zhang INFO, "Reusing existing ring %s for processed ops", 194c75542aeSFan Zhang ring_name); 195c75542aeSFan Zhang return r; 196c75542aeSFan Zhang } 197c75542aeSFan Zhang IPSEC_MB_LOG( 198c75542aeSFan Zhang ERR, "Unable to reuse existing ring %s for processed ops", 199c75542aeSFan Zhang ring_name); 200c75542aeSFan Zhang return NULL; 201c75542aeSFan Zhang } 202c75542aeSFan Zhang 203c75542aeSFan Zhang return rte_ring_create(ring_name, ring_size, socket_id, 204c75542aeSFan Zhang RING_F_SP_ENQ | RING_F_SC_DEQ); 205c75542aeSFan Zhang } 206c75542aeSFan Zhang 20772a16927SCiara Power static IMB_MGR * 20872a16927SCiara Power ipsec_mb_alloc_mgr_from_memzone(const struct rte_memzone **mb_mgr_mz, 20972a16927SCiara Power const char *mb_mgr_mz_name) 21072a16927SCiara Power { 21172a16927SCiara Power IMB_MGR *mb_mgr; 21272a16927SCiara Power 21372a16927SCiara Power if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 21472a16927SCiara Power *mb_mgr_mz = rte_memzone_lookup(mb_mgr_mz_name); 21572a16927SCiara Power if (*mb_mgr_mz == NULL) { 21672a16927SCiara Power *mb_mgr_mz = rte_memzone_reserve(mb_mgr_mz_name, 21772a16927SCiara Power imb_get_mb_mgr_size(), 21872a16927SCiara Power rte_socket_id(), 0); 21972a16927SCiara Power } 22072a16927SCiara Power if (*mb_mgr_mz == NULL) { 22172a16927SCiara Power IPSEC_MB_LOG(DEBUG, "Error allocating memzone for %s", 22272a16927SCiara Power mb_mgr_mz_name); 22372a16927SCiara Power return NULL; 22472a16927SCiara Power } 22572a16927SCiara Power mb_mgr = imb_set_pointers_mb_mgr((*mb_mgr_mz)->addr, 0, 1); 22672a16927SCiara Power init_mb_mgr_auto(mb_mgr, NULL); 22772a16927SCiara Power } else { 22872a16927SCiara Power *mb_mgr_mz = rte_memzone_lookup(mb_mgr_mz_name); 22972a16927SCiara Power if (*mb_mgr_mz == NULL) { 23072a16927SCiara Power IPSEC_MB_LOG(ERR, 23172a16927SCiara Power "Secondary can't find %s mz, did primary create it?", 23272a16927SCiara Power mb_mgr_mz_name); 23372a16927SCiara Power return NULL; 23472a16927SCiara Power } 23572a16927SCiara Power mb_mgr = imb_set_pointers_mb_mgr((*mb_mgr_mz)->addr, 0, 0); 23672a16927SCiara Power } 23772a16927SCiara Power return mb_mgr; 23872a16927SCiara Power } 23972a16927SCiara Power 240c75542aeSFan Zhang /** Setup a queue pair */ 241c75542aeSFan Zhang int 242c75542aeSFan Zhang ipsec_mb_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id, 243c75542aeSFan Zhang const struct rte_cryptodev_qp_conf *qp_conf, 244c75542aeSFan Zhang int socket_id) 245c75542aeSFan Zhang { 246c75542aeSFan Zhang struct ipsec_mb_qp *qp = NULL; 247c75542aeSFan Zhang struct ipsec_mb_dev_private *internals = dev->data->dev_private; 248c75542aeSFan Zhang struct ipsec_mb_internals *pmd_data = 249c75542aeSFan Zhang &ipsec_mb_pmds[internals->pmd_type]; 250c75542aeSFan Zhang uint32_t qp_size; 251c75542aeSFan Zhang int ret; 252c75542aeSFan Zhang 25372a16927SCiara Power if (rte_eal_process_type() == RTE_PROC_SECONDARY) { 25472a16927SCiara Power qp = dev->data->queue_pairs[qp_id]; 255f51e40d1SCiara Power if (qp == NULL) { 256b35848bcSKai Ji IPSEC_MB_LOG(DEBUG, "Secondary process setting up device qp."); 257b35848bcSKai Ji return ipsec_mb_secondary_qp_op(dev->data->dev_id, qp_id, 258b35848bcSKai Ji qp_conf, socket_id, RTE_IPSEC_MB_MP_REQ_QP_SET); 259f51e40d1SCiara Power } 26072a16927SCiara Power } else { 261c75542aeSFan Zhang /* Free memory prior to re-allocation if needed. */ 262c75542aeSFan Zhang if (dev->data->queue_pairs[qp_id] != NULL) 263c75542aeSFan Zhang ipsec_mb_qp_release(dev, qp_id); 264c75542aeSFan Zhang 265c75542aeSFan Zhang qp_size = sizeof(*qp) + pmd_data->qp_priv_size; 266c75542aeSFan Zhang /* Allocate the queue pair data structure. */ 267c75542aeSFan Zhang qp = rte_zmalloc_socket("IPSEC PMD Queue Pair", qp_size, 268c75542aeSFan Zhang RTE_CACHE_LINE_SIZE, socket_id); 269c75542aeSFan Zhang if (qp == NULL) 270c75542aeSFan Zhang return -ENOMEM; 27172a16927SCiara Power } 27272a16927SCiara Power 27372a16927SCiara Power char mz_name[IPSEC_MB_MAX_MZ_NAME]; 27472a16927SCiara Power snprintf(mz_name, sizeof(mz_name), "IMB_MGR_DEV_%d_QP_%d", 27572a16927SCiara Power dev->data->dev_id, qp_id); 27672a16927SCiara Power qp->mb_mgr = ipsec_mb_alloc_mgr_from_memzone(&(qp->mb_mgr_mz), 27772a16927SCiara Power mz_name); 27872a16927SCiara Power if (qp->mb_mgr == NULL) { 27972a16927SCiara Power ret = -ENOMEM; 28072a16927SCiara Power goto qp_setup_cleanup; 28172a16927SCiara Power } 28272a16927SCiara Power 28372a16927SCiara Power if (rte_eal_process_type() == RTE_PROC_SECONDARY) 28472a16927SCiara Power return 0; 285c75542aeSFan Zhang 286c75542aeSFan Zhang qp->id = qp_id; 287c75542aeSFan Zhang dev->data->queue_pairs[qp_id] = qp; 288c75542aeSFan Zhang if (ipsec_mb_qp_set_unique_name(dev, qp)) { 289c75542aeSFan Zhang ret = -EINVAL; 290c75542aeSFan Zhang goto qp_setup_cleanup; 291c75542aeSFan Zhang } 292c75542aeSFan Zhang 293c75542aeSFan Zhang qp->pmd_type = internals->pmd_type; 294c75542aeSFan Zhang qp->sess_mp = qp_conf->mp_session; 295c75542aeSFan Zhang 296c75542aeSFan Zhang qp->ingress_queue = ipsec_mb_qp_create_processed_ops_ring(qp, 297c75542aeSFan Zhang qp_conf->nb_descriptors, socket_id); 298c75542aeSFan Zhang if (qp->ingress_queue == NULL) { 299c75542aeSFan Zhang ret = -EINVAL; 300c75542aeSFan Zhang goto qp_setup_cleanup; 301c75542aeSFan Zhang } 302c75542aeSFan Zhang 303c75542aeSFan Zhang memset(&qp->stats, 0, sizeof(qp->stats)); 304c75542aeSFan Zhang 305c75542aeSFan Zhang if (pmd_data->queue_pair_configure) { 306c75542aeSFan Zhang ret = pmd_data->queue_pair_configure(qp); 307c75542aeSFan Zhang if (ret < 0) 308c75542aeSFan Zhang goto qp_setup_cleanup; 309c75542aeSFan Zhang } 310c75542aeSFan Zhang 311c75542aeSFan Zhang return 0; 312c75542aeSFan Zhang 313c75542aeSFan Zhang qp_setup_cleanup: 31472a16927SCiara Power if (rte_eal_process_type() == RTE_PROC_SECONDARY) 31572a16927SCiara Power return ret; 31672a16927SCiara Power rte_memzone_free(qp->mb_mgr_mz); 317c75542aeSFan Zhang rte_free(qp); 318c75542aeSFan Zhang return ret; 319c75542aeSFan Zhang } 320c75542aeSFan Zhang 321b35848bcSKai Ji int 322b35848bcSKai Ji ipsec_mb_ipc_request(const struct rte_mp_msg *mp_msg, const void *peer) 323b35848bcSKai Ji { 324b35848bcSKai Ji struct rte_mp_msg ipc_resp; 325b35848bcSKai Ji struct ipsec_mb_mp_param *resp_param = 326b35848bcSKai Ji (struct ipsec_mb_mp_param *)ipc_resp.param; 327b35848bcSKai Ji const struct ipsec_mb_mp_param *req_param = 328b35848bcSKai Ji (const struct ipsec_mb_mp_param *)mp_msg->param; 329b35848bcSKai Ji 330b35848bcSKai Ji int ret; 331b35848bcSKai Ji struct rte_cryptodev *dev; 332b35848bcSKai Ji struct ipsec_mb_qp *qp; 333b35848bcSKai Ji struct rte_cryptodev_qp_conf queue_conf; 334b35848bcSKai Ji int dev_id = req_param->dev_id; 335b35848bcSKai Ji int qp_id = req_param->qp_id; 336b35848bcSKai Ji 337b35848bcSKai Ji queue_conf.nb_descriptors = req_param->nb_descriptors; 338b35848bcSKai Ji queue_conf.mp_session = (struct rte_mempool *)req_param->mp_session; 339b35848bcSKai Ji memset(resp_param, 0, sizeof(struct ipsec_mb_mp_param)); 340b35848bcSKai Ji memcpy(ipc_resp.name, IPSEC_MB_MP_MSG, sizeof(IPSEC_MB_MP_MSG)); 341b35848bcSKai Ji 342b35848bcSKai Ji if (!rte_cryptodev_is_valid_dev(dev_id)) { 343b35848bcSKai Ji CDEV_LOG_ERR("Invalid dev_id=%d", dev_id); 344b35848bcSKai Ji goto out; 345b35848bcSKai Ji } 346b35848bcSKai Ji 347b35848bcSKai Ji dev = rte_cryptodev_pmd_get_dev(dev_id); 348b35848bcSKai Ji switch (req_param->type) { 349b35848bcSKai Ji case RTE_IPSEC_MB_MP_REQ_QP_SET: 350b35848bcSKai Ji qp = dev->data->queue_pairs[qp_id]; 351b35848bcSKai Ji if (qp) { 352b35848bcSKai Ji CDEV_LOG_DEBUG("qp %d on dev %d is initialised", qp_id, dev_id); 353b35848bcSKai Ji goto out; 354b35848bcSKai Ji } 355b35848bcSKai Ji 356b35848bcSKai Ji ret = ipsec_mb_qp_setup(dev, qp_id, &queue_conf, req_param->socket_id); 357b35848bcSKai Ji if (!ret) { 358b35848bcSKai Ji qp = dev->data->queue_pairs[qp_id]; 359b35848bcSKai Ji if (!qp) { 360b35848bcSKai Ji CDEV_LOG_DEBUG("qp %d on dev %d is not initialised", 361b35848bcSKai Ji qp_id, dev_id); 362b35848bcSKai Ji goto out; 363b35848bcSKai Ji } 364b35848bcSKai Ji qp->qp_used_by_pid = req_param->process_id; 365b35848bcSKai Ji } 366b35848bcSKai Ji resp_param->result = ret; 367b35848bcSKai Ji break; 368b35848bcSKai Ji case RTE_IPSEC_MB_MP_REQ_QP_FREE: 369b35848bcSKai Ji qp = dev->data->queue_pairs[qp_id]; 370b35848bcSKai Ji if (!qp) { 371b35848bcSKai Ji CDEV_LOG_DEBUG("qp %d on dev %d is not initialised", 372b35848bcSKai Ji qp_id, dev_id); 373b35848bcSKai Ji goto out; 374b35848bcSKai Ji } 375b35848bcSKai Ji 376b35848bcSKai Ji if (qp->qp_used_by_pid != req_param->process_id) { 377b35848bcSKai Ji CDEV_LOG_ERR("Unable to release qp_id=%d", qp_id); 378b35848bcSKai Ji goto out; 379b35848bcSKai Ji } 380b35848bcSKai Ji 381b35848bcSKai Ji qp->qp_used_by_pid = 0; 382b35848bcSKai Ji resp_param->result = ipsec_mb_qp_release(dev, qp_id); 383b35848bcSKai Ji break; 384b35848bcSKai Ji default: 385*ae282b06SDavid Marchand CDEV_LOG_ERR("invalid mp request type"); 386b35848bcSKai Ji } 387b35848bcSKai Ji 388b35848bcSKai Ji out: 389b35848bcSKai Ji ret = rte_mp_reply(&ipc_resp, peer); 390b35848bcSKai Ji return ret; 391b35848bcSKai Ji } 392b35848bcSKai Ji 393c75542aeSFan Zhang /** Return the size of the specific pmd session structure */ 394c75542aeSFan Zhang unsigned 395c75542aeSFan Zhang ipsec_mb_sym_session_get_size(struct rte_cryptodev *dev) 396c75542aeSFan Zhang { 397c75542aeSFan Zhang struct ipsec_mb_dev_private *internals = dev->data->dev_private; 398c75542aeSFan Zhang struct ipsec_mb_internals *pmd_data = 399c75542aeSFan Zhang &ipsec_mb_pmds[internals->pmd_type]; 400c75542aeSFan Zhang 401c75542aeSFan Zhang return pmd_data->session_priv_size; 402c75542aeSFan Zhang } 403c75542aeSFan Zhang 404c75542aeSFan Zhang /** Configure pmd specific multi-buffer session from a crypto xform chain */ 405c75542aeSFan Zhang int 406c75542aeSFan Zhang ipsec_mb_sym_session_configure( 407c75542aeSFan Zhang struct rte_cryptodev *dev, struct rte_crypto_sym_xform *xform, 408bdce2564SAkhil Goyal struct rte_cryptodev_sym_session *sess) 409c75542aeSFan Zhang { 410c75542aeSFan Zhang struct ipsec_mb_dev_private *internals = dev->data->dev_private; 411c75542aeSFan Zhang struct ipsec_mb_internals *pmd_data = 412c75542aeSFan Zhang &ipsec_mb_pmds[internals->pmd_type]; 413db7dc907SCiara Power struct ipsec_mb_qp *qp = dev->data->queue_pairs[0]; 414db7dc907SCiara Power IMB_MGR *mb_mgr; 415c75542aeSFan Zhang int ret = 0; 416c75542aeSFan Zhang 417db7dc907SCiara Power if (qp != NULL) 418db7dc907SCiara Power mb_mgr = qp->mb_mgr; 419db7dc907SCiara Power else 420db7dc907SCiara Power mb_mgr = alloc_init_mb_mgr(); 421db7dc907SCiara Power 422c75542aeSFan Zhang if (!mb_mgr) 423c75542aeSFan Zhang return -ENOMEM; 424c75542aeSFan Zhang 425c75542aeSFan Zhang if (unlikely(sess == NULL)) { 426c75542aeSFan Zhang IPSEC_MB_LOG(ERR, "invalid session struct"); 427db7dc907SCiara Power if (qp == NULL) 428c75542aeSFan Zhang free_mb_mgr(mb_mgr); 429c75542aeSFan Zhang return -EINVAL; 430c75542aeSFan Zhang } 431c75542aeSFan Zhang 432bdce2564SAkhil Goyal ret = (*pmd_data->session_configure)(mb_mgr, 4332a440d6aSAkhil Goyal CRYPTODEV_GET_SYM_SESS_PRIV(sess), xform); 434c75542aeSFan Zhang if (ret != 0) { 435c75542aeSFan Zhang IPSEC_MB_LOG(ERR, "failed configure session parameters"); 436c75542aeSFan Zhang 437c75542aeSFan Zhang /* Return session to mempool */ 438db7dc907SCiara Power if (qp == NULL) 439c75542aeSFan Zhang free_mb_mgr(mb_mgr); 440c75542aeSFan Zhang return ret; 441c75542aeSFan Zhang } 442c75542aeSFan Zhang 443db7dc907SCiara Power if (qp == NULL) 44472a16927SCiara Power free_mb_mgr(mb_mgr); 445c75542aeSFan Zhang return 0; 446c75542aeSFan Zhang } 447c75542aeSFan Zhang 448c75542aeSFan Zhang /** Clear the session memory */ 449c75542aeSFan Zhang void 450bdce2564SAkhil Goyal ipsec_mb_sym_session_clear(struct rte_cryptodev *dev __rte_unused, 451bdce2564SAkhil Goyal struct rte_cryptodev_sym_session *sess __rte_unused) 452bdce2564SAkhil Goyal {} 453