int sock_verify_info(struct fi_info *hints) { uint64_t caps; enum fi_ep_type ep_type; int ret; struct sock_domain *domain; struct sock_fabric *fabric; if (!hints) return 0; ep_type = hints->ep_attr ? hints->ep_attr->type : FI_EP_UNSPEC; switch (ep_type) { case FI_EP_UNSPEC: case FI_EP_MSG: caps = SOCK_EP_MSG_CAP; ret = sock_msg_verify_ep_attr(hints->ep_attr, hints->tx_attr, hints->rx_attr); break; case FI_EP_DGRAM: caps = SOCK_EP_DGRAM_CAP; ret = sock_dgram_verify_ep_attr(hints->ep_attr, hints->tx_attr, hints->rx_attr); break; case FI_EP_RDM: caps = SOCK_EP_RDM_CAP; ret = sock_rdm_verify_ep_attr(hints->ep_attr, hints->tx_attr, hints->rx_attr); break; default: ret = -FI_ENODATA; } if (ret) return ret; if ((caps | hints->caps) != caps) { SOCK_LOG_INFO("Unsupported capabilities\n"); return -FI_ENODATA; } switch (hints->addr_format) { case FI_FORMAT_UNSPEC: 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; } }
static int sock_dgram_endpoint(struct fid_domain *domain, struct fi_info *info, struct sock_ep **ep, void *context, size_t fclass) { int ret; if (info) { if (info->ep_attr) { ret = sock_dgram_verify_ep_attr(info->ep_attr, info->tx_attr, info->rx_attr); if (ret) return ret; } if (info->tx_attr) { ret = sock_dgram_verify_tx_attr(info->tx_attr); if (ret) return ret; } if (info->rx_attr) { ret = sock_dgram_verify_rx_attr(info->rx_attr); if (ret) return ret; } } ret = sock_alloc_endpoint(domain, info, ep, context, fclass); if (ret) return ret; if (!info || !info->ep_attr) (*ep)->ep_attr = sock_dgram_ep_attr; if (!info || !info->tx_attr) (*ep)->tx_attr = sock_dgram_tx_attr; if (!info || !info->rx_attr) (*ep)->rx_attr = sock_dgram_rx_attr; return 0; }