diff --git a/src/i1905_ubus.c b/src/i1905_ubus.c index f685ed8f389ca9d9750ab63a0c1d8be04796ad81..4da6c24adacbb2b049dc979f263dd7b4f0fef3ad 100644 --- a/src/i1905_ubus.c +++ b/src/i1905_ubus.c @@ -188,6 +188,7 @@ static int i1905_ubus_dump_info(struct i1905_private *priv, struct blob_buf *bb) struct i1905_selfdevice *self = &priv->dm.self; struct i1905_config *cfg = &priv->cfg; //struct i1905_registrar_config *r; + struct i1905_master_interface *mif; int num_immediate_neighbors = 0; struct i1905_interface *iface; struct i1905_vendor_info *ven; @@ -207,6 +208,12 @@ static int i1905_ubus_dump_info(struct i1905_private *priv, struct blob_buf *bb) blobmsg_add_string(bb, "ieee1905id", almacstr); blobmsg_add_string(bb, "status", "enabled"); + blobmsg_add_string(bb, "name", self->name); + blobmsg_add_string(bb, "manufacturer", self->manufacturer); + blobmsg_add_string(bb, "model", self->model); + blobmsg_add_string(bb, "url", self->url ? self->url : ""); + + if (cfg->registrar) { blobmsg_add_u8(bb, "registrar", true); a = blobmsg_open_array(bb, "registrar_band"); @@ -231,8 +238,12 @@ static int i1905_ubus_dump_info(struct i1905_private *priv, struct blob_buf *bb) char ifmacstr[18] = {0}; struct i1905_vendor_info *v; struct i1905_neighbor_interface *link; + struct i1905_non1905_neighbor *nnbr; char ouistring[7] = {0}; char parent[16] = {0}; + int iface_num_ipv4 = 0; + int iface_num_ipv6 = 0; + int j = 0; if (iface->invalid) continue; @@ -251,6 +262,20 @@ static int i1905_ubus_dump_info(struct i1905_private *priv, struct blob_buf *bb) "up" : "down"); blobmsg_add_string(bb, "media", media_type2str(iface->media)); + if (IS_MEDIA_WIFI(iface->media)) { + struct ieee80211_info *winfo; + char bssidstr[18] = {0}; + + winfo = (struct ieee80211_info *)iface->mediainfo; + if (winfo) { + hwaddr_ntoa(winfo->bssid, bssidstr); + blobmsg_add_string(bb, "bssid", bssidstr); + blobmsg_add_string(bb, "role", role_type2str(winfo->role)); + blobmsg_add_u32(bb, "bandwidth", winfo->ap_bandwidth); + blobmsg_add_u32(bb, "freq_seg0_idx", winfo->ap_channel_seg0_idx); + blobmsg_add_u32(bb, "freq_seg1_idx", winfo->ap_channel_seg1_idx); + } + } sprintf(ouistring, "%02x%02x%02x", iface->genphy.oui[0], iface->genphy.oui[1], iface->genphy.oui[2]); @@ -273,13 +298,70 @@ static int i1905_ubus_dump_info(struct i1905_private *priv, struct blob_buf *bb) blobmsg_add_u32(bb, "num_vendor_properties", iface->num_vendor); a = blobmsg_open_array(bb, "properties"); list_for_each_entry(v, &iface->vendorlist, list) { + void *t; + + t = blobmsg_open_table(bb, ""); blobmsg_add_string(bb, "oui", ""); blobmsg_add_string(bb, "data", ""); + blobmsg_close_table(bb, t); } blobmsg_close_array(bb, a); - blobmsg_add_u32(bb, "num_links", iface->num_links); + for (j = 0; j < iface->num_ipaddrs; j++) { + if (iface->ipaddrs[j].family == AF_INET) + iface_num_ipv4++; + else if (iface->ipaddrs[j].family == AF_INET6) + iface_num_ipv6++; + } + + blobmsg_add_u32(bb, "num_ipv4", iface_num_ipv4); + a = blobmsg_open_array(bb, "ipv4_address"); + for (j = 0; j < iface->num_ipaddrs; j++) { + char ipbuf[256] = {0}; + void *t; + + if (iface->ipaddrs[j].family != AF_INET) + continue; + + t = blobmsg_open_table(bb, ""); + inet_ntop(AF_INET, &iface->ipaddrs[j].addr.ip4, ipbuf, sizeof(ipbuf)); + blobmsg_add_string(bb, "ip", ipbuf); + blobmsg_add_string(bb, "type", ipv4_type2str(IPV4_TYPE_UNKNOWN)); + blobmsg_add_string(bb, "dhcpserver", "0.0.0.0"); + blobmsg_close_table(bb, t); + } + blobmsg_close_array(bb, a); + + blobmsg_add_u32(bb, "num_ipv6", iface_num_ipv6); + a = blobmsg_open_array(bb, "ipv6_address"); + for (j = 0; j < iface->num_ipaddrs; j++) { + char ipbuf[256] = {0}; + void *t; + + if (iface->ipaddrs[j].family != AF_INET6) + continue; + t = blobmsg_open_table(bb, ""); + inet_ntop(AF_INET6, &iface->ipaddrs[j].addr.ip6, ipbuf, sizeof(ipbuf)); + blobmsg_add_string(bb, "ip", ipbuf); + blobmsg_add_string(bb, "type", ipv6_type2str(IPV6_TYPE_UNKNOWN)); + blobmsg_add_string(bb, "dhcpserver", "::"); + blobmsg_close_table(bb, t); + } + blobmsg_close_array(bb, a); + + blobmsg_add_u32(bb, "num_neighbor_non1905", iface->num_neighbor_non1905); + a = blobmsg_open_array(bb, "non1905_neighbors"); + list_for_each_entry(nnbr, &iface->non1905_nbrlist, list) { + char xnbr[18] = {0}; + + hwaddr_ntoa(nnbr->macaddr, xnbr); + blobmsg_add_string(bb, "", xnbr); + } + blobmsg_close_array(bb, a); + + + blobmsg_add_u32(bb, "num_links", iface->num_links); a = blobmsg_open_array(bb, "links"); list_for_each_entry(link, &iface->nbriflist, list) { char peer_macstr[18] = {0}; @@ -293,7 +375,6 @@ static int i1905_ubus_dump_info(struct i1905_private *priv, struct blob_buf *bb) hwaddr_ntoa(link->aladdr, peer_almacstr); blobmsg_add_string(bb, "ieee1905id", peer_almacstr); blobmsg_add_u8(bb, "direct", link->direct ? true : false); - blobmsg_add_string(bb, "media", media_type2str(link->media)); rdev = i1905_dm_neighbor_lookup(iface, link->aladdr); @@ -317,7 +398,6 @@ static int i1905_ubus_dump_info(struct i1905_private *priv, struct blob_buf *bb) blobmsg_add_u32(bb, "rssi", link->metric.rssi); blobmsg_close_table(bb, tt); - blobmsg_close_table(bb, t); } blobmsg_close_array(bb, a); @@ -325,6 +405,36 @@ static int i1905_ubus_dump_info(struct i1905_private *priv, struct blob_buf *bb) } blobmsg_close_array(bb, aa); + /* show brtuples for selfdevice */ + a = blobmsg_open_array(bb, "bridge_tuples"); + list_for_each_entry(mif, &self->miflist, list) { + char brifs[32][16] = {0}; + int n = 32; + int ret; + void *tt; + int i; + + ret = br_get_iflist(mif->ifname, &n, brifs); + if (ret) + break; + + if (n == 0) + continue; + + tt = blobmsg_open_table(bb, ""); + aaaa = blobmsg_open_array(bb, "tuple"); + for (i = 0; i < n; i++) { + char macstr[18] = {0}; + uint8_t macaddr[6] = {0}; + + if_gethwaddr(brifs[i], macaddr); + hwaddr_ntoa(macaddr, macstr); + blobmsg_add_string(bb, "", macstr); + } + blobmsg_close_array(bb, aaaa); + blobmsg_close_table(bb, tt); + } + blobmsg_close_array(bb, a); a = blobmsg_open_table(bb, "topology"); blobmsg_add_u8(bb, "enabled", self->topology.enable ? true : false);