xref: /aosp_15_r20/trusty/kernel/lib/ktipc/test/srv/srv.c (revision 344aa361028b423587d4ef3fa52a23d194628137)
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