Preemptively mirror REQ_PUBKEY messages from nodes with unknown keys.
authorEtienne Dechamps <etienne@edechamps.fr>
Sun, 21 Sep 2014 09:38:41 +0000 (11:38 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Mon, 22 Sep 2014 08:10:57 +0000 (10:10 +0200)
commitdaf65919d1ccc40f6c11f3f723f325de9021c422
treeb044edfb60e6ff335dc83e5800f4c05e23e7520b
parentc897f8c99e0b0827cff60f098bd3f9852a062233
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
src/protocol_key.c