* applied patches from the most recent FreiFunkFirmware (and fixed compile errors...
authorBernd Petrovitsch <bernd@firmix.at>
Wed, 31 Jan 2007 12:36:50 +0000 (12:36 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Wed, 31 Jan 2007 12:36:50 +0000 (12:36 +0000)
  to http://www.olsr.org/pipermail/olsr-dev/2006-December/254036.html:
  - olsrd-libsmake.patch
  - olsrd-dyngwplain.patch
  - olsrd-txtinfo.patch
  - olsrd-quagga.patch
  - olsrd-quagga-routehandler.patch
  - olsrd-optimize.patch
  - olsrd-bmf-fixes.patch
  - olsrd-fixes-sven-ola.patch
  - olsrd-fixes-jhay-bsd.patch
  - olsrd-fixes-backport.patch
  - olsrd-fixes-routedel.patch
  - olsrd-cpu-overload.patch
  - olsrd-secure_key_path.patch
  - olsrd-hna_ip_fix.patch
  Not applied:
  - olsrd-nameservice+services.patch: This patch produced too many rejects to fix easily.
  - olsrd-fixes-eric.patch: This was not found on the webserver.
  - olsrd-bmf.patch: We had already a "bmf" plug-in in there.
* made the checksum type in the olsrd_secure plug-in "olsr_u8_t" (instead
   of a wild "char *" and "unsigned char *" mix) everywhere. It killed
   lots of warnings.
* localized the checksum_cache array in olsrd_secure.c.

29 files changed:
Makefile
lib/Makefile
lib/secure/src/olsrd_secure.c
lib/secure/src/olsrd_secure.h
lib/secure/src/secure_messages.h
src/cfgparser/oparse.y
src/defs.h
src/duplicate_set.c
src/hashing.c
src/hashing.h
src/link_set.c
src/link_set.h
src/linux/kernel_routes.c
src/lq_avl.c
src/lq_avl.h
src/lq_list.c
src/lq_list.h
src/lq_packet.c
src/lq_route.c
src/main.c
src/net_olsr.h
src/olsr.c
src/olsr.h
src/olsr_types.h
src/parser.c
src/process_routes.c
src/process_routes.h
src/scheduler.c
src/unix/ifnet.c

index 0412c0c..9b7c1c5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -35,7 +35,7 @@
 # to the project. For more information see the website or contact
 # the copyright holders.
 #
-# $Id: Makefile,v 1.73 2006/11/15 22:09:16 bernd67 Exp $
+# $Id: Makefile,v 1.74 2007/01/31 12:36:49 bernd67 Exp $
 
 VERS =         0.5.0pre
 
@@ -145,6 +145,11 @@ dyn_gw:
                $(MAKE) -C lib/dyn_gw
                $(MAKE) -C lib/dyn_gw install
 
+dyn_gw_plain:
+               $(MAKE) -C lib/dyn_gw_plain clean
+               $(MAKE) -C lib/dyn_gw_plain
+               $(MAKE) -C lib/dyn_gw_plain install
+
 secure:
                $(MAKE) -C lib/secure clean
                $(MAKE) -C lib/secure
index 20b42ce..a4afd17 100644 (file)
@@ -1,4 +1,4 @@
-SUBDIRS = dot_draw dyn_gw httpinfo mini nameservice secure tas bmf
+SUBDIRS := $(shell find -maxdepth 1 -type d -not -name ".*" -not -name "CVS" -printf "%f\n")
 
 .PHONY: $(SUBDIRS)
 
index cbe5706..ce860cf 100644 (file)
@@ -33,7 +33,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $Id: olsrd_secure.c,v 1.20 2006/11/06 23:46:47 bernd67 Exp $
+ * $Id: olsrd_secure.c,v 1.21 2007/01/31 12:36:49 bernd67 Exp $
  */
 
 
 #include "md5.h"
 
 static void
-MD5_checksum(char *data, olsr_u16_t data_len, char *hashbuf)
+MD5_checksum(const olsr_u8_t *data, const olsr_u16_t data_len, olsr_u8_t *hashbuf)
 {
   MD5_CTX context;
 
   MD5Init(&context);
-  MD5Update(&context, (unsigned char *)data, data_len);
-  MD5Final((unsigned char *)hashbuf, &context);
+  MD5Update(&context, data, data_len);
+  MD5Final(hashbuf, &context);
 }
 
 #define CHECKSUM MD5_checksum
@@ -395,7 +395,7 @@ check_auth(char *pck, int *size)
  * increase the size
  */
 int
-add_signature(char *pck, int *size)
+add_signature(olsr_u8_t *pck, int *size)
 {
   struct s_olsrmsg *msg;
 #ifdef DEBUG
@@ -431,6 +431,8 @@ add_signature(char *pck, int *size)
   /* Set the new size */
   *size = *size + sizeof(struct s_olsrmsg);
   
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
   memcpy(checksum_cache, pck, *size - SIGNATURE_SIZE);
@@ -439,7 +441,7 @@ add_signature(char *pck, int *size)
   
   /* Create the hash */
   CHECKSUM(checksum_cache, (*size - SIGNATURE_SIZE) + KEYLENGTH, &pck[*size - SIGNATURE_SIZE]);
+  } 
 
 #ifdef DEBUG
   olsr_printf(1, "Signature message:\n");
@@ -470,7 +472,7 @@ int
 validate_packet(char *pck, int *size)
 {
   int packetsize;
-  char sha1_hash[SIGNATURE_SIZE];
+  olsr_u8_t sha1_hash[SIGNATURE_SIZE];
   struct s_olsrmsg *sig;
   time_t rec_time;
 
@@ -540,17 +542,18 @@ validate_packet(char *pck, int *size)
   //olsr_printf(1, "Packet sane...\n");
 
  one_checksum_SHA:
-
+ {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
   memcpy(checksum_cache, pck, *size - SIGNATURE_SIZE);
   /* Then the key */
   memcpy(&checksum_cache[*size - SIGNATURE_SIZE], aes_key, KEYLENGTH);
 
-
   /* generate SHA-1 */
   CHECKSUM(checksum_cache, *size - SIGNATURE_SIZE + KEYLENGTH, sha1_hash);
-
+ }
 
 #ifdef DEBUG
   olsr_printf(1, "Recevied hash:\n");
@@ -683,6 +686,8 @@ send_challenge(union olsr_ip_addr *new_host)
 
   olsr_printf(3, "[ENC]Size: %d\n", sizeof(struct challengemsg));
 
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
   memcpy(checksum_cache, &cmsg, sizeof(struct challengemsg) - SIGNATURE_SIZE);
@@ -693,7 +698,7 @@ send_challenge(union olsr_ip_addr *new_host)
   CHECKSUM(checksum_cache, 
           (sizeof(struct challengemsg) - SIGNATURE_SIZE) + KEYLENGTH, 
           cmsg.signature);
-
+  }
   olsr_printf(3, "[ENC]Sending timestamp request to %s challenge 0x%x\n", 
              olsr_ip_to_string(new_host),
              challenge);
@@ -733,7 +738,7 @@ int
 parse_cres(char *in_msg)
 {
   struct c_respmsg *msg;
-  char sha1_hash[SIGNATURE_SIZE];
+  olsr_u8_t sha1_hash[SIGNATURE_SIZE];
   struct stamp *entry;
 
   msg = (struct c_respmsg *)in_msg;
@@ -751,6 +756,8 @@ parse_cres(char *in_msg)
 
   /* Check signature */
 
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
   memcpy(checksum_cache, msg, sizeof(struct c_respmsg) - SIGNATURE_SIZE);
@@ -761,6 +768,7 @@ parse_cres(char *in_msg)
   CHECKSUM(checksum_cache, 
           (sizeof(struct c_respmsg) - SIGNATURE_SIZE) + KEYLENGTH, 
           sha1_hash);
+  }
   
   if(memcmp(sha1_hash, &msg->signature, SIGNATURE_SIZE) != 0)
     {
@@ -782,6 +790,8 @@ parse_cres(char *in_msg)
   /* Generate the digest */
   olsr_printf(3, "[ENC]Entry-challenge 0x%x\n", entry->challenge);
 
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* First the challenge received */
   memcpy(checksum_cache, &entry->challenge, 4);
   /* Then the local IP */
@@ -791,7 +801,7 @@ parse_cres(char *in_msg)
   CHECKSUM(checksum_cache, 
           sizeof(olsr_u32_t) + olsr_cnf->ipsize, 
           sha1_hash);
-
+  }
 
   if(memcmp(msg->res_sig, sha1_hash, SIGNATURE_SIZE) != 0)
     {
@@ -830,7 +840,7 @@ int
 parse_rres(char *in_msg)
 {
   struct r_respmsg *msg;
-  char sha1_hash[SIGNATURE_SIZE];
+  olsr_u8_t sha1_hash[SIGNATURE_SIZE];
   struct stamp *entry;
 
   msg = (struct r_respmsg *)in_msg;
@@ -846,6 +856,8 @@ parse_rres(char *in_msg)
 
   /* Check signature */
 
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
   memcpy(checksum_cache, msg, sizeof(struct r_respmsg) - SIGNATURE_SIZE);
@@ -856,6 +868,7 @@ parse_rres(char *in_msg)
   CHECKSUM(checksum_cache, 
           (sizeof(struct r_respmsg) - SIGNATURE_SIZE) + KEYLENGTH, 
           sha1_hash);
+  }
   
   if(memcmp(sha1_hash, &msg->signature, SIGNATURE_SIZE) != 0)
     {
@@ -877,6 +890,8 @@ parse_rres(char *in_msg)
   /* Generate the digest */
   olsr_printf(3, "[ENC]Entry-challenge 0x%x\n", entry->challenge);
 
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* First the challenge received */
   memcpy(checksum_cache, &entry->challenge, 4);
   /* Then the local IP */
@@ -886,7 +901,7 @@ parse_rres(char *in_msg)
   CHECKSUM(checksum_cache, 
           sizeof(olsr_u32_t) + olsr_cnf->ipsize, 
           sha1_hash);
-
+  }
 
   if(memcmp(msg->res_sig, sha1_hash, SIGNATURE_SIZE) != 0)
     {
@@ -920,7 +935,7 @@ int
 parse_challenge(char *in_msg)
 {
   struct challengemsg *msg;
-  char sha1_hash[SIGNATURE_SIZE];
+  olsr_u8_t sha1_hash[SIGNATURE_SIZE];
   struct stamp *entry;
   olsr_u32_t hash;
 
@@ -968,6 +983,8 @@ parse_challenge(char *in_msg)
 
   /* Check signature */
 
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
   memcpy(checksum_cache, msg, sizeof(struct challengemsg) - SIGNATURE_SIZE);
@@ -978,7 +995,7 @@ parse_challenge(char *in_msg)
   CHECKSUM(checksum_cache, 
           (sizeof(struct challengemsg) - SIGNATURE_SIZE) + KEYLENGTH, 
           sha1_hash);
-  
+  }  
   if(memcmp(sha1_hash, &msg->signature, SIGNATURE_SIZE) != 0)
     {
       olsr_printf(1, "[ENC]Signature missmatch in challenge!\n");
@@ -1047,6 +1064,8 @@ send_cres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in,
 
   /* Create digest of received challenge + IP */
 
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* Create packet + key cache */
   /* First the challenge received */
   memcpy(checksum_cache, &chal_in, 4);
@@ -1057,10 +1076,12 @@ send_cres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in,
   CHECKSUM(checksum_cache, 
           sizeof(olsr_u32_t) + olsr_cnf->ipsize, 
           crmsg.res_sig);
-
+  }
 
   /* Now create the digest of the message and the key */
 
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
   memcpy(checksum_cache, &crmsg, sizeof(struct c_respmsg) - SIGNATURE_SIZE);
@@ -1071,6 +1092,7 @@ send_cres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in,
   CHECKSUM(checksum_cache, 
           (sizeof(struct c_respmsg) - SIGNATURE_SIZE) + KEYLENGTH, 
           crmsg.signature);
+  }
 
   olsr_printf(3, "[ENC]Sending challenge response to %s challenge 0x%x\n", 
              olsr_ip_to_string(to),
@@ -1120,6 +1142,8 @@ send_rres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in)
 
   /* Create digest of received challenge + IP */
 
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* Create packet + key cache */
   /* First the challenge received */
   memcpy(checksum_cache, &chal_in, 4);
@@ -1130,10 +1154,12 @@ send_rres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in)
   CHECKSUM(checksum_cache, 
           sizeof(olsr_u32_t) + olsr_cnf->ipsize, 
           rrmsg.res_sig);
-
+  }
 
   /* Now create the digest of the message and the key */
 
+  {
+  olsr_u8_t checksum_cache[512 + KEYLENGTH];
   /* Create packet + key cache */
   /* First the OLSR packet + signature message - digest */
   memcpy(checksum_cache, &rrmsg, sizeof(struct r_respmsg) - SIGNATURE_SIZE);
@@ -1144,6 +1170,7 @@ send_rres(union olsr_ip_addr *to, union olsr_ip_addr *from, olsr_u32_t chal_in)
   CHECKSUM(checksum_cache, 
           (sizeof(struct r_respmsg) - SIGNATURE_SIZE) + KEYLENGTH, 
           rrmsg.signature);
+  }
 
   olsr_printf(3, "[ENC]Sending response response to %s\n", 
              olsr_ip_to_string(to));
index 27e42aa..efc9149 100644 (file)
@@ -46,7 +46,7 @@
 #include "hashing.h"
 
 
-#define KEYFILE "/root/.olsr/olsrd_secure_key"
+#define KEYFILE "/etc/olsrd.d/olsrd_secure_key"
 
 /* Schemes */
 #define ONE_CHECKSUM          1
@@ -91,8 +91,6 @@ struct stamp
 
 struct stamp timestamps[HASHSIZE];
 
-char checksum_cache[512 + KEYLENGTH];
-
 /* Input interface */
 struct interface *olsr_in_if;
 
@@ -136,7 +134,7 @@ int
 ipc_send(char *, int);
 
 int
-add_signature(char *, int*);
+add_signature(olsr_u8_t *, int*);
 
 int
 validate_packet(char *, int*);
index b45ef3c..7038f2c 100644 (file)
@@ -33,7 +33,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $Id: secure_messages.h,v 1.1 2005/05/29 12:47:44 br1 Exp $
+ * $Id: secure_messages.h,v 1.2 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -128,7 +128,7 @@ struct challengemsg
   olsr_u32_t    destination;
   olsr_u32_t    challenge;
 
-  char          signature[SIGSIZE];
+  olsr_u8_t     signature[SIGSIZE];
 
 };
 
