+
+void
+device_dump_status(struct blob_buf *b, struct device *dev)
+{
+ struct device_settings st;
+ void *c, *s;
+
+ if (!dev) {
+ avl_for_each_element(&devices, dev, avl) {
+ if (!dev->present)
+ continue;
+ c = blobmsg_open_table(b, dev->ifname);
+ device_dump_status(b, dev);
+ blobmsg_close_table(b, c);
+ }
+
+ return;
+ }
+
+ blobmsg_add_u8(b, "external", dev->external);
+ blobmsg_add_u8(b, "present", dev->present);
+ blobmsg_add_string(b, "type", dev->type->name);
+
+ if (!dev->present)
+ return;
+
+ blobmsg_add_u8(b, "up", !!dev->active);
+ if (dev->type->dump_info)
+ dev->type->dump_info(dev, b);
+ else
+ system_if_dump_info(dev, b);
+
+ if (dev->active) {
+ device_merge_settings(dev, &st);
+ if (st.flags & DEV_OPT_MTU)
+ blobmsg_add_u32(b, "mtu", st.mtu);
+ if (st.flags & DEV_OPT_MACADDR)
+ blobmsg_add_string(b, "macaddr", format_macaddr(st.macaddr));
+ if (st.flags & DEV_OPT_TXQUEUELEN)
+ blobmsg_add_u32(b, "txqueuelen", st.txqueuelen);
+ }
+
+ s = blobmsg_open_table(b, "statistics");
+ if (dev->type->dump_stats)
+ dev->type->dump_stats(dev, b);
+ else
+ system_if_dump_stats(dev, b);
+ blobmsg_close_table(b, s);
+}