diff --git a/src/hostmngr.c b/src/hostmngr.c index 8f7a2cd4a4e47fff4c02247bf0d9d7dc1a7e9d7b..fed6a85fc09d1cab98763375e0e2421e3ae499c8 100644 --- a/src/hostmngr.c +++ b/src/hostmngr.c @@ -350,6 +350,7 @@ void topology_update_hostname_of_neighbors(struct topologyd_private *priv, inet_aton(h->ipv4, &e->ipv4.addr.ip4); e->ipv4.family = AF_INET; e->leasetime = h->leasetime; + e->ipv4_type_dhcp = 1; ipn = neigh_ip_entry_lookup2(priv, &e->ipv4); if (ipn) { @@ -396,6 +397,7 @@ int topology_get_neigh_hostname(struct neigh_queue *q, uint8_t *macaddr) inet_aton(h->ipv4, &e->ipv4.addr.ip4); e->ipv4.family = AF_INET; e->leasetime = h->leasetime; + e->ipv4_type_dhcp = 1; ipn = neigh_ip_entry_lookup2(priv, &e->ipv4); if (ipn) { diff --git a/src/neigh.c b/src/neigh.c index 4018b25ab90debbc10631820e6486779a79be276..abe661e4a57dbb65ed2879c0e7cef6c7f32dc0f3 100644 --- a/src/neigh.c +++ b/src/neigh.c @@ -835,6 +835,9 @@ struct neigh_entry *neigh_enqueue(void *nq, uint8_t *macaddr, uint16_t state, } if (ip) { + /* can get overridden by dhcp lease entry */ + memcpy(&e->ipv4, ip, sizeof(*ip)); + list_for_each_entry(ipaddr, &e->iplist, list) { if (ipaddr_equal(&ipaddr->ip, ip)) ipknown = true; @@ -908,6 +911,9 @@ struct neigh_entry *neigh_enqueue(void *nq, uint8_t *macaddr, uint16_t state, } if (ip) { + /* can get overridden by dhcp lease entry */ + memcpy(&e->ipv4, ip, sizeof(*ip)); + list_for_each_entry(ipaddr, &e->iplist, list) { if (ipaddr_equal(&ipaddr->ip, ip)) ipknown = true; diff --git a/src/neigh.h b/src/neigh.h index 2fa923bb4b91d559257be8cec4b6c967c0c323e7..e5f68030190a5ebea25bd63d16dcf2ff917b1bb1 100644 --- a/src/neigh.h +++ b/src/neigh.h @@ -63,6 +63,7 @@ struct neigh_entry { void *cookie; 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 */ unsigned long leasetime; /* lease time() end if dhcp addresses */ struct list_head iplist; /* list of struct ip_address_entry */ struct hlist_node hlist; diff --git a/src/ubus.c b/src/ubus.c index f909fd25a01eb0da7874854c025e3caacbc18b45..4d21ce8852e06d956c0a574d54d6c11ae65ce0ca 100644 --- a/src/ubus.c +++ b/src/ubus.c @@ -359,7 +359,7 @@ int topologyd_ubus_show_hosts(struct ubus_context *ctx, struct ubus_object *obj, hlist_for_each_entry(e, &q->table[i], hlist) { struct ip_address_entry *ipv4, *ipv6; - unsigned long leasetime_rem; + long leasetime_rem; char statestr[128] = {0}; char ip4buf[32] = {0}; char *ifname = NULL; @@ -378,7 +378,11 @@ int topologyd_ubus_show_hosts(struct ubus_context *ctx, struct ubus_object *obj, inet_ntop(e->ipv4.family, &e->ipv4.addr, ip4buf, sizeof(ip4buf)); blobmsg_add_string(&bb, "ipv4addr", ip4buf); leasetime_rem = e->leasetime ? e->leasetime - (unsigned long)time(NULL) : 0; - blobmsg_add_string(&bb, "address_source", leasetime_rem ? "DHCP": "Static"); + if (leasetime_rem < 0) { + leasetime_rem = 0; + topology_get_neigh_hostname(q, e->macaddr); //TODO: move to inotify cb + } + blobmsg_add_string(&bb, "address_source", e->ipv4_type_dhcp ? "DHCP": "Static"); blobmsg_add_u32(&bb, "lease_time_remaining", leasetime_rem); blobmsg_add_u8(&bb, "iswifi", e->type == NEIGH_TYPE_WIFI ? true : false); blobmsg_add_u8(&bb, "is1905", e->is1905 ? true : false);