diff --git a/src/backhaul_topology.c b/src/backhaul_topology.c index f5a5b6284d88963008c4f3391fab5862da326f6f..6e5285b460f2bc5989da5ccd5f4f467d32df0b72 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 fbad280f855fc2f8cca6f24ee461ce0e2b6fcc46..02ceaa97787ef8f9a0162916e207b10d3b3d767f 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 dcd7e2b08702b1a20c0897616742752a2ca7678e..27a5b37dbd83f632f51395495c83b5af4133d4ad 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 7acde1d60fb42766843e818471374437a9d1855a..5888d6fe7d6ccc645f432949a4df0c6dd0d5e416 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 b691d0b1ad5aa7f0c31402ca27aac5e75db3b6c2..30457b6b0bcd212a96f25613faa020c25840d4aa 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 202506b60a8e87ad6570dd36924586bcf838832e..a872d933687f57ba426208a9ed1d9d7a9ea95c1d 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 2fbebcaab282fb429f89d7c52dd2b5d43d490307..154c50313f52328d972492f31bdc0e29c6e2bc62 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);