From b4ed36251d99223de8f101b4e5efb02b44458a5d Mon Sep 17 00:00:00 2001 From: Kamil Zulewski <kamil.zulewski@iopsys.eu> Date: Tue, 18 Jul 2023 12:06:39 +0200 Subject: [PATCH] Add timestamps to bh_topology_dump Timestamps showing last topology resposne from device and information about bh_topology validity added to ubus call output. --- src/backhaul_topology.c | 4 ++++ src/backhaul_topology.h | 7 +++++++ src/backhaul_topology_dbg.c | 2 ++ src/cntlr_map.c | 3 +++ src/cntlr_ubus_dbg.c | 11 +++++++---- src/utils/utils.c | 4 ++-- src/utils/utils.h | 4 ++-- 7 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/backhaul_topology.c b/src/backhaul_topology.c index f5a5b628..6e5285b4 100644 --- a/src/backhaul_topology.c +++ b/src/backhaul_topology.c @@ -300,6 +300,10 @@ void copy_neighbor_info_from_tlvs(const struct tlv_1905neighbor **neighbor_tlvs, } +void set_bh_toplogy_response_timestamp(struct bh_topology_dev *bh_topo_dev) +{ + timestamp_update(&bh_topo_dev->last_topo_response); +} static void clear_backhaul_tree_relations(struct list_head *bh_topo_dev_list) { diff --git a/src/backhaul_topology.h b/src/backhaul_topology.h index fbad280f..02ceaa97 100644 --- a/src/backhaul_topology.h +++ b/src/backhaul_topology.h @@ -3,6 +3,7 @@ #include <libubox/list.h> #include <stdint.h> +#include <time.h> struct tlv_device_info; struct tlv_1905neighbor; @@ -35,6 +36,7 @@ struct backhaul_info { /** Represents single device and its relation to neighbors in BH tree. */ struct bh_topology_dev { struct list_head list_element; + struct timespec last_topo_response; uint8_t al_macaddr[6]; uint8_t number_of_interfaces; @@ -106,6 +108,11 @@ void copy_neighbor_info_from_tlvs(const struct tlv_1905neighbor **neighbor_tlvs, uint8_t tlv_number, struct bh_topology_dev *bh_topo_dev); +/** + * Shall be called each time device provides topology response. + */ +void set_bh_toplogy_response_timestamp(struct bh_topology_dev *bh_topo_dev); + /** * Builds backhaul topology tree from unordered list of bh_topology_dev structs * by setting backhaul_info fields. diff --git a/src/backhaul_topology_dbg.c b/src/backhaul_topology_dbg.c index dcd7e2b0..27a5b37d 100644 --- a/src/backhaul_topology_dbg.c +++ b/src/backhaul_topology_dbg.c @@ -1,6 +1,7 @@ #include "backhaul_topology_dbg.h" #include "backhaul_topology.h" #include "utils/debug.h" +#include "utils/utils.h" #include <easy/utils.h> #include <libubox/list.h> @@ -82,6 +83,7 @@ void dbg_dump_bh_topo_dev(const struct bh_topology_dev *bh_topo_dev, int i; dbg("%s bh_topology_dev:\n", pref); + dbg("%s .last_topo_response: %u\n", pref, timestamp_elapsed_sec(&bh_topo_dev->last_topo_response)); dbg("%s .al_macaddr: " MACFMT "\n", pref, MAC2STR(bh_topo_dev->al_macaddr)); dbg("%s .number_of_interfaces: %d\n", pref, bh_topo_dev->number_of_interfaces); dbg("%s .num_of_ifaces_with_neighbors: %d\n", pref, bh_topo_dev->num_of_ifaces_with_neighbors); diff --git a/src/cntlr_map.c b/src/cntlr_map.c index 7acde1d6..5888d6fe 100644 --- a/src/cntlr_map.c +++ b/src/cntlr_map.c @@ -345,6 +345,8 @@ int handle_topology_response(void *cntlr, struct cmdu_buff *cmdu, struct node *n new_bh_topo_dev = true; } + set_bh_toplogy_response_timestamp(bh_topo_dev); + if (new_bh_topo_dev || has_interface_info_changed(tlv_dev_info, bh_topo_dev)) { @@ -355,6 +357,7 @@ int handle_topology_response(void *cntlr, struct cmdu_buff *cmdu, struct node *n copy_interface_info_from_tlv(tlv_dev_info, bh_topo_dev); } + } if (!bh_topo_dev) { diff --git a/src/cntlr_ubus_dbg.c b/src/cntlr_ubus_dbg.c index b691d0b1..30457b6b 100644 --- a/src/cntlr_ubus_dbg.c +++ b/src/cntlr_ubus_dbg.c @@ -176,13 +176,15 @@ static int cntrl_dbg_bh_topology_dump(struct ubus_context *ctx, struct controller *c = container_of(obj, struct controller, obj_dbg); struct node *node; struct blob_buf bb = { 0 }; - void *devs_arr; char macaddrstr[18] = { 0 }; blob_buf_init(&bb, 0); - devs_arr = blobmsg_open_array(&bb, "bh_topology_devs"); + + blobmsg_add_string(&bb, "topology_model_valid", is_bh_topology_valid() ? "Yes":"No"); if (is_bh_topology_valid()) { + void *devs_arr = blobmsg_open_array(&bb, "bh_topology_devs"); + list_for_each_entry(node, &c->nodelist, list) { const struct bh_topology_dev *topo_dev = find_bh_topology_device(node->alid); @@ -192,6 +194,8 @@ static int cntrl_dbg_bh_topology_dump(struct ubus_context *ctx, const struct backhaul_info *bh_info = &topo_dev->bh_info; + blobmsg_add_u32(&bb, "time_since_topo_response", + timestamp_elapsed_sec(&topo_dev->last_topo_response)); blobmsg_add_string(&bb, "al_mac", hwaddr_ntoa(topo_dev->al_macaddr, macaddrstr)); blobmsg_add_u16(&bb, "hops_from_root", bh_info->level_in_tree); @@ -220,10 +224,9 @@ static int cntrl_dbg_bh_topology_dump(struct ubus_context *ctx, blobmsg_close_table(&bb, dev_table); } } + blobmsg_close_array(&bb, devs_arr); } - - blobmsg_close_array(&bb, devs_arr); ubus_send_reply(ctx, req, bb.head); blob_buf_free(&bb); diff --git a/src/utils/utils.c b/src/utils/utils.c index 202506b6..a872d933 100644 --- a/src/utils/utils.c +++ b/src/utils/utils.c @@ -170,7 +170,7 @@ int timestamp_invalid(struct timespec *ts) } /* Time difference in seconds */ -uint32_t timestamp_elapsed_sec(struct timespec *ts) +uint32_t timestamp_elapsed_sec(const struct timespec *ts) { struct timespec now; uint32_t elapsed; @@ -210,7 +210,7 @@ int timestamp_expired(struct timespec *a, unsigned int tmo_ms) return 0; } -char *time_to_timestamp(time_t *t, char *tsp) +char *time_to_timestamp(const time_t *t, char *tsp) { char tmpbuf[64] = {0}; struct tm res; diff --git a/src/utils/utils.h b/src/utils/utils.h index 2fbebcaa..154c5031 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -45,9 +45,9 @@ int hwaddr_from_ip(char *ifname, char *ipstr, unsigned char *hw); void timestamp_reset(struct timespec *ts); void timestamp_update(struct timespec *ts); int timestamp_invalid(struct timespec *ts); -uint32_t timestamp_elapsed_sec(struct timespec *ts); +uint32_t timestamp_elapsed_sec(const struct timespec *ts); int timestamp_expired(struct timespec *a, unsigned int tmo_ms); -char *time_to_timestamp(time_t *t, char *tsp); +char *time_to_timestamp(const time_t *t, char *tsp); time_t timestamp_to_time(const char *tsp); struct timespec time_to_timespec(time_t *t); struct timespec timestamp_to_timespec(const char *tsp, bool adj_rtime); -- GitLab