1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2018 Gaëtan Rivet 3 */ 4 5 #include <errno.h> 6 #include <string.h> 7 8 #include <rte_dev.h> 9 #include <rte_bus.h> 10 #include <rte_kvargs.h> 11 #include <rte_errno.h> 12 13 #include "vdev_logs.h" 14 #include "vdev_private.h" 15 16 enum vdev_params { 17 RTE_VDEV_PARAM_NAME, 18 RTE_VDEV_PARAM_MAX, 19 }; 20 21 static const char * const vdev_params_keys[] = { 22 [RTE_VDEV_PARAM_NAME] = "name", 23 [RTE_VDEV_PARAM_MAX] = NULL, 24 }; 25 26 static int 27 vdev_dev_match(const struct rte_device *dev, 28 const void *_kvlist) 29 { 30 const struct rte_kvargs *kvlist = _kvlist; 31 const char *key = vdev_params_keys[RTE_VDEV_PARAM_NAME]; 32 const char *name; 33 34 /* no kvlist arg, all devices match */ 35 if (kvlist == NULL) 36 return 0; 37 38 /* if key is present in kvlist and does not match, filter device */ 39 name = rte_kvargs_get(kvlist, key); 40 if (name != NULL && strcmp(name, dev->name)) 41 return -1; 42 43 return 0; 44 } 45 46 void * 47 rte_vdev_dev_iterate(const void *start, 48 const char *str, 49 const struct rte_dev_iterator *it __rte_unused) 50 { 51 struct rte_kvargs *kvargs = NULL; 52 struct rte_device *dev; 53 54 if (str != NULL) { 55 kvargs = rte_kvargs_parse(str, vdev_params_keys); 56 if (kvargs == NULL) { 57 VDEV_LOG(ERR, "cannot parse argument list\n"); 58 rte_errno = EINVAL; 59 return NULL; 60 } 61 } 62 dev = rte_vdev_find_device(start, vdev_dev_match, kvargs); 63 rte_kvargs_free(kvargs); 64 return dev; 65 } 66