/* * Return local address of an EP */ int usdf_cm_rdm_getname(fid_t fid, void *addr, size_t *addrlen) { struct usdf_ep *ep; struct usdf_rx *rx; struct sockaddr_in sin; size_t copylen; USDF_TRACE_SYS(EP_CTRL, "\n"); ep = ep_fidtou(fid); rx = ep->ep_rx; copylen = sizeof(sin); if (copylen > *addrlen) { copylen = *addrlen; } *addrlen = sizeof(sin); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = ep->ep_domain->dom_fabric->fab_dev_attrs->uda_ipaddr_be; if (rx == NULL || rx->rx_qp == NULL) { sin.sin_port = 0; } else { sin.sin_port = to_qpi(rx->rx_qp)->uq_attrs.uqa_local_addr.ul_addr.ul_udp.u_addr.sin_port; } memcpy(addr, &sin, copylen); if (copylen < sizeof(sin)) { return -FI_ETOOSMALL; } else { return 0; } }
static int usdf_msg_ep_setopt(fid_t fid, int level, int optname, const void *optval, size_t optlen) { struct usdf_ep *ep; ep = ep_fidtou(fid); (void)ep; switch (level) { case FI_OPT_ENDPOINT: return -FI_ENOPROTOOPT; default: return -FI_ENOPROTOOPT; } return 0; }
int usdf_cm_msg_getname(fid_t fid, void *addr, size_t *addrlen) { struct usdf_ep *ep; size_t copylen; USDF_TRACE_SYS(EP_CTRL, "\n"); ep = ep_fidtou(fid); copylen = MIN(sizeof(ep->e.msg.ep_lcl_addr), *addrlen); *addrlen = sizeof(ep->e.msg.ep_lcl_addr); memcpy(addr, &ep->e.msg.ep_lcl_addr, copylen); if (copylen < sizeof(ep->e.msg.ep_lcl_addr)) return -FI_ETOOSMALL; else return 0; }
int usdf_cm_dgram_getname(fid_t fid, void *addr, size_t *addrlen) { int ret; struct usdf_ep *ep; struct sockaddr_in sin; socklen_t slen; size_t copylen; USDF_TRACE_SYS(EP_CTRL, "\n"); ep = ep_fidtou(fid); copylen = MIN(sizeof(sin), *addrlen); *addrlen = sizeof(sin); memset(&sin, 0, sizeof(sin)); if (ep->e.dg.ep_qp == NULL) { sin.sin_family = AF_INET; sin.sin_addr.s_addr = ep->ep_domain->dom_fabric->fab_dev_attrs->uda_ipaddr_be; sin.sin_port = 0; } else { slen = sizeof(sin); ret = getsockname(ep->e.dg.ep_sock, (struct sockaddr *)&sin, &slen); if (ret == -1) { return -errno; } assert(((struct sockaddr *)&sin)->sa_family == AF_INET); assert(slen == sizeof(sin)); assert(sin.sin_addr.s_addr == ep->ep_domain->dom_fabric->fab_dev_attrs->uda_ipaddr_be); } memcpy(addr, &sin, copylen); if (copylen < sizeof(sin)) return -FI_ETOOSMALL; else return 0; }