splay_node_t *node;
connection_t *c;
- subnet = lookup_subnet_mac(address);
+ subnet = lookup_subnet_mac(myself, address);
/* If we don't know this MAC address yet, store it */
/* Lookup destination address */
memcpy(&dest, &packet->data[0], sizeof dest);
- subnet = lookup_subnet_mac(&dest);
+ subnet = lookup_subnet_mac(NULL, &dest);
if(!subnet) {
broadcast_packet(source, packet);
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)) {
extern bool net2str(char *, int, const subnet_t *);
extern bool str2net(subnet_t *, const char *);
extern subnet_t *lookup_subnet(const struct node_t *, const subnet_t *);
-extern subnet_t *lookup_subnet_mac(const mac_t *);
+extern subnet_t *lookup_subnet_mac(const struct node_t *, const mac_t *);
extern subnet_t *lookup_subnet_ipv4(const ipv4_t *);
extern subnet_t *lookup_subnet_ipv6(const ipv6_t *);
extern bool dump_subnets(struct connection_t *);