diff --git a/src/hostmngr.c b/src/hostmngr.c
index c04dfc60a81636e1c8d25c3731919b41b61c98f0..eb24ae45d9f35b5b23ac8337e779790979995251 100644
--- a/src/hostmngr.c
+++ b/src/hostmngr.c
@@ -490,8 +490,10 @@ int hostmngr_get_neigh_hostname(struct neigh_queue *q, uint8_t *macaddr)
return -1;
ret = read_dhcpv4_lease_table(&entries, &num);
- if (ret || num <= 0)
- return -1;
+ if (ret || num <= 0) {
+ ret = -1;
+ goto out;
+ }
dbg("%s: num-dhcphosts = %d\n", __func__, num);
hosts = (struct dhcp_clients *)entries;
@@ -503,6 +505,7 @@ int hostmngr_get_neigh_hostname(struct neigh_queue *q, uint8_t *macaddr)
e->ipv4.family = AF_INET;
e->leasetime = h->leasetime;
e->ipv4_type_dhcp = 1;
+ e->ipv4_type_static = 0;
ipn = neigh_ip_entry_lookup2(priv, &e->ipv4);
if (ipn) {
@@ -511,12 +514,24 @@ int hostmngr_get_neigh_hostname(struct neigh_queue *q, uint8_t *macaddr)
dbg("Host " MACFMT " with ip = %s (0x%x) added to iptable\n",
MAC2STR(e->macaddr), h->ipv4, e->ipv4.addr.ip4.s_addr);
}
+
ret = 0;
break;
}
}
- free(entries);
+
+out:
+ /* if lease table has been consulted before with no results
+ * assume static IP address
+ */
+ if (e->event_pending && !strlen(e->hostname)) {
+ e->ipv4_type_static = 1;
+ e->ipv4_type_dhcp = 0;
+ }
+
+ if (entries)
+ free(entries);
return ret;
}
diff --git a/src/neigh.c b/src/neigh.c
index cc99ae2e026e6ee0fb0e1d8ac4b2c65b04d79630..d18a3d8209bb4daefcaad62da69580211e5c0a87 100644
--- a/src/neigh.c
+++ b/src/neigh.c
@@ -830,6 +830,7 @@ void neigh_mark_reachable(void *nq, uint8_t *macaddr, const char *ifname)
//struct neigh_history_entry *he = NULL;
if (e->unreachable) {
+ hostmngr_get_neigh_hostname(q, macaddr);
e->unreachable = 0;
time(&e->lastchange);
err("Marking " MACFMT " reachable through %s\n",
@@ -837,7 +838,10 @@ void neigh_mark_reachable(void *nq, uint8_t *macaddr, const char *ifname)
memset(e->ifname, 0, sizeof(e->ifname));
strncpy(e->ifname, ifname, strlen(ifname));
- hostmngr_host_event(priv, HOST_EVENT_CONNECT, e);
+ if (e->ipv4_type_static || strlen(e->hostname))
+ hostmngr_host_event(priv, HOST_EVENT_CONNECT, e);
+ else
+ e->event_pending = 1;
}
/*
he = neigh_history_lookup(nq, e->macaddr);
@@ -1103,7 +1107,7 @@ void hostmngr_get_wifi_stations(struct hostmngr_private *priv,
neigh_history_enqueue(priv, new,
priv->cfg.history_ageout);
- if (!ipaddr_is_zero(&new->ipv4))
+ if (!ipaddr_is_zero(&new->ipv4) && (new->ipv4_type_static || strlen(new->hostname)))
hostmngr_host_event(priv, HOST_EVENT_CONNECT, new);
else
new->event_pending = 1;
@@ -1187,7 +1191,9 @@ struct neigh_entry *neigh_enqueue(void *nq, uint8_t *macaddr, uint16_t state,
if (ip) {
/* can get overridden by dhcp lease entry */
if (ip->family == AF_INET) {
- if (!ipaddr_equal(&e->ipv4, ip)) {
+ hostmngr_get_neigh_hostname(q, e->macaddr);
+
+ if (!ipaddr_equal(&e->ipv4, ip) && (e->ipv4_type_static || strlen(e->hostname))) {
memcpy(&e->ipv4, ip, sizeof(*ip));
e->event_pending = 0;
hostmngr_host_event(priv, HOST_EVENT_CONNECT, e);
@@ -1213,6 +1219,18 @@ struct neigh_entry *neigh_enqueue(void *nq, uint8_t *macaddr, uint16_t state,
list_add_tail(&new->list, &e->iplist);
}
}
+
+ /* can get overridden by dhcp lease entry */
+ if (ip->family == AF_INET) {
+ if (!ipaddr_equal(&e->ipv4, ip)) {
+ memcpy(&e->ipv4, ip, sizeof(*ip));
+ if (e->ipv4_type_static || strlen(e->hostname)) {
+ e->event_pending = 0;
+ hostmngr_host_event(priv, HOST_EVENT_CONNECT, e);
+ } else
+ e->event_pending = 1;
+ }
+ }
}
if (!timer_pending(&q->ageing_timer)) {
diff --git a/src/neigh.h b/src/neigh.h
index e9bf546652a06dc853782572aa5f34ab8bba8a93..2291f939870d9f514b9cb1a876cd41a5d35a5a03 100644
--- a/src/neigh.h
+++ b/src/neigh.h
@@ -74,6 +74,7 @@ struct neigh_entry {
char hostname[256];
struct ip_address ipv4; /* from dhcp-lease table or neigh cache */
int ipv4_type_dhcp; /* set 1 when dhcp assigned ipv4 address */
+ int ipv4_type_static; /* set 1 on statically assigned ipv4 address */
unsigned long leasetime; /* lease time() end if dhcp addresses */
struct list_head iflist; /* list of struct node_interface */
struct list_head iplist; /* list of struct ip_address_entry */
diff --git a/src/netlink.c b/src/netlink.c
index 42d8e153aede897c68effc7908e1751ec0a6754a..6c7e50717e0022d1ab273795bdb2518a41bdeda5 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -202,7 +202,7 @@ static int hostmngr_handle_neigh_tbl_change(struct hostmngr_private *priv, bool
return 0;
}
- if (e->event_pending && !ipaddr_is_zero(&e->ipv4)) {
+ if (e->event_pending && !ipaddr_is_zero(&e->ipv4) && strlen(e->hostname)) {
e->event_pending = 0;
hostmngr_host_event(priv, HOST_EVENT_CONNECT, e);
}
@@ -218,7 +218,11 @@ static int hostmngr_handle_neigh_tbl_change(struct hostmngr_private *priv, bool
/* add/update history cache for this neigh */
neigh_history_enqueue(priv, new, priv->cfg.history_ageout);
- hostmngr_host_event(priv, HOST_EVENT_CONNECT, new);
+ if (new->ipv4_type_static || strlen(new->hostname))
+ hostmngr_host_event(priv, HOST_EVENT_CONNECT, new);
+ else
+ new->event_pending = 1;
+
}
diff --git a/src/ubus.c b/src/ubus.c
index 66095e305a03d2459751e792468b237fc8048235..6a5bfd040fceac4d050ca500c14ab5eea0761e36 100644
--- a/src/ubus.c
+++ b/src/ubus.c
@@ -426,7 +426,7 @@ static void hostmngr_1905topology_cb(struct ubus_request *req, int type,
neigh_history_enqueue(priv, rn,
priv->cfg.history_ageout);
- if (!ipaddr_is_zero(&rn->ipv4))
+ if (!ipaddr_is_zero(&rn->ipv4) && (rn->ipv4_type_static || strlen(rn->hostname)))
hostmngr_host_event(priv, HOST_EVENT_CONNECT, rn);
else
rn->event_pending = 1;
@@ -1277,12 +1277,11 @@ static void hostmngr_wifi_sta_event_handler(struct hostmngr_private *p,
if (new) {
/* new wifi neigh added */
hostmngr_get_neigh_hostname(&p->neigh_q, macaddr);
-
/* add/update history cache for this neigh */
neigh_history_enqueue(p, new,
p->cfg.history_ageout);
- if (!ipaddr_is_zero(&new->ipv4))
+ if (!ipaddr_is_zero(&new->ipv4) && (new->ipv4_type_static || strlen(new->hostname)))
hostmngr_host_event(p, HOST_EVENT_CONNECT, new);
else
new->event_pending = 1;