Test(rdm_sr, send_readfrom) { int ret; int source_done = 0, dest_done = 0; struct fi_cq_tagged_entry s_cqe, d_cqe; ssize_t sz; fi_addr_t src_addr; int len = 64; uint64_t s[NUMEPS] = {0}, r[NUMEPS] = {0}, s_e[NUMEPS] = {0}; uint64_t r_e[NUMEPS] = {0}; rdm_sr_init_data(source, len, 0xab); rdm_sr_init_data(target, len, 0); sz = fi_send(ep[0], source, len, loc_mr[0], gni_addr[1], target); cr_assert_eq(sz, 0); sz = fi_recv(ep[1], target, len, rem_mr[0], gni_addr[0], source); cr_assert_eq(sz, 0); /* need to progress both CQs simultaneously for rendezvous */ do { ret = fi_cq_read(msg_cq[0], &s_cqe, 1); if (ret == 1) { source_done = 1; } ret = fi_cq_readfrom(msg_cq[1], &d_cqe, 1, &src_addr); if (ret == 1) { dest_done = 1; } } while (!(source_done && dest_done)); rdm_sr_check_cqe(&s_cqe, target, (FI_MSG|FI_SEND), 0, 0, 0); rdm_sr_check_cqe(&d_cqe, source, (FI_MSG|FI_RECV), target, len, 0); s[0] = 1; r[1] = 1; rdm_sr_check_cntrs(s, r, s_e, r_e); cr_assert(src_addr == gni_addr[0], "src_addr mismatch"); dbg_printf("got context events!\n"); cr_assert(rdm_sr_check_data(source, target, len), "Data mismatch"); }
static int server_connect(void) { int ret; struct fi_cq_entry comp; ret = common_setup(); if (ret != 0) goto err; do { ret = fi_cq_readfrom(rcq, &comp, sizeof comp, &client_addr); if (ret < 0) { printf("RCQ readfrom %d (%s)\n", ret, fi_strerror(-ret)); return ret; } } while (ret == 0); if (client_addr == FI_ADDR_NOTAVAIL) { printf("Error getting address\n"); goto err; } ret = fi_recv(ep, buf, buffer_size, fi_mr_desc(mr), buf); if (ret != 0) { printf("fi_recv %d (%s)\n", ret, fi_strerror(-ret)); goto err; } ret = send_xfer(4); if (ret != 0) goto err; return 0; err: free_ep_res(); fi_close(&ep->fid); fi_close(&dom->fid); fi_close(&fab->fid); return ret; }