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 <pizhenwei@bytedance.com>
This commit is contained in:
parent
bb57dfe630
commit
a7cbca4066
21
src/rdma.c
21
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,
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user