1 /*- 2 * BSD LICENSE 3 * 4 * Copyright (c) Intel Corporation. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Intel Corporation nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include "spdk/stdinc.h" 35 36 #include "spdk/env.h" 37 #include "spdk/init.h" 38 #include "spdk/thread.h" 39 #include "spdk/log.h" 40 #include "spdk/rpc.h" 41 42 #define RPC_SELECT_INTERVAL 4000 /* 4ms */ 43 44 static struct spdk_poller *g_rpc_poller = NULL; 45 46 static int 47 rpc_subsystem_poll(void *arg) 48 { 49 spdk_rpc_accept(); 50 return SPDK_POLLER_BUSY; 51 } 52 53 int 54 spdk_rpc_initialize(const char *listen_addr) 55 { 56 int rc; 57 58 if (listen_addr == NULL) { 59 /* Not treated as an error */ 60 return 0; 61 } 62 63 if (!spdk_rpc_verify_methods()) { 64 return -EINVAL; 65 } 66 67 /* Listen on the requested address */ 68 rc = spdk_rpc_listen(listen_addr); 69 if (rc != 0) { 70 SPDK_ERRLOG("Unable to start RPC service at %s\n", listen_addr); 71 /* TODO: Eventually, treat this as an error. But it historically has not 72 * been and many tests rely on this gracefully failing. */ 73 return 0; 74 } 75 76 spdk_rpc_set_state(SPDK_RPC_STARTUP); 77 78 /* Register a poller to periodically check for RPCs */ 79 g_rpc_poller = SPDK_POLLER_REGISTER(rpc_subsystem_poll, NULL, RPC_SELECT_INTERVAL); 80 81 return 0; 82 } 83 84 void 85 spdk_rpc_finish(void) 86 { 87 spdk_rpc_close(); 88 spdk_poller_unregister(&g_rpc_poller); 89 } 90