Before it would check all addresses, and not learn an address if another node
already claimed that address. This caused fast roaming to fail, the code from
commit
6f6f426b353596edca77829c0477268fc2fc1925 was never triggered.
avl_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 avl_search(owner->subnet_tree, subnet);
}
-subnet_t *lookup_subnet_mac(const mac_t *address) {
+subnet_t *lookup_subnet_mac(const node_t *owner, const mac_t *address) {
subnet_t *p, *r = NULL, subnet = {0};
avl_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];
}
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)) {
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 void dump_subnets(void);