Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright 2021 6WIND S.A. 3 : : */ 4 : : 5 : : #include <stdlib.h> 6 : : #include <stdio.h> 7 : : #include <string.h> 8 : : 9 : : #include <rte_common.h> 10 : : #include <rte_kvargs.h> 11 : : #include <bus_driver.h> 12 : : #include <rte_bus_vdev.h> 13 : : 14 : : #include "test.h" 15 : : 16 : : #define TEST_VDEV_KEY_NAME "name" 17 : : 18 : : static const char * const valid_keys[] = { 19 : : TEST_VDEV_KEY_NAME, 20 : : NULL, 21 : : }; 22 : : 23 : : static int 24 : 3 : cmp_dev_name(const struct rte_device *dev, const void *name) 25 : : { 26 : 3 : return strcmp(rte_dev_name(dev), name); 27 : : } 28 : : 29 : : static int 30 : 7 : cmp_dev_match(const struct rte_device *dev, const void *_kvlist) 31 : : { 32 : : const struct rte_kvargs *kvlist = _kvlist; 33 : : const char *key = TEST_VDEV_KEY_NAME; 34 : : const char *name; 35 : : 36 : : /* no kvlist arg, all devices match */ 37 [ + + ]: 7 : if (kvlist == NULL) 38 : : return 0; 39 : : 40 : : /* if key is present in kvlist and does not match, filter device */ 41 : 6 : name = rte_kvargs_get(kvlist, key); 42 [ + + + + ]: 6 : if (name != NULL && strcmp(name, rte_dev_name(dev)) != 0) 43 : 3 : return -1; 44 : : 45 : : return 0; 46 : : } 47 : : 48 : : static struct rte_device * 49 : 5 : get_matching_vdev(const char *match_str) 50 : : { 51 : 5 : struct rte_bus *vdev_bus = rte_bus_find_by_name("vdev"); 52 : : struct rte_kvargs *kvargs = NULL; 53 : : struct rte_device *dev; 54 : : 55 [ + + ]: 5 : if (match_str != NULL) { 56 : 4 : kvargs = rte_kvargs_parse(match_str, valid_keys); 57 [ - + ]: 4 : if (kvargs == NULL) { 58 : : printf("Failed to parse match string\n"); 59 : 0 : return NULL; 60 : : } 61 : : } 62 : : 63 : 5 : dev = vdev_bus->find_device(NULL, cmp_dev_match, kvargs); 64 : 5 : rte_kvargs_free(kvargs); 65 : : 66 : 5 : return dev; 67 : : } 68 : : 69 : : static int 70 : 1 : test_vdev_bus(void) 71 : : { 72 : 1 : struct rte_bus *vdev_bus = rte_bus_find_by_name("vdev"); 73 : 1 : struct rte_dev_iterator dev_iter = { 0 }; 74 : : struct rte_device *dev, *dev0, *dev1; 75 : : 76 : : /* not supported */ 77 [ + - ]: 1 : if (vdev_bus == NULL) 78 : : return 0; 79 : : 80 : : /* create first vdev */ 81 [ - + ]: 1 : if (rte_vdev_init("net_null_test0", "") < 0) { 82 : : printf("Failed to create vdev net_null_test0\n"); 83 : 0 : goto fail; 84 : : } 85 : 1 : dev0 = vdev_bus->find_device(NULL, cmp_dev_name, "net_null_test0"); 86 [ - + ]: 1 : if (dev0 == NULL) { 87 : : printf("Cannot find net_null_test0 vdev\n"); 88 : 0 : goto fail; 89 : : } 90 : : 91 : : /* create second vdev */ 92 [ - + ]: 1 : if (rte_vdev_init("net_null_test1", "") < 0) { 93 : : printf("Failed to create vdev net_null_test1\n"); 94 : 0 : goto fail; 95 : : } 96 : 1 : dev1 = vdev_bus->find_device(NULL, cmp_dev_name, "net_null_test1"); 97 [ - + ]: 1 : if (dev1 == NULL) { 98 : : printf("Cannot find net_null_test1 vdev\n"); 99 : 0 : goto fail; 100 : : } 101 : : 102 : : /* try to match vdevs */ 103 : 1 : dev = get_matching_vdev("name=net_null_test0"); 104 [ - + ]: 1 : if (dev != dev0) { 105 : : printf("Cannot match net_null_test0 vdev\n"); 106 : 0 : goto fail; 107 : : } 108 : : 109 : 1 : dev = get_matching_vdev("name=net_null_test1"); 110 [ - + ]: 1 : if (dev != dev1) { 111 : : printf("Cannot match net_null_test1 vdev\n"); 112 : 0 : goto fail; 113 : : } 114 : : 115 : 1 : dev = get_matching_vdev("name=unexistant"); 116 [ - + ]: 1 : if (dev != NULL) { 117 : : printf("Unexistant vdev should not match\n"); 118 : 0 : goto fail; 119 : : } 120 : : 121 : 1 : dev = get_matching_vdev(""); 122 [ - + ]: 1 : if (dev == NULL || dev == dev1) { 123 : : printf("Cannot match any vdev with empty match string\n"); 124 : 0 : goto fail; 125 : : } 126 : : 127 : 1 : dev = get_matching_vdev(NULL); 128 [ - + ]: 1 : if (dev == NULL || dev == dev1) { 129 : : printf("Cannot match any vdev with NULL match string\n"); 130 : 0 : goto fail; 131 : : } 132 : : 133 : : /* iterate all vdevs, and ensure we find vdev0 and vdev1 */ 134 [ + + ]: 3 : RTE_DEV_FOREACH(dev, "bus=vdev", &dev_iter) { 135 [ + + ]: 2 : if (dev == dev0) 136 : : dev0 = NULL; 137 [ + - ]: 1 : else if (dev == dev1) 138 : : dev1 = NULL; 139 : : } 140 [ - + ]: 1 : if (dev0 != NULL) { 141 : : printf("dev0 was not iterated\n"); 142 : 0 : goto fail; 143 : : } 144 [ - + ]: 1 : if (dev1 != NULL) { 145 : : printf("dev1 was not iterated\n"); 146 : 0 : goto fail; 147 : : } 148 : : 149 : 1 : rte_vdev_uninit("net_null_test0"); 150 : 1 : rte_vdev_uninit("net_null_test1"); 151 : : 152 : 1 : return 0; 153 : : 154 : 0 : fail: 155 : 0 : rte_vdev_uninit("net_null_test0"); 156 : 0 : rte_vdev_uninit("net_null_test1"); 157 : 0 : return -1; 158 : : } 159 : : 160 : : static int 161 : 1 : test_vdev(void) 162 : : { 163 : : printf("== test vdev bus ==\n"); 164 [ - + ]: 1 : if (test_vdev_bus() < 0) 165 : 0 : return -1; 166 : : return 0; 167 : : } 168 : : 169 : 252 : REGISTER_FAST_TEST(vdev_autotest, true, true, test_vdev);