1*4418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
2*4418919fSjohnjiang * Copyright(c) 2010-2014 Intel Corporation
3*4418919fSjohnjiang */
4*4418919fSjohnjiang
5*4418919fSjohnjiang #include <stdio.h>
6*4418919fSjohnjiang #include <stdint.h>
7*4418919fSjohnjiang #include <stdarg.h>
8*4418919fSjohnjiang #include <string.h>
9*4418919fSjohnjiang #include <errno.h>
10*4418919fSjohnjiang #include <sys/queue.h>
11*4418919fSjohnjiang
12*4418919fSjohnjiang #include <rte_eal.h>
13*4418919fSjohnjiang #include <rte_string_fns.h>
14*4418919fSjohnjiang #include <rte_tailq.h>
15*4418919fSjohnjiang
16*4418919fSjohnjiang #include "test.h"
17*4418919fSjohnjiang
18*4418919fSjohnjiang #define do_return(...) do { \
19*4418919fSjohnjiang printf("Error at %s, line %d: ", __func__, __LINE__); \
20*4418919fSjohnjiang printf(__VA_ARGS__); \
21*4418919fSjohnjiang return 1; \
22*4418919fSjohnjiang } while (0)
23*4418919fSjohnjiang
24*4418919fSjohnjiang static struct rte_tailq_elem rte_dummy_tailq = {
25*4418919fSjohnjiang .name = "dummy",
26*4418919fSjohnjiang };
27*4418919fSjohnjiang EAL_REGISTER_TAILQ(rte_dummy_tailq)
28*4418919fSjohnjiang
29*4418919fSjohnjiang static struct rte_tailq_elem rte_dummy_dyn_tailq = {
30*4418919fSjohnjiang .name = "dummy_dyn",
31*4418919fSjohnjiang };
32*4418919fSjohnjiang static struct rte_tailq_elem rte_dummy_dyn2_tailq = {
33*4418919fSjohnjiang .name = "dummy_dyn",
34*4418919fSjohnjiang };
35*4418919fSjohnjiang
36*4418919fSjohnjiang static struct rte_tailq_entry d_elem;
37*4418919fSjohnjiang static struct rte_tailq_entry d_dyn_elem;
38*4418919fSjohnjiang
39*4418919fSjohnjiang static int
test_tailq_early(void)40*4418919fSjohnjiang test_tailq_early(void)
41*4418919fSjohnjiang {
42*4418919fSjohnjiang struct rte_tailq_entry_head *d_head;
43*4418919fSjohnjiang
44*4418919fSjohnjiang d_head = RTE_TAILQ_CAST(rte_dummy_tailq.head, rte_tailq_entry_head);
45*4418919fSjohnjiang if (d_head == NULL)
46*4418919fSjohnjiang do_return("Error %s has not been initialised\n",
47*4418919fSjohnjiang rte_dummy_tailq.name);
48*4418919fSjohnjiang
49*4418919fSjohnjiang /* check we can add an item to it */
50*4418919fSjohnjiang TAILQ_INSERT_TAIL(d_head, &d_elem, next);
51*4418919fSjohnjiang
52*4418919fSjohnjiang return 0;
53*4418919fSjohnjiang }
54*4418919fSjohnjiang
55*4418919fSjohnjiang static int
test_tailq_create(void)56*4418919fSjohnjiang test_tailq_create(void)
57*4418919fSjohnjiang {
58*4418919fSjohnjiang struct rte_tailq_entry_head *d_head;
59*4418919fSjohnjiang
60*4418919fSjohnjiang /* create a tailq and check its non-null (since we are post-eal init) */
61*4418919fSjohnjiang if ((rte_eal_tailq_register(&rte_dummy_dyn_tailq) < 0) ||
62*4418919fSjohnjiang (rte_dummy_dyn_tailq.head == NULL))
63*4418919fSjohnjiang do_return("Error allocating %s\n", rte_dummy_dyn_tailq.name);
64*4418919fSjohnjiang
65*4418919fSjohnjiang d_head = RTE_TAILQ_CAST(rte_dummy_dyn_tailq.head, rte_tailq_entry_head);
66*4418919fSjohnjiang
67*4418919fSjohnjiang /* check we can add an item to it */
68*4418919fSjohnjiang TAILQ_INSERT_TAIL(d_head, &d_dyn_elem, next);
69*4418919fSjohnjiang
70*4418919fSjohnjiang if (strcmp(rte_dummy_dyn2_tailq.name, rte_dummy_dyn_tailq.name))
71*4418919fSjohnjiang do_return("Error, something is wrong in the tailq test\n");
72*4418919fSjohnjiang
73*4418919fSjohnjiang /* try allocating again, and check for failure */
74*4418919fSjohnjiang if (!rte_eal_tailq_register(&rte_dummy_dyn2_tailq))
75*4418919fSjohnjiang do_return("Error, registering the same tailq %s did not fail\n",
76*4418919fSjohnjiang rte_dummy_dyn2_tailq.name);
77*4418919fSjohnjiang
78*4418919fSjohnjiang return 0;
79*4418919fSjohnjiang }
80*4418919fSjohnjiang
81*4418919fSjohnjiang static int
test_tailq_lookup(void)82*4418919fSjohnjiang test_tailq_lookup(void)
83*4418919fSjohnjiang {
84*4418919fSjohnjiang /* run successful test - check result is found */
85*4418919fSjohnjiang struct rte_tailq_entry_head *d_head;
86*4418919fSjohnjiang struct rte_tailq_entry *d_ptr;
87*4418919fSjohnjiang
88*4418919fSjohnjiang d_head = RTE_TAILQ_LOOKUP(rte_dummy_tailq.name, rte_tailq_entry_head);
89*4418919fSjohnjiang /* rte_dummy_tailq has been registered by EAL_REGISTER_TAILQ */
90*4418919fSjohnjiang if (d_head == NULL ||
91*4418919fSjohnjiang d_head != RTE_TAILQ_CAST(rte_dummy_tailq.head, rte_tailq_entry_head))
92*4418919fSjohnjiang do_return("Error with tailq lookup\n");
93*4418919fSjohnjiang
94*4418919fSjohnjiang TAILQ_FOREACH(d_ptr, d_head, next)
95*4418919fSjohnjiang if (d_ptr != &d_elem)
96*4418919fSjohnjiang do_return("Error with tailq returned from lookup - "
97*4418919fSjohnjiang "expected element not found\n");
98*4418919fSjohnjiang
99*4418919fSjohnjiang d_head = RTE_TAILQ_LOOKUP(rte_dummy_dyn_tailq.name, rte_tailq_entry_head);
100*4418919fSjohnjiang /* rte_dummy_dyn_tailq has been registered by test_tailq_create */
101*4418919fSjohnjiang if (d_head == NULL ||
102*4418919fSjohnjiang d_head != RTE_TAILQ_CAST(rte_dummy_dyn_tailq.head, rte_tailq_entry_head))
103*4418919fSjohnjiang do_return("Error with tailq lookup\n");
104*4418919fSjohnjiang
105*4418919fSjohnjiang TAILQ_FOREACH(d_ptr, d_head, next)
106*4418919fSjohnjiang if (d_ptr != &d_dyn_elem)
107*4418919fSjohnjiang do_return("Error with tailq returned from lookup - "
108*4418919fSjohnjiang "expected element not found\n");
109*4418919fSjohnjiang
110*4418919fSjohnjiang /* now try a bad/error lookup */
111*4418919fSjohnjiang d_head = RTE_TAILQ_LOOKUP("coucou", rte_tailq_entry_head);
112*4418919fSjohnjiang if (d_head != NULL)
113*4418919fSjohnjiang do_return("Error, lookup does not return NULL for bad tailq name\n");
114*4418919fSjohnjiang
115*4418919fSjohnjiang return 0;
116*4418919fSjohnjiang }
117*4418919fSjohnjiang
118*4418919fSjohnjiang static int
test_tailq(void)119*4418919fSjohnjiang test_tailq(void)
120*4418919fSjohnjiang {
121*4418919fSjohnjiang int ret = 0;
122*4418919fSjohnjiang ret |= test_tailq_early();
123*4418919fSjohnjiang ret |= test_tailq_create();
124*4418919fSjohnjiang ret |= test_tailq_lookup();
125*4418919fSjohnjiang return ret;
126*4418919fSjohnjiang }
127*4418919fSjohnjiang
128*4418919fSjohnjiang REGISTER_TEST_COMMAND(tailq_autotest, test_tailq);
129