Merge branch 'master' into scheduler_cleanup
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Thu, 17 Feb 2011 07:39:41 +0000 (08:39 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Thu, 17 Feb 2011 07:39:41 +0000 (08:39 +0100)
src/defs.h
src/lq_plugin.c
src/main.c
src/olsr.c
src/olsr.h
src/olsr_cfg.c
src/olsr_cfg.h
src/olsr_logging.h
src/parser.c
src/process_package.c
src/tc_set.c

index 793ea0b..d78a547 100644 (file)
@@ -64,10 +64,6 @@ extern const char EXPORT(build_host)[];
 #define UDP_IPV4_HDRSIZE        28
 #define UDP_IPV6_HDRSIZE        62
 
-#if __GNUC__
-extern FILE *EXPORT(debug_handle);
-#endif
-
 #define ARRAYSIZE(x)   (sizeof(x)/sizeof(*(x)))
 #ifndef MAX
 #define MAX(x,y)       ((x) > (y) ? (x) : (y))
@@ -108,20 +104,7 @@ enum app_state {
 #endif
 };
 
-/**
- * defines the severity of a logging event
- */
-enum log_severity {
-  SEVERITY_DEBUG,                      //!< SEVERITY_DEBUG
-  SEVERITY_INFO,                       //!< SEVERITY_INFO
-  SEVERITY_WARN,                       //!< SEVERITY_WARN
-  SEVERITY_ERR,                        //!< SEVERITY_ERR
-
-  /* this one must be the last of the enums ! */
-  LOG_SEVERITY_COUNT                   //!< LOG_SEVERITY_COUNT
-};
-
-extern volatile enum app_state app_state;
+extern enum app_state app_state;
 
 #endif
 
index 1fe10c8..f0729e4 100644 (file)
@@ -216,11 +216,9 @@ olsr_neighbor_cost_may_changed(struct nbr_entry *nbr) {
   if (edge->cost != cost) {
     edge->cost = cost;
 
-    if (olsr_cnf->lq_dlimit > 0) {
-      changes_neighborhood = true;
-      changes_topology = true;
-      signal_link_changes(true);
-    }
+    changes_neighborhood = true;
+    changes_topology = true;
+    signal_link_changes(true);
   }
 }
 
index c6dbc26..925cafb 100644 (file)
@@ -95,7 +95,7 @@ static void signal_reconfigure(int);
 /* Global stuff externed in olsr_cfg.h */
 struct olsr_config *olsr_cnf;          /* The global configuration */
 
-volatile enum app_state app_state = STATE_INIT;
+enum app_state app_state = STATE_INIT;
 
 static char copyright_string[] __attribute__ ((unused)) =
   "The olsr.org Optimized Link-State Routing daemon(olsrd) Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) All rights reserved.";
@@ -259,8 +259,26 @@ main(int argc, char *argv[])
   olsr_init_pluginsystem();
   olsr_plugins_init(true);
 
-  /* initialisation of different tables to be used. */
-  olsr_init_tables();
+  /* Initialize link set */
+  olsr_init_link_set();
+
+  /* Initialize duplicate table */
+  olsr_init_duplicate_set();
+
+  /* Initialize neighbor table */
+  olsr_init_neighbor_table();
+
+  /* Initialize routing table */
+  olsr_init_routing_table();
+
+  /* Initialize topology */
+  olsr_init_tc();
+
+  /* Initialize MID set */
+  olsr_init_mid_set();
+
+  /* Initialize HNA set */
+  olsr_init_hna_set();
 
   /* enable lq-plugins */
   olsr_plugins_enable(PLUGIN_TYPE_LQ, true);
index f1fa87d..5f719f4 100644 (file)
 #include <stdlib.h>
 
 static void olsr_update_willingness(void *);
-static void olsr_trigger_forced_update(void *);
 
-bool changes_topology;
-bool changes_neighborhood;
-bool changes_hna;
-bool changes_force;
-
-/**
- * Process changes functions
- */
-
-struct pcf {
-  int (*function) (int, int, int);
-  struct pcf *next;
-};
-
-static struct pcf *pcf_list;
+bool changes_topology = false;
+bool changes_neighborhood = false;
+bool changes_hna = false;
+bool changes_force = false;
 
 static uint16_t message_seqno;
 
@@ -109,23 +97,6 @@ get_msg_seqno(void)
   return message_seqno++;
 }
 
