Additional config options for gateway system.
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 25 Jan 2010 15:23:29 +0000 (16:23 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 25 Jan 2010 15:23:29 +0000 (16:23 +0100)
Small code cleanup.

12 files changed:
src/build_msg.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/gateway.c
src/hna_set.c
src/ipcalc.c
src/ipcalc.h
src/linux/kernel_routes.c
src/main.c
src/olsr_cfg.h

index f6401c9..b495b32 100644 (file)
@@ -1048,7 +1048,7 @@ serialize_hna4(struct interface *ifp)
 #endif
 
     olsr_prefix_to_netmask(&ip_addr, h->net.prefix_len);
-    if (olsr_cnf->smart_gateway_active && h->net.prefix_len == 0) {
+    if (olsr_cnf->smart_gw_active && ip_is_inetgw_prefix(&h->net.prefix, h->net.prefix_len)) {
       /* this is the default route, overwrite it with the smart gateway */
       olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len);
     }
@@ -1140,7 +1140,7 @@ serialize_hna6(struct interface *ifp)
     OLSR_PRINTF(BMSG_DBGLVL, "\tNet: %s\n", olsr_ip_prefix_to_string(&h->net));
 #endif
     olsr_prefix_to_netmask(&tmp_netmask, h->net.prefix_len);
-    if (olsr_cnf->smart_gateway_active && (h->net.prefix_len == 0 || ip_prefix_is_mappedv4_gw(&h->net))) {
+    if (olsr_cnf->smart_gw_active && ip_is_inetgw_prefix(&h->net.prefix, h->net.prefix_len)) {
       /* this is the default gateway, so overwrite it with the smart one */
       olsr_modifiy_inetgw_netmask(&tmp_netmask, h->net.prefix_len);
     }
index f859e8e..e966c9e 100644 (file)
@@ -210,9 +210,32 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
   fprintf(fd, "# Clear screen when printing debug output?\n\n");
   fprintf(fd, "ClearScreen\t%s\n\n", cnf->clear_screen ? "yes" : "no");
 
+  fprintf(fd, "# NIIT support\n\n");
+  fprintf(fd, "UseNiit\t%s\n\n", cnf->use_niit ? "yes" : "no");
+
+  fprintf(fd, "# Smart gateway system\n\n");
+  fprintf(fd, "SmartGateway\t%s\n\n", cnf->smart_gw_active ? "yes" : "no");
+
+  fprintf(fd, "# Smart gateway NAT\n\n");
+  fprintf(fd, "SmartGatewayNAT\t%s\n\n", cnf->smart_gw_nat ? "yes" : "no");
+
+  fprintf(fd, "# Smart gateway uplink type\n\n");
+  fprintf(fd, "SmartGatewayUplink\t%s\n\n", GW_UPLINK_TXT[cnf->smart_gw_type]);
+
+  fprintf(fd, "# Smart gateway uplink/downlink speed (in kbit/s)\n\n");
+  fprintf(fd, "SmartGatewaySpeed\t%d %d\n\n", cnf->smart_gw_uplink, cnf->smart_gw_downlink);
+
+  fprintf(fd, "# Smart gateway prefix\n\n");
+  fprintf(fd, "SmartGatewayPrefix\t%s\n\n", olsr_ip_prefix_to_string(&cnf->smart_gw_prefix));
+
   /* Plugins */
-  fprintf(fd,
-          "# Olsrd plugins to load\n# This must be the absolute path to the file\n# or the loader will use the following scheme:\n# - Try the paths in the LD_LIBRARY_PATH \n#   environment variable.\n# - The list of libraries cached in /etc/ld.so.cache\n# - /lib, followed by /usr/lib\n\n");
+  fprintf(fd,"# Olsrd plugins to load\n"
+             "# This must be the absolute path to the file\n"
+             "# or the loader will use the following scheme:\n"
+             "# - Try the paths in the LD_LIBRARY_PATH \n"
+             "#   environment variable.\n"
+             "# - The list of libraries cached in /etc/ld.so.cache\n"
+             "# - /lib, followed by /usr/lib\n\n");
   if (pe) {
     while (pe) {
       fprintf(fd, "LoadPlugin \"%s\" {\n", pe->name);
index 160fbf8..09509db 100644 (file)
@@ -61,6 +61,12 @@ extern int yyparse(void);
 
 static char interface_defaults_name[] = "[InterfaceDefaults]";
 
+const char *GW_UPLINK_TXT[] = {
+  "ipv4",
+  "ipv6",
+  "both"
+};
+
 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.";
 
@@ -368,13 +374,28 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
   }
 
   if (cnf->min_tc_vtime < 0.0) {
-       fprintf(stderr, "Error, negative minimal tc time not allowed.\n");
-       return -1;
+    fprintf(stderr, "Error, negative minimal tc time not allowed.\n");
+    return -1;
   }
   if (cnf->min_tc_vtime > 0.0) {
          fprintf(stderr, "Warning, you are using the min_tc_vtime hack. We hope you know what you are doing... contact olsr.org otherwise.\n");
   }
 
+  if (cnf->smart_gw_type >= GW_UPLINK_CNT) {
+    fprintf(stderr, "Error, illegal gateway uplink type: %d\n", cnf->smart_gw_type);
+    return -1;
+  }
+  if (cnf->smart_gw_downlink < MIN_SMARTGW_SPEED || cnf->smart_gw_downlink > MAX_SMARTGW_SPEED) {
+    fprintf(stderr, "Error, bad gateway downlink speed: %d kbit/s (should be %d-%d)\n",
+        cnf->smart_gw_downlink, MIN_SMARTGW_SPEED, MAX_SMARTGW_SPEED);
+    return -1;
+  }
+  if (cnf->smart_gw_uplink < MIN_SMARTGW_SPEED || cnf->smart_gw_uplink > MAX_SMARTGW_SPEED) {
+    fprintf(stderr, "Error, bad gateway uplink speed: %d kbit/s (should be %d-%d)\n",
+        cnf->smart_gw_uplink, MIN_SMARTGW_SPEED, MAX_SMARTGW_SPEED);
+    return -1;
+  }
+
   if (cnf->interface_defaults == NULL) {
     /* get a default configuration if the user did not specify one */
     cnf->interface_defaults = get_default_if_config();
@@ -562,6 +583,11 @@ set_default_cnf(struct olsrd_config *cnf)
   cnf->use_niit = DEF_USE_NIIT;
   cnf->niit_if_index = 0;
 
+  cnf->smart_gw_active = true;
+  cnf->smart_gw_nat = true;
+  cnf->smart_gw_type = GW_UPLINK_IPV4;
+  cnf->smart_gw_uplink = 100;
+  cnf->smart_gw_downlink = 1000;
 #if LINUX_POLICY_ROUTING
   cnf->rtnl_s = 0;
 #endif
@@ -667,7 +693,20 @@ olsrd_print_cnf(struct olsrd_config *cnf)
 
   printf("Clear screen     : %s\n", cnf->clear_screen ? "yes" : "no");
 
-  printf("Use niit:        : %s\n", cnf->use_niit ? "yes" : "no");
+  printf("Use niit         : %s\n", cnf->use_niit ? "yes" : "no");
+
+  printf("Smart Gateway    : %s\n", cnf->smart_gw_active ? "yes" : "no");
+
+  printf("Smart Gw. NAT    : %s\n", cnf->smart_gw_nat ? "yes" : "no");
+
+  printf("Smart Gw. Uplink : %s\n", GW_UPLINK_TXT[cnf->smart_gw_type]);
+
+  printf("Smart Gw. speed  : %d kbit/s up, %d kbit/s down\n",
+      cnf->smart_gw_uplink, cnf->smart_gw_downlink);
+
+  printf("Smart Gw. prefix : %s\n",
+      olsr_cnf->smart_gw_prefix.prefix_len == 0
+      ? "-" : olsr_ip_prefix_to_string(&cnf->smart_gw_prefix));
 
   /* Interfaces */
   if (in) {
index 936c02d..2b7f7e6 100644 (file)
@@ -212,6 +212,8 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_LOCK_FILE
 %token TOK_USE_NIIT
 %token TOK_SMART_GW
+%token TOK_SMART_GW_NAT
+%token TOK_SMART_GW_UPLINK
 %token TOK_SMART_GW_SPEED
 %token TOK_SMART_GW_PREFIX
 
@@ -280,6 +282,8 @@ stmt:       idebug
           | alock_file
           | suse_niit
           | bsmart_gw
+          | bsmart_gw_nat
+          | ssmart_gw_type
           | ismart_gw_speed
           | ismart_gw_prefix
 ;
@@ -1157,7 +1161,36 @@ suse_niit: TOK_USE_NIIT TOK_BOOLEAN
 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;
+       olsr_cnf->smart_gw_active = $2->boolean;
+       free($2);
+}
+;
+
+bsmart_gw_nat: TOK_SMART_GW_NAT TOK_BOOLEAN
+{
+       PARSER_DEBUG_PRINTF("Smart gateway nat: %s\n", $2->boolean ? "yes" : "no");
+       olsr_cnf->smart_gw_nat = $2->boolean;
+       free($2);
+}
+;
+
+ssmart_gw_type: TOK_SMART_GW_NAT TOK_STRING
+{
+       PARSER_DEBUG_PRINTF("Smart gateway uplink: %s\n", $2->string);
+       if (strcasecmp($2->string, GW_UPLINK_TXT[GW_UPLINK_IPV4]) == 0) {
+               olsr_cnf->smart_gw_type = GW_UPLINK_IPV4;
+       }
+       else if (strcasecmp($2->string, GW_UPLINK_TXT[GW_UPLINK_IPV6]) == 0) {
+               olsr_cnf->smart_gw_type = GW_UPLINK_IPV6;
+       }
+       else if (strcasecmp($2->string, GW_UPLINK_TXT[GW_UPLINK_IPV46]) == 0) {
+               olsr_cnf->smart_gw_type = GW_UPLINK_IPV46;
+       }
+       else {
+               fprintf(stderr, "Bad gateway uplink type: %s\n", $2->string);
+               YYABORT;
+       }
+       olsr_cnf->smart_gw_nat = $2->boolean;
        free($2);
 }
 ;
@@ -1165,8 +1198,8 @@ bsmart_gw: TOK_SMART_GW TOK_BOOLEAN
 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;
+       olsr_cnf->smart_gw_uplink = $2->integer;
+       olsr_cnf->smart_gw_downlink = $3->integer;
        free($2);
        free($3);
 }
@@ -1175,11 +1208,11 @@ ismart_gw_speed: TOK_SMART_GW_SPEED TOK_INTEGER TOK_INTEGER
 ismart_gw_prefix: TOK_SMART_GW_PREFIX TOK_IPV6_ADDR TOK_INTEGER
 {
   PARSER_DEBUG_PRINTF("Smart gateway prefix: %s %u\n", $2->string, $3->integer);
-       if (inet_pton(olsr_cnf->ip_version, $2->string, &olsr_cnf->smart_gateway_prefix.prefix) == 0) {
+       if (inet_pton(olsr_cnf->ip_version, $2->string, &olsr_cnf->smart_gw_prefix.prefix) == 0) {
          fprintf(stderr, "Bad IP part of gateway prefix: %s\n", $2->string);
     YYABORT;
   }
-       olsr_cnf->smart_gateway_prefix.prefix_len = (uint8_t)$3->integer;
+       olsr_cnf->smart_gw_prefix.prefix_len = (uint8_t)$3->integer;
        
        free($2);
        free($3);
@@ -1187,11 +1220,11 @@ ismart_gw_prefix: TOK_SMART_GW_PREFIX TOK_IPV6_ADDR TOK_INTEGER
         |       TOK_SMART_GW_PREFIX TOK_IPV6_ADDR TOK_SLASH TOK_INTEGER
 {
        PARSER_DEBUG_PRINTF("Smart gateway prefix: %s %u\n", $2->string, $4->integer);
-       if (inet_pton(olsr_cnf->ip_version, $2->string, &olsr_cnf->smart_gateway_prefix.prefix) == 0) {
+       if (inet_pton(olsr_cnf->ip_version, $2->string, &olsr_cnf->smart_gw_prefix.prefix) == 0) {
          fprintf(stderr, "Bad IP part of gateway prefix: %s\n", $2->string);
     YYABORT;
   }
-       olsr_cnf->smart_gateway_prefix.prefix_len = (uint8_t)$4->integer;
+       olsr_cnf->smart_gw_prefix.prefix_len = (uint8_t)$4->integer;
        
        free($2);
        free($4);
index 6cf1784..d42b870 100644 (file)
@@ -428,11 +428,26 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_CLEAR_SCREEN;
 }
 
+"UseNiit" {
+    yylval = NULL;
+    return TOK_USE_NIIT;
+}
+
 "SmartGateway" {
     yylval = NULL;
     return TOK_SMART_GW;
 }
 
+"SmartGatewayNAT" {
+    yylval = NULL;
+    return TOK_SMART_GW_NAT;
+}
+
+"SmartGatewayUplink" {
+    yylval = NULL;
+    return TOK_SMART_GW_UPLINK;
+}
 "SmartGatewaySpeed" {
     yylval = NULL;
     return TOK_SMART_GW_SPEED;
@@ -443,11 +458,6 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_SMART_GW_PREFIX;
 }
 
-"UseNiit" {
-    yylval = NULL;
-    return TOK_USE_NIIT;
-}
-
 "Weight" {
     yylval = NULL;
     return TOK_IFWEIGHT;
index 445e22b..2a0197d 100644 (file)
@@ -53,7 +53,7 @@ olsr_init_gateways(void) {
 
   memset(&smart_gateway_netmask, 0, sizeof(smart_gateway_netmask));
 
-  if (olsr_cnf->smart_gateway_active) {
+  if (olsr_cnf->smart_gw_active) {
     union olsr_ip_addr gw_net;
     int prefix;
 
@@ -69,15 +69,15 @@ olsr_init_gateways(void) {
 
     ip = (uint8_t *) &smart_gateway_netmask;
 
-    if (olsr_cnf->smart_gateway_uplink > 0 || olsr_cnf->smart_gateway_downlink > 0) {
+    if (olsr_cnf->smart_gw_uplink > 0 || olsr_cnf->smart_gw_downlink > 0) {
       ip[GW_HNA_FLAGS] |= GW_HNA_FLAG_LINKSPEED;
-      ip[GW_HNA_DOWNLINK] = serialize_gw_speed(olsr_cnf->smart_gateway_downlink);
-      ip[GW_HNA_UPLINK] = serialize_gw_speed(olsr_cnf->smart_gateway_uplink);
+      ip[GW_HNA_DOWNLINK] = serialize_gw_speed(olsr_cnf->smart_gw_downlink);
+      ip[GW_HNA_UPLINK] = serialize_gw_speed(olsr_cnf->smart_gw_uplink);
     }
-    if (olsr_cnf->ip_version == AF_INET6 && olsr_cnf->smart_gateway_prefix.prefix_len > 0) {
+    if (olsr_cnf->ip_version == AF_INET6 && olsr_cnf->smart_gw_prefix.prefix_len > 0) {
       ip[GW_HNA_FLAGS] |= GW_HNA_FLAG_IPV6PREFIX;
-      ip[GW_HNA_V6PREFIXLEN] = olsr_cnf->smart_gateway_prefix.prefix_len;
-      memcpy(&ip[GW_HNA_V6PREFIX], &olsr_cnf->smart_gateway_prefix.prefix, 8);
+      ip[GW_HNA_V6PREFIXLEN] = olsr_cnf->smart_gw_prefix.prefix_len;
+      memcpy(&ip[GW_HNA_V6PREFIX], &olsr_cnf->smart_gw_prefix.prefix, 8);
     }
   }
 }
@@ -116,16 +116,19 @@ olsr_set_gateway(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int p
   gw->ipv4 = (ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV4) != 0;
   gw->ipv4nat = (ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV4_NAT) != 0;
 
-  if (olsr_cnf->ip_version == AF_INET) {
+  if (olsr_cnf->ip_version == AF_INET6) {
     gw->ipv6 = (ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV6) != 0;
-    if (prefixlen == IPV6_INET_GW_PREFIX_LEN) {
-      /* do not reset prefixlength for ::ffff:0:0 HNAs */
+
+    /* do not reset prefixlength for ::ffff:0:0 HNAs */
+    if (prefixlen == ipv6_internet_route.prefix_len) {
       memset(&gw->external_prefix, 0, sizeof(gw->external_prefix));
-    }
-    if (prefixlen == IPV6_INET_GW_PREFIX_LEN && mask->v6.s6_addr[0] == IPV6_INET_GW_PREFIX
-      && (ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV6PREFIX) != 0) {
-      gw->external_prefix.prefix_len = ptr[GW_HNA_V6PREFIXLEN];
-      memcpy(&gw->external_prefix.prefix, &ptr[GW_HNA_V6PREFIX], 8);
+
+      if ((ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV6PREFIX) != 0
+          && memcmp(mask->v6.s6_addr, &ipv6_internet_route.prefix, olsr_cnf->ipsize) == 0) {
+        /* this is the right prefix (2000::/3), so we can copy the prefix */
+        gw->external_prefix.prefix_len = ptr[GW_HNA_V6PREFIXLEN];
+        memcpy(&gw->external_prefix.prefix, &ptr[GW_HNA_V6PREFIX], 8);
+      }
     }
   }
 }
@@ -143,29 +146,13 @@ olsr_delete_gateway(union olsr_ip_addr *originator) {
 }
 
 bool olsr_is_smart_gateway(union olsr_ip_addr *net, union olsr_ip_addr *mask, int prefixlen) {
-  uint8_t *ptr = ((uint8_t *)mask) + ((prefixlen+7)/8);
-  struct ipaddr_str buf;
-
-  fprintf(stderr, "olsr_is_smart_gw: %s\n", olsr_ip_to_string(&buf, mask));
+  uint8_t *ptr;
 
-  if (olsr_cnf->ip_version == AF_INET6 && prefixlen == IPV6_INET_GW_PREFIX_LEN) {
-    if (memcmp(&ipv6_internet_route, net, olsr_cnf->ipsize) != 0) {
-      return false;
-    }
-  }
-  else if (prefixlen == 96) {
-    if (memcmp(&mapped_v4_gw, net, olsr_cnf->ipsize) != 0) {
-      return false;
-    }
-  }
-  else if (prefixlen == 0) {
-    if (memcmp(&in6addr_any, net, olsr_cnf->ipsize) != 0) {
-      return false;
-    }
-  }
-  else {
+  if (!ip_is_inetgw_prefix(net, prefixlen)) {
     return false;
   }
+
+  ptr = ((uint8_t *)mask) + ((prefixlen+7)/8);
   return ptr[GW_HNA_PAD] == 0 && ptr[GW_HNA_FLAGS] != 0;
 }
 
@@ -176,7 +163,7 @@ void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen) {
   if (olsr_cnf->has_ipv4_gateway) {
     ptr[GW_HNA_FLAGS] |= GW_HNA_FLAG_IPV4;
 
-    if (olsr_cnf->has_ipv4_nat) {
+    if (olsr_cnf->smart_gw_nat) {
       ptr[GW_HNA_FLAGS] |= GW_HNA_FLAG_IPV4_NAT;
     }
   }
index edf9c7c..6f5d19b 100644 (file)
@@ -446,11 +446,11 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
     pkt_get_ipaddress(&curr, &mask);
     prefixlen = olsr_netmask_to_prefix(&mask);
 
-    if (olsr_cnf->smart_gateway_active && olsr_is_smart_gateway(&net, &mask, prefixlen)) {
+    if (olsr_cnf->smart_gw_active && olsr_is_smart_gateway(&net, &mask, prefixlen)) {
       olsr_set_gateway(&originator, &mask, prefixlen);
     }
 
-    if (olsr_cnf->smart_gateway_active && prefixlen > 0 && prefixlen <= MAXIMUM_GATEWAY_PREFIX_LENGTH) {
+    if (olsr_cnf->smart_gw_active && prefixlen > 0 && prefixlen <= MAXIMUM_GATEWAY_PREFIX_LENGTH) {
       continue;
     }
 
index 274b5c3..464a02a 100644 (file)
 #include "defs.h"
 #include "ipcalc.h"
 
+/* ipv6 address ::ffff:0:0 */
 const uint8_t mapped_v4_gw[] = { 0,0,0,0,0,0,0,0,0,0,0xff,0xff,0,0,0,0};
-const uint8_t ipv6_internet_route[] = { 0x20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
+
+/* ipv6 prefix 2000::/3 */
+const struct olsr_ip_prefix ipv6_internet_route =
+{
+    { 0x20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, 3
+};
 
 int
 prefix_to_netmask(uint8_t * a, int len, uint8_t prefixlen)
@@ -200,6 +206,19 @@ ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net)
   return rv;
 }
 
+bool ip_is_inetgw_prefix(union olsr_ip_addr *net, int prefixlen) {
+  if (olsr_cnf->ip_version == AF_INET6 && prefixlen == ipv6_internet_route.prefix_len) {
+    return memcmp(&ipv6_internet_route.prefix, net, olsr_cnf->ipsize) == 0;
+  }
+  if (prefixlen == 96) {
+    return memcmp(&mapped_v4_gw, net, olsr_cnf->ipsize) == 0;
+  }
+  if (olsr_cnf->ip_version == AF_INET && prefixlen == 0) {
+    return memcmp(&in6addr_any, net, olsr_cnf->ipsize) == 0;
+  }
+  return false;
+}
+
 /*
  * Local Variables:
  * c-basic-offset: 2
index 1a579ac..9ee7d0d 100644 (file)
 #include <arpa/inet.h>
 #include <netinet/in.h>
 
-#define IPV6_INET_GW_PREFIX     0x20
-#define IPV6_INET_GW_PREFIX_LEN 3
-
 extern const uint8_t mapped_v4_gw[];
-extern const uint8_t ipv6_internet_route[];
+extern const struct olsr_ip_prefix ipv6_internet_route;
 
 struct ipaddr_str {
   char buf[MAX(INET6_ADDRSTRLEN, INET_ADDRSTRLEN)];
@@ -173,7 +170,7 @@ prefix_to_netmask4(uint8_t prefixlen)
 }
 
 static INLINE bool
-olsr_is_niit_ip(const union olsr_ip_addr *ip) {
+olsr_is_niit_ipv6(const union olsr_ip_addr *ip) {
   return olsr_cnf->ip_version == AF_INET6 && IN6_IS_ADDR_V4MAPPED(&ip->v6);
 }
 
@@ -190,6 +187,8 @@ ip_prefix_is_mappedv4_gw(struct olsr_ip_prefix *prefix) {
       && memcmp(&prefix->prefix, mapped_v4_gw, sizeof(prefix->prefix)) == 0;
 }
 
+extern bool ip_is_inetgw_prefix(union olsr_ip_addr *net, int prefixlen);
+
 #endif
 
 /*
index 0bc932d..94a244b 100644 (file)
@@ -185,7 +185,7 @@ static void netlink_process_link(struct nlmsghdr *h)
   struct olsr_if *tmp_if;
 
   /*monitor tunl0 and olsrtunl*/
-  if (olsr_cnf->smart_gateway_active) {
+  if (olsr_cnf->smart_gw_active) {
     if (ifi->ifi_index==olsr_cnf->ipip_if_index) {
       printf("olsrtunl state change:\n");
       if (ifi->ifi_flags&IFF_UP)
@@ -210,7 +210,7 @@ static void netlink_process_link(struct nlmsghdr *h)
         if (olsr_ifconfig("tunl0",IF_SET_UP)) return; //!!?? todo: test if we can really know that its up now
         /*we disable -> this should stop us announcing being a smart gateway, 
        * and can not use tunnels as its unlikely to be able to crete them without tunl0*/
-        olsr_cnf->smart_gateway_active=false;
+        olsr_cnf->smart_gw_active=false;
         /*recovery is not easy as potentially the ipip module is not loaded any more*/
         /*but it could just mean the tunl0 is down, and the gatewaytunnel would work*/
         return;
@@ -432,7 +432,7 @@ olsr_netlink_route_int(const struct rt_entry *rt, uint8_t family, uint8_t rttabl
       req.r.rtm_scope = RT_SCOPE_LINK;
 
       /*add interface*/
-      if ((olsr_cnf->smart_gateway_active) && family != AF_INET)
+      if ((olsr_cnf->smart_gw_active) && family != AF_INET)
       {
         printf("smart gateway not available for ipv6 currently\n");
         return -1;
@@ -718,7 +718,7 @@ static int
 olsr_netlink_route(const struct rt_entry *rt, uint8_t family, uint8_t rttable, __u16 cmd)
 {
   /*check if this rule is relevant for smartgw*/
-  if ((olsr_cnf->smart_gateway_active) && (rt->rt_dst.prefix_len == 0) )
+  if ((olsr_cnf->smart_gw_active) && (rt->rt_dst.prefix_len == 0) )
   { 
     if (cmd == RTM_DELROUTE){ /*should we do something sane here!!??*/
       printf("ignoreing deletion of default route for smart gateway!!\n");
@@ -757,7 +757,7 @@ printf("index of new olsrtunl is %i\n",olsr_cnf->ipip_if_index);
   /*normal route in default route table*/
 
   /*create/delete niit route if we have an niit device*/
-  if ((olsr_cnf->niit_if_index!=0) && (family != AF_INET) && (olsr_is_niit_ip(&rt->rt_dst.prefix))) {
+  if ((olsr_cnf->niit_if_index!=0) && (family != AF_INET) && (olsr_is_niit_ipv6(&rt->rt_dst.prefix))) {
     olsr_netlink_route_int(rt, family, rttable, cmd, RT_NIIT);
   }
 
@@ -836,7 +836,7 @@ olsr_ioctl_add_route(const struct rt_entry *rt)
      *
      * which was always insane but togehter with smartgateways policy routing its too insane
      */
-    if (!olsr_cnf->smart_gateway_active) olsr_netlink_route(rt, AF_INET, 253, RTM_NEWROUTE);
+    if (!olsr_cnf->smart_gw_active) olsr_netlink_route(rt, AF_INET, 253, RTM_NEWROUTE);
   }
   if (0 == rt->rt_dst.prefix_len && olsr_cnf->rttable_default != 0) {
     return olsr_netlink_route(rt, AF_INET, olsr_cnf->rttable_default, RTM_NEWROUTE);
index 6777b59..772a508 100644 (file)
@@ -511,20 +511,20 @@ int main(int argc, char *argv[]) {
 #if LINUX_POLICY_ROUTING
   /*create smart-gateway-tunnel policy rules*/
   //!!?? disable smartgateway if not ipv4?, or better: do not start olsr
-  if (olsr_cnf->smart_gateway_active) {
+  if (olsr_cnf->smart_gw_active) {
     int r = olsr_ifconfig(TUNL_BASE,IF_SET_UP);
 printf("set interface up returned %i",r);
     //take up tunl0 device or disable smartgateway
     olsr_cnf->ipip_base_orig_down = (r == -1 ?true:false);
 printf("old ipip_base_orig_down state: %i",olsr_cnf->ipip_base_orig_down);
-    olsr_cnf->smart_gateway_active = (r != 0); //!!?? kernel 2.4 may need true to function as gateway, does it harm to do anyway
+    olsr_cnf->smart_gw_active = (r != 0); //!!?? kernel 2.4 may need true to function as gateway, does it harm to do anyway
     /*create an interface structure for the tunlbase to store procnet settings*/
     /*hmmm integrate it into the olsr_interface list to ensure spoof setting clenaup at end!???*/
     olsr_cnf->ipip_base_if.if_index = if_nametoindex(TUNL_BASE);
 
     deactivate_spoof(TUNL_BASE, &olsr_cnf->ipip_base_if, AF_INET );//ipip is an ipv4 tunnel
 
-    if (!olsr_cnf->smart_gateway_active) 
+    if (!olsr_cnf->smart_gw_active) 
     {
       printf("disabled smart Gateway! (ipip tunnels not useable for olsrd on this host)");
     }
index 4e2f2e5..0927161 100644 (file)
 #define MAX_LQ_AGING        1.0
 #define MIN_LQ_AGING        0.01
 
+#define MIN_SMARTGW_SPEED   1
+#define MAX_SMARTGW_SPEED   320000000
+
 /* Option values */
 #define CFG_FIBM_FLAT          "flat"
 #define CFG_FIBM_CORRECT       "correct"
 
 #include "interfaces.h"
 
+enum smart_gw_uplinktype {
+  GW_UPLINK_IPV4,
+  GW_UPLINK_IPV6,
+  GW_UPLINK_IPV46,
+  GW_UPLINK_CNT,
+};
+
 struct olsr_msg_params {
   float emission_interval;
   float validity_time;
@@ -237,6 +247,15 @@ struct olsrd_config {
   uint8_t lq_dlimit;
 
   float min_tc_vtime;
+
+  char *lock_file;
+  bool use_niit;
+
+  bool smart_gw_active, smart_gw_nat;
+  enum smart_gw_uplinktype smart_gw_type;
+  uint32_t smart_gw_uplink, smart_gw_downlink;
+  struct olsr_ip_prefix smart_gw_prefix;
+
   /* Stuff set by olsrd */
   uint8_t maxplen;                     /* maximum prefix len */
   size_t ipsize;                       /* Size of address */
@@ -247,17 +266,10 @@ struct olsrd_config {
   int exit_value;                      /* Global return value for process termination */
   float max_tc_vtime;
 
-  char *lock_file;
-
-  bool use_niit;
   int niit_if_index;
 
   /*many potential parameters or helper variables for smartgateway*/
-  bool has_ipv4_gateway, has_ipv6_gateway, has_ipv4_nat;
-  bool smart_gateway_active;
-  uint32_t smart_gateway_uplink;
-  uint32_t smart_gateway_downlink;
-  struct olsr_ip_prefix smart_gateway_prefix;
+  bool has_ipv4_gateway, has_ipv6_gateway;
 
   struct interface ipip_base_if;
   int ipip_if_index;
@@ -281,6 +293,8 @@ struct olsrd_config {
 extern "C" {
 #endif
 
+  extern const char *GW_UPLINK_TXT[];
+
 /*
  * List functions
  */