1*344aa361SAndroid Build Coastguard Worker /*
2*344aa361SAndroid Build Coastguard Worker * Copyright (c) 2022, Google Inc. All rights reserved
3*344aa361SAndroid Build Coastguard Worker *
4*344aa361SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining
5*344aa361SAndroid Build Coastguard Worker * a copy of this software and associated documentation files
6*344aa361SAndroid Build Coastguard Worker * (the "Software"), to deal in the Software without restriction,
7*344aa361SAndroid Build Coastguard Worker * including without limitation the rights to use, copy, modify, merge,
8*344aa361SAndroid Build Coastguard Worker * publish, distribute, sublicense, and/or sell copies of the Software,
9*344aa361SAndroid Build Coastguard Worker * and to permit persons to whom the Software is furnished to do so,
10*344aa361SAndroid Build Coastguard Worker * subject to the following conditions:
11*344aa361SAndroid Build Coastguard Worker *
12*344aa361SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be
13*344aa361SAndroid Build Coastguard Worker * included in all copies or substantial portions of the Software.
14*344aa361SAndroid Build Coastguard Worker *
15*344aa361SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*344aa361SAndroid Build Coastguard Worker * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*344aa361SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18*344aa361SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19*344aa361SAndroid Build Coastguard Worker * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20*344aa361SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21*344aa361SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22*344aa361SAndroid Build Coastguard Worker */
23*344aa361SAndroid Build Coastguard Worker
24*344aa361SAndroid Build Coastguard Worker #include <err.h>
25*344aa361SAndroid Build Coastguard Worker #include <inttypes.h>
26*344aa361SAndroid Build Coastguard Worker #include <ktipc_test.h>
27*344aa361SAndroid Build Coastguard Worker #include <lib/ktipc/ktipc.h>
28*344aa361SAndroid Build Coastguard Worker #include <lib/trusty/ipc.h>
29*344aa361SAndroid Build Coastguard Worker #include <lib/trusty/uuid.h>
30*344aa361SAndroid Build Coastguard Worker #include <lk/init.h>
31*344aa361SAndroid Build Coastguard Worker #include <lk/list.h>
32*344aa361SAndroid Build Coastguard Worker #include <lk/trace.h>
33*344aa361SAndroid Build Coastguard Worker #include <string.h>
34*344aa361SAndroid Build Coastguard Worker
35*344aa361SAndroid Build Coastguard Worker struct chan_ctx {
36*344aa361SAndroid Build Coastguard Worker struct list_node queued_msgs;
37*344aa361SAndroid Build Coastguard Worker };
38*344aa361SAndroid Build Coastguard Worker
39*344aa361SAndroid Build Coastguard Worker struct queued_msg {
40*344aa361SAndroid Build Coastguard Worker struct list_node node;
41*344aa361SAndroid Build Coastguard Worker size_t len;
42*344aa361SAndroid Build Coastguard Worker char buf[KTIPC_TEST_MAX_MSG_SIZE];
43*344aa361SAndroid Build Coastguard Worker };
44*344aa361SAndroid Build Coastguard Worker
45*344aa361SAndroid Build Coastguard Worker static uint8_t echo_buf[KTIPC_TEST_MAX_MSG_SIZE];
46*344aa361SAndroid Build Coastguard Worker static uint32_t close_counter = 0;
47*344aa361SAndroid Build Coastguard Worker
queue_buffer(struct chan_ctx * ctx,const uint8_t * buf,size_t len)48*344aa361SAndroid Build Coastguard Worker static int queue_buffer(struct chan_ctx* ctx, const uint8_t* buf, size_t len) {
49*344aa361SAndroid Build Coastguard Worker struct queued_msg* qmsg;
50*344aa361SAndroid Build Coastguard Worker
51*344aa361SAndroid Build Coastguard Worker qmsg = calloc(1, sizeof(struct queued_msg));
52*344aa361SAndroid Build Coastguard Worker if (!qmsg) {
53*344aa361SAndroid Build Coastguard Worker TRACEF("%s: failed to allocate queued message\n", __func__);
54*344aa361SAndroid Build Coastguard Worker return ERR_NO_MEMORY;
55*344aa361SAndroid Build Coastguard Worker }
56*344aa361SAndroid Build Coastguard Worker
57*344aa361SAndroid Build Coastguard Worker qmsg->len = len;
58*344aa361SAndroid Build Coastguard Worker memcpy(qmsg->buf, buf, len);
59*344aa361SAndroid Build Coastguard Worker list_add_tail(&ctx->queued_msgs, &qmsg->node);
60*344aa361SAndroid Build Coastguard Worker
61*344aa361SAndroid Build Coastguard Worker return NO_ERROR;
62*344aa361SAndroid Build Coastguard Worker }
63*344aa361SAndroid Build Coastguard Worker
test_handle_msg(const struct ktipc_port * port,struct handle * chan,void * ctx_v)64*344aa361SAndroid Build Coastguard Worker static int test_handle_msg(const struct ktipc_port* port,
65*344aa361SAndroid Build Coastguard Worker struct handle* chan,
66*344aa361SAndroid Build Coastguard Worker void* ctx_v) {
67*344aa361SAndroid Build Coastguard Worker int rc;
68*344aa361SAndroid Build Coastguard Worker struct chan_ctx* ctx = ctx_v;
69*344aa361SAndroid Build Coastguard Worker struct ktipc_test_req* req = (struct ktipc_test_req*)echo_buf;
70*344aa361SAndroid Build Coastguard Worker
71*344aa361SAndroid Build Coastguard Worker rc = ktipc_recv(chan, sizeof(*req), req, KTIPC_TEST_MAX_MSG_SIZE);
72*344aa361SAndroid Build Coastguard Worker if (rc < 0) {
73*344aa361SAndroid Build Coastguard Worker TRACEF("%s: failed (%d) to read message\n", __func__, rc);
74*344aa361SAndroid Build Coastguard Worker return rc;
75*344aa361SAndroid Build Coastguard Worker }
76*344aa361SAndroid Build Coastguard Worker
77*344aa361SAndroid Build Coastguard Worker switch (req->cmd) {
78*344aa361SAndroid Build Coastguard Worker case KTIPC_TEST_CMD_NOP:
79*344aa361SAndroid Build Coastguard Worker break;
80*344aa361SAndroid Build Coastguard Worker
81*344aa361SAndroid Build Coastguard Worker case KTIPC_TEST_CMD_ECHO: {
82*344aa361SAndroid Build Coastguard Worker size_t len = rc - sizeof(*req);
83*344aa361SAndroid Build Coastguard Worker if (list_is_empty(&ctx->queued_msgs)) {
84*344aa361SAndroid Build Coastguard Worker /* Queue is empty, we can send this message directly */
85*344aa361SAndroid Build Coastguard Worker rc = ktipc_send(chan, req->payload, len);
86*344aa361SAndroid Build Coastguard Worker } else {
87*344aa361SAndroid Build Coastguard Worker /* There are other messages in the queue, add this one to the end */
88*344aa361SAndroid Build Coastguard Worker rc = ERR_NOT_ENOUGH_BUFFER;
89*344aa361SAndroid Build Coastguard Worker }
90*344aa361SAndroid Build Coastguard Worker
91*344aa361SAndroid Build Coastguard Worker if (rc < 0) {
92*344aa361SAndroid Build Coastguard Worker if (rc == ERR_NOT_ENOUGH_BUFFER) {
93*344aa361SAndroid Build Coastguard Worker TRACEF("%s: queuing message %zd\n", __func__, len);
94*344aa361SAndroid Build Coastguard Worker return queue_buffer(ctx, req->payload, len);
95*344aa361SAndroid Build Coastguard Worker } else {
96*344aa361SAndroid Build Coastguard Worker TRACEF("%s: failed (%d) to send echo\n", __func__, rc);
97*344aa361SAndroid Build Coastguard Worker return rc;
98*344aa361SAndroid Build Coastguard Worker }
99*344aa361SAndroid Build Coastguard Worker }
100*344aa361SAndroid Build Coastguard Worker break;
101*344aa361SAndroid Build Coastguard Worker }
102*344aa361SAndroid Build Coastguard Worker
103*344aa361SAndroid Build Coastguard Worker case KTIPC_TEST_CMD_CLOSE:
104*344aa361SAndroid Build Coastguard Worker /* We want to close our end of the connection, and this does it */
105*344aa361SAndroid Build Coastguard Worker return ERR_INVALID_ARGS;
106*344aa361SAndroid Build Coastguard Worker
107*344aa361SAndroid Build Coastguard Worker case KTIPC_TEST_CMD_READ_CLOSE_COUNTER:
108*344aa361SAndroid Build Coastguard Worker rc = ktipc_send(chan, &close_counter, sizeof(close_counter));
109*344aa361SAndroid Build Coastguard Worker if (rc < 0) {
110*344aa361SAndroid Build Coastguard Worker TRACEF("%s: failed (%d) to send close counter\n", __func__, rc);
111*344aa361SAndroid Build Coastguard Worker return rc;
112*344aa361SAndroid Build Coastguard Worker }
113*344aa361SAndroid Build Coastguard Worker break;
114*344aa361SAndroid Build Coastguard Worker
115*344aa361SAndroid Build Coastguard Worker default:
116*344aa361SAndroid Build Coastguard Worker TRACEF("%s: unknown test command: %" PRIu32 "\n", __func__, req->cmd);
117*344aa361SAndroid Build Coastguard Worker return ERR_CMD_UNKNOWN;
118*344aa361SAndroid Build Coastguard Worker }
119*344aa361SAndroid Build Coastguard Worker
120*344aa361SAndroid Build Coastguard Worker return NO_ERROR;
121*344aa361SAndroid Build Coastguard Worker }
122*344aa361SAndroid Build Coastguard Worker
test_handle_connect(const struct ktipc_port * port,struct handle * chan,const struct uuid * peer,void ** ctx_p)123*344aa361SAndroid Build Coastguard Worker static int test_handle_connect(const struct ktipc_port* port,
124*344aa361SAndroid Build Coastguard Worker struct handle* chan,
125*344aa361SAndroid Build Coastguard Worker const struct uuid* peer,
126*344aa361SAndroid Build Coastguard Worker void** ctx_p) {
127*344aa361SAndroid Build Coastguard Worker struct chan_ctx* ctx = calloc(1, sizeof(*ctx));
128*344aa361SAndroid Build Coastguard Worker if (!ctx) {
129*344aa361SAndroid Build Coastguard Worker TRACEF("%s: failed to allocate context\n", __func__);
130*344aa361SAndroid Build Coastguard Worker return ERR_NO_MEMORY;
131*344aa361SAndroid Build Coastguard Worker }
132*344aa361SAndroid Build Coastguard Worker
133*344aa361SAndroid Build Coastguard Worker list_initialize(&ctx->queued_msgs);
134*344aa361SAndroid Build Coastguard Worker *ctx_p = ctx;
135*344aa361SAndroid Build Coastguard Worker
136*344aa361SAndroid Build Coastguard Worker return NO_ERROR;
137*344aa361SAndroid Build Coastguard Worker }
138*344aa361SAndroid Build Coastguard Worker
test_handle_channel_cleanup(void * ctx_v)139*344aa361SAndroid Build Coastguard Worker static void test_handle_channel_cleanup(void* ctx_v) {
140*344aa361SAndroid Build Coastguard Worker struct chan_ctx* ctx = ctx_v;
141*344aa361SAndroid Build Coastguard Worker struct queued_msg* qmsg;
142*344aa361SAndroid Build Coastguard Worker struct queued_msg* temp;
143*344aa361SAndroid Build Coastguard Worker
144*344aa361SAndroid Build Coastguard Worker close_counter++;
145*344aa361SAndroid Build Coastguard Worker
146*344aa361SAndroid Build Coastguard Worker list_for_every_entry_safe(&ctx->queued_msgs, qmsg, temp, struct queued_msg,
147*344aa361SAndroid Build Coastguard Worker node) {
148*344aa361SAndroid Build Coastguard Worker free(qmsg);
149*344aa361SAndroid Build Coastguard Worker }
150*344aa361SAndroid Build Coastguard Worker
151*344aa361SAndroid Build Coastguard Worker free(ctx);
152*344aa361SAndroid Build Coastguard Worker }
153*344aa361SAndroid Build Coastguard Worker
test_handle_send_unblocked(const struct ktipc_port * port,struct handle * chan,void * ctx_v)154*344aa361SAndroid Build Coastguard Worker static int test_handle_send_unblocked(const struct ktipc_port* port,
155*344aa361SAndroid Build Coastguard Worker struct handle* chan,
156*344aa361SAndroid Build Coastguard Worker void* ctx_v) {
157*344aa361SAndroid Build Coastguard Worker int rc;
158*344aa361SAndroid Build Coastguard Worker struct chan_ctx* ctx = ctx_v;
159*344aa361SAndroid Build Coastguard Worker struct queued_msg* qmsg;
160*344aa361SAndroid Build Coastguard Worker struct queued_msg* temp;
161*344aa361SAndroid Build Coastguard Worker
162*344aa361SAndroid Build Coastguard Worker list_for_every_entry_safe(&ctx->queued_msgs, qmsg, temp, struct queued_msg,
163*344aa361SAndroid Build Coastguard Worker node) {
164*344aa361SAndroid Build Coastguard Worker TRACEF("%s: sending queued message %zd\n", __func__, qmsg->len);
165*344aa361SAndroid Build Coastguard Worker rc = ktipc_send(chan, qmsg->buf, qmsg->len);
166*344aa361SAndroid Build Coastguard Worker if (rc < 0) {
167*344aa361SAndroid Build Coastguard Worker if (rc == ERR_NOT_ENOUGH_BUFFER) {
168*344aa361SAndroid Build Coastguard Worker break;
169*344aa361SAndroid Build Coastguard Worker } else {
170*344aa361SAndroid Build Coastguard Worker TRACEF("%s: failed (%d) to send echo\n", __func__, rc);
171*344aa361SAndroid Build Coastguard Worker return rc;
172*344aa361SAndroid Build Coastguard Worker }
173*344aa361SAndroid Build Coastguard Worker }
174*344aa361SAndroid Build Coastguard Worker
175*344aa361SAndroid Build Coastguard Worker list_delete(&qmsg->node);
176*344aa361SAndroid Build Coastguard Worker free(qmsg);
177*344aa361SAndroid Build Coastguard Worker }
178*344aa361SAndroid Build Coastguard Worker
179*344aa361SAndroid Build Coastguard Worker return NO_ERROR;
180*344aa361SAndroid Build Coastguard Worker }
181*344aa361SAndroid Build Coastguard Worker
connecterr_handle_connect(const struct ktipc_port * port,struct handle * chan,const struct uuid * peer,void ** ctx_p)182*344aa361SAndroid Build Coastguard Worker static int connecterr_handle_connect(const struct ktipc_port* port,
183*344aa361SAndroid Build Coastguard Worker struct handle* chan,
184*344aa361SAndroid Build Coastguard Worker const struct uuid* peer,
185*344aa361SAndroid Build Coastguard Worker void** ctx_p) {
186*344aa361SAndroid Build Coastguard Worker TRACEF("%s: closing channel\n", __func__);
187*344aa361SAndroid Build Coastguard Worker return ERR_INVALID_ARGS;
188*344aa361SAndroid Build Coastguard Worker }
189*344aa361SAndroid Build Coastguard Worker
nop_handle_msg(const struct ktipc_port * port,struct handle * chan,void * ctx_v)190*344aa361SAndroid Build Coastguard Worker static int nop_handle_msg(const struct ktipc_port* port,
191*344aa361SAndroid Build Coastguard Worker struct handle* chan,
192*344aa361SAndroid Build Coastguard Worker void* ctx_v) {
193*344aa361SAndroid Build Coastguard Worker return NO_ERROR;
194*344aa361SAndroid Build Coastguard Worker }
195*344aa361SAndroid Build Coastguard Worker
nop_handle_channel_cleanup(void * ctx_v)196*344aa361SAndroid Build Coastguard Worker static void nop_handle_channel_cleanup(void* ctx_v) {}
197*344aa361SAndroid Build Coastguard Worker
198*344aa361SAndroid Build Coastguard Worker /* Operation structures for this server */
199*344aa361SAndroid Build Coastguard Worker const static struct ktipc_srv_ops test_srv_ops = {
200*344aa361SAndroid Build Coastguard Worker .on_connect = test_handle_connect,
201*344aa361SAndroid Build Coastguard Worker .on_message = test_handle_msg,
202*344aa361SAndroid Build Coastguard Worker .on_channel_cleanup = test_handle_channel_cleanup,
203*344aa361SAndroid Build Coastguard Worker .on_send_unblocked = test_handle_send_unblocked,
204*344aa361SAndroid Build Coastguard Worker };
205*344aa361SAndroid Build Coastguard Worker
206*344aa361SAndroid Build Coastguard Worker const static struct ktipc_srv_ops connecterr_srv_ops = {
207*344aa361SAndroid Build Coastguard Worker .on_connect = connecterr_handle_connect,
208*344aa361SAndroid Build Coastguard Worker .on_message = nop_handle_msg,
209*344aa361SAndroid Build Coastguard Worker .on_channel_cleanup = nop_handle_channel_cleanup,
210*344aa361SAndroid Build Coastguard Worker };
211*344aa361SAndroid Build Coastguard Worker
212*344aa361SAndroid Build Coastguard Worker /* UUID structures for this server */
213*344aa361SAndroid Build Coastguard Worker const static struct uuid* valid_uuids[] = {
214*344aa361SAndroid Build Coastguard Worker &kernel_uuid,
215*344aa361SAndroid Build Coastguard Worker };
216*344aa361SAndroid Build Coastguard Worker
217*344aa361SAndroid Build Coastguard Worker const static struct uuid* bad_uuids[] = {
218*344aa361SAndroid Build Coastguard Worker &zero_uuid,
219*344aa361SAndroid Build Coastguard Worker };
220*344aa361SAndroid Build Coastguard Worker
221*344aa361SAndroid Build Coastguard Worker /* Ports for this server */
222*344aa361SAndroid Build Coastguard Worker const static struct ktipc_port_acl test_srv_port_acl = {
223*344aa361SAndroid Build Coastguard Worker .flags = IPC_PORT_ALLOW_TA_CONNECT,
224*344aa361SAndroid Build Coastguard Worker .uuids = valid_uuids,
225*344aa361SAndroid Build Coastguard Worker .uuid_num = countof(valid_uuids),
226*344aa361SAndroid Build Coastguard Worker .extra_data = NULL,
227*344aa361SAndroid Build Coastguard Worker };
228*344aa361SAndroid Build Coastguard Worker
229*344aa361SAndroid Build Coastguard Worker const static struct ktipc_port test_srv_port = {
230*344aa361SAndroid Build Coastguard Worker .name = KTIPC_TEST_SRV_PORT,
231*344aa361SAndroid Build Coastguard Worker .uuid = &kernel_uuid,
232*344aa361SAndroid Build Coastguard Worker .msg_max_size = KTIPC_TEST_MAX_MSG_SIZE,
233*344aa361SAndroid Build Coastguard Worker .msg_queue_len = 1,
234*344aa361SAndroid Build Coastguard Worker .acl = &test_srv_port_acl,
235*344aa361SAndroid Build Coastguard Worker .priv = NULL,
236*344aa361SAndroid Build Coastguard Worker };
237*344aa361SAndroid Build Coastguard Worker
238*344aa361SAndroid Build Coastguard Worker const static struct ktipc_port_acl blocked_srv_port_acl = {
239*344aa361SAndroid Build Coastguard Worker .flags = IPC_PORT_ALLOW_TA_CONNECT,
240*344aa361SAndroid Build Coastguard Worker .uuids = bad_uuids,
241*344aa361SAndroid Build Coastguard Worker .uuid_num = countof(bad_uuids),
242*344aa361SAndroid Build Coastguard Worker .extra_data = NULL,
243*344aa361SAndroid Build Coastguard Worker };
244*344aa361SAndroid Build Coastguard Worker
245*344aa361SAndroid Build Coastguard Worker const static struct ktipc_port blocked_srv_port = {
246*344aa361SAndroid Build Coastguard Worker .name = KTIPC_TEST_SRV_PORT ".blocked",
247*344aa361SAndroid Build Coastguard Worker .uuid = &kernel_uuid,
248*344aa361SAndroid Build Coastguard Worker .msg_max_size = KTIPC_TEST_MAX_MSG_SIZE,
249*344aa361SAndroid Build Coastguard Worker .msg_queue_len = 1,
250*344aa361SAndroid Build Coastguard Worker .acl = &blocked_srv_port_acl,
251*344aa361SAndroid Build Coastguard Worker .priv = NULL,
252*344aa361SAndroid Build Coastguard Worker };
253*344aa361SAndroid Build Coastguard Worker
254*344aa361SAndroid Build Coastguard Worker const static struct ktipc_port_acl connecterr_srv_port_acl = {
255*344aa361SAndroid Build Coastguard Worker .flags = IPC_PORT_ALLOW_TA_CONNECT,
256*344aa361SAndroid Build Coastguard Worker .uuids = valid_uuids,
257*344aa361SAndroid Build Coastguard Worker .uuid_num = countof(valid_uuids),
258*344aa361SAndroid Build Coastguard Worker .extra_data = NULL,
259*344aa361SAndroid Build Coastguard Worker };
260*344aa361SAndroid Build Coastguard Worker
261*344aa361SAndroid Build Coastguard Worker const static struct ktipc_port connecterr_srv_port = {
262*344aa361SAndroid Build Coastguard Worker .name = KTIPC_TEST_SRV_PORT ".connecterr",
263*344aa361SAndroid Build Coastguard Worker .uuid = &kernel_uuid,
264*344aa361SAndroid Build Coastguard Worker .msg_max_size = KTIPC_TEST_MAX_MSG_SIZE,
265*344aa361SAndroid Build Coastguard Worker .msg_queue_len = 1,
266*344aa361SAndroid Build Coastguard Worker .acl = &connecterr_srv_port_acl,
267*344aa361SAndroid Build Coastguard Worker .priv = NULL,
268*344aa361SAndroid Build Coastguard Worker };
269*344aa361SAndroid Build Coastguard Worker
270*344aa361SAndroid Build Coastguard Worker static struct ktipc_server ktipc_test_server =
271*344aa361SAndroid Build Coastguard Worker KTIPC_SERVER_INITIAL_VALUE(ktipc_test_server, "ktipc_test_server");
272*344aa361SAndroid Build Coastguard Worker
ktipc_test_server_init(uint lvl)273*344aa361SAndroid Build Coastguard Worker static void ktipc_test_server_init(uint lvl) {
274*344aa361SAndroid Build Coastguard Worker int rc;
275*344aa361SAndroid Build Coastguard Worker
276*344aa361SAndroid Build Coastguard Worker rc = ktipc_server_start(&ktipc_test_server);
277*344aa361SAndroid Build Coastguard Worker if (rc < 0) {
278*344aa361SAndroid Build Coastguard Worker TRACEF("Failed (%d) to start ktipc_test_srv server\n", rc);
279*344aa361SAndroid Build Coastguard Worker return;
280*344aa361SAndroid Build Coastguard Worker }
281*344aa361SAndroid Build Coastguard Worker
282*344aa361SAndroid Build Coastguard Worker rc = ktipc_server_add_port(&ktipc_test_server, &test_srv_port,
283*344aa361SAndroid Build Coastguard Worker &test_srv_ops);
284*344aa361SAndroid Build Coastguard Worker if (rc < 0) {
285*344aa361SAndroid Build Coastguard Worker TRACEF("Failed (%d) to create echo service port\n", rc);
286*344aa361SAndroid Build Coastguard Worker }
287*344aa361SAndroid Build Coastguard Worker
288*344aa361SAndroid Build Coastguard Worker rc = ktipc_server_add_port(&ktipc_test_server, &blocked_srv_port,
289*344aa361SAndroid Build Coastguard Worker &test_srv_ops);
290*344aa361SAndroid Build Coastguard Worker if (rc < 0) {
291*344aa361SAndroid Build Coastguard Worker TRACEF("Failed (%d) to create blocked service port\n", rc);
292*344aa361SAndroid Build Coastguard Worker }
293*344aa361SAndroid Build Coastguard Worker
294*344aa361SAndroid Build Coastguard Worker rc = ktipc_server_add_port(&ktipc_test_server, &connecterr_srv_port,
295*344aa361SAndroid Build Coastguard Worker &connecterr_srv_ops);
296*344aa361SAndroid Build Coastguard Worker if (rc < 0) {
297*344aa361SAndroid Build Coastguard Worker TRACEF("Failed (%d) to create connecterr service port\n", rc);
298*344aa361SAndroid Build Coastguard Worker }
299*344aa361SAndroid Build Coastguard Worker }
300*344aa361SAndroid Build Coastguard Worker
301*344aa361SAndroid Build Coastguard Worker LK_INIT_HOOK(ktipc_test_server_init,
302*344aa361SAndroid Build Coastguard Worker ktipc_test_server_init,
303*344aa361SAndroid Build Coastguard Worker LK_INIT_LEVEL_APPS - 1)
304