X-Git-Url: http://tinc-vpn.org/git/browse?a=blobdiff_plain;ds=sidebyside;f=src%2Fprotocol.c;h=0728ea1a1b104e0f6b9971f40ae0e1ba64538794;hb=afc05797077641baa33b024ffeaafd6cad3ff7a7;hp=40acfbb281507dceaf79ecdd82248a881ec7b6ca;hpb=b7d4d4c17712e0bb9ee8bd497a2f525b79d5f40d;p=tinc diff --git a/src/protocol.c b/src/protocol.c index 40acfbb2..0728ea1a 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: protocol.c,v 1.28.4.53 2000/10/29 22:55:14 guus Exp $ + $Id: protocol.c,v 1.28.4.57 2000/11/04 20:44:28 guus Exp $ */ #include "config.h" @@ -174,7 +174,7 @@ cp int id_h(conn_list_t *cl) { conn_list_t *old; - config_t *cfg; + config_t const *cfg; cp if(sscanf(cl->buffer, "%*d %as %d %lx %hd", &cl->name, &cl->protocol_version, &cl->options, &cl->port) != 4) { @@ -803,6 +803,7 @@ int add_host_h(conn_list_t *cl) { conn_list_t *old, *new; conn_list_t *p; + cp new = new_conn_list(); @@ -871,6 +872,8 @@ cp new->nexthop = cl; new->status.active = 1; + new->cipher_pkttype = EVP_bf_cfb(); + new->cipher_pktkeylength = cl->cipher_pkttype->key_len + cl->cipher_pkttype->iv_len; cp return 0; @@ -1034,7 +1037,9 @@ cp int send_ping(conn_list_t *cl) { +cp cl->status.pinged = 1; + cl->last_ping_time = time(NULL); cp return send_request(cl, "%d", PING); } @@ -1054,7 +1059,7 @@ cp int pong_h(conn_list_t *cl) { cp - cl->status.got_pong = 1; + cl->status.pinged = 0; cp return 0; } @@ -1194,7 +1199,7 @@ cp return -1; } - /* Update origin's packet key */ + /* Check correctness of packet key */ keylength = strlen(pktkey); @@ -1206,17 +1211,8 @@ cp return -1; } - if(from->cipher_pktkey) - free(from->cipher_pktkey); - - keylength /= 2; - hex2bin(pktkey, pktkey, keylength); - pktkey[keylength] = '\0'; - from->cipher_pktkey = pktkey; + /* Forward it if necessary */ - from->status.validkey = 1; - from->status.waitingforkey = 0; - if(strcmp(to_id, myself->name)) { if(!(to = lookup_id(to_id))) @@ -1229,6 +1225,19 @@ cp send_ans_key(from, to, pktkey); } + /* Update our copy of the origin's packet key */ + + if(from->cipher_pktkey) + free(from->cipher_pktkey); + + keylength /= 2; + hex2bin(pktkey, pktkey, keylength); + pktkey[keylength] = '\0'; + from->cipher_pktkey = pktkey; + + from->status.validkey = 1; + from->status.waitingforkey = 0; + free(from_id); free(to_id); cp return 0;