diff --git a/src/cntlr_ubus.c b/src/cntlr_ubus.c index e198b8954d86c7cca27298da0e4f0a4df2bddf50..c1c2389e512a01155b3d1897f2a493f45e2ec239 100644 --- a/src/cntlr_ubus.c +++ b/src/cntlr_ubus.c @@ -481,8 +481,8 @@ static char *cntrl_status_reason(uint8_t reason) return "unknown"; } -static void cntlr_status_add_opclass(struct blob_buf *bb, struct wifi_radio_opclass *opclass, - const char *name, int opclass_id) +void cntlr_status_add_opclass(struct blob_buf *bb, struct wifi_radio_opclass *opclass, + const char *name, int opclass_id) { char age[64]; void *a, *aa, *t, *tt; diff --git a/src/cntlr_ubus.h b/src/cntlr_ubus.h index f7b439e4de58cb33eb8468d52c4c56b6e2793038..4bd785889f5c6e247795da4cbcd85bafe7ee1764 100644 --- a/src/cntlr_ubus.h +++ b/src/cntlr_ubus.h @@ -32,5 +32,7 @@ int cntlr_wait_for_object_timeout(struct controller *c, void *object, int ieee1905_buildcmdu_linkmetric_resp(struct controller *c, uint16_t msg_type); int cntlr_get_ieee1905_almac(struct controller *c, uint8_t *almac); +void cntlr_status_add_opclass(struct blob_buf *bb, struct wifi_radio_opclass *opclass, + const char *name, int opclass_id); #endif /* CNTLR_UBUS_H */ diff --git a/src/cntlr_ubus_dbg.c b/src/cntlr_ubus_dbg.c index 383d059cf40685beb04156d86d76c47f6d7d2acf..f32e2ef389891d455d3354e7a443564a0b6d0b16 100644 --- a/src/cntlr_ubus_dbg.c +++ b/src/cntlr_ubus_dbg.c @@ -49,6 +49,7 @@ #include "cntlr_cmdu.h" #include "backhaul_topology.h" #include "backhaul_topology_dbg.h" +#include "cntlr_ubus.h" #define OBJECT_INVALID ((uint32_t)-1) @@ -168,6 +169,35 @@ static int cntlr_dbg_clear_steer_summary(struct ubus_context *ctx, struct ubus_o return UBUS_STATUS_OK; } +static struct wifi_radio_opclass * +cntrl_dbg_get_cur_opclass_by_bssid(struct controller *c, const unsigned char *bssid) +{ + struct node *node; + + list_for_each_entry(node, &c->nodelist, list) { + struct netif_radio *radio = NULL; + + list_for_each_entry(radio, &node->radiolist, list) { + struct netif_iface *iface = NULL; + + list_for_each_entry(iface, &radio->iflist, list) { + if (!iface->bss) + continue; + if (!iface->bss->enabled) + continue; + if (!iface->bss->is_bbss) + continue; + if (memcmp(iface->bss->bssid, bssid, 6)) + continue; + + return &radio->radio_el->cur_opclass; + } + } + } + + return NULL; +} + static int cntrl_dbg_bh_topology_dump(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, @@ -202,6 +232,7 @@ static int cntrl_dbg_bh_topology_dump(struct ubus_context *ctx, /* If device is not root device */ if (bh_info->parent_in_tree) { void *bh_table = blobmsg_open_table(&bb, "bh_info"); + struct wifi_radio_opclass *opclass; blobmsg_add_string(&bb, "parent_in_tree", hwaddr_ntoa(bh_info->parent_in_tree->al_macaddr, macaddrstr)); @@ -215,6 +246,12 @@ static int cntrl_dbg_bh_topology_dump(struct ubus_context *ctx, hwaddr_ntoa(bh_info->own_iface->macaddr, macaddrstr)); } + if ((bh_info->parent_iface->media_type >> 8) == 1) { + opclass = cntrl_dbg_get_cur_opclass_by_bssid(c, bh_info->parent_iface->macaddr); + if (opclass) + cntlr_status_add_opclass(&bb, opclass, "cur_opclass", 0); + } + blobmsg_close_table(&bb, bh_table); }