From cb5f92c0e38eaca4b76f17356ba6d7817c220f56 Mon Sep 17 00:00:00 2001 From: James Simmons Date: Tue, 31 Oct 2023 12:53:40 -0400 Subject: [PATCH] LU-10391 ksocklnd: use ksocknal_protocol v4 for IPv6 During testing of IPv6 I encountered the following error: LNetError: 11c-c: Protocol error connecting to ... This was due to the ksocklnd protocol not being set to the correct version when using IPv6 addresses. Test if we have a IPv6 peer and set the proper protocol. Test-Parameters: trivial testlist=sanity-lnet Change-Id: I19183e904acee4cb8b9d3b7e77284c81f6cdc2b4 Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52911 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Neil Brown Reviewed-by: Chris Horn Reviewed-by: Frank Sehr Reviewed-by: Cyril Bordage Reviewed-by: Oleg Drokin --- lnet/klnds/socklnd/socklnd.c | 12 ++++++++++-- lnet/klnds/socklnd/socklnd_cb.c | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index 23a5345..3991dc03 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -934,8 +934,9 @@ ksocknal_create_conn(struct lnet_ni *ni, struct ksock_conn_cb *conn_cb, * Passive connections use the listener timeout since the peer_ni sends * eagerly */ - if (active) { + struct sockaddr_in *psa = (void *)&conn->ksnc_peeraddr; + peer_ni = conn_cb->ksnr_peer; LASSERT(ni == peer_ni->ksnp_ni); @@ -948,7 +949,10 @@ ksocknal_create_conn(struct lnet_ni *ni, struct ksock_conn_cb *conn_cb, write_unlock_bh(global_lock); if (conn->ksnc_proto == NULL) { - conn->ksnc_proto = &ksocknal_protocol_v3x; + if (psa->sin_family == AF_INET6) + conn->ksnc_proto = &ksocknal_protocol_v4x; + else if (psa->sin_family == AF_INET) + conn->ksnc_proto = &ksocknal_protocol_v3x; #if SOCKNAL_VERSION_DEBUG if (*ksocknal_tunables.ksnd_protocol == 2) conn->ksnc_proto = &ksocknal_protocol_v2x; @@ -956,6 +960,10 @@ ksocknal_create_conn(struct lnet_ni *ni, struct ksock_conn_cb *conn_cb, conn->ksnc_proto = &ksocknal_protocol_v1x; #endif } + if (!conn->ksnc_proto) { + rc = -EPROTO; + goto failed_1; + } rc = ksocknal_send_hello(ni, conn, &peerid.nid, hello); if (rc != 0) diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index 64b10e8..93e97f8 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -1807,21 +1807,29 @@ ksocknal_recv_hello(struct lnet_ni *ni, struct ksock_conn *conn, proto = ksocknal_parse_proto_version(hello); if (proto == NULL) { if (!active) { + struct sockaddr_in *psa = (void *)&conn->ksnc_peeraddr; + /* unknown protocol from peer_ni, * tell peer_ni my protocol. */ - conn->ksnc_proto = &ksocknal_protocol_v3x; + if (psa->sin_family == AF_INET6) + conn->ksnc_proto = &ksocknal_protocol_v4x; + else if (psa->sin_family == AF_INET) + conn->ksnc_proto = &ksocknal_protocol_v3x; #if SOCKNAL_VERSION_DEBUG if (*ksocknal_tunables.ksnd_protocol == 2) conn->ksnc_proto = &ksocknal_protocol_v2x; else if (*ksocknal_tunables.ksnd_protocol == 1) conn->ksnc_proto = &ksocknal_protocol_v1x; #endif + if (!conn->ksnc_proto) + goto unknown; + hello->kshm_nips = 0; ksocknal_send_hello(ni, conn, &ni->ni_nid, hello); } - +unknown: CERROR("Unknown protocol version (%d.x expected) from %pISc\n", conn->ksnc_proto->pro_version, &conn->ksnc_peeraddr); -- 1.8.3.1