Branch data Line data Source code
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 22 : 3 : test_pci_parse_event(void) 23 : : { 24 : : char *commands; 25 : 3 : struct spdk_pci_event event = {}; 26 : 3 : struct spdk_pci_addr addr = {}; 27 : 3 : int rc = uevent_normal_exit; 28 : : 29 : : /* Simulate commands to check expected behaviors */ 30 : : /* Linux kernel puts null characters after every uevent */ 31 : 3 : 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 : 3 : 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 : 3 : rc = parse_subsystem_event(commands, &event); 38 : 3 : 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 : 3 : 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 [ - + ]: 3 : memset(&event, 0, sizeof(event)); 45 : 3 : rc = parse_subsystem_event(commands, &event); 46 : 3 : CU_ASSERT(rc == uevent_normal_exit); 47 : : 48 : : /* Case 3: Add wrong uio addr 000000 */ 49 : 3 : commands = 50 : : "ACTION=add \0DEVPATH=/devices/pci0000:80/0000/0000/uio/uio0\0SUBSYSTEM=uio\0DRIVER=\0PCI_SLOT_NAME= \0"; 51 : : 52 [ - + ]: 3 : memset(&event, 0, sizeof(event)); 53 : 3 : rc = parse_subsystem_event(commands, &event); 54 : 3 : CU_ASSERT(rc < 0); 55 : : 56 : : /* Case 3: Add uio /devices/pci0000:80/0000:80:01.0/0000:81:00.0/uio/uio0 */ 57 : 3 : 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 [ - + ]: 3 : memset(&event, 0, sizeof(event)); 61 : 3 : rc = parse_subsystem_event(commands, &event); 62 : 3 : CU_ASSERT(rc == uevent_expected_continue); 63 : 3 : CU_ASSERT(event.action == SPDK_UEVENT_ADD); 64 : 3 : 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 : 3 : 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 [ - + ]: 3 : memset(&event, 0, sizeof(event)); 71 : 3 : rc = parse_subsystem_event(commands, &event); 72 : 3 : CU_ASSERT(rc == uevent_expected_continue); 73 : 3 : CU_ASSERT(event.action == SPDK_UEVENT_REMOVE); 74 : 3 : CU_ASSERT(spdk_pci_addr_compare(&addr, &event.traddr) == 0); 75 : : 76 : : /* Case 5: Add vfio-pci 0000:81:00.0 */ 77 : 3 : commands = "ACTION=bind\0DEVPATH=\0SUBSYSTEM= \0DRIVER=vfio-pci\0PCI_SLOT_NAME=0000:81:00.0\0"; 78 : : 79 [ - + ]: 3 : memset(&event, 0, sizeof(event)); 80 : 3 : rc = parse_subsystem_event(commands, &event); 81 : 3 : CU_ASSERT(rc == uevent_expected_continue); 82 : 3 : CU_ASSERT(event.action == SPDK_UEVENT_ADD); 83 : 3 : CU_ASSERT(spdk_pci_addr_compare(&addr, &event.traddr) == 0); 84 [ - + ]: 3 : 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 : 3 : commands = "ACTION=remove\0DEVPATH= \0SUBSYSTEM= \0DRIVER=vfio-pci \0PCI_SLOT_NAME=0000:81:00.0\0"; 88 : : 89 [ - + ]: 3 : memset(&event, 0, sizeof(event)); 90 : 3 : rc = parse_subsystem_event(commands, &event); 91 : 3 : CU_ASSERT(rc == uevent_normal_exit); 92 : : 93 : : /* Case 7: Add wrong vfio-pci addr 000000 */ 94 : 3 : commands = "ACTION=bind\0DEVPATH= \0SUBSYSTEM= \0DRIVER=vfio-pci \0PCI_SLOT_NAME=000000\0"; 95 : : 96 [ - + ]: 3 : memset(&event, 0, sizeof(event)); 97 : 3 : rc = parse_subsystem_event(commands, &event); 98 : 3 : CU_ASSERT(rc < 0); 99 : : 100 : : /* Case 8: Add wrong driver vfio 0000:81:00.0 */ 101 : 3 : commands = "ACTION=bind\0DEVPATH= \0SUBSYSTEM= \0DRIVER=vfio \0PCI_SLOT_NAME=0000:81:00.0\0"; 102 : : 103 [ - + ]: 3 : memset(&event, 0, sizeof(event)); 104 : 3 : rc = parse_subsystem_event(commands, &event); 105 : 3 : CU_ASSERT(rc == uevent_normal_exit); 106 : 3 : } 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 : 3 : main(int argc, char **argv) 120 : : { 121 : 3 : CU_pSuite suite = NULL; 122 : : unsigned int num_failures; 123 : : 124 : 3 : CU_initialize_registry(); 125 : : 126 : 3 : suite = CU_add_suite("pci_event", NULL, NULL); 127 : : 128 : 3 : CU_ADD_TEST(suite, test_pci_parse_event); 129 : : 130 : 3 : num_failures = spdk_ut_run_tests(argc, argv, NULL); 131 : 3 : CU_cleanup_registry(); 132 : 3 : return num_failures; 133 : : }