/* ... */
p.ring_size = IOAT_TEST_RINGSIZE;
- if (rte_rawdev_configure(dev_id, &info) != 0) {
+ if (rte_rawdev_configure(dev_id, &info, sizeof(p)) != 0) {
printf("Error with rte_rawdev_configure()\n");
return -1;
}
rte_mempool_set_ops_byname(conf.chunk_pool, rte_mbuf_platform_mempool_ops(), NULL);
rte_mempool_populate_default(conf.chunk_pool);
- rte_rawdev_configure(dev_id, (rte_rawdev_obj_t)&rdev_info);
+ rte_rawdev_configure(dev_id, (rte_rawdev_obj_t)&rdev_info, sizeof(conf));
Performing Data Transfer
------------------------
struct rte_rawdev_info rdev_info = {.dev_private = &config};
config.enqdeq_mpool = (void *)rte_mempool_create(...);
- rte_rawdev_configure(dev_id, (rte_rawdev_obj_t)&rdev_info);
+ rte_rawdev_configure(dev_id, (rte_rawdev_obj_t)&rdev_info,
+ sizeof(config));
Performing Data Transfer
------------------------
Also, make sure to start the actual text at the margin.
=======================================================
-* rawdev: Added a structure size parameter to the function
- ``rte_rawdev_info_get()``,
+* rawdev: Added a structure size parameter to the functions
+ ``rte_rawdev_info_get()`` and ``rte_rawdev_configure()``,
allowing limited driver type-checking and ABI compatibility.
* rawdev: Changed the return type of the function ``rte_dev_info_get()``
struct rte_ioat_rawdev_config dev_config = { .ring_size = ring_size };
struct rte_rawdev_info info = { .dev_private = &dev_config };
- if (rte_rawdev_configure(dev_id, &info) != 0) {
+ if (rte_rawdev_configure(dev_id, &info, sizeof(dev_config)) != 0) {
rte_exit(EXIT_FAILURE,
"Error with rte_rawdev_configure()\n");
}
static int
ifpga_rawdev_configure(const struct rte_rawdev *dev,
- rte_rawdev_obj_t config)
+ rte_rawdev_obj_t config,
+ size_t config_size __rte_unused)
{
IFPGA_RAWDEV_PMD_FUNC_TRACE();
#define COMPLETION_SZ sizeof(__m128i)
static int
-ioat_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
+ioat_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config,
+ size_t config_size)
{
struct rte_ioat_rawdev_config *params = config;
struct rte_ioat_rawdev *ioat = dev->dev_private;
if (dev->started)
return -EBUSY;
- if (params == NULL)
+ if (params == NULL || config_size != sizeof(*params))
return -EINVAL;
if (params->ring_size > 4096 || params->ring_size < 64 ||
}
p.ring_size = IOAT_TEST_RINGSIZE;
- if (rte_rawdev_configure(dev_id, &info) != 0) {
+ if (rte_rawdev_configure(dev_id, &info, sizeof(p)) != 0) {
printf("Error with rte_rawdev_configure()\n");
return -1;
}
}
static int
-ntb_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
+ntb_dev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config,
+ size_t config_size)
{
struct ntb_dev_config *conf = config;
struct ntb_hw *hw = dev->dev_private;
uint32_t xstats_num;
int ret;
+ if (conf == NULL || config_size != sizeof(*conf))
+ return -EINVAL;
+
hw->queue_pairs = conf->num_queues;
hw->queue_size = conf->queue_size;
hw->used_mw_num = conf->mz_num;
}
static int
-otx2_dpi_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
+otx2_dpi_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config,
+ size_t config_size)
{
struct dpi_rawdev_conf_s *conf = config;
struct dpi_vf_s *dpivf = NULL;
uintptr_t pool;
uint32_t gaura;
- if (conf == NULL) {
- otx2_dpi_dbg("NULL configuration");
+ if (conf == NULL || config_size != sizeof(*conf)) {
+ otx2_dpi_dbg("NULL or invalid configuration");
return -EINVAL;
}
dpivf = (struct dpi_vf_s *)dev->dev_private;
/* Configure rawdev ports */
conf.chunk_pool = dpi_create_mempool();
rdev_info.dev_private = &conf;
- ret = rte_rawdev_configure(i, (rte_rawdev_obj_t)&rdev_info);
+ ret = rte_rawdev_configure(i, (rte_rawdev_obj_t)&rdev_info,
+ sizeof(conf));
if (ret) {
otx2_dpi_dbg("Unable to configure DPIVF %d", i);
return -ENODEV;
}
static int
-sdp_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
+sdp_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config,
+ size_t config_size)
{
struct sdp_rawdev_info *app_info = (struct sdp_rawdev_info *)config;
struct sdp_device *sdpvf;
- if (app_info == NULL) {
- otx2_err("Application config info [NULL]");
+ if (app_info == NULL || config_size != sizeof(*app_info)) {
+ otx2_err("Application config info [NULL] or incorrect size");
return -EINVAL;
}
dev_info.dev_private = &app_info;
- ret = rte_rawdev_configure(dev_id, &dev_info);
+ ret = rte_rawdev_configure(dev_id, &dev_info, sizeof(app_info));
if (ret) {
otx2_err("Unable to configure SDP_VF %d", dev_id);
rte_mempool_free(ioq_mpool);
}
static int skeleton_rawdev_configure(const struct rte_rawdev *dev,
- rte_rawdev_obj_t config)
+ rte_rawdev_obj_t config,
+ size_t config_size)
{
struct skeleton_rawdev *skeldev;
struct skeleton_rawdev_conf *skeldev_conf;
RTE_FUNC_PTR_OR_ERR_RET(dev, -EINVAL);
- if (!config) {
+ if (config == NULL || config_size != sizeof(*skeldev_conf)) {
SKELETON_PMD_ERR("Invalid configuration");
return -EINVAL;
}
struct skeleton_rawdev_conf rdev_conf_get = {0};
/* Check invalid configuration */
- ret = rte_rawdev_configure(test_dev_id, NULL);
+ ret = rte_rawdev_configure(test_dev_id, NULL, 0);
RTE_TEST_ASSERT(ret == -EINVAL,
"Null configure; Expected -EINVAL, got %d", ret);
rdev_info.dev_private = &rdev_conf_set;
ret = rte_rawdev_configure(test_dev_id,
- (rte_rawdev_obj_t)&rdev_info);
+ (rte_rawdev_obj_t)&rdev_info,
+ sizeof(rdev_conf_set));
RTE_TEST_ASSERT_SUCCESS(ret, "Failed to configure rawdev (%d)", ret);
rdev_info.dev_private = &rdev_conf_get;
struct rte_ioat_rawdev_config dev_config = { .ring_size = ring_size };
struct rte_rawdev_info info = { .dev_private = &dev_config };
- if (rte_rawdev_configure(dev_id, &info) != 0) {
+ if (rte_rawdev_configure(dev_id, &info, sizeof(dev_config)) != 0) {
rte_exit(EXIT_FAILURE,
"Error with rte_rawdev_configure()\n");
}
ntb_conf.num_queues = num_queues;
ntb_conf.queue_size = nb_desc;
ntb_rawdev_conf.dev_private = (rte_rawdev_obj_t)(&ntb_conf);
- ret = rte_rawdev_configure(dev_id, &ntb_rawdev_conf);
+ ret = rte_rawdev_configure(dev_id, &ntb_rawdev_conf, sizeof(ntb_conf));
if (ret)
rte_exit(EXIT_FAILURE, "Can't config ntb dev: err=%d, "
"port=%u\n", ret, dev_id);
}
int
-rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf)
+rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf,
+ size_t dev_private_size)
{
struct rte_rawdev *dev;
int diag;
}
/* Configure the device */
- diag = (*dev->dev_ops->dev_configure)(dev, dev_conf->dev_private);
+ diag = (*dev->dev_ops->dev_configure)(dev, dev_conf->dev_private,
+ dev_private_size);
if (diag != 0)
RTE_RDEV_ERR("dev%d dev_configure = %d", dev_id, diag);
else
* driver/implementation can use to configure the device. It is also assumed
* that once the configuration is done, a `queue_id` type field can be used
* to refer to some arbitrary internal representation of a queue.
+ * @param dev_private_size
+ * The length of the memory space pointed to by dev_private in dev_info.
+ * This should be set to the size of the expected private structure to be
+ * used by the driver, and may be checked by drivers to ensure the expected
+ * struct type is provided.
*
* @return
* - 0: Success, device configured.
* - <0: Error code returned by the driver configuration function.
*/
int
-rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf);
+rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf,
+ size_t dev_private_size);
/**
* Returns 0 on success
*/
typedef int (*rawdev_configure_t)(const struct rte_rawdev *dev,
- rte_rawdev_obj_t config);
+ rte_rawdev_obj_t config,
+ size_t config_size);
/**
* Start a configured device.