We should not do anything if we are already exchanging a new key, and
just return true. This change prevents higher layers in MeshLink from
terminating a connection between two nodes if both peers call
sptps_force_kex() at nearly the same time.
// Force another Key EXchange (for testing purposes).
bool sptps_force_kex(sptps_t *s) {
- if(!s->outstate || s->state != SPTPS_SECONDARY_KEX) {
+ if(!s->outstate || s->state < SPTPS_SECONDARY_KEX) {
return error(s, EINVAL, "Cannot force KEX in current state");
}
+ if(s->state > SPTPS_SECONDARY_KEX) {
+ // We are already in the middle of a secondary key exchange
+ return true;
+ }
+
s->state = SPTPS_KEX;
return send_kex(s);
}