From e3a089b56a2365c089f99809b111bfe3380518cd Mon Sep 17 00:00:00 2001 From: Anjan Chanda <anjan.chanda@iopsys.eu> Date: Mon, 14 Aug 2023 14:56:53 +0200 Subject: [PATCH] show 'active_last_change' for host entry --- src/neigh.c | 9 +++++++-- src/neigh.h | 1 + src/ubus.c | 13 ++++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/neigh.c b/src/neigh.c index e040f94..1d42f3c 100644 --- a/src/neigh.c +++ b/src/neigh.c @@ -318,6 +318,7 @@ struct neigh_entry *neigh_entry_create(void *priv, uint8_t *macaddr, uint16_t st if (type != NEIGH_TYPE_UNKNOWN) e->type = type; + time(&e->lastchange); getcurrtime(&tsp); e->ageing_time = timeout; timeradd_msecs(&tsp, e->ageing_time, &e->ageing_tmo); @@ -651,6 +652,7 @@ void neigh_set_unreachable(void *nq, const char *ifname, int val) //struct neigh_history_entry *he = NULL; e->unreachable = val; + time(&e->lastchange); err(MACFMT " marking it %sreachable\n", MAC2STR(e->macaddr), val ? "un" : ""); @@ -685,6 +687,7 @@ void neigh_mark_reachable(void *nq, uint8_t *macaddr, const char *ifname) //struct neigh_history_entry *he = NULL; e->unreachable = 0; + time(&e->lastchange); err("Marking " MACFMT " reachable through %s\n", MAC2STR(e->macaddr), ifname); @@ -882,10 +885,12 @@ struct neigh_entry *neigh_enqueue(void *nq, uint8_t *macaddr, uint16_t state, timer_del(&e->delete_timer); e->delete_pending = 0; - e->probing = 0; e->probe_cnt = 0; - e->unreachable = 0; + if (e->unreachable) { + e->unreachable = 0; + time(&e->lastchange); + } /* reset ageing timer for entry */ e->ageing_time = timeout; diff --git a/src/neigh.h b/src/neigh.h index 46f2350..6a9296b 100644 --- a/src/neigh.h +++ b/src/neigh.h @@ -77,6 +77,7 @@ struct neigh_entry { atimer_t probing_timer; int unreachable; /* mark entry nonreachable */ + time_t lastchange; /* last time when reachable state toggled */ int delete_pending; atimer_t delete_timer; uint32_t ageing_time; /* in msecs */ diff --git a/src/ubus.c b/src/ubus.c index e86b995..080f1f6 100644 --- a/src/ubus.c +++ b/src/ubus.c @@ -382,11 +382,11 @@ int hostmngr_ubus_dump_topology(struct ubus_context *ctx, struct ubus_object *ob struct blob_buf bi = {0}; struct blob_buf bo = {0}; uint32_t id; - int ret = 0; + int ret; id = lookup_object(p->bus, topology_objname); if (id == OBJECT_INVALID) - return UBUS_STATUS_NOT_FOUND; + return UBUS_STATUS_OK; /* ubus call topology dump */ blob_buf_init(&bi, 0); @@ -398,7 +398,7 @@ int hostmngr_ubus_dump_topology(struct ubus_context *ctx, struct ubus_object *ob blob_buf_free(&bi); blob_buf_free(&bo); - return ret; + return UBUS_STATUS_OK; } int hostmngr_ubus_show_arptable(struct ubus_context *ctx, struct ubus_object *obj, @@ -478,8 +478,10 @@ int hostmngr_ubus_show_hosts(struct ubus_context *ctx, struct ubus_object *obj, char statestr[128] = {0}; char ip4buf[32] = {0}; char *ifname = NULL; + char tbuf[64] = {0}; char *net = NULL; uint16_t brport; + struct tm *t; void *wt; //if (e->unreachable) @@ -489,6 +491,11 @@ int hostmngr_ubus_show_hosts(struct ubus_context *ctx, struct ubus_object *obj, aa = blobmsg_open_table(&bb, ""); blobmsg_add_u8(&bb, "active", e->unreachable ? false : true); + + t = localtime(&e->lastchange); + strftime(tbuf, sizeof(tbuf), "%Y-%m-%dT%H:%M:%S", t); + blobmsg_add_string(&bb, "active_last_change", tbuf); + hwaddr_ntoa(e->macaddr, macstr); blobmsg_add_string(&bb, "macaddr", macstr); blobmsg_add_string(&bb, "hostname", e->hostname); -- GitLab