From a7cbca406619eef635b9bb6ca21d15c7e33a79ee Mon Sep 17 00:00:00 2001 From: zhenwei pi Date: Mon, 30 Sep 2024 17:54:05 +0800 Subject: [PATCH] RDMA: Support .is_local method (#1089) There is no ethernet style virtual device (like lo 127.0.0.1) for RDMA, however a connection with the same local address and peer address are considered as local. Signed-off-by: zhenwei pi --- src/rdma.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/rdma.c b/src/rdma.c index 66dd0dd6f..6cbc5c70b 100644 --- a/src/rdma.c +++ b/src/rdma.c @@ -1501,6 +1501,26 @@ end: return ret; } +static int connRdmaIsLocal(connection *conn) { + rdma_connection *rdma_conn = (rdma_connection *)conn; + struct sockaddr *laddr = rdma_get_local_addr(rdma_conn->cm_id); + struct sockaddr *raddr = rdma_get_peer_addr(rdma_conn->cm_id); + struct sockaddr_in *lsa4, *rsa4; + struct sockaddr_in6 *lsa6, *rsa6; + + if (laddr->sa_family == AF_INET) { + lsa4 = (struct sockaddr_in *)laddr; + rsa4 = (struct sockaddr_in *)raddr; + return !memcmp(&lsa4->sin_addr, &rsa4->sin_addr, sizeof(lsa4->sin_addr)); + } else if (laddr->sa_family == AF_INET6) { + lsa6 = (struct sockaddr_in6 *)laddr; + rsa6 = (struct sockaddr_in6 *)raddr; + return !memcmp(&lsa6->sin6_addr, &rsa6->sin6_addr, sizeof(lsa6->sin6_addr)); + } + + return -1; +} + int connRdmaListen(connListener *listener) { int j, ret; char **bindaddr = listener->bindaddr; @@ -1673,6 +1693,7 @@ static ConnectionType CT_RDMA = { .ae_handler = connRdmaEventHandler, .accept_handler = connRdmaAcceptHandler, //.cluster_accept_handler = NULL, + .is_local = connRdmaIsLocal, .listen = connRdmaListen, .addr = connRdmaAddr,