Motr  M0
commands.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2013-2020 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 
23 #include "lib/types.h" /* m0_bcount_t */
24 #include "lib/misc.h" /* M0_SET0 */
25 #include "lib/memory.h" /* M0_ALLOC_ARR */
26 #include "lib/errno.h" /* ENOMEM */
27 #include "lib/trace.h" /* M0_LOG */
28 
29 #include "net/test/serialize.h" /* m0_net_test_serialize */
30 #include "net/test/str.h" /* m0_net_test_str */
31 
32 #include "net/test/commands.h"
33 
34 #define NET_TEST_MODULE_NAME commands
35 #include "net/test/debug.h" /* LOGD */
36 
37 
48 /* m0_net_test_cmd_descr */
50  FIELD_DESCR(struct m0_net_test_cmd, ntc_type),
51 };
52 
53 /* m0_net_test_cmd_done_descr */
55  FIELD_DESCR(struct m0_net_test_cmd_done, ntcd_errno),
56 };
57 
58 /* m0_net_test_cmd_init_descr */
60  FIELD_DESCR(struct m0_net_test_cmd_init, ntci_role),
61  FIELD_DESCR(struct m0_net_test_cmd_init, ntci_type),
62  FIELD_DESCR(struct m0_net_test_cmd_init, ntci_msg_nr),
63  FIELD_DESCR(struct m0_net_test_cmd_init, ntci_msg_size),
64  FIELD_DESCR(struct m0_net_test_cmd_init, ntci_bd_buf_nr),
65  FIELD_DESCR(struct m0_net_test_cmd_init, ntci_bd_buf_size),
66  FIELD_DESCR(struct m0_net_test_cmd_init, ntci_bd_nr_max),
67  FIELD_DESCR(struct m0_net_test_cmd_init, ntci_msg_concurrency),
68  FIELD_DESCR(struct m0_net_test_cmd_init, ntci_buf_send_timeout),
69  FIELD_DESCR(struct m0_net_test_cmd_init, ntci_buf_bulk_timeout),
70 };
71 
72 /* m0_net_test_msg_nr_descr */
74  FIELD_DESCR(struct m0_net_test_msg_nr, ntmn_total),
75  FIELD_DESCR(struct m0_net_test_msg_nr, ntmn_failed),
76  FIELD_DESCR(struct m0_net_test_msg_nr, ntmn_bad),
77 };
78 
79 /* m0_net_test_cmd_status_data_descr */
81  FIELD_DESCR(struct m0_net_test_cmd_status_data, ntcsd_time_start),
82  FIELD_DESCR(struct m0_net_test_cmd_status_data, ntcsd_time_finish),
83  FIELD_DESCR(struct m0_net_test_cmd_status_data, ntcsd_time_now),
84  FIELD_DESCR(struct m0_net_test_cmd_status_data, ntcsd_finished),
85 };
86 
87 static m0_bcount_t
89  struct m0_net_test_cmd_status_data *sd,
90  struct m0_bufvec *bv,
92 {
93  m0_bcount_t len;
94  m0_bcount_t len_total;
95  int i;
96  const struct m0_net_test_msg_nr *msg_nr[] = {
97  &sd->ntcsd_msg_nr_send,
98  &sd->ntcsd_msg_nr_recv,
99  &sd->ntcsd_bulk_nr_send,
100  &sd->ntcsd_bulk_nr_recv,
101  &sd->ntcsd_transfers,
102  };
103  const struct m0_net_test_stats *stats[] = {
106  &sd->ntcsd_rtt,
107  };
108 
109  M0_PRE(sd != NULL);
110 
112  M0_SET0(sd);
113 
114  len = m0_net_test_serialize(op, sd,
116  bv, offset);
117  len_total = net_test_len_accumulate(0, len);
118 
119  for (i = 0; i < ARRAY_SIZE(msg_nr) && len_total != 0; ++i) {
120  len = m0_net_test_serialize(op, (void *) msg_nr[i],
122  bv, offset + len_total);
123  len_total = net_test_len_accumulate(len_total, len);
124  }
125  for (i = 0; i < ARRAY_SIZE(stats) && len_total != 0; ++i) {
126  len = m0_net_test_stats_serialize(op, (void *) stats[i], bv,
127  offset + len_total);
128  len_total = net_test_len_accumulate(len_total, len);
129  }
130  return len_total;
131 }
132 
143  struct m0_net_test_cmd *cmd,
144  struct m0_net_buffer *buf,
146  m0_bcount_t *length)
147 {
148  struct m0_bufvec *bv = buf == NULL ? NULL : &buf->nb_buffer;
149  m0_bcount_t len;
150  m0_bcount_t len_total;
151 
152  M0_PRE(cmd != NULL);
154  bv, offset);
155  if (len == 0)
156  return -EINVAL;
157  len_total = net_test_len_accumulate(0, len);
158 
159  switch (cmd->ntc_type) {
161  len = m0_net_test_serialize(op, &cmd->ntc_init,
163  bv, offset + len_total);
164  if (len == 0)
165  break;
166  len_total = net_test_len_accumulate(len_total, len);
167 
169  bv, offset + len_total);
170  if (len == 0)
171  break;
172  len_total = net_test_len_accumulate(len_total, len);
173 
175  bv, offset + len_total);
176  break;
180  break;
183  bv, offset + len_total);
184  break;
188  len = m0_net_test_serialize(op, &cmd->ntc_done,
190  bv, offset + len_total);
191  break;
192  default:
193  return -ENOSYS;
194  };
195 
196  len_total = net_test_len_accumulate(len_total, len);
197  return len_total == 0 ? -EINVAL : 0;
198 }
199 
204 static void cmd_free(struct m0_net_test_cmd *cmd)
205 {
206  M0_PRE(cmd != NULL);
207 
208  if (cmd->ntc_type == M0_NET_TEST_CMD_INIT) {
211  }
212 }
213 
214 static struct m0_net_test_cmd_ctx *
216 {
217  M0_PRE(net_ctx != NULL);
218 
219  return container_of(net_ctx, struct m0_net_test_cmd_ctx, ntcc_net);
220 }
221 
222 static void commands_tm_event_cb(const struct m0_net_tm_event *ev)
223 {
224  /* nothing here for now */
225 }
226 
227 static void commands_cb_msg_recv(struct m0_net_test_network_ctx *net_ctx,
228  const uint32_t buf_index,
229  enum m0_net_queue_type q,
230  const struct m0_net_buffer_event *ev)
231 {
232  struct m0_net_test_cmd_ctx *ctx = cmd_ctx_extract(net_ctx);
233 
235  M0_PRE(buf_index >= ctx->ntcc_ep_nr && buf_index < ctx->ntcc_ep_nr * 2);
237  LOGD("M0_NET_QT_MSG_RECV commands callback from %s",
238  ev->nbe_ep == NULL ? "NULL" : ev->nbe_ep->nep_addr);
239 
240  /* save endpoint and buffer status */
241  if (ev->nbe_ep != NULL)
243  ctx->ntcc_buf_status[buf_index].ntcbs_ep = ev->nbe_ep;
244  ctx->ntcc_buf_status[buf_index].ntcbs_buf_status = ev->nbe_status;
245 
246  /* put buffer to ringbuf */
247  m0_net_test_ringbuf_push(&ctx->ntcc_rb, buf_index);
248 
249  /* m0_net_test_commands_recv() will down this semaphore */
250  m0_semaphore_up(&ctx->ntcc_sem_recv);
251 }
252 
253 static void commands_cb_msg_send(struct m0_net_test_network_ctx *net_ctx,
254  const uint32_t buf_index,
255  enum m0_net_queue_type q,
256  const struct m0_net_buffer_event *ev)
257 {
258  struct m0_net_test_cmd_ctx *ctx = cmd_ctx_extract(net_ctx);
259 
262  M0_PRE(buf_index < ctx->ntcc_ep_nr);
263  LOGD("M0_NET_QT_MSG_SEND commands callback to %s",
264  ev->nbe_buffer->nb_ep == NULL ? "NULL" :
265  ev->nbe_buffer->nb_ep->nep_addr);
266 
267  /* invoke 'message sent' callback if it is present */
268  if (ctx->ntcc_send_cb != NULL)
269  ctx->ntcc_send_cb(ctx, buf_index, ev->nbe_status);
270 
271  m0_semaphore_up(&ctx->ntcc_sem_send);
272 }
273 
275  const uint32_t buf_index,
276  enum m0_net_queue_type q,
277  const struct m0_net_buffer_event *ev)
278 {
279 
280  M0_IMPOSSIBLE("commands bulk buffer callback is impossible");
281 }
282 
285 };
286 
288  .ntnbc_cb = {
295  }
296 };
297 
299  size_t buf_index)
300 {
301  int rc;
302 
303  M0_PRE(buf_index >= ctx->ntcc_ep_nr && buf_index < ctx->ntcc_ep_nr * 2);
304 
305  ctx->ntcc_buf_status[buf_index].ntcbs_in_recv_queue = true;
306  rc = m0_net_test_network_msg_recv(&ctx->ntcc_net, buf_index);
307  if (rc != 0)
308  ctx->ntcc_buf_status[buf_index].ntcbs_in_recv_queue = false;
309 
310  return rc;
311 }
312 
314  size_t buf_index)
315 {
317  buf_index);
318 }
319 
321  size_t buf_index)
322 {
323  if (ctx->ntcc_buf_status[buf_index].ntcbs_ep != NULL)
324  m0_net_end_point_put(ctx->ntcc_buf_status[buf_index].ntcbs_ep);
325 }
326 
328  size_t buf_index)
329 {
330  M0_PRE(buf_index >= ctx->ntcc_ep_nr && buf_index < ctx->ntcc_ep_nr * 2);
331 
332  return ctx->ntcc_buf_status[buf_index].ntcbs_in_recv_queue;
333 }
334 
336  size_t nr)
337 {
338  size_t i;
339 
340  /* remove recv buffers from queue */
341  for (i = 0; i < nr; ++i)
342  if (is_buf_in_recv_q(ctx, ctx->ntcc_ep_nr + i))
343  commands_recv_dequeue(ctx, ctx->ntcc_ep_nr + i);
344  /* wait until callbacks executed */
345  for (i = 0; i < nr; ++i)
346  if (is_buf_in_recv_q(ctx, ctx->ntcc_ep_nr + i))
347  m0_semaphore_down(&ctx->ntcc_sem_recv);
348  /* release endpoints */
349  for (i = 0; i < nr; ++i)
350  if (is_buf_in_recv_q(ctx, ctx->ntcc_ep_nr + i))
351  commands_recv_ep_put(ctx, ctx->ntcc_ep_nr + i);
352 }
353 
355  const char *cmd_ep,
356  m0_time_t send_timeout,
358  struct m0_net_test_slist *ep_list,
359  bool init)
360 {
361  struct m0_net_test_network_cfg net_cfg;
362  int i;
363  int rc = -EEXIST;
364 
365  M0_PRE(ctx != NULL);
366  if (!init)
367  goto fini;
368 
369  M0_PRE(ep_list->ntsl_nr > 0);
370  M0_SET0(ctx);
371 
372  if (!m0_net_test_slist_unique(ep_list))
373  goto fail;
374 
375  ctx->ntcc_ep_nr = ep_list->ntsl_nr;
376  ctx->ntcc_send_cb = send_cb;
377 
378  m0_mutex_init(&ctx->ntcc_send_mutex);
379  rc = m0_semaphore_init(&ctx->ntcc_sem_send, 0);
380  if (rc != 0)
381  goto fail;
382  rc = m0_semaphore_init(&ctx->ntcc_sem_recv, 0);
383  if (rc != 0)
384  goto free_sem_send;
385 
386  rc = m0_net_test_ringbuf_init(&ctx->ntcc_rb, ctx->ntcc_ep_nr * 2);
387  if (rc != 0)
388  goto free_sem_recv;
389 
390  M0_ALLOC_ARR(ctx->ntcc_buf_status, ctx->ntcc_ep_nr * 2);
391  if (ctx->ntcc_buf_status == NULL)
392  goto free_rb;
393 
394  M0_SET0(&net_cfg);
398  net_cfg.ntncfg_buf_ping_nr = 2 * ctx->ntcc_ep_nr;
399  net_cfg.ntncfg_ep_max = ep_list->ntsl_nr;
401  net_cfg.ntncfg_timeouts.ntnt_timeout[M0_NET_QT_MSG_SEND] = send_timeout;
402 
403  rc = m0_net_test_network_ctx_init(&ctx->ntcc_net, &net_cfg, cmd_ep);
404  if (rc != 0)
405  goto free_buf_status;
406 
407  rc = m0_net_test_network_ep_add_slist(&ctx->ntcc_net, ep_list);
408  if (rc != 0)
409  goto free_net_ctx;
410  for (i = 0; i < ctx->ntcc_ep_nr; ++i) {
411  rc = commands_recv_enqueue(ctx, ctx->ntcc_ep_nr + i);
412  if (rc != 0) {
414  goto free_net_ctx;
415  }
416  }
418  rc = 0;
419  goto success;
420 
421  fini:
424  commands_recv_dequeue_nr(ctx, ctx->ntcc_ep_nr);
425  free_net_ctx:
426  m0_net_test_network_ctx_fini(&ctx->ntcc_net);
427  free_buf_status:
428  m0_free(ctx->ntcc_buf_status);
429  free_rb:
430  m0_net_test_ringbuf_fini(&ctx->ntcc_rb);
431  free_sem_recv:
432  m0_semaphore_fini(&ctx->ntcc_sem_recv);
433  free_sem_send:
434  m0_semaphore_fini(&ctx->ntcc_sem_send);
435  fail:
436  m0_mutex_fini(&ctx->ntcc_send_mutex);
437  success:
438  return rc;
439 }
440 
442  const char *cmd_ep,
443  m0_time_t send_timeout,
445  struct m0_net_test_slist *ep_list)
446 {
447  return commands_initfini(ctx, cmd_ep, send_timeout, send_cb, ep_list,
448  true);
449 }
450 
452 {
454  M0_SET0(ctx);
455 }
456 
458  struct m0_net_test_cmd *cmd)
459 {
460  struct m0_net_buffer *buf;
461  int rc;
462  size_t buf_index;
463 
465  M0_PRE(cmd != NULL);
466 
467  LOGD("m0_net_test_commands_send: from %s to %lu %s cmd->ntc_type = %d",
468  ctx->ntcc_net.ntc_tm->ntm_ep->nep_addr, cmd->ntc_ep_index,
469  ctx->ntcc_net.ntc_ep[cmd->ntc_ep_index]->nep_addr,
470  cmd->ntc_type);
471 
472  buf_index = cmd->ntc_ep_index;
474  buf_index);
475 
477  if (rc == 0)
478  rc = m0_net_test_network_msg_send(&ctx->ntcc_net, buf_index,
479  cmd->ntc_ep_index);
480 
481  if (rc == 0) {
482  m0_mutex_lock(&ctx->ntcc_send_mutex);
483  ctx->ntcc_send_nr++;
484  m0_mutex_unlock(&ctx->ntcc_send_mutex);
485  }
486 
487  return rc;
488 }
489 
491 {
492  int64_t nr;
493  int64_t i;
494 
495  LOGD("m0_net_test_commands_send_wait_all enter");
497 
498  m0_mutex_lock(&ctx->ntcc_send_mutex);
499  nr = ctx->ntcc_send_nr;
500  ctx->ntcc_send_nr = 0;
501  m0_mutex_unlock(&ctx->ntcc_send_mutex);
502 
503  LOGD("nr = %ld", (long) nr);
504  for (i = 0; i < nr; ++i) {
505  LOGD("semaphore_down() #%ld", (long) i);
506  m0_semaphore_down(&ctx->ntcc_sem_send);
507  }
508  LOGD("m0_net_test_commands_send_wait_all leave");
509 }
510 
512  struct m0_net_test_cmd *cmd,
513  m0_time_t deadline)
514 {
515  struct m0_net_buffer *buf;
516  struct m0_net_end_point *ep;
517  bool rc_bool;
518  size_t buf_index;
519  int rc;
520 
522  M0_PRE(cmd != NULL);
523 
524  /* wait for received buffer */
525  rc_bool = m0_semaphore_timeddown(&ctx->ntcc_sem_recv, deadline);
526  /* buffer wasn't received before deadline */
527  if (!rc_bool)
528  return -ETIMEDOUT;
529 
530  /* get buffer */
531  buf_index = m0_net_test_ringbuf_pop(&ctx->ntcc_rb);
532  M0_ASSERT(is_buf_in_recv_q(ctx, buf_index));
534  buf_index);
535 
536  /* set m0_net_test_cmd.ntc_buf_index */
537  cmd->ntc_buf_index = buf_index;
538 
539  /* check saved m0_net_buffer_event.nbe_status */
540  rc = ctx->ntcc_buf_status[buf_index].ntcbs_buf_status;
541  if (rc != 0)
542  goto done;
543 
544  /* deserialize buffer to cmd */
546  if (rc != 0)
548 
549  /* set m0_net_test_cmd.ntc_ep_index and release endpoint */
550  ep = ctx->ntcc_buf_status[buf_index].ntcbs_ep;
551  M0_ASSERT(ep != NULL);
553  ep->nep_addr);
555 
556 done:
557  /* buffer now not in receive queue */
558  ctx->ntcc_buf_status[buf_index].ntcbs_in_recv_queue = false;
559 
560  LOGD("m0_net_test_commands_recv: from %lu %s to %s "
561  "rc = %d cmd->ntc_type = %d",
562  cmd->ntc_ep_index,
563  ctx->ntcc_net.ntc_ep[cmd->ntc_ep_index]->nep_addr,
564  ctx->ntcc_net.ntc_tm->ntm_ep->nep_addr,
565  rc, cmd->ntc_type);
566 
567  return rc;
568 }
569 
571  size_t buf_index)
572 {
574 
575  return commands_recv_enqueue(ctx, buf_index);
576 }
577 
579 {
580  cmd_free(cmd);
581 }
582 
584 {
585 
586  if (ctx == NULL)
587  return false;
588  if (ctx->ntcc_ep_nr == 0)
589  return false;
590  if (ctx->ntcc_ep_nr != ctx->ntcc_net.ntc_ep_nr)
591  return false;
592  if (ctx->ntcc_ep_nr * 2 != ctx->ntcc_net.ntc_cfg.ntncfg_buf_ping_nr)
593  return false;
594  if (ctx->ntcc_net.ntc_cfg.ntncfg_buf_bulk_nr != 0)
595  return false;
596  return true;
597 }
598 
599 #undef NET_TEST_MODULE_NAME
600 
603 /*
604  * Local variables:
605  * c-indentation-style: "K&R"
606  * c-basic-offset: 8
607  * tab-width: 8
608  * fill-column: 79
609  * scroll-step: 1
610  * End:
611  */
void m0_net_test_network_buffer_dequeue(struct m0_net_test_network_ctx *ctx, enum m0_net_test_network_buf_type buf_type, int32_t buf_index)
Definition: network.c:500
struct m0_net_test_network_timeouts m0_net_test_network_timeouts_never(void)
Definition: network.c:803
static size_t nr
Definition: dump.c:1505
m0_bcount_t m0_net_test_stats_serialize(enum m0_net_test_serialize_op op, struct m0_net_test_stats *stats, struct m0_bufvec *bv, m0_bcount_t bv_offset)
Definition: stats.c:135
#define M0_PRE(cond)
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
struct m0_net_test_slist ntci_ep
Definition: commands.h:157
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
Definition: mutex.c:66
int m0_net_test_commands_init(struct m0_net_test_cmd_ctx *ctx, const char *cmd_ep, m0_time_t send_timeout, m0_net_test_commands_send_cb_t send_cb, struct m0_net_test_slist *ep_list)
Definition: commands.c:441
uint32_t ntncfg_buf_ping_nr
Definition: network.h:86
static struct m0_semaphore q
Definition: rwlock.c:55
#define NULL
Definition: misc.h:38
int m0_net_test_network_msg_recv(struct m0_net_test_network_ctx *ctx, uint32_t buf_ping_index)
Definition: network.c:469
int m0_net_test_network_ctx_init(struct m0_net_test_network_ctx *ctx, struct m0_net_test_network_cfg *cfg, const char *tm_addr)
Definition: network.c:367
m0_bcount_t m0_net_test_serialize(enum m0_net_test_serialize_op op, void *obj, const struct m0_net_test_descr descr[], size_t descr_nr, struct m0_bufvec *bv, m0_bcount_t bv_offset)
Definition: serialize.c:176
struct m0_net_test_mps ntcsd_mps_recv
Definition: commands.h:186
static m0_bcount_t cmd_status_data_serialize(enum m0_net_test_serialize_op op, struct m0_net_test_cmd_status_data *sd, struct m0_bufvec *bv, m0_bcount_t offset)
Definition: commands.c:88
const m0_time_t M0_TIME_NEVER
Definition: time.c:108
static int commands_initfini(struct m0_net_test_cmd_ctx *ctx, const char *cmd_ep, m0_time_t send_timeout, m0_net_test_commands_send_cb_t send_cb, struct m0_net_test_slist *ep_list, bool init)
Definition: commands.c:354
struct m0_net_test_stats ntcsd_rtt
Definition: commands.h:192
uint64_t m0_time_t
Definition: time.h:37
M0_INTERNAL bool m0_semaphore_timeddown(struct m0_semaphore *semaphore, const m0_time_t abs_timeout)
Definition: semaphore.c:75
struct m0_net_test_cmd_status_data ntc_status_data
Definition: commands.h:209
m0_net_test_network_buffer_cb_proc_t ntnbc_cb[M0_NET_QT_NR]
Definition: network.h:66
int m0_net_test_ringbuf_init(struct m0_net_test_ringbuf *rb, size_t size)
Definition: ringbuf.c:36
static const struct m0_net_tm_callbacks net_test_commands_tm_cb
Definition: commands.c:283
int m0_net_test_commands_recv_enqueue(struct m0_net_test_cmd_ctx *ctx, size_t buf_index)
Definition: commands.c:570
static void commands_cb_msg_recv(struct m0_net_test_network_ctx *net_ctx, const uint32_t buf_index, enum m0_net_queue_type q, const struct m0_net_buffer_event *ev)
Definition: commands.c:227
uint64_t m0_bcount_t
Definition: types.h:77
TYPE_DESCR(m0_net_test_cmd)
static int void * buf
Definition: dir.c:1019
const char * nep_addr
Definition: net.h:503
#define container_of(ptr, type, member)
Definition: misc.h:33
static m0_bcount_t net_test_len_accumulate(m0_bcount_t accumulator, m0_bcount_t addend)
Definition: serialize.h:122
#define M0_SET0(obj)
Definition: misc.h:64
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
Definition: mutex.c:49
struct m0_net_test_msg_nr ntcsd_bulk_nr_send
Definition: commands.h:170
struct m0_net_buffer * nbe_buffer
Definition: net.h:1194
m0_time_t ntnt_timeout[M0_NET_QT_NR]
Definition: network.h:71
static void commands_recv_dequeue_nr(struct m0_net_test_cmd_ctx *ctx, size_t nr)
Definition: commands.c:335
struct m0_net_end_point * nbe_ep
Definition: net.h:1251
struct m0_net_test_msg_nr ntcsd_transfers
Definition: commands.h:174
Definition: sock.c:887
static void commands_recv_ep_put(struct m0_net_test_cmd_ctx *ctx, size_t buf_index)
Definition: commands.c:320
op
Definition: libdemo.c:64
Definition: sock.c:754
bool m0_net_test_slist_unique(const struct m0_net_test_slist *slist)
Definition: slist.c:129
int i
Definition: dir.c:1033
size_t m0_net_test_ringbuf_pop(struct m0_net_test_ringbuf *rb)
Definition: ringbuf.c:88
int32_t nbe_status
Definition: net.h:1218
#define LOGD(...)
Definition: tx_regmap.c:37
void m0_net_test_commands_received_free(struct m0_net_test_cmd *cmd)
Definition: commands.c:578
static void commands_cb_msg_send(struct m0_net_test_network_ctx *net_ctx, const uint32_t buf_index, enum m0_net_queue_type q, const struct m0_net_buffer_event *ev)
Definition: commands.c:253
void m0_net_test_commands_fini(struct m0_net_test_cmd_ctx *ctx)
Definition: commands.c:451
void m0_net_test_ringbuf_fini(struct m0_net_test_ringbuf *rb)
Definition: ringbuf.c:52
struct m0_net_test_cmd_init ntc_init
Definition: commands.h:208
#define m0_free0(pptr)
Definition: memory.h:77
struct m0_net_test_network_buffer_callbacks ntncfg_buf_cb
Definition: network.h:82
int m0_net_test_commands_send(struct m0_net_test_cmd_ctx *ctx, struct m0_net_test_cmd *cmd)
Definition: commands.c:457
#define M0_ASSERT(cond)
static void commands_recv_dequeue(struct m0_net_test_cmd_ctx *ctx, size_t buf_index)
Definition: commands.c:313
void m0_net_test_slist_fini(struct m0_net_test_slist *slist)
Definition: slist.c:120
void(* ntc_event_cb)(const struct m0_net_tm_event *ev)
Definition: net.h:752
static int cmd_serialize(enum m0_net_test_serialize_op op, struct m0_net_test_cmd *cmd, struct m0_net_buffer *buf, m0_bcount_t offset, m0_bcount_t *length)
Definition: commands.c:142
void m0_net_test_commands_send_wait_all(struct m0_net_test_cmd_ctx *ctx)
Definition: commands.c:490
struct m0_net_test_mps ntcsd_mps_send
Definition: commands.h:184
struct m0_net_test_msg_nr ntcsd_msg_nr_recv
Definition: commands.h:168
void m0_net_test_ringbuf_push(struct m0_net_test_ringbuf *rb, size_t value)
Definition: ringbuf.c:77
int m0_net_test_commands_recv(struct m0_net_test_cmd_ctx *ctx, struct m0_net_test_cmd *cmd, m0_time_t deadline)
Definition: commands.c:511
static void cmd_free(struct m0_net_test_cmd *cmd)
Definition: commands.c:204
void m0_net_test_network_ctx_fini(struct m0_net_test_network_ctx *ctx)
Definition: network.c:374
size_t ntsl_nr
Definition: slist.h:49
M0_INTERNAL int m0_semaphore_init(struct m0_semaphore *semaphore, unsigned value)
Definition: semaphore.c:38
static struct m0_net_test_cmd_ctx * cmd_ctx_extract(struct m0_net_test_network_ctx *net_ctx)
Definition: commands.c:215
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
Definition: mutex.c:35
#define FIELD_DESCR(type, field)
Definition: serialize.h:63
#define M0_POST(cond)
M0_INTERNAL void m0_net_end_point_get(struct m0_net_end_point *ep)
Definition: ep.c:88
static m0_bindex_t offset
Definition: dump.c:173
m0_bcount_t m0_net_test_str_serialize(enum m0_net_test_serialize_op op, char **str, struct m0_bufvec *bv, m0_bcount_t bv_offset)
Definition: str.c:57
int m0_net_test_network_msg_send(struct m0_net_test_network_ctx *ctx, uint32_t buf_ping_index, uint32_t ep_index)
Definition: network.c:457
void(* m0_net_test_commands_send_cb_t)(struct m0_net_test_cmd_ctx *ctx, size_t ep_index, int buf_status)
Definition: commands.h:238
struct m0_net_test_msg_nr ntcsd_msg_nr_send
Definition: commands.h:166
ssize_t ntc_ep_index
Definition: commands.h:218
int init(struct workload *w)
void m0_net_end_point_put(struct m0_net_end_point *ep)
Definition: ep.c:98
struct m0_net_buffer * m0_net_test_network_buf(struct m0_net_test_network_ctx *ctx, enum m0_net_test_network_buf_type buf_type, uint32_t buf_index)
Definition: network.c:725
static uint8_t fail[DATA_UNIT_COUNT_MAX+PARITY_UNIT_COUNT_MAX]
size_t ntc_buf_index
Definition: commands.h:220
struct m0_net_test_cmd_done ntc_done
Definition: commands.h:207
char * ep
Definition: sw.h:132
uint32_t ntncfg_ep_max
Definition: network.h:92
m0_net_test_serialize_op
Definition: serialize.h:42
m0_net_queue_type
Definition: net.h:591
M0_INTERNAL void m0_semaphore_fini(struct m0_semaphore *semaphore)
Definition: semaphore.c:45
Definition: beck.c:130
m0_bcount_t m0_net_test_slist_serialize(enum m0_net_test_serialize_op op, struct m0_net_test_slist *slist, struct m0_bufvec *bv, m0_bcount_t offset)
Definition: slist.c:235
m0_bcount_t ntncfg_buf_size_ping
Definition: network.h:84
static int commands_recv_enqueue(struct m0_net_test_cmd_ctx *ctx, size_t buf_index)
Definition: commands.c:298
bool m0_net_test_commands_invariant(struct m0_net_test_cmd_ctx *ctx)
Definition: commands.c:583
static void commands_tm_event_cb(const struct m0_net_tm_event *ev)
Definition: commands.c:222
static bool is_buf_in_recv_q(struct m0_net_test_cmd_ctx *ctx, size_t buf_index)
Definition: commands.c:327
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
Definition: mutex.c:42
struct m0_net_test_msg_nr ntcsd_bulk_nr_recv
Definition: commands.h:172
struct m0_net_test_network_timeouts ntncfg_timeouts
Definition: network.h:97
struct m0_net_test_network_ctx ntcc_net
Definition: commands.h:251
static void commands_cb_impossible(struct m0_net_test_network_ctx *ctx, const uint32_t buf_index, enum m0_net_queue_type q, const struct m0_net_buffer_event *ev)
Definition: commands.c:274
enum m0_net_test_cmd_type ntc_type
Definition: commands.h:204
int fini(struct workload *w)
int m0_net_test_network_ep_add_slist(struct m0_net_test_network_ctx *ctx, const struct m0_net_test_slist *eps)
Definition: network.c:400
static unsigned done
Definition: storage.c:91
ssize_t m0_net_test_network_ep_search(struct m0_net_test_network_ctx *ctx, const char *ep_addr)
Definition: network.c:791
M0_INTERNAL void m0_semaphore_down(struct m0_semaphore *semaphore)
Definition: semaphore.c:49
Definition: nucleus.c:42
M0_INTERNAL void m0_semaphore_up(struct m0_semaphore *semaphore)
Definition: semaphore.c:65
void m0_free(void *data)
Definition: memory.c:146
int32_t rc
Definition: trigger_fop.h:47
struct m0_net_test_stats ntmps_stats
Definition: stats.h:250
#define ARRAY_SIZE(a)
Definition: misc.h:45
struct m0_net_tm_callbacks ntncfg_tm_cb
Definition: network.h:80
#define USE_TYPE_DESCR(type_name)
Definition: serialize.h:57
Definition: vec.h:145
struct m0_net_end_point * nb_ep
Definition: net.h:1424
static const struct m0_net_test_network_buffer_callbacks commands_buffer_cb
Definition: commands.c:287
#define M0_IMPOSSIBLE(fmt,...)