diff --git a/include/ofi_util.h b/include/ofi_util.h
index bc590bb4d1a..f6a02c06f84 100644
--- a/include/ofi_util.h
+++ b/include/ofi_util.h
@@ -930,7 +930,8 @@ struct util_peer_addr {
 	union ofi_sock_ip addr;
 };
 
-struct util_peer_addr *util_get_peer(struct rxm_av *av, const void *addr);
+int util_get_peer(struct rxm_av *av, const void *addr, struct util_peer_addr **peer,
+		  uint64_t flags);
 void util_put_peer(struct util_peer_addr *peer);
 
 /* All peer addresses, whether they've been inserted into the AV
diff --git a/prov/rxm/src/rxm_conn.c b/prov/rxm/src/rxm_conn.c
index 73b26f2a9f3..e36d17c4ba1 100644
--- a/prov/rxm/src/rxm_conn.c
+++ b/prov/rxm/src/rxm_conn.c
@@ -657,9 +657,9 @@ rxm_process_connreq(struct rxm_ep *ep, struct rxm_eq_cm_entry *cm_entry)
 	ofi_addr_set_port(&peer_addr.sa, cm_entry->data.connect.port);
 
 	av = container_of(ep->util_ep.av, struct rxm_av, util_av);
-	peer = util_get_peer(av, &peer_addr);
-	if (!peer) {
-		RXM_WARN_ERR(FI_LOG_EP_CTRL, "util_get_peer", -FI_ENOMEM);
+	ret = util_get_peer(av, &peer_addr, &peer, 0);
+	if (ret) {
+		RXM_WARN_ERR(FI_LOG_EP_CTRL, "util_get_peer", ret);
 		goto reject;
 	}
 
diff --git a/prov/tcp/src/xnet_rdm_cm.c b/prov/tcp/src/xnet_rdm_cm.c
index 4dfc966505d..5633b5747fc 100644
--- a/prov/tcp/src/xnet_rdm_cm.c
+++ b/prov/tcp/src/xnet_rdm_cm.c
@@ -438,9 +438,9 @@ static void xnet_process_connreq(struct fi_eq_cm_entry *cm_entry)
 	ofi_addr_set_port(&peer_addr.sa, ntohs(msg->port));
 
 	av = container_of(rdm->util_ep.av, struct rxm_av, util_av);
-	peer = util_get_peer(av, &peer_addr);
-	if (!peer) {
-		XNET_WARN_ERR(FI_LOG_EP_CTRL, "util_get_peer", -FI_ENOMEM);
+	ret = util_get_peer(av, &peer_addr, &peer, 0);
+	if (ret) {
+		XNET_WARN_ERR(FI_LOG_EP_CTRL, "util_get_peer", ret);
 		goto reject;
 	}
 
diff --git a/prov/util/src/rxm_av.c b/prov/util/src/rxm_av.c
index beb11d0620c..67b027fc26d 100644
--- a/prov/util/src/rxm_av.c
+++ b/prov/util/src/rxm_av.c
@@ -98,23 +98,32 @@ static void rxm_free_peer(struct util_peer_addr *peer)
 	ofi_ibuf_free(peer);
 }
 
-struct util_peer_addr *
-util_get_peer(struct rxm_av *av, const void *addr)
+
+int util_get_peer(struct rxm_av *av, const void *addr, struct util_peer_addr **peer,
+		  uint64_t flags)
 {
-	struct util_peer_addr *peer;
 	struct ofi_rbnode *node;
+	int ret;
 
 	ofi_mutex_lock(&av->util_av.lock);
 	node = ofi_rbmap_find(&av->addr_map, (void *) addr);
 	if (node) {
-		peer = node->data;
-		peer->refcnt++;
+		*peer = node->data;
+		(*peer)->refcnt++;
 	} else {
-		peer = rxm_alloc_peer(av, addr);
-	}
+		if (flags && FI_NO_CONNECT) {
+			*peer = NULL;
+			ret = -FI_EHOSTUNREACH;
+			goto unlock;
+		}
 
+		*peer = rxm_alloc_peer(av, addr);
+		if (!*peer)
+			ret = -FI_ENOMEM;
+	}
+unlock:
 	ofi_mutex_unlock(&av->util_av.lock);
-	return peer;
+	return peer ? FI_SUCCESS : ret;
 }
 
 static void util_deref_peer(struct util_peer_addr *peer)
@@ -165,17 +174,17 @@ rxm_put_peer_addr(struct rxm_av *av, fi_addr_t fi_addr)
 
 static int
 rxm_av_add_peers(struct rxm_av *av, const void *addr, size_t count,
-		 fi_addr_t *fi_addr, fi_addr_t *user_ids)
+		 fi_addr_t *fi_addr, fi_addr_t *user_ids, uint64_t flags)
 {
 	struct util_peer_addr *peer;
 	const void *cur_addr;
 	fi_addr_t cur_fi_addr;
-	size_t i;
+	size_t i, ret;
 
 	for (i = 0; i < count; i++) {
 		cur_addr = ((char *) addr + i * av->util_av.addrlen);
-		peer = util_get_peer(av, cur_addr);
-		if (!peer)
+		ret = util_get_peer(av, cur_addr, &peer, flags);
+		if (ret)
 			goto err;
 
 		if (user_ids) {
@@ -206,7 +215,7 @@ rxm_av_add_peers(struct rxm_av *av, const void *addr, size_t count,
 			ofi_mutex_unlock(&av->util_av.lock);
 		}
 	}
-	return -FI_ENOMEM;
+	return ret;
 }
 
 static int rxm_av_remove(struct fid_av *av_fid, fi_addr_t *fi_addr,
@@ -299,7 +308,7 @@ static int rxm_av_insert(struct fid_av *av_fid, const void *addr, size_t count,
 
 	count = ret;
 
-	ret = rxm_av_add_peers(av, addr, count, fi_addr, user_ids);
+	ret = rxm_av_add_peers(av, addr, count, fi_addr, user_ids, flags);
 	if (ret) {
 		rxm_av_remove(av_fid, fi_addr, count, flags);
 		goto out;
@@ -345,7 +354,7 @@ static int rxm_av_insertsym(struct fid_av *av_fid, const char *node,
 	if (ret > 0 && ret < count)
 		count = ret;
 
-	ret = rxm_av_add_peers(av, addr, count, fi_addr, NULL);
+	ret = rxm_av_add_peers(av, addr, count, fi_addr, NULL, flags);
 	if (ret) {
 		rxm_av_remove(av_fid, fi_addr, count, flags);
 		return ret;