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