[Olsr-dev] Bug in function olsr_tc_update_edge ?

Hannes Gredler (spam-protected)
Mon Feb 18 23:39:08 CET 2008


hi eric,

your observation is correct, now asking what is the right fix ?

we are getting in the waters of system design here.

the more interesting question to ask is why does a node
emit a less than 10 percent change and flood the TC throughout
the network in spite that everyone will not trigger a SPF
calculation ?

IMO the right thing to do, sender should hold-back the information
locally and once the change is significant enough, flood it
throughout the network.

/hannes

Erik Tromp wrote:
> Hi all,
> 
> I think there may be a bug in the 0.5.5 (and also 0.5.4) version of OLSRd.
> 
> The function 'olsr_tc_update_edge' in the file 'tc_set.c' calls the function
> 'olsr_etx_significant_change' to determine whether 'the etx change is
> meaningful enough in order to trigger a SPF calculation'. The function
> 'olsr_etx_significant_change' returns true if the change is 10% or more.
> 
> To do this, it compares the current 'tc_edge->link_quality' with the value
> of 'neigh_link_quality' which is a value as received in the most recent TC
> message. If the difference is large enough, the boolean 'edge_change' is set
> to 1 to trigger the SPF calculation.
> 
> However, after that, the 'neigh_link_quality' is always copied into
> 'tc_edge->link_quality'.
> 
> What happens if the changes are very small, say 5% every time? None of the
> changes will ever trigger the SPF calculation, because all the changes are <
> 10%.
> 
> In the pre-0.5.4 era [the good old times ;-) ], the relevant value was only
> saved (in a 'saved_...' field) when the calculation was actually done. In
> this way, incremental changes were detected with respect to the values as
> used for the last calculation.
> 
> In the 0.5.3 version of tc_set.h:
> 
> struct topo_dst
> {
>   union olsr_ip_addr T_dest_addr;
>   clock_t            T_time;
>   olsr_u16_t         T_seq;
>   struct topo_dst   *next;
>   struct topo_dst   *prev;
>   double             link_quality;
>   double             inverse_link_quality;
>   double             saved_link_quality;
>   double             saved_inverse_link_quality;
> }; 
> 
> The 'saved_...' fields have gone in the 0.5.4 version of tc_set.h:
> 
> struct tc_edge_entry
> {
>   struct avl_node    edge_node; /* edge_tree node in tc_entry */
>   union olsr_ip_addr T_dest_addr; /* edge_node key */
>   struct tc_edge_entry *edge_inv; /* shortcut, used during SPF calculation
> */
>   struct tc_entry    *tc; /* backpointer to owning tc entry */
>   clock_t            T_time; /* expiration timer, timer_node key */
>   olsr_u16_t         T_seq; /* sequence number */
>   olsr_u16_t         flags; /* misc flags */
>   float              etx; /* metric used for SPF calculation */
>   float              link_quality;
>   float              inverse_link_quality;
> };
> 
> Am i missing something here?
> 
> Another point of interest: the function 'pkt_get_u32' has an error. It is
> left as an exercise to the reader to find it :-) . (It is not a problem,
> since that function is never used, unless you are writing a link-cost
> version of OLSR...)
> 
> Erik
> 
> 




More information about the Olsr-dev mailing list