- Integrate rbl trees into tinc.

This commit is contained in:
Guus Sliepen 2000-11-20 19:12:17 +00:00
parent 9024e01ce6
commit 408ca91766
18 changed files with 443 additions and 417 deletions

View file

@ -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.61 2000/11/15 13:33:27 guus Exp $
$Id: protocol.c,v 1.28.4.62 2000/11/20 19:12:13 guus Exp $
*/
#include "config.h"
@ -61,7 +61,7 @@
#include "netutl.h"
#include "protocol.h"
#include "meta.h"
#include "connlist.h"
#include "connection.h"
#include "system.h"
@ -78,7 +78,7 @@ int check_id(char *id)
/* Generic request routines - takes care of logging and error detection as well */
int send_request(conn_list_t *cl, const char *format, ...)
int send_request(connection_t *cl, const char *format, ...)
{
va_list args;
char buffer[MAXBUFSIZE];
@ -108,7 +108,7 @@ cp
return send_meta(cl, buffer, len);
}
int receive_request(conn_list_t *cl)
int receive_request(connection_t *cl)
{
int request;
cp
@ -179,7 +179,7 @@ cp
forge the key for the symmetric cipher.
*/
int send_id(conn_list_t *cl)
int send_id(connection_t *cl)
{
cp
cl->allow_request = CHALLENGE;
@ -187,9 +187,9 @@ cp
return send_request(cl, "%d %s %d %lx %hd", ID, myself->name, myself->protocol_version, myself->options, myself->port);
}
int id_h(conn_list_t *cl)
int id_h(connection_t *cl)
{
conn_list_t *old;
connection_t *old;
config_t const *cfg;
cp
if(sscanf(cl->buffer, "%*d %as %d %lx %hd", &cl->name, &cl->protocol_version, &cl->options, &cl->port) != 4)
@ -256,7 +256,7 @@ cp
return send_challenge(cl);
}
int send_challenge(conn_list_t *cl)
int send_challenge(connection_t *cl)
{
char *buffer;
int len, x;
@ -308,7 +308,7 @@ cp
return x;
}
int challenge_h(conn_list_t *cl)
int challenge_h(connection_t *cl)
{
char *buffer;
int len;
@ -362,7 +362,7 @@ cp
return send_chal_reply(cl);
}
int send_chal_reply(conn_list_t *cl)
int send_chal_reply(connection_t *cl)
{
char hash[SHA_DIGEST_LENGTH*2+1];
cp
@ -392,7 +392,7 @@ cp
return send_request(cl, "%d %s", CHAL_REPLY, hash);
}
int chal_reply_h(conn_list_t *cl)
int chal_reply_h(connection_t *cl)
{
char *hishash;
char myhash[SHA_DIGEST_LENGTH];
@ -450,7 +450,7 @@ cp
return send_id(cl);
}
int send_metakey(conn_list_t *cl)
int send_metakey(connection_t *cl)
{
char *buffer;
int len, x;
@ -509,7 +509,7 @@ cp
return x;
}
int metakey_h(conn_list_t *cl)
int metakey_h(connection_t *cl)
{
char *buffer;
int len;
@ -570,7 +570,7 @@ cp
return send_metakey(cl);
}
int send_ack(conn_list_t *cl)
int send_ack(connection_t *cl)
{
int x;
cp
@ -585,10 +585,11 @@ cp
return x;
}
int ack_h(conn_list_t *cl)
int ack_h(connection_t *cl)
{
conn_list_t *old, *p;
subnet_t *s;
connection_t *old, *p;
subnet_t *subnet;
rbl_t *rbl, *rbl2;
cp
/* Okay, before we active the connection, we check if there is another entry
in the connection list with the same name. If so, it presumably is an
@ -622,33 +623,42 @@ cp
/* Send him our subnets */
for(s = myself->subnets; s; s = s->next)
send_add_subnet(cl, s);
RBL_FOREACH(myself->subnet_tree, rbl)
{
subnet = (subnet_t *)rbl->data;
send_add_subnet(cl, subnet);
}
/* And send him all the hosts and their subnets we know... */
for(p = conn_list; p; p = p->next)
if(p != cl && p->status.active)
{
/* Notify others of this connection */
if(p->status.meta)
send_add_host(p, cl);
RBL_FOREACH(connection_tree, rbl)
{
p = (connection_t *)rbl->data;
if(p != cl && p->status.active)
{
/* Notify others of this connection */
/* Notify new connection of everything we know */
if(p->status.meta)
send_add_host(p, cl);
send_add_host(cl, p);
for(s = p->subnets; s; s = s->next)
send_add_subnet(cl, s);
}
/* Notify new connection of everything we know */
send_add_host(cl, p);
RBL_FOREACH(p->subnet_tree, rbl2)
{
subnet = (subnet_t *)rbl2->data;
send_add_subnet(cl, subnet);
}
}
}
cp
return 0;
}
/* Address and subnet information exchange */
int send_add_subnet(conn_list_t *cl, subnet_t *subnet)
int send_add_subnet(connection_t *cl, subnet_t *subnet)
{
int x;
char *netstr;
@ -660,12 +670,13 @@ cp
return x;
}
int add_subnet_h(conn_list_t *cl)
int add_subnet_h(connection_t *cl)
{
char *subnetstr;
char *name;
conn_list_t *owner, *p;
connection_t *owner, *p;
subnet_t *subnet;
rbl_t *rbl;
cp
if(sscanf(cl->buffer, "%*d %as %as", &name, &subnetstr) != 2)
{
@ -721,14 +732,17 @@ cp
/* Tell the rest */
for(p = conn_list; p; p = p->next)
if(p->status.meta && p->status.active && p!= cl)
send_add_subnet(p, subnet);
RBL_FOREACH(connection_tree, rbl)
{
p = (connection_t *)rbl->data;
if(p->status.meta && p->status.active && p!= cl)
send_add_subnet(p, subnet);
}
cp
return 0;
}
int send_del_subnet(conn_list_t *cl, subnet_t *subnet)
int send_del_subnet(connection_t *cl, subnet_t *subnet)
{
int x;
char *netstr;
@ -740,12 +754,13 @@ cp
return x;
}
int del_subnet_h(conn_list_t *cl)
int del_subnet_h(connection_t *cl)
{
char *subnetstr;
char *name;
conn_list_t *owner, *p;
connection_t *owner, *p;
subnet_t *subnet;
rbl_t *rbl;
cp
if(sscanf(cl->buffer, "%*d %as %as", &name, &subnetstr) != 3)
{
@ -801,29 +816,31 @@ cp
/* Tell the rest */
for(p = conn_list; p; p = p->next)
if(p->status.meta && p->status.active && p!= cl)
send_del_subnet(p, subnet);
RBL_FOREACH(connection_tree, rbl)
{
p = (connection_t *)rbl->data;
if(p->status.meta && p->status.active && p!= cl)
send_del_subnet(p, subnet);
}
cp
return 0;
}
/* New and closed connections notification */
int send_add_host(conn_list_t *cl, conn_list_t *other)
int send_add_host(connection_t *cl, connection_t *other)
{
cp
return send_request(cl, "%d %s %lx:%d %lx", ADD_HOST,
other->name, other->address, other->port, other->options);
}
int add_host_h(conn_list_t *cl)
int add_host_h(connection_t *cl)
{
conn_list_t *old, *new;
conn_list_t *p;
connection_t *old, *new, *p;
rbl_t *rbl;
cp
new = new_conn_list();
new = new_connection();
if(sscanf(cl->buffer, "%*d %as %lx:%d %lx", &new->name, &new->address, &new->port, &new->options) != 4)
{
@ -836,7 +853,7 @@ cp
if(check_id(new->name))
{
syslog(LOG_ERR, _("Got bad ADD_HOST from %s (%s): invalid identity name"), cl->name, cl->hostname);
free_conn_list(new);
free_connection(new);
return -1;
}
@ -846,11 +863,11 @@ cp
{
syslog(LOG_ERR, _("Warning: got ADD_HOST from %s (%s) for ourself, restarting"), cl->name, cl->hostname);
sighup = 1;
free_conn_list(new);
free_connection(new);
return 0;
}
/* Fill in more of the new conn_list structure */
/* Fill in more of the new connection structure */
new->hostname = hostlookup(htonl(new->address));
@ -863,7 +880,7 @@ cp
if(debug_lvl >= DEBUG_CONNECTIONS)
syslog(LOG_NOTICE, _("Got duplicate ADD_HOST for %s (%s) from %s (%s)"),
old->name, old->hostname, new->name, new->hostname);
free_conn_list(new);
free_connection(new);
return 0;
}
else
@ -876,17 +893,20 @@ cp
}
}
/* Hook it up into the conn_list */
/* Hook it up into the connection */
conn_list_add(new);
connection_add(new);
/* Tell the rest about the new host */
for(p = conn_list; p; p = p->next)
if(p->status.meta && p->status.active && p!=cl)
send_add_host(p, new);
RBL_FOREACH(connection_tree, rbl)
{
p = (connection_t *)rbl->data;
if(p->status.meta && p->status.active && p!=cl)
send_add_host(p, new);
}
/* Fill in rest of conn_list structure */
/* Fill in rest of connection structure */
new->nexthop = cl;
new->status.active = 1;
@ -902,20 +922,21 @@ cp
return 0;
}
int send_del_host(conn_list_t *cl, conn_list_t *other)
int send_del_host(connection_t *cl, connection_t *other)
{
cp
return send_request(cl, "%d %s %lx:%d %lx", DEL_HOST,
other->name, other->address, other->port, other->options);
}
int del_host_h(conn_list_t *cl)
int del_host_h(connection_t *cl)
{
char *name;
ip_t address;
port_t port;
long int options;
conn_list_t *old, *p;
connection_t *old, *p;
rbl_t *rbl;
cp
if(sscanf(cl->buffer, "%*d %as %lx:%d %lx", &name, &address, &port, &options) != 4)
{
@ -969,16 +990,19 @@ cp
/* Tell the rest about the new host */
for(p = conn_list; p; p = p->next)
if(p->status.meta && p->status.active && p!=cl)
send_del_host(p, old);
RBL_FOREACH(connection_tree, rbl)
{
p = (connection_t *)rbl->data;
if(p->status.meta && p->status.active && p!=cl)
send_del_host(p, old);
}
cp
return 0;
}
/* Status and error notification routines */
int send_status(conn_list_t *cl, int statusno, char *statusstring)
int send_status(connection_t *cl, int statusno, char *statusstring)
{
cp
if(!statusstring)
@ -987,7 +1011,7 @@ cp
return send_request(cl, "%d %d %s", STATUS, statusno, statusstring);
}
int status_h(conn_list_t *cl)
int status_h(connection_t *cl)
{
int statusno;
char *statusstring;
@ -1010,7 +1034,7 @@ cp
return 0;
}
int send_error(conn_list_t *cl, int errno, char *errstring)
int send_error(connection_t *cl, int errno, char *errstring)
{
cp
if(!errstring)
@ -1018,7 +1042,7 @@ cp
return send_request(cl, "%d %d %s", ERROR, errno, errstring);
}
int error_h(conn_list_t *cl)
int error_h(connection_t *cl)
{
int errno;
char *errorstring;
@ -1042,13 +1066,13 @@ cp
return 0;
}
int send_termreq(conn_list_t *cl)
int send_termreq(connection_t *cl)
{
cp
return send_request(cl, "%d", TERMREQ);
}
int termreq_h(conn_list_t *cl)
int termreq_h(connection_t *cl)
{
cp
terminate_connection(cl);
@ -1058,7 +1082,7 @@ cp
/* Keepalive routines - FIXME: needs a closer look */
int send_ping(conn_list_t *cl)
int send_ping(connection_t *cl)
{
cp
cl->status.pinged = 1;
@ -1067,19 +1091,19 @@ cp
return send_request(cl, "%d", PING);
}
int ping_h(conn_list_t *cl)
int ping_h(connection_t *cl)
{
cp
return send_pong(cl);
}
int send_pong(conn_list_t *cl)
int send_pong(connection_t *cl)
{
cp
return send_request(cl, "%d", PONG);
}
int pong_h(conn_list_t *cl)
int pong_h(connection_t *cl)
{
cp
cl->status.pinged = 0;
@ -1089,24 +1113,25 @@ cp
/* Key exchange */
int send_key_changed(conn_list_t *from, conn_list_t *cl)
int send_key_changed(connection_t *from, connection_t *cl)
{
conn_list_t *p;
connection_t *p;
rbl_t *rbl;
cp
for(p = conn_list; p != NULL; p = p->next)
RBL_FOREACH(connection_tree, rbl)
{
if(p!=cl && p->status.meta && p->status.active)
send_request(p, "%d %s", KEY_CHANGED,
from->name);
p = (connection_t *)rbl->data;
if(p != cl && p->status.meta && p->status.active)
send_request(p, "%d %s", KEY_CHANGED, from->name);
}
cp
return 0;
}
int key_changed_h(conn_list_t *cl)
int key_changed_h(connection_t *cl)
{
char *from_id;
conn_list_t *from;
connection_t *from;
cp
if(sscanf(cl->buffer, "%*d %as", &from_id) != 1)
{
@ -1133,17 +1158,17 @@ cp
return 0;
}
int send_req_key(conn_list_t *from, conn_list_t *to)
int send_req_key(connection_t *from, connection_t *to)
{
cp
return send_request(to->nexthop, "%d %s %s", REQ_KEY,
from->name, to->name);
}
int req_key_h(conn_list_t *cl)
int req_key_h(connection_t *cl)
{
char *from_id, *to_id;
conn_list_t *from, *to;
connection_t *from, *to;
char pktkey[129];
cp
if(sscanf(cl->buffer, "%*d %as %as", &from_id, &to_id) != 2)
@ -1194,18 +1219,18 @@ cp
return 0;
}
int send_ans_key(conn_list_t *from, conn_list_t *to, char *pktkey)
int send_ans_key(connection_t *from, connection_t *to, char *pktkey)
{
cp
return send_request(to->nexthop, "%d %s %s %s", ANS_KEY,
from->name, to->name, pktkey);
}
int ans_key_h(conn_list_t *cl)
int ans_key_h(connection_t *cl)
{
char *from_id, *to_id, *pktkey;
int keylength;
conn_list_t *from, *to;
connection_t *from, *to;
cp
if(sscanf(cl->buffer, "%*d %as %as %as", &from_id, &to_id, &pktkey) != 3)
{
@ -1268,7 +1293,7 @@ cp
/* Jumptable for the request handlers */
int (*request_handlers[])(conn_list_t*) = {
int (*request_handlers[])(connection_t*) = {
id_h, challenge_h, chal_reply_h, metakey_h, ack_h,
status_h, error_h, termreq_h,
ping_h, pong_h,