TAILQ_HEAD(rte_devargs_list, rte_devargs);
/** Global list of user devices */
-struct rte_devargs_list devargs_list =
+static struct rte_devargs_list devargs_list =
TAILQ_HEAD_INITIALIZER(devargs_list);
static size_t
return strncmp(bus->name, name, strlen(bus->name));
}
-__rte_experimental
int
rte_devargs_parse(struct rte_devargs *da, const char *dev)
{
return 0;
}
-__rte_experimental
int
rte_devargs_parsef(struct rte_devargs *da, const char *format, ...)
{
va_list ap;
size_t len;
char *dev;
+ int ret;
if (da == NULL)
return -EINVAL;
vsnprintf(dev, len + 1, format, ap);
va_end(ap);
- return rte_devargs_parse(da, dev);
+ ret = rte_devargs_parse(da, dev);
+
+ free(dev);
+ return ret;
}
-int __rte_experimental
-rte_devargs_insert(struct rte_devargs *da)
+int
+rte_devargs_insert(struct rte_devargs **da)
{
- int ret;
+ struct rte_devargs *listed_da;
+ void *tmp;
- ret = rte_devargs_remove(da);
- if (ret < 0)
- return ret;
- TAILQ_INSERT_TAIL(&devargs_list, da, next);
+ if (*da == NULL || (*da)->bus == NULL)
+ return -1;
+
+ TAILQ_FOREACH_SAFE(listed_da, &devargs_list, next, tmp) {
+ if (listed_da == *da)
+ /* devargs already in the list */
+ return 0;
+ if (strcmp(listed_da->bus->name, (*da)->bus->name) == 0 &&
+ strcmp(listed_da->name, (*da)->name) == 0) {
+ /* device already in devargs list, must be updated */
+ listed_da->type = (*da)->type;
+ listed_da->policy = (*da)->policy;
+ free(listed_da->args);
+ listed_da->args = (*da)->args;
+ listed_da->bus = (*da)->bus;
+ listed_da->cls = (*da)->cls;
+ listed_da->bus_str = (*da)->bus_str;
+ listed_da->cls_str = (*da)->cls_str;
+ listed_da->data = (*da)->data;
+ /* replace provided devargs with found one */
+ free(*da);
+ *da = listed_da;
+ return 0;
+ }
+ }
+ /* new device in the list */
+ TAILQ_INSERT_TAIL(&devargs_list, *da, next);
return 0;
}
/* store a whitelist parameter for later parsing */
-__rte_experimental
int
rte_devargs_add(enum rte_devtype devtype, const char *devargs_str)
{
return -1;
}
-int __rte_experimental
+int
rte_devargs_remove(struct rte_devargs *devargs)
{
struct rte_devargs *d;
}
/* count the number of devices of a specified type */
-__rte_experimental
unsigned int
rte_devargs_type_count(enum rte_devtype devtype)
{
}
/* dump the user devices on the console */
-__rte_experimental
void
rte_devargs_dump(FILE *f)
{
}
/* bus-aware rte_devargs iterator. */
-__rte_experimental
struct rte_devargs *
rte_devargs_next(const char *busname, const struct rte_devargs *start)
{