-
-void
-register_pcf(int (*f) (int, int, int))
-{
-  struct pcf *new_pcf;
-
-  OLSR_DEBUG(LOG_MAIN, "Registering pcf function\n");
-
-  new_pcf = olsr_malloc(sizeof(struct pcf), "New PCF");
-
-  new_pcf->function = f;
-  new_pcf->next = pcf_list;
-  pcf_list = new_pcf;
-
-}
-
-
 /**
  *Process changes in neighborhood or/and topology.
  *Re-calculates the neighborhood/topology if there
@@ -136,15 +107,6 @@ register_pcf(int (*f) (int, int, int))
 void
 olsr_process_changes(void)
 {
-  struct pcf *tmp_pc_list;
-
-  /* Check for changes in topology */
-  if (link_changes) {
-    increase_local_ansn_number();
-    OLSR_DEBUG(LOG_MAIN, "ANSN UPDATED %d\n\n", get_local_ansn_number());
-    link_changes = false;
-  }
-
   if (changes_neighborhood)
     OLSR_DEBUG(LOG_MAIN, "CHANGES IN NEIGHBORHOOD\n");
   if (changes_topology)
@@ -152,9 +114,6 @@ olsr_process_changes(void)
   if (changes_hna)
     OLSR_DEBUG(LOG_MAIN, "CHANGES IN HNA\n");
 
-  if (!changes_force && 0 >= olsr_cnf->lq_dlimit)
-    return;
-
   if (!changes_neighborhood && !changes_topology && !changes_hna)
     return;
 
@@ -179,79 +138,17 @@ olsr_process_changes(void)
   olsr_print_duplicate_table();
   olsr_print_hna_set();
 
-  for (tmp_pc_list = pcf_list; tmp_pc_list != NULL; tmp_pc_list = tmp_pc_list->next) {
-    tmp_pc_list->function(changes_neighborhood, changes_topology, changes_hna);
-  }
-
   changes_neighborhood = false;
   changes_topology = false;
   changes_hna = false;
   changes_force = false;
 }
 
-/*
- * Callback for the periodic route calculation.
- */
-static void
-olsr_trigger_forced_update(void *unused __attribute__ ((unused)))
-{
-
-  changes_force = true;
-  changes_neighborhood = true;
-  changes_topology = true;
-  changes_hna = true;
-
-  olsr_process_changes();
-}
-
-/**
- *Initialize all the tables used(neighbor,
- *topology, MID,  HNA, MPR, dup).
- *Also initalizes other variables
- */
-void
-olsr_init_tables(void)
-{
-  /* Some cookies for stats keeping */
-  static struct olsr_timer_info *periodic_spf_timer_info = NULL;
-
-  changes_topology = false;
-  changes_neighborhood = false;
-  changes_hna = false;
-
-  /* Initialize link set */
-  olsr_init_link_set();
-
-  /* Initialize duplicate table */
-  olsr_init_duplicate_set();
-
-  /* Initialize neighbor table */
-  olsr_init_neighbor_table();
-
-  /* Initialize routing table */
-  olsr_init_routing_table();
-
-  /* Initialize topology */
-  olsr_init_tc();
-
-  /* Initialize MID set */
-  olsr_init_mid_set();
-
-  /* Initialize HNA set */
-  olsr_init_hna_set();
-
-  /* Start periodic SPF and RIB recalculation */
-  if (olsr_cnf->lq_dinter > 0) {
-    periodic_spf_timer_info = olsr_timer_add("Periodic SPF", &olsr_trigger_forced_update, true);
-    olsr_timer_start(olsr_cnf->lq_dinter, 5,
-                     NULL, periodic_spf_timer_info);
-  }
-}
-
 /**
  * Shared code to write the message header
  */
-uint8_t *olsr_put_msg_hdr(uint8_t **curr, struct olsr_message *msg)
+uint8_t *
+olsr_put_msg_hdr(uint8_t **curr, struct olsr_message *msg)
 {
   uint8_t *sizeptr;
 
@@ -270,104 +167,6 @@ uint8_t *olsr_put_msg_hdr(uint8_t **curr, struct olsr_message *msg)
   return sizeptr;
 }
 
