From 6deddc3d46704643dbc6c91b63ee52b1d91ce212 Mon Sep 17 00:00:00 2001 From: Mr NeilBrown Date: Tue, 8 Jun 2021 10:52:25 +1000 Subject: [PATCH] LU-10391 socklnd: pass large processid to ksocknal_add_peer Teach ksocknal_add_peer() to handle large-address processid, and now ksocknal_launch_packet() can support IPv6 addresses as well as IPv4. Test-Parameters: trivial testlist=sanity-lnet Test-Parameters: serverversion=2.12 serverdistro=el7.9 testlist=runtests Test-Parameters: clientversion=2.12 testlist=runtests Signed-off-by: Mr NeilBrown Change-Id: I90655b8d6e1a2e9fc38a7bf9d492542f76086c70 Reviewed-on: https://review.whamcloud.com/44621 Reviewed-by: James Simmons Tested-by: jenkins Tested-by: Maloo Reviewed-by: Chris Horn Reviewed-by: Oleg Drokin --- lnet/klnds/socklnd/socklnd.c | 22 +++++++++------------- lnet/klnds/socklnd/socklnd.h | 2 +- lnet/klnds/socklnd/socklnd_cb.c | 28 ++++++++++++++++++---------- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index e3de347..4d6907e 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -610,23 +610,19 @@ ksocknal_del_conn_cb_locked(struct ksock_conn_cb *conn_cb) } int -ksocknal_add_peer(struct lnet_ni *ni, struct lnet_process_id id4, +ksocknal_add_peer(struct lnet_ni *ni, struct lnet_processid *id, struct sockaddr *addr) { struct ksock_peer_ni *peer_ni; struct ksock_peer_ni *peer2; struct ksock_conn_cb *conn_cb; - struct lnet_processid id; - if (id4.nid == LNET_NID_ANY || - id4.pid == LNET_PID_ANY) + if (LNET_NID_IS_ANY(&id->nid) || + id->pid == LNET_PID_ANY) return (-EINVAL); - id.pid = id4.pid; - lnet_nid4_to_nid(id4.nid, &id.nid); - /* Have a brand new peer_ni ready... */ - peer_ni = ksocknal_create_peer(ni, &id); + peer_ni = ksocknal_create_peer(ni, id); if (IS_ERR(peer_ni)) return PTR_ERR(peer_ni); @@ -642,14 +638,14 @@ ksocknal_add_peer(struct lnet_ni *ni, struct lnet_process_id id4, LASSERT(atomic_read(&((struct ksock_net *)ni->ni_data)->ksnn_npeers) >= 0); - peer2 = ksocknal_find_peer_locked(ni, &id); + peer2 = ksocknal_find_peer_locked(ni, id); if (peer2 != NULL) { ksocknal_peer_decref(peer_ni); peer_ni = peer2; } else { /* peer_ni table takes my ref on peer_ni */ hash_add(ksocknal_data.ksnd_peers, &peer_ni->ksnp_list, - nidhash(&id.nid)); + nidhash(&id->nid)); } ksocknal_add_conn_cb_locked(peer_ni, conn_cb); @@ -1814,11 +1810,11 @@ ksocknal_ctl(struct lnet_ni *ni, unsigned int cmd, void *arg) case IOC_LIBCFS_ADD_PEER: { struct sockaddr_in sa = {.sin_family = AF_INET}; - id4.nid = data->ioc_nid; - id4.pid = LNET_PID_LUSTRE; + id.pid = LNET_PID_LUSTRE; + lnet_nid4_to_nid(data->ioc_nid, &id.nid); sa.sin_addr.s_addr = htonl(data->ioc_u32[0]); sa.sin_port = htons(data->ioc_u32[1]); - return ksocknal_add_peer(ni, id4, (struct sockaddr *)&sa); + return ksocknal_add_peer(ni, &id, (struct sockaddr *)&sa); } case IOC_LIBCFS_DEL_PEER: id4.nid = data->ioc_nid; diff --git a/lnet/klnds/socklnd/socklnd.h b/lnet/klnds/socklnd/socklnd.h index 81db1c3..499f94e 100644 --- a/lnet/klnds/socklnd/socklnd.h +++ b/lnet/klnds/socklnd/socklnd.h @@ -596,7 +596,7 @@ int ksocknal_recv(struct lnet_ni *ni, void *private, struct lnet_msg *lntmsg, unsigned int offset, unsigned int mlen, unsigned int rlen); int ksocknal_accept(struct lnet_ni *ni, struct socket *sock); -int ksocknal_add_peer(struct lnet_ni *ni, struct lnet_process_id id, +int ksocknal_add_peer(struct lnet_ni *ni, struct lnet_processid *id, struct sockaddr *addr); struct ksock_peer_ni *ksocknal_find_peer_locked(struct lnet_ni *ni, struct lnet_processid *id); diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index 4e7a61b..418b7b4 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -875,7 +875,7 @@ ksocknal_launch_packet(struct lnet_ni *ni, struct ksock_tx *tx, { struct ksock_peer_ni *peer_ni; struct ksock_conn *conn; - struct sockaddr_in sa; + struct sockaddr_storage sa; rwlock_t *g_lock; int retry; int rc; @@ -925,16 +925,24 @@ ksocknal_launch_packet(struct lnet_ni *ni, struct ksock_tx *tx, } memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_addr.s_addr = id->nid.nid_addr[0]; - sa.sin_port = htons(lnet_acceptor_port()); - { - struct lnet_process_id id4 = { - .pid = id->pid, - .nid = lnet_nid_to_nid4(&id->nid), - }; - rc = ksocknal_add_peer(ni, id4, (struct sockaddr *)&sa); + switch (NID_ADDR_BYTES(&id->nid)) { + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; + case 4: + sin = (void *)&sa; + sin->sin_family = AF_INET; + sin->sin_addr.s_addr = id->nid.nid_addr[0]; + sin->sin_port = htons(lnet_acceptor_port()); + break; + case 16: + sin6 = (void *)&sa; + sin6->sin6_family = AF_INET6; + memcpy(&sin6->sin6_addr, id->nid.nid_addr, + sizeof(sin6->sin6_addr)); + sin6->sin6_port = htons(lnet_acceptor_port()); + break; } + rc = ksocknal_add_peer(ni, id, (struct sockaddr *)&sa); if (rc != 0) { CERROR("Can't add peer_ni %s: %d\n", libcfs_idstr(id), rc); -- 1.8.3.1