Simplify NIIT configuration to boolean
authorHenning Rogge <hrogge@googlemail.com>
Wed, 13 Jan 2010 15:32:54 +0000 (16:32 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Wed, 13 Jan 2010 15:32:54 +0000 (16:32 +0100)
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/linux/net.c
src/main.c
src/net_os.h
src/olsr_cfg.h

index 325aa53..88dfa79 100644 (file)
@@ -101,23 +101,6 @@ main(int argc, char *argv[])
 
 #endif
 
-#ifdef linux
-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;
-}
-#endif
-
 int
 olsrd_parse_cnf(const char *filename)
 {
@@ -159,16 +142,6 @@ 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;
 }
 
@@ -583,7 +556,7 @@ 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->use_niit = DEF_USE_NIIT;
   cnf->niit_if_index = 0;
 
 #if LINUX_POLICY_ROUTING
@@ -691,7 +664,7 @@ 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);
+  printf("Use niit:        : %s\n", cnf->use_niit ? "yes" : "no");
 
   /* Interfaces */
   if (in) {
index 01adfa9..4c81bd3 100644 (file)
@@ -1119,16 +1119,16 @@ anat_thresh: TOK_LQ_NAT_THRESH TOK_FLOAT
 
 bclear_screen: TOK_CLEAR_SCREEN TOK_BOOLEAN
 {
-  PARSER_DEBUG_PRINTF("Clear screen %s\n", olsr_cnf->clear_screen ? "enabled" : "disabled");
+  PARSER_DEBUG_PRINTF("Clear screen %s\n", $2->boolean ? "enabled" : "disabled");
   olsr_cnf->clear_screen = $2->boolean;
   free($2);
 }
 ;
 
-suse_niit: TOK_USE_NIIT TOK_STRING
+suse_niit: TOK_USE_NIIT TOK_BOOLEAN
 {
-  PARSER_DEBUG_PRINTF("Use NIIT ip translation: %s\n", $2->string);
-  olsr_cnf->niit_if = $2->string;
+  PARSER_DEBUG_PRINTF("Use NIIT ip translation: %s\n", $2->boolean ? "enabled" : "disabled");
+  olsr_cnf->use_niit = $2->boolean;
   free($2);
 }
 ;
index 40fb011..1931232 100644 (file)
@@ -821,6 +821,22 @@ calculate_if_metric(char *ifname)
 }
 #endif
 
+bool olsr_check_ifup(const char * dev)
+{
+  int r;
+  struct ifreq ifr;
+  memset(&ifr, 0, sizeof(ifr));
+  strncpy(ifr.ifr_name, dev, IFNAMSIZ);
+
+  r = ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr);
+  if (r < 0) {
+    perror("ioctl to check interface up/down");
+    return false;
+  }
+
+  return (ifr.ifr_flags & IFF_UP) != 0;
+}
+
 /*
  * Local Variables:
  * c-basic-offset: 2
index c2edd6b..a6873b5 100644 (file)
@@ -78,6 +78,8 @@ bool olsr_win32_end_flag = false;
 static void olsr_shutdown(int) __attribute__ ((noreturn));
 #endif
 
+#define DEF_NIIT_IFNAME         "niit4to6"
+
 /*
  * Local function prototypes
  */
@@ -162,6 +164,21 @@ static void olsr_create_lock_file(void) {
   return;
 }
 
+#ifdef linux
+static void handle_niit_config(void) {
+  int if_index;
+
+  if (olsr_cnf->ip_version == AF_INET || !olsr_cnf->use_niit) {
+    return;
+  }
+
+  if_index = if_nametoindex(DEF_NIIT_IFNAME);
+  if (if_index > 0 && olsr_check_ifup(DEF_NIIT_IFNAME)) {
+    olsr_cnf->niit_if_index = if_index;
+  }
+}
+#endif
+
 /**
  * loads a config file
  * @return <0 if load failed, 0 otherwise
@@ -374,6 +391,11 @@ int main(int argc, char *argv[]) {
   }
 #endif
 
+#if defined linux
+  /* initialize niit if index */
+  handle_niit_config();
+#endif
+
   /* Init empty TC timer */
   set_empty_tc_timer(GET_TIMESTAMP(0));
 
index 67f86ba..8b1fd9d 100644 (file)
@@ -89,6 +89,10 @@ bool is_if_link_up(char *);
 
 int join_mcast(struct interface *, int);
 
+#ifdef linux
+bool olsr_check_ifup(const char * dev);
+#endif
+
 #endif
 
 /*
index baaae78..083af76 100644 (file)
@@ -86,8 +86,7 @@
 #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"
+#define DEF_USE_NIIT        true
 
 /* Bounds */
 
@@ -250,7 +249,7 @@ struct olsrd_config {
 
   char *lock_file;
 
-  char *niit_if;
+  bool use_niit;
   int niit_if_index;
 
   int ioctl_s;                         /* Socket used for ioctl calls */