1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (C) 2021 Intel Corporation.
3 * All rights reserved.
4 */
5
6 #include "spdk_internal/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
test_pci_parse_event(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
test_pci_parse_event(void)111 test_pci_parse_event(void)
112 {
113 CU_ASSERT(1);
114 }
115
116 #endif
117
118 int
main(int argc,char ** argv)119 main(int argc, char **argv)
120 {
121 CU_pSuite suite = NULL;
122 unsigned int num_failures;
123
124 CU_initialize_registry();
125
126 suite = CU_add_suite("pci_event", NULL, NULL);
127
128 CU_ADD_TEST(suite, test_pci_parse_event);
129
130 num_failures = spdk_ut_run_tests(argc, argv, NULL);
131 CU_cleanup_registry();
132 return num_failures;
133 }
134