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]); }
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); }