@@ -148,10 +148,9 @@ struct c_respmsg
   olsr_u32_t    challenge;
   time_t        timestamp;
 
-  char          res_sig[SIGSIZE];
-
-  char          signature[SIGSIZE];
+  olsr_u8_t     res_sig[SIGSIZE];
 
+  olsr_u8_t     signature[SIGSIZE];
 };
 
 
@@ -168,9 +167,9 @@ struct r_respmsg
   olsr_u32_t    destination;
   time_t        timestamp;
 
-  char          res_sig[SIGSIZE];
+  olsr_u8_t     res_sig[SIGSIZE];
 
-  char          signature[SIGSIZE];
+  olsr_u8_t     signature[SIGSIZE];
 };
 
 
index ddfe8c4..be86710 100644 (file)
@@ -38,7 +38,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: oparse.y,v 1.30 2006/12/12 11:22:15 kattemat Exp $
+ * $Id: oparse.y,v 1.31 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -722,6 +722,7 @@ ihna4entry:     TOK_IP4_ADDR TOK_IP4_ADDR
       return -1;
     }
   h->netmask.v4 = in.s_addr;
+  h->net.v4 &= h->netmask.v4;
   /* Queue */
   h->next = cnf->hna4_entries;
   cnf->hna4_entries = h;
index 4f7e742..abbed15 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: defs.h,v 1.54 2006/11/15 23:07:59 bernd67 Exp $
+ * $Id: defs.h,v 1.55 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -70,7 +70,7 @@
 
 #define        MAXMESSAGESIZE          1500    /* max broadcast size */
 #define UDP_IPV4_HDRSIZE        28
