Motr  M0
rpc_ping.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2020 Seagate Technology LLC and/or its Affiliates
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  * For any questions about this software or licensing,
17  * please email opensource@seagate.com or cortx-questions@seagate.com.
18  *
19  */
20 
21 
22 #include "lib/assert.h"
23 #include "lib/errno.h"
24 #include "lib/getopts.h"
25 #include "lib/memory.h"
26 #include "lib/misc.h" /* M0_SET0 */
27 #include "lib/thread.h"
28 #include "lib/time.h"
29 #include "motr/init.h"
30 #include "reqh/reqh.h" /* m0_reqh_rpc_mach_tl */
31 #include "net/net.h"
32 #include "net/lnet/lnet.h"
33 #include "fop/fop.h" /* m0_fop_default_item_ops */
34 #include "rpc/rpc.h"
35 #include "rpc/rpclib.h" /* m0_rpc_server_start, m0_rpc_client_start */
36 #include "rpc/item.h" /* m0_rpc_item_error */
37 #include "rpc/it/ping_fop.h"
38 #include "rpc/it/ping_fop_xc.h"
39 #include "rpc/it/ping_fom.h"
40 #include "ut/cs_service.h" /* m0_cs_default_stypes */
41 
42 #ifdef __KERNEL__
43 # include <linux/kernel.h>
45 # define printf printk
46 #else
47 # include <stdlib.h>
48 # include <stdio.h>
49 # include <string.h>
50 # include <unistd.h> /* read */
51 # ifdef HAVE_NETINET_IN_H
52 # include <netinet/in.h>
53 # endif
54 # include <arpa/inet.h>
55 # include <netdb.h>
56 # include "module/instance.h" /* m0 */
57 #endif
58 
59 #define SERVER_ENDPOINT_ADDR "0@lo:12345:34:1"
60 #define SERVER_ENDPOINT M0_NET_XPRT_PREFIX_DEFAULT":"SERVER_ENDPOINT_ADDR
61 
62 #define SERVER_DB_FILE_NAME "m0rpcping_server.db"
63 #define SERVER_STOB_FILE_NAME "m0rpcping_server.stob"
64 #define SERVER_ADDB_STOB_FILE_NAME "linuxstob:m0rpcping_server_addb.stob"
65 #define SERVER_LOG_FILE_NAME "m0rpcping_server.log"
66 
68 
69 enum {
70  BUF_LEN = 128,
74 };
75 
76 #ifndef __KERNEL__
77 static struct m0 instance;
78 static bool server_mode = false;
79 #endif
80 
81 static bool verbose = false;
82 static char *server_nid = "0@lo";
83 static char *client_nid = "0@lo";
84 static int server_tmid = 1;
85 static int client_tmid = 2;
86 static int nr_client_threads = 1;
87 static int nr_ping_bytes = 8;
88 static int nr_ping_item = 1;
91 
94 
95 
96 #ifdef __KERNEL__
97 /* Module parameters */
98 module_param(verbose, bool, S_IRUGO);
99 MODULE_PARM_DESC(verbose, "enable verbose output to kernel log");
100 
101 module_param(client_nid, charp, S_IRUGO);
102 MODULE_PARM_DESC(client_nid, "client network identifier");
103 
104 module_param(server_nid, charp, S_IRUGO);
105 MODULE_PARM_DESC(server_nid, "server network identifier");
106 
107 module_param(server_tmid, int, S_IRUGO);
108 MODULE_PARM_DESC(server_tmid, "remote transfer machine identifier");
109 
110 module_param(client_tmid, int, S_IRUGO);
111 MODULE_PARM_DESC(client_tmid, "local transfer machine identifier");
112 
113 module_param(nr_client_threads, int, S_IRUGO);
114 MODULE_PARM_DESC(nr_client_threads, "number of client threads");
115 
116 module_param(nr_ping_bytes, int, S_IRUGO);
117 MODULE_PARM_DESC(nr_ping_bytes, "number of ping fop bytes");
118 
119 module_param(nr_ping_item, int, S_IRUGO);
120 MODULE_PARM_DESC(nr_ping_item, "number of ping fop items");
121 
122 module_param(tm_recv_queue_len, int, S_IRUGO);
123 MODULE_PARM_DESC(tm_recv_queue_len, "minimum TM receive queue length");
124 
125 module_param(max_rpc_msg_size, int, S_IRUGO);
126 MODULE_PARM_DESC(max_rpc_msg_size, "maximum RPC message size");
127 #endif
128 
130  char *out_buf,
131  size_t buf_size)
132 {
133  char *ep_name;
134  char *nid;
135  int tmid;
136 
137  M0_PRE(M0_IN(type, (EP_SERVER, EP_CLIENT)));
138 
139  if (type == EP_SERVER) {
140  nid = server_nid;
141  ep_name = "server";
142  tmid = server_tmid;
143  } else {
144  nid = client_nid;
145  ep_name = "client";
146  tmid = client_tmid;
147  }
148 
150  return -1;
151 
152  snprintf(out_buf, buf_size, "%s:%d:%d:%d", nid, M0_NET_LNET_PID,
153  M0_LNET_PORTAL, tmid);
154  if (verbose)
155  printf("%s endpoint: %s\n", ep_name, out_buf);
156 
157  return 0;
158 }
159 
160 /* Get stats from rpc_machine and print them */
161 static void __print_stats(struct m0_rpc_machine *rpc_mach)
162 {
163  struct m0_rpc_stats stats;
164  printf("stats:\n");
165 
166  m0_rpc_machine_get_stats(rpc_mach, &stats, false);
167  printf("\treceived_items: %llu\n",
168  (unsigned long long)stats.rs_nr_rcvd_items);
169  printf("\tsent_items: %llu\n",
170  (unsigned long long)stats.rs_nr_sent_items);
171  printf("\tsent_items_uniq: %llu\n",
172  (unsigned long long)stats.rs_nr_sent_items_uniq);
173  printf("\tresent_items: %llu\n",
174  (unsigned long long)stats.rs_nr_resent_items);
175  printf("\tfailed_items: %llu\n",
176  (unsigned long long)stats.rs_nr_failed_items);
177  printf("\ttimedout_items: %llu\n",
178  (unsigned long long)stats.rs_nr_timedout_items);
179  printf("\tdropped_items: %llu\n",
180  (unsigned long long)stats.rs_nr_dropped_items);
181  printf("\tha_timedout_items: %llu\n",
182  (unsigned long long)stats.rs_nr_ha_timedout_items);
183  printf("\tha_noted_conns: %llu\n",
184  (unsigned long long)stats.rs_nr_ha_noted_conns);
185 
186  printf("\treceived_packets: %llu\n",
187  (unsigned long long)stats.rs_nr_rcvd_packets);
188  printf("\tsent_packets: %llu\n",
189  (unsigned long long)stats.rs_nr_sent_packets);
190  printf("\tpackets_failed : %llu\n",
191  (unsigned long long)stats.rs_nr_failed_packets);
192 
193  printf("\tTotal_bytes_sent : %llu\n",
194  (unsigned long long)stats.rs_nr_sent_bytes);
195  printf("\tTotal_bytes_rcvd : %llu\n",
196  (unsigned long long)stats.rs_nr_rcvd_bytes);
197 }
198 
199 #ifndef __KERNEL__
200 /* Prints stats of all the rpc machines in the given request handler. */
201 static void print_stats(struct m0_reqh *reqh)
202 {
203  struct m0_rpc_machine *rpcmach;
204 
205  M0_PRE(reqh != NULL);
206 
208  m0_tl_for(m0_reqh_rpc_mach, &reqh->rh_rpc_machines, rpcmach) {
209  M0_ASSERT(m0_rpc_machine_bob_check(rpcmach));
210  __print_stats(rpcmach);
211  } m0_tl_endfor;
213 }
214 #endif
215 
217 {
218  struct m0_fop_ping_rep *reply;
219  struct m0_fop *rfop;
220  int rc;
221 
222  /* typical error checking performed in replied callback */
224  if (rc == 0) {
226  rfop = container_of(item->ri_reply, struct m0_fop, f_item);
227  reply = m0_fop_data(rfop);
228  M0_ASSERT(reply != NULL);
229  rc = reply->fpr_rc;
230  }
231  if (rc == 0) {
232  /* operation is successful. */;
233  } else {
234  /* operation is failed */;
235  }
236 }
237 
240 };
241 
242 /* Create a ping fop and post it to rpc layer */
244 {
245  int rc;
246  struct m0_fop *fop;
247  struct m0_fop_ping *ping_fop;
248  uint32_t nr_arr_member;
249  const size_t sz = sizeof ping_fop->fp_arr.f_data[0];
250 
251  nr_arr_member = nr_ping_bytes / sz + !(nr_ping_bytes % sz);
252 
254  M0_ASSERT(fop != NULL);
255 
256  ping_fop = m0_fop_data(fop);
257  ping_fop->fp_arr.f_count = nr_arr_member;
258 
259  M0_ALLOC_ARR(ping_fop->fp_arr.f_data, nr_arr_member);
260  M0_ASSERT(ping_fop->fp_arr.f_data != NULL);
261 
264  m0_time_from_now(1, 0));
265  M0_ASSERT(rc == 0);
266  M0_ASSERT(fop->f_item.ri_error == 0);
267  M0_ASSERT(fop->f_item.ri_reply != 0);
269 }
270 
272 {
273  int i;
274 
275  for (i = 0; i < nr_ping_item; ++i)
277 }
278 
279 static int run_client(void)
280 {
281  int rc;
282  int i;
283  struct m0_thread *client_thread;
284 
285  /*
286  * Declare these variables as static, to avoid on-stack allocation
287  * of big structures. This is important for kernel-space, where stack
288  * size is very small.
289  */
290  static struct m0_net_domain client_net_dom;
291  static struct m0_rpc_client_ctx cctx;
292  static struct m0_fid process_fid = M0_FID_TINIT('r', 0, 1);
293 
295  m0_time_t delta;
296 
304 
306  sizeof server_endpoint);
307  if (rc != 0)
308  return rc;
309 
311  sizeof client_endpoint);
312  if (rc != 0)
313  return rc;
314 
316 
318  if (rc != 0)
319  goto fop_fini;
320 
322  if (rc != 0) {
323  printf("m0rpcping: client init failed \"%i\"\n", -rc);
324  goto net_dom_fini;
325  }
327 
328  start = m0_time_now();
329  for (i = 0; i < nr_client_threads; i++) {
331 
334  &cctx.rcx_session, "client_%d", i);
335  M0_ASSERT(rc == 0);
336  }
337 
338  for (i = 0; i < nr_client_threads; i++) {
341  }
342 
343  delta = m0_time_sub(m0_time_now(), start);
344 
346  if (verbose)
347  printf("Time: %lu.%2.2lu sec\n",
348  (unsigned long)m0_time_seconds(delta),
349  (unsigned long)m0_time_nanoseconds(delta) *
350  100 / M0_TIME_ONE_SECOND);
351 net_dom_fini:
353 fop_fini:
355 
356  return rc;
357 }
358 
359 #ifndef __KERNEL__
360 static void quit_dialog(void)
361 {
362  int rc __attribute__((unused));
363  char ch;
364 
365  printf("\n########################################\n");
366  printf("\n\nPress Enter to terminate\n\n");
367  printf("\n########################################\n");
368  rc = read(0, &ch, sizeof ch);
369 }
370 
371 static int int2str(char *dest, size_t size, int src, int defval)
372 {
373  int rc = snprintf(dest, size, "%d", src > 0 ? src : defval);
374  return (rc < 0 || rc >= size) ? -EINVAL : 0;
375 }
376 
377 static int run_server(void)
378 {
379  enum { STRING_LEN = 16 };
380  static char tm_len[STRING_LEN];
381  static char rpc_size[STRING_LEN];
382  int rc;
383  char *argv[] = {
384  "rpclib_ut",
385  "-e", server_endpoint,
386  "-H", SERVER_ENDPOINT_ADDR,
387  "-q", tm_len, "-m", rpc_size,
388  };
389  struct m0_rpc_server_ctx sctx = {
391  .rsx_xprts_nr = m0_net_xprt_nr(),
392  .rsx_argv = argv,
393  .rsx_argc = ARRAY_SIZE(argv),
394  .rsx_log_file_name = SERVER_LOG_FILE_NAME
395  };
396 
397  rc = int2str(tm_len, sizeof tm_len, tm_recv_queue_len,
399  int2str(rpc_size, sizeof rpc_size, max_rpc_msg_size,
401  if (rc != 0)
402  return rc;
403 
405  if (rc != 0)
406  goto m0_fini;
407 
409 
410  /*
411  * Prepend transport name to the beginning of endpoint,
412  * as required by motr-setup.
413  */
415 
418  sizeof(server_endpoint) - strlen(server_endpoint));
419  if (rc != 0)
420  goto fop_fini;
421 
425  if (rc != 0)
426  goto fop_fini;
427 
428  quit_dialog();
429 
430  if (verbose) {
431  printf("########### Server stats ###########\n");
433  }
434 
436 fop_fini:
439 m0_fini:
440  return rc;
441 }
442 #endif
443 
444 #ifdef __KERNEL__
445 int m0_rpc_ping_init()
446 {
447  return run_client();
448 }
449 #else
450 /* Main function for rpc ping */
451 int main(int argc, char *argv[])
452 {
453  int rc;
454 
455  rc = m0_init(&instance);
456  if (rc != 0)
457  return -rc;
458  rc = M0_GETOPTS("m0rpcping", argc, argv,
459  M0_FLAGARG('s', "run server", &server_mode),
460  M0_STRINGARG('C', "client nid",
461  LAMBDA(void, (const char *str) { client_nid =
462  (char*)str; })),
463  M0_FORMATARG('p', "client tmid", "%i", &client_tmid),
464  M0_STRINGARG('S', "server nid",
465  LAMBDA(void, (const char *str) { server_nid =
466  (char*)str; })),
467  M0_FORMATARG('P', "server tmid", "%i", &server_tmid),
468  M0_FORMATARG('b', "size in bytes", "%i", &nr_ping_bytes),
469  M0_FORMATARG('t', "number of client threads", "%i",
471  M0_FORMATARG('n', "number of ping items", "%i", &nr_ping_item),
472  M0_FORMATARG('q', "minimum TM receive queue length \n"
473  "Note: It's default value is 2. \n"
474  "If a large number of ping items having"
475  " bigger sizes are sent \nthen there may be"
476  " insufficient receive buffers.\nIn such"
477  "cases it should have higher values (~16).",
478  "%i", &tm_recv_queue_len),
479  M0_FORMATARG('m', "maximum RPC msg size", "%i",
481  M0_FLAGARG('v', "verbose", &verbose)
482  );
483  if (rc != 0)
484  return -rc;
485 
486  if (server_mode)
487  rc = run_server();
488  else
489  rc = run_client();
490  m0_fini();
491  return -rc;
492 }
493 #endif
494 
495 M0_INTERNAL void m0_rpc_ping_fini(void)
496 {
497 }
static int tm_recv_queue_len
Definition: rpc_ping.c:89
static void ping_reply_received(struct m0_rpc_item *item)
Definition: rpc_ping.c:216
#define M0_GETOPTS(progname, argc, argv,...)
Definition: getopts.h:169
static void rpcping_thread(struct m0_rpc_session *session)
Definition: rpc_ping.c:271
#define SERVER_ENDPOINT_ADDR
Definition: rpc_ping.c:59
m0_time_t ri_resend_interval
Definition: item.h:144
#define M0_PRE(cond)
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
M0_INTERNAL void m0_ping_fop_init(void)
Definition: ping_fop.c:47
void m0_net_domain_fini(struct m0_net_domain *dom)
Definition: domain.c:71
static int build_endpoint_addr(enum ep_type type, char *out_buf, size_t buf_size)
Definition: rpc_ping.c:129
struct m0_reqh * m0_cs_reqh_get(struct m0_motr *cctx)
Definition: setup.c:1762
#define M0_FLAGARG(ch, desc, ptr)
Definition: getopts.h:232
#define NULL
Definition: misc.h:38
#define SERVER_LOG_FILE_NAME
Definition: rpc_ping.c:65
static void print_stats(struct m0_reqh *reqh)
Definition: rpc_ping.c:201
void m0_fini(void)
Definition: init.c:318
int m0_thread_join(struct m0_thread *q)
Definition: kthread.c:169
uint64_t m0_time_t
Definition: time.h:37
int m0_cs_default_stypes_init(void)
Definition: cs_service.c:161
int m0_rpc_server_start(struct m0_rpc_server_ctx *sctx)
Definition: rpclib.c:50
uint64_t m0_time_nanoseconds(const m0_time_t time)
Definition: time.c:89
int32_t ri_error
Definition: item.h:161
static struct m0_rpc_client_ctx cctx
Definition: rconfc.c:69
void * m0_fop_data(const struct m0_fop *fop)
Definition: fop.c:220
enum m0_md_lustre_logrec_type __attribute__
Definition: balloc.c:2745
static int int2str(char *dest, size_t size, int src, int defval)
Definition: rpc_ping.c:371
static char * server_nid
Definition: rpc_ping.c:82
#define M0_THREAD_INIT(thread, TYPE, init, func, arg, namefmt,...)
Definition: thread.h:139
bool cc_no_conf
Definition: setup.h:428
module_param(trace_immediate_mask, charp, S_IRUGO)
uint32_t f_count
Definition: ping_fop.h:49
int m0_init(struct m0 *instance)
Definition: init.c:310
#define container_of(ptr, type, member)
Definition: misc.h:33
static struct m0_rpc_session session
Definition: formation2.c:38
#define M0_SET0(obj)
Definition: misc.h:64
ep_type
Definition: rpc_ping.c:67
struct m0_rwlock rh_rwlock
Definition: reqh.h:143
static struct m0_rpc_item * item
Definition: item.c:56
static int run_server(void)
Definition: rpc_ping.c:377
static void quit_dialog(void)
Definition: rpc_ping.c:360
static void __print_stats(struct m0_rpc_machine *rpc_mach)
Definition: rpc_ping.c:161
#define m0_tl_endfor
Definition: tlist.h:700
static struct m0 instance
Definition: rpc_ping.c:77
int m0_rpc_ping_init(void)
void m0_rpc_machine_get_stats(struct m0_rpc_machine *machine, struct m0_rpc_stats *stats, bool reset)
Definition: rpc_machine.c:592
#define M0_STRINGARG(ch, desc, func)
Definition: getopts.h:207
int i
Definition: dir.c:1033
M0_INTERNAL void m0_ping_fop_fini(void)
Definition: ping_fop.c:37
#define LAMBDA(T,...)
Definition: thread.h:153
#define M0_FID_TINIT(type, container, key)
Definition: fid.h:90
#define M0_FORMATARG(ch, desc, fmt, ptr)
Definition: getopts.h:218
#define M0_NET_XPRT_PREFIX_DEFAULT
Definition: net.h:98
#define M0_ASSERT(cond)
uint32_t rcx_max_rpc_msg_size
Definition: rpclib.h:156
bool cc_no_storage
Definition: setup.h:425
static int client_tmid
Definition: rpc_ping.c:85
m0_time_t m0_time_now(void)
Definition: time.c:134
struct m0_fop_type m0_fop_ping_fopt
Definition: ping_fop.c:34
static void send_ping_fop(struct m0_rpc_session *session)
Definition: rpc_ping.c:243
struct m0_tl rh_rpc_machines
Definition: reqh.h:135
void m0_thread_fini(struct m0_thread *q)
Definition: thread.c:92
int m0_net_xprt_nr(void)
Definition: net.c:168
Definition: instance.h:80
struct m0_net_xprt * m0_net_xprt_default_get(void)
Definition: net.c:151
int m0_rpc_client_start(struct m0_rpc_client_ctx *cctx)
Definition: rpclib.c:160
struct m0_net_xprt ** rsx_xprts
Definition: rpclib.h:69
struct m0_rpc_item * ri_reply
Definition: item.h:163
static struct m0_rpc_server_ctx sctx
Definition: console.c:88
static struct m0_net_domain client_net_dom
Definition: rconfc.c:47
uint32_t rcx_recv_queue_min_length
Definition: rpclib.h:153
int m0_rpc_post_sync(struct m0_fop *fop, struct m0_rpc_session *session, const struct m0_rpc_item_ops *ri_ops, m0_time_t deadline)
Definition: rpclib.c:284
static void fop_fini(void)
Definition: iterator_test.c:41
Definition: reqh.h:94
M0_INTERNAL void m0_rpc_ping_fini(void)
Definition: rpc_ping.c:495
static int max_rpc_msg_size
Definition: rpc_ping.c:90
struct m0_fid * rcx_fid
Definition: rpclib.h:161
struct m0_net_domain * rcx_net_dom
Definition: rpclib.h:128
uint64_t m0_time_seconds(const m0_time_t time)
Definition: time.c:83
uint64_t rcx_max_rpcs_in_flight
Definition: rpclib.h:136
void(* rio_replied)(struct m0_rpc_item *item)
Definition: item.h:300
uint64_t * f_data
Definition: ping_fop.h:50
int32_t m0_rpc_item_error(const struct m0_rpc_item *item)
Definition: item.c:973
struct m0_reqh reqh
Definition: rm_foms.c:48
int m0_net_domain_init(struct m0_net_domain *dom, const struct m0_net_xprt *xprt)
Definition: domain.c:36
struct m0_rpc_session rcx_session
Definition: rpclib.h:147
Definition: fid.h:38
Definition: beck.c:130
m0_time_t m0_time_from_now(uint64_t secs, long ns)
Definition: time.c:96
struct m0_net_xprt ** m0_net_all_xprt_get(void)
Definition: net.c:161
m0_time_t m0_time_sub(const m0_time_t t1, const m0_time_t t2)
Definition: time.c:65
const char * rcx_remote_addr
Definition: rpclib.h:134
struct m0_fop * m0_fop_alloc_at(struct m0_rpc_session *sess, struct m0_fop_type *fopt)
Definition: fop.c:122
m0_bcount_t size
Definition: di.c:39
int m0_rpc_client_stop_stats(struct m0_rpc_client_ctx *cctx, void(*printout)(struct m0_rpc_machine *))
Definition: rpclib.c:223
static int start(struct m0_fom *fom)
Definition: trigger_fom.c:321
void m0_fop_put_lock(struct m0_fop *fop)
Definition: fop.c:199
static struct m0_thread * client_thread
static struct m0_fop * fop
Definition: item.c:57
M0_INTERNAL void m0_rwlock_read_lock(struct m0_rwlock *lock)
Definition: rwlock.c:52
int main(int argc, char *argv[])
Definition: rpc_ping.c:451
const struct m0_rpc_item_ops ping_item_ops
Definition: rpc_ping.c:238
static int nr_ping_item
Definition: rpc_ping.c:88
const char * rcx_local_addr
Definition: rpclib.h:131
void m0_rpc_server_stop(struct m0_rpc_server_ctx *sctx)
Definition: rpclib.c:85
MODULE_PARM_DESC(trace_immediate_mask, " a bitmask or comma separated list of subsystem names" " of what should be printed immediately to console")
static uint32_t buf_size
Definition: ad.c:75
M0_INTERNAL void m0_rwlock_read_unlock(struct m0_rwlock *lock)
Definition: rwlock.c:57
int type
Definition: dir.c:1031
static bool server_mode
Definition: rpc_ping.c:78
static int nr_ping_bytes
Definition: rpc_ping.c:87
static struct m0_dtm_oper_descr reply
Definition: transmit.c:94
static bool verbose
Definition: rpc_ping.c:81
#define m0_tl_for(name, head, obj)
Definition: tlist.h:695
struct m0_fop_ping_arr fp_arr
Definition: ping_fop.h:54
struct m0_rpc_item f_item
Definition: fop.h:83
static int run_client(void)
Definition: rpc_ping.c:279
struct m0_pdclust_src_addr src
Definition: fd.c:108
int32_t rc
Definition: trigger_fop.h:47
#define ARRAY_SIZE(a)
Definition: misc.h:45
struct m0_motr rsx_motr_ctx
Definition: rpclib.h:84
static const char * process_fid
Definition: idx_dix.c:73
static char client_endpoint[M0_NET_LNET_XEP_ADDR_LEN]
Definition: rpc_ping.c:92
Definition: fop.h:79
static char server_endpoint[M0_NET_LNET_XEP_ADDR_LEN]
Definition: rpc_ping.c:93
static char * client_nid
Definition: rpc_ping.c:83
void m0_cs_default_stypes_fini(void)
Definition: cs_service.c:174
static int server_tmid
Definition: rpc_ping.c:84
static int nr_client_threads
Definition: rpc_ping.c:86