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; }
static int tcpx_pep_sock_create(struct tcpx_pep *pep) { int ret, af; switch (pep->info->addr_format) { case FI_SOCKADDR: case FI_SOCKADDR_IN: case FI_SOCKADDR_IN6: af = ((struct sockaddr *)pep->info->src_addr)->sa_family; break; default: FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "invalid source address format\n"); return -FI_EINVAL; } pep->sock = ofi_socket(af, SOCK_STREAM, 0); if (pep->sock == INVALID_SOCKET) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "failed to create listener: %s\n", strerror(ofi_sockerr())); return -FI_EIO; } if (ofi_addr_get_port(pep->info->src_addr) != 0 || port_range.high == 0) { ret = tcpx_setup_socket(pep->sock); if (ret) { goto err; } ret = bind(pep->sock, pep->info->src_addr, (socklen_t) pep->info->src_addrlen); } else { ret = tcpx_setup_socket_nodelay(pep->sock); if (ret) { goto err; } ret = tcpx_bind_to_port_range(pep->sock, pep->info->src_addr, pep->info->src_addrlen); } if (ret) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "failed to bind listener: %s\n", strerror(ofi_sockerr())); goto err; } return FI_SUCCESS; err: ofi_close_socket(pep->sock); pep->sock = INVALID_SOCKET; return ret; }