diff options
author | Sverker Eriksson <sverker@erlang.org> | 2022-03-31 22:02:50 +0200 |
---|---|---|
committer | Sverker Eriksson <sverker@erlang.org> | 2022-04-04 20:06:00 +0200 |
commit | c804bd8c7f840ecfa2397c836235363c112d79b4 (patch) | |
tree | e8e4bf32bfd2e3e3d233cc512f7da3b569054624 | |
parent | 722219f211092e0c4b919f3ba4f91df42191c0e7 (diff) | |
download | erlang-c804bd8c7f840ecfa2397c836235363c112d79b4.tar.gz |
erl_interface: Remove old distribution handshake
-rw-r--r-- | lib/erl_interface/src/connect/ei_connect.c | 294 | ||||
-rw-r--r-- | lib/erl_interface/src/epmd/ei_epmd.h | 3 | ||||
-rw-r--r-- | lib/erl_interface/src/epmd/epmd_publish.c | 4 | ||||
-rw-r--r-- | lib/erl_interface/test/ei_tmo_SUITE.erl | 183 | ||||
-rw-r--r-- | lib/kernel/include/dist.hrl | 6 |
5 files changed, 107 insertions, 383 deletions
diff --git a/lib/erl_interface/src/connect/ei_connect.c b/lib/erl_interface/src/connect/ei_connect.c index 8cdb5a97ee..4280b8f62e 100644 --- a/lib/erl_interface/src/connect/ei_connect.c +++ b/lib/erl_interface/src/connect/ei_connect.c @@ -103,8 +103,6 @@ static int recv_challenge(ei_socket_callbacks *cbs, void *ctx, int pkt_sz, static int send_challenge_reply(ei_socket_callbacks *cbs, void *ctx, int pkt_sz, unsigned char digest[16], unsigned challenge, unsigned ms); -static int recv_complement(ei_socket_callbacks *cbs, void *ctx, - int pkt_sz, unsigned ms); static int recv_challenge_reply(ei_socket_callbacks *cbs, void *ctx, int pkt_sz, unsigned our_challenge, char cookie[], @@ -115,13 +113,9 @@ static int send_challenge_ack(ei_socket_callbacks *cbs, void *ctx, static int recv_challenge_ack(ei_socket_callbacks *cbs, void *ctx, int pkt_sz, unsigned our_challenge, char cookie[], unsigned ms); -static int send_name(ei_cnode *ec, void *ctx, int pkt_sz, - unsigned version, unsigned ms); -static int send_complement(ei_cnode *ec, void *ctx, int pkt_sz, - unsigned epmd_says_version, DistFlags her_flags, - unsigned ms); +static int send_name(ei_cnode *ec, void *ctx, int pkt_sz, unsigned ms); static int recv_name(ei_socket_callbacks *cbs, void *ctx, int pkt_sz, - char* send_name_tag, DistFlags *flags, + DistFlags *flags, char *namebuf, unsigned ms); static int ei_connect_helper(ei_cnode* ec, Erl_IpAddr ip_addr, @@ -1220,7 +1214,6 @@ static int ei_connect_helper(ei_cnode* ec, ei_socket_callbacks *cbs = ec->cbs; void *ctx; int sockd; - unsigned her_version; DistFlags her_flags; unsigned our_challenge, her_challenge; unsigned char our_digest[16]; @@ -1245,12 +1238,6 @@ static int ei_connect_helper(ei_cnode* ec, return ERL_ERROR; } - if (!ec->thisnodename[0] && epmd_says_version < EI_DIST_6) { - /* This is a dynamic node name. We have to use at least vsn 6 - of the dist protocol for this to work. */ - epmd_says_version = EI_DIST_6; - } - err = ei_socket_ctx__(cbs, &ctx, ec->setup_context); if (err) { EI_TRACE_ERR2("ei_xconnect","-> SOCKET failed: %s (%d)", @@ -1287,24 +1274,21 @@ static int ei_connect_helper(ei_cnode* ec, goto error; } - if (send_name(ec, ctx, pkt_sz, epmd_says_version, tmo)) + if (send_name(ec, ctx, pkt_sz, tmo)) goto error; if (recv_status(ec, ctx, pkt_sz, tmo)) goto error; if (recv_challenge(cbs, ctx, pkt_sz, &her_challenge, &her_flags, NULL, tmo)) goto error; - her_version = (her_flags & DFLAG_HANDSHAKE_23) ? EI_DIST_6 : EI_DIST_5; our_challenge = gen_challenge(); gen_digest(her_challenge, ec->ei_connect_cookie, our_digest); - if (send_complement(ec, ctx, pkt_sz, epmd_says_version, her_flags, tmo)) - goto error; if (send_challenge_reply(cbs, ctx, pkt_sz, our_digest, our_challenge, tmo)) goto error; if (recv_challenge_ack(cbs, ctx, pkt_sz, our_challenge, ec->ei_connect_cookie, tmo)) goto error; - if (put_ei_socket_info(sockd, her_version, null_cookie, ec, cbs, ctx) != 0) + if (put_ei_socket_info(sockd, EI_DIST_6, null_cookie, ec, cbs, ctx) != 0) goto error; if (cbs->connect_handshake_complete) { @@ -1547,7 +1531,6 @@ int ei_accept_tmo(ei_cnode* ec, int lfd, ErlConnect *conp, unsigned ms) int fd; DistFlags her_flags; char tmp_nodename[MAXNODELEN+1]; - char send_name_tag; char *her_name; int pkt_sz, err; struct sockaddr_in addr; @@ -1622,14 +1605,12 @@ int ei_accept_tmo(ei_cnode* ec, int lfd, ErlConnect *conp, unsigned ms) EI_TRACE_CONN0("ei_accept","<- ACCEPT connected to remote"); - if (recv_name(cbs, ctx, pkt_sz, &send_name_tag, &her_flags, - her_name, tmo)) { + if (recv_name(cbs, ctx, pkt_sz, &her_flags, her_name, tmo)) { EI_TRACE_ERR0("ei_accept","<- ACCEPT initial ident failed"); goto error; } { - unsigned her_version = (her_flags & DFLAG_HANDSHAKE_23) ? 6 : 5; unsigned our_challenge; unsigned her_challenge; unsigned char our_digest[16]; @@ -1639,17 +1620,13 @@ int ei_accept_tmo(ei_cnode* ec, int lfd, ErlConnect *conp, unsigned ms) our_challenge = gen_challenge(); if (send_challenge(ec, ctx, pkt_sz, our_challenge, her_flags, tmo)) goto error; - if (send_name_tag == 'n' && (her_flags & DFLAG_HANDSHAKE_23)) { - if (recv_complement(cbs, ctx, pkt_sz, tmo)) - goto error; - } if (recv_challenge_reply(cbs, ctx, pkt_sz, our_challenge, ec->ei_connect_cookie, &her_challenge, tmo)) goto error; gen_digest(her_challenge, ec->ei_connect_cookie, our_digest); if (send_challenge_ack(cbs, ctx, pkt_sz, our_digest, tmo)) goto error; - if (put_ei_socket_info(fd, her_version, null_cookie, ec, cbs, ctx) != 0) + if (put_ei_socket_info(fd, EI_DIST_6, null_cookie, ec, cbs, ctx) != 0) goto error; } if (conp) { @@ -2285,7 +2262,6 @@ static DistFlags preferred_flags(void) static int send_name(ei_cnode *ec, void *ctx, int pkt_sz, - unsigned version, unsigned ms) { char *buf; @@ -2297,25 +2273,18 @@ static int send_name(ei_cnode *ec, int err, ret; ssize_t len; DistFlags flags = preferred_flags(); - char tag; if (ec->thisnodename[0]) { name_ptr = ec->thisnodename; - tag = (version == EI_DIST_5) ? 'n' : 'N'; } else { /* dynamic node name */ name_ptr = ec->thishostname; - tag = 'N'; /* presume ver 6 */ flags |= DFLAG_NAME_ME; } name_len = strlen(name_ptr); - - if (tag == 'n') - siz = pkt_sz + 1 + 2 + 4 + name_len; - else - siz = pkt_sz + 1 + 8 + 4 + 2 + name_len; + siz = pkt_sz + 1 + 8 + 4 + 2 + name_len; buf = (siz > DEFBUF_SIZ) ? malloc(siz) : dbuf; if (!buf) { @@ -2335,16 +2304,10 @@ static int send_name(ei_cnode *ec, goto done; } - put8(s, tag); - if (tag == 'n') { - put16be(s, EI_DIST_5); /* some impl (jinterface) demand ver==5 */ - put32be(s, flags); - } - else { /* tag == 'N' */ - put64be(s, flags); - put32be(s, ec->creation); - put16be(s, name_len); - } + put8(s, 'N'); + put64be(s, flags); + put32be(s, ec->creation); + put16be(s, name_len); memcpy(s, name_ptr, name_len); len = (ssize_t) siz; err = ei_write_fill_ctx_t__(ec->cbs, ctx, buf, &len, ms); @@ -2379,12 +2342,8 @@ static int send_challenge(ei_cnode *ec, int err, ret; ssize_t len; DistFlags flags; - const char tag = (her_flags & DFLAG_HANDSHAKE_23) ? 'N' : 'n'; - if (tag == 'n') - siz = pkt_sz + 1 + 2 + 4 + 4 + nodename_len; - else - siz = pkt_sz + 1 + 8 + 4 + 4 + 2 + nodename_len; + siz = pkt_sz + 1 + 8 + 4 + 4 + 2 + nodename_len; buf = (siz > DEFBUF_SIZ) ? malloc(siz) : dbuf; if (!buf) { @@ -2405,18 +2364,11 @@ static int send_challenge(ei_cnode *ec, } flags = preferred_flags(); - put8(s, tag); - if (tag == 'n') { - put16be(s, EI_DIST_5); /* chosen version */ - put32be(s, flags); - put32be(s, challenge); - } - else { - put64be(s, flags); - put32be(s, challenge); - put32be(s, ec->creation); - put16be(s, nodename_len); - } + put8(s, 'N'); + put64be(s, flags); + put32be(s, challenge); + put32be(s, ec->creation); + put16be(s, nodename_len); memcpy(s, ec->thisnodename, nodename_len); len = (ssize_t) siz; err = ei_write_fill_ctx_t__(ec->cbs, ctx, buf, &len, ms); @@ -2444,7 +2396,6 @@ static int recv_challenge(ei_socket_callbacks *cbs, void *ctx, int is_static = 1; int buflen = DEFBUF_SIZ; int rlen, nodename_len; - unsigned version; char *s; char tag; char tmp_nodename[MAXNODELEN+1]; @@ -2459,47 +2410,26 @@ static int recv_challenge(ei_socket_callbacks *cbs, void *ctx, } s = buf; tag = get8(s); - if (tag != 'n' && tag != 'N') { + if (tag != 'N') { EI_TRACE_ERR2("recv_challenge", "<- RECV_CHALLENGE incorrect tag, " - "expected 'n' or 'N', got '%c' (%u)",tag,tag); + "expected 'N', got '%c' (%u)", tag, tag); goto error; } - if (tag == 'n') { /* OLD */ - if (rlen < 1+2+4+4) { - EI_TRACE_ERR1("recv_challenge","<- RECV_CHALLENGE 'n' packet too short (%d)", - rlen) - goto error; - } - - version = get16be(s); - if (version != EI_DIST_5) { - EI_TRACE_ERR1("recv_challenge", - "<- RECV_CHALLENGE 'n' incorrect version=%d", - version); - goto error; - } - *flags = get32be(s); - *challenge = get32be(s); - nodename_len = (buf + rlen) - s; - } - else { /* NEW */ - if (rlen < 1+8+4+4+2) { - EI_TRACE_ERR1("recv_challenge","<- RECV_CHALLENGE 'N' packet too short (%d)", - rlen) - goto error; - } - version = EI_DIST_6; - *flags = get64be(s); - *challenge = get32be(s); - s += 4; /* ignore peer 'creation' */ - nodename_len = get16be(s); - if (nodename_len > (buf + rlen) - s) { - EI_TRACE_ERR1("recv_challenge", - "<- RECV_CHALLENGE 'N' nodename too long (%d)", - nodename_len); - goto error; - } + if (rlen < 1+8+4+4+2) { + EI_TRACE_ERR1("recv_challenge","<- RECV_CHALLENGE 'N' packet too short (%d)", + rlen) + goto error; + } + *flags = get64be(s); + *challenge = get32be(s); + s += 4; /* ignore peer 'creation' */ + nodename_len = get16be(s); + if (nodename_len > (buf + rlen) - s) { + EI_TRACE_ERR1("recv_challenge", + "<- RECV_CHALLENGE 'N' nodename too long (%d)", + nodename_len); + goto error; } if (nodename_len > MAXNODELEN) { @@ -2526,12 +2456,10 @@ static int recv_challenge(ei_socket_callbacks *cbs, void *ctx, if (!is_static) free(buf); - EI_TRACE_CONN4("recv_challenge","<- RECV_CHALLENGE (ok) node = %s, " - "version = %u, " + EI_TRACE_CONN3("recv_challenge","<- RECV_CHALLENGE (ok) node = %s, " "flags = %u, " "challenge = %d", namebuf, - version, *flags, *challenge ); @@ -2543,63 +2471,6 @@ error: return -1; } -static int send_complement(ei_cnode *ec, - void *ctx, - int pkt_sz, - unsigned epmd_says_version, - DistFlags her_flags, - unsigned ms) -{ - int ret = 0; - if (epmd_says_version == EI_DIST_5 && (her_flags & DFLAG_HANDSHAKE_23)) { - char *buf; - unsigned char *s; - char dbuf[DEFBUF_SIZ]; - int err; - ssize_t len; - unsigned int flagsHigh; - const int siz = pkt_sz + 1 + 4 + 4; - - buf = (siz > DEFBUF_SIZ) ? malloc(siz) : dbuf; - if (!buf) { - erl_errno = ENOMEM; - return -1; - } - s = (unsigned char *)buf; - switch (pkt_sz) { - case 2: - put16be(s,siz - 2); - break; - case 4: - put32be(s,siz - 4); - break; - default: - ret = -1; - goto done; - } - flagsHigh = preferred_flags() >> 32; - - put8(s, 'c'); - put32be(s, flagsHigh); - put32be(s, ec->creation); - - len = (ssize_t) siz; - err = ei_write_fill_ctx_t__(ec->cbs, ctx, buf, &len, ms); - if (!err && len != (ssize_t) siz) - err = EIO; - if (err) { - EI_TRACE_ERR0("send_name", "SEND_NAME -> socket write failed"); - EI_CONN_SAVE_ERRNO__(err); - ret = -1; - } - done: - if (buf != dbuf) - free(buf); - } - return ret; -} - - static int send_challenge_reply(ei_socket_callbacks *cbs, void *ctx, int pkt_sz, unsigned char digest[16], unsigned challenge, unsigned ms) @@ -2646,54 +2517,6 @@ static int send_challenge_reply(ei_socket_callbacks *cbs, void *ctx, return 0; } -static int recv_complement(ei_socket_callbacks *cbs, - void *ctx, - int pkt_sz, - unsigned ms) -{ - char dbuf[DEFBUF_SIZ]; - char *buf = dbuf; - int is_static = 1; - int buflen = DEFBUF_SIZ; - int rlen; - char *s; - char tag; - unsigned int creation; - - erl_errno = EIO; /* Default */ - - if ((rlen = read_hs_package(cbs, ctx, pkt_sz, &buf, &buflen, &is_static, ms)) != 21) { - EI_TRACE_ERR1("recv_complement", - "<- RECV_COMPLEMENT socket read failed (%d)",rlen); - goto error; - } - - s = buf; - if ((tag = get8(s)) != 'c') { - EI_TRACE_ERR2("recv_complement", - "<- RECV_COMPLEMENT incorrect tag, " - "expected 'c' got '%c' (%u)",tag,tag); - goto error; - } - creation = get32be(s); - if (!is_static) - free(buf); - - if (ei_tracelevel >= 3) { - EI_TRACE_CONN1("recv_complement", - "<- RECV_COMPLEMENT (ok) creation = %u", - creation); - } - /* We don't have any use for 'creation' of other node, so we drop it */ - erl_errno = 0; - return 0; - -error: - if (!is_static) - free(buf); - return -1; -} - static int recv_challenge_reply(ei_socket_callbacks *cbs, void *ctx, int pkt_sz, @@ -2850,7 +2673,7 @@ error: } static int recv_name(ei_socket_callbacks *cbs, void *ctx, - int pkt_sz, char *send_name_tag, + int pkt_sz, DistFlags *flags, char *namebuf, unsigned ms) { char dbuf[DEFBUF_SIZ]; @@ -2872,38 +2695,19 @@ static int recv_name(ei_socket_callbacks *cbs, void *ctx, } s = buf; tag = get8(s); - *send_name_tag = tag; - if (tag != 'n' && tag != 'N') { + if (tag != 'N') { EI_TRACE_ERR2("recv_name","<- RECV_NAME incorrect tag, " - "expected 'n' or 'N', got '%c' (%u)",tag,tag); + "expected 'N', got '%c' (%u)",tag,tag); goto error; } - if (tag == 'n') { - unsigned int version; - if (rlen < 1+2+4) { - EI_TRACE_ERR1("recv_name","<- RECV_NAME 'n' packet too short (%d)", - rlen) - goto error; - } - version = get16be(s); - if (version < EI_DIST_5) { - EI_TRACE_ERR1("recv_name","<- RECV_NAME 'n' invalid version=%d", - version) - goto error; - } - *flags = get32be(s); - namelen = rlen - (1+2+4); - } - else { /* tag == 'N' */ - if (rlen < 1+8+4+2) { - EI_TRACE_ERR1("recv_name","<- RECV_NAME 'N' packet too short (%d)", - rlen) - goto error; - } - *flags = get64be(s); - s += 4; /* ignore peer 'creation' */ - namelen = get16be(s); + if (rlen < 1+8+4+2) { + EI_TRACE_ERR1("recv_name","<- RECV_NAME 'N' packet too short (%d)", + rlen) + goto error; } + *flags = get64be(s); + s += 4; /* ignore peer 'creation' */ + namelen = get16be(s); if (*flags & DFLAG_MANDATORY_25_DIGEST) { *flags |= DFLAG_DIST_MANDATORY_25; @@ -2920,8 +2724,8 @@ static int recv_name(ei_socket_callbacks *cbs, void *ctx, namebuf = &tmp_nodename[0]; if (namelen > MAXNODELEN || s+namelen > buf+rlen) { - EI_TRACE_ERR2("recv_name","<- RECV_NAME '%c' nodename too long (%d)", - tag, namelen); + EI_TRACE_ERR1("recv_name","<- RECV_NAME nodename too long (%d)", + namelen); goto error; } @@ -2930,9 +2734,9 @@ static int recv_name(ei_socket_callbacks *cbs, void *ctx, if (!is_static) free(buf); - EI_TRACE_CONN3("recv_name", - "<- RECV_NAME (ok) node = %s, tag = %c, flags = %u", - namebuf,tag,*flags); + EI_TRACE_CONN2("recv_name", + "<- RECV_NAME (ok) node = %s, flags = %u", + namebuf, *flags); erl_errno = 0; return 0; diff --git a/lib/erl_interface/src/epmd/ei_epmd.h b/lib/erl_interface/src/epmd/ei_epmd.h index 6a274b606a..1b234fb34d 100644 --- a/lib/erl_interface/src/epmd/ei_epmd.h +++ b/lib/erl_interface/src/epmd/ei_epmd.h @@ -24,12 +24,11 @@ #define INADDR_LOOPBACK ((u_long) 0x7F000001) #endif -#define EI_DIST_5 5 /* OTP R4 - 22 */ #define EI_DIST_6 6 /* OTP 23 and later */ #ifndef EI_DIST_HIGH #define EI_DIST_HIGH EI_DIST_6 -#define EI_DIST_LOW EI_DIST_5 +#define EI_DIST_LOW EI_DIST_6 #endif #ifndef EPMD_PORT diff --git a/lib/erl_interface/src/epmd/epmd_publish.c b/lib/erl_interface/src/epmd/epmd_publish.c index 3e251d6a64..ff7f3f5323 100644 --- a/lib/erl_interface/src/epmd/epmd_publish.c +++ b/lib/erl_interface/src/epmd/epmd_publish.c @@ -76,8 +76,8 @@ static int ei_epmd_r4_publish (int port, const char *alive, unsigned ms) put16be(s,port); /* port number */ put8(s,'h'); /* h = r4 hidden node */ put8(s, EI_MYPROTO); /* protocol 0 ?? */ - put16be(s,EI_DIST_HIGH); /* highest understood version: 1 = R4 */ - put16be(s,EI_DIST_LOW); /* lowest: 0 = R3 */ + put16be(s,EI_DIST_HIGH); /* highest understood version */ + put16be(s,EI_DIST_LOW); /* lowest */ put16be(s,nlen); /* length of alivename */ strcpy(s, alive); s += nlen; diff --git a/lib/erl_interface/test/ei_tmo_SUITE.erl b/lib/erl_interface/test/ei_tmo_SUITE.erl index 49e889bdf3..964ec121f4 100644 --- a/lib/erl_interface/test/ei_tmo_SUITE.erl +++ b/lib/erl_interface/test/ei_tmo_SUITE.erl @@ -95,7 +95,8 @@ end_per_testcase(_Case, _Config) -> ?DFLAG_NEW_FLOATS bor ?DFLAG_MAP_TAG bor ?DFLAG_EXPORT_PTR_TAG bor - ?DFLAG_BIT_BINARIES)). + ?DFLAG_BIT_BINARIES bor + ?DFLAG_HANDSHAKE_23)). %% Check the framework. framework_check(Config) when is_list(Config) -> @@ -142,7 +143,7 @@ do_one_recv_failure(Config,CNode) -> true = (Ret < 0), runner:recv_eot(P1). --define(EI_DIST_LOW, 5). +-define(EI_DIST_LOW, 6). -define(EI_DIST_HIGH, 6). %% Check send with timeouts. @@ -176,15 +177,11 @@ do_one_send(Config,From,CNode) -> ei_send_failure_tmo(Config) when is_list(Config) -> register(ei_send_tmo_1,self()), - [begin - io:format("Test dist version ~p\n", [Ver]), - do_one_send_failure(Config,self(),cccc1,c_nod_send_tmo_3, Ver), - do_one_send_failure(Config,ei_send_tmo_1,cccc2,c_nod_send_tmo_4, Ver) - end - || Ver <- lists:seq(?EI_DIST_LOW, ?EI_DIST_HIGH)], + do_one_send_failure(Config,self(),cccc1,c_nod_send_tmo_3), + do_one_send_failure(Config,ei_send_tmo_1,cccc2,c_nod_send_tmo_4), ok. -do_one_send_failure(Config,From,FakeName,CName, OurVer) -> +do_one_send_failure(Config,From,FakeName,CName) -> {_,Host} = split(node()), OurName = join(FakeName,Host), Node = join(CName,Host), @@ -194,7 +191,7 @@ do_one_send_failure(Config,From,FakeName,CName, OurVer) -> Else -> exit(Else) end, - EpmdSocket = epmd_register(OurName, LSocket, OurVer), + EpmdSocket = epmd_register(OurName, LSocket), P3 = runner:start(Config, ?send_tmo), Cookie = kaksmula_som_ingen_bryr_sig_om, runner:send_term(P3,{CName, @@ -207,10 +204,10 @@ do_one_send_failure(Config,From,FakeName,CName, OurVer) -> Else2 -> exit(Else2) end, - {hidden,Node} = recv_name(SocketB, OurVer), % See 1) + {hidden,Node} = recv_name(SocketB), % See 1) send_status(SocketB, ok), MyChallengeB = gen_challenge(), - send_challenge(SocketB, OurName, MyChallengeB, OurVer), + send_challenge(SocketB, OurName, MyChallengeB), HisChallengeB = recv_challenge_reply(SocketB, MyChallengeB, Cookie), @@ -256,18 +253,6 @@ ei_connect_unreachable_tmo(Config) when is_list(Config) -> ok. ei_connect_tmo(Config) when is_list(Config) -> - [begin - io:format("Test dist version ~p published as ~p\n", - [OurVer,OurEpmdVer]), - do_ei_connect_tmo(Config, OurVer, OurEpmdVer) - end - || OurVer <- lists:seq(?EI_DIST_LOW, ?EI_DIST_HIGH), - OurEpmdVer <- lists:seq(?EI_DIST_LOW, ?EI_DIST_HIGH), - OurVer >= OurEpmdVer], - - ok. - -do_ei_connect_tmo(Config, OurVer, OurEpmdVer) -> Flags = ?COMPULSORY_DFLAGS bor ?DFLAG_MANDATORY_25_DIGEST, P2 = runner:start(Config, ?connect_tmo), @@ -289,7 +274,7 @@ do_ei_connect_tmo(Config, OurVer, OurEpmdVer) -> Else -> exit(Else) end, - EpmdSocket = epmd_register(OurName, LSocket, OurEpmdVer), + EpmdSocket = epmd_register(OurName, LSocket), P3 = runner:start(Config, ?connect_tmo), Cookie = kaksmula_som_ingen_bryr_sig_om, runner:send_term(P3,{c_nod_connect_tmo_3, @@ -302,11 +287,10 @@ do_ei_connect_tmo(Config, OurVer, OurEpmdVer) -> Else2 -> exit(Else2) end, - {hidden,Node} = recv_name(SocketB, OurEpmdVer), % See 1) + {hidden,Node} = recv_name(SocketB), % See 1) send_status(SocketB, ok), MyChallengeB = gen_challenge(), - send_challenge(SocketB, OurName, MyChallengeB, OurVer, Flags), - recv_complement(SocketB, OurVer, OurEpmdVer), + send_challenge(SocketB, OurName, MyChallengeB, Flags), _HisChallengeB = recv_challenge_reply(SocketB, MyChallengeB, Cookie), @@ -319,17 +303,6 @@ do_ei_connect_tmo(Config, OurVer, OurEpmdVer) -> %% Check accept with timeouts. ei_accept_tmo(Config) when is_list(Config) -> - [begin - io:format("Test our dist ver=~p and assumed ver=~p\n", - [OurVer, AssumedVer]), - do_ei_accept_tmo(Config, OurVer, AssumedVer) - end - || OurVer <- lists:seq(?EI_DIST_LOW, ?EI_DIST_HIGH), - AssumedVer <- lists:seq(?EI_DIST_LOW, ?EI_DIST_HIGH), - OurVer >= AssumedVer], - ok. - -do_ei_accept_tmo(Config, OurVer, AssumedVer) -> Flags = ?COMPULSORY_DFLAGS bor ?DFLAG_MANDATORY_25_DIGEST, P = runner:start(Config, ?accept_tmo), @@ -350,11 +323,11 @@ do_ei_accept_tmo(Config, OurVer, AssumedVer) -> runner:recv_eot(P2), true = is_integer(X), - normal_accept(Config, OurVer, AssumedVer, Flags), + normal_accept(Config, Flags), ok. -normal_accept(Config, OurVer, AssumedVer, Flags) -> +normal_accept(Config, Flags) -> P = runner:start(Config, ?accept_tmo), runner:send_term(P,{c_nod_som_vi_kontaktar_2, erlang:get_cookie(), @@ -368,9 +341,9 @@ normal_accept(Config, OurVer, AssumedVer, Flags) -> {ok, SocketA} = gen_tcp:connect(atom_to_list(NB),PortNo, [{active,false}, {packet,2}]), - send_name(SocketA, OurName, OurVer, AssumedVer, Flags), + send_name(SocketA, OurName, Flags), ok = recv_status(SocketA), - {hidden,_Node,HisChallengeA} = recv_challenge(SocketA,OurVer), % See 1) + {hidden,_Node,HisChallengeA} = recv_challenge(SocketA), % See 1) _OurChallengeA = gen_challenge(), _OurDigestA = gen_digest(HisChallengeA, erlang:get_cookie()), %% Dont do the last two steps of the connection setup... @@ -380,7 +353,7 @@ normal_accept(Config, OurVer, AssumedVer, Flags) -> runner:recv_eot(P), gen_tcp:close(SocketA). -normal_connect(Config, OurVer, Flags) -> +normal_connect(Config, Flags) -> {_,Host} = split(node()), OurName = join(cccc,Host), Node = join(c_nod_connect_tmo_3,Host), @@ -390,7 +363,7 @@ normal_connect(Config, OurVer, Flags) -> Else -> exit(Else) end, - EpmdSocket = epmd_register(OurName, LSocket, OurVer), + EpmdSocket = epmd_register(OurName, LSocket), P3 = runner:start(Config, ?connect_tmo), Cookie = kaksmula_som_ingen_bryr_sig_om, runner:send_term(P3, {c_nod_connect_tmo_3, @@ -403,11 +376,10 @@ normal_connect(Config, OurVer, Flags) -> Else2 -> exit(Else2) end, - {hidden,Node} = recv_name(SocketB, OurVer), + {hidden,Node} = recv_name(SocketB), send_status(SocketB, ok), MyChallengeB = gen_challenge(), - send_challenge(SocketB, OurName, MyChallengeB, OurVer, Flags), - recv_complement(SocketB, OurVer, OurVer), + send_challenge(SocketB, OurName, MyChallengeB, Flags), gen_tcp:close(SocketB), gen_tcp:close(EpmdSocket), ok. @@ -429,20 +401,13 @@ make_and_check_dummy() -> %% Test that erl_interface sets the appropriate distributions flags. ei_dflags(Config) -> - AssumedVer = 5, - OurVer = 6, - %% Test compatibility with OTP 24 and earlier. - normal_connect(Config, AssumedVer, ?COMPULSORY_DFLAGS), - normal_connect(Config, OurVer, ?COMPULSORY_DFLAGS), - normal_accept(Config, OurVer, AssumedVer, ?COMPULSORY_DFLAGS), - normal_accept(Config, OurVer, OurVer, ?COMPULSORY_DFLAGS), + normal_connect(Config, ?COMPULSORY_DFLAGS), + normal_accept(Config, ?COMPULSORY_DFLAGS), %% Test compatibility with future versions. - normal_connect(Config, AssumedVer, ?DFLAG_MANDATORY_25_DIGEST), - normal_connect(Config, OurVer, ?DFLAG_MANDATORY_25_DIGEST), - normal_accept(Config, OurVer, AssumedVer, ?DFLAG_MANDATORY_25_DIGEST), - normal_accept(Config, OurVer, OurVer, ?DFLAG_MANDATORY_25_DIGEST), + normal_connect(Config, ?DFLAG_MANDATORY_25_DIGEST), + normal_accept(Config, ?DFLAG_MANDATORY_25_DIGEST), ok. @@ -518,40 +483,25 @@ recv_status(Socket) -> exit(Bad) end. -send_challenge(Socket, Node, Challenge, OurVer) -> +send_challenge(Socket, Node, Challenge) -> DefaultFlags = ?COMPULSORY_DFLAGS bor ?DFLAG_MANDATORY_25_DIGEST, - send_challenge(Socket, Node, Challenge, OurVer, DefaultFlags). - -send_challenge(Socket, Node, Challenge, OurVer, Flags) -> - if OurVer =:= 5 -> - ?to_port(Socket, [$n, ?int16(OurVer), ?int32(Flags), - ?int32(Challenge), atom_to_list(Node)]); - OurVer >= 6 -> - NodeName = atom_to_binary(Node, latin1), - NameLen = byte_size(NodeName), - Creation = erts_internal:get_creation(), - ?to_port(Socket, [$N, - <<(Flags bor ?DFLAG_HANDSHAKE_23):64, - Challenge:32, - Creation:32, - NameLen:16>>, - NodeName]) - end. - -recv_challenge(Socket, OurVer) -> + send_challenge(Socket, Node, Challenge, DefaultFlags). + +send_challenge(Socket, Node, Challenge, Flags) -> + NodeName = atom_to_binary(Node, latin1), + NameLen = byte_size(NodeName), + Creation = erts_internal:get_creation(), + ?to_port(Socket, [$N, + << Flags:64, + Challenge:32, + Creation:32, + NameLen:16>>, + NodeName]). + +recv_challenge(Socket) -> case gen_tcp:recv(Socket, 0) of - {ok,[$n,V1,V0,Fl1,Fl2,Fl3,Fl4,CA3,CA2,CA1,CA0 | Ns]} -> - 5 = OurVer, - Flags = ?u32(Fl1,Fl2,Fl3,Fl4), - Type = flags_to_type(Flags), - Node =list_to_atom(Ns), - OurVer = ?u16(V1,V0), % echoed back - Challenge = ?u32(CA3,CA2,CA1,CA0), - {Type,Node,Challenge}; - {ok,[$N, F7,F6,F5,F4,F3,F2,F1,F0, CA3,CA2,CA1,CA0, _Cr3,_Cr2,_Cr1,_Cr0, NL1,NL0 | Rest]} -> - true = (OurVer >= 6), <<Flags:64>> = <<F7,F6,F5,F4,F3,F2,F1,F0>>, verify_flags(Flags), Type = flags_to_type(Flags), @@ -608,34 +558,18 @@ send_challenge_ack(Socket, Digest) -> % ?shutdown(bad_challenge_ack) % end. -send_name(Socket, MyNode, OurVer, AssumedVer, Flags0) -> - Flags = Flags0 bor case OurVer of - 5 -> 0; - 6 -> ?DFLAG_HANDSHAKE_23 - end, +send_name(Socket, MyNode, Flags) -> NodeName = atom_to_binary(MyNode, latin1), - if AssumedVer =:= 5 -> - ?to_port(Socket, [$n,?int16(OurVer),?int32(Flags),NodeName]); - AssumedVer >= 6 -> - Creation = erts_internal:get_creation(), - ?to_port(Socket, [$N, - <<Flags:64, - Creation:32, - (byte_size(NodeName)):16>>, - NodeName]) - end. - -recv_name(Socket, OurEpmdVer) -> + Creation = erts_internal:get_creation(), + ?to_port(Socket, [$N, + <<Flags:64, + Creation:32, + (byte_size(NodeName)):16>>, + NodeName]). + +recv_name(Socket) -> case gen_tcp:recv(Socket, 0) of - {ok,[$n, V1,V0, F3,F2,F1,F0 | OtherNode]} -> - 5 = OurEpmdVer, - 5 = ?u16(V1,V0), - Flags = ?u32(F3, F2, F1, F0), - verify_flags(Flags), - Type = flags_to_type(Flags), - {Type, list_to_atom(OtherNode)}; {ok,[$N, F7,F6,F5,F4,F3,F2,F1,F0, _Cr3,_Cr2,_Cr1,_Cr0, NL1, NL0 | Rest]} -> - true = (OurEpmdVer >= 6), {OtherNode, _Residue} = lists:split(?u16(NL1,NL0), Rest), <<Flags:64>> = <<F7,F6,F5,F4,F3,F2,F1,F0>>, verify_flags(Flags), @@ -645,17 +579,6 @@ recv_name(Socket, OurEpmdVer) -> ?shutdown({no_node,Res}) end. -recv_complement(Socket, OurVer, 5) when OurVer > 5 -> - case gen_tcp:recv(Socket, 0) of - {ok,[$c, _F7,_F6,_F5,_F4, _Cr3,_Cr2,_Cr1,_Cr0]} -> - ok; - Res -> - ?shutdown({no_node,Res}) - end; -recv_complement(_, _OurVer, _OurEpmdVer) -> - ok. - - %% %% tell_name is for old handshake %% @@ -667,7 +590,7 @@ recv_complement(_, _OurVer, _OurEpmdVer) -> %% %% The communication with EPMD follows %% -do_register_node(NodeName, TcpPort, VLow, VHigh) -> +do_register_node(NodeName, TcpPort) -> case gen_tcp:connect({127,0,0,1}, get_epmd_port(), []) of {ok, Socket} -> {N0,_} = split(NodeName), @@ -679,8 +602,8 @@ do_register_node(NodeName, TcpPort, VLow, VHigh) -> ?int16(TcpPort), $M, 0, - ?int16(VHigh), - ?int16(VLow), + ?int16(?EI_DIST_HIGH), + ?int16(?EI_DIST_LOW), ?int16(length(Name)), Name, ?int16(Elen), @@ -716,9 +639,9 @@ wait_for_reg_reply(Socket, SoFar) -> end. -epmd_register(NodeName, ListenSocket, OurVer) -> +epmd_register(NodeName, ListenSocket) -> {ok,{_,TcpPort}} = inet:sockname(ListenSocket), - case do_register_node(NodeName, TcpPort, ?EI_DIST_LOW, OurVer) of + case do_register_node(NodeName, TcpPort) of {alive, Socket, _Creation} -> Socket; Other -> diff --git a/lib/kernel/include/dist.hrl b/lib/kernel/include/dist.hrl index 3c2d6323e3..2cd2dd1fb4 100644 --- a/lib/kernel/include/dist.hrl +++ b/lib/kernel/include/dist.hrl @@ -75,11 +75,9 @@ %% Also update dflag2str() in ../src/dist_util.erl %% when adding flags... +-define(ERL_DIST_VER_6, 6). % OTP-23 at least --define(ERL_DIST_VER_5, 5). % OTP-22 or (much) older --define(ERL_DIST_VER_6, 6). % OTP-23 (or maybe newer?) - --define(ERL_DIST_VER_LOW, ?ERL_DIST_VER_5). +-define(ERL_DIST_VER_LOW, ?ERL_DIST_VER_6). -define(ERL_DIST_VER_HIGH, ?ERL_DIST_VER_6). %%% |