|  | @@ -348,7 +348,7 @@ bool IncomingPacket::_doHELLO(const RuntimeEnvironment *RR,SharedPtr<Peer> &peer
 | 
	
		
			
				|  |  |  		RR->antiRec->logOutgoingZT(outp.data(),outp.size());
 | 
	
		
			
				|  |  |  		RR->node->putPacket(_localAddress,_remoteAddress,outp.data(),outp.size());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		peer->setRemoteVersion(protoVersion,vMajor,vMinor,vRevision);
 | 
	
		
			
				|  |  | +		peer->setRemoteVersion(protoVersion,vMajor,vMinor,vRevision); // important for this to go first so received() knows the version
 | 
	
		
			
				|  |  |  		peer->received(RR,_localAddress,_remoteAddress,hops(),pid,Packet::VERB_HELLO,0,Packet::VERB_NOP);
 | 
	
		
			
				|  |  |  	} catch ( ... ) {
 | 
	
		
			
				|  |  |  		TRACE("dropped HELLO from %s(%s): unexpected exception",source().toString().c_str(),_remoteAddress.toString().c_str());
 | 
	
	
		
			
				|  | @@ -426,6 +426,9 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &p
 | 
	
		
			
				|  |  |  				}
 | 
	
		
			
				|  |  |  			}	break;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +			//case Packet::VERB_ECHO: {
 | 
	
		
			
				|  |  | +			//}	break;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  			case Packet::VERB_MULTICAST_GATHER: {
 | 
	
		
			
				|  |  |  				const uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_NETWORK_ID);
 | 
	
		
			
				|  |  |  				const MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_MAC,6),6),at<uint32_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_ADI));
 | 
	
	
		
			
				|  | @@ -638,7 +641,9 @@ bool IncomingPacket::_doECHO(const RuntimeEnvironment *RR,const SharedPtr<Peer>
 | 
	
		
			
				|  |  |  		Packet outp(peer->address(),RR->identity.address(),Packet::VERB_OK);
 | 
	
		
			
				|  |  |  		outp.append((unsigned char)Packet::VERB_ECHO);
 | 
	
		
			
				|  |  |  		outp.append((uint64_t)pid);
 | 
	
		
			
				|  |  | -		outp.append(field(ZT_PACKET_IDX_PAYLOAD,size() - ZT_PACKET_IDX_PAYLOAD),size() - ZT_PACKET_IDX_PAYLOAD);
 | 
	
		
			
				|  |  | +		if (size() > ZT_PACKET_IDX_PAYLOAD)
 | 
	
		
			
				|  |  | +			outp.append(reinterpret_cast<const unsigned char *>(data()) + ZT_PACKET_IDX_PAYLOAD,size() - ZT_PACKET_IDX_PAYLOAD);
 | 
	
		
			
				|  |  | +		outp.armor(peer->key(),true);
 | 
	
		
			
				|  |  |  		RR->antiRec->logOutgoingZT(outp.data(),outp.size());
 | 
	
		
			
				|  |  |  		RR->node->putPacket(_localAddress,_remoteAddress,outp.data(),outp.size());
 | 
	
		
			
				|  |  |  		peer->received(RR,_localAddress,_remoteAddress,hops(),pid,Packet::VERB_ECHO,0,Packet::VERB_NOP);
 |