Add framework for changing unicast src-ip
authorHenning Rogge <hrogge@googlemail.com>
Wed, 24 Feb 2010 16:43:25 +0000 (17:43 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Wed, 24 Feb 2010 16:43:25 +0000 (17:43 +0100)
src/linux/kernel_routes_nl.c
src/olsr.c
src/olsr_cfg.h
src/olsr_spf.c
src/olsr_spf.h
src/process_routes.c
src/process_routes.h
src/unix/ifnet.c
src/win32/ifnet.c

index 659c44b..16f787f 100644 (file)
@@ -510,7 +510,7 @@ static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bo
 
   /* get src ip */
   if (olsr_cnf->use_src_ip_routes) {
-    src = &olsr_cnf->main_addr;
+    src = &olsr_cnf->unicast_src_ip;
   }
   else {
     src = NULL;
index 5658af2..2c35b55 100644 (file)
@@ -210,7 +210,7 @@ olsr_process_changes(void)
 
   /* calculate the routing table */
   if (changes_neighborhood || changes_topology || changes_hna) {
-    olsr_calculate_routing_table();
+    olsr_calculate_routing_table(false);
   }
 
   if (olsr_cnf->debug_level > 0) {
index 080d8d4..faffdd0 100644 (file)
@@ -257,7 +257,7 @@ struct olsrd_config {
   struct olsr_ip_prefix smart_gw_prefix;
 
   /* Main address of this node */
-  union olsr_ip_addr main_addr;
+  union olsr_ip_addr main_addr, unicast_src_ip;
   bool use_src_ip_routes;
 
   /* Stuff set by olsrd */
index 1836455..22324d2 100644 (file)
@@ -303,7 +303,7 @@ olsr_expire_spf_backoff(void *context __attribute__ ((unused)))
 }
 
 void
-olsr_calculate_routing_table(void)
+olsr_calculate_routing_table(bool force)
 {
 #ifdef SPF_PROFILING
   struct timeval t1, t2, t3, t4, t5, spf_init, spf_run, route, kernel, total;
@@ -319,10 +319,13 @@ olsr_calculate_routing_table(void)
   int path_count = 0;
 
   /* We are done if our backoff timer is running */
-  if (!spf_backoff_timer) {
+  if (!force) {
+    if (spf_backoff_timer) {
+      return;
+    }
+
+    /* start new backoff timer */
     spf_backoff_timer = olsr_start_timer(1000, 5, OLSR_TIMER_ONESHOT, &olsr_expire_spf_backoff, NULL, 0);
-  } else {
-    return;
   }
 
 #ifdef SPF_PROFILING
index 087970b..48e487a 100644 (file)
@@ -42,7 +42,7 @@
 #ifndef _OLSR_SPF_H
 #define _OLSR_SPF_H
 
-void olsr_calculate_routing_table(void);
+void olsr_calculate_routing_table(bool force);
 
 #endif
 
index e7fc23b..867f2d6 100644 (file)
@@ -439,6 +439,19 @@ olsr_update_kernel_routes(void)
 #endif
 }
 
+void
+olsr_force_kernelroutes_refresh(void) {
+  struct rt_entry *rt;
+
+  /* enqueue all existing routes for a rewrite */
+  OLSR_FOR_ALL_RT_ENTRIES(rt) {
+    olsr_enqueue_rt(&chg_kernel_list, rt);
+  } OLSR_FOR_ALL_RT_ENTRIES_END(rt)
+
+  /* trigger kernel route refresh */
+  olsr_chg_kernel_routes(&chg_kernel_list);
+}
+
 /*
  * Local Variables:
  * c-basic-offset: 2
index 272a410..3473b3a 100644 (file)
@@ -58,6 +58,7 @@ void olsr_update_kernel_routes(void);
 void olsr_delete_all_kernel_routes(void);
 uint8_t olsr_rt_flags(const struct rt_entry *);
 void olsr_delete_interface_routes(int if_index);
+void olsr_force_kernelroutes_refresh(void);
 
 #endif
 
index 3b56a41..4ccfe4e 100644 (file)
@@ -407,6 +407,7 @@ add_hemu_if(struct olsr_if *iface)
   memset(&null_addr, 0, olsr_cnf->ipsize);
   if (ipequal(&null_addr, &olsr_cnf->main_addr)) {
     olsr_cnf->main_addr = iface->hemu_ip;
+    olsr_cnf->unicast_src_ip = iface->hemu_ip;
     OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
     olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
   }
@@ -803,6 +804,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
   if (ipequal(&null_addr, &olsr_cnf->main_addr)) {
     struct ipaddr_str buf;
     olsr_cnf->main_addr = ifp->ip_addr;
+    olsr_cnf->unicast_src_ip = ifp->ip_addr;
     OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
     olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
   }
index 3dc2404..430d454 100644 (file)
@@ -511,6 +511,7 @@ add_hemu_if(struct olsr_if *iface)
   memset(&null_addr, 0, olsr_cnf->ipsize);
   if (ipequal(&null_addr, &olsr_cnf->main_addr)) {
     olsr_cnf->main_addr = iface->hemu_ip;
+    olsr_cnf->unicast_src_ip = iface->hemu_ip;
     OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
   }
 
@@ -873,6 +874,7 @@ chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__ ((unused)))
 
   if (ipequal(&NullAddr, &olsr_cnf->main_addr)) {
     olsr_cnf->main_addr = New->ip_addr;
+    olsr_cnf->unicast_src_ip = New->ip_addr;
     OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
   }