Motr  M0
network.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/errno.h" /* E2BIG */
24 #include "lib/memory.h" /* M0_ALLOC_ARR */
25 #include "lib/misc.h" /* M0_SET0 */
26 #include "lib/vec.h" /* M0_SEG_SHIFT */
27 
28 #include "motr/magic.h" /* M0_NET_TEST_NETWORK_BD_MAGIC */
29 
30 #include "net/net.h" /* m0_net_buffer */
31 
32 #include "net/test/network.h"
33 
51 static struct m0_net_test_network_ctx *
53 {
54  return ev->nbe_buffer->nb_app_private;
55 }
56 
60 static uint32_t cb_buf_index_extract(const struct m0_net_buffer_event *ev,
62  enum m0_net_queue_type q)
63 {
64  struct m0_net_buffer *arr;
65  bool type_ping;
66  int index;
67  int index_max;
68 
69  M0_PRE(ctx != NULL);
70 
71  type_ping = q == M0_NET_QT_MSG_SEND || q == M0_NET_QT_MSG_RECV;
72  arr = type_ping ? ctx->ntc_buf_ping : ctx->ntc_buf_bulk;
73  index = ev->nbe_buffer - arr;
74  index_max = type_ping ? ctx->ntc_cfg.ntncfg_buf_ping_nr :
75  ctx->ntc_cfg.ntncfg_buf_bulk_nr;
76 
77  M0_POST(index >= 0 && index < index_max);
78 
79  return index;
80 }
81 
87 static void cb_default(const struct m0_net_buffer_event *ev)
88 {
89  struct m0_net_buffer *buf = ev->nbe_buffer;
91  uint32_t buf_index;
92  enum m0_net_queue_type q;
93 
94  M0_PRE(buf != NULL);
95  M0_PRE((buf->nb_flags & M0_NET_BUF_QUEUED) == 0);
96  q = ev->nbe_buffer->nb_qtype;
97 
98  ctx = cb_ctx_extract(ev);
99  M0_ASSERT(ctx != NULL);
100  buf_index = cb_buf_index_extract(ev, ctx, q);
101 
102  /* m0_net_buffer.nb_max_receive_msgs will be always set to 1 */
105  buf->nb_length = ev->nbe_length;
106  buf->nb_offset = 0;
107  }
108 
109  ctx->ntc_cfg.ntncfg_buf_cb.ntnbc_cb[q](ctx, buf_index, q, ev);
110 }
111 
113  .nbc_cb = {
120  }
121 };
122 
132  bool is_pingbuf)
133 {
134  int rc;
136  uint32_t seg_num;
137  m0_bcount_t seg_size_max;
138  m0_bcount_t buf_size_max;
139  struct m0_net_domain *dom;
140 
141  M0_PRE(buf != NULL);
142  M0_PRE(ctx != NULL);
143 
144  M0_SET0(buf);
145 
146  dom = ctx->ntc_dom;
147 
148  buf_size_max = m0_net_domain_get_max_buffer_size(dom);
149  if (size > buf_size_max)
150  return -E2BIG;
151 
152  if (USE_LIBFAB && is_pingbuf)
153  seg_size_max = buf_size_max;
154  else
156 
157  M0_ASSERT(seg_size_max > 0);
158 
159  seg_size = size < seg_size_max ? size : seg_size_max;
160  seg_num = size / seg_size_max + !!(size % seg_size_max);
161 
162  if (seg_size * seg_num > buf_size_max)
163  return -E2BIG;
164 
165  rc = m0_bufvec_alloc_aligned(&buf->nb_buffer, seg_num, seg_size,
166  M0_SEG_SHIFT);
167  if (rc == 0) {
168  buf->nb_length = size;
169  buf->nb_max_receive_msgs = 1;
170  buf->nb_min_receive_size = size;
171  buf->nb_offset = 0;
172  buf->nb_callbacks = &net_test_network_buf_cb;
173  buf->nb_ep = NULL;
174  buf->nb_desc.nbd_len = 0;
175  buf->nb_desc.nbd_data = NULL;
176  buf->nb_app_private = ctx;
177  buf->nb_timeout = M0_TIME_NEVER;
178 
180  if (rc != 0)
181  m0_bufvec_free_aligned(&buf->nb_buffer,
182  M0_SEG_SHIFT);
183  }
184  return rc;
185 }
186 
187 static void net_test_buf_fini(struct m0_net_buffer *buf,
188  struct m0_net_domain *dom)
189 {
190  M0_PRE(buf->nb_dom == dom);
191 
193  m0_bufvec_free_aligned(&buf->nb_buffer, M0_SEG_SHIFT);
194  m0_net_desc_free(&buf->nb_desc);
195 }
196 
198  uint32_t buf_nr,
199  struct m0_net_domain *dom)
200 {
201  int i;
202 
203  for (i = 0; i < buf_nr; ++i)
205 }
206 
208  uint32_t buf_nr,
211 {
212  int i;
213  int rc = 0;
214  struct m0_net_domain *dom = ctx->ntc_dom;
215  bool is_pingbuf = (buf == ctx->ntc_buf_ping);
216 
217  for (i = 0; i < buf_nr; ++i) {
218  rc = net_test_buf_init(&buf[i], size, ctx, is_pingbuf);
219  if (rc != 0)
220  break;
221  M0_ASSERT(buf[i].nb_dom == dom);
222  }
223  if (i != buf_nr)
225  return rc;
226 }
227 
229 static void net_test_tm_stop(struct m0_net_transfer_mc *tm)
230 {
231  int rc;
232  struct m0_clink tmwait;
233 
234  m0_clink_init(&tmwait, NULL);
235  m0_clink_add_lock(&tm->ntm_chan, &tmwait);
236 
237  rc = m0_net_tm_stop(tm, true);
238  M0_ASSERT(rc == 0);
239 
240  do {
241  m0_chan_wait(&tmwait);
242  } while (tm->ntm_state != M0_NET_TM_STOPPED &&
243  tm->ntm_state != M0_NET_TM_FAILED);
244 
245  m0_clink_del_lock(&tmwait);
246  m0_clink_fini(&tmwait);
247 }
248 
250 {
251  M0_PRE(ctx != NULL);
252 
253  return ctx->ntc_ep_nr <= ctx->ntc_cfg.ntncfg_ep_max;
254 }
255 
257  struct m0_net_test_network_cfg *cfg,
258  const char *tm_addr)
259 {
260  struct m0_clink tmwait;
261  int rc;
262  int i;
263 
264  M0_PRE(ctx != NULL);
265  M0_PRE(equi(cfg != NULL, tm_addr != NULL));
266 
267  if (cfg == NULL)
268  goto fini;
269 
270  M0_SET0(ctx);
271  ctx->ntc_cfg = *cfg;
272 
273  rc = -ENOMEM;
275  M0_ALLOC_PTR(ctx->ntc_dom);
276  if (ctx->ntc_dom == NULL)
277  goto fail;
278  M0_ALLOC_PTR(ctx->ntc_tm);
279  if (ctx->ntc_tm == NULL)
280  goto free_dom;
281  M0_ALLOC_ARR(ctx->ntc_buf_ping, ctx->ntc_cfg.ntncfg_buf_ping_nr);
282  if (ctx->ntc_buf_ping == NULL)
283  goto free_tm;
284  M0_ALLOC_ARR(ctx->ntc_buf_bulk, ctx->ntc_cfg.ntncfg_buf_bulk_nr);
285  if (ctx->ntc_buf_bulk == NULL)
286  goto free_buf_ping;
287  M0_ALLOC_ARR(ctx->ntc_ep, ctx->ntc_cfg.ntncfg_ep_max);
288  if (ctx->ntc_ep == NULL)
289  goto free_buf_bulk;
290 
292  if (rc != 0)
293  goto free_ep;
294 
295  /* init and start tm */
296  ctx->ntc_tm->ntm_state = M0_NET_TM_UNDEFINED;
297  ctx->ntc_tm->ntm_callbacks = &ctx->ntc_cfg.ntncfg_tm_cb;
299  rc = m0_net_tm_init(ctx->ntc_tm, ctx->ntc_dom);
300  if (rc != 0)
301  goto fini_dom;
302 
303  rc = ctx->ntc_cfg.ntncfg_sync ?
305  if (rc != 0)
306  goto fini_tm;
307 
308  m0_clink_init(&tmwait, NULL);
309  m0_clink_add_lock(&ctx->ntc_tm->ntm_chan, &tmwait);
310  rc = m0_net_tm_start(ctx->ntc_tm, tm_addr);
311  m0_chan_wait(&tmwait);
312  m0_clink_del_lock(&tmwait);
313  m0_clink_fini(&tmwait);
314  if (rc != 0)
315  goto fini_tm;
316  if (ctx->ntc_tm->ntm_state != M0_NET_TM_STARTED) {
317  rc = -ECONNREFUSED;
318  goto fini_tm;
319  }
320 
321  /* init and register buffers */
322  rc = net_test_bufs_init(ctx->ntc_buf_ping,
323  ctx->ntc_cfg.ntncfg_buf_ping_nr,
324  ctx->ntc_cfg.ntncfg_buf_size_ping, ctx);
325  if (rc != 0)
326  goto stop_tm;
327  rc = net_test_bufs_init(ctx->ntc_buf_bulk,
328  ctx->ntc_cfg.ntncfg_buf_bulk_nr,
329  ctx->ntc_cfg.ntncfg_buf_size_bulk, ctx);
330  if (rc != 0)
331  goto fini_buf_ping;
332 
334  goto success;
335 fini:
337 
338  rc = 0;
339  for (i = 0; i < ctx->ntc_ep_nr; ++i)
340  m0_net_end_point_put(ctx->ntc_ep[i]);
341  net_test_bufs_fini(ctx->ntc_buf_bulk, ctx->ntc_cfg.ntncfg_buf_bulk_nr,
342  ctx->ntc_dom);
343 fini_buf_ping:
344  net_test_bufs_fini(ctx->ntc_buf_ping, ctx->ntc_cfg.ntncfg_buf_ping_nr,
345  ctx->ntc_dom);
346 stop_tm:
347  net_test_tm_stop(ctx->ntc_tm);
348 fini_tm:
349  m0_net_tm_fini(ctx->ntc_tm);
350 fini_dom:
351  m0_net_domain_fini(ctx->ntc_dom);
352 free_ep:
353  m0_free(ctx->ntc_ep);
354 free_buf_bulk:
355  m0_free(ctx->ntc_buf_bulk);
356 free_buf_ping:
357  m0_free(ctx->ntc_buf_ping);
358 free_tm:
359  m0_free(ctx->ntc_tm);
360 free_dom:
361  m0_free(ctx->ntc_dom);
362 fail:
363 success:
364  return rc;
365 }
366 
368  struct m0_net_test_network_cfg *cfg,
369  const char *tm_addr)
370 {
371  return net_test_network_ctx_initfini(ctx, cfg, tm_addr);
372 }
373 
375 {
377  M0_ASSERT(rc == 0);
378 }
379 
381  const char *ep_addr)
382 {
383  int rc;
384 
386  M0_PRE(ep_addr != NULL);
387 
388  if (ctx->ntc_ep_nr != ctx->ntc_cfg.ntncfg_ep_max) {
389  rc = m0_net_end_point_create(&ctx->ntc_ep[ctx->ntc_ep_nr],
390  ctx->ntc_tm, ep_addr);
391  M0_ASSERT(rc <= 0);
392  if (rc == 0)
393  rc = ctx->ntc_ep_nr++;
394  } else {
395  rc = -E2BIG;
396  }
397  return rc;
398 }
399 
401  const struct m0_net_test_slist *eps)
402 {
403  int rc = 0;
404  size_t i;
405 
408 
409  for (i = 0; i < eps->ntsl_nr; ++i) {
411  if (rc < 0)
412  break;
413  }
414  if (rc < 0) {
415  /* m0_net_end_point_put() for last i endpoints */
416  for (; i != 0; --i)
417  m0_net_end_point_put(ctx->ntc_ep[--ctx->ntc_ep_nr]);
418  }
420 
421  return rc >= 0 ? 0 : rc;
422 }
423 
425  struct m0_net_buffer *nb,
426  enum m0_net_queue_type q)
427 {
428  m0_time_t timeout = ctx->ntc_cfg.ntncfg_timeouts.ntnt_timeout[q];
429 
430  M0_PRE((nb->nb_flags & M0_NET_BUF_QUEUED) == 0);
431  M0_PRE(ergo(q == M0_NET_QT_MSG_SEND, nb->nb_ep != NULL));
432 
433  nb->nb_qtype = q;
434  nb->nb_offset = 0; /* nb->nb_length already set */
435  nb->nb_ep = q != M0_NET_QT_MSG_SEND ? NULL : nb->nb_ep;
436  nb->nb_timeout = timeout == M0_TIME_NEVER ?
438 
439  return m0_net_buffer_add(nb, ctx->ntc_tm);
440 }
441 
443  uint32_t buf_ping_index,
444  struct m0_net_end_point *ep)
445 {
446  struct m0_net_buffer *nb;
447 
449  M0_PRE(buf_ping_index < ctx->ntc_cfg.ntncfg_buf_ping_nr);
450 
451  nb = &ctx->ntc_buf_ping[buf_ping_index];
452  nb->nb_ep = ep;
453 
455 }
456 
458  uint32_t buf_ping_index,
459  uint32_t ep_index)
460 {
462  M0_PRE(buf_ping_index < ctx->ntc_cfg.ntncfg_buf_ping_nr);
463  M0_PRE(ep_index < ctx->ntc_ep_nr);
464 
465  return m0_net_test_network_msg_send_ep(ctx, buf_ping_index,
466  ctx->ntc_ep[ep_index]);
467 }
468 
470  uint32_t buf_ping_index)
471 {
473  M0_PRE(buf_ping_index < ctx->ntc_cfg.ntncfg_buf_ping_nr);
474 
475  return net_test_buf_queue(ctx, &ctx->ntc_buf_ping[buf_ping_index],
477 }
478 
480  int32_t buf_bulk_index,
481  int32_t ep_index,
482  enum m0_net_queue_type q)
483 {
484  struct m0_net_buffer *buf;
485 
487  M0_PRE(buf_bulk_index < ctx->ntc_cfg.ntncfg_buf_bulk_nr);
488 
489  buf = &ctx->ntc_buf_bulk[buf_bulk_index];
492  M0_PRE(ep_index < ctx->ntc_ep_nr);
493  buf->nb_ep = ctx->ntc_ep[ep_index];
494  } else
495  buf->nb_ep = NULL;
496 
497  return net_test_buf_queue(ctx, buf, q);
498 }
499 
502  buf_type,
503  int32_t buf_index)
504 {
507  ctx->ntc_tm);
508 }
509 
513  uint64_t ntnbd_magic;
517  uint32_t ntnbd_len;
518 };
519 
522  FIELD_DESCR(struct net_test_network_bd, ntnbd_magic),
523  FIELD_DESCR(struct net_test_network_bd, ntnbd_buf_size),
524  FIELD_DESCR(struct net_test_network_bd, ntnbd_len),
525 };
526 
530  uint64_t ntnbh_magic;
532  uint64_t ntnbh_nr;
533 };
534 
537  FIELD_DESCR(struct net_test_network_bds_header, ntnbh_magic),
538  FIELD_DESCR(struct net_test_network_bds_header, ntnbh_nr),
539 };
540 
543  struct m0_net_buffer *buf,
544  struct m0_bufvec *bv,
545  m0_bcount_t bv_offset)
546 {
547  struct net_test_network_bd bd;
548  m0_bcount_t len;
549  m0_bcount_t len_total;
550 
551  M0_PRE(buf != NULL);
552  M0_PRE(bv != NULL);
553 
555  bd.ntnbd_buf_size = buf->nb_length;
556  bd.ntnbd_len = buf->nb_desc.nbd_len;
557 
558  len = m0_net_test_serialize(op, &bd,
560  bv, bv_offset);
561  if (len == 0)
562  return 0;
563  len_total = net_test_len_accumulate(0, len);
564 
565  /* optimizing memory allocation */
566  if (op == M0_NET_TEST_DESERIALIZE &&
567  buf->nb_desc.nbd_len != bd.ntnbd_len) {
568  /* free old */
569  m0_free(buf->nb_desc.nbd_data);
570  buf->nb_desc.nbd_len = 0;
571  /* alloc new */
572  buf->nb_desc.nbd_data = m0_alloc(bd.ntnbd_len);
573  if (buf->nb_desc.nbd_data == NULL)
574  return 0;
575  buf->nb_desc.nbd_len = bd.ntnbd_len;
576  }
577 
578  len = m0_net_test_serialize_data(op, buf->nb_desc.nbd_data,
579  buf->nb_desc.nbd_len, true,
580  bv, bv_offset + len_total);
581  len_total = net_test_len_accumulate(len_total, len);
582  return len_total;
583 }
584 
586  size_t *nr,
587  struct m0_bufvec *bv)
588 {
590  m0_bcount_t len;
591 
592  M0_PRE(nr != NULL);
593  M0_PRE(bv != NULL);
594 
595  if (op == M0_NET_TEST_SERIALIZE) {
597  header.ntnbh_nr = *nr;
598  }
599 
602  bv, 0);
603 
604  if (op == M0_NET_TEST_DESERIALIZE) {
605  if (header.ntnbh_magic == M0_NET_TEST_NETWORK_BDS_MAGIC)
606  *nr = header.ntnbh_nr;
607  else
608  len = 0;
609  }
610 
611  return len;
612 }
613 
627  uint32_t buf_ping_index,
628  int32_t value)
629 {
630  struct m0_bufvec *bv;
631  m0_bcount_t len;
632  size_t nr;
633 
634  M0_PRE(ctx != NULL);
635  M0_PRE(buf_ping_index < ctx->ntc_cfg.ntncfg_buf_ping_nr);
636  M0_PRE(M0_IN(value, (-1, 0, 1)));
637 
639  buf_ping_index)->nb_buffer;
641  M0_ASSERT(len != 0);
642  /* simply "get number of network bd" */
643  if (value == 0)
644  return nr;
645 
646  M0_ASSERT(ergo(value == -1, nr > 0));
647  nr += value;
649  M0_ASSERT(len != 0);
650 
651  return nr;
652 }
653 
657  uint32_t buf_bulk_index,
658  uint32_t buf_ping_index,
660 {
661  struct m0_net_buffer *buf;
662  struct m0_bufvec *bv;
663  m0_bcount_t len;
664  m0_bcount_t len_total;
665  size_t nr;
666 
668  M0_PRE(ctx != NULL);
669  M0_PRE(buf_bulk_index < ctx->ntc_cfg.ntncfg_buf_bulk_nr);
670  M0_PRE(buf_ping_index < ctx->ntc_cfg.ntncfg_buf_ping_nr);
671 
672  /*
673  M0_LOG(M0_DEBUG, "%d %s", op, ctx->ntc_tm->ntm_ep->nep_addr);
674  M0_LOG(M0_DEBUG, "bd_serialize: op = %d, tm_addr = %s, "
675  "buf_bulk_index = %u, buf_ping_index = %u, "
676  "offset = %lu",
677  op, ctx->ntc_tm->ntm_ep->nep_addr,
678  buf_bulk_index, buf_ping_index,
679  (long unsigned) offset);
680  */
681 
683  buf_ping_index)->nb_buffer;
684  M0_ASSERT(bv != NULL);
686  buf_bulk_index);
687  M0_ASSERT(buf != NULL);
688 
689  if (offset == 0) {
690  nr = 0;
691  /* include header length to the first descriptor length */
692  len = network_bds_serialize(op, &nr, bv);
693  if (len == 0)
694  return 0;
695  len_total = net_test_len_accumulate(0, len);
696  } else {
697  len_total = 0;
698  }
699  len = network_bd_serialize(op, buf, bv, offset + len_total);
700  len_total = net_test_len_accumulate(len_total, len);
701  /* increase number of descriptors for 'serialize' operation */
702  if (len_total != 0 && op == M0_NET_TEST_SERIALIZE)
703  network_bd_nr_add(ctx, buf_ping_index, 1);
704 
705  /*
706  M0_LOG(M0_DEBUG, "bd_serialize: len_total = %lu",
707  (long unsigned) len_total);
708  */
709  return len_total;
710 }
711 
713  uint32_t buf_ping_index)
714 {
715  return network_bd_nr_add(ctx, buf_ping_index, 0);
716 }
717 
719  uint32_t buf_ping_index)
720 {
721  network_bd_nr_add(ctx, buf_ping_index, -1);
722 }
723 
724 struct m0_net_buffer *
727  uint32_t buf_index)
728 {
729  M0_PRE(ctx != NULL);
732  M0_PRE(buf_index < (buf_type == M0_NET_TEST_BUF_PING ?
733  ctx->ntc_cfg.ntncfg_buf_ping_nr :
734  ctx->ntc_cfg.ntncfg_buf_bulk_nr));
735 
736  return buf_type == M0_NET_TEST_BUF_PING ?
737  &ctx->ntc_buf_ping[buf_index] : &ctx->ntc_buf_bulk[buf_index];
738 }
739 
743  uint32_t buf_index,
744  m0_bcount_t new_size) {
745  struct m0_net_buffer *buf;
746 
747  M0_PRE(ctx != NULL);
748 
749  buf = m0_net_test_network_buf(ctx, buf_type, buf_index);
750  M0_ASSERT(buf != NULL);
751 
752  net_test_buf_fini(buf, ctx->ntc_dom);
753  return net_test_buf_init(buf, new_size, ctx, true);
754 }
755 
758  uint32_t buf_index,
759  uint8_t fill)
760 {
761  struct m0_bufvec *bv;
762  struct m0_bufvec_cursor bc;
763  m0_bcount_t length;
764  m0_bcount_t i;
765  bool rc_bool;
766 
768 
769  bv = &m0_net_test_network_buf(ctx, buf_type, buf_index)->nb_buffer;
770  M0_ASSERT(bv != NULL);
771  length = m0_vec_count(&bv->ov_vec);
772  m0_bufvec_cursor_init(&bc, bv);
774  for (i = 0; i < length; ++i) {
775  * (uint8_t *) m0_bufvec_cursor_addr(&bc) = fill;
776  m0_bufvec_cursor_move(&bc, 1);
777  }
778  rc_bool = m0_bufvec_cursor_move(&bc, 0);
779  M0_ASSERT(rc_bool);
780 }
781 
782 struct m0_net_end_point *
784 {
786  M0_PRE(ep_index < ctx->ntc_ep_nr);
787 
788  return ctx->ntc_ep[ep_index];
789 }
790 
792  const char *ep_addr)
793 {
794  size_t addr_len = strlen(ep_addr) + 1;
795  size_t i;
796 
797  for (i = 0; i < ctx->ntc_ep_nr; ++i)
798  if (strncmp(ep_addr, ctx->ntc_ep[i]->nep_addr, addr_len) == 0)
799  return i;
800  return -1;
801 }
802 
804 {
805  struct m0_net_test_network_timeouts result;
806  int i;
807 
808  for (i = 0; i < M0_NET_QT_NR; ++i)
809  result.ntnt_timeout[i] = M0_TIME_NEVER;
810  return result;
811 }
812 
815 /*
816  * Local variables:
817  * c-indentation-style: "K&R"
818  * c-basic-offset: 8
819  * tab-width: 8
820  * fill-column: 79
821  * scroll-step: 1
822  * End:
823  */
static m0_bcount_t seg_size
Definition: net.c:118
M0_INTERNAL m0_bcount_t m0_net_domain_get_max_buffer_segment_size(struct m0_net_domain *dom)
TYPE_DESCR(net_test_network_bd)
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_INTERNAL void m0_chan_wait(struct m0_clink *link)
Definition: chan.c:336
#define M0_PRE(cond)
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
void m0_net_domain_fini(struct m0_net_domain *dom)
Definition: domain.c:71
M0_INTERNAL int m0_net_tm_start(struct m0_net_transfer_mc *tm, const char *addr)
Definition: tm.c:261
#define USE_LIBFAB
Definition: net.h:99
static struct m0_semaphore q
Definition: rwlock.c:55
#define NULL
Definition: misc.h:38
m0_bindex_t nb_offset
Definition: net.h:1344
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
Definition: chan.c:201
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
buf_type
Definition: service_ut.c:111
M0_INTERNAL void m0_clink_del_lock(struct m0_clink *link)
Definition: chan.c:293
struct m0_bufvec nb_buffer
Definition: net.h:1322
M0_INTERNAL int m0_net_buffer_register(struct m0_net_buffer *buf, struct m0_net_domain *dom)
Definition: buf.c:65
#define ergo(a, b)
Definition: misc.h:293
static const char * ep_addr
Definition: rpc_machine.c:35
const m0_time_t M0_TIME_NEVER
Definition: time.c:108
struct m0_net_end_point * m0_net_test_network_ep(struct m0_net_test_network_ctx *ctx, size_t ep_index)
Definition: network.c:783
uint64_t m0_time_t
Definition: time.h:37
int m0_net_test_network_ep_add(struct m0_net_test_network_ctx *ctx, const char *ep_addr)
Definition: network.c:380
m0_bcount_t m0_net_test_network_bd_serialize(enum m0_net_test_serialize_op op, struct m0_net_test_network_ctx *ctx, uint32_t buf_bulk_index, uint32_t buf_ping_index, m0_bcount_t offset)
Definition: network.c:655
struct m0_vec ov_vec
Definition: vec.h:147
enum m0_net_tm_state ntm_state
Definition: net.h:819
uint64_t nb_flags
Definition: net.h:1489
int const char const void * value
Definition: dir.c:325
int m0_net_test_network_msg_send_ep(struct m0_net_test_network_ctx *ctx, uint32_t buf_ping_index, struct m0_net_end_point *ep)
Definition: network.c:442
static size_t network_bd_nr_add(struct m0_net_test_network_ctx *ctx, uint32_t buf_ping_index, int32_t value)
Definition: network.c:626
M0_INTERNAL void * m0_bufvec_cursor_addr(struct m0_bufvec_cursor *cur)
Definition: vec.c:597
uint64_t m0_bcount_t
Definition: types.h:77
M0_INTERNAL bool m0_net_buffer_del(struct m0_net_buffer *buf, struct m0_net_transfer_mc *tm)
Definition: buf.c:261
static m0_bcount_t network_bds_serialize(enum m0_net_test_serialize_op op, size_t *nr, struct m0_bufvec *bv)
Definition: network.c:585
static int void * buf
Definition: dir.c:1019
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_bcount_t nbe_length
Definition: net.h:1226
struct m0_net_buffer * nbe_buffer
Definition: net.h:1194
m0_time_t ntnt_timeout[M0_NET_QT_NR]
Definition: network.h:71
m0_bcount_t ntnbd_buf_size
Definition: network.c:515
Definition: sock.c:887
int m0_bufvec_alloc_aligned(struct m0_bufvec *bufvec, uint32_t num_segs, m0_bcount_t seg_size, unsigned shift)
Definition: vec.c:355
uint64_t ntnbd_magic
Definition: network.c:513
op
Definition: libdemo.c:64
#define equi(a, b)
Definition: misc.h:297
Definition: sock.c:754
struct m0_chan ntm_chan
Definition: net.h:874
M0_INTERNAL bool m0_bufvec_cursor_move(struct m0_bufvec_cursor *cur, m0_bcount_t count)
Definition: vec.c:574
int m0_net_test_network_bulk_enqueue(struct m0_net_test_network_ctx *ctx, int32_t buf_bulk_index, int32_t ep_index, enum m0_net_queue_type q)
Definition: network.c:479
int i
Definition: dir.c:1033
static int net_test_buf_init(struct m0_net_buffer *buf, m0_bcount_t size, struct m0_net_test_network_ctx *ctx, bool is_pingbuf)
Definition: network.c:129
M0_INTERNAL int m0_net_tm_init(struct m0_net_transfer_mc *tm, struct m0_net_domain *dom)
Definition: tm.c:160
enum m0_net_queue_type nb_qtype
Definition: net.h:1363
#define M0_ASSERT(cond)
m0_time_t nb_timeout
Definition: net.h:1387
M0_INTERNAL void m0_net_tm_fini(struct m0_net_transfer_mc *tm)
Definition: tm.c:204
m0_time_t m0_time_now(void)
Definition: time.c:134
static void net_test_bufs_fini(struct m0_net_buffer *buf, uint32_t buf_nr, struct m0_net_domain *dom)
Definition: network.c:197
static uint32_t cb_buf_index_extract(const struct m0_net_buffer_event *ev, struct m0_net_test_network_ctx *ctx, enum m0_net_queue_type q)
Definition: network.c:60
static struct m0_stob_domain * dom
Definition: storage.c:38
M0_INTERNAL void m0_bufvec_cursor_init(struct m0_bufvec_cursor *cur, const struct m0_bufvec *bvec)
Definition: vec.c:563
void * nb_app_private
Definition: net.h:1477
struct m0_net_xprt * m0_net_xprt_default_get(void)
Definition: net.c:151
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
void * m0_alloc(size_t size)
Definition: memory.c:126
#define FIELD_DESCR(type, field)
Definition: serialize.h:63
#define M0_POST(cond)
m0_net_test_network_buf_type
Definition: network.h:45
M0_INTERNAL void m0_net_desc_free(struct m0_net_buf_desc *desc)
Definition: net.c:87
static struct m0_net_buffer_callbacks net_test_network_buf_cb
Definition: network.c:112
M0_INTERNAL m0_bcount_t m0_net_domain_get_max_buffer_size(struct m0_net_domain *dom)
m0_net_buffer_cb_proc_t nbc_cb[M0_NET_QT_NR]
Definition: net.h:1272
static m0_bindex_t offset
Definition: dump.c:173
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
size_t m0_net_test_network_bd_nr(struct m0_net_test_network_ctx *ctx, uint32_t buf_ping_index)
Definition: network.c:712
m0_time_t m0_time_add(const m0_time_t t1, const m0_time_t t2)
Definition: time.c:47
static struct fdmi_ctx ctx
Definition: main.c:80
M0_INTERNAL int m0_net_tm_stop(struct m0_net_transfer_mc *tm, bool abort)
Definition: tm.c:293
M0_INTERNAL void m0_bufvec_free_aligned(struct m0_bufvec *bufvec, unsigned shift)
Definition: vec.c:436
M0_INTERNAL m0_bcount_t m0_vec_count(const struct m0_vec *vec)
Definition: vec.c:53
static uint32_t timeout
Definition: console.c:52
void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link)
Definition: chan.c:255
bool m0_net_test_slist_invariant(const struct m0_net_test_slist *slist)
Definition: slist.c:97
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]
static void cb_default(const struct m0_net_buffer_event *ev)
Definition: network.c:87
M0_INTERNAL void m0_net_buffer_deregister(struct m0_net_buffer *buf, struct m0_net_domain *dom)
Definition: buf.c:107
int m0_net_domain_init(struct m0_net_domain *dom, const struct m0_net_xprt *xprt)
Definition: domain.c:36
char * ep
Definition: sw.h:132
M0_INTERNAL int m0_net_buffer_event_deliver_synchronously(struct m0_net_transfer_mc *tm)
Definition: tm.c:377
m0_net_test_serialize_op
Definition: serialize.h:42
static void net_test_tm_stop(struct m0_net_transfer_mc *tm)
Definition: network.c:229
static int net_test_buf_queue(struct m0_net_test_network_ctx *ctx, struct m0_net_buffer *nb, enum m0_net_queue_type q)
Definition: network.c:424
m0_net_queue_type
Definition: net.h:591
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
M0_INTERNAL int m0_net_buffer_add(struct m0_net_buffer *buf, struct m0_net_transfer_mc *tm)
Definition: buf.c:247
uint32_t ntnbd_len
Definition: network.c:517
static m0_bcount_t network_bd_serialize(enum m0_net_test_serialize_op op, struct m0_net_buffer *buf, struct m0_bufvec *bv, m0_bcount_t bv_offset)
Definition: network.c:542
m0_bcount_t size
Definition: di.c:39
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
Definition: chan.c:208
int fini(struct workload *w)
static int net_test_bufs_init(struct m0_net_buffer *buf, uint32_t buf_nr, m0_bcount_t size, struct m0_net_test_network_ctx *ctx)
Definition: network.c:207
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
void m0_net_test_network_buf_fill(struct m0_net_test_network_ctx *ctx, enum m0_net_test_network_buf_type buf_type, uint32_t buf_index, uint8_t fill)
Definition: network.c:756
ssize_t m0_net_test_network_ep_search(struct m0_net_test_network_ctx *ctx, const char *ep_addr)
Definition: network.c:791
Definition: nucleus.c:42
static void net_test_buf_fini(struct m0_net_buffer *buf, struct m0_net_domain *dom)
Definition: network.c:187
static int net_test_network_ctx_initfini(struct m0_net_test_network_ctx *ctx, struct m0_net_test_network_cfg *cfg, const char *tm_addr)
Definition: network.c:256
int m0_net_test_network_buf_resize(struct m0_net_test_network_ctx *ctx, enum m0_net_test_network_buf_type buf_type, uint32_t buf_index, m0_bcount_t new_size)
Definition: network.c:741
static struct m0_net_test_network_ctx * cb_ctx_extract(const struct m0_net_buffer_event *ev)
Definition: network.c:52
void m0_free(void *data)
Definition: memory.c:146
m0_bcount_t m0_net_test_serialize_data(enum m0_net_test_serialize_op op, void *data, m0_bcount_t data_len, bool plain_data, struct m0_bufvec *bv, m0_bcount_t bv_offset)
Definition: serialize.c:163
bool m0_net_test_network_ctx_invariant(struct m0_net_test_network_ctx *ctx)
Definition: network.c:249
int32_t rc
Definition: trigger_fop.h:47
M0_INTERNAL int m0_net_end_point_create(struct m0_net_end_point **epp, struct m0_net_transfer_mc *tm, const char *addr)
Definition: ep.c:56
void m0_net_test_network_bd_nr_dec(struct m0_net_test_network_ctx *ctx, uint32_t buf_ping_index)
Definition: network.c:718
#define USE_TYPE_DESCR(type_name)
Definition: serialize.h:57
char ** ntsl_list
Definition: slist.h:53
Definition: vec.h:145
struct m0_net_end_point * nb_ep
Definition: net.h:1424