diff options
| -rw-r--r-- | erts/emulator/beam/bif.c | 4 | ||||
| -rw-r--r-- | erts/emulator/beam/big.c | 18 | ||||
| -rw-r--r-- | erts/emulator/beam/big.h | 2 | ||||
| -rw-r--r-- | erts/emulator/beam/dist.c | 8 | ||||
| -rw-r--r-- | erts/emulator/beam/erl_bif_info.c | 5 | ||||
| -rw-r--r-- | erts/emulator/beam/erl_node_tables.c | 4 | ||||
| -rw-r--r-- | erts/emulator/beam/erl_node_tables.h | 2 | ||||
| -rw-r--r-- | erts/epmd/epmd.mk | 2 | ||||
| -rw-r--r-- | erts/epmd/src/epmd.h | 1 | ||||
| -rw-r--r-- | erts/epmd/src/epmd_int.h | 10 | ||||
| -rw-r--r-- | erts/epmd/src/epmd_srv.c | 87 | ||||
| -rw-r--r-- | erts/test/erl_print_SUITE.erl | 41 | ||||
| -rw-r--r-- | lib/kernel/src/erl_epmd.erl | 11 | ||||
| -rw-r--r-- | lib/kernel/test/erl_distribution_wb_SUITE.erl | 58 | 
14 files changed, 149 insertions, 104 deletions
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index eb9b585195..acb7d472fd 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -1915,7 +1915,7 @@ do_send(Process *p, Eterm to, Eterm msg, Eterm return_term, Eterm *refp,  	    erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf();  	    erts_dsprintf(dsbufp,  			  "Discarding message %T from %T to %T in an old " -			  "incarnation (%d) of this node (%d)\n", +			  "incarnation (%u) of this node (%u)\n",  			  msg,  			  p->common.id,  			  to, @@ -1959,7 +1959,7 @@ do_send(Process *p, Eterm to, Eterm msg, Eterm return_term, Eterm *refp,  	erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf();  	erts_dsprintf(dsbufp,  		      "Discarding message %T from %T to %T in an old " -		      "incarnation (%d) of this node (%d)\n", +		      "incarnation (%u) of this node (%u)\n",  		      msg,  		      p->common.id,  		      to, diff --git a/erts/emulator/beam/big.c b/erts/emulator/beam/big.c index 522f50287a..7666f23a4f 100644 --- a/erts/emulator/beam/big.c +++ b/erts/emulator/beam/big.c @@ -2176,6 +2176,24 @@ term_to_Uint64(Eterm term, Uint64 *up)  #endif  } +int +term_to_Uint32(Eterm term, Uint32 *up) +{ +#if ERTS_SIZEOF_ETERM == 4 +    return term_to_Uint(term,up); +#else +    if (is_small(term)) { +	Sint i = signed_val(term); +	if (i >= 0) { +            *up = (Uint32) i; +            return 1; +        } +    } +    *up = BADARG; +    return 0; +#endif +} +  int term_to_Sint(Eterm term, Sint *sp)  { diff --git a/erts/emulator/beam/big.h b/erts/emulator/beam/big.h index ad19cce395..3fed076419 100644 --- a/erts/emulator/beam/big.h +++ b/erts/emulator/beam/big.h @@ -168,6 +168,8 @@ Eterm erts_uint64_array_to_big(Uint **, int, int, Uint64 *);  int term_to_Uint64(Eterm, Uint64*);  int term_to_Sint64(Eterm, Sint64*);  #endif +int term_to_Uint32(Eterm, Uint32*); +  Uint32 big_to_uint32(Eterm b);  int term_equals_2pow32(Eterm); diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c index b50c8273b1..45ada4e38a 100644 --- a/erts/emulator/beam/dist.c +++ b/erts/emulator/beam/dist.c @@ -3658,12 +3658,10 @@ int distribution_info(fmtfn_t to, void *arg)	/* Called by break handler */  BIF_RETTYPE setnode_2(BIF_ALIST_2)  {      Process *net_kernel; -    Uint creation; +    Uint32 creation;      /* valid creation ? */ -    if(!term_to_Uint(BIF_ARG_2, &creation)) -	goto error; -    if(creation > 3) +    if(!term_to_Uint32(BIF_ARG_2, &creation))  	goto error;      /* valid node name ? */ @@ -3707,7 +3705,7 @@ BIF_RETTYPE setnode_2(BIF_ALIST_2)      erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);      erts_thr_progress_block();      inc_no_nodes(); -    erts_set_this_node(BIF_ARG_1, (Uint32) creation); +    erts_set_this_node(BIF_ARG_1, creation);      erts_is_alive = 1;      send_nodes_mon_msgs(NULL, am_nodeup, BIF_ARG_1, am_visible, NIL);      erts_thr_progress_unblock(); diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c index 8c51bdb630..137f87a75c 100644 --- a/erts/emulator/beam/erl_bif_info.c +++ b/erts/emulator/beam/erl_bif_info.c @@ -2797,7 +2797,10 @@ BIF_RETTYPE system_info_1(BIF_ALIST_1)      } else if (BIF_ARG_1 == am_threads) {  	return am_true;      } else if (BIF_ARG_1 == am_creation) { -	return make_small(erts_this_node->creation); +        Uint hsz = 0; +        erts_bld_uint(NULL, &hsz, erts_this_node->creation); +        hp = hsz ? HAlloc(BIF_P, hsz) : NULL; +        BIF_RET(erts_bld_uint(&hp, NULL, erts_this_node->creation));      } else if (BIF_ARG_1 == am_break_ignored) {        extern int ignore_break;        if (ignore_break)  diff --git a/erts/emulator/beam/erl_node_tables.c b/erts/emulator/beam/erl_node_tables.c index afafaf48dc..09edcbbb7f 100644 --- a/erts/emulator/beam/erl_node_tables.c +++ b/erts/emulator/beam/erl_node_tables.c @@ -975,7 +975,7 @@ static void print_node(void *venp, void *vpndp)  	if(pndp->sysname == NIL) {  	    erts_print(pndp->to, pndp->to_arg, "Name: %T ", enp->sysname);  	} -	erts_print(pndp->to, pndp->to_arg, " %d", enp->creation); +	erts_print(pndp->to, pndp->to_arg, " %u", enp->creation);  #ifdef DEBUG  	erts_print(pndp->to, pndp->to_arg, " (refc=%ld)",  		   erts_refc_read(&enp->refc, 0)); @@ -1018,7 +1018,7 @@ void erts_print_node_info(fmtfn_t to,  /* ----------------------------------------------------------------------- */  void -erts_set_this_node(Eterm sysname, Uint creation) +erts_set_this_node(Eterm sysname, Uint32 creation)  {      ERTS_LC_ASSERT(erts_thr_progress_is_blocking());      ASSERT(2 <= de_refc_read(erts_this_dist_entry, 2)); diff --git a/erts/emulator/beam/erl_node_tables.h b/erts/emulator/beam/erl_node_tables.h index d5daf0c2df..eb0e13ccbe 100644 --- a/erts/emulator/beam/erl_node_tables.h +++ b/erts/emulator/beam/erl_node_tables.h @@ -257,7 +257,7 @@ void erts_set_dist_entry_pending(DistEntry *);  void erts_set_dist_entry_connected(DistEntry *, Eterm, Uint);  ErlNode *erts_find_or_insert_node(Eterm, Uint32, Eterm);  void erts_schedule_delete_node(ErlNode *); -void erts_set_this_node(Eterm, Uint); +void erts_set_this_node(Eterm, Uint32);  Uint erts_node_table_size(void);  void erts_init_node_tables(int);  void erts_node_table_info(fmtfn_t, void *); diff --git a/erts/epmd/epmd.mk b/erts/epmd/epmd.mk index b1fd04dc04..f6889a7ff1 100644 --- a/erts/epmd/epmd.mk +++ b/erts/epmd/epmd.mk @@ -67,5 +67,5 @@ EPMD_NODE_TYPE=110  # Distribution format 5 contains the new md5 based handshake.  EPMD_DIST_LOW=5 -EPMD_DIST_HIGH=5 +EPMD_DIST_HIGH=6 diff --git a/erts/epmd/src/epmd.h b/erts/epmd/src/epmd.h index cffcd4ae7a..7332294d3d 100644 --- a/erts/epmd/src/epmd.h +++ b/erts/epmd/src/epmd.h @@ -26,6 +26,7 @@  #define EPMD_ALIVE2_REQ 'x'  #define EPMD_PORT2_REQ 'z'  #define EPMD_ALIVE2_RESP 'y' +#define EPMD_ALIVE2_X_RESP 'v'  #define EPMD_PORT2_RESP 'w'  #define EPMD_NAMES_REQ 'n' diff --git a/erts/epmd/src/epmd_int.h b/erts/epmd/src/epmd_int.h index ed9bbdb8cd..a5156a142e 100644 --- a/erts/epmd/src/epmd_int.h +++ b/erts/epmd/src/epmd_int.h @@ -277,6 +277,12 @@ static const struct in6_addr in6addr_loopback =  #define put_int16(i, s) {((unsigned char*)(s))[0] = ((i) >> 8) & 0xff; \                          ((unsigned char*)(s))[1] = (i)         & 0xff;} +#define put_int32(i, s) do {((char*)(s))[0] = (char)((i) >> 24) & 0xff;   \ +                            ((char*)(s))[1] = (char)((i) >> 16) & 0xff;   \ +                            ((char*)(s))[2] = (char)((i) >> 8)  & 0xff;   \ +                            ((char*)(s))[3] = (char)(i)         & 0xff;} \ +                        while (0) +  #if defined(__GNUC__)  #  define EPMD_INLINE __inline__  #elif defined(__WIN32__) @@ -307,10 +313,10 @@ struct enode {    int fd;			/* The socket in use */    unsigned short port;		/* Port number of Erlang node */    char symname[MAXSYMLEN+1];	/* Name of the Erlang node */ -  short creation;		/* Started as a random number 1..3 */ +  unsigned int cr_counter;	/* Used to generate 'creation' numbers */    char nodetype;                /* 77 = normal erlang node 72 = hidden (c-node */    char protocol;                /* 0 = tcp/ipv4 */ -  unsigned short highvsn;       /* 0 = OTP-R3 erts-4.6.x, 1 = OTP-R4 erts-4.7.x*/ +  unsigned short highvsn;       /* 5: creation=1..3, 6: creation=1..(2^32-1)*/    unsigned short lowvsn;    int extralen;    char extra[MAXSYMLEN+1]; diff --git a/erts/epmd/src/epmd_srv.c b/erts/epmd/src/epmd_srv.c index 1f2326d241..633ec71e5f 100644 --- a/erts/epmd/src/epmd_srv.c +++ b/erts/epmd/src/epmd_srv.c @@ -665,6 +665,21 @@ static int do_accept(EpmdVars *g,int listensock)      return conn_open(g,msgsock);  } +static void bump_creation(Node* node) +{ +    if (++node->cr_counter == 0) +        node->cr_counter = 1; +} +static unsigned int get_creation(Node* node) +{ +    if (node->highvsn >= 6) { +        return node->cr_counter;  /* 1..(2^32-1)*/ +    } +    else { +        return (node->cr_counter - 1) % 3 + 1;   /* 1..3 */ +    } +} +  /* buf is actually one byte larger than bsize,     giving place for null termination */  static void do_request(g, fd, s, buf, bsize) @@ -706,8 +721,10 @@ static void do_request(g, fd, s, buf, bsize)  	unsigned char protocol;  	unsigned short highvsn;  	unsigned short lowvsn; +        unsigned int creation;  	int namelen;  	int extralen; +        int replylen;  	char *name;   	char *extra;  	eport = get_int16(&buf[1]); @@ -737,15 +754,20 @@ static void do_request(g, fd, s, buf, bsize)  	extra = &buf[11+namelen+2];  	extra[extralen]='\000'; -	wbuf[0] = EPMD_ALIVE2_RESP; -	if ((node = node_reg2(g, namelen, name, fd, eport, nodetype, protocol, -			      highvsn, lowvsn, extralen, extra)) == NULL) { -	    wbuf[1] = 1; /* error */ -	    put_int16(99, wbuf+2); -	} else { -	    wbuf[1] = 0; /* ok */ -	    put_int16(node->creation, wbuf+2); -	} +        node = node_reg2(g, namelen, name, fd, eport, nodetype, protocol, +                         highvsn, lowvsn, extralen, extra); +        creation = node ? get_creation(node) :  99; +        wbuf[1] = node ? 0 : 1; /* ok | error */ +        if (highvsn >= 6) { +            wbuf[0] = EPMD_ALIVE2_X_RESP; +            put_int32(creation, wbuf+2); +            replylen = 6; +        } +        else { +            wbuf[0] = EPMD_ALIVE2_RESP; +            put_int16(creation, wbuf+2); +            replylen = 4; +        }  	if (!reply(g, fd, wbuf, replylen))  	  { @@ -1200,8 +1222,8 @@ static int node_unreg(EpmdVars *g,char *name)    for (; node; prev = &node->next, node = node->next)      if (is_same_str(node->symname, name))        { -	dbg_tty_printf(g,1,"unregistering '%s:%d', port %d", -		       node->symname, node->creation, node->port); +	dbg_tty_printf(g,1,"unregistering '%s:%u', port %d", +		       node->symname, get_creation(node), node->port);  	*prev = node->next;	/* Link out from "reg" list */ @@ -1235,8 +1257,8 @@ static int node_unreg_sock(EpmdVars *g,int fd)    for (; node; prev = &node->next, node = node->next)      if (node->fd == fd)        { -	dbg_tty_printf(g,1,"unregistering '%s:%d', port %d", -		       node->symname, node->creation, node->port); +	dbg_tty_printf(g,1,"unregistering '%s:%u', port %d", +		       node->symname, get_creation(node), node->port);  	*prev = node->next;	/* Link out from "reg" list */ @@ -1264,19 +1286,8 @@ static int node_unreg_sock(EpmdVars *g,int fd)  }  /* - *  Finding a node slot and a (name,creation) name is a bit tricky. - *  We try in order - * - *  1. If the name was used before and we can reuse that slot but use - *     a new "creation" digit in the range 1..3. - * - *  2. We try to find a new unused slot. - * - *  3. We try to use an used slot this isn't used any longer. - *     FIXME: The criteria for *what* slot to steal should be improved. - *     Perhaps use the oldest or something. + * Register a new node   */ -  static Node *node_reg2(EpmdVars *g,  		       int namelen,  		       char* name, @@ -1346,7 +1357,7 @@ static Node *node_reg2(EpmdVars *g,        }    /* Try to find the name in the used queue so that we -     can change "creation" number 1..3 */ +     can change "creation" number */    prev = NULL; @@ -1375,9 +1386,8 @@ static Node *node_reg2(EpmdVars *g,  	g->nodes.unreg_count--; -	/* When reusing we change the "creation" number 1..3 */ - -	node->creation = node->creation % 3 + 1; +	/* When reusing we change the "creation" number */ +	bump_creation(node);  	break;        } @@ -1404,7 +1414,8 @@ static Node *node_reg2(EpmdVars *g,  	      exit(1);  	    } -	  node->creation = (current_time(g) % 3) + 1; /* "random" 1-3 */ +	  node->cr_counter = current_time(g); /* "random" */ +          bump_creation(node);  	}      } @@ -1423,11 +1434,11 @@ static Node *node_reg2(EpmdVars *g,    select_fd_set(g, fd);    if (highvsn == 0) { -    dbg_tty_printf(g,1,"registering '%s:%d', port %d", -		   node->symname, node->creation, node->port); +    dbg_tty_printf(g,1,"registering '%s:%u', port %d", +		   node->symname, get_creation(node), node->port);    } else { -    dbg_tty_printf(g,1,"registering '%s:%d', port %d", -		   node->symname, node->creation, node->port); +    dbg_tty_printf(g,1,"registering '%s:%u', port %d", +		   node->symname, get_creation(node), node->port);      dbg_tty_printf(g,1,"type %d proto %d highvsn %d lowvsn %d",  		   nodetype, protocol, highvsn, lowvsn);    }       @@ -1561,8 +1572,8 @@ static void print_names(EpmdVars *g)    for (node = g->nodes.reg; node; node = node->next)      { -      fprintf(stderr,"*****     active name     \"%s#%d\" at port %d, fd = %d\r\n", -	      node->symname, node->creation, node->port, node->fd); +      fprintf(stderr,"*****     active name     \"%s#%u\" at port %d, fd = %d\r\n", +	      node->symname, get_creation(node), node->port, node->fd);        count ++;      } @@ -1572,8 +1583,8 @@ static void print_names(EpmdVars *g)    for (node = g->nodes.unreg; node; node = node->next)      { -      fprintf(stderr,"*****     old/unused name \"%s#%d\"\r\n", -	      node->symname, node->creation); +      fprintf(stderr,"*****     old/unused name \"%s#%u\"\r\n", +	      node->symname, get_creation(node));        count ++;      } diff --git a/erts/test/erl_print_SUITE.erl b/erts/test/erl_print_SUITE.erl index 463d890688..0a5987df88 100644 --- a/erts/test/erl_print_SUITE.erl +++ b/erts/test/erl_print_SUITE.erl @@ -324,6 +324,9 @@ run_case(Config, TestArgs, Fun) ->  -define(PORT_EXT,            102).  -define(PID_EXT,             103).  -define(NEW_REFERENCE_EXT,   114). +-define(NEW_PID_EXT,         $X). +-define(NEW_PORT_EXT,        $Y). +-define(NEWER_REFERENCE_EXT, $Z).  uint32_be(Uint) when is_integer(Uint), 0 =< Uint, Uint < 1 bsl 32 ->      [(Uint bsr 24) band 16#ff, @@ -351,13 +354,13 @@ mk_pid({NodeName, Creation}, Number, Serial) when is_atom(NodeName) ->      mk_pid({atom_to_list(NodeName), Creation}, Number, Serial);  mk_pid({NodeName, Creation}, Number, Serial) ->      case catch binary_to_term(list_to_binary([?VERSION_MAGIC, -                                              ?PID_EXT, +                                              ?NEW_PID_EXT,                                                ?ATOM_EXT,                                                uint16_be(length(NodeName)),                                                NodeName,                                                uint32_be(Number),                                                uint32_be(Serial), -                                              uint8(Creation)])) of +                                              uint32_be(Creation)])) of          Pid when is_pid(Pid) ->              Pid;          {'EXIT', {badarg, _}} -> @@ -370,12 +373,12 @@ mk_port({NodeName, Creation}, Number) when is_atom(NodeName) ->      mk_port({atom_to_list(NodeName), Creation}, Number);  mk_port({NodeName, Creation}, Number) ->      case catch binary_to_term(list_to_binary([?VERSION_MAGIC, -                                              ?PORT_EXT, +                                              ?NEW_PORT_EXT,                                                ?ATOM_EXT,                                                uint16_be(length(NodeName)),                                                NodeName,                                                uint32_be(Number), -                                              uint8(Creation)])) of +                                              uint32_be(Creation)])) of          Port when is_port(Port) ->              Port;          {'EXIT', {badarg, _}} -> @@ -388,33 +391,16 @@ mk_ref({NodeName, Creation}, Numbers) when is_atom(NodeName),                                             is_integer(Creation),                                             is_list(Numbers) ->      mk_ref({atom_to_list(NodeName), Creation}, Numbers); -mk_ref({NodeName, Creation}, [Number]) when is_list(NodeName), -                                            is_integer(Creation), -                                            is_integer(Number) -> -    case catch binary_to_term(list_to_binary([?VERSION_MAGIC, -                                              ?REFERENCE_EXT, -                                              ?ATOM_EXT, -                                              uint16_be(length(NodeName)), -                                              NodeName, -                                              uint32_be(Number), -                                              uint8(Creation)])) of -        Ref when is_reference(Ref) -> -            Ref; -        {'EXIT', {badarg, _}} -> -            exit({badarg, mk_ref, [{NodeName, Creation}, [Number]]}); -        Other -> -            exit({unexpected_binary_to_term_result, Other}) -    end;  mk_ref({NodeName, Creation}, Numbers) when is_list(NodeName),                                             is_integer(Creation),                                             is_list(Numbers) ->      case catch binary_to_term(list_to_binary([?VERSION_MAGIC, -                                              ?NEW_REFERENCE_EXT, +                                              ?NEWER_REFERENCE_EXT,                                                uint16_be(length(Numbers)),                                                ?ATOM_EXT,                                                uint16_be(length(NodeName)),                                                NodeName, -                                              uint8(Creation), +                                              uint32_be(Creation),                                                lists:map(fun (N) ->                                                                  uint32_be(N)                                                          end, @@ -429,11 +415,10 @@ mk_ref({NodeName, Creation}, Numbers) when is_list(NodeName),  my_cre() -> erlang:system_info(creation). -oth_cre(0) -> 1; -oth_cre(1) -> 2; -oth_cre(2) -> 3; -oth_cre(3) -> 1; -oth_cre(N) -> exit({invalid_creation, N}). +oth_cre(N) when N >= 0, N < (1 bsl 32) -> +    (N rem ((1 bsl 32) - 1)) + 1; +oth_cre(N) -> +    exit({invalid_creation, N}).  str_1_bsl_10000() ->      "19950631168807583848837421626835850838234968318861924548520089498529438830221946631919961684036194597899331129423209124271556491349413781117593785932096323957855730046793794526765246551266059895520550086918193311542508608460618104685509074866089624888090489894838009253941633257850621568309473902556912388065225096643874441046759871626985453222868538161694315775629640762836880760732228535091641476183956381458969463899410840960536267821064621427333394036525565649530603142680234969400335934316651459297773279665775606172582031407994198179607378245683762280037302885487251900834464581454650557929601414833921615734588139257095379769119277800826957735674444123062018757836325502728323789270710373802866393031428133241401624195671690574061419654342324638801248856147305207431992259611796250130992860241708340807605932320161268492288496255841312844061536738951487114256315111089745514203313820202931640957596464756010405845841566072044962867016515061920631004186422275908670900574606417856951911456055068251250406007519842261898059237118054444788072906395242548339221982707404473162376760846613033778706039803413197133493654622700563169937455508241780972810983291314403571877524768509857276937926433221599399876886660808368837838027643282775172273657572744784112294389733810861607423253291974813120197604178281965697475898164531258434135959862784130128185406283476649088690521047580882615823961985770122407044330583075869039319604603404973156583208672105913300903752823415539745394397715257455290510212310947321610753474825740775273986348298498340756937955646638621874569499279016572103701364433135817214311791398222983845847334440270964182851005072927748364550578634501100852987812389473928699540834346158807043959118985815145779177143619698728131459483783202081474982171858011389071228250905826817436220577475921417653715687725614904582904992461028630081535583308130101987675856234343538955409175623400844887526162643568648833519463720377293240094456246923254350400678027273837755376406726898636241037491410966718557050759098100246789880178271925953381282421954028302759408448955014676668389697996886241636313376393903373455801407636741877711055384225739499110186468219696581651485130494222369947714763069155468217682876200362777257723781365331611196811280792669481887201298643660768551639860534602297871557517947385246369446923087894265948217008051120322365496288169035739121368338393591756418733850510970271613915439590991598154654417336311656936031122249937969999226781732358023111862644575299135758175008199839236284615249881088960232244362173771618086357015468484058622329792853875623486556440536962622018963571028812361567512543338303270029097668650568557157505516727518899194129711337690149916181315171544007728650573189557450920330185304847113818315407324053319038462084036421763703911550639789000742853672196280903477974533320468368795868580237952218629120080742819551317948157624448298518461509704888027274721574688131594750409732115080498190455803416826949787141316063210686391511681774304792596709376". diff --git a/lib/kernel/src/erl_epmd.erl b/lib/kernel/src/erl_epmd.erl index 7a14e2635c..f31a1722ce 100644 --- a/lib/kernel/src/erl_epmd.erl +++ b/lib/kernel/src/erl_epmd.erl @@ -33,10 +33,10 @@  -define(erlang_daemon_port, 4369).  -endif.  -ifndef(epmd_dist_high). --define(epmd_dist_high, 4370). +-define(epmd_dist_high, 6).  -endif.  -ifndef(epmd_dist_low). --define(epmd_dist_low, 4370). +-define(epmd_dist_low, 5).  -endif.  %% External exports @@ -342,6 +342,13 @@ wait_for_reg_reply(Socket, SoFar) ->      receive  	{tcp, Socket, Data0} ->  	    case SoFar ++ Data0 of +		[$v, Result, A, B, C, D] -> +		    case Result of +			0 -> +			    {alive, Socket, ?u32(A, B, C, D)}; +			_ -> +			    {error, duplicate_name} +		    end;  		[$y, Result, A, B] ->  		    case Result of  			0 -> diff --git a/lib/kernel/test/erl_distribution_wb_SUITE.erl b/lib/kernel/test/erl_distribution_wb_SUITE.erl index 8256444bdc..f3db6705a2 100644 --- a/lib/kernel/test/erl_distribution_wb_SUITE.erl +++ b/lib/kernel/test/erl_distribution_wb_SUITE.erl @@ -47,6 +47,9 @@  	        R          end). +-define(EPMD_DIST_HIGH, 6). +-define(EPMD_DIST_LOW, 5). +  -define(DFLAG_PUBLISHED,1).  -define(DFLAG_ATOM_CACHE,2).  -define(DFLAG_EXTENDED_REFERENCES,4). @@ -57,15 +60,18 @@  -define(DFLAG_NEW_FUN_TAGS,16#80).  -define(DFLAG_EXTENDED_PIDS_PORTS,16#100).  -define(DFLAG_UTF8_ATOMS, 16#10000). +-define(DFLAG_BIG_CREATION, 16#40000).  %% From R9 and forward extended references is compulsory  %% From R10 and forward extended pids and ports are compulsory  %% From R20 and forward UTF8 atoms are compulsory  %% From R21 and forward NEW_FUN_TAGS is compulsory (no more tuple fallback {fun, ...}) +%% From R22 and forward BIG_CREATION is compulsory  -define(COMPULSORY_DFLAGS, (?DFLAG_EXTENDED_REFERENCES bor                              ?DFLAG_EXTENDED_PIDS_PORTS bor                              ?DFLAG_UTF8_ATOMS bor -                            ?DFLAG_NEW_FUN_TAGS)). +                            ?DFLAG_NEW_FUN_TAGS bor +                            ?DFLAG_BIG_CREATION)).  -define(PASS_THROUGH, $p). @@ -208,9 +214,9 @@ pending_up_md5(Node,OurName,Cookie) ->      {ok, SocketA} = gen_tcp:connect(atom_to_list(NB),PortNo,  				    [{active,false},  				     {packet,2}]), -    send_name(SocketA,OurName,5), +    send_name(SocketA,OurName, ?EPMD_DIST_HIGH),      ok = recv_status(SocketA), -    {hidden,Node,5,HisChallengeA} = recv_challenge(SocketA), % See 1) +    {hidden,Node,?EPMD_DIST_HIGH,HisChallengeA} = recv_challenge(SocketA), % See 1)      OurChallengeA = gen_challenge(),      OurDigestA = gen_digest(HisChallengeA, Cookie),      send_challenge_reply(SocketA, OurChallengeA, OurDigestA), @@ -224,11 +230,11 @@ pending_up_md5(Node,OurName,Cookie) ->      {ok, SocketB} = gen_tcp:connect(atom_to_list(NB),PortNo,  				    [{active,false},  				     {packet,2}]), -    send_name(SocketB,OurName,5), +    send_name(SocketB,OurName, ?EPMD_DIST_HIGH),      alive = recv_status(SocketB),      send_status(SocketB, true),      gen_tcp:close(SocketA), -    {hidden,Node,5,HisChallengeB} = recv_challenge(SocketB), % See 1) +    {hidden,Node,?EPMD_DIST_HIGH,HisChallengeB} = recv_challenge(SocketB), % See 1)      OurChallengeB = gen_challenge(),      OurDigestB = gen_digest(HisChallengeB, Cookie),      send_challenge_reply(SocketB, OurChallengeB, OurDigestB), @@ -254,7 +260,7 @@ simultaneous_md5(Node, OurName, Cookie) when OurName < Node ->  		  Else ->  		      exit(Else)  	      end, -    EpmdSocket = register(OurName, LSocket, 1, 5), +    EpmdSocket = register_node(OurName, LSocket, ?EPMD_DIST_LOW, ?EPMD_DIST_HIGH),      {NA, NB} = split(Node),      rpc:cast(Node, net_adm, ping, [OurName]),      receive after 1000 -> ok end, @@ -262,7 +268,7 @@ simultaneous_md5(Node, OurName, Cookie) when OurName < Node ->      {ok, SocketA} = gen_tcp:connect(atom_to_list(NB),PortNo,  				    [{active,false},  				     {packet,2}]), -    send_name(SocketA,OurName,5), +    send_name(SocketA,OurName, ?EPMD_DIST_HIGH),      %% We are still not marked up on the other side, as our first message       %% is not sent.      SocketB = case gen_tcp:accept(LSocket) of @@ -275,11 +281,11 @@ simultaneous_md5(Node, OurName, Cookie) when OurName < Node ->      %% Now we are expected to close A      gen_tcp:close(SocketA),      %% But still Socket B will continue -    {normal,Node,5} = recv_name(SocketB),  % See 1) +    {normal,Node,?EPMD_DIST_HIGH} = recv_name(SocketB),  % See 1)      send_status(SocketB, ok_simultaneous),      MyChallengeB = gen_challenge(), -    send_challenge(SocketB, OurName, MyChallengeB,5), -    HisChallengeB = recv_challenge_reply(SocketB, MyChallengeB, Cookie), +    send_challenge(SocketB, OurName, MyChallengeB, ?EPMD_DIST_HIGH), +    {ok,HisChallengeB} = recv_challenge_reply(SocketB, MyChallengeB, Cookie),      DigestB = gen_digest(HisChallengeB,Cookie),      send_challenge_ack(SocketB, DigestB),      inet:setopts(SocketB, [{active, false}, @@ -301,7 +307,8 @@ simultaneous_md5(Node, OurName, Cookie) when OurName > Node ->  		  Else ->  		      exit(Else)  	      end, -    EpmdSocket = register(OurName, LSocket, 1, 5), +    EpmdSocket = register_node(OurName, LSocket, +                               ?EPMD_DIST_LOW, ?EPMD_DIST_HIGH),      {NA, NB} = split(Node),      rpc:cast(Node, net_adm, ping, [OurName]),      receive after 1000 -> ok end, @@ -315,16 +322,16 @@ simultaneous_md5(Node, OurName, Cookie) when OurName > Node ->  		  Else2 ->  		      exit(Else2)  	      end, -    send_name(SocketA,OurName,5), +    send_name(SocketA,OurName, ?EPMD_DIST_HIGH),      ok_simultaneous = recv_status(SocketA),      %% Socket B should die during this      case catch begin -		   {normal,Node,5} = recv_name(SocketB),  % See 1) +		   {normal,Node,?EPMD_DIST_HIGH} = recv_name(SocketB),  % See 1)  		   send_status(SocketB, ok_simultaneous),  		   MyChallengeB = gen_challenge(),  		   send_challenge(SocketB, OurName, MyChallengeB,  				  5), -		   HisChallengeB = recv_challenge_reply( +		   {ok,HisChallengeB} = recv_challenge_reply(  				     SocketB,  				     MyChallengeB,  				     Cookie), @@ -346,7 +353,7 @@ simultaneous_md5(Node, OurName, Cookie) when OurName > Node ->      end,      gen_tcp:close(SocketB),      %% But still Socket A will continue -    {hidden,Node,5,HisChallengeA} = recv_challenge(SocketA), % See 1) +    {hidden,Node,?EPMD_DIST_HIGH,HisChallengeA} = recv_challenge(SocketA), % See 1)      OurChallengeA = gen_challenge(),      OurDigestA = gen_digest(HisChallengeA, Cookie),      send_challenge_reply(SocketA, OurChallengeA, OurDigestA), @@ -372,7 +379,7 @@ missing_compulsory_dflags(Config) when is_list(Config) ->  				    [{active,false},  				     {packet,2}]),      BadNode = list_to_atom(atom_to_list(Name2)++"@"++atom_to_list(NB)), -    send_name(SocketA,BadNode,5,0), +    send_name(SocketA,BadNode, ?EPMD_DIST_HIGH, 0),      not_allowed = recv_status(SocketA),      gen_tcp:close(SocketA),      stop_node(Node), @@ -516,16 +523,16 @@ send_challenge_reply(Socket, Challenge, Digest) ->  recv_challenge_reply(Socket, ChallengeA, Cookie) ->      case gen_tcp:recv(Socket, 0) of -	{ok,[$r,CB3,CB2,CB1,CB0 | SumB]} when length(SumB) == 16 -> +	{ok,[$r,CB3,CB2,CB1,CB0 | SumB]=Data} when length(SumB) == 16 ->  	    SumA = gen_digest(ChallengeA, Cookie),  	    ChallengeB = ?u32(CB3,CB2,CB1,CB0),  	    if SumB == SumA -> -		    ChallengeB; +		    {ok,ChallengeB};  	       true -> -		    ?shutdown(bad_challenge_reply) +		    {error,Data}  	    end; -	_ -> -	    ?shutdown(no_node) +	Err -> +            {error,Err}      end.  send_challenge_ack(Socket, Digest) -> @@ -620,6 +627,13 @@ wait_for_reg_reply(Socket, SoFar) ->      receive  	{tcp, Socket, Data0} ->  	    case SoFar ++ Data0 of +		[$v, Result, A, B, C, D] -> +		    case Result of +			0 -> +			    {alive, Socket, ?u32(A, B, C, D)}; +			_ -> +			    {error, duplicate_name} +		    end;  		[$y, Result, A, B] ->  		    case Result of  			0 -> @@ -640,7 +654,7 @@ wait_for_reg_reply(Socket, SoFar) ->      end. -register(NodeName, ListenSocket, VLow, VHigh) -> +register_node(NodeName, ListenSocket, VLow, VHigh) ->      {ok,{_,TcpPort}} = inet:sockname(ListenSocket),      case do_register_node(NodeName, TcpPort, VLow, VHigh) of  	{alive, Socket, _Creation} ->  | 
