struct fi_info *DEFAULT_SYMVER_PRE(fi_dupinfo)(const struct fi_info *info) { struct fi_info *dup; if (!info) return fi_allocinfo_internal(); dup = mem_dup(info, sizeof(*dup)); if (dup == NULL) { return NULL; } dup->src_addr = NULL; dup->dest_addr = NULL; dup->tx_attr = NULL; dup->rx_attr = NULL; dup->ep_attr = NULL; dup->domain_attr = NULL; dup->fabric_attr = NULL; dup->next = NULL; if (info->src_addr != NULL) { dup->src_addr = mem_dup(info->src_addr, info->src_addrlen); if (dup->src_addr == NULL) goto fail; } if (info->dest_addr != NULL) { dup->dest_addr = mem_dup(info->dest_addr, info->dest_addrlen); if (dup->dest_addr == NULL) goto fail; } if (info->tx_attr != NULL) { dup->tx_attr = mem_dup(info->tx_attr, sizeof(*info->tx_attr)); if (dup->tx_attr == NULL) goto fail; } if (info->rx_attr != NULL) { dup->rx_attr = mem_dup(info->rx_attr, sizeof(*info->rx_attr)); if (dup->rx_attr == NULL) goto fail; } if (info->ep_attr != NULL) { dup->ep_attr = mem_dup(info->ep_attr, sizeof(*info->ep_attr)); if (dup->ep_attr == NULL) goto fail; } if (info->domain_attr) { dup->domain_attr = mem_dup(info->domain_attr, sizeof(*info->domain_attr)); if (dup->domain_attr == NULL) goto fail; if (info->domain_attr->name != NULL) { dup->domain_attr->name = strdup(info->domain_attr->name); if (dup->domain_attr->name == NULL) goto fail; } } if (info->fabric_attr) { dup->fabric_attr = mem_dup(info->fabric_attr, sizeof(*info->fabric_attr)); if (dup->fabric_attr == NULL) goto fail; dup->fabric_attr->name = NULL; dup->fabric_attr->prov_name = NULL; if (info->fabric_attr->name != NULL) { dup->fabric_attr->name = strdup(info->fabric_attr->name); if (dup->fabric_attr->name == NULL) goto fail; } if (info->fabric_attr->prov_name != NULL) { dup->fabric_attr->prov_name = strdup(info->fabric_attr->prov_name); if (dup->fabric_attr->prov_name == NULL) goto fail; } } return dup; fail: fi_freeinfo(dup); return NULL; }
static int usdf_fill_info_rdm( struct fi_info *hints, struct sockaddr_in *src, struct sockaddr_in *dest, struct usd_device_attrs *dap, struct fi_info **fi_first, struct fi_info **fi_last) { struct fi_info *fi; struct fi_fabric_attr *fattrp; struct fi_domain_attr *dattrp; struct fi_tx_attr *txattr; struct fi_rx_attr *rxattr; struct fi_ep_attr *eattrp; uint32_t addr_format; int ret; /* check that we are capable of what's requested */ if ((hints->caps & ~USDF_RDM_CAPS) != 0) { return -FI_ENODATA; } /* app must support these modes */ if ((hints->mode & USDF_RDM_REQ_MODE) != USDF_RDM_REQ_MODE) { return -FI_ENODATA; } fi = fi_allocinfo_internal(); if (fi == NULL) { ret = -FI_ENOMEM; goto fail; } fi->caps = USDF_RDM_CAPS; if (hints != NULL) { fi->mode = hints->mode & USDF_RDM_SUPP_MODE; addr_format = hints->addr_format; } else { fi->mode = USDF_RDM_SUPP_MODE; addr_format = FI_FORMAT_UNSPEC; } fi->ep_type = FI_EP_RDM; ret = usdf_fill_addr_info(fi, addr_format, src, dest, dap); if (ret != 0) { goto fail; } /* fabric attrs */ fattrp = fi->fabric_attr; fattrp->name = strdup(dap->uda_devname); if (fattrp->name == NULL) { ret = -FI_ENOMEM; goto fail; } /* TX attrs */ txattr = fi->tx_attr; if (hints != NULL && hints->tx_attr != NULL) { *txattr = *hints->tx_attr; } usdf_rdm_fill_tx_attr(txattr); /* RX attrs */ rxattr = fi->rx_attr; if (hints != NULL && hints->rx_attr != NULL) { *rxattr = *hints->rx_attr; } usdf_rdm_fill_rx_attr(rxattr); /* endpoint attrs */ eattrp = fi->ep_attr; eattrp->max_msg_size = USDF_RDM_MAX_MSG; eattrp->protocol = FI_PROTO_RUDP; eattrp->tx_ctx_cnt = 1; eattrp->rx_ctx_cnt = 1; /* domain attrs */ dattrp = fi->domain_attr; dattrp->threading = FI_THREAD_UNSPEC; dattrp->control_progress = FI_PROGRESS_AUTO; dattrp->data_progress = FI_PROGRESS_MANUAL; /* add to tail of list */ if (*fi_first == NULL) { *fi_first = fi; } else { (*fi_last)->next = fi; } *fi_last = fi; return 0; fail: if (fi != NULL) { fi_freeinfo(fi); } return ret; }
static struct fi_info * usdf_pep_conn_info(struct usdf_connreq *crp) { struct fi_info *ip; struct usdf_pep *pep; struct sockaddr_in *sin; struct usdf_fabric *fp; struct usdf_domain *udp; struct usd_device_attrs *dap; struct usdf_connreq_msg *reqp; pep = crp->cr_pep; fp = pep->pep_fabric; udp = LIST_FIRST(&fp->fab_domain_list); dap = fp->fab_dev_attrs; reqp = (struct usdf_connreq_msg *)crp->cr_data; /* If there is a domain, just copy info from there */ if (udp != NULL) { ip = fi_dupinfo(udp->dom_info); if (ip == NULL) { return NULL; } /* no domains yet, make an info suitable for creating one */ } else { ip = fi_allocinfo_internal(); if (ip == NULL) { return NULL; } ip->caps = USDF_MSG_CAPS; ip->mode = USDF_MSG_SUPP_MODE; ip->ep_type = FI_EP_MSG; ip->addr_format = FI_SOCKADDR_IN; ip->src_addrlen = sizeof(struct sockaddr_in); sin = calloc(1, ip->src_addrlen); if (sin == NULL) { goto fail; } sin->sin_family = AF_INET; sin->sin_addr.s_addr = dap->uda_ipaddr_be; ip->src_addr = sin; ip->ep_attr->protocol = FI_PROTO_RUDP; ip->fabric_attr->fabric = fab_utof(fp); ip->fabric_attr->name = strdup(fp->fab_attr.name); ip->fabric_attr->prov_name = strdup(fp->fab_attr.prov_name); ip->fabric_attr->prov_version = fp->fab_attr.prov_version; if (ip->fabric_attr->name == NULL || ip->fabric_attr->prov_name == NULL) { goto fail; } } /* fill in dest addr */ ip->dest_addrlen = ip->src_addrlen; sin = calloc(1, ip->dest_addrlen); sin->sin_family = AF_INET; sin->sin_addr.s_addr = reqp->creq_ipaddr; sin->sin_port = reqp->creq_port; ip->connreq = crp; return ip; fail: fi_freeinfo(ip); return NULL; }
static int usdf_fill_info_dgram( struct fi_info *hints, struct sockaddr_in *src, struct sockaddr_in *dest, struct usd_device_attrs *dap, struct fi_info **fi_first, struct fi_info **fi_last) { struct fi_info *fi; struct fi_fabric_attr *fattrp; struct fi_domain_attr *dattrp; struct fi_tx_attr *txattr; struct fi_rx_attr *rxattr; struct fi_ep_attr *eattrp; uint32_t addr_format; size_t entries; int ret; /* check that we are capable of what's requested */ if ((hints->caps & ~USDF_DGRAM_CAPS) != 0) { return -FI_ENODATA; } /* app must support these modes */ if ((hints->mode & USDF_DGRAM_REQ_MODE) != USDF_DGRAM_REQ_MODE) { return -FI_ENODATA; } fi = fi_allocinfo_internal(); if (fi == NULL) { ret = -FI_ENOMEM; goto fail; } fi->caps = USDF_DGRAM_CAPS; if (hints != NULL) { fi->mode = hints->mode & USDF_DGRAM_SUPP_MODE; addr_format = hints->addr_format; } else { fi->mode = USDF_DGRAM_SUPP_MODE; addr_format = FI_FORMAT_UNSPEC; } fi->ep_type = FI_EP_DGRAM; ret = usdf_fill_addr_info(fi, addr_format, src, dest, dap); if (ret != 0) { goto fail; } /* fabric attrs */ fattrp = fi->fabric_attr; fattrp->name = strdup(dap->uda_devname); if (fattrp->name == NULL) { ret = -FI_ENOMEM; goto fail; } /* TX attrs */ txattr = fi->tx_attr; txattr->iov_limit = USDF_DGRAM_DFLT_SGE; txattr->size = dap->uda_max_send_credits / USDF_DGRAM_DFLT_SGE; if (hints != NULL && hints->tx_attr != NULL) { if (hints->tx_attr->iov_limit > USDF_MSG_MAX_SGE) { ret = -FI_ENODATA; goto fail; } if (hints->tx_attr->iov_limit != 0) { txattr->iov_limit = hints->tx_attr->iov_limit; entries = hints->tx_attr->size * txattr->iov_limit; if (entries > dap->uda_max_send_credits) { ret = -FI_ENODATA; goto fail; } else if (entries == 0) { txattr->size = dap->uda_max_send_credits / txattr->iov_limit; } else { txattr->size = hints->tx_attr->size; } } else if (hints->tx_attr->size != 0) { txattr->size = hints->tx_attr->size; if (txattr->size > dap->uda_max_send_credits) { ret = -FI_ENODATA; goto fail; } entries = txattr->size * txattr->iov_limit; if (entries > dap->uda_max_send_credits) { txattr->iov_limit = dap->uda_max_send_credits / txattr->size; } } } /* RX attrs */ rxattr = fi->rx_attr; rxattr->iov_limit = USDF_DGRAM_DFLT_SGE; rxattr->size = dap->uda_max_recv_credits / USDF_DGRAM_DFLT_SGE; if (hints != NULL && hints->rx_attr != NULL) { if (hints->rx_attr->iov_limit > USDF_MSG_MAX_SGE) { ret = -FI_ENODATA; goto fail; } if (hints->rx_attr->iov_limit != 0) { rxattr->iov_limit = hints->rx_attr->iov_limit; entries = hints->rx_attr->size * rxattr->iov_limit; if (entries > dap->uda_max_recv_credits) { ret = -FI_ENODATA; goto fail; } else if (entries == 0) { rxattr->size = dap->uda_max_recv_credits / rxattr->iov_limit; } else { rxattr->size = hints->rx_attr->size; } } else if (hints->rx_attr->size != 0) { rxattr->size = hints->rx_attr->size; if (rxattr->size > dap->uda_max_recv_credits) { ret = -FI_ENODATA; goto fail; } entries = rxattr->size * rxattr->iov_limit; if (entries > dap->uda_max_recv_credits) { rxattr->iov_limit = dap->uda_max_recv_credits / rxattr->size; } } } /* endpoint attrs */ eattrp = fi->ep_attr; if (fi->mode & FI_MSG_PREFIX) { eattrp->msg_prefix_size = USDF_HDR_BUF_ENTRY; } eattrp->max_msg_size = dap->uda_mtu - sizeof(struct usd_udp_hdr); eattrp->protocol = FI_PROTO_UDP; eattrp->tx_ctx_cnt = 1; eattrp->rx_ctx_cnt = 1; /* domain attrs */ dattrp = fi->domain_attr; dattrp->threading = FI_THREAD_UNSPEC; dattrp->control_progress = FI_PROGRESS_AUTO; dattrp->data_progress = FI_PROGRESS_MANUAL; /* add to tail of list */ if (*fi_first == NULL) { *fi_first = fi; } else { (*fi_last)->next = fi; } *fi_last = fi; return 0; fail: if (fi != NULL) { fi_freeinfo(fi); } return ret; }