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/stdinc.h"
7 : : #include "spdk_internal/cunit.h"
8 : : #include "nvme/nvme_opal.c"
9 : : #include "common/lib/test_env.c"
10 : :
11 : 2 : SPDK_LOG_REGISTER_COMPONENT(nvme)
12 : :
13 [ - + ]: 4 : DEFINE_STUB(spdk_nvme_ctrlr_cmd_security_receive, int,
14 : : (struct spdk_nvme_ctrlr *ctrlr, uint8_t secp, uint16_t spsp,
15 : : uint8_t nssf, void *payload, uint32_t payload_size,
16 : : spdk_nvme_cmd_cb cb_fn, void *cb_arg), 1);
17 : :
18 [ # # ]: 0 : DEFINE_STUB(spdk_nvme_ctrlr_security_receive, int,
19 : : (struct spdk_nvme_ctrlr *ctrlr, uint8_t secp,
20 : : uint16_t spsp, uint8_t nssf, void *payload, size_t size), 0);
21 : :
22 [ # # ]: 0 : DEFINE_STUB(spdk_nvme_ctrlr_process_admin_completions, int,
23 : : (struct spdk_nvme_ctrlr *ctrlr), 0);
24 : :
25 [ # # ]: 0 : DEFINE_STUB(spdk_nvme_ctrlr_cmd_security_send, int,
26 : : (struct spdk_nvme_ctrlr *ctrlr, uint8_t secp,
27 : : uint16_t spsp, uint8_t nssf, void *payload,
28 : : uint32_t payload_size, spdk_nvme_cmd_cb cb_fn, void *cb_arg), 0);
29 : :
30 : : static int g_ut_recv_status = 0;
31 : : static void *g_ut_sess_ctx;
32 : :
33 : : static void
34 : 10 : ut_opal_sess_cb(struct opal_session *sess, int status, void *ctx)
35 : : {
36 : 10 : g_ut_recv_status = status;
37 : 10 : g_ut_sess_ctx = ctx;
38 : 10 : }
39 : :
40 : : static void
41 : 10 : reset_ut_global_variables(void)
42 : : {
43 : 10 : g_ut_recv_status = 0;
44 : 10 : g_ut_sess_ctx = NULL;
45 : 10 : }
46 : :
47 : : static void
48 : 2 : test_opal_nvme_security_recv_send_done(void)
49 : : {
50 : 2 : struct spdk_nvme_cpl cpl = {};
51 : 2 : struct spdk_opal_compacket header = {};
52 : 2 : struct spdk_opal_dev dev = {};
53 : 2 : struct opal_session sess = {};
54 : :
55 : 2 : sess.sess_cb = ut_opal_sess_cb;
56 : 2 : sess.cb_arg = (void *)0xDEADBEEF;
57 : 2 : sess.dev = &dev;
58 : 2 : memcpy(sess.resp, &header, sizeof(header));
59 : :
60 : : /* Case 1: receive/send IO error */
61 : 2 : reset_ut_global_variables();
62 : 2 : cpl.status.sct = SPDK_NVME_SCT_MEDIA_ERROR;
63 : :
64 : 2 : opal_nvme_security_recv_done(&sess, &cpl);
65 : 2 : CU_ASSERT(g_ut_recv_status == -EIO);
66 : 2 : CU_ASSERT(g_ut_sess_ctx == (void *)0xDEADBEEF);
67 : :
68 : 2 : reset_ut_global_variables();
69 : 2 : opal_nvme_security_send_done(&sess, &cpl);
70 : 2 : CU_ASSERT(g_ut_recv_status == -EIO);
71 : 2 : CU_ASSERT(g_ut_sess_ctx == (void *)0xDEADBEEF);
72 : :
73 : : /* Case 2: receive with opal header no outstanding data */
74 : 2 : reset_ut_global_variables();
75 : 2 : memset(&header, 0, sizeof(header));
76 : 2 : cpl.status.sct = SPDK_NVME_SCT_GENERIC;
77 : :
78 : 2 : opal_nvme_security_recv_done(&sess, &cpl);
79 : 2 : CU_ASSERT(g_ut_recv_status == 0);
80 : 2 : CU_ASSERT(g_ut_sess_ctx == (void *)0xDEADBEEF);
81 : :
82 : : /* Case 3: receive with opal header outstanding data and send done success */
83 : 2 : reset_ut_global_variables();
84 : 2 : header.outstanding_data = 0xff;
85 : 2 : memcpy(sess.resp, &header, sizeof(header));
86 : 2 : cpl.status.sct = SPDK_NVME_SCT_GENERIC;
87 : :
88 : 2 : opal_nvme_security_recv_done(&sess, &cpl);
89 : 2 : CU_ASSERT(g_ut_recv_status == 1);
90 : 2 : CU_ASSERT(g_ut_sess_ctx == (void *)0xDEADBEEF);
91 : :
92 : 2 : reset_ut_global_variables();
93 : 2 : opal_nvme_security_send_done(&sess, &cpl);
94 : 2 : CU_ASSERT(g_ut_recv_status == 1);
95 : 2 : CU_ASSERT(g_ut_sess_ctx == (void *)0xDEADBEEF);
96 : 2 : }
97 : :
98 : : static void
99 : 2 : test_opal_add_short_atom_header(void)
100 : : {
101 : 2 : struct opal_session sess = {};
102 : 2 : int err = 0;
103 : :
104 : : /* short atom header */
105 : 2 : memset(&sess, 0, sizeof(sess));
106 : 2 : sess.cmd_pos = 0;
107 : :
108 : 2 : opal_add_token_bytestring(&err, &sess, spdk_opal_uid[UID_SMUID],
109 : : OPAL_UID_LENGTH);
110 : 2 : CU_ASSERT(sess.cmd[0] & SPDK_SHORT_ATOM_ID);
111 : 2 : CU_ASSERT(sess.cmd[0] & SPDK_SHORT_ATOM_BYTESTRING_FLAG);
112 : 2 : CU_ASSERT((sess.cmd[0] & SPDK_SHORT_ATOM_SIGN_FLAG) == 0);
113 : 2 : CU_ASSERT(sess.cmd_pos == OPAL_UID_LENGTH + 1);
114 : 2 : CU_ASSERT(!memcmp(&sess.cmd[1], spdk_opal_uid, OPAL_UID_LENGTH + 1));
115 : :
116 : : /* medium atom header */
117 : 2 : memset(&sess, 0, sizeof(sess));
118 : 2 : sess.cmd_pos = 0;
119 : :
120 : 2 : opal_add_token_bytestring(&err, &sess, spdk_opal_uid[UID_SMUID],
121 : : 0x10);
122 : 2 : CU_ASSERT(sess.cmd[0] & SPDK_SHORT_ATOM_ID);
123 : 2 : CU_ASSERT(sess.cmd[0] & SPDK_MEDIUM_ATOM_BYTESTRING_FLAG);
124 : 2 : CU_ASSERT((sess.cmd[0] & SPDK_MEDIUM_ATOM_SIGN_FLAG) == 0);
125 : 2 : CU_ASSERT(sess.cmd_pos == 0x12);
126 : 2 : CU_ASSERT(!memcmp(&sess.cmd[2], spdk_opal_uid, 0x10));
127 : :
128 : : /* Invalid length */
129 : 2 : memset(&sess, 0, sizeof(sess));
130 : 2 : err = 0;
131 : :
132 : 2 : opal_add_token_bytestring(&err, &sess, spdk_opal_uid[UID_SMUID],
133 : : 0x1000);
134 : 2 : CU_ASSERT(err == -ERANGE);
135 : 2 : CU_ASSERT(sess.cmd_pos == 0);
136 : 2 : }
137 : :
138 : : int
139 : 2 : main(int argc, char **argv)
140 : : {
141 : 2 : CU_pSuite suite = NULL;
142 : : unsigned int num_failures;
143 : :
144 : 2 : CU_initialize_registry();
145 : :
146 : 2 : suite = CU_add_suite("nvme_opal", NULL, NULL);
147 : 2 : CU_ADD_TEST(suite, test_opal_nvme_security_recv_send_done);
148 : 2 : CU_ADD_TEST(suite, test_opal_add_short_atom_header);
149 : :
150 : 2 : num_failures = spdk_ut_run_tests(argc, argv, NULL);
151 : 2 : CU_cleanup_registry();
152 : 2 : return num_failures;
153 : : }
|