xref: /spdk/test/unit/lib/env_dpdk/pci_event.c/pci_event_ut.c (revision 510f4c134a21b45ff3a5add9ebc6c6cf7e49aeab)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (c) Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk_cunit.h"
7 
8 #include "spdk/env.h"
9 
10 #include "common/lib/test_env.c"
11 
12 #include "env_dpdk/pci_event.c"
13 
14 #ifdef __linux__
15 
16 enum pci_parse_event_return_type {
17 	uevent_normal_exit = 0,
18 	uevent_expected_continue = 1
19 };
20 
21 static void
22 test_pci_parse_event(void)
23 {
24 	char *commands;
25 	struct spdk_pci_event event = {};
26 	struct spdk_pci_addr addr = {};
27 	int rc = uevent_normal_exit;
28 
29 	/* Simulate commands to check expected behaviors */
30 	/* Linux kernel puts null characters after every uevent */
31 	spdk_pci_addr_parse(&addr, "0000:81:00.0");
32 
33 	/* Case 1: Add wrong non-uio or vfio-pci /devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0 */
34 	commands =
35 		"ACTION=add\0DEVPATH=/devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0\0SUBSYSTEM= \0DRIVER= \0PCI_SLOT_NAME= \0";
36 
37 	rc = parse_subsystem_event(commands, &event);
38 	CU_ASSERT(rc == uevent_normal_exit);
39 
40 	/* Case 2: Add pci event /devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0 */
41 	commands =
42 		"ACTION=bind\0DEVPATH=/devices/pci0000:80/0000:80:01.0/0000:81:00.0\0SUBSYSTEM=pci\0DRIVER=uio_pci_generic\0PCI_SLOT_NAME=0000:81:00.0\0";
43 
44 	memset(&event, 0, sizeof(event));
45 	rc = parse_subsystem_event(commands, &event);
46 	CU_ASSERT(rc == uevent_normal_exit);
47 
48 	/* Case 3: Add wrong uio addr 000000 */
49 	commands =
50 		"ACTION=add \0DEVPATH=/devices/pci0000:80/0000/0000/uio/uio0\0SUBSYSTEM=uio\0DRIVER=\0PCI_SLOT_NAME= \0";
51 
52 	memset(&event, 0, sizeof(event));
53 	rc = parse_subsystem_event(commands, &event);
54 	CU_ASSERT(rc < 0);
55 
56 	/* Case 3: Add uio /devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0 */
57 	commands =
58 		"ACTION=add \0DEVPATH=/devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0\0SUBSYSTEM=uio\0DRIVER=\0PCI_SLOT_NAME= \0";
59 
60 	memset(&event, 0, sizeof(event));
61 	rc = parse_subsystem_event(commands, &event);
62 	CU_ASSERT(rc == uevent_expected_continue);
63 	CU_ASSERT(event.action == SPDK_UEVENT_ADD);
64 	CU_ASSERT(spdk_pci_addr_compare(&addr, &event.traddr) == 0);
65 
66 	/* Case 4: Remove uio /devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0 */
67 	commands =
68 		"ACTION=remove\0DEVPATH=/devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0\0SUBSYSTEM=uio\0DRIVER=\0PCI_SLOT_NAME= \0";
69 
70 	memset(&event, 0, sizeof(event));
71 	rc = parse_subsystem_event(commands, &event);
72 	CU_ASSERT(rc == uevent_expected_continue);
73 	CU_ASSERT(event.action == SPDK_UEVENT_REMOVE);
74 	CU_ASSERT(spdk_pci_addr_compare(&addr, &event.traddr) == 0);
75 
76 	/* Case 5: Add vfio-pci 0000:81:00.0 */
77 	commands = "ACTION=bind\0DEVPATH=\0SUBSYSTEM= \0DRIVER=vfio-pci\0PCI_SLOT_NAME=0000:81:00.0\0";
78 
79 	memset(&event, 0, sizeof(event));
80 	rc = parse_subsystem_event(commands, &event);
81 	CU_ASSERT(rc == uevent_expected_continue);
82 	CU_ASSERT(event.action == SPDK_UEVENT_ADD);
83 	CU_ASSERT(spdk_pci_addr_compare(&addr, &event.traddr) == 0);
84 	memset(&event, 0, sizeof(event));
85 
86 	/* Case 6: Remove vfio-pci 0000:81:00.0 but We don't parse vfio-pci remove uevent */
87 	commands = "ACTION=remove\0DEVPATH= \0SUBSYSTEM= \0DRIVER=vfio-pci \0PCI_SLOT_NAME=0000:81:00.0\0";
88 
89 	memset(&event, 0, sizeof(event));
90 	rc = parse_subsystem_event(commands, &event);
91 	CU_ASSERT(rc == uevent_normal_exit);
92 
93 	/* Case 7: Add wrong vfio-pci addr 000000 */
94 	commands = "ACTION=bind\0DEVPATH= \0SUBSYSTEM= \0DRIVER=vfio-pci \0PCI_SLOT_NAME=000000\0";
95 
96 	memset(&event, 0, sizeof(event));
97 	rc = parse_subsystem_event(commands, &event);
98 	CU_ASSERT(rc < 0);
99 
100 	/* Case 8: Add wrong driver vfio 0000:81:00.0 */
101 	commands = "ACTION=bind\0DEVPATH= \0SUBSYSTEM= \0DRIVER=vfio \0PCI_SLOT_NAME=0000:81:00.0\0";
102 
103 	memset(&event, 0, sizeof(event));
104 	rc = parse_subsystem_event(commands, &event);
105 	CU_ASSERT(rc == uevent_normal_exit);
106 }
107 
108 #else
109 
110 static void
111 test_pci_parse_event(void)
112 {
113 	CU_ASSERT(1);
114 }
115 
116 #endif
117 
118 int
119 main(int argc, char **argv)
120 {
121 	CU_pSuite	suite = NULL;
122 	unsigned int	num_failures;
123 
124 	CU_set_error_action(CUEA_ABORT);
125 	CU_initialize_registry();
126 
127 	suite = CU_add_suite("pci_event", NULL, NULL);
128 
129 	CU_ADD_TEST(suite, test_pci_parse_event);
130 
131 	CU_basic_set_mode(CU_BRM_VERBOSE);
132 	CU_basic_run_tests();
133 	num_failures = CU_get_number_of_failures();
134 	CU_cleanup_registry();
135 	return num_failures;
136 }
137