diff --git a/src/topo_ieee1905.c b/src/topo_ieee1905.c index 36d876e152c44349247e18ba3d6cfcc8c04f04b1..7efdf9e3de5ce7c51c733b929fe2889acc4feaa6 100644 --- a/src/topo_ieee1905.c +++ b/src/topo_ieee1905.c @@ -81,7 +81,11 @@ static int topologyd_copy_update_node(struct node *dest, struct node *src) //Here we copy the Bridge tuple entries dest->bridge_tuple_num = src->bridge_tuple_num; for(j = 0; j < src->bridge_tuple_num; j++) { - memcpy(dest->bridge_tuple[j], src->bridge_tuple[j], 6); + dest->br_tuple[j].tuple_num = src->br_tuple[j].tuple_num; + + for(k = 0;k < src->br_tuple[j].tuple_num ;k++) { + memcpy(dest->br_tuple[j].tuple_macid[k], src->br_tuple[j].tuple_macid[k], 6); + } } time(&dest->last_recv); diff --git a/src/topologyd.c b/src/topologyd.c index 52bab038de10c2a6b7937c13c7e744fa71d443d0..f244b91ebc7d14a36bb930222c684d03311f8981 100644 --- a/src/topologyd.c +++ b/src/topologyd.c @@ -355,18 +355,18 @@ void topologyd_process_topology_response(struct cmdu_cstruct *cstruct, struct to { struct deviceBridgingCapabilityTLV *tlv = (struct deviceBridgingCapabilityTLV *)p; - cnt = 0; + + n.bridge_tuple_num = tlv->bridging_tuples_nr; dbg(" bridging tuple number [%d] \n", tlv->bridging_tuples_nr); for (j = 0; j < tlv->bridging_tuples_nr; j++) { + n.br_tuple[j].tuple_num = tlv->bridging_tuples[j].bridging_tuple_macs_nr; for (k = 0; k < tlv->bridging_tuples[j].bridging_tuple_macs_nr; k++) { dbg(" bridge_num[%d] br_mac_num[%d] \n", tlv->bridging_tuples_nr, tlv->bridging_tuples[j].bridging_tuple_macs_nr); - memcpy(n.bridge_tuple[cnt], &tlv->bridging_tuples[j].bridging_tuple_macs[k].mac_address, 6); - cnt++; + memcpy(n.br_tuple[j].tuple_macid[k], &tlv->bridging_tuples[j].bridging_tuple_macs[k].mac_address, 6); } } - n.bridge_tuple_num = cnt; } break; default : @@ -693,6 +693,7 @@ void topologyd_dump_node(struct blob_buf *bb, struct node *p, int is_self) char behind_mac_str[1024] = { 0x0 }; void *nbr_array, *non1905_array = NULL, *interfaces = NULL, *table = NULL, *l2_neighbor = NULL; void *bridge_tuple = NULL, *ipv4_param = NULL, *ipv6_param = NULL, *link_array = NULL; + void *bridge_tuple_mac = NULL; void *table1 = NULL; int j, k, flag = 0, i = 0; char addr[16] = {0}; @@ -812,8 +813,12 @@ void topologyd_dump_node(struct blob_buf *bb, struct node *p, int is_self) bridge_tuple = blobmsg_open_array(bb, "bridge_tuple"); for (j = 0; j < p->bridge_tuple_num; j++) { table = blobmsg_open_table(bb, NULL); - hwaddr_ntoa(p->bridge_tuple[j], mac_str); - blobmsg_add_string(bb, "bridge_tuple_mac_id", mac_str); + bridge_tuple_mac = blobmsg_open_array(bb, "br_mac"); + for (k = 0; k < p->br_tuple[j].tuple_num; k++) { + hwaddr_ntoa(p->br_tuple[j].tuple_macid[k], mac_str); + blobmsg_add_string(bb, "bridge_tuple_mac_id", mac_str); + } + blobmsg_close_array(bb, bridge_tuple_mac); blobmsg_close_table(bb, table); } blobmsg_close_array(bb, bridge_tuple); diff --git a/src/topologyd.h b/src/topologyd.h index 4cd6fb5f36a7c9dd5be62ac8e8d80b968bfcea0d..546f55ec08ac7ed75aa46cd02d95ecf5dc5c569f 100644 --- a/src/topologyd.h +++ b/src/topologyd.h @@ -28,6 +28,7 @@ #define TOPOLOGY_STATUS_INTERVAL 5 #define TOPOLOGY_MAX_ENTRY 32 #define TOPOLOGY_MAX_LINK 32 +#define TOPOLOGY_MAX_BR_TUPLE 32 typedef uint32_t ieee1905_object_t; @@ -100,6 +101,11 @@ struct nbr_data_t { struct link_metric ln_metric[TOPOLOGY_MAX_LINK]; }; +struct bridge_tuple { + uint32_t tuple_num; + uint8_t tuple_macid[TOPOLOGY_MAX_BR_TUPLE][6]; +}; + struct node { uint8_t hwaddr[6]; void *priv; @@ -130,7 +136,7 @@ struct node { struct device_ipv6_t device_ipv6[TOPOLOGY_MAX_ENTRY]; //Bridging tuple uint32_t bridge_tuple_num; - uint8_t bridge_tuple[TOPOLOGY_MAX_ENTRY][6]; + struct bridge_tuple br_tuple[TOPOLOGY_MAX_ENTRY]; //local interfaces uint32_t local_intf_nbr; struct node_interface node_intf[TOPOLOGY_MAX_ENTRY];