projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
- Integrate rbl trees into tinc.
[tinc]
/
src
/
protocol.c
diff --git
a/src/protocol.c
b/src/protocol.c
index
dfb6ad9
..
7581804
100644
(file)
--- 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.
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.6
1 2000/11/15 13:33:27
guus Exp $
+ $Id: protocol.c,v 1.28.4.6
2 2000/11/20 19:12:13
guus Exp $
*/
#include "config.h"
*/
#include "config.h"
@@
-61,7
+61,7
@@
#include "netutl.h"
#include "protocol.h"
#include "meta.h"
#include "netutl.h"
#include "protocol.h"
#include "meta.h"
-#include "conn
list
.h"
+#include "conn
ection
.h"
#include "system.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 */
/* 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(conn
ection
_t *cl, const char *format, ...)
{
va_list args;
char buffer[MAXBUFSIZE];
{
va_list args;
char buffer[MAXBUFSIZE];
@@
-108,7
+108,7
@@
cp
return send_meta(cl, buffer, len);
}
return send_meta(cl, buffer, len);
}
-int receive_request(conn
_list
_t *cl)
+int receive_request(conn
ection
_t *cl)
{
int request;
cp
{
int request;
cp
@@
-179,7
+179,7
@@
cp
forge the key for the symmetric cipher.
*/
forge the key for the symmetric cipher.
*/
-int send_id(conn
_list
_t *cl)
+int send_id(conn
ection
_t *cl)
{
cp
cl->allow_request = CHALLENGE;
{
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);
}
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(conn
ection
_t *cl)
{
{
- conn
_list
_t *old;
+ conn
ection
_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)
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);
}
return send_challenge(cl);
}
-int send_challenge(conn
_list
_t *cl)
+int send_challenge(conn
ection
_t *cl)
{
char *buffer;
int len, x;
{
char *buffer;
int len, x;
@@
-308,7
+308,7
@@
cp
return x;
}
return x;
}
-int challenge_h(conn
_list
_t *cl)
+int challenge_h(conn
ection
_t *cl)
{
char *buffer;
int len;
{
char *buffer;
int len;
@@
-362,7
+362,7
@@
cp
return send_chal_reply(cl);
}
return send_chal_reply(cl);
}
-int send_chal_reply(conn
_list
_t *cl)
+int send_chal_reply(conn
ection
_t *cl)
{
char hash[SHA_DIGEST_LENGTH*2+1];
cp
{
char hash[SHA_DIGEST_LENGTH*2+1];
cp
@@
-392,7
+392,7
@@
cp
return send_request(cl, "%d %s", CHAL_REPLY, hash);
}
return send_request(cl, "%d %s", CHAL_REPLY, hash);
}
-int chal_reply_h(conn
_list
_t *cl)
+int chal_reply_h(conn
ection
_t *cl)
{
char *hishash;
char myhash[SHA_DIGEST_LENGTH];
{
char *hishash;
char myhash[SHA_DIGEST_LENGTH];
@@
-450,7
+450,7
@@
cp
return send_id(cl);
}
return send_id(cl);
}
-int send_metakey(conn
_list
_t *cl)
+int send_metakey(conn
ection
_t *cl)
{
char *buffer;
int len, x;
{
char *buffer;
int len, x;
@@
-509,7
+509,7
@@
cp
return x;
}
return x;
}
-int metakey_h(conn
_list
_t *cl)
+int metakey_h(conn
ection
_t *cl)
{
char *buffer;
int len;
{
char *buffer;
int len;
@@
-570,7
+570,7
@@
cp
return send_metakey(cl);
}
return send_metakey(cl);
}
-int send_ack(conn
_list
_t *cl)
+int send_ack(conn
ection
_t *cl)
{
int x;
cp
{
int x;
cp
@@
-585,10
+585,11
@@
cp
return x;
}
return x;
}
-int ack_h(conn
_list
_t *cl)
+int ack_h(conn
ection
_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
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 */
/* 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... */
/* 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 */
cp
return 0;
}
/* Address and subnet information exchange */
-int send_add_subnet(conn
_list
_t *cl, subnet_t *subnet)
+int send_add_subnet(conn
ection
_t *cl, subnet_t *subnet)
{
int x;
char *netstr;
{
int x;
char *netstr;
@@
-660,12
+670,13
@@
cp
return x;
}
return x;
}
-int add_subnet_h(conn
_list
_t *cl)
+int add_subnet_h(conn
ection
_t *cl)
{
char *subnetstr;
char *name;
{
char *subnetstr;
char *name;
- conn
_list
_t *owner, *p;
+ conn
ection
_t *owner, *p;
subnet_t *subnet;
subnet_t *subnet;
+ rbl_t *rbl;
cp
if(sscanf(cl->buffer, "%*d %as %as", &name, &subnetstr) != 2)
{
cp
if(sscanf(cl->buffer, "%*d %as %as", &name, &subnetstr) != 2)
{
@@
-721,14
+732,17
@@
cp
/* Tell the rest */
/* 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;
}
cp
return 0;
}
-int send_del_subnet(conn
_list
_t *cl, subnet_t *subnet)
+int send_del_subnet(conn
ection
_t *cl, subnet_t *subnet)
{
int x;
char *netstr;
{
int x;
char *netstr;
@@
-740,12
+754,13
@@
cp
return x;
}
return x;
}
-int del_subnet_h(conn
_list
_t *cl)
+int del_subnet_h(conn
ection
_t *cl)
{
char *subnetstr;
char *name;
{
char *subnetstr;
char *name;
- conn
_list
_t *owner, *p;
+ conn
ection
_t *owner, *p;
subnet_t *subnet;
subnet_t *subnet;
+ rbl_t *rbl;
cp
if(sscanf(cl->buffer, "%*d %as %as", &name, &subnetstr) != 3)
{
cp
if(sscanf(cl->buffer, "%*d %as %as", &name, &subnetstr) != 3)
{
@@
-801,29
+816,31
@@
cp
/* Tell the rest */
/* 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 */
cp
return 0;
}
/* New and closed connections notification */
-int send_add_host(conn
_list_t *cl, conn_list
_t *other)
+int send_add_host(conn
ection_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);
}
{
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(conn
ection
_t *cl)
{
{
- conn_list_t *old, *new;
- conn_list_t *p;
-
+ connection_t *old, *new, *p;
+ rbl_t *rbl;
cp
cp
- new = new_conn
_list
();
+ new = new_conn
ection
();
if(sscanf(cl->buffer, "%*d %as %lx:%d %lx", &new->name, &new->address, &new->port, &new->options) != 4)
{
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);
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_conn
ection
(new);
return -1;
}
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;
{
syslog(LOG_ERR, _("Warning: got ADD_HOST from %s (%s) for ourself, restarting"), cl->name, cl->hostname);
sighup = 1;
- free_conn
_list
(new);
+ free_conn
ection
(new);
return 0;
}
return 0;
}
- /* Fill in more of the new conn
_list
structure */
+ /* Fill in more of the new conn
ection
structure */
new->hostname = hostlookup(htonl(new->address));
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);
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_conn
ection
(new);
return 0;
}
else
return 0;
}
else
@@
-876,17
+893,20
@@
cp
}
}
}
}
- /* Hook it up into the conn
_list
*/
+ /* Hook it up into the conn
ection
*/
- conn
_list
_add(new);
+ conn
ection
_add(new);
/* Tell the rest about the new host */
/* 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 conn
ection
structure */
new->nexthop = cl;
new->status.active = 1;
new->nexthop = cl;
new->status.active = 1;
@@
-902,20
+922,21
@@
cp
return 0;
}
return 0;
}
-int send_del_host(conn
_list_t *cl, conn_list
_t *other)
+int send_del_host(conn
ection_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);
}
{
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(conn
ection
_t *cl)
{
char *name;
ip_t address;
port_t port;
long int options;
{
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)
{
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 */
/* 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 */
cp
return 0;
}
/* Status and error notification routines */
-int send_status(conn
_list
_t *cl, int statusno, char *statusstring)
+int send_status(conn
ection
_t *cl, int statusno, char *statusstring)
{
cp
if(!statusstring)
{
cp
if(!statusstring)
@@
-987,7
+1011,7
@@
cp
return send_request(cl, "%d %d %s", STATUS, statusno, statusstring);
}
return send_request(cl, "%d %d %s", STATUS, statusno, statusstring);
}
-int status_h(conn
_list
_t *cl)
+int status_h(conn
ection
_t *cl)
{
int statusno;
char *statusstring;
{
int statusno;
char *statusstring;
@@
-1010,7
+1034,7
@@
cp
return 0;
}
return 0;
}
-int send_error(conn
_list
_t *cl, int errno, char *errstring)
+int send_error(conn
ection
_t *cl, int errno, char *errstring)
{
cp
if(!errstring)
{
cp
if(!errstring)
@@
-1018,7
+1042,7
@@
cp
return send_request(cl, "%d %d %s", ERROR, errno, errstring);
}
return send_request(cl, "%d %d %s", ERROR, errno, errstring);
}
-int error_h(conn
_list
_t *cl)
+int error_h(conn
ection
_t *cl)
{
int errno;
char *errorstring;
{
int errno;
char *errorstring;
@@
-1042,13
+1066,13
@@
cp
return 0;
}
return 0;
}
-int send_termreq(conn
_list
_t *cl)
+int send_termreq(conn
ection
_t *cl)
{
cp
return send_request(cl, "%d", TERMREQ);
}
{
cp
return send_request(cl, "%d", TERMREQ);
}
-int termreq_h(conn
_list
_t *cl)
+int termreq_h(conn
ection
_t *cl)
{
cp
terminate_connection(cl);
{
cp
terminate_connection(cl);
@@
-1058,7
+1082,7
@@
cp
/* Keepalive routines - FIXME: needs a closer look */
/* Keepalive routines - FIXME: needs a closer look */
-int send_ping(conn
_list
_t *cl)
+int send_ping(conn
ection
_t *cl)
{
cp
cl->status.pinged = 1;
{
cp
cl->status.pinged = 1;
@@
-1067,19
+1091,19
@@
cp
return send_request(cl, "%d", PING);
}
return send_request(cl, "%d", PING);
}
-int ping_h(conn
_list
_t *cl)
+int ping_h(conn
ection
_t *cl)
{
cp
return send_pong(cl);
}
{
cp
return send_pong(cl);
}
-int send_pong(conn
_list
_t *cl)
+int send_pong(conn
ection
_t *cl)
{
cp
return send_request(cl, "%d", PONG);
}
{
cp
return send_request(cl, "%d", PONG);
}
-int pong_h(conn
_list
_t *cl)
+int pong_h(conn
ection
_t *cl)
{
cp
cl->status.pinged = 0;
{
cp
cl->status.pinged = 0;
@@
-1089,24
+1113,25
@@
cp
/* Key exchange */
/* Key exchange */
-int send_key_changed(conn
_list_t *from, conn_list
_t *cl)
+int send_key_changed(conn
ection_t *from, connection
_t *cl)
{
{
- conn_list_t *p;
+ connection_t *p;
+ rbl_t *rbl;
cp
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;
}
}
cp
return 0;
}
-int key_changed_h(conn
_list
_t *cl)
+int key_changed_h(conn
ection
_t *cl)
{
char *from_id;
{
char *from_id;
- conn
_list
_t *from;
+ conn
ection
_t *from;
cp
if(sscanf(cl->buffer, "%*d %as", &from_id) != 1)
{
cp
if(sscanf(cl->buffer, "%*d %as", &from_id) != 1)
{
@@
-1133,17
+1158,17
@@
cp
return 0;
}
return 0;
}
-int send_req_key(conn
_list_t *from, conn_list
_t *to)
+int send_req_key(conn
ection_t *from, connection
_t *to)
{
cp
return send_request(to->nexthop, "%d %s %s", REQ_KEY,
from->name, to->name);
}
{
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(conn
ection
_t *cl)
{
char *from_id, *to_id;
{
char *from_id, *to_id;
- conn
_list
_t *from, *to;
+ conn
ection
_t *from, *to;
char pktkey[129];
cp
if(sscanf(cl->buffer, "%*d %as %as", &from_id, &to_id) != 2)
char pktkey[129];
cp
if(sscanf(cl->buffer, "%*d %as %as", &from_id, &to_id) != 2)
@@
-1194,18
+1219,18
@@
cp
return 0;
}
return 0;
}
-int send_ans_key(conn
_list_t *from, conn_list
_t *to, char *pktkey)
+int send_ans_key(conn
ection_t *from, connection
_t *to, char *pktkey)
{
cp
return send_request(to->nexthop, "%d %s %s %s", ANS_KEY,
from->name, to->name, 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(conn
ection
_t *cl)
{
char *from_id, *to_id, *pktkey;
int keylength;
{
char *from_id, *to_id, *pktkey;
int keylength;
- conn
_list
_t *from, *to;
+ conn
ection
_t *from, *to;
cp
if(sscanf(cl->buffer, "%*d %as %as %as", &from_id, &to_id, &pktkey) != 3)
{
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 */
/* Jumptable for the request handlers */
-int (*request_handlers[])(conn
_list
_t*) = {
+int (*request_handlers[])(conn
ection
_t*) = {
id_h, challenge_h, chal_reply_h, metakey_h, ack_h,
status_h, error_h, termreq_h,
ping_h, pong_h,
id_h, challenge_h, chal_reply_h, metakey_h, ack_h,
status_h, error_h, termreq_h,
ping_h, pong_h,