diff --git a/src/topo_ieee1905.c b/src/topo_ieee1905.c index 63dcbaf5de615ab5d63076e54a9fa0997c5f8add..36d876e152c44349247e18ba3d6cfcc8c04f04b1 100644 --- a/src/topo_ieee1905.c +++ b/src/topo_ieee1905.c @@ -251,6 +251,9 @@ void topologyd_algo_run(struct topologyd_private *priv) dbg("sending req to " MACFMT "\n", MAC2STR(p->nbr_list[j].nbr_macid)); topologyd_send_ieee1905_topology_query(priv, p->nbr_list[j].nbr_macid); } + //Here we also need to send the topology query to neighbors + dbg("sending topology req to " MACFMT "\n", MAC2STR(p->hwaddr)); + topologyd_send_ieee1905_topology_query(priv,p->hwaddr); //Here we also need to send the query for higher layer request dbg("sending higher layer req to " MACFMT "\n", MAC2STR(p->hwaddr)); topologyd_send_ieee1905_query(priv, p->hwaddr, CMDU_TYPE_HIGHER_LAYER_QUERY, p->ingress_ifr_name, NULL); diff --git a/src/topologyd.c b/src/topologyd.c index ebda538f4b4d4407730a210f9b37d4fd7c9f6848..2ab27e573f27c455ee9045bf48a01963fd7cdec4 100644 --- a/src/topologyd.c +++ b/src/topologyd.c @@ -604,12 +604,12 @@ void topology_add_txrx_data (uint8_t *metric, struct topologyd_private *priv) if(*metric == TLV_TYPE_TRANSMITTER_LINK_METRIC) { dbg (" Inside the transmitter link metric tlv\n"); - struct transmitterLinkMetricTLV *p; + struct transmitterLinkMetricTLV *ptr; - p = (struct transmitterLinkMetricTLV *)metric; + ptr = (struct transmitterLinkMetricTLV *)metric; - memcpy(fr_al_mac_id, p->local_al_address,6); - memcpy(to_al_mac_id, p->neighbor_al_address, 6); + memcpy(fr_al_mac_id, ptr->local_al_address,6); + memcpy(to_al_mac_id, ptr->neighbor_al_address, 6); res = memcmp (fr_al_mac_id, priv->selfnode.hwaddr, 6); if (res == 0) { @@ -626,16 +626,16 @@ void topology_add_txrx_data (uint8_t *metric, struct topologyd_private *priv) res = memcmp (n->nbr_list[i].nbr_macid, to_al_mac_id, 6); if(res != 0) continue; - n->nbr_list[i].metric_num = p->transmitter_link_metrics_nr; - dbg (" Inside the transmitter link metric tlv ln_metric_num %d\n", p->transmitter_link_metrics_nr); - for (j = 0; j < p->transmitter_link_metrics_nr; j++) { - memcpy(n->nbr_list[i].ln_metric[j].nbr_ifr_addr, p->transmitter_link_metrics[j].neighbor_interface_address, 6); - n->nbr_list[i].ln_metric[j].ieee802dot1br = p->transmitter_link_metrics[j].bridge_flag; - n->nbr_list[i].ln_metric[j].tx_packet_errors = p->transmitter_link_metrics[j].packet_errors; - n->nbr_list[i].ln_metric[j].tx_packet_ok = p->transmitter_link_metrics[j].transmitted_packets; - n->nbr_list[i].ln_metric[j].tx_max_xput = p->transmitter_link_metrics[j].mac_throughput_capacity; - n->nbr_list[i].ln_metric[j].tx_link_availability = p->transmitter_link_metrics[j].link_availability; - n->nbr_list[i].ln_metric[j].tx_phy_rate = p->transmitter_link_metrics[j].phy_rate; + n->nbr_list[i].metric_num = ptr->transmitter_link_metrics_nr; + dbg (" Inside the transmitter link metric tlv ln_metric_num %d\n", ptr->transmitter_link_metrics_nr); + for (j = 0; j < ptr->transmitter_link_metrics_nr; j++) { + memcpy(n->nbr_list[i].ln_metric[j].nbr_ifr_addr, ptr->transmitter_link_metrics[j].neighbor_interface_address, 6); + n->nbr_list[i].ln_metric[j].ieee802dot1br = ptr->transmitter_link_metrics[j].bridge_flag; + n->nbr_list[i].ln_metric[j].tx_packet_errors = ptr->transmitter_link_metrics[j].packet_errors; + n->nbr_list[i].ln_metric[j].tx_packet_ok = ptr->transmitter_link_metrics[j].transmitted_packets; + n->nbr_list[i].ln_metric[j].tx_max_xput = ptr->transmitter_link_metrics[j].mac_throughput_capacity; + n->nbr_list[i].ln_metric[j].tx_link_availability = ptr->transmitter_link_metrics[j].link_availability; + n->nbr_list[i].ln_metric[j].tx_phy_rate = ptr->transmitter_link_metrics[j].phy_rate; } } } @@ -686,6 +686,8 @@ void topologyd_dump_node(struct blob_buf *bb, struct node *p, int is_self) void *bridge_tuple = NULL, *ipv4_param = NULL, *ipv6_param = NULL, *link_array = NULL; void *table1 = NULL; int j, k, flag = 0, i = 0; + char addr[16] = {0}; + char addr_v6[40] = {0}; hwaddr_ntoa(p->hwaddr, mac_str); blobmsg_add_string(bb, "ieee1905_macaddr", mac_str); @@ -816,12 +818,30 @@ void topologyd_dump_node(struct blob_buf *bb, struct node *p, int is_self) //Here we show the ipv4 message structure blobmsg_add_u32(bb, "ipv4_itfr_num", p->ipv4_intf_nbr); ipv4_param = blobmsg_open_array(bb, "ipv4_params"); + for (j = 0; j < p->ipv4_intf_nbr; j++) { table = blobmsg_open_table(bb, NULL); hwaddr_ntoa(p->device_ipv4[j].mac_address, mac_str); blobmsg_add_string(bb, "mac_address", mac_str); blobmsg_add_string(bb, "ipv4_addr_type",get_ipv4_type(p->device_ipv4[j].ipv4_addr_type)); - //TODO for ipv4 address and dhcp address + + // ipv4 address + sprintf(addr, "%d.%d.%d.%d", p->device_ipv4[j].ipv4_addr[0], + p->device_ipv4[j].ipv4_addr[1], p->device_ipv4[j].ipv4_addr[2], + p->device_ipv4[j].ipv4_addr[3]); + addr[15] = '\0'; + blobmsg_add_string(bb, "ipv4_address", addr); + memset(addr, 0, 16); + + // dhcp address + if (p->device_ipv4[j].ipv4_addr_type == IPV4_TYPE_DHCP) { + sprintf(addr, "%d.%d.%d.%d", p->device_ipv4[j].dhcp_addr[0], + p->device_ipv4[j].dhcp_addr[1], + p->device_ipv4[j].dhcp_addr[2], + p->device_ipv4[j].dhcp_addr[3]); + addr[15] = '\0'; + blobmsg_add_string(bb, "dhcp_addr", addr); + } blobmsg_close_table(bb, table); } blobmsg_close_array(bb, ipv4_param); @@ -834,7 +854,31 @@ void topologyd_dump_node(struct blob_buf *bb, struct node *p, int is_self) hwaddr_ntoa(p->device_ipv6[j].mac_address, mac_str); blobmsg_add_string(bb, "mac_address", mac_str); blobmsg_add_string(bb, "ipv6_addr_type",get_ipv6_type(p->device_ipv6[j].ipv6_addr_type)); - //TODO for ipv6 address and dhcp address + //For ipv6 address + sprintf(addr_v6, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", + p->device_ipv6[j].ipv6_addr[0], p->device_ipv6[j].ipv6_addr[1], p->device_ipv6[j].ipv6_addr[2], + p->device_ipv6[j].ipv6_addr[3], p->device_ipv6[j].ipv6_addr[4], p->device_ipv6[j].ipv6_addr[5], + p->device_ipv6[j].ipv6_addr[6], p->device_ipv6[j].ipv6_addr[7], p->device_ipv6[j].ipv6_addr[8], + p->device_ipv6[j].ipv6_addr[9], p->device_ipv6[j].ipv6_addr[10], p->device_ipv6[j].ipv6_addr[11], + p->device_ipv6[j].ipv6_addr[12], p->device_ipv6[j].ipv6_addr[13], p->device_ipv6[j].ipv6_addr[14], + p->device_ipv6[j].ipv6_addr[15]); + addr_v6[39] = '\0'; + blobmsg_add_string(bb, "ipv6_address", addr_v6); + // origin address + if (p->device_ipv6[j].ipv6_addr_type == IPV6_TYPE_SLAAC) { + memset(addr_v6, 0, 40); + sprintf(addr_v6, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", + p->device_ipv6[j].ipv6addr_origin[0], p->device_ipv6[j].ipv6addr_origin[1], + p->device_ipv6[j].ipv6addr_origin[2], p->device_ipv6[j].ipv6addr_origin[3], + p->device_ipv6[j].ipv6addr_origin[4], p->device_ipv6[j].ipv6addr_origin[5], + p->device_ipv6[j].ipv6addr_origin[6], p->device_ipv6[j].ipv6addr_origin[7], + p->device_ipv6[j].ipv6addr_origin[8], p->device_ipv6[j].ipv6addr_origin[9], + p->device_ipv6[j].ipv6addr_origin[10], p->device_ipv6[j].ipv6addr_origin[11], + p->device_ipv6[j].ipv6addr_origin[12], p->device_ipv6[j].ipv6addr_origin[13], + p->device_ipv6[j].ipv6addr_origin[14],p->device_ipv6[j].ipv6addr_origin[15]); + addr[39] = '\0'; + blobmsg_add_string(bb, "origin", addr_v6); + } blobmsg_close_table(bb, table); } blobmsg_close_array(bb, ipv6_param);