static int usdf_fabric_open(struct fi_fabric_attr *fattrp, struct fid_fabric **fabric, void *context) { struct fid_fabric *ff; struct usdf_fabric *fp; struct usdf_usnic_info *dp; struct usdf_dev_entry *dep; struct epoll_event ev; struct sockaddr_in sin; int ret; int d; USDF_TRACE("\n"); /* Make sure this fabric exists */ dp = __usdf_devinfo; for (d = 0; d < dp->uu_num_devs; ++d) { dep = &dp->uu_info[d]; if (dep->ue_dev_ok && strcmp(fattrp->name, dep->ue_dattr.uda_devname) == 0) { break; } } if (d >= dp->uu_num_devs) { USDF_INFO("device \"%s\" does not exit, returning -FI_ENODEV\n", fattrp->name); return -FI_ENODEV; } fp = calloc(1, sizeof(*fp)); if (fp == NULL) { USDF_INFO("unable to allocate memory for fabric\n"); return -FI_ENOMEM; } fp->fab_epollfd = -1; fp->fab_arp_sockfd = -1; LIST_INIT(&fp->fab_domain_list); fp->fab_attr.fabric = fab_utof(fp); fp->fab_attr.name = strdup(fattrp->name); fp->fab_attr.prov_name = strdup(USDF_PROV_NAME); fp->fab_attr.prov_version = USDF_PROV_VERSION; if (fp->fab_attr.name == NULL || fp->fab_attr.prov_name == NULL) { ret = -FI_ENOMEM; goto fail; } fp->fab_fid.fid.fclass = FI_CLASS_FABRIC; fp->fab_fid.fid.context = context; fp->fab_fid.fid.ops = &usdf_fi_ops; fp->fab_fid.ops = &usdf_ops_fabric; fp->fab_dev_attrs = &dep->ue_dattr; fp->fab_epollfd = epoll_create(1024); if (fp->fab_epollfd == -1) { ret = -errno; USDF_INFO("unable to allocate epoll fd\n"); goto fail; } fp->fab_eventfd = eventfd(0, EFD_NONBLOCK | EFD_SEMAPHORE); if (fp->fab_eventfd == -1) { ret = -errno; USDF_INFO("unable to allocate event fd\n"); goto fail; } fp->fab_poll_item.pi_rtn = usdf_fabric_progression_cb; fp->fab_poll_item.pi_context = fp; ev.events = EPOLLIN; ev.data.ptr = &fp->fab_poll_item; ret = epoll_ctl(fp->fab_epollfd, EPOLL_CTL_ADD, fp->fab_eventfd, &ev); if (ret == -1) { ret = -errno; USDF_INFO("unable to EPOLL_CTL_ADD\n"); goto fail; } /* initialize timer subsystem */ ret = usdf_timer_init(fp); if (ret != 0) { USDF_INFO("unable to initialize timer\n"); goto fail; } ret = pthread_create(&fp->fab_thread, NULL, usdf_fabric_progression_thread, fp); if (ret != 0) { ret = -ret; USDF_INFO("unable to create progress thread\n"); goto fail; } /* create and bind socket for ARP resolution */ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = fp->fab_dev_attrs->uda_ipaddr_be; fp->fab_arp_sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (fp->fab_arp_sockfd == -1) { USDF_INFO("unable to create socket\n"); goto fail; } ret = bind(fp->fab_arp_sockfd, (struct sockaddr *) &sin, sizeof(sin)); if (ret == -1) { ret = -errno; goto fail; } atomic_initialize(&fp->fab_refcnt, 0); fattrp->fabric = fab_utof(fp); fattrp->prov_version = USDF_PROV_VERSION; *fabric = fab_utof(fp); USDF_INFO("successfully opened %s/%s\n", fattrp->name, fp->fab_dev_attrs->uda_ifname); return 0; fail: ff = fab_utof(fp); usdf_fabric_close(&ff->fid); USDF_DBG("returning %d (%s)\n", ret, fi_strerror(-ret)); 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(); if (ip == NULL) { return NULL; } ip->caps = USDF_MSG_CAPS; ip->mode = USDF_MSG_SUPP_MODE; ip->ep_attr->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); if (sin == NULL) { goto fail; } sin->sin_family = AF_INET; sin->sin_addr.s_addr = reqp->creq_ipaddr; sin->sin_port = reqp->creq_port; ip->dest_addr = sin; ip->handle = (fid_t) crp; return ip; fail: fi_freeinfo(ip); return NULL; }