int fi_ibv_process_xrc_connreq(struct fi_ibv_ep *ep, struct fi_ibv_connreq *connreq) { struct fi_ibv_xrc_ep *xrc_ep = container_of(ep, struct fi_ibv_xrc_ep, base_ep); int ret; assert(ep->info->src_addr); assert(ep->info->dest_addr); xrc_ep->conn_setup = calloc(1, sizeof(*xrc_ep->conn_setup)); if (!xrc_ep->conn_setup) return -FI_ENOMEM; /* This endpoint was created on the passive side of a connection * request. The reciprocal connection request will go back to the * passive port indicated by the active side */ ofi_addr_set_port(ep->info->src_addr, 0); ofi_addr_set_port(ep->info->dest_addr, connreq->xrc.port); ret = fi_ibv_create_ep(NULL, NULL, 0, ep->info, NULL, &ep->id); if (ret) { VERBS_WARN(FI_LOG_EP_CTRL, "Creation of INI cm_id failed %d\n", ret); goto create_err; } xrc_ep->tgt_id = connreq->id; xrc_ep->tgt_id->context = &ep->util_ep.ep_fid.fid; return FI_SUCCESS; create_err: free(xrc_ep->conn_setup); return ret; }
static int tcpx_bind_to_port_range(SOCKET sock, void* src_addr, size_t addrlen) { int ret, i, rand_port_number; rand_port_number = rand() % (port_range.high + 1 - port_range.low) + port_range.low; for (i = port_range.low; i <= port_range.high; i++, rand_port_number++) { if (rand_port_number > port_range.high) { rand_port_number = port_range.low; } ofi_addr_set_port(src_addr, rand_port_number); ret = bind(sock, src_addr, (socklen_t) addrlen); if (ret) { if (errno == EADDRINUSE) { continue; } else { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "failed to bind listener: %s\n", strerror(ofi_sockerr())); return -errno; } } else { break; } } return (i <= port_range.high) ? FI_SUCCESS : -FI_EADDRNOTAVAIL; }
static int rxm_getinfo(uint32_t version, const char *node, const char *service, uint64_t flags, const struct fi_info *hints, struct fi_info **info) { struct fi_info *cur; struct addrinfo *ai; uint16_t port_save = 0; int ret; /* Avoid getting wild card address from MSG provider */ if (ofi_is_wildcard_listen_addr(node, service, flags, hints)) { if (service) { ret = getaddrinfo(NULL, service, NULL, &ai); if (ret) { FI_WARN(&rxm_prov, FI_LOG_CORE, "Unable to getaddrinfo\n"); return ret; } port_save = ofi_addr_get_port(ai->ai_addr); freeaddrinfo(ai); service = NULL; } else { port_save = ofi_addr_get_port(hints->src_addr); ofi_addr_set_port(hints->src_addr, 0); } } ret = rxm_validate_atomic_hints(hints); if (ret) return ret; ret = ofix_getinfo(version, node, service, flags, &rxm_util_prov, hints, rxm_info_to_core, rxm_info_to_rxm, info); if (ret) return ret; if (port_save) { for (cur = *info; cur; cur = cur->next) { assert(cur->src_addr); ofi_addr_set_port(cur->src_addr, port_save); } } rxm_alter_info(hints, *info); return 0; }