int sock_verify_info(struct fi_info *hints) { int ret; if (!hints) return 0; switch (hints->ep_type) { case FI_EP_UNSPEC: case FI_EP_MSG: case FI_EP_DGRAM: case FI_EP_RDM: break; default: return -FI_ENODATA; } switch (hints->addr_format) { case FI_FORMAT_UNSPEC: case FI_SOCKADDR: case FI_SOCKADDR_IN: break; default: return -FI_ENODATA; } if (!sock_rdm_verify_ep_attr(hints->ep_attr, hints->tx_attr, hints->rx_attr)) return 0; ret = sock_verify_domain_attr(hints->domain_attr); if (ret) return ret; ret = sock_verify_fabric_attr(hints->fabric_attr); if (ret) return ret; return 0; }
case FI_SOCKADDR: case FI_SOCKADDR_IN: break; default: return -FI_ENODATA; } if (hints->domain_attr && hints->domain_attr->domain) { domain = container_of(hints->domain_attr->domain, struct sock_domain, dom_fid); if (!sock_dom_check_list(domain)) { SOCK_LOG_INFO("no matching domain\n"); return -FI_ENODATA; } } ret = sock_verify_domain_attr(hints->domain_attr); if (ret) return ret; if (hints->fabric_attr && hints->fabric_attr->fabric) { fabric = container_of(hints->fabric_attr->fabric, struct sock_fabric, fab_fid); if (!sock_fab_check_list(fabric)) { SOCK_LOG_INFO("no matching fabric\n"); return -FI_ENODATA; } } ret = sock_verify_fabric_attr(hints->fabric_attr); if (ret) return ret;
int sock_domain(struct fid_fabric *fabric, struct fi_info *info, struct fid_domain **dom, void *context) { struct sock_domain *sock_domain; struct sock_fabric *fab; int ret; fab = container_of(fabric, struct sock_fabric, fab_fid); if (info && info->domain_attr) { ret = sock_verify_domain_attr(info->domain_attr); if (ret) return -FI_EINVAL; } sock_domain = calloc(1, sizeof(*sock_domain)); if (!sock_domain) return -FI_ENOMEM; fastlock_init(&sock_domain->lock); atomic_initialize(&sock_domain->ref, 0); if (info) { sock_domain->info = *info; } else { SOCK_LOG_ERROR("invalid fi_info\n"); goto err; } sock_domain->dom_fid.fid.fclass = FI_CLASS_DOMAIN; sock_domain->dom_fid.fid.context = context; sock_domain->dom_fid.fid.ops = &sock_dom_fi_ops; sock_domain->dom_fid.ops = &sock_dom_ops; sock_domain->dom_fid.mr = &sock_dom_mr_ops; if (!info->domain_attr || info->domain_attr->data_progress == FI_PROGRESS_UNSPEC) sock_domain->progress_mode = FI_PROGRESS_AUTO; else sock_domain->progress_mode = info->domain_attr->data_progress; sock_domain->pe = sock_pe_init(sock_domain); if (!sock_domain->pe) { SOCK_LOG_ERROR("Failed to init PE\n"); goto err; } sock_domain->mr_heap = rbtNew(&sock_compare_mr_keys); if (!sock_domain->mr_heap) { goto err; } sock_domain->fab = fab; *dom = &sock_domain->dom_fid; if (info->domain_attr) sock_domain->attr = *(info->domain_attr); else sock_domain->attr = sock_domain_attr; sock_dom_add_to_list(sock_domain); return 0; err: free(sock_domain); return -FI_EINVAL; }
int sock_domain(struct fid_fabric *fabric, struct fi_info *info, struct fid_domain **dom, void *context) { int ret, flags; struct sock_domain *sock_domain; if(info && info->domain_attr){ ret = sock_verify_domain_attr(info->domain_attr); if(ret) return ret; } sock_domain = calloc(1, sizeof *sock_domain); if (!sock_domain) return -FI_ENOMEM; fastlock_init(&sock_domain->lock); atomic_init(&sock_domain->ref, 0); if(info && info->src_addr) { if (getnameinfo(info->src_addr, info->src_addrlen, NULL, 0, sock_domain->service, sizeof(sock_domain->service), NI_NUMERICSERV)) { SOCK_LOG_ERROR("could not resolve src_addr\n"); goto err; } sock_domain->info = *info; memcpy(&sock_domain->src_addr, info->src_addr, sizeof(struct sockaddr_in)); } else { SOCK_LOG_ERROR("invalid fi_info\n"); goto err; } sock_domain->dom_fid.fid.fclass = FI_CLASS_DOMAIN; sock_domain->dom_fid.fid.context = context; sock_domain->dom_fid.fid.ops = &sock_dom_fi_ops; sock_domain->dom_fid.ops = &sock_dom_ops; sock_domain->dom_fid.mr = &sock_dom_mr_ops; if (!info || !info->domain_attr || info->domain_attr->data_progress == FI_PROGRESS_UNSPEC) sock_domain->progress_mode = FI_PROGRESS_AUTO; else sock_domain->progress_mode = info->domain_attr->data_progress; sock_domain->pe = sock_pe_init(sock_domain); if(!sock_domain->pe){ SOCK_LOG_ERROR("Failed to init PE\n"); goto err; } sock_domain->ep_count = AF_INET; sock_domain->r_cmap.domain = sock_domain; fastlock_init(&sock_domain->r_cmap.lock); if(socketpair(AF_UNIX, SOCK_STREAM, 0, sock_domain->signal_fds) < 0) goto err; flags = fcntl(sock_domain->signal_fds[1], F_GETFL, 0); fcntl(sock_domain->signal_fds[1], F_SETFL, flags | O_NONBLOCK); sock_conn_listen(sock_domain); while(!(volatile int)sock_domain->listening) pthread_yield(); *dom = &sock_domain->dom_fid; return 0; err: free(sock_domain); return -FI_EINVAL; }
case FI_SOCKADDR_IN: break; default: SOCK_LOG_DBG("Unsupported address format\n"); return -FI_ENODATA; } if (hints->domain_attr && hints->domain_attr->domain) { domain = container_of(hints->domain_attr->domain, struct sock_domain, dom_fid); if (!sock_dom_check_list(domain)) { SOCK_LOG_DBG("no matching domain\n"); return -FI_ENODATA; } } ret = sock_verify_domain_attr(version, hints->domain_attr); if (ret) return ret; if (hints->fabric_attr && hints->fabric_attr->fabric) { fabric = container_of(hints->fabric_attr->fabric, struct sock_fabric, fab_fid); if (!sock_fab_check_list(fabric)) { SOCK_LOG_DBG("no matching fabric\n"); return -FI_ENODATA; } } ret = sock_verify_fabric_attr(hints->fabric_attr); if (ret) return ret;