Exemplo n.º 1
0
/*
 * 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;
	}
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
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;
}