spotfilter: use ARP as fallback for IP discovery

Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
John Crispin
2024-05-02 13:50:34 +02:00
parent 37b234800c
commit ba93041afc
5 changed files with 11 additions and 6 deletions

View File

@@ -13,6 +13,7 @@ struct cache_entry {
struct avl_node node;
uint8_t macaddr[ETH_ALEN];
uint32_t arp_ip4addr;
bool arp;
uint32_t ip4addr;
uint32_t ip6addr[4];
uint32_t time;
@@ -214,16 +215,19 @@ out:
return c;
}
void client_set_ipaddr(const void *mac, const void *addr, bool ipv6)
void client_set_ipaddr(const void *mac, const void *addr, bool ipv6, bool arp)
{
struct interface *iface;
struct cache_entry *c;
struct client *cl;
c = client_get_cache_entry(mac);
if (!ipv6 && !c->ip4addr)
if (!ipv6 && arp && c->arp)
return;
if (!ipv6 && (!c->ip4addr || c->arp)) {
memcpy(&c->ip4addr, addr, sizeof(c->ip4addr));
else if (ipv6 && !c->ip6addr[0])
c->arp = arp;
} else if (ipv6 && !c->ip6addr[0])
memcpy(&c->ip6addr, addr, sizeof(c->ip6addr));
else
return;

View File

@@ -25,7 +25,7 @@ int client_set(struct interface *iface, const void *addr, const char *id,
int state, int dns_state, int accounting, struct blob_attr *data,
const char *device, bool flush);
void client_free(struct interface *iface, struct client *cl);
void client_set_ipaddr(const void *mac, const void *addr, bool ipv6);
void client_set_ipaddr(const void *mac, const void *addr, bool ipv6, bool arp);
void client_set_arp_ipaddr(const void *mac, const void *addr);
void client_init_interface(struct interface *iface);

View File

@@ -106,6 +106,6 @@ void spotfilter_recv_dhcpv4(const void *msgdata, int len, const void *eth_addr)
if (op != DHCPV4_MSG_ACK)
return;
client_set_ipaddr(msg->chaddr, (uint32_t *)&msg->yiaddr, false);
client_set_ipaddr(msg->chaddr, (uint32_t *)&msg->yiaddr, false, false);
}

View File

@@ -42,5 +42,5 @@ void spotfilter_recv_icmpv6(const void *data, int len, const uint8_t *src, const
if (opt != (const struct icmpv6_opt *)(data + len))
return;
client_set_ipaddr(src, &nd->nd_na_target, true);
client_set_ipaddr(src, &nd->nd_na_target, true, false);
}

View File

@@ -441,6 +441,7 @@ spotfilter_packet_cb(struct packet *pkt)
break;
client_set_arp_ipaddr(eth->h_source, &arp->src_ip);
client_set_ipaddr(eth->h_source, &arp->src_ip, false, true);
break;
case ETH_P_IP:
ip = pkt_peek(pkt, sizeof(struct ip));