projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Free ECDSA and RSA structures when freeing a connection_t.
[tinc]
/
src
/
subnet.c
diff --git
a/src/subnet.c
b/src/subnet.c
index
29ea96d
..
bf1bda2
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
@@
-21,6
+21,7
@@
#include "system.h"
#include "splay_tree.h"
#include "system.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"
@@
-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;
@@
-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(LOG_ERR, "net2str() was called with netstr=%p, subnet=%p!", netstr, subnet);
return false;
}
return false;
}
@@
-329,8
+330,8
@@
subnet_t *lookup_subnet(const node_t *owner, const subnet_t *subnet) {
return splay_search(owner->subnet_tree, subnet);
}
return splay_search(owner->subnet_tree, subnet);
}
-subnet_t *lookup_subnet_mac(const mac_t *address) {
- subnet_t *p, *r = NULL
, subnet = {0}
;
+subnet_t *lookup_subnet_mac(const
node_t *owner, const
mac_t *address) {
+ subnet_t *p, *r = NULL;
splay_node_t *n;
int i;
splay_node_t *n;
int i;
@@
-339,20
+340,18
@@
subnet_t *lookup_subnet_mac(const mac_t *address) {
for(i = 0; i < 2; i++) {
if(!cache_mac_valid[i])
continue;
for(i = 0; i < 2; i++) {
if(!cache_mac_valid[i])
continue;
+ if(owner && cache_mac_subnet[i] && cache_mac_subnet[i]->owner != owner)
+ continue;
if(!memcmp(address, &cache_mac_address[i], sizeof *address))
return cache_mac_subnet[i];
}
// Search all subnets for a matching one
if(!memcmp(address, &cache_mac_address[i], sizeof *address))
return cache_mac_subnet[i];
}
// Search all subnets for a matching one
- subnet.type = SUBNET_MAC;
- subnet.net.mac.address = *address;
- subnet.owner = NULL;
-
- for(n = subnet_tree->head; n; n = n->next) {
+ for(n = owner ? owner->subnet_tree->head : subnet_tree->head; n; n = n->next) {
p = n->data;
p = n->data;
- if(!p || p->type !=
subnet.type
)
+ if(!p || p->type !=
SUBNET_MAC
)
continue;
if(!memcmp(address, &p->net.mac.address, sizeof *address)) {
continue;
if(!memcmp(address, &p->net.mac.address, sizeof *address)) {
@@
-373,7
+372,7
@@
subnet_t *lookup_subnet_mac(const mac_t *address) {
}
subnet_t *lookup_subnet_ipv4(const ipv4_t *address) {
}
subnet_t *lookup_subnet_ipv4(const ipv4_t *address) {
- subnet_t *p, *r = NULL
, subnet = {0}
;
+ subnet_t *p, *r = NULL;
splay_node_t *n;
int i;
splay_node_t *n;
int i;
@@
-388,15
+387,10
@@
subnet_t *lookup_subnet_ipv4(const ipv4_t *address) {
// Search all subnets for a matching one
// Search all subnets for a matching one
- subnet.type = SUBNET_IPV4;
- subnet.net.ipv4.address = *address;
- subnet.net.ipv4.prefixlength = 32;
- subnet.owner = NULL;
-
for(n = subnet_tree->head; n; n = n->next) {
p = n->data;
for(n = subnet_tree->head; n; n = n->next) {
p = n->data;
- if(!p || p->type !=
subnet.type
)
+ if(!p || p->type !=
SUBNET_IPV4
)
continue;
if(!maskcmp(address, &p->net.ipv4.address, p->net.ipv4.prefixlength)) {
continue;
if(!maskcmp(address, &p->net.ipv4.address, p->net.ipv4.prefixlength)) {
@@
-417,7
+411,7
@@
subnet_t *lookup_subnet_ipv4(const ipv4_t *address) {
}
subnet_t *lookup_subnet_ipv6(const ipv6_t *address) {
}
subnet_t *lookup_subnet_ipv6(const ipv6_t *address) {
- subnet_t *p, *r = NULL
, subnet = {0}
;
+ subnet_t *p, *r = NULL;
splay_node_t *n;
int i;
splay_node_t *n;
int i;
@@
-432,15
+426,10
@@
subnet_t *lookup_subnet_ipv6(const ipv6_t *address) {
// Search all subnets for a matching one
// Search all subnets for a matching one
- subnet.type = SUBNET_IPV6;
- subnet.net.ipv6.address = *address;
- subnet.net.ipv6.prefixlength = 128;
- subnet.owner = NULL;
-
for(n = subnet_tree->head; n; n = n->next) {
p = n->data;
for(n = subnet_tree->head; n; n = n->next) {
p = n->data;
- if(!p || p->type !=
subnet.type
)
+ if(!p || p->type !=
SUBNET_IPV6
)
continue;
if(!maskcmp(address, &p->net.ipv6.address, p->net.ipv6.prefixlength)) {
continue;
if(!maskcmp(address, &p->net.ipv6.address, p->net.ipv6.prefixlength)) {
@@
-463,7
+452,7
@@
subnet_t *lookup_subnet_ipv6(const ipv6_t *address) {
void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
splay_node_t *node;
int i;
void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
splay_node_t *node;
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[] = "";
@@
-490,7
+479,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
@@
-507,9
+496,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
@@
-523,11
+512,11
@@
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]);
}
-
int dump_subnets(struct evbuffer *out
) {
+
bool dump_subnets(connection_t *c
) {
char netstr[MAXNETSTR];
subnet_t *subnet;
splay_node_t *node;
char netstr[MAXNETSTR];
subnet_t *subnet;
splay_node_t *node;
@@
-536,10
+525,10
@@
int dump_subnets(struct evbuffer *out) {
subnet = node->data;
if(!net2str(netstr, sizeof netstr, subnet))
continue;
subnet = node->data;
if(!net2str(netstr, sizeof netstr, subnet))
continue;
-
if(evbuffer_add_printf(out, " %s owner %s\n
",
- netstr, subnet->owner->name) == -1)
-
return errno
;
+
send_request(c, "%d %d %s owner %s
",
+ CONTROL, REQ_DUMP_SUBNETS,
+
netstr, subnet->owner->name)
;
}
}
- return
0
;
+ return
send_request(c, "%d %d", CONTROL, REQ_DUMP_SUBNETS)
;
}
}