Merge branch 'stable' into tunnel
authorHenning Rogge <hrogge@googlemail.com>
Wed, 13 Jan 2010 15:45:51 +0000 (16:45 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Wed, 13 Jan 2010 15:45:51 +0000 (16:45 +0100)
1  2 
src/cfgparser/oparse.y
src/hna_set.c
src/olsr.c

@@@ -1152,25 -1133,7 +1152,24 @@@ suse_niit: TOK_USE_NIIT TOK_BOOLEA
  }
  ;
  
 +bsmart_gw: TOK_SMART_GW TOK_BOOLEAN
 +{
 +      PARSER_DEBUG_PRINTF("Smart gateway system: %s\n", $2->boolean ? "enabled" : "disabled");
 +      olsr_cnf->smart_gateway_active = $2->boolean;
 +      free($2);
 +}
 +;
 +
 +ismart_gw_speed: TOK_SMART_GW_SPEED TOK_INTEGER TOK_INTEGER
 +{
 +      PARSER_DEBUG_PRINTF("Smart gateway speed: %u uplink/%u downlink kbit/s\n", $2->integer, $3->integer);
 +      olsr_cnf->smart_gateway_uplink = $2->integer;
 +      olsr_cnf->smart_gateway_downlink = $3->integer;
 +      free($2);
 +      free($3);
 +}
 +;
  
  plblock: TOK_PLUGIN TOK_STRING
  {
    struct plugin_entry *pe, *last;
diff --cc src/hna_set.c
@@@ -46,7 -46,7 +46,8 @@@
  #include "net_olsr.h"
  #include "tc_set.h"
  #include "parser.h"
 +#include "gateway.h"
+ #include "duplicate_handler.h"
  
  struct hna_entry hna_set[HASHSIZE];
  struct olsr_cookie_info *hna_net_timer_cookie = NULL;
@@@ -434,23 -429,29 +435,37 @@@ olsr_input_hna(union olsr_message *m, s
      OLSR_PRINTF(2, "Received HNA from NON SYM neighbor %s\n", olsr_ip_to_string(&buf, from_addr));
      return false;
    }
- #if 1
    while (curr < curr_end) {
 -    union olsr_ip_addr net;
 +    union olsr_ip_addr net, mask;
      uint8_t prefixlen;
      struct ip_prefix_list *entry;
+     struct interface *ifs;
+     bool stop = false;
  
      pkt_get_ipaddress(&curr, &net);
 -    pkt_get_prefixlen(&curr, &prefixlen);
 +    pkt_get_ipaddress(&curr, &mask);
 +    if (olsr_cnf->smart_gateway_active && olsr_is_smart_gateway(&net, &mask)) {
 +      olsr_set_gateway(&originator, &mask);
 +    }
 +
 +    prefixlen = olsr_netmask_to_prefix(&mask);
 +    if (olsr_cnf->smart_gateway_active && prefixlen > 0 && prefixlen <= MAXIMUM_GATEWAY_PREFIX_LENGTH) {
 +      continue;
 +    }
  
+ #ifndef NO_DUPLICATE_DETECTION_HANDLER
+     for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) {
+       if (ipequal(&ifs->ip_addr, &net)) {
+       /* ignore your own main IP as an incoming MID */
+         olsr_handle_hna_collision(&net, &originator);
+         stop = true;
+         break;
+       }
+     }
+     if (stop) {
+       continue;
+     }
+ #endif
      entry = ip_prefix_list_find(olsr_cnf->hna_entries, &net, prefixlen);
      if (entry == NULL) {
        /* only update if it's not from us */
diff --cc src/olsr.c
@@@ -63,7 -63,7 +63,8 @@@
  #include "common/avl.h"
  #include "net_olsr.h"
  #include "lq_plugin.h"
 +#include "gateway.h"
+ #include "duplicate_handler.h"
  
  #include <stdarg.h>
  #include <signal.h>
@@@ -297,9 -307,11 +311,14 @@@ olsr_init_tables(void
    /* Initialize HNA set */
    olsr_init_hna_set();
  
 +  /* Initialize smart gateways */
 +  olsr_init_gateways();
 +
+   /* Initialize duplicate handler */
+ #ifndef NO_DUPLICATE_DETECTION_HANDLER
+   olsr_duplicate_handler_init();
+ #endif
    /* Start periodic SPF and RIB recalculation */
    if (olsr_cnf->lq_dinter > 0.0) {
      olsr_start_timer((unsigned int)(olsr_cnf->lq_dinter * MSEC_PER_SEC), 5, OLSR_TIMER_PERIODIC, &olsr_trigger_forced_update, NULL,