Beispiel #1
0
struct sock_conn *sock_av_lookup_addr(struct sock_ep *ep,
				      struct sock_av *av, 
				      fi_addr_t addr)
{
	int idx, ret;
	int index = ((uint64_t)addr & av->mask);
	struct sock_av_addr *av_addr;

	if (index >= av->table_hdr->stored || index < 0) {
		SOCK_LOG_ERROR("requested rank is larger than av table\n");
		errno = EINVAL;
		return NULL;
	}

	if (!av->cmap) {
		SOCK_LOG_ERROR("EP with no AV bound\n");
		errno = EINVAL;
		return NULL;
	}

	av_addr = idm_lookup(&av->addr_idm, index);
	idx = av_addr - &av->table[0];
	if (!av->key[idx]) {
		ret = sock_conn_map_match_or_connect(
			ep, av->domain, av->cmap, 
			(struct sockaddr_in*)&av_addr->addr,
			&av->key[idx]);
		if (ret) {
			SOCK_LOG_ERROR("failed to match or connect to addr %"
					PRIu64 "\n", addr);
			return NULL;
		}
	}
	return sock_conn_map_lookup_key(av->cmap, av->key[idx]);
}
Beispiel #2
0
struct sock_conn *sock_ep_lookup_conn(struct sock_ep *ep)
{
	if (!ep->key) {
		ep->key = sock_conn_map_match_or_connect(
			ep, ep->domain, &ep->domain->r_cmap, ep->dest_addr);
		if (!ep->key) {
			SOCK_LOG_ERROR("failed to match or connect to addr\n");
			errno = EINVAL;
			return NULL;
		}
	}
	return sock_conn_map_lookup_key(&ep->domain->r_cmap, ep->key);
}