-/**
- *Check if a message is to be forwarded and forward
- *it if necessary.
- *
- *@param m the OLSR message recieved
- *
- *@returns positive if forwarded
- */
-int
-olsr_forward_message(struct olsr_message *msg, uint8_t *binary, struct interface *in_if, union olsr_ip_addr *from_addr)
-{
-  union olsr_ip_addr *src;
-  struct nbr_entry *neighbor;
-  struct interface *ifn, *iterator;
-  uint8_t *tmp;
-#if !defined REMOVE_LOG_DEBUG
-  struct ipaddr_str buf;
-#endif
-
-  /* Lookup sender address */
-  src = olsr_lookup_main_addr_by_alias(from_addr);
-  if (!src)
-    src = from_addr;
-
-  neighbor = olsr_lookup_nbr_entry(src, true);
-  if (!neighbor) {
-    OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d because no nbr entry found for %s\n",
-        msg->type, olsr_ip_to_string(&buf, src));
-    return 0;
-  }
-  if (!neighbor->is_sym) {
-    OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d because received by non-symmetric neighbor %s\n",
-        msg->type, olsr_ip_to_string(&buf, src));
-    return 0;
-  }
-
-  /* Check MPR */
-  if (neighbor->mprs_count == 0) {
-    OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d because we are no MPR for %s\n",
-        msg->type, olsr_ip_to_string(&buf, src));
-    /* don't forward packages if not a MPR */
-    return 0;
-  }
-
-  /* check if we already forwarded this message */
-  if (olsr_is_duplicate_message(msg, true, NULL)) {
-    OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d from %s because we already forwarded it.\n",
-        msg->type, olsr_ip_to_string(&buf, src));
-    return 0;                   /* it's a duplicate, forget about it */
-  }
-
-  /* Treat TTL hopcnt */
-  msg->hopcnt++;
-  msg->ttl--;
-  tmp = binary;
-  olsr_put_msg_hdr(&tmp, msg);
-
-  if (msg->ttl == 0) {
-    OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d from %s because TTL is 0.\n",
-        msg->type, olsr_ip_to_string(&buf, src));
-    return 0;                   /* TTL 0, forget about it */
-  }
-  OLSR_DEBUG(LOG_PACKET_PARSING, "Forwarding message type %d from %s.\n",
-      msg->type, olsr_ip_to_string(&buf, src));
-
-  /* looping trough interfaces */
-  OLSR_FOR_ALL_INTERFACES(ifn, iterator) {
-    if (net_output_pending(ifn)) {
-      /* dont forward to incoming interface if interface is mode ether */
-      if (in_if->mode == IF_MODE_ETHER && ifn == in_if)
-        continue;
-
-      /*
-       * Check if message is to big to be piggybacked
-       */
-      if (net_outbuffer_push(ifn, binary, msg->size) != msg->size) {
-        /* Send */
-        net_output(ifn);
-        /* Buffer message */
-        set_buffer_timer(ifn);
-
-        if (net_outbuffer_push(ifn, binary, msg->size) != msg->size) {
-          OLSR_WARN(LOG_NETWORKING, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msg->size);
-        }
-      }
-    } else {
-      /* No forwarding pending */
-      set_buffer_timer(ifn);
-
-      if (net_outbuffer_push(ifn, binary, msg->size) != msg->size) {
-        OLSR_WARN(LOG_NETWORKING, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msg->size);
-      }
-    }
-  }
-
-  return 1;
-}
-
 static void
 olsr_update_willingness(void *foo __attribute__ ((unused)))
 {
@@ -443,77 +242,6 @@ olsr_calculate_willingness(void)
       olsr_cnf->willingness, olsr_milli_to_txt(&tbuf, olsr_cnf->will_int));
 }
 
