static int init_av(void) { size_t addrlen; int ret; if (opts.dst_addr) { ret = ft_av_insert(av, fi->dest_addr, 1, &remote_fi_addr, 0, NULL); if (ret) return ret; addrlen = 64; ret = fi_getname(&ep->fid, tx_buf, &addrlen); if (ret) { FT_PRINTERR("fi_getname", ret); return ret; } ret = ft_tx(ep, remote_fi_addr, addrlen, &tx_ctx); if (ret) return ret; } else { ret = wait_for_recv_completion(1); if (ret) return ret; ret = ft_av_insert(av, rx_buf, 1, &remote_fi_addr, 0, NULL); if (ret) return ret; } return 0; }
static int init_av(void) { size_t addrlen; int ret, i; if (opts.dst_addr) { ret = ft_av_insert(av, fi->dest_addr, 1, &remote_fi_addr, 0, NULL); if (ret) return ret; addrlen = FT_MAX_CTRL_MSG; ret = fi_getname(&sep->fid, tx_buf, &addrlen); if (ret) { FT_PRINTERR("fi_getname", ret); return ret; } ret = fi_send(tx_ep[0], tx_buf, addrlen, fi_mr_desc(mr), remote_fi_addr, NULL); if (ret) { FT_PRINTERR("fi_send", ret); return ret; } ret = wait_for_comp(rxcq_array[0]); if (ret) return ret; } else { ret = wait_for_comp(rxcq_array[0]); if (ret) return ret; ret = ft_av_insert(av, rx_buf, 1, &remote_fi_addr, 0, NULL); if (ret) return ret; ret = fi_send(tx_ep[0], tx_buf, 1, fi_mr_desc(mr), remote_fi_addr, NULL); if (ret) { FT_PRINTERR("fi_send", ret); return ret; } } for (i = 0; i < ctx_cnt; i++) remote_rx_addr[i] = fi_rx_addr(remote_fi_addr, i, rx_ctx_bits); ret = fi_recv(rx_ep[0], rx_buf, rx_size, fi_mr_desc(mr), 0, NULL); if (ret) { FT_PRINTERR("fi_recv", ret); return ret; } ret = wait_for_comp(txcq_array[0]); return ret; }
static int ft_load_av(void) { struct ft_msg msg; size_t len; int ret; memset(&msg, 0, sizeof(struct ft_msg)); len = sizeof(msg.data); ret = fi_getname(&ep->fid, msg.data, &len); if (ret) { FT_PRINTERR("fi_getname", ret); return ret; } msg.len = (uint32_t) len; ret = ft_fw_send(sock, &msg, sizeof msg); if (ret) return ret; ret = ft_fw_recv(sock, &msg, sizeof msg); if (ret) return ret; ret = ft_av_insert(av, msg.data, 1, &ft_tx_ctrl.addr, 0, NULL); if (ret) return ret; return 0; }
/* TODO: retry send for unreliable endpoints */ int ft_init_av(void) { size_t addrlen; int ret; if (opts.dst_addr) { ret = ft_av_insert(av, fi->dest_addr, 1, &remote_fi_addr, 0, NULL); if (ret) return ret; addrlen = FT_MAX_CTRL_MSG; ret = fi_getname(&ep->fid, (char *) tx_buf + ft_tx_prefix_size(), &addrlen); if (ret) { FT_PRINTERR("fi_getname", ret); return ret; } ret = (int) ft_tx(addrlen); if (ret) return ret; ret = ft_rx(1); } else { ret = (int) ft_rx(FT_MAX_CTRL_MSG); if (ret) return ret; ret = ft_av_insert(av, (char *) rx_buf + ft_rx_prefix_size(), 1, &remote_fi_addr, 0, NULL); if (ret) return ret; ret = (int) ft_tx(1); } return ret; }
static int init_av(void) { int ret; int i; /* Get local address blob. Find the addrlen first. We set addrlen * as 0 and fi_getname will return the actual addrlen. */ addrlen = 0; ret = fi_getname(&ep_array[0]->fid, local_addr, &addrlen); if (ret != -FI_ETOOSMALL) { FT_PRINTERR("fi_getname", ret); return ret; } if (ep_cnt <= 0) { fprintf(stderr, "ep_cnt needs to be greater than 0\n"); return -EXIT_FAILURE; } local_addr = malloc(addrlen * ep_cnt); /* Get local addresses for all EPs */ for (i = 0; i < ep_cnt; i++) { ret = fi_getname(&ep_array[i]->fid, local_addr + addrlen * i, &addrlen); if (ret) { FT_PRINTERR("fi_getname", ret); return ret; } } if (opts.dst_addr) { ret = ft_av_insert(av, remote_addr, 1, &addr_array[0], 0, NULL); if (ret) return ret; /* Send local EP addresses to one of the remote endpoints */ memcpy(buf, &addrlen, sizeof(size_t)); memcpy(buf + sizeof(size_t), local_addr, addrlen * ep_cnt); ret = send_msg(sizeof(size_t) + addrlen * ep_cnt); if (ret) return ret; /* Get remote EP addresses */ ret = recv_msg(); if (ret) return ret; memcpy(&addrlen, buf, sizeof(size_t)); memcpy(remote_addr, buf + sizeof(size_t), addrlen * ep_cnt); /* Insert remote addresses into AV * Skip the first address since we already have it in AV */ ret = ft_av_insert(av, remote_addr + addrlen, ep_cnt - 1, addr_array + 1, 0, NULL); if (ret) return ret; /* Send ACK */ ret = send_msg(16); if (ret) return ret; } else { /* Get remote EP addresses */ ret = recv_msg(); if (ret) return ret; memcpy(&addrlen, buf, sizeof(size_t)); remote_addr = malloc(addrlen * ep_cnt); memcpy(remote_addr, buf + sizeof(size_t), addrlen * ep_cnt); /* Insert remote addresses into AV */ ret = ft_av_insert(av, remote_addr, ep_cnt, addr_array, 0, NULL); if (ret) return ret; /* Send local EP addresses to one of the remote endpoints */ memcpy(buf, &addrlen, sizeof(size_t)); memcpy(buf + sizeof(size_t), local_addr, addrlen * ep_cnt); ret = send_msg(sizeof(size_t) + addrlen * ep_cnt); if (ret) return ret; /* Receive ACK from client */ ret = recv_msg(); if (ret) return ret; } free(local_addr); free(remote_addr); return 0; }
static int init_av(void) { int ret; int i; if (opts.dst_addr) { ret = ft_av_insert(av, fi->dest_addr, 1, &addr_array[0], 0, NULL); if (ret) return ret; } for (i = 0; i < ep_cnt; i++) { addrlen = tx_size; ret = fi_getname(&ep_array[i]->fid, tx_buf + ft_tx_prefix_size(), &addrlen); if (ret) { FT_PRINTERR("fi_getname", ret); return ret; } if (opts.dst_addr) { ret = ft_tx(ep_array[0], addr_array[0], addrlen, &tx_ctx); if (ret) return ret; if (rx_shared_ctx) ret = ft_rx(srx_ctx, rx_size); else ret = ft_rx(ep_array[0], rx_size); if (ret) return ret; /* Skip the first address since we already have it in AV */ if (i) { ret = ft_av_insert(av, rx_buf + ft_rx_prefix_size(), 1, &addr_array[i], 0, NULL); if (ret) return ret; } } else { if (rx_shared_ctx) ret = ft_rx(srx_ctx, rx_size); else ret = ft_rx(ep_array[0], rx_size); if (ret) return ret; ret = ft_av_insert(av, rx_buf + ft_rx_prefix_size(), 1, &addr_array[i], 0, NULL); if (ret) return ret; ret = ft_tx(ep_array[0], addr_array[0], addrlen, &tx_ctx); if (ret) return ret; } } /* ACK */ if (opts.dst_addr) { ret = ft_tx(ep_array[0], addr_array[0], 1, &tx_ctx); } else { if (rx_shared_ctx) ret = ft_rx(srx_ctx, rx_size); else ret = ft_rx(ep_array[0], rx_size); } return ret; }