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  if (rc == 0)
312  m0_chan_wait(&tmwait);
313  m0_clink_del_lock(&tmwait);
314  m0_clink_fini(&tmwait);
315  if (rc != 0)
316  goto fini_tm;
317  if (ctx->ntc_tm->ntm_state != M0_NET_TM_STARTED) {
318  rc = -ECONNREFUSED;
319  goto fini_tm;
320  }
321 
322  /* init and register buffers */
323  rc = net_test_bufs_init(ctx->ntc_buf_ping,
324  ctx->ntc_cfg.ntncfg_buf_ping_nr,
325  ctx->ntc_cfg.ntncfg_buf_size_ping, ctx);
326  if (rc != 0)
327  goto stop_tm;
328  rc = net_test_bufs_init(ctx->ntc_buf_bulk,
329  ctx->ntc_cfg.ntncfg_buf_bulk_nr,
330  ctx->ntc_cfg.ntncfg_buf_size_bulk, ctx);
331  if (rc != 0)
332  goto fini_buf_ping;
333 
335  goto success;
336 fini:
338 
339  rc = 0;
340  for (i = 0; i < ctx->ntc_ep_nr; ++i)
341  m0_net_end_point_put(ctx->ntc_ep[i]);
342  net_test_bufs_fini(ctx->ntc_buf_bulk, ctx->ntc_cfg.ntncfg_buf_bulk_nr,
343  ctx->ntc_dom);
344 fini_buf_ping:
345  net_test_bufs_fini(ctx->ntc_buf_ping, ctx->ntc_cfg.ntncfg_buf_ping_nr,
346  ctx->ntc_dom);
347 stop_tm:
348  net_test_tm_stop(ctx->ntc_tm);
349 fini_tm:
350  m0_net_tm_fini(ctx->ntc_tm);
351 fini_dom:
352  m0_net_domain_fini(ctx->ntc_dom);
353 free_ep:
354  m0_free(ctx->ntc_ep);
355 free_buf_bulk:
356  m0_free(ctx->ntc_buf_bulk);
357 free_buf_ping:
358  m0_free(ctx->ntc_buf_ping);
359 free_tm:
360  m0_free(ctx->ntc_tm);
361 free_dom:
362  m0_free(ctx->ntc_dom);
363 fail:
364 success:
365  return rc;
366 }
367 
369  struct m0_net_test_network_cfg *cfg,
370  const char *tm_addr)
371 {
372  return net_test_network_ctx_initfini(ctx, cfg, tm_addr);
373 }
374 
376 {
378  M0_ASSERT(rc == 0);
379 }
380 
382  const char *ep_addr)
383 {
384  int rc;
385 
387  M0_PRE(ep_addr != NULL);
388 
389  if (ctx->ntc_ep_nr != ctx->ntc_cfg.ntncfg_ep_max) {
390  rc = m0_net_end_point_create(&ctx->ntc_ep[ctx->ntc_ep_nr],
391  ctx->ntc_tm, ep_addr);
392  M0_ASSERT(rc <= 0);
393  if (rc == 0)
394  rc = ctx->ntc_ep_nr++;
395  } else {
396  rc = -E2BIG;
397  }
398  return rc;
399 }
400 
402  const struct m0_net_test_slist *eps)
403 {
404  int rc = 0;
405  size_t i;
406 
409 
410  for (i = 0; i < eps->ntsl_nr; ++i) {
412  if (rc < 0)
413  break;
414  }
415  if (rc < 0) {
416  /* m0_net_end_point_put() for last i endpoints */
417  for (; i != 0; --i)
418  m0_net_end_point_put(ctx->ntc_ep[--ctx->ntc_ep_nr]);
419  }
421 
422  return rc >= 0 ? 0 : rc;
423 }
424 
426  struct m0_net_buffer *nb,
427  enum m0_net_queue_type q)
428 {
429  m0_time_t timeout = ctx->ntc_cfg.ntncfg_timeouts.ntnt_timeout[q];
430 
431  M0_PRE((nb->nb_flags & M0_NET_BUF_QUEUED) == 0);
432  M0_PRE(ergo(q == M0_NET_QT_MSG_SEND, nb->nb_ep != NULL));
433 
434  nb->nb_qtype = q;
435  nb->nb_offset = 0; /* nb->nb_length already set */
436  nb->nb_ep = q != M0_NET_QT_MSG_SEND ? NULL : nb->nb_ep;
437  nb->nb_timeout = timeout == M0_TIME_NEVER ?
439 
440  return m0_net_buffer_add(nb, ctx->ntc_tm);
441 }
442 
444  uint32_t buf_ping_index,
445  struct m0_net_end_point *ep)
446 {
447  struct m0_net_buffer *nb;
448 
450  M0_PRE(buf_ping_index < ctx->ntc_cfg.ntncfg_buf_ping_nr);
451 
452  nb = &ctx->ntc_buf_ping[buf_ping_index];
453  nb->nb_ep = ep;
454 
456 }
457 
459  uint32_t buf_ping_index,
460  uint32_t ep_index)
461 {
463  M0_PRE(buf_ping_index < ctx->ntc_cfg.ntncfg_buf_ping_nr);
464  M0_PRE(ep_index < ctx->ntc_ep_nr);
465 
466  return m0_net_test_network_msg_send_ep(ctx, buf_ping_index,
467  ctx->ntc_ep[ep_index]);
468 }
469 
471  uint32_t buf_ping_index)
472 {
474  M0_PRE(buf_ping_index < ctx->ntc_cfg.ntncfg_buf_ping_nr);
475 
476  return net_test_buf_queue(ctx, &ctx->ntc_buf_ping[buf_ping_index],
478 }
479 
481  int32_t buf_bulk_index,
482  int32_t ep_index,
483  enum m0_net_queue_type q)
484 {
485  struct m0_net_buffer *buf;
486 
488  M0_PRE(buf_bulk_index < ctx->ntc_cfg.ntncfg_buf_bulk_nr);
489 
490  buf = &ctx->ntc_buf_bulk[buf_bulk_index];
493  M0_PRE(ep_index < ctx->ntc_ep_nr);
494  buf->nb_ep = ctx->ntc_ep[ep_index];
495  } else
496  buf->nb_ep = NULL;
497 
498  return net_test_buf_queue(ctx, buf, q);
499 }
500 
503  buf_type,
504  int32_t buf_index)
505 {
508  ctx->ntc_tm);
509 }
510 
514  uint64_t ntnbd_magic;
518  uint32_t ntnbd_len;
519 };
520 
523  FIELD_DESCR(struct net_test_network_bd, ntnbd_magic),
524  FIELD_DESCR(struct net_test_network_bd, ntnbd_buf_size),
525  FIELD_DESCR(struct net_test_network_bd, ntnbd_len),
526 };
527 
531  uint64_t ntnbh_magic;
533  uint64_t ntnbh_nr;
534 };
535 
538  FIELD_DESCR(struct net_test_network_bds_header, ntnbh_magic),
539  FIELD_DESCR(struct net_test_network_bds_header, ntnbh_nr),
540 };
541 
544  struct m0_net_buffer *buf,
545  struct m0_bufvec *bv,
546  m0_bcount_t bv_offset)
547 {
548  struct net_test_network_bd bd;
549  m0_bcount_t len;
550  m0_bcount_t len_total;
551 
552  M0_PRE(buf != NULL);
553  M0_PRE(bv != NULL);
554 
556  bd.ntnbd_buf_size = buf->nb_length;
557  bd.ntnbd_len = buf->nb_desc.nbd_len;
558 
559  len = m0_net_test_serialize(op, &bd,
561  bv, bv_offset);
562  if (len == 0)
563  return 0;
564  len_total = net_test_len_accumulate(0, len);
565 
566  /* optimizing memory allocation */
567  if (op == M0_NET_TEST_DESERIALIZE &&
568  buf->nb_desc.nbd_len != bd.ntnbd_len) {
569  /* free old */
570  m0_free(buf->nb_desc.nbd_data);
571  buf->nb_desc.nbd_len = 0;
572  /* alloc new */
573  buf->nb_desc.nbd_data = m0_alloc(bd.ntnbd_len);
574  if (buf->nb_desc.nbd_data == NULL)
575  return 0;
576  buf->nb_desc.nbd_len = bd.ntnbd_len;
577  }
578 
579  len = m0_net_test_serialize_data(op, buf->nb_desc.nbd_data,
580  buf->nb_desc.nbd_len, true,
581  bv, bv_offset + len_total);
582  len_total = net_test_len_accumulate(len_total, len);
583  return len_total;
584 }
585 
587  size_t *nr,
588  struct m0_bufvec *bv)
589 {
591  m0_bcount_t len;
592 
593  M0_PRE(nr != NULL);
594  M0_PRE(bv != NULL);
595 
596  if (op == M0_NET_TEST_SERIALIZE) {
598  header.ntnbh_nr = *nr;
599  }
600 
603  bv, 0);
604 
605  if (op == M0_NET_TEST_DESERIALIZE) {
606  if (header.ntnbh_magic == M0_NET_TEST_NETWORK_BDS_MAGIC)
607  *nr = header.ntnbh_nr;
608  else
609  len = 0;
610  }
611 
612  return len;
613 }
614 
628  uint32_t buf_ping_index,
629  int32_t value)
630 {
631  struct m0_bufvec *bv;
632  m0_bcount_t len;
633  size_t nr;
634 
635  M0_PRE(ctx != NULL);
636  M0_PRE(buf_ping_index < ctx->ntc_cfg.ntncfg_buf_ping_nr);
637  M0_PRE(M0_IN(value, (-1, 0, 1)));
638 
640  buf_ping_index)->nb_buffer;
642  M0_ASSERT(len != 0);
643  /* simply "get number of network bd" */
644  if (value == 0)
645  return nr;
646 
647  M0_ASSERT(ergo(value == -1, nr > 0));
648  nr += value;
650  M0_ASSERT(len != 0);
651 
652  return nr;
653 }
654 
658  uint32_t buf_bulk_index,
659  uint32_t buf_ping_index,
661 {
662  struct m0_net_buffer *buf;
663  struct m0_bufvec *bv;
664  m0_bcount_t len;
665  m0_bcount_t len_total;
666  size_t nr;
667 
669  M0_PRE(ctx != NULL);
670  M0_PRE(buf_bulk_index < ctx->ntc_cfg.ntncfg_buf_bulk_nr);
671  M0_PRE(buf_ping_index < ctx->ntc_cfg.ntncfg_buf_ping_nr);
672 
673  /*
674  M0_LOG(M0_DEBUG, "%d %s", op, ctx->ntc_tm->ntm_ep->nep_addr);
675  M0_LOG(M0_DEBUG, "bd_serialize: op = %d, tm_addr = %s, "
676  "buf_bulk_index = %u, buf_ping_index = %u, "
677  "offset = %lu",
678  op, ctx->ntc_tm->ntm_ep->nep_addr,
679  buf_bulk_index, buf_ping_index,
680  (long unsigned) offset);
681  */
682 
684  buf_ping_index)->nb_buffer;
685  M0_ASSERT(bv != NULL);
687  buf_bulk_index);
688  M0_ASSERT(buf != NULL);
689 
690  if (offset == 0) {
691  nr = 0;
692  /* include header length to the first descriptor length */
693  len = network_bds_serialize(op, &nr, bv);
694  if (len == 0)
695  return 0;
696  len_total = net_test_len_accumulate(0, len);
697  } else {
698  len_total = 0;
699  }
700  len = network_bd_serialize(op, buf, bv, offset + len_total);
701  len_total = net_test_len_accumulate(len_total, len);
702  /* increase number of descriptors for 'serialize' operation */
703  if (len_total != 0 && op == M0_NET_TEST_SERIALIZE)
704  network_bd_nr_add(ctx, buf_ping_index, 1);
705 
706  /*
707  M0_LOG(M0_DEBUG, "bd_serialize: len_total = %lu",
708  (long unsigned) len_total);
709  */
710  return len_total;
711 }
712 
714  uint32_t buf_ping_index)
715 {
716  return network_bd_nr_add(ctx, buf_ping_index, 0);
717 }
718 
720  uint32_t buf_ping_index)
721 {
722  network_bd_nr_add(ctx, buf_ping_index, -1);
723 }
724 
725 struct m0_net_buffer *
728  uint32_t buf_index)
729 {
730  M0_PRE(ctx != NULL);
733  M0_PRE(buf_index < (buf_type == M0_NET_TEST_BUF_PING ?
734  ctx->ntc_cfg.ntncfg_buf_ping_nr :
735  ctx->ntc_cfg.ntncfg_buf_bulk_nr));
736 
737  return buf_type == M0_NET_TEST_BUF_PING ?
738  &ctx->ntc_buf_ping[buf_index] : &ctx->ntc_buf_bulk[buf_index];
739 }
740 
744  uint32_t buf_index,
745  m0_bcount_t new_size) {
746  struct m0_net_buffer *buf;
747 
748  M0_PRE(ctx != NULL);
749 
750  buf = m0_net_test_network_buf(ctx, buf_type, buf_index);
751  M0_ASSERT(buf != NULL);
752 
753  net_test_buf_fini(buf, ctx->ntc_dom);
754  return net_test_buf_init(buf, new_size, ctx, true);
755 }
756 
759  uint32_t buf_index,
760  uint8_t fill)
761 {
762  struct m0_bufvec *bv;
763  struct m0_bufvec_cursor bc;
764  m0_bcount_t length;
765  m0_bcount_t i;
766  bool rc_bool;
767 
769 
770  bv = &m0_net_test_network_buf(ctx, buf_type, buf_index)->nb_buffer;
771  M0_ASSERT(bv != NULL);
772  length = m0_vec_count(&bv->ov_vec);
773  m0_bufvec_cursor_init(&bc, bv);
775  for (i = 0; i < length; ++i) {
776  * (uint8_t *) m0_bufvec_cursor_addr(&bc) = fill;
777  m0_bufvec_cursor_move(&bc, 1);
778  }
779  rc_bool = m0_bufvec_cursor_move(&bc, 0);
780  M0_ASSERT(rc_bool);
781 }
782 
783 struct m0_net_end_point *
785 {
787  M0_PRE(ep_index < ctx->ntc_ep_nr);
788 
789  return ctx->ntc_ep[ep_index];
790 }
791 
793  const char *ep_addr)
794 {
795  size_t addr_len = strlen(ep_addr) + 1;
796  size_t i;
797 
798  for (i = 0; i < ctx->ntc_ep_nr; ++i)
799  if (strncmp(ep_addr, ctx->ntc_ep[i]->nep_addr, addr_len) == 0)
800  return i;
801  return -1;
802 }
803 
805 {
806  struct m0_net_test_network_timeouts result;
807  int i;
808 
809  for (i = 0; i < M0_NET_QT_NR; ++i)
810  result.ntnt_timeout[i] = M0_TIME_NEVER;
811  return result;
812 }
813 
816 /*
817  * Local variables:
818  * c-indentation-style: "K&R"
819  * c-basic-offset: 8
820  * tab-width: 8
821  * fill-column: 79
822  * scroll-step: 1
823  * End:
824  */
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:501
struct m0_net_test_network_timeouts m0_net_test_network_timeouts_never(void)
Definition: network.c:804
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:470
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:368
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:784
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:381
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:656
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:443
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:627
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:586
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:516
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:514
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:480
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:375
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:458
size_t m0_net_test_network_bd_nr(struct m0_net_test_network_ctx *ctx, uint32_t buf_ping_index)
Definition: network.c:713
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:726
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:425
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:518
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:543
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:401
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:757
ssize_t m0_net_test_network_ep_search(struct m0_net_test_network_ctx *ctx, const char *ep_addr)
Definition: network.c:792
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:742
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:719
#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