diff -Nur olsrd-0.4.10.orig/src/defs.h olsrd-0.4.10/src/defs.h --- olsrd-0.4.10.orig/src/defs.h 2006-11-28 21:17:27.000000000 +0100 +++ olsrd-0.4.10/src/defs.h 2006-11-28 21:18:46.000000000 +0100 @@ -68,10 +68,10 @@ #define OLSRD_GLOBAL_CONF_FILE "/etc/" OLSRD_CONF_FILE_NAME #endif -#define HOPCNT_MAX 32 /* maximum hops number */ +#define HOPCNT_MAX 64 /* maximum hops number */ #define MAXMESSAGESIZE 1500 /* max broadcast size */ #define UDP_IPV4_HDRSIZE 28 -#define UDP_IPV6_HDRSIZE 48 +#define UDP_IPV6_HDRSIZE 62 #define MAX_IFS 32 /* Debug helper macro */ diff -Nur olsrd-0.4.10.orig/src/interfaces.h olsrd-0.4.10/src/interfaces.h --- olsrd-0.4.10.orig/src/interfaces.h 2005-06-03 10:00:55.000000000 +0200 +++ olsrd-0.4.10/src/interfaces.h 2006-11-28 21:18:01.000000000 +0100 @@ -136,6 +136,8 @@ struct vtimes valtimes; struct if_gen_property *gen_properties;/* Generic interface properties */ + + int ttl_index; /* index in TTL array for fish-eye */ struct interface *int_next; }; diff -Nur olsrd-0.4.10.orig/src/link_set.c olsrd-0.4.10/src/link_set.c --- olsrd-0.4.10.orig/src/link_set.c 2006-11-28 21:17:27.000000000 +0100 +++ olsrd-0.4.10/src/link_set.c 2006-11-28 21:18:01.000000000 +0100 @@ -963,8 +963,9 @@ entry->loss_link_quality = (float)(entry->total_packets - entry->lost_packets) / - (float)(entry->loss_window_size); - + (float)(entry->loss_window_size < (2 * 4) ? entry->loss_window_size: + 4 * ((entry->loss_window_size / 4 - 1) * entry->total_packets + entry->loss_window_size) / entry->loss_window_size); + // multiply the calculated link quality with the user-specified multiplier entry->loss_link_quality *= entry->loss_link_multiplier; diff -Nur olsrd-0.4.10.orig/src/lq_packet.c olsrd-0.4.10/src/lq_packet.c --- olsrd-0.4.10.orig/src/lq_packet.c 2005-11-17 02:58:51.000000000 +0100 +++ olsrd-0.4.10/src/lq_packet.c 2006-11-28 21:18:01.000000000 +0100 @@ -149,9 +149,8 @@ int i; struct neighbor_entry *walker; struct link_entry *link; - static int ttl_list[] = { MAX_TTL, 3, 2, 1, 2, 1, 1, 3, 2, 1, 2, 1, 1, 0 }; - static int ttl_index = 0; - + static int ttl_list[] = { 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, MAX_TTL-1, 0}; + // remember that we have generated an LQ TC message; this is // checked in net_output() @@ -167,10 +166,13 @@ if (olsr_cnf->lq_fish > 0) { - if (ttl_list[ttl_index] == 0) - ttl_index = 0; + // SVEN_OLA: Too lazy to find the different iface inits. This will do it too. + if (outif->ttl_index >= sizeof(ttl_list) / sizeof(ttl_list[0])) outif->ttl_index = 0; + + if (ttl_list[outif->ttl_index] == 0) + outif->ttl_index = 0; - lq_tc->comm.ttl = ttl_list[ttl_index++]; + lq_tc->comm.ttl = ttl_list[outif->ttl_index++]; OLSR_PRINTF(3, "Creating LQ TC with TTL %d.\n", lq_tc->comm.ttl); } diff -Nur olsrd-0.4.10.orig/src/olsr.c olsrd-0.4.10/src/olsr.c --- olsrd-0.4.10.orig/src/olsr.c 2006-11-28 21:17:27.000000000 +0100 +++ olsrd-0.4.10/src/olsr.c 2006-11-28 21:18:01.000000000 +0100 @@ -68,6 +68,7 @@ olsr_bool changes_topology; olsr_bool changes_neighborhood; olsr_bool changes_hna; +olsr_bool changes_force; /** * Process changes functions @@ -142,6 +143,11 @@ OLSR_PRINTF(3, "CHANGES IN HNA\n") #endif + if(!changes_force && + 2 <= olsr_cnf->lq_level && + 0 >= olsr_cnf->lq_dlimit) + return; + if(!changes_neighborhood && !changes_topology && !changes_hna) @@ -171,11 +177,6 @@ olsr_calculate_routing_table(); olsr_calculate_hna_routes(); } - - else - { - olsr_calculate_lq_routing_table(); - } } else if (changes_topology) @@ -187,11 +188,6 @@ olsr_calculate_routing_table(); olsr_calculate_hna_routes(); } - - else - { - olsr_calculate_lq_routing_table(); - } } else if (changes_hna) @@ -202,11 +198,11 @@ { olsr_calculate_hna_routes(); } - - else - { - olsr_calculate_lq_routing_table(); - } + } + + if (olsr_cnf->lq_level >= 2) + { + olsr_calculate_lq_routing_table(); } if (olsr_cnf->debug_level > 0) @@ -243,6 +239,7 @@ changes_neighborhood = OLSR_FALSE; changes_topology = OLSR_FALSE; changes_hna = OLSR_FALSE; + changes_force = OLSR_FALSE; return; diff -Nur olsrd-0.4.10.orig/src/olsr.h olsrd-0.4.10/src/olsr.h --- olsrd-0.4.10.orig/src/olsr.h 2005-05-29 14:47:45.000000000 +0200 +++ olsrd-0.4.10/src/olsr.h 2006-11-28 21:18:01.000000000 +0100 @@ -49,6 +49,7 @@ extern olsr_bool changes_topology; extern olsr_bool changes_neighborhood; extern olsr_bool changes_hna; +extern olsr_bool changes_force; void register_pcf(int (*)(int, int, int)); diff -Nur olsrd-0.4.10.orig/src/scheduler.c olsrd-0.4.10/src/scheduler.c --- olsrd-0.4.10.orig/src/scheduler.c 2005-12-29 23:34:37.000000000 +0100 +++ olsrd-0.4.10/src/scheduler.c 2006-11-28 21:18:01.000000000 +0100 @@ -70,6 +70,7 @@ changes_neighborhood = OLSR_TRUE; changes_topology = OLSR_TRUE; + changes_force = OLSR_TRUE; } /** diff -Nur olsrd-0.4.10.orig/src/unix/ifnet.c olsrd-0.4.10/src/unix/ifnet.c --- olsrd-0.4.10.orig/src/unix/ifnet.c 2006-11-28 21:17:27.000000000 +0100 +++ olsrd-0.4.10/src/unix/ifnet.c 2006-11-28 21:18:01.000000000 +0100 @@ -690,6 +690,17 @@ return 1; } +static char basename[32]; +char* if_basename(char* name); +char* if_basename(char* name) +{ + char *p = strchr(name, ':'); + if (0 == p || p - name >= (int)(sizeof(basename) / sizeof(basename[0]) - 1)) return name; + memcpy(basename, name, p - name); + basename[p - name] = 0; + return basename; +} + /** * Initializes a interface described by iface, * if it is set up and is of the correct type. @@ -833,10 +844,10 @@ } /* Deactivate IP spoof filter */ - deactivate_spoof(ifr.ifr_name, iface->index, olsr_cnf->ip_version); + deactivate_spoof(if_basename(ifr.ifr_name), iface->index, olsr_cnf->ip_version); /* Disable ICMP redirects */ - disable_redirects(ifr.ifr_name, iface->index, olsr_cnf->ip_version); + disable_redirects(if_basename(ifr.ifr_name), iface->index, olsr_cnf->ip_version); } @@ -894,7 +905,7 @@ ifp->gen_properties = NULL; ifp->int_name = olsr_malloc(strlen(ifr.ifr_name) + 1, "Interface update 3"); - strcpy(ifp->int_name, ifr.ifr_name); + strcpy(ifp->int_name, if_basename(ifr.ifr_name)); /* Segfaults if using strncpy(IFNAMSIZ) why oh why?? */ ifp->int_next = ifnet; ifnet = ifp;