Ensure peers with a meta connection always have our key.
authorGuus Sliepen <guus@tinc-vpn.org>
Wed, 3 Feb 2010 10:18:46 +0000 (11:18 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Wed, 3 Feb 2010 10:18:46 +0000 (11:18 +0100)
This keeps UDP probes going, which in turn keeps NAT mappings alive.

src/protocol.h
src/protocol_key.c

index e611f6eda0100d589cc9c187be14249014f4cee3..703f74bf28df05594695416c93fd6ac950eeb84c 100644 (file)
@@ -95,7 +95,7 @@ extern bool send_add_subnet(struct connection_t *, const struct subnet_t *);
 extern bool send_del_subnet(struct connection_t *, const struct subnet_t *);
 extern bool send_add_edge(struct connection_t *, const struct edge_t *);
 extern bool send_del_edge(struct connection_t *, const struct edge_t *);
-extern bool send_key_changed();
+extern void send_key_changed();
 extern bool send_req_key(struct node_t *);
 extern bool send_ans_key(struct node_t *);
 extern bool send_tcppacket(struct connection_t *, struct vpn_packet_t *);
index 341d0ac9f86b03a11b10815d7e7b8c22fb5e2851..67f40af45caa660c93b8a207f2c568920878a6ec 100644 (file)
 
 bool mykeyused = false;
 
-bool send_key_changed() {
-       /* Only send this message if some other daemon requested our key previously.
-          This reduces unnecessary key_changed broadcasts.
-        */
+void send_key_changed() {
+       avl_node_t *node;
+       connection_t *c;
 
-       if(!mykeyused)
-               return true;
+       send_request(broadcast, "%d %x %s", KEY_CHANGED, rand(), myself->name);
+
+       /* Immediately send new keys to directly connected nodes to keep UDP mappings alive */
 
-       return send_request(broadcast, "%d %x %s", KEY_CHANGED, rand(), myself->name);
+       for(node = connection_tree->head; node; node = node->next) {
+               c = node->data;
+               if(c->status.active && c->node && c->node->status.reachable)
+                       send_ans_key(c->node);
+       }
 }
 
 bool key_changed_h(connection_t *c) {