Merge branch 'master' into 1.1
[tinc] / src / protocol_key.c
index 069cfd5..f57dc2e 100644 (file)
@@ -35,7 +35,7 @@
 static bool mykeyused = false;
 
 void send_key_changed() {
-       avl_node_t *node;
+       splay_node_t *node;
        connection_t *c;
 
        send_request(broadcast, "%d %x %s", KEY_CHANGED, rand(), myself->name);
@@ -175,7 +175,7 @@ bool ans_key_h(connection_t *c, char *request) {
        int cipher, digest, maclength, compression, keylen;
        node_t *from, *to;
 
-       if(sscanf(request, "%*d "MAX_STRING" "MAX_STRING" "MAX_STRING" %d %d %d %d",
+       if(sscanf(request, "%*d "MAX_STRING" "MAX_STRING" "MAX_STRING" %d %d %d %d "MAX_STRING" "MAX_STRING,
                from_name, to_name, key, &cipher, &digest, &maclength,
                &compression, address, port) < 7) {
                logger(LOG_ERR, "Got bad %s from %s (%s)", "ANS_KEY", c->name,
@@ -216,6 +216,16 @@ bool ans_key_h(connection_t *c, char *request) {
                        return true;
                }
 
+               if(!*address && from->address.sa.sa_family != AF_UNSPEC) {
+                       char *address, *port;
+                       ifdebug(PROTOCOL) logger(LOG_DEBUG, "Appending reflexive UDP address to ANS_KEY from %s to %s", from->name, to->name);
+                       sockaddr2str(&from->address, &address, &port);
+                       send_request(to->nexthop->connection, "%s %s %s", request, address, port);
+                       free(address);
+                       free(port);
+                       return true;
+               }
+
                return send_request(to->nexthop->connection, "%s", request);
        }
 
@@ -257,7 +267,6 @@ bool ans_key_h(connection_t *c, char *request) {
        digest_set_key(&from->outdigest, key, keylen);
 
        from->status.validkey = true;
-       from->status.waitingforkey = false;
        from->sent_seqno = 0;
 
        if(*address && *port) {