-const char *
-olsr_msgtype_to_string(uint8_t msgtype)
-{
-  static char type[20];
-
-  switch (msgtype) {
-  case (HELLO_MESSAGE):
-    return "HELLO";
-  case (TC_MESSAGE):
-    return "TC";
-  case (MID_MESSAGE):
-    return "MID";
-  case (HNA_MESSAGE):
-    return "HNA";
-  case (LQ_HELLO_MESSAGE):
-    return ("LQ-HELLO");
-  case (LQ_TC_MESSAGE):
-    return ("LQ-TC");
-  default:
-    break;
-  }
-
-  snprintf(type, sizeof(type), "UNKNOWN(%d)", msgtype);
-  return type;
-}
-
-
-const char *
-olsr_link_to_string(uint8_t linktype)
-{
-  static char type[20];
-
-  switch (linktype) {
-  case (UNSPEC_LINK):
-    return "UNSPEC";
-  case (ASYM_LINK):
-    return "ASYM";
-  case (SYM_LINK):
-    return "SYM";
-  case (LOST_LINK):
-    return "LOST";
-  default:
-    break;
-  }
-
-  snprintf(type, sizeof(type), "UNKNOWN(%d)", linktype);
-  return type;
-}
-
-
-const char *
-olsr_status_to_string(uint8_t status)
-{
-  static char type[20];
-
-  switch (status) {
-  case (NOT_NEIGH):
-    return "NOT NEIGH";
-  case (SYM_NEIGH):
-    return "NEIGHBOR";
-  case (MPR_NEIGH):
-    return "MPR";
-  default:
-    break;
-  }
-
-  snprintf(type, sizeof(type), "UNKNOWN(%d)", status);
-  return type;
-}
-
-
 /**
  *Termination function to be called whenever a error occures
  *that requires the daemon to terminate
index c2c89ae..847cd2f 100644 (file)
@@ -52,38 +52,19 @@ extern bool changes_neighborhood;
 extern bool changes_hna;
 extern bool changes_force;             /* Maybe static */
 
-void
-  register_pcf(int (*)(int, int, int));
+void olsr_process_changes(void);
 
-void
-  olsr_process_changes(void);
-
-void
-  init_msg_seqno(void);
+void init_msg_seqno(void);
 
 uint16_t EXPORT(get_msg_seqno) (void);
 
 uint8_t *EXPORT(olsr_put_msg_hdr)(uint8_t **curr, struct olsr_message *msg);
 
-int
-  olsr_forward_message(struct olsr_message *, uint8_t *binary, struct interface *, union olsr_ip_addr *);
-
-void
-  olsr_init_tables(void);
-
-void
-  olsr_init_willingness(void);
+void olsr_init_willingness(void);
 
 void olsr_calculate_willingness(void);
 
-const char *olsr_msgtype_to_string(uint8_t);
-
-const char *olsr_link_to_string(uint8_t);
-
-const char *olsr_status_to_string(uint8_t);
-
-void
-  EXPORT(olsr_exit) (int);
+void EXPORT(olsr_exit) (int);
 
 void *EXPORT(olsr_malloc) (size_t, const char *);
 
index 0240e39..ad131cf 100644 (file)
@@ -813,17 +813,6 @@ parse_cfg_option(const int optint, char *argstr, const int line, struct olsr_con
     }
     PARSER_DEBUG_PRINTF("IpVersion: %d\n", rcfg->ip_version);
     break;
-  case 'J':                    /* LinkQualityDijkstraLimit (i,f) */
-    {
-      int limit = -1;
-      char t[10] = {0};
-      sscanf(argstr, "%d %10s", &limit, t);
-      if (0 <= limit && limit < (1 << (8 * sizeof(rcfg->lq_dlimit))))
-        rcfg->lq_dlimit = limit;
-      rcfg->lq_dinter = olsr_txt_to_milli(t);
-      PARSER_DEBUG_PRINTF("Link quality dijkstra limit %d, %u ms\n", rcfg->lq_dlimit, rcfg->lq_dinter);
-    }
-    break;
   case 'E':                    /* LinkQualityFishEye (i) */
     {
       int arg = -1;
@@ -1359,12 +1348,6 @@ olsr_sanity_check_cfg(struct olsr_config *cfg)
     return -1;
   }
 
