xref: /spdk/test/unit/lib/nvme/nvme_opal.c/nvme_opal_ut.c (revision 8dd1cd2104ea4001e4a0da2a4851ccd62c82f8e8)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (c) Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk/stdinc.h"
7 #include "spdk_cunit.h"
8 #include "nvme/nvme_opal.c"
9 #include "common/lib/test_env.c"
10 
11 SPDK_LOG_REGISTER_COMPONENT(nvme)
12 
13 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 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 DEFINE_STUB(spdk_nvme_ctrlr_process_admin_completions, int,
23 	    (struct spdk_nvme_ctrlr *ctrlr), 0);
24 
25 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 ut_opal_sess_cb(struct opal_session *sess, int status, void *ctx)
35 {
36 	g_ut_recv_status = status;
37 	g_ut_sess_ctx = ctx;
38 }
39 
40 static void
41 reset_ut_global_variables(void)
42 {
43 	g_ut_recv_status = 0;
44 	g_ut_sess_ctx = NULL;
45 }
46 
47 static void
48 test_opal_nvme_security_recv_send_done(void)
49 {
50 	struct spdk_nvme_cpl cpl = {};
51 	struct spdk_opal_compacket header = {};
52 	struct spdk_opal_dev dev = {};
53 	struct opal_session sess = {};
54 
55 	sess.sess_cb = ut_opal_sess_cb;
56 	sess.cb_arg = (void *)0xDEADBEEF;
57 	sess.dev = &dev;
58 	memcpy(sess.resp, &header, sizeof(header));
59 
60 	/* Case 1: receive/send IO error */
61 	reset_ut_global_variables();
62 	cpl.status.sct = SPDK_NVME_SCT_MEDIA_ERROR;
63 
64 	opal_nvme_security_recv_done(&sess, &cpl);
65 	CU_ASSERT(g_ut_recv_status == -EIO);
66 	CU_ASSERT(g_ut_sess_ctx == (void *)0xDEADBEEF);
67 
68 	reset_ut_global_variables();
69 	opal_nvme_security_send_done(&sess, &cpl);
70 	CU_ASSERT(g_ut_recv_status == -EIO);
71 	CU_ASSERT(g_ut_sess_ctx == (void *)0xDEADBEEF);
72 
73 	/* Case 2: receive with opal header no outstanding data */
74 	reset_ut_global_variables();
75 	memset(&header, 0, sizeof(header));
76 	cpl.status.sct = SPDK_NVME_SCT_GENERIC;
77 
78 	opal_nvme_security_recv_done(&sess, &cpl);
79 	CU_ASSERT(g_ut_recv_status == 0);
80 	CU_ASSERT(g_ut_sess_ctx == (void *)0xDEADBEEF);
81 
82 	/* Case 3: receive with opal header outstanding data and send done success */
83 	reset_ut_global_variables();
84 	header.outstanding_data = 0xff;
85 	memcpy(sess.resp, &header, sizeof(header));
86 	cpl.status.sct = SPDK_NVME_SCT_GENERIC;
87 
88 	opal_nvme_security_recv_done(&sess, &cpl);
89 	CU_ASSERT(g_ut_recv_status == 1);
90 	CU_ASSERT(g_ut_sess_ctx == (void *)0xDEADBEEF);
91 
92 	reset_ut_global_variables();
93 	opal_nvme_security_send_done(&sess, &cpl);
94 	CU_ASSERT(g_ut_recv_status == 1);
95 	CU_ASSERT(g_ut_sess_ctx == (void *)0xDEADBEEF);
96 }
97 
98 static void
99 test_opal_add_short_atom_header(void)
100 {
101 	struct opal_session sess = {};
102 	int err = 0;
103 
104 	/* short atom header */
105 	memset(&sess, 0, sizeof(sess));
106 	sess.cmd_pos = 0;
107 
108 	opal_add_token_bytestring(&err, &sess, spdk_opal_uid[UID_SMUID],
109 				  OPAL_UID_LENGTH);
110 	CU_ASSERT(sess.cmd[0] & SPDK_SHORT_ATOM_ID);
111 	CU_ASSERT(sess.cmd[0] & SPDK_SHORT_ATOM_BYTESTRING_FLAG);
112 	CU_ASSERT((sess.cmd[0] & SPDK_SHORT_ATOM_SIGN_FLAG) == 0);
113 	CU_ASSERT(sess.cmd_pos == OPAL_UID_LENGTH +  1);
114 	CU_ASSERT(!memcmp(&sess.cmd[1], spdk_opal_uid, OPAL_UID_LENGTH + 1));
115 
116 	/* medium atom header */
117 	memset(&sess, 0, sizeof(sess));
118 	sess.cmd_pos = 0;
119 
120 	opal_add_token_bytestring(&err, &sess, spdk_opal_uid[UID_SMUID],
121 				  0x10);
122 	CU_ASSERT(sess.cmd[0] & SPDK_SHORT_ATOM_ID);
123 	CU_ASSERT(sess.cmd[0] & SPDK_MEDIUM_ATOM_BYTESTRING_FLAG);
124 	CU_ASSERT((sess.cmd[0] & SPDK_MEDIUM_ATOM_SIGN_FLAG) == 0);
125 	CU_ASSERT(sess.cmd_pos == 0x12);
126 	CU_ASSERT(!memcmp(&sess.cmd[2], spdk_opal_uid, 0x10));
127 
128 	/* Invalid length */
129 	memset(&sess, 0, sizeof(sess));
130 	err = 0;
131 
132 	opal_add_token_bytestring(&err, &sess, spdk_opal_uid[UID_SMUID],
133 				  0x1000);
134 	CU_ASSERT(err == -ERANGE);
135 	CU_ASSERT(sess.cmd_pos == 0);
136 }
137 
138 int
139 main(int argc, char **argv)
140 {
141 	CU_pSuite	suite = NULL;
142 	unsigned int	num_failures;
143 
144 	CU_set_error_action(CUEA_ABORT);
145 	CU_initialize_registry();
146 
147 	suite = CU_add_suite("nvme_opal", NULL, NULL);
148 	CU_ADD_TEST(suite, test_opal_nvme_security_recv_send_done);
149 	CU_ADD_TEST(suite, test_opal_add_short_atom_header);
150 
151 	CU_basic_set_mode(CU_BRM_VERBOSE);
152 	CU_basic_run_tests();
153 	num_failures = CU_get_number_of_failures();
154 	CU_cleanup_registry();
155 	return num_failures;
156 }
157