Skip to content

Commit

Permalink
RDMA: Support .is_local method (valkey-io#1089)
Browse files Browse the repository at this point in the history
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 <pizhenwei@bytedance.com>
  • Loading branch information
pizhenwei authored Sep 30, 2024
1 parent bb57dfe commit a7cbca4
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions src/rdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -1501,6 +1501,26 @@ static int rdmaServer(char *err, int port, char *bindaddr, int af, rdma_listener
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;
Expand Down Expand Up @@ -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,

Expand Down

0 comments on commit a7cbca4

Please sign in to comment.