-  /* Check Link quality dijkstra limit */
-  if (cfg->lq_dinter < cfg->pollrate && cfg->lq_dlimit != 255) {
-    fprintf(stderr, "Link quality dijkstra limit must be higher than pollrate\n");
-    return -1;
-  }
-
   /* NIC Changes Pollrate */
   if (cfg->nic_chgs_pollrate < MIN_NICCHGPOLLRT || cfg->nic_chgs_pollrate > MAX_NICCHGPOLLRT) {
     fprintf(stderr, "NIC Changes Pollrate %u ms is not allowed\n", cfg->nic_chgs_pollrate);
@@ -1571,8 +1554,6 @@ olsr_get_default_cfg(void)
   cfg->tc_redundancy = TC_REDUNDANCY;
   cfg->mpr_coverage = MPR_COVERAGE;
   cfg->lq_fish = DEF_LQ_FISH;
-  cfg->lq_dinter = DEF_LQ_DIJK_INTER;
-  cfg->lq_dlimit = DEF_LQ_DIJK_LIMIT;
   assert(cfg->willingness == 0);
 
   cfg->olsr_port = OLSRPORT;
index 994ae3d..4ebffd9 100644 (file)
@@ -53,8 +53,6 @@
 #define DEF_FIB_METRIC         FIBM_FLAT
 #define DEF_LQ_ALWAYS_SEND_TC  true
 #define DEF_LQ_FISH            1
-#define DEF_LQ_DIJK_LIMIT      255
-#define DEF_LQ_DIJK_INTER      0
 #define DEF_LQ_NAT_THRESH      1000
 #define DEF_CLEAR_SCREEN       true
 #define DEF_HTTPPORT           8080
@@ -212,8 +210,6 @@ struct olsr_config {
   uint8_t tc_redundancy;               /* TC anncoument mode, 0=only MPR, 1=MPR+MPRS, 2=All sym neighs */
   uint8_t mpr_coverage;                /* How many additional MPRs should be selected */
   uint8_t lq_fish;                     /* 0==Fisheye off, 1=Fisheye on */
-  uint32_t lq_dinter;              /* Dijkstra Calculation interval */
-  uint8_t lq_dlimit;                   /* Dijkstra Calculation limit */
   uint8_t willingness;                 /* Manual Configured Willingness value */
 
   uint16_t olsr_port;                  /* port number used for OLSR packages */
index 5578e9c..f181e9f 100644 (file)
 
 #define LOGBUFFER_SIZE 1024
 
+/**
+ * defines the severity of a logging event
+ */
+enum log_severity {
+  SEVERITY_DEBUG,                      //!< SEVERITY_DEBUG
+  SEVERITY_INFO,                       //!< SEVERITY_INFO
+  SEVERITY_WARN,                       //!< SEVERITY_WARN
+  SEVERITY_ERR,                        //!< SEVERITY_ERR
+
+  /* this one must be the last of the enums ! */
+  LOG_SEVERITY_COUNT                   //!< LOG_SEVERITY_COUNT
+};
+
 /**
  * these four macros should be used to generate OLSR logging output
  *
index 0e31c02..8c12ce4 100644 (file)
@@ -66,6 +66,9 @@ static struct parse_function_entry *parse_functions = NULL;
 static struct preprocessor_function_entry *preprocessor_functions = NULL;
 static struct packetparser_function_entry *packetparser_functions = NULL;
 
+static int olsr_forward_message(struct olsr_message *msg,
+    uint8_t *binary, struct interface *in_if, union olsr_ip_addr *from_addr);
+
 /**
  *Initialize the parser.
  *
@@ -420,6 +423,104 @@ olsr_input(int fd, void *data __attribute__ ((unused)), unsigned int flags __att
   }
 }
 
+/**
+ *Check if a message is to be forwarded and forward
+ *it if necessary.
+ *
+ *@param m the OLSR message recieved
+ *
+ *@returns positive if forwarded
+ */
+static int
+olsr_forward_message(struct olsr_message *msg, uint8_t *binary, struct interface *in_if, union olsr_ip_addr *from_addr)
+{
+  union olsr_ip_addr *src;
+  struct nbr_entry *neighbor;
+  struct interface *ifn, *iterator;
+  uint8_t *tmp;
+#if !defined REMOVE_LOG_DEBUG
+  struct ipaddr_str buf;
+#endif
+
+  /* Lookup sender address */
+  src = olsr_lookup_main_addr_by_alias(from_addr);
+  if (!src)
+    src = from_addr;
+
+  neighbor = olsr_lookup_nbr_entry(src, true);
+  if (!neighbor) {
+    OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d because no nbr entry found for %s\n",
+        msg->type, olsr_ip_to_string(&buf, src));
+    return 0;
+  }
+  if (!neighbor->is_sym) {
+    OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d because received by non-symmetric neighbor %s\n",
+        msg->type, olsr_ip_to_string(&buf, src));
+    return 0;
+  }
+
+  /* Check MPR */
+  if (neighbor->mprs_count == 0) {
+    OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d because we are no MPR for %s\n",
+        msg->type, olsr_ip_to_string(&buf, src));
+    /* don't forward packages if not a MPR */
+    return 0;
+  }
+
+  /* check if we already forwarded this message */
+  if (olsr_is_duplicate_message(msg, true, NULL)) {
+    OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d from %s because we already forwarded it.\n",
+        msg->type, olsr_ip_to_string(&buf, src));
+    return 0;                   /* it's a duplicate, forget about it */
+  }
+
+  /* Treat TTL hopcnt */
+  msg->hopcnt++;
+  msg->ttl--;
+  tmp = binary;
+  olsr_put_msg_hdr(&tmp, msg);
+
+  if (msg->ttl == 0) {
+    OLSR_DEBUG(LOG_PACKET_PARSING, "Not forwarding message type %d from %s because TTL is 0.\n",
+        msg->type, olsr_ip_to_string(&buf, src));
+    return 0;                   /* TTL 0, forget about it */
+  }
+  OLSR_DEBUG(LOG_PACKET_PARSING, "Forwarding message type %d from %s.\n",
+      msg->type, olsr_ip_to_string(&buf, src));
+
+  /* looping trough interfaces */
+  OLSR_FOR_ALL_INTERFACES(ifn, iterator) {
+    if (net_output_pending(ifn)) {
+      /* dont forward to incoming interface if interface is mode ether */
+      if (in_if->mode == IF_MODE_ETHER && ifn == in_if)
+        continue;
+
+      /*
+       * Check if message is to big to be piggybacked
+       */
+      if (net_outbuffer_push(ifn, binary, msg->size) != msg->size) {
+        /* Send */
+        net_output(ifn);
+        /* Buffer message */
+        set_buffer_timer(ifn);
+
+        if (net_outbuffer_push(ifn, binary, msg->size) != msg->size) {
+          OLSR_WARN(LOG_NETWORKING, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msg->size);
+        }
+      }
+    } else {
+      /* No forwarding pending */
+      set_buffer_timer(ifn);
+
+      if (net_outbuffer_push(ifn, binary, msg->size) != msg->size) {
+        OLSR_WARN(LOG_NETWORKING, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msg->size);
+      }
+    }
+  }
+
+  return 1;
+}
+
 /*
  * Local Variables:
  * c-basic-offset: 2
index 60bc43c..44e4f6c 100644 (file)
@@ -143,9 +143,7 @@ process_message_neighbors(struct nbr_entry *neighbor, const struct lq_hello_mess
         connector->second_hop_linkcost = new_second_hop_linkcost;
         connector->path_linkcost = new_path_linkcost;
 
-        if (olsr_cnf->lq_dlimit > 0) {
-          changes_neighborhood = true;
-        }
+        changes_neighborhood = true;
       }
     }
   }
index 097e783..8090599 100644 (file)
@@ -606,10 +606,8 @@ 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);
-    if (tc->msg_hops <= olsr_cnf->lq_dlimit) {
-      edge_change = 1;
-      OLSR_DEBUG(LOG_TC, "TC:   chg edge entry %s\n", olsr_tc_edge_to_string(tc_edge));
-    }
+    edge_change = 1;
+    OLSR_DEBUG(LOG_TC, "TC:   chg edge entry %s\n", olsr_tc_edge_to_string(tc_edge));
   }
 
   /* set edge and tc as non-virtual */