projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Start documenting the SPTPS protocol.
[tinc]
/
src
/
subnet.c
diff --git
a/src/subnet.c
b/src/subnet.c
index
bc66fec
..
e1de101
100644
(file)
--- a/
src/subnet.c
+++ b/
src/subnet.c
@@
-1,6
+1,6
@@
/*
subnet.c -- handle subnet lookups and lists
/*
subnet.c -- handle subnet lookups and lists
- Copyright (C) 2000-20
09
Guus Sliepen <guus@tinc-vpn.org>,
+ Copyright (C) 2000-20
10
Guus Sliepen <guus@tinc-vpn.org>,
2000-2005 Ivo Timmermans
This program is free software; you can redistribute it and/or modify
2000-2005 Ivo Timmermans
This program is free software; you can redistribute it and/or modify
@@
-20,7
+20,8
@@
#include "system.h"
#include "system.h"
-#include "avl_tree.h"
+#include "splay_tree.h"
+#include "control_common.h"
#include "device.h"
#include "logger.h"
#include "net.h"
#include "device.h"
#include "logger.h"
#include "net.h"
@@
-33,7
+34,7
@@
/* lists type of subnet */
/* lists type of subnet */
-
avl
_tree_t *subnet_tree;
+
splay
_tree_t *subnet_tree;
/* Subnet lookup cache */
/* Subnet lookup cache */
@@
-52,7
+53,7
@@
static subnet_t *cache_mac_subnet[2];
static bool cache_mac_valid[2];
static int cache_mac_slot;
static bool cache_mac_valid[2];
static int cache_mac_slot;
-void subnet_cache_flush() {
+void subnet_cache_flush(
void
) {
cache_ipv4_valid[0] = cache_ipv4_valid[1] = false;
cache_ipv6_valid[0] = cache_ipv6_valid[1] = false;
cache_mac_valid[0] = cache_mac_valid[1] = false;
cache_ipv4_valid[0] = cache_ipv4_valid[1] = false;
cache_ipv6_valid[0] = cache_ipv6_valid[1] = false;
cache_mac_valid[0] = cache_mac_valid[1] = false;
@@
-63,7
+64,7
@@
void subnet_cache_flush() {
static int subnet_compare_mac(const subnet_t *a, const subnet_t *b) {
int result;
static int subnet_compare_mac(const subnet_t *a, const subnet_t *b) {
int result;
- result = memcmp(&a->net.mac.address, &b->net.mac.address, sizeof
(mac_t)
);
+ result = memcmp(&a->net.mac.address, &b->net.mac.address, sizeof
a->net.mac.address
);
if(result)
return result;
if(result)
return result;
@@
-134,7
+135,7
@@
int subnet_compare(const subnet_t *a, const subnet_t *b) {
case SUBNET_IPV6:
return subnet_compare_ipv6(a, b);
default:
case SUBNET_IPV6:
return subnet_compare_ipv6(a, b);
default:
- logger(LOG_ERR, "subnet_compare() was called with unknown subnet type %d, exitting!",
+ logger(
DEBUG_ALWAYS,
LOG_ERR, "subnet_compare() was called with unknown subnet type %d, exitting!",
a->type);
exit(0);
}
a->type);
exit(0);
}
@@
-145,21
+146,21
@@
int subnet_compare(const subnet_t *a, const subnet_t *b) {
/* Initialising trees */
void init_subnets(void) {
/* Initialising trees */
void init_subnets(void) {
- subnet_tree =
avl_alloc_tree((avl_compare_t) subnet_compare, (avl
_action_t) free_subnet);
+ subnet_tree =
splay_alloc_tree((splay_compare_t) subnet_compare, (splay
_action_t) free_subnet);
subnet_cache_flush();
}
void exit_subnets(void) {
subnet_cache_flush();
}
void exit_subnets(void) {
-
avl
_delete_tree(subnet_tree);
+
splay
_delete_tree(subnet_tree);
}
}
-
avl
_tree_t *new_subnet_tree(void) {
- return
avl_alloc_tree((avl
_compare_t) subnet_compare, NULL);
+
splay
_tree_t *new_subnet_tree(void) {
+ return
splay_alloc_tree((splay
_compare_t) subnet_compare, NULL);
}
}
-void free_subnet_tree(
avl
_tree_t *subnet_tree) {
-
avl
_delete_tree(subnet_tree);
+void free_subnet_tree(
splay
_tree_t *subnet_tree) {
+
splay
_delete_tree(subnet_tree);
}
/* Allocating and freeing space for subnets */
}
/* Allocating and freeing space for subnets */
@@
-177,15
+178,15
@@
void free_subnet(subnet_t *subnet) {
void subnet_add(node_t *n, subnet_t *subnet) {
subnet->owner = n;
void subnet_add(node_t *n, subnet_t *subnet) {
subnet->owner = n;
-
avl
_insert(subnet_tree, subnet);
-
avl
_insert(n->subnet_tree, subnet);
+
splay
_insert(subnet_tree, subnet);
+
splay
_insert(n->subnet_tree, subnet);
subnet_cache_flush();
}
void subnet_del(node_t *n, subnet_t *subnet) {
subnet_cache_flush();
}
void subnet_del(node_t *n, subnet_t *subnet) {
-
avl
_delete(n->subnet_tree, subnet);
-
avl
_delete(subnet_tree, subnet);
+
splay
_delete(n->subnet_tree, subnet);
+
splay
_delete(subnet_tree, subnet);
subnet_cache_flush();
}
subnet_cache_flush();
}
@@
-273,7
+274,7
@@
bool str2net(subnet_t *subnet, const char *subnetstr) {
bool net2str(char *netstr, int len, const subnet_t *subnet) {
if(!netstr || !subnet) {
bool net2str(char *netstr, int len, const subnet_t *subnet) {
if(!netstr || !subnet) {
- logger(
LOG_ERR, "net2str() was called with netstr=%p, subnet=%p!\n
", netstr, subnet);
+ logger(
DEBUG_ALWAYS, LOG_ERR, "net2str() was called with netstr=%p, subnet=%p!
", netstr, subnet);
return false;
}
return false;
}
@@
-314,7
+315,7
@@
bool net2str(char *netstr, int len, const subnet_t *subnet) {
break;
default:
break;
default:
- logger(LOG_ERR,
+ logger(
DEBUG_ALWAYS,
LOG_ERR,
"net2str() was called with unknown subnet type %d, exiting!",
subnet->type);
exit(0);
"net2str() was called with unknown subnet type %d, exiting!",
subnet->type);
exit(0);
@@
-326,12
+327,12
@@
bool net2str(char *netstr, int len, const subnet_t *subnet) {
/* Subnet lookup routines */
subnet_t *lookup_subnet(const node_t *owner, const subnet_t *subnet) {
/* Subnet lookup routines */
subnet_t *lookup_subnet(const node_t *owner, const subnet_t *subnet) {
- return
avl
_search(owner->subnet_tree, subnet);
+ return
splay
_search(owner->subnet_tree, subnet);
}
subnet_t *lookup_subnet_mac(const node_t *owner, const mac_t *address) {
subnet_t *p, *r = NULL;
}
subnet_t *lookup_subnet_mac(const node_t *owner, const mac_t *address) {
subnet_t *p, *r = NULL;
-
avl
_node_t *n;
+
splay
_node_t *n;
int i;
// Check if this address is cached
int i;
// Check if this address is cached
@@
-372,7
+373,7
@@
subnet_t *lookup_subnet_mac(const node_t *owner, const mac_t *address) {
subnet_t *lookup_subnet_ipv4(const ipv4_t *address) {
subnet_t *p, *r = NULL;
subnet_t *lookup_subnet_ipv4(const ipv4_t *address) {
subnet_t *p, *r = NULL;
-
avl
_node_t *n;
+
splay
_node_t *n;
int i;
// Check if this address is cached
int i;
// Check if this address is cached
@@
-411,7
+412,7
@@
subnet_t *lookup_subnet_ipv4(const ipv4_t *address) {
subnet_t *lookup_subnet_ipv6(const ipv6_t *address) {
subnet_t *p, *r = NULL;
subnet_t *lookup_subnet_ipv6(const ipv6_t *address) {
subnet_t *p, *r = NULL;
-
avl
_node_t *n;
+
splay
_node_t *n;
int i;
// Check if this address is cached
int i;
// Check if this address is cached
@@
-449,9
+450,9
@@
subnet_t *lookup_subnet_ipv6(const ipv6_t *address) {
}
void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
}
void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
-
avl
_node_t *node;
+
splay
_node_t *node;
int i;
int i;
- char *envp[9] = {
0
};
+ char *envp[9] = {
NULL
};
char netstr[MAXNETSTR];
char *name, *address, *port;
char empty[] = "";
char netstr[MAXNETSTR];
char *name, *address, *port;
char empty[] = "";
@@
-468,6
+469,8
@@
void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
// 4 and 5 are reserved for SUBNET and WEIGHT
xasprintf(&envp[6], "REMOTEADDRESS=%s", address);
xasprintf(&envp[7], "REMOTEPORT=%s", port);
// 4 and 5 are reserved for SUBNET and WEIGHT
xasprintf(&envp[6], "REMOTEADDRESS=%s", address);
xasprintf(&envp[7], "REMOTEPORT=%s", port);
+ free(port);
+ free(address);
}
name = up ? "subnet-up" : "subnet-down";
}
name = up ? "subnet-up" : "subnet-down";
@@
-478,7
+481,7
@@
void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
if(!net2str(netstr, sizeof netstr, subnet))
continue;
// Strip the weight from the subnet, and put it in its own environment variable
if(!net2str(netstr, sizeof netstr, subnet))
continue;
// Strip the weight from the subnet, and put it in its own environment variable
- char *weight = strchr(netstr
+ 7
, '#');
+ char *weight = strchr(netstr, '#');
if(weight)
*weight++ = 0;
else
if(weight)
*weight++ = 0;
else
@@
-495,9
+498,9
@@
void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
execute_script(name, envp);
}
} else {
execute_script(name, envp);
}
} else {
- if(net2str(netstr
+ 7, sizeof netstr - 7
, subnet)) {
+ if(net2str(netstr
, sizeof netstr
, subnet)) {
// Strip the weight from the subnet, and put it in its own environment variable
// Strip the weight from the subnet, and put it in its own environment variable
- char *weight = strchr(netstr
+ 7
, '#');
+ char *weight = strchr(netstr, '#');
if(weight)
*weight++ = 0;
else
if(weight)
*weight++ = 0;
else
@@
-511,23
+514,23
@@
void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
}
}
}
}
- for(i = 0; envp[i] && i <
9
; i++)
+ for(i = 0; envp[i] && i <
8
; i++)
free(envp[i]);
}
free(envp[i]);
}
-
void dump_subnets(void
) {
+
bool dump_subnets(connection_t *c
) {
char netstr[MAXNETSTR];
subnet_t *subnet;
char netstr[MAXNETSTR];
subnet_t *subnet;
- avl_node_t *node;
-
- logger(LOG_DEBUG, "Subnet list:");
+ splay_node_t *node;
for(node = subnet_tree->head; node; node = node->next) {
subnet = node->data;
if(!net2str(netstr, sizeof netstr, subnet))
continue;
for(node = subnet_tree->head; node; node = node->next) {
subnet = node->data;
if(!net2str(netstr, sizeof netstr, subnet))
continue;
- logger(LOG_DEBUG, " %s owner %s", netstr, subnet->owner->name);
+ send_request(c, "%d %d %s owner %s",
+ CONTROL, REQ_DUMP_SUBNETS,
+ netstr, subnet->owner->name);
}
}
-
logger(LOG_DEBUG, "End of subnet list."
);
+
return send_request(c, "%d %d", CONTROL, REQ_DUMP_SUBNETS
);
}
}