int n_type = 4; /* Representor types, VF, HPF@VF, SF and HPF@SF. */
int n_pf = 2; /* Number of PFs. */
int i = 0, pf;
+ int n_entries;
if (info == NULL)
goto out;
+
+ n_entries = n_type * n_pf;
+ if ((uint32_t)n_entries > info->nb_ranges_alloc)
+ n_entries = info->nb_ranges_alloc;
+
info->controller = 0;
info->pf = priv->pf_bond >= 0 ? priv->pf_bond : 0;
for (pf = 0; pf < n_pf; ++pf) {
snprintf(info->ranges[i].name,
sizeof(info->ranges[i].name), "pf%dvf", pf);
i++;
+ if (i == n_entries)
+ break;
/* HPF range of VF type. */
info->ranges[i].type = RTE_ETH_REPRESENTOR_VF;
info->ranges[i].controller = 0;
snprintf(info->ranges[i].name,
sizeof(info->ranges[i].name), "pf%dvf", pf);
i++;
+ if (i == n_entries)
+ break;
/* SF range. */
info->ranges[i].type = RTE_ETH_REPRESENTOR_SF;
info->ranges[i].controller = 0;
snprintf(info->ranges[i].name,
sizeof(info->ranges[i].name), "pf%dsf", pf);
i++;
+ if (i == n_entries)
+ break;
/* HPF range of SF type. */
info->ranges[i].type = RTE_ETH_REPRESENTOR_SF;
info->ranges[i].controller = 0;
snprintf(info->ranges[i].name,
sizeof(info->ranges[i].name), "pf%dsf", pf);
i++;
+ if (i == n_entries)
+ break;
}
+ info->nb_ranges = i;
out:
return n_type * n_pf;
}
int controller, int pf, int representor_port,
uint16_t *repr_id)
{
- int ret, n, i, count;
+ int ret, n, count;
+ uint32_t i;
struct rte_eth_representor_info *info = NULL;
size_t size;
info = calloc(1, size);
if (info == NULL)
return -ENOMEM;
+ info->nb_ranges_alloc = n;
ret = rte_eth_representor_info_get(ethdev->data->port_id, info);
if (ret < 0)
goto out;
/* Locate representor ID. */
ret = -ENOENT;
- for (i = 0; i < n; ++i) {
+ for (i = 0; i < info->nb_ranges; ++i) {
if (info->ranges[i].type != type)
continue;
if (info->ranges[i].controller != controller)
struct rte_eth_representor_info {
uint16_t controller; /**< Controller ID of caller device. */
uint16_t pf; /**< Physical function ID of caller device. */
+ uint32_t nb_ranges_alloc; /**< Size of the ranges array. */
+ uint32_t nb_ranges; /**< Number of initialized ranges. */
struct rte_eth_representor_range ranges[];/**< Representor ID range. */
};
* A pointer to a representor info structure.
* NULL to return number of range entries and allocate memory
* for next call to store detail.
+ * The number of ranges that were written into this structure
+ * will be placed into its nb_ranges field. This number cannot be
+ * larger than the nb_ranges_alloc that by the user before calling
+ * this function. It can be smaller than the value returned by the
+ * function, however.
* @return
* - (-ENOTSUP) if operation is not supported.
* - (-ENODEV) if *port_id* invalid.
* - (-EIO) if device is removed.
- * - (>=0) number of representor range entries supported by device.
+ * - (>=0) number of available representor range entries.
*/
__rte_experimental
int rte_eth_representor_info_get(uint16_t port_id,