Whamcloud - gitweb
LU-10391 ksocklnd: use ksocknal_protocol v4 for IPv6 11/52911/2
authorJames Simmons <jsimmons@infradead.org>
Tue, 31 Oct 2023 16:53:40 +0000 (12:53 -0400)
committerOleg Drokin <green@whamcloud.com>
Wed, 8 Nov 2023 22:00:47 +0000 (22:00 +0000)
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 <jsimmons@infradead.org>
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/52911
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Neil Brown <neilb@suse.de>
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Reviewed-by: Frank Sehr <fsehr@whamcloud.com>
Reviewed-by: Cyril Bordage <cbordage@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/klnds/socklnd/socklnd.c
lnet/klnds/socklnd/socklnd_cb.c

index 23a5345..3991dc0 100644 (file)
@@ -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)
index 64b10e8..93e97f8 100644 (file)
@@ -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);