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;
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
- 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;
- if(!p || p->type != subnet.type)
+ if(!p || p->type != SUBNET_MAC)
continue;
if(!memcmp(address, &p->net.mac.address, sizeof *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;
// 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;
- if(!p || p->type != subnet.type)
+ if(!p || p->type != SUBNET_IPV4)
continue;
if(!maskcmp(address, &p->net.ipv4.address, p->net.ipv4.prefixlength)) {
}
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;
// 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;
- if(!p || p->type != subnet.type)
+ if(!p || p->type != SUBNET_IPV6)
continue;
if(!maskcmp(address, &p->net.ipv6.address, p->net.ipv6.prefixlength)) {