Handle asymmetric information more cleanly...
authorHenning Rogge <hrogge@googlemail.com>
Thu, 17 Mar 2011 17:22:28 +0000 (18:22 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Thu, 17 Mar 2011 17:22:28 +0000 (18:22 +0100)
src/olsr_spf.c
src/tc_set.c
src/tc_set.h

index 6d0a3cb..e7b28c8 100644 (file)
@@ -187,12 +187,7 @@ olsr_spf_relax(struct avl_tree *cand_tree, struct tc_entry *tc)
      * total quality of the path through this vertex
      * to the destination of this edge
      */
-    if (tc_edge->virtual) {
-      new_cost = tc->path_cost + tc_edge->edge_inv->cost;
-    }
-    else {
-      new_cost = tc->path_cost + tc_edge->cost;
-    }
+    new_cost = tc->path_cost + tc_edge->edge_inv->common_cost;
 
     OLSR_DEBUG(LOG_ROUTING, "SPF:   exploring edge %s, cost %s\n",
                olsr_ip_to_string(&buf, &tc_edge->T_dest_addr),
index 10ee3cc..1fe07b5 100644 (file)
@@ -552,6 +552,9 @@ olsr_delete_revoked_tc_edges(struct tc_entry *tc, uint16_t ansn, union olsr_ip_a
     }
 
     if (SEQNO_GREATER_THAN(ansn, tc_edge->ansn)) {
+      tc_edge->cost = LINK_COST_BROKEN;
+      tc_edge->common_cost = LINK_COST_BROKEN;
+      tc_edge->edge_inv->common_cost = LINK_COST_BROKEN;
       olsr_delete_tc_edge_entry(tc_edge);
       retval = 1;
     }
@@ -612,6 +615,9 @@ olsr_tc_update_edge(struct tc_entry *tc, uint16_t ansn, const unsigned char **cu
      * Update the etx.
      */
     tc_edge->cost = olsr_calc_tc_cost(tc_edge);
+    tc_edge->common_cost = tc_edge->cost;
+    tc_edge->edge_inv->common_cost = tc_edge->cost;
+
     edge_change = 1;
     OLSR_DEBUG(LOG_TC, "TC:   chg edge entry %s\n", olsr_tc_edge_to_string(tc_edge));
   }
@@ -654,8 +660,11 @@ olsr_print_tc_table(void)
 
   OLSR_INFO(LOG_TC, "\n--- %s ------------------------------------------------- TOPOLOGY\n\n",
       olsr_clock_getWallclockString(&timebuf));
-  OLSR_INFO_NH(LOG_TC, "%-*s %-*s %-7s      %8s %12s %5s\n", ipwidth,
-               "Source IP addr", ipwidth, "Dest IP addr", "", olsr_get_linklabel(0), "vtime", "ansn");
+  OLSR_INFO_NH(LOG_TC, "%-*s %-*s %-7s      %*s %*s %12s %5s\n", ipwidth,
+               "Source IP addr", ipwidth, "Dest IP addr", "",
+               (int)olsr_get_linklabel_maxlength(0), olsr_get_linklabel(0),
+               (int)olsr_get_linklabel_maxlength(0), "(common)",
+               "vtime", "ansn");
 
   OLSR_FOR_ALL_TC_ENTRIES(tc, tc_iterator) {
     struct tc_edge_entry *tc_edge, *edge_iterator;
@@ -671,11 +680,14 @@ olsr_print_tc_table(void)
       struct ipaddr_str addrbuf, dstaddrbuf;
       char lqbuffer1[LQTEXT_MAXLENGTH];
 
-      OLSR_INFO_NH(LOG_TC, "%-*s %-*s %-7s      %8s %12s %5u\n",
+      OLSR_INFO_NH(LOG_TC, "%-*s %-*s %-7s      %*s %*s %12s %5u\n",
                    ipwidth, olsr_ip_to_string(&addrbuf, &tc->addr),
                    ipwidth, olsr_ip_to_string(&dstaddrbuf,
                                               &tc_edge->T_dest_addr),
                    tc_edge->virtual ? "virtual" : "",
+                   (int)olsr_get_linklabel_maxlength(0),
+                   olsr_get_linkcost_text(tc_edge->common_cost, false, lqbuffer1, sizeof(lqbuffer1)),
+                   (int)olsr_get_linklabel_maxlength(0),
                    olsr_get_linkcost_text(tc_edge->cost, false, lqbuffer1, sizeof(lqbuffer1)),
                    vtime, tc_edge->ansn);
 
index be5dc27..f6ade34 100644 (file)
@@ -64,7 +64,8 @@ struct tc_edge_entry {
   struct tc_edge_entry *edge_inv;      /* shortcut, used during SPF calculation */
   struct tc_entry *tc;                 /* backpointer to owning tc entry */
   struct nbr_entry *neighbor;          /* back pointer for edges to neighbor */
-  olsr_linkcost cost;                  /* metric for tc received by this tc */
+  olsr_linkcost cost;                  /* metric for this edge received by the last tc */
+  olsr_linkcost common_cost;           /* metric for this edge or the reverse one received by the last tc */
   bool virtual;                        /* 1 if this is a virtual edge created by the neighbors TC ? */
   uint16_t ansn;                       /* ansn of this edge, used for multipart msgs */
 };