gsliepen/tinc — pull request #51 by dechamps (2014-09-21 09:53:51+00:00)
Title: Preemptively mirror REQ_PUBKEY messages from nodes with unknown keys

In this commit, if a node receives a `REQ_PUBKEY` message from a node it doesn't have the key for, it will send a `REQ_PUBKEY` message in return *before* sending its own key.

The rationale is to prevent delays when establishing communication between two nodes that see each other for the first time. These delays are caused by the first SPTPS packet being dropped on the floor, as shown in the following typical exchange:

node1: No Ed25519 key known for node2
REQ_PUBKEY ->
<- ANS_PUBKEY
node1: Learned Ed25519 public key from node2
REQ_SPTPS_START ->
node2: No Ed25519 key known for zyklos
<- REQ_PUBKEY
ANS_PUBKEY ->
node2: Learned Ed25519 public key from node1
-- 10-second delay --
node1: No key from node2 after 10 seconds, restarting SPTPS
REQ_SPTPS_START ->
<- SPTPS ->
node1: SPTPS key exchange with node2 succesful
node2: SPTPS key exchange with node1 succesful

With this patch, the following happens instead:

node1: No Ed25519 key known for node2
REQ_PUBKEY ->
node2: Preemptively requesting Ed25519 key for node1
<- REQ_PUBKEY
<- ANS_PUBKEY
ANS_PUBKEY ->
node2: Learned Ed25519 public key from node1
node1: Learned Ed25519 public key from node2
REQ_SPTPS_START ->
<- SPTPS ->
node1: SPTPS key exchange with node2 succesful
node2: SPTPS key exchange with node1 succesful