diff --git a/src/topo_ieee1905.c b/src/topo_ieee1905.c index e72b08c1825c9f7707834a7fa7b997e4e65294ba..6bf97f4e87bf5d1ce1823ddba3077f606757d286 100644 --- a/src/topo_ieee1905.c +++ b/src/topo_ieee1905.c @@ -102,6 +102,22 @@ static void topologyd_node_expired(struct uloop_timeout *t) { struct node *p = container_of(t, struct node, validity_timer); struct topologyd_private *priv = p->priv; + int i = 0; + struct topology_changelog elem; + + //Here before deleting a ieee1905 node + //we also need to log in changelog the nonieee1905 nodes as deleted + for (i = 0; i < p->non1905_nbr_num; i++) { + dbg("Deleting the non1905 neighbor" MACFMT "\n", MAC2STR(p->non1905_nbrlist[i])); + memcpy(elem.nbr_macaddr, p->non1905_nbrlist[i], 6); + memcpy(elem.rpt_macaddr, p->hwaddr, 6); + memcpy(elem.rpt_ifmacaddr, p->non1905_nbr_localintf, 6); + elem.is1905_nbr = 0; + elem.type = 1; + enqueue_changelog(&(priv->topo), &elem); + //Send event + topology_send_node_event(&elem, p->ingress_ifr_name); + } //Here we log in the changelog as the node will be deleted changelog_copy_node_info(priv, p, 1, 1); @@ -124,8 +140,13 @@ int topologyd_node_add(struct topologyd_private *priv, struct node *node) if (!memcmp(node->hwaddr, priv->ieee1905_macaddr, 6)) { p = &priv->selfnode; + + if (first_run_flag == 1) + update_changelog_info(priv, p, node); + topologyd_copy_update_node(p, node); if (first_run_flag == 0) { + topologyd_update_changelog_firstentry(priv, p); if (!priv->algo_running) topologyd_algo_run(priv); first_run_flag = 1; @@ -146,8 +167,10 @@ int topologyd_node_add(struct topologyd_private *priv, struct node *node) p->validity_timer.cb = topologyd_node_expired; p->priv = priv; priv->topo.num_nodes++; - //Add this in changelog events + //Add this in changelog events for ieee1905 nodes changelog_copy_node_info(priv, p, 0, 1); + //Add this in changelog events for nonieee1905 nodes + topologyd_update_changelog_firstentry(priv, p); } else { //update in changelog diff --git a/src/topologyd.c b/src/topologyd.c index 065887d18430e62faa056ed66e812849c563ae35..ffa3afd741c11ccd59938c943d875d443f3509f8 100644 --- a/src/topologyd.c +++ b/src/topologyd.c @@ -399,11 +399,9 @@ void topologyd_process_topology_response(struct cmdu_cstruct *cstruct, struct to i++; } - if (n.nbr_num || n.non1905_nbr_num) { - dbg("Updating Node" MACFMT " from topology response\n", - MAC2STR(n.hwaddr)); - topologyd_node_add(priv, &n); - } + dbg("Updating Node" MACFMT " from topology response\n", + MAC2STR(n.hwaddr)); + topologyd_node_add(priv, &n); } void topologyd_process_higherlayer_response(struct cmdu_cstruct *cstruct, struct topologyd_private *priv) @@ -1320,9 +1318,6 @@ static int topologyd_run(struct topologyd_private *priv) topologyd_start_heartbeat(&priv->heartbeat); topologyd_periodic_refresh(&priv->refresh_timer); - //initalize the changelog values - priv->topo.changelog_front = priv->topo.changelog_rear = -1; - return 0; } @@ -1531,7 +1526,6 @@ void changelog_copy_node_info(struct topologyd_private *t, struct node *p, int32 memcpy(elem.rpt_ifmacaddr, t->selfnode.nbr_localintf, 6); } - memcpy(elem.rpt_ifmacaddr, p->nbr_localintf, 6); memcpy(elem.nbr_macaddr, p->hwaddr, 6); elem.is1905_nbr = is1905; elem.type = event; @@ -1544,54 +1538,13 @@ void changelog_copy_node_info(struct topologyd_private *t, struct node *p, int32 void update_changelog_info(struct topologyd_private *priv, struct node *dest, struct node *src) { dbg("Inside %s..\n", __func__); - int i = 0, j = 0, k = 0, found = 0; + int i = 0, j = 0, found = 0; struct topology_changelog elem; if (dest == NULL || src == NULL || priv == NULL) return; - //Check the update in neighbor node - if (dest->nbr_num != src->nbr_num) { - //Here a new neighbor is added or deleted - if (dest->nbr_num > src->nbr_num) { - dbg("Inside %s deleting neighbor node\n", __func__); - // neighbor node is deleted - for (i = 0; i < dest->nbr_num ; i++) { - found = 0; - for (j = 0; j < src->nbr_num; j++) { - if (memcmp(dest->nbr_list[i].nbr_macid, src->nbr_list[j].nbr_macid, 6) == 0) { - found = 1; - break; - } - } - if (found == 0) { - memcpy(elem.nbr_macaddr, dest->nbr_list[i].nbr_macid, 6); - memcpy(elem.rpt_macaddr, dest->hwaddr, 6); - memcpy(elem.rpt_ifmacaddr, dest->nbr_localintf, 6); - elem.is1905_nbr = 1; - elem.type = 1; - enqueue_changelog(&(priv->topo), &elem); - //Send event - topology_send_node_event(&elem, src->ingress_ifr_name); - } - } - } else { - dbg("Inside %s adding neighbor node\n", __func__); - //neighbor node is added - k = src->nbr_num - dest->nbr_num; - for (i = 0; i < k ; i++) { - memcpy(elem.nbr_macaddr, src->nbr_list[i].nbr_macid, 6); - memcpy(elem.rpt_macaddr, src->hwaddr, 6); - memcpy(elem.rpt_ifmacaddr, src->nbr_localintf, 6); - elem.is1905_nbr = 1; - elem.type = 0; - enqueue_changelog(&(priv->topo), &elem); - //Send event - topology_send_node_event(&elem, src->ingress_ifr_name); - } - } - } - + dbg("The dest num [%d] src num [%d]", dest->non1905_nbr_num, src->non1905_nbr_num); //Check the update in non neighbor node if (dest->non1905_nbr_num != src->non1905_nbr_num) { //Here a new non ieee1905 neighbor is added or deleted @@ -1618,18 +1571,28 @@ void update_changelog_info(struct topologyd_private *priv, struct node *dest, st } } } else { - //non1905 neighbor node is added - dbg("Inside %s non neighbor node\n", __func__); - k = src->non1905_nbr_num - dest->non1905_nbr_num; - for (i = 0; i < k ; i++) { - memcpy(elem.nbr_macaddr, src->non1905_nbrlist[i], 6); - memcpy(elem.rpt_macaddr, src->hwaddr, 6); - memcpy(elem.rpt_ifmacaddr, src->non1905_nbr_localintf, 6); - elem.is1905_nbr = 0; - elem.type = 0; - enqueue_changelog(&(priv->topo), &elem); - //Send event - topology_send_node_event(&elem, src->ingress_ifr_name); + if (dest->non1905_nbr_num < src->non1905_nbr_num) { + // non1905 neighbor node is added + dbg("Inside %s adding non neighbor node\n", __func__); + for (i = 0; i < src->non1905_nbr_num ; i++) { + found = 0; + for (j = 0; j < dest->non1905_nbr_num; j++) { + if (memcmp(dest->non1905_nbrlist[j], src->non1905_nbrlist[i], 6) == 0) { + found = 1; + break; + } + } + if (found == 0) { + memcpy(elem.nbr_macaddr, src->non1905_nbrlist[i], 6); + memcpy(elem.rpt_macaddr, src->hwaddr, 6); + memcpy(elem.rpt_ifmacaddr, src->non1905_nbr_localintf, 6); + elem.is1905_nbr = 0; + elem.type = 0; + enqueue_changelog(&(priv->topo), &elem); + //Send event + topology_send_node_event(&elem, src->ingress_ifr_name); + } + } } } } @@ -1823,3 +1786,29 @@ void topology_send_node_event(struct topology_changelog *c, char *ingress) ubus_free(sctx); } + +void topologyd_update_changelog_firstentry(struct topologyd_private *priv, struct node *dest) +{ + dbg("Inside %s..\n", __func__); + int i = 0; + struct topology_changelog elem; + + if (dest == NULL || priv == NULL) + return; + dbg("dest num for non1905 nodes [%d]", dest->non1905_nbr_num); + //Check the update in non neighbor node + if (dest->non1905_nbr_num > 0) { + //Here add non ieee1905 neighbor + for (i = 0; i < dest->non1905_nbr_num ; i++) { + memcpy(elem.nbr_macaddr, dest->non1905_nbrlist[i], 6); + memcpy(elem.rpt_macaddr, dest->hwaddr, 6); + memcpy(elem.rpt_ifmacaddr, dest->non1905_nbr_localintf, 6); + elem.is1905_nbr = 0; + elem.type = 0; + enqueue_changelog(&(priv->topo), &elem); + //Send event + topology_send_node_event(&elem, dest->ingress_ifr_name); + } + } +} + diff --git a/src/topologyd.h b/src/topologyd.h index 9e4811d486387b517288e23c76e18e75113ab4d9..1ea2dfbc8e3d8c6f6378422b42f99a75fd2595f7 100644 --- a/src/topologyd.h +++ b/src/topologyd.h @@ -236,6 +236,8 @@ void topologyd_getdata_lnmetric_query(struct linkMetricQueryTLV *tlv); void changelog_copy_node_info(struct topologyd_private *t, struct node *p, int32_t event, bool is1905); void update_changelog_info(struct topologyd_private *priv, struct node *dest, struct node *src); +void topologyd_update_changelog_firstentry(struct topologyd_private *priv, struct node *dest); +void enqueue_changelog(struct topology *t, struct topology_changelog *c); //Functions to update the response message in node void topologyd_process_topology_response(struct cmdu_cstruct *cstruct, struct topologyd_private *priv, char *itfr_name);