| 2069 | } |
| 2070 | |
| 2071 | void * |
| 2072 | rte_cryptodev_sym_session_create(uint8_t dev_id, |
| 2073 | struct rte_crypto_sym_xform *xforms, |
| 2074 | struct rte_mempool *mp) |
| 2075 | { |
| 2076 | struct rte_cryptodev *dev; |
| 2077 | struct rte_cryptodev_sym_session *sess; |
| 2078 | struct rte_cryptodev_sym_session_pool_private_data *pool_priv; |
| 2079 | uint32_t sess_priv_sz; |
| 2080 | int ret; |
| 2081 | |
| 2082 | if (!rte_cryptodev_is_valid_dev(dev_id)) { |
| 2083 | CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id); |
| 2084 | rte_errno = EINVAL; |
| 2085 | return NULL; |
| 2086 | } |
| 2087 | |
| 2088 | if (xforms == NULL) { |
| 2089 | CDEV_LOG_ERR("Invalid xform"); |
| 2090 | rte_errno = EINVAL; |
| 2091 | return NULL; |
| 2092 | } |
| 2093 | |
| 2094 | sess_priv_sz = rte_cryptodev_sym_get_private_session_size(dev_id); |
| 2095 | if (!rte_cryptodev_sym_is_valid_session_pool(mp, sess_priv_sz)) { |
| 2096 | CDEV_LOG_ERR("Invalid mempool"); |
| 2097 | rte_errno = EINVAL; |
| 2098 | return NULL; |
| 2099 | } |
| 2100 | |
| 2101 | dev = rte_cryptodev_pmd_get_dev(dev_id); |
| 2102 | |
| 2103 | /* Allocate a session structure from the session pool */ |
| 2104 | if (rte_mempool_get(mp, (void **)&sess)) { |
| 2105 | CDEV_LOG_ERR("couldn't get object from session mempool"); |
| 2106 | rte_errno = ENOMEM; |
| 2107 | return NULL; |
| 2108 | } |
| 2109 | |
| 2110 | pool_priv = rte_mempool_get_priv(mp); |
| 2111 | sess->driver_id = dev->driver_id; |
| 2112 | sess->sess_data_sz = pool_priv->sess_data_sz; |
| 2113 | sess->user_data_sz = pool_priv->user_data_sz; |
| 2114 | sess->driver_priv_data_iova = rte_mempool_virt2iova(sess) + |
| 2115 | offsetof(struct rte_cryptodev_sym_session, driver_priv_data); |
| 2116 | |
| 2117 | if (dev->dev_ops->sym_session_configure == NULL) { |
| 2118 | rte_errno = ENOTSUP; |
| 2119 | goto error_exit; |
| 2120 | } |
| 2121 | memset(sess->driver_priv_data, 0, pool_priv->sess_data_sz + pool_priv->user_data_sz); |
| 2122 | |
| 2123 | ret = dev->dev_ops->sym_session_configure(dev, xforms, sess); |
| 2124 | if (ret < 0) { |
| 2125 | rte_errno = -ret; |
| 2126 | goto error_exit; |
| 2127 | } |
| 2128 | sess->driver_id = dev->driver_id; |