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