diff --git a/src/cntlr_ubus_dbg.c b/src/cntlr_ubus_dbg.c index 91a5ad8f0247321569ee89c1acc958c2dfcdea10..b691d0b1ad5aa7f0c31402ca27aac5e75db3b6c2 100644 --- a/src/cntlr_ubus_dbg.c +++ b/src/cntlr_ubus_dbg.c @@ -47,7 +47,8 @@ #include "cntlr_ubus.h" #include "cntlr_tlv.h" #include "cntlr_cmdu.h" - +#include "backhaul_topology.h" +#include "backhaul_topology_dbg.h" #define OBJECT_INVALID ((uint32_t)-1) @@ -167,6 +168,68 @@ static int cntlr_dbg_clear_steer_summary(struct ubus_context *ctx, struct ubus_o return UBUS_STATUS_OK; } +static int cntrl_dbg_bh_topology_dump(struct ubus_context *ctx, + struct ubus_object *obj, + struct ubus_request_data *req, + const char *method, struct blob_attr *msg) +{ + 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"); + + if (is_bh_topology_valid()) { + list_for_each_entry(node, &c->nodelist, list) { + const struct bh_topology_dev *topo_dev = + find_bh_topology_device(node->alid); + if (topo_dev && + topo_dev->bh_info.level_in_tree != UNKNOWN_TREE_LEVEL) { + void *dev_table = blobmsg_open_table(&bb, ""); + const struct backhaul_info *bh_info = + &topo_dev->bh_info; + + 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); + blobmsg_add_u16(&bb, "wifi_hops_from_root", bh_info->wifi_hops_from_root); + + /* If device is not root device */ + if (bh_info->parent_in_tree) { + void *bh_table = blobmsg_open_table(&bb, "bh_info"); + + blobmsg_add_string(&bb, "parent_in_tree", + hwaddr_ntoa(bh_info->parent_in_tree->al_macaddr, macaddrstr)); + blobmsg_add_string(&bb, "link_type", + i1905_media_type_to_str(bh_info->parent_iface->media_type)); + blobmsg_add_string(&bb, "parent_iface", + hwaddr_ntoa(bh_info->parent_iface->macaddr, macaddrstr)); + + if (bh_info->own_iface) { + blobmsg_add_string(&bb, "own_iface", + hwaddr_ntoa(bh_info->own_iface->macaddr, macaddrstr)); + } + + blobmsg_close_table(&bb, bh_table); + } + + + blobmsg_close_table(&bb, dev_table); + } + } + } + + + blobmsg_close_array(&bb, devs_arr); + ubus_send_reply(ctx, req, bb.head); + blob_buf_free(&bb); + + return UBUS_STATUS_OK; +} + #if (EASYMESH_VERSION > 2) static int cntlr_dbg_list_uris(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, @@ -244,6 +307,7 @@ int cntlr_publish_dbg_object(struct controller *c, const char *objname) UBUS_METHOD_NOARG("list_macs", cntlr_dbg_list_macs), UBUS_METHOD("clear_steer_summary", cntlr_dbg_clear_steer_summary, clr_steer_summary_params), + UBUS_METHOD_NOARG("bh_topology_dump", cntrl_dbg_bh_topology_dump), #if (EASYMESH_VERSION > 2) UBUS_METHOD_NOARG("list_uris", cntlr_dbg_list_uris), #endif