Add niit configuration option
authorHenning Rogge <hrogge@googlemail.com>
Mon, 4 Jan 2010 19:15:25 +0000 (20:15 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Mon, 4 Jan 2010 19:15:25 +0000 (20:15 +0100)
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/ipcalc.h
src/linux/kernel_routes.c
src/olsr_cfg.h

index f8558dd..65dc245 100644 (file)
@@ -101,6 +101,21 @@ main(int argc, char *argv[])
 
 #endif
 
+static int
+olsrd_parse_niit_if(const char *niit_if) {
+  int i = 0;
+  if (niit_if == NULL || strcmp(niit_if, "yes") == 0 || strcmp(niit_if, "auto") == 0) {
+    i = if_nametoindex(DEF_NIIT_IF);
+    if (i == 0 && niit_if != NULL && strcmp(niit_if, "yes") == 0) {
+      return -1;
+    }
+  }
+  else if (strcmp(niit_if, "no") != 0) {
+    i = if_nametoindex(niit_if);
+  }
+  return i;
+}
+
 int
 olsrd_parse_cnf(const char *filename)
 {
@@ -142,6 +157,16 @@ olsrd_parse_cnf(const char *filename)
     in->interf = NULL;
     in->host_emul = false;
   }
+
+#ifdef linux
+  if (olsr_cnf->ip_version == AF_INET6) {
+    olsr_cnf->niit_if_index = olsrd_parse_niit_if(olsr_cnf->niit_if);
+    if (olsr_cnf->niit_if_index == -1) {
+      fprintf(stderr, "Error, Cannot find niit interface.\n");
+      return -1;
+    }
+  }
+#endif
   return 0;
 }
 
@@ -326,7 +351,6 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
 
     io = in->cnf;
 
-printf("dev %s before applying defaultSection:\n",in->name);
     olsrd_print_interface_cnf(in->cnf, in->cnfi, false);
 
     /*apply defaults (if this is not the default interface stub)*/
@@ -557,6 +581,9 @@ set_default_cnf(struct olsrd_config *cnf)
   cnf->exit_value = EXIT_SUCCESS;
   cnf->max_tc_vtime = 0.0;
   cnf->ioctl_s = 0;
+  cnf->niit_if = NULL;
+  cnf->niit_if_index = 0;
+
 #if LINUX_POLICY_ROUTING
   cnf->rtnl_s = 0;
 #endif
@@ -662,6 +689,8 @@ olsrd_print_cnf(struct olsrd_config *cnf)
 
   printf("Clear screen     : %s\n", cnf->clear_screen ? "yes" : "no");
 
+  printf("Use niit:        : %s\n", cnf->niit_if ? cnf->niit_if : DEF_NIIT);
+
   /* Interfaces */
   if (in) {
     /*print interface default config*/
index e084baa..75b91e8 100644 (file)
@@ -212,6 +212,7 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_PLPARAM
 %token TOK_MIN_TC_VTIME
 %token TOK_LOCK_FILE
+%token TOK_USE_NIIT
 
 %token TOK_HOSTLABEL
 %token TOK_NETLABEL
@@ -276,6 +277,7 @@ stmt:       idebug
           | vcomment
           | amin_tc_vtime
           | alock_file
+          | suse_niit
 ;
 
 block:      TOK_HNA4 hna4body
@@ -1123,6 +1125,15 @@ bclear_screen: TOK_CLEAR_SCREEN TOK_BOOLEAN
 }
 ;
 
+suse_niit: TOK_USE_NIIT TOK_STRING
+{
+  PARSER_DEBUG_PRINTF("Use NIIT ip translation: %s\n", $2->string);
+  olsr_cnf->niit_if = $2->string;
+  free($2);
+}
+;
+
+
 plblock: TOK_PLUGIN TOK_STRING
 {
   struct plugin_entry *pe, *last;
index 75a68e0..8bfb4b2 100644 (file)
@@ -428,6 +428,11 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_CLEAR_SCREEN;
 }
 
+"UseNiit" {
+    yylval = NULL;
+    return TOK_USE_NIIT;
+}
+
 "Weight" {
     yylval = NULL;
     return TOK_IFWEIGHT;
index 0a0d8e5..28f504d 100644 (file)
@@ -165,6 +165,18 @@ prefix_to_netmask4(uint8_t prefixlen)
   return prefixlen == 0 ? 0 : (~0U << (32 - prefixlen));
 }
 
+static INLINE bool
+olsr_is_niit_ip(const union olsr_ip_addr *ip) {
+  return olsr_cnf->ip_version == AF_INET6 &&
+      ip->v6.s6_addr32[0] == 0 && ip->v6.s6_addr32[0] == 0 && ip->v6.s6_addr32[0] == 0xffff;
+}
+
+static INLINE union olsr_ip_addr *
+olsr_ipv6_to_ipv4(const union olsr_ip_addr *ipv6, union olsr_ip_addr *ipv4) {
+  ipv4->v4.s_addr = ipv6->v6.s6_addr32[3];
+  return ipv4;
+}
+
 #endif
 
 /*
index b699ef3..f2b990a 100644 (file)
@@ -175,19 +175,6 @@ void rtnetlink_read(int sock)
 
 #endif /*linux_rtnetlink_listen*/
 
-static bool
-olsr_is_niit_ip(union olsr_ip_addr *ip) {
-  assert(olsr_cnf->ip_version == AF_INET6);
-
-  return ip->v6.s6_addr32[0] == 0 && ip->v6.s6_addr32[0] == 0 && ip->v6.s6_addr32[0] == 0xffff;
-}
-
-static union olsr_ip_addr *
-olsr_ipv6_to_ipv4(union olsr_ip_addr *ipv6, union olsr_ip_addr *ipv4) {
-  ipv4->v4.s_addr = ipv6->v6.s6_addr32[3];
-  return ipv4;
-}
-
 static void
 olsr_netlink_addreq(struct olsr_rtreq *req, int type, const void *data, int len)
 {
@@ -547,7 +534,7 @@ static int
 olsr_netlink_route(const struct rt_entry *rt, uint8_t family, uint8_t rttable, __u16 cmd)
 {
   /*create/delete niit route if we have an niit device*/
-  if ((olsr_cnf->niit_if_index!=NULL) && (family != AF_INET) && (olsr_is_niit_ip(&rt->rt_dst.prefix.v6))) olsr_netlink_route_int(rt, family, rttable, cmd, RT_NIIT);
+  if ((olsr_cnf->niit_if_index!=-1) && (family != AF_INET) && (olsr_is_niit_ip(&rt->rt_dst.prefix))) olsr_netlink_route_int(rt, family, rttable, cmd, RT_NIIT);
 
   return olsr_netlink_route_int(rt, family, rttable, cmd, RT_ORIG_REQUEST);
 }
index 4705d8b..baaae78 100644 (file)
@@ -86,6 +86,8 @@
 #define DEF_RTPROTO         0 /* 0 means OS-specific default */
 #define DEF_RTTABLE         254
 #define DEF_MIN_TC_VTIME    0.0
+#define DEF_NIIT            "auto"
+#define DEF_NIIT_IF         "niit4to6"
 
 /* Bounds */
 
@@ -248,6 +250,7 @@ struct olsrd_config {
 
   char *lock_file;
 
+  char *niit_if;
   int niit_if_index;
 
   int ioctl_s;                         /* Socket used for ioctl calls */