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