-#define UDP_IPV6_HDRSIZE        48
+#define UDP_IPV6_HDRSIZE        62
 
 #define MIN_PACKET_SIZE(ver)  (int)(sizeof(olsr_u8_t) * ((ver == AF_INET) ? 4 : 7))
 /* Debug helper macro */
index aa1cfe1..7150a2b 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: duplicate_set.c,v 1.12 2005/02/27 18:39:43 kattemat Exp $
+ * $Id: duplicate_set.c,v 1.13 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -93,7 +93,7 @@ olsr_add_dup_entry(union olsr_ip_addr *originator, olsr_u16_t seqno)
 
 
   /* Hash the senders address */
-  hash = olsr_hashing(originator);
+  hash = HASHMASK & seqno;
 
   new_dup_entry = olsr_malloc(sizeof(struct dup_entry), "New dup entry");
 
@@ -131,7 +131,7 @@ olsr_check_dup_table_proc(union olsr_ip_addr *originator, olsr_u16_t seqno)
   struct dup_entry *tmp_dup_table;
 
   /* Hash the senders address */
-  hash = olsr_hashing(originator);
+  hash = HASHMASK & seqno;
 
   /* Check for entry */
   for(tmp_dup_table = dup_set[hash].next;
@@ -163,7 +163,7 @@ olsr_check_dup_table_fwd(union olsr_ip_addr *originator,
   struct dup_entry *tmp_dup_table;
 
   /* Hash the senders address */
-  hash = olsr_hashing(originator);
+  hash = HASHMASK & seqno;
 
   /* Check for entry */
   for(tmp_dup_table = dup_set[hash].next;
@@ -268,7 +268,7 @@ olsr_update_dup_entry(union olsr_ip_addr *originator,
   struct dup_iface *new_iface;
 
   /* Hash the senders address */
-  hash = olsr_hashing(originator);
+  hash = HASHMASK & seqno;
 
 
   /* Check for entry */
@@ -313,7 +313,7 @@ olsr_set_dup_forward(union olsr_ip_addr *originator,
   struct dup_entry *tmp_dup_table;
 
   /* Hash the senders address */
-  hash = olsr_hashing(originator);
+  hash = HASHMASK & seqno;
 
   /* Check for entry */
   for(tmp_dup_table = dup_set[hash].next;
index b774c0a..be79d05 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: hashing.c,v 1.9 2005/02/20 18:52:18 kattemat Exp $
+ * $Id: hashing.c,v 1.10 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -58,7 +58,7 @@ olsr_hashing(union olsr_ip_addr *address)
 
   if(olsr_cnf->ip_version == AF_INET)
     /* IPv4 */  
-    hash = (ntohl(address->v4));
+    hash = address->v4x[0] ^ address->v4x[1] ^ address->v4x[2] ^ address->v4x[3];
   else
     {
       /* IPv6 */
index 79100ef..d09dd87 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: hashing.h,v 1.8 2005/02/20 18:52:18 kattemat Exp $
+ * $Id: hashing.h,v 1.9 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
 #ifndef _OLSR_HASHING
 #define _OLSR_HASHING
 
-#define        HASHSIZE        32
+#define        HASHSIZE        128
 #define        HASHMASK        (HASHSIZE - 1)
 
 #include "olsr_types.h"
index 30e7f65..7a213d3 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: link_set.c,v 1.64 2006/12/14 11:29:19 bernd67 Exp $
+ * $Id: link_set.c,v 1.65 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -382,6 +382,69 @@ static void set_loss_link_multiplier(struct link_entry *entry)
 }
 
 /**
+ *Delete all interface link entries
+ *
+ *@param interface ip address
+ */
+
+void
+del_if_link_entries(union olsr_ip_addr *int_addr)
+{
+  struct link_entry *tmp_link_set, *last_link_entry;
+
+  if(link_set == NULL)
+    return;
+
+  tmp_link_set = link_set;
+  last_link_entry = NULL;
+
+  while(tmp_link_set)
+    {
+
+      if(COMP_IP(int_addr, &tmp_link_set->local_iface_addr))
+        {
+          if(last_link_entry != NULL)
+            {
+              last_link_entry->next = tmp_link_set->next;
+
+              /* Delete neighbor entry */
+              if(tmp_link_set->neighbor->linkcount == 1)
+                olsr_delete_neighbor_table(&tmp_link_set->neighbor->neighbor_main_addr);
+              else
+                tmp_link_set->neighbor->linkcount--;
+
+              //olsr_delete_neighbor_if_no_link(&tmp_link_set->neighbor->neighbor_main_addr);
+              changes_neighborhood = OLSR_TRUE;
+
+              free(tmp_link_set);
+              tmp_link_set = last_link_entry;
+            }
+          else
+            {
+              link_set = tmp_link_set->next; /* CHANGED */
+
+              /* Delete neighbor entry */
+              if(tmp_link_set->neighbor->linkcount == 1)
+                olsr_delete_neighbor_table(&tmp_link_set->neighbor->neighbor_main_addr);
+              else
+                tmp_link_set->neighbor->linkcount--;
+
+              changes_neighborhood = OLSR_TRUE;
+
+              free(tmp_link_set);
+              tmp_link_set = link_set;
+              continue;
+            }
+        }
+
+      last_link_entry = tmp_link_set;
+      tmp_link_set = tmp_link_set->next;
+    }
+
+  return;
+}
+
+/**
  *Nothing mysterious here.
  *Adding a new link entry to the link set.
  *
@@ -959,8 +1022,9 @@ static void update_packet_loss_worker(struct link_entry *entry, int lost)
 
   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;
index 63bb1c4..ac62544 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: link_set.h,v 1.29 2006/12/14 11:29:19 bernd67 Exp $
+ * $Id: link_set.h,v 1.30 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -117,6 +117,9 @@ get_hold_time_neighbor(void);
 void
 olsr_init_link_set(void);
 
+void
+del_if_link_entries(union olsr_ip_addr *);
+
 struct link_entry *
 get_best_link_to_neighbor(union olsr_ip_addr *);
 
index 4e03992..d742877 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: kernel_routes.c,v 1.19 2006/01/07 08:16:24 kattemat Exp $
+ * $Id: kernel_routes.c,v 1.20 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -240,9 +240,8 @@ olsr_ioctl_del_route(struct rt_entry *destination)
   inet_ntop(AF_INET, &destination->rt_mask.v4, mask_str, 16);
   inet_ntop(AF_INET, &destination->rt_router.v4, router_str, 16);
 
-  OLSR_PRINTF(1, "(ioctl)Deleting route with metric %d to %s/%s via %s/%s.\n",
-              destination->rt_metric, dst_str, mask_str, router_str,
-              destination->rt_if->int_name)
+  OLSR_PRINTF(1, "(ioctl)Deleting route with metric %d to %s/%s via %s.\n",
+              destination->rt_metric, dst_str, mask_str, router_str)
   
   memset(&kernel_route,0,sizeof(struct rtentry));
 
index 0f01c48..b537c54 100755 (executable)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_avl.c,v 1.1 2005/01/22 14:30:57 tlopatic Exp $
+ * $Id: lq_avl.c,v 1.2 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 #include <stddef.h>
+#ifndef DISABLE_SVEN_OLA
+#include <time.h>
+#endif
 
 #include "lq_avl.h"
 
@@ -52,11 +55,33 @@ void avl_init(struct avl_tree *tree, int (*comp)(void *, void *))
   tree->comp = comp;
 }
 
+#ifndef DISABLE_SVEN_OLA
+static struct avl_node *avl_find_rec_ipv4(struct avl_node *node, void *key)
+{
+  if (*(unsigned int *)key < *(unsigned int *)node->key) {
+    if (node->left != NULL) {
+      return avl_find_rec_ipv4(node->left, key);
+    }
+  }
+  else if (*(unsigned int *)key > *(unsigned int *)node->key) {
+    if (node->right != NULL) {
+      return avl_find_rec_ipv4(node->right, key);
+    }
+  }
+  return node;
+}
+#endif
+
 static struct avl_node *avl_find_rec(struct avl_node *node, void *key,
                                      int (*comp)(void *, void *))
 {
   int diff;
 
+#ifndef DISABLE_SVEN_OLA
+  if (0 == comp) {
+    return avl_find_rec_ipv4(node, key);
+  }
+#endif
   diff = (*comp)(key, node->key);
 
   if (diff < 0)
@@ -87,6 +112,13 @@ struct avl_node *avl_find(struct avl_tree *tree, void *key)
 
   node = avl_find_rec(tree->root, key, tree->comp);
 
+#ifndef DISABLE_SVEN_OLA
+  if (0 == tree->comp) {
+    if (0 != svenola_avl_comp_ipv4(node->key, key))
+      return NULL;
+  }
+  else
+#endif
   if ((*tree->comp)(node->key, key) != 0)
     return NULL;
 
@@ -228,6 +260,12 @@ int avl_insert(struct avl_tree *tree, struct avl_node *new)
 
   node = avl_find_rec(tree->root, new->key, tree->comp);
 
+#ifndef DISABLE_SVEN_OLA
+  if (0 == tree->comp) {
+    diff = svenola_avl_comp_ipv4(new->key, node->key);
+  }
+  else
+#endif
   diff = (*tree->comp)(new->key, node->key);
 
   if (diff == 0)
index 69577b6..f68e161 100755 (executable)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_avl.h,v 1.2 2005/02/20 18:52:18 kattemat Exp $
+ * $Id: lq_avl.h,v 1.3 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 #ifndef _LQ_AVL_H
@@ -62,4 +62,9 @@ void avl_init(struct avl_tree *, int (*)(void *, void *));
 struct avl_node *avl_find(struct avl_tree *, void *);
 int avl_insert(struct avl_tree *, struct avl_node *);
 
+#ifndef DISABLE_SVEN_OLA
+#define svenola_avl_comp_ipv4(ip1, ip2) \
+  (*(unsigned int *)ip1 == *(unsigned int *)ip2 ? 0 : \
+  *(unsigned int *)ip1 < *(unsigned int *)ip2 ? -1 : +1)
+#endif
 #endif
index 820e866..9fa4799 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_list.c,v 1.3 2004/12/04 17:06:57 tlopatic Exp $
+ * $Id: lq_list.c,v 1.4 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 #include <stdlib.h>
@@ -48,6 +48,7 @@ void list_init(struct list *list)
   list->tail = NULL;
 }
 
+#ifdef DISABLE_SVEN_OLA
 struct list_node *list_get_head(struct list *list)
 {
   return list->head;
@@ -67,6 +68,7 @@ struct list_node *list_get_prev(struct list_node *node)
 {
   return node->prev;
 }
+#endif
 
 void list_add_head(struct list *list, struct list_node *node)
 {
index 5e3e0da..e7aa285 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_list.h,v 1.3 2005/02/20 18:52:18 kattemat Exp $
+ * $Id: lq_list.h,v 1.4 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 #ifndef _LQ_LIST_H
@@ -58,11 +58,18 @@ struct list
 
 void list_init(struct list *list);
 
+#ifndef DISABLE_SVEN_OLA
+#define list_get_head(node) (node)->head
+#define list_get_tail(node) (node)->tail
+#define list_get_next(node) (node)->next
+#define list_get_prev(node) (node)->prev
+#else
 struct list_node *list_get_head(struct list *list);
 struct list_node *list_get_tail(struct list *list);
 
 struct list_node *list_get_next(struct list_node *node);
 struct list_node *list_get_prev(struct list_node *node);
+#endif
 
 void list_add_head(struct list *list, struct list_node *node);
 void list_add_tail(struct list *list, struct list_node *node);
index f267338..ae145d2 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_packet.c,v 1.21 2006/10/11 20:58:45 tlopatic Exp $
+ * $Id: lq_packet.c,v 1.22 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 #include "olsr_protocol.h"
@@ -150,7 +150,7 @@ create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif)
   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_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,9 +167,13 @@ create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif)
 
   if (olsr_cnf->lq_fish > 0)
   {
+    // SVEN_OLA: Too lazy to find the different iface inits. This will do it too.
+    if (outif->ttl_index >= (int)(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[outif->ttl_index++];
 
     OLSR_PRINTF(3, "Creating LQ TC with TTL %d.\n", lq_tc->comm.ttl);
@@ -223,8 +227,10 @@ create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif)
 
           link = get_best_link_to_neighbor(&neigh->main);
 
-          neigh->link_quality = link->loss_link_quality;
-          neigh->neigh_link_quality = link->neigh_link_quality;
+          if (link) {
+            neigh->link_quality = link->loss_link_quality;
+            neigh->neigh_link_quality = link->neigh_link_quality;
+          }
 
           // queue the neighbour entry
 
index 4bbe3fc..708e3ee 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_route.c,v 1.42 2006/12/14 11:29:20 bernd67 Exp $
+ * $Id: lq_route.c,v 1.43 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 #include "defs.h"
@@ -77,6 +77,7 @@ static int avl_comp_ipv6(void *ip1, void *ip2)
   return memcmp(ip1, ip2, olsr_cnf->ipsize);
 }
 
+#ifdef DISABLE_SVEN_OLA
 static int avl_comp_ipv4(void *ip1, void *ip2)
 {
   if (*(unsigned int *)ip1 < *(unsigned int *)ip2)
@@ -87,6 +88,7 @@ static int avl_comp_ipv4(void *ip1, void *ip2)
 
   return 1;
 }
+#endif
 
 static int (*avl_comp)(void *, void *);
 
@@ -204,7 +206,16 @@ static void create_vertex_list_rec(struct list *vertex_list,
     create_vertex_list_rec(vertex_list, node->left, comp);
 
   // add the vertex to the list, if it's not us
-
+#ifndef DISABLE_SVEN_OLA
+  if (NULL == comp) {
+    if (svenola_avl_comp_ipv4(&olsr_cnf->main_addr, node->key) != 0)
+    {
+      vert->node.data = vert;
+      list_add_tail(vertex_list, &vert->node);
+    }
+  }
+  else
+#endif
   if ((*comp)(&olsr_cnf->main_addr, node->key) != 0)
   {
     vert->node.data = vert;
@@ -266,6 +277,156 @@ static void free_everything(struct list *vertex_list)
 }
 
 // XXX - bad complexity
+#define SVEN_OPT
+#undef SVEN_OPT_DBG
+
+/*
+ * The function extract_best() is most expensive (>50% CPU in profiling).
+ * It is called in two modes: while doing Dijkstra route calculation and
+ * while searching for a direct route/hna. The latter can be optimized
+ * because the stored verices do not change from call to call and it is
+ * more sufficient to have them sorted/popped from a list rather than 
+ * searching the complete list by every call. Sven-Ola@gmx.de, 11/2006
+ */
+#ifdef SVEN_OPT
+static struct dijk_vertex **etx_cache = 0;
+static int etx_cache_count;
+static int etx_cache_get;
+#ifdef SVEN_OPT_DBG
+static int etx_cache_saved = 0;
+#endif
+
+static int etx_cache_compare(const void *a, const void *b)
+{
+  // Oh jeah. I love this macro assembler :)
+  
+  if ((*(struct dijk_vertex **)a)->path_etx > (*(struct dijk_vertex **)b)->path_etx) return 1;
+  if ((*(struct dijk_vertex **)a)->path_etx < (*(struct dijk_vertex **)b)->path_etx) return -1;
+  
+  // This is for debugging only: etx==etx then compare pointers
+  // to make it possible to compare to the original search algo.
+  if (*(struct dijk_vertex **)a > *(struct dijk_vertex **)b) return 1;
+  if (*(struct dijk_vertex **)a < *(struct dijk_vertex **)b) return -1;
+  
+  return 0;
+}
+
+static struct dijk_vertex *extract_best_route(struct list *vertex_list)
+{
+#ifdef SVEN_OPT_DBG
+  float best_etx = INFINITE_ETX + 1.0;
+#endif
+  struct list_node *node;
+  struct dijk_vertex *vert;
+  struct dijk_vertex *res = NULL;
+
+#ifdef SVEN_OPT_DBG
+  node = list_get_head(vertex_list);
+
+  // loop through all vertices
+  
+  while (node != NULL)
+  {
+    vert = node->data;
+
+    // see whether the current vertex is better than what we have
+
+    if (!vert->done && vert->path_etx < best_etx)
+    {
+      best_etx = vert->path_etx;
+      res = vert;
+    }
+    else if (!vert->done && vert->path_etx == best_etx && vert < res)
+    {
+      // Otherwise order is undefined if etx==etx and debug will complain
+      best_etx = vert->path_etx;
+      res = vert;
+    }
+
+    node = list_get_next(node);
+  }
+#endif
+  if (NULL == etx_cache)
+  {
+    int count = 0;
+    node = list_get_head(vertex_list);
+    while (node != NULL)
+    {
+      vert = node->data;
+      if (!vert->done && vert->path_etx < INFINITE_ETX) count++;
+      node = list_get_next(node);
+    }
+    if (0 < count)
+    {
+      etx_cache = olsr_malloc(sizeof(etx_cache[0]) * count, "ETX Cache");
+#ifdef SVEN_OPT_DBG
+      printf("count=%d, Malloc(%d)=%p\n", count, sizeof(etx_cache[0]) * count, etx_cache);
+#endif
+      node = list_get_head(vertex_list);
+      etx_cache_count = 0;
+      etx_cache_get = 0;
+      while (node != NULL)
+      {
+        vert = node->data;
+        if (!vert->done && vert->path_etx < INFINITE_ETX)
+        {
+          etx_cache[etx_cache_count] = vert;
+          etx_cache_count++;
+        }
+        node = list_get_next(node);
+      }
+#ifdef SVEN_OPT_DBG
+      printf("qsort(etx_cache_count=%d)\n", etx_cache_count);
+#endif
+      qsort(etx_cache, etx_cache_count, sizeof(etx_cache[0]), etx_cache_compare);
+#ifdef SVEN_OPT_DBG
+      if (0 < etx_cache_count)
+      {
+        int i = 0; 
+        while(i < etx_cache_count && i < 10)
+        {
+          printf("%d: %p=%f\n", i, etx_cache[i], etx_cache[i]->path_etx);
+          i++;
+        }
+      }
+#endif
+    }
+  }
+
+#ifdef SVEN_OPT_DBG
+  if (NULL != etx_cache)
+  {
+    struct dijk_vertex *rescache = NULL;
+    if (etx_cache_get < etx_cache_count)
+    {
+      rescache = etx_cache[etx_cache_get++];
+    }
+    if (res != rescache)
+    {
+      printf("miss: etx_cache_get=%d, res=%p,%f != rescache=%p,%f\n",
+        etx_cache_get, res, (NULL != res ? res->path_etx : -1), rescache, (NULL != rescache ? rescache->path_etx : -1));
+    }
+    else
+    {
+      etx_cache_saved++;
+    }
+  }
+#else
+  if (NULL != etx_cache && etx_cache_get < etx_cache_count)
+  {
+    res = etx_cache[etx_cache_get++];
+  }
+#endif
+
+  // if we've found a vertex, remove it from the set
+
+  if (res != NULL)
+    res->done = OLSR_TRUE;
+
+  return res;
+}
+#endif // SVEN_OPT
 
 static struct dijk_vertex *extract_best(struct list *vertex_list)
 {
@@ -371,8 +532,11 @@ void olsr_calculate_lq_routing_table(void)
   struct interface *inter;
 
   if (olsr_cnf->ipsize == 4)
+#ifndef DISABLE_SVEN_OLA
+    avl_comp = 0;
+#else
     avl_comp = avl_comp_ipv4;
-
+#endif
   else
     avl_comp = avl_comp_ipv6;
 
@@ -614,13 +778,27 @@ void olsr_calculate_lq_routing_table(void)
 
   // add HNA routes - the set of unprocessed network nodes contains
   // all reachable network nodes
+#ifdef SVEN_OPT
+#ifdef SVEN_OPT_DBG
+  printf("free etx_cache, saved compares=%d, etx_cache=%p\n", etx_cache_saved, etx_cache);
+  etx_cache_saved = 0;
+#endif
+  if (NULL != etx_cache) {
+    free(etx_cache);
+    etx_cache = NULL;
+  }
+#endif
 
   for (;;)
   {
     // extract the network node with the best ETX and remove it
     // from the set of unprocessed network nodes
 
+#ifdef SVEN_OPT
+    vert = extract_best_route(&vertex_list);
+#else
     vert = extract_best(&vertex_list);
+#endif
 
     // no more nodes left
 
index 37c1bd0..14d68a2 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: main.c,v 1.89 2006/04/14 05:04:16 kattemat Exp $
+ * $Id: main.c,v 1.90 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 #include <unistd.h>
@@ -282,6 +282,9 @@ main(int argc, char *argv[])
   /* Initialize parser */
   olsr_init_parser();
 
+  /* Initialize route-exporter */
+  olsr_init_export_route();
+
   /* Initialize message sequencnumber */
   init_msg_seqno();
 
@@ -510,7 +513,7 @@ print_usage()
   fprintf(stderr, "  [-hint <hello interval (secs)>] [-tcint <tc interval (secs)>]\n");
   fprintf(stderr, "  [-midint <mid interval (secs)>] [-hnaint <hna interval (secs)>]\n");
   fprintf(stderr, "  [-T <Polling Rate (secs)>] [-nofork] [-hemu <ip_address>] \n"); 
-
+  fprintf(stderr, "  [-lql <LQ level>] [-lqw <LQ winsize>]\n");
 }
 
 
index 1fae727..ad50c27 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net_olsr.h,v 1.5 2006/11/15 21:13:52 bernd67 Exp $
+ * $Id: net_olsr.h,v 1.6 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -49,7 +49,7 @@
 #include <arpa/inet.h>
 #include <net/if.h>
 
-typedef int (*packet_transform_function)(char *, int *);
+typedef int (*packet_transform_function)(olsr_u8_t *, int *);
 
 #ifdef USE_LIBNET
 char *
index ee7d9cd..dc65429 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr.c,v 1.48 2006/01/07 08:16:20 kattemat Exp $
+ * $Id: olsr.c,v 1.49 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 /**
@@ -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_process_changes()
     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_process_changes()
           olsr_calculate_routing_table();
           olsr_calculate_hna_routes();
         }
-
-      else
-        {
-          olsr_calculate_lq_routing_table();
-        }
     }
   
   else if (changes_topology)
@@ -187,11 +188,6 @@ olsr_process_changes()
           olsr_calculate_routing_table();
           olsr_calculate_hna_routes();
         }
-
-      else
-        {
-          olsr_calculate_lq_routing_table();
-        }
     }
 
   else if (changes_hna)
@@ -202,11 +198,11 @@ olsr_process_changes()
         {
           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)
@@ -239,6 +235,7 @@ olsr_process_changes()
   changes_neighborhood = OLSR_FALSE;
   changes_topology = OLSR_FALSE;
   changes_hna = OLSR_FALSE;
+  changes_force = OLSR_FALSE;
 
 
   return;
index cabd047..245db62 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr.h,v 1.24 2005/05/29 12:47:45 br1 Exp $
+ * $Id: olsr.h,v 1.25 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -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));
index 26fd79f..26dc749 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr_types.h,v 1.4 2005/05/15 12:57:24 kattemat Exp $
+ * $Id: olsr_types.h,v 1.5 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 /*
@@ -93,6 +93,7 @@ typedef int             olsr_32_t;
 union olsr_ip_addr
 {
   olsr_u32_t v4;
+  olsr_u8_t v4x[4];
   struct in6_addr v6;
 };
 
index 1f804f7..f6fe3d6 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: parser.c,v 1.31 2006/12/14 11:29:20 bernd67 Exp $
+ * $Id: parser.c,v 1.32 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 #include "parser.h"
 #define strerror(x) StrError(x)
 #endif
 
+/* Sven-Ola: On very slow devices used in huge networks
+ * the amount of lq_tc messages is so high, that the 
+ * recv() loop never ends. This is a small hack to end
+ * the loop in this cases
+ */
+unsigned int cpu_overload_exit = 0;
+
 struct parse_function_entry *parse_functions;
 
 static char inbuf[MAXMESSAGESIZE+1];
@@ -355,9 +363,16 @@ olsr_input(int fd)
   int cc;
   struct interface *olsr_in_if;
   union olsr_ip_addr from_addr;
-
+  cpu_overload_exit = 0;
+  
   for (;;) 
     {
+      if (32 < ++cpu_overload_exit)
+      {
+        OLSR_PRINTF(1, "CPU overload detected, ending olsr_input() loop\n")
+       break;
+      }
+      
       fromlen = sizeof(struct sockaddr_storage);
 
       cc = olsr_recvfrom(fd, 
index 26f8007..f5e36be 100644 (file)
@@ -3,6 +3,9 @@
  * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
  * All rights reserved.
  *
+ * export_route_entry interface added by Immo 'FaUl Wehrenberg 
+ * <immo@chaostreff-dortmund.de>
+ *
  * Redistribution and use in source and binary forms, with or without 
  * modification, are permitted provided that the following conditions 
  * are met:
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: process_routes.c,v 1.29 2006/12/14 11:29:20 bernd67 Exp $
+ * $Id: process_routes.c,v 1.30 2007/01/31 12:36:50 bernd67 Exp $
  */
 
-
 #include "defs.h"
 #include "olsr.h"
 #include "log.h"
 #define strerror(x) StrError(x)
 #endif
 
+struct export_route_entry
+{
+  olsr_u8_t type;       /* AF_INET/AF_INET6 */
+  int (*function)(struct rt_entry*);
+  struct export_route_entry *next;
+};
+
+
+static struct export_route_entry *add_routes;
+static struct export_route_entry *del_routes;
+
 
 struct rt_entry old_routes[HASHSIZE];
 struct rt_entry old_hna[HASHSIZE];
 
+void 
+olsr_addroute_add_function(int (*function)(struct rt_entry*), olsr_u8_t type) 
+{
+  struct export_route_entry *tmp;
+  tmp = olsr_malloc(sizeof *tmp, "olsr_addroute_add_function");
+  tmp->type = type;
+  tmp->function = function;
+  tmp->next = add_routes;
+  add_routes = tmp;
+}
+
+void 
+olsr_delroute_add_function(int (*function) (struct rt_entry*), olsr_u8_t type)
+{
+  struct export_route_entry *tmp;
+  tmp = olsr_malloc(sizeof *tmp, "olsr_delroute_add_function");
+  tmp->type = type;
+  tmp->function = function;
+  tmp->next = del_routes;
+  del_routes = tmp;
+}
+
+
+int 
+olsr_addroute_remove_function(int (*function) (struct rt_entry*), olsr_u8_t type)
+{
+  struct export_route_entry *tmp, *prev = NULL /* Make compiler happy */; 
+  tmp = add_routes;
+  while (tmp) 
+    {
+      if (function == tmp->function && type == tmp->type) 
+       {
+         if (tmp == add_routes) 
+           {
+             add_routes = add_routes->next;
+             free (tmp);
+             return 1;
+           }
+         else 
+           {
+             prev->next = tmp->next;
+             free (tmp);
+             return 1;
+           }
+       }
+      prev = tmp;
+      tmp = tmp->next;
+    }
+  return 0;
+}
+
+int
+olsr_delroute_remove_function(int (*function) (struct rt_entry*), olsr_u8_t type)
+{
+  struct export_route_entry *tmp, *prev = NULL /* Make compiler happy */;
+  tmp = del_routes;
+  while (tmp) 
+    {
+      if (function == tmp->function && type == tmp->type) 
+       {
+         if (tmp == del_routes) 
+           {
+             del_routes = del_routes->next;
+             free (tmp);
+             return 1;
+           }
+         else 
+           {
+             prev->next = tmp->next;
+             free (tmp);
+             return 1; 
+           }
+       }
+      prev = tmp;
+      tmp = tmp->next;
+    }
+  return 0;
+}
+
+void 
+olsr_init_export_route() 
+{
+  olsr_addroute_add_function(&olsr_ioctl_add_route, AF_INET);
+  olsr_addroute_add_function(&olsr_ioctl_add_route6, AF_INET6);
+  olsr_delroute_add_function(&olsr_ioctl_del_route, AF_INET);
+  olsr_delroute_add_function(&olsr_ioctl_del_route6, AF_INET6);
+}
+
+int
+olsr_export_add_route (struct rt_entry *e) 
+{
+  int retval = 0;
+  struct export_route_entry *tmp;
+  for (tmp = add_routes; tmp; tmp = tmp->next)
+    {
+      if (tmp->type == AF_INET)
+       retval = tmp->function(e);
+    }
+  return retval;
+}
+
+int
+olsr_export_add_route6 (struct rt_entry *e) 
+{
+  int retval = 0;
+  struct export_route_entry *tmp;
+  for (tmp = add_routes; tmp; tmp = tmp->next)
+    {
+      if (tmp->type == AF_INET6)
+       retval = tmp->function(e);
+    }
+  return retval;
+}
+
+int
+olsr_export_del_route (struct rt_entry *e) 
+{
+  int retval = 0;
+  struct export_route_entry *tmp;
+  for (tmp = del_routes; tmp; tmp = tmp->next)
+    {
+      if (tmp->type == AF_INET)
+       retval = tmp->function(e);
+    }
+  return retval;
+}
+
+int
+olsr_export_del_route6 (struct rt_entry *e) 
+{
+  int retval = 0;
+  struct export_route_entry *tmp;
+  for (tmp = del_routes; tmp; tmp = tmp->next)
+    {
+      if (tmp->type == AF_INET6)
+       retval = tmp->function(e);
+    }
+  return retval;
+}
+
+
 
 int
 olsr_init_old_table()
@@ -348,9 +502,9 @@ olsr_delete_routes_from_kernel(struct destination_n *delete_kernel_list)
                    if(!olsr_cnf->host_emul)
                      {
                        if(olsr_cnf->ip_version == AF_INET)
-                         error = olsr_ioctl_del_route(destination_ptr->destination);
+                         error = olsr_export_del_route(destination_ptr->destination);
                        else
-                         error = olsr_ioctl_del_route6(destination_ptr->destination);
+                         error = olsr_export_del_route6(destination_ptr->destination);
                        
                        if(error < 0)
                          {
@@ -434,9 +588,9 @@ olsr_add_routes_in_kernel(struct destination_n *add_kernel_list)
                if(!olsr_cnf->host_emul)
                  {
                    if(olsr_cnf->ip_version == AF_INET)
-                     error=olsr_ioctl_add_route(destination_kernel->destination);
+                     error=olsr_export_add_route(destination_kernel->destination);
                    else
-                     error=olsr_ioctl_add_route6(destination_kernel->destination);
+                     error=olsr_export_add_route6(destination_kernel->destination);
                    
                    if(error < 0)
                      {
index beb7365..1032534 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: process_routes.h,v 1.9 2005/05/29 12:47:45 br1 Exp $
+ * $Id: process_routes.h,v 1.10 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 #include "routing_table.h"
 extern struct rt_entry old_routes[HASHSIZE];
 extern struct rt_entry old_hna[HASHSIZE];
 
+void
+olsr_init_export_route(void);
+
+void
+olsr_addroute_add_function(int (*)(struct rt_entry*), olsr_u8_t);
+
+int
+olsr_addroute_remove_function(int (*)(struct rt_entry*), olsr_u8_t);
+
+void
+olsr_delroute_add_function(int (*)(struct rt_entry*), olsr_u8_t);
+
+int
+olsr_delroute_remove_function(int (*)(struct rt_entry*), olsr_u8_t);
+
+int
+olsr_export_add_route (struct rt_entry*); 
+
+int
+olsr_export_del_route (struct rt_entry*); 
+
+int
+olsr_export_add_route6 (struct rt_entry*); 
+
+int
+olsr_export_del_route6 (struct rt_entry*); 
+
+
 int
 olsr_init_old_table(void);
 
index c652fd2..39dd064 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: scheduler.c,v 1.36 2006/07/27 15:53:16 kattemat Exp $
+ * $Id: scheduler.c,v 1.37 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -83,6 +83,7 @@ trigger_dijkstra(void *dummy)
 
   changes_neighborhood = OLSR_TRUE;
   changes_topology = OLSR_TRUE;
+  changes_force = OLSR_TRUE;
 }
 
 /**
index 107bcbc..46a35f7 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: ifnet.c,v 1.40 2006/11/15 23:07:59 bernd67 Exp $
+ * $Id: ifnet.c,v 1.41 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 
@@ -57,6 +57,7 @@
 #include "mantissa.h"
 #include "lq_packet.h"
 #include "log.h"
+#include "link_set.h"
 #include <signal.h>
 #include <sys/types.h>
 #include <net/if.h>
@@ -410,6 +411,8 @@ chk_if_changed(struct olsr_if *iface)
   OLSR_PRINTF(1, "Removing interface %s\n", iface->name)
   olsr_syslog(OLSR_LOG_INFO, "Removing interface %s\n", iface->name);
 
+  del_if_link_entries(&ifp->ip_addr);
+
   /*
    *Call possible ifchange functions registered by plugins  
    */
@@ -712,6 +715,17 @@ add_hemu_if(struct olsr_if *iface)
   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.
@@ -856,10 +870,10 @@ chk_if_up(struct olsr_if *iface, int debuglvl)
        }
       
       /* 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);
       
     }
   
@@ -923,7 +937,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl)
   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;