make src/unix/ifnet.[ch] more readable
authorBernd Petrovitsch <bernd@firmix.at>
Wed, 5 Nov 2008 00:28:29 +0000 (01:28 +0100)
committerBernd Petrovitsch <bernd@firmix.at>
Wed, 5 Nov 2008 00:28:29 +0000 (01:28 +0100)
- comment out an unused funtion
- reformat src/unix/ifnet.c
- kill whitespace at the end-of-the-line

src/ifnet.h
src/linux/net.c
src/unix/ifnet.c

index e2dd195..a8c674c 100644 (file)
 
 #include "olsr_cfg.h"
 
+#if 0
 int
 set_flag(char *, short);
+#endif
 
 void
 check_interface_updates(void *);
index 762ec04..0a5041f 100644 (file)
@@ -112,46 +112,37 @@ bind_socket_to_device(int sock, char *dev_name)
 int
 enable_ip_forwarding(int version)
 {
-  FILE *proc_fwd;
   const char * const procfile = version == AF_INET
       ? "/proc/sys/net/ipv4/ip_forward"
       : "/proc/sys/net/ipv6/conf/all/forwarding";
+  FILE *proc_fwd = fopen(procfile, "r");
+
+  if (proc_fwd == NULL) {
+    fprintf(stderr,
+           "WARNING! Could not open the %s file to check/enable IP forwarding!\n"
+           "Are you using the procfile filesystem?\nDoes your system support IPv%d?\n"
+           "I will continue(in 3 sec) - but you should manually ensure that IP forwarding is enabled!\n\n",
+           procfile, version == AF_INET ? 4 : 6);
+    sleep(3);
+    return 0;
+  }
+  orig_fwd_state = fgetc(proc_fwd);
+  fclose(proc_fwd);
 
-  if ((proc_fwd=fopen(procfile, "r"))==NULL)
-    {
-      /* IPv4 */
-      if(version == AF_INET)
-       fprintf(stderr, "WARNING! Could not open the %s file to check/enable IP forwarding!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that IP forwarding is enabeled!\n\n", procfile);
-      /* IPv6 */
-      else
-       fprintf(stderr, "WARNING! Could not open the %s file to check/enable IP forwarding!\nAre you using the procfile filesystem?\nDoes your system support IPv6?\nI will continue(in 3 sec) - but you should mannually ensure that IP forwarding is enabeled!\n\n", procfile);
-      
+  if(orig_fwd_state == '1') {
+    OLSR_PRINTF(3, "\nIP forwarding is enabled on this system\n");
+  } else {
+    proc_fwd = fopen(procfile, "w");
+    if (proc_fwd == NULL) {
+      fprintf(stderr, "Could not open %s for writing!\n", procfile);
+      fprintf(stderr, "I will continue(in 3 sec) - but you should manually ensure that IP forwarding is enabeled!\n\n");
       sleep(3);
       return 0;
     }
-  
-  orig_fwd_state = fgetc(proc_fwd);
-  fclose(proc_fwd);
-  if(orig_fwd_state == '1')
-    {
-      OLSR_PRINTF(3, "\nIP forwarding is enabled on this system\n");
-    }
-  else
-    {
-      if ((proc_fwd=fopen(procfile, "w"))==NULL)
-        {
-          fprintf(stderr, "Could not open %s for writing!\n", procfile);
-          fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that IP forwarding is enabeled!\n\n");
-          sleep(3);
-          return 0;
-        }
-      else
-        {
-          syslog(LOG_INFO, "Writing \"1\" to %s\n", procfile);
-          fputs("1", proc_fwd);
-        }
-      fclose(proc_fwd);
-    }
+    syslog(LOG_INFO, "Writing \"1\" to %s\n", procfile);
+    fputs("1", proc_fwd);
+    fclose(proc_fwd);
+  }
   return 1;      
 }
 
@@ -161,29 +152,32 @@ disable_redirects_global(int version)
   FILE *proc_redirect;
   const char * const procfile = "/proc/sys/net/ipv4/conf/all/send_redirects";
 
-  if(version == AF_INET6)
+  if (version == AF_INET6) {
     return -1;
-
-  if((proc_redirect = fopen(procfile, "r")) == NULL)
-    {
-      fprintf(stderr, "WARNING! Could not open the %s file to check/disable ICMP redirects!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that ICMP redirects are disabled!\n\n", procfile);
-      
-      sleep(3);
-      return -1;
-    }
+  }
+  proc_redirect = fopen(procfile, "r");
+  if (proc_redirect == NULL) {
+    fprintf(stderr,
+           "WARNING! Could not open the %s file to check/disable ICMP redirects!\n"
+           "Are you using the procfile filesystem?\n"
+           "Does your system support IPv4?\n"
+           "I will continue(in 3 sec) - but you should manually ensure that ICMP redirects are disabled!\n\n", procfile);
+    sleep(3);
+    return -1;
+  }
   orig_global_redirect_state = fgetc(proc_redirect);
   fclose(proc_redirect);
 
-  if(orig_global_redirect_state == '0')
-      return 0;
-
-  if ((proc_redirect = fopen(procfile, "w"))==NULL)
-    {
-      fprintf(stderr, "Could not open %s for writing!\n", procfile);
-      fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that ICMP redirect is disabeled!\n\n");
-      sleep(3);
+  if(orig_global_redirect_state == '0') {
       return 0;
-    }
+  }
+  proc_redirect = fopen(procfile, "w");
+  if (proc_redirect == NULL) {
+    fprintf(stderr, "Could not open %s for writing!\n", procfile);
+    fprintf(stderr, "I will continue(in 3 sec) - but you should manually ensure that ICMP redirect is disabled!\n\n");
+    sleep(3);
+    return 0;
+  }
   syslog(LOG_INFO, "Writing \"0\" to %s", procfile);
   fputs("0", proc_redirect);
   fclose(proc_redirect);  
@@ -200,29 +194,33 @@ disable_redirects(const char *if_name, struct interface *iface, int version)
   FILE *proc_redirect;
   char procfile[FILENAME_MAX];
 
-  if(version == AF_INET6)
+  if (version == AF_INET6) {
     return -1;
+  }
 
   /* Generate the procfile name */
   snprintf(procfile, sizeof(procfile), REDIRECT_PROC, if_name);
 
-
-  if((proc_redirect = fopen(procfile, "r")) == NULL)
-    {
-      fprintf(stderr, "WARNING! Could not open the %s file to check/disable ICMP redirects!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that ICMP redirects are disabled!\n\n", procfile);      
-      sleep(3);
-      return 0;
-    }
+  proc_redirect = fopen(procfile, "r");
+  if (proc_redirect == NULL) {
+    fprintf(stderr,
+           "WARNING! Could not open the %s file to check/disable ICMP redirects!\n"
+           "Are you using the procfile filesystem?\n"
+           "Does your system support IPv4?\n"
+           "I will continue(in 3 sec) - but you should manually ensure that ICMP redirects are disabled!\n\n", procfile);      
+    sleep(3);
+    return 0;
+  }
   iface->nic_state.redirect = fgetc(proc_redirect);
   fclose(proc_redirect);      
 
-  if ((proc_redirect = fopen(procfile, "w"))==NULL)
-    {
-      fprintf(stderr, "Could not open %s for writing!\n", procfile);
-      fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that ICMP redirect is disabeled!\n\n");
-      sleep(3);
-      return 0;
-    }
+  proc_redirect = fopen(procfile, "w");
+  if (proc_redirect == NULL) {
+    fprintf(stderr, "Could not open %s for writing!\n", procfile);
+    fprintf(stderr, "I will continue(in 3 sec) - but you should manually ensure that ICMP redirect is disabled!\n\n");
+    sleep(3);
+    return 0;
+  }
   syslog(LOG_INFO, "Writing \"0\" to %s", procfile);
   fputs("0", proc_redirect);
   fclose(proc_redirect);
@@ -239,29 +237,33 @@ deactivate_spoof(const char *if_name, struct interface *iface, int version)
   FILE *proc_spoof;
   char procfile[FILENAME_MAX];
 
-  if(version == AF_INET6)
+  if(version == AF_INET6) {
     return -1;
+  }
 
   /* Generate the procfile name */
   sprintf(procfile, SPOOF_PROC, if_name);
 
-  if((proc_spoof = fopen(procfile, "r")) == NULL)
-    {
-      fprintf(stderr, "WARNING! Could not open the %s file to check/disable the IP spoof filter!\nAre you using the procfile filesystem?\nDoes your system support IPv4?\nI will continue(in 3 sec) - but you should mannually ensure that IP spoof filtering is disabled!\n\n", procfile);
-      
-      sleep(3);
-      return 0;
-    }
+  proc_spoof = fopen(procfile, "r");
+  if (proc_spoof == NULL) {
+    fprintf(stderr,
+           "WARNING! Could not open the %s file to check/disable the IP spoof filter!\n"
+           "Are you using the procfile filesystem?\n"
+           "Does your system support IPv4?\n"
+           "I will continue(in 3 sec) - but you should manually ensure that IP spoof filtering is disabled!\n\n", procfile);
+    sleep(3);
+    return 0;
+  }
   iface->nic_state.spoof = fgetc(proc_spoof);
   fclose(proc_spoof);
 
-  if ((proc_spoof = fopen(procfile, "w")) == NULL)
-    {
-      fprintf(stderr, "Could not open %s for writing!\n", procfile);
-      fprintf(stderr, "I will continue(in 3 sec) - but you should mannually ensure that IP spoof filtering is disabeled!\n\n");
-      sleep(3);
-      return 0;
-    }
+  proc_spoof = fopen(procfile, "w");
+  if (proc_spoof == NULL) {
+    fprintf(stderr, "Could not open %s for writing!\n", procfile);
+    fprintf(stderr, "I will continue(in 3 sec) - but you should manually ensure that IP spoof filtering is disabled!\n\n");
+    sleep(3);
+    return 0;
+  }
   syslog(LOG_INFO, "Writing \"0\" to %s", procfile);
   fputs("0", proc_spoof);
   fclose(proc_spoof);
@@ -279,85 +281,76 @@ restore_settings(int version)
   OLSR_PRINTF(1, "Restoring network state\n");
 
   /* Restore IP forwarding to "off" */
-  if(orig_fwd_state == '0')
-    {
-      const char * const procfile = version == AF_INET
+  if (orig_fwd_state == '0') {
+    const char * const procfile = version == AF_INET
         ? "/proc/sys/net/ipv4/ip_forward"
         : "/proc/sys/net/ipv6/conf/all/forwarding";
-      FILE *proc_fd;
-
-      if ((proc_fd = fopen(procfile, "w")) == NULL)
-       {
-         fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile);
-       }
-      else
-       {
-         syslog(LOG_INFO, "Resetting %s to %c\n", procfile, orig_fwd_state);
-         fputc(orig_fwd_state, proc_fd);
-         fclose(proc_fd);
-       }
+    FILE *proc_fd = fopen(procfile, "w");
+
+    if (proc_fd == NULL) {
+      fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile);
+    } else {
+      syslog(LOG_INFO, "Resetting %s to %c\n", procfile, orig_fwd_state);
+      fputc(orig_fwd_state, proc_fd);
+      fclose(proc_fd);
     }
+  }
 
   /* Restore global ICMP redirect setting */
-  if(orig_global_redirect_state != '0')
-    {
-      if(version == AF_INET)
-       {
-         const char * const procfile = "/proc/sys/net/ipv4/conf/all/send_redirects";
-          FILE *proc_fd;
-
-         if ((proc_fd = fopen(procfile, "w")) == NULL)
-           {
-             fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile);
-           }
-         else
-           {
-             syslog(LOG_INFO, "Resetting %s to %c\n", procfile, orig_global_redirect_state);
-             fputc(orig_global_redirect_state, proc_fd);
-             fclose(proc_fd);
-           }
-       }
+  if(orig_global_redirect_state != '0') {
+    if(version == AF_INET) {
+      const char * const procfile = "/proc/sys/net/ipv4/conf/all/send_redirects";
+      FILE *proc_fd = fopen(procfile, "w");
+
+      if (proc_fd == NULL) {
+       fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile);
+      } else {
+       syslog(LOG_INFO, "Resetting %s to %c\n", procfile, orig_global_redirect_state);
+       fputc(orig_global_redirect_state, proc_fd);
+       fclose(proc_fd);
+      }
     }
+  }
 
-  if(version == AF_INET6)
+  if (version == AF_INET6) {
     return 0;
+  }
 
-  for(ifs = ifnet; ifs != NULL; ifs = ifs->int_next)
-    {
-      char procfile[FILENAME_MAX];
-      FILE *proc_fd;
-      /* Discard host-emulation interfaces */
-      if(ifs->is_hcif)
+  for(ifs = ifnet; ifs != NULL; ifs = ifs->int_next) {
+    char procfile[FILENAME_MAX];
+    FILE *proc_fd;
+    /* Ignore host-emulation interfaces */
+    if (ifs->is_hcif) {
        continue;
-      /* ICMP redirects */
-      
-      /* Generate the procfile name */
-      snprintf(procfile, sizeof(procfile), REDIRECT_PROC, ifs->int_name);
+    }
+    /* ICMP redirects */
       
-      if ((proc_fd = fopen(procfile, "w")) == NULL)
-         fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile);
-      else
-       {
-         syslog(LOG_INFO, "Resetting %s to %c\n", procfile, ifs->nic_state.redirect);
-
-         fputc(ifs->nic_state.redirect, proc_fd);
-         fclose(proc_fd);
-       }
+    /* Generate the procfile name */
+    snprintf(procfile, sizeof(procfile), REDIRECT_PROC, ifs->int_name);
+    proc_fd = fopen(procfile, "w");
+    if (proc_fd == NULL) {
+      fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile);
+    } else {
+      syslog(LOG_INFO, "Resetting %s to %c\n", procfile, ifs->nic_state.redirect);
+
+      fputc(ifs->nic_state.redirect, proc_fd);
+      fclose(proc_fd);
+    }
       
-      /* Spoof filter */
+    /* Spoof filter */
       
-      /* Generate the procfile name */
-      sprintf(procfile, SPOOF_PROC, ifs->int_name);
-      if ((proc_fd = fopen(procfile, "w")) == NULL)
-         fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile);
-      else
-       {
-         syslog(LOG_INFO, "Resetting %s to %c\n", procfile, ifs->nic_state.spoof);
-
-         fputc(ifs->nic_state.spoof, proc_fd);
-         fclose(proc_fd);
-       }
+    /* Generate the procfile name */
+    sprintf(procfile, SPOOF_PROC, ifs->int_name);
+    proc_fd = fopen(procfile, "w");
+    if (proc_fd == NULL) {
+      fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procfile);
+    } else {
+      syslog(LOG_INFO, "Resetting %s to %c\n", procfile, ifs->nic_state.spoof);
+
+      fputc(ifs->nic_state.spoof, proc_fd);
+      fclose(proc_fd);
     }
+  }
   return 1;
 }
 
@@ -369,31 +362,30 @@ restore_settings(int version)
 int
 gethemusocket(struct sockaddr_in *pin)
 {
-  int sock, on = 1;
+  int sock, on;
 
   OLSR_PRINTF(1, "       Connecting to switch daemon port 10150...");
-  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
-    {
-      perror("hcsocket");
-      syslog(LOG_ERR, "hcsocket: %m");
-      return -1;
-    }
+  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+    perror("hcsocket");
+    syslog(LOG_ERR, "hcsocket: %m");
+    return -1;
+  }
+
+  on = 1;
+  if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) {
+    perror("SO_REUSEADDR failed");
+    close(sock);
+    return -1;
+  }
 
-  if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) 
-    {
-      perror("SO_REUSEADDR failed");
-      close(sock);
-      return -1;
-    }
   /* connect to PORT on HOST */
-  if (connect(sock,(struct sockaddr *) pin, sizeof(*pin)) < 0) 
-    {
-      printf("FAILED\n");
-      fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
-      printf("connection refused\n");
-      close(sock);
-      return -1;
-    }
+  if (connect(sock,(struct sockaddr *) pin, sizeof(*pin)) < 0) {
+    printf("FAILED\n");
+    fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
+    printf("connection refused\n");
+    close(sock);
+    return -1;
+  }
 
   printf("OK\n");
 
@@ -413,43 +405,39 @@ getsocket(int bufspace, char *int_name)
   struct sockaddr_in sin;
   int on;
   int sock = socket(AF_INET, SOCK_DGRAM, 0);
-  if (sock < 0) 
-    {
-      perror("socket");
-      syslog(LOG_ERR, "socket: %m");
-      return -1;
-    }
+  if (sock < 0) {
+    perror("socket");
+    syslog(LOG_ERR, "socket: %m");
+    return -1;
+  }
 
   on = 1;
 #ifdef SO_BROADCAST
-  if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof (on)) < 0)
-    {
-      perror("setsockopt");
-      syslog(LOG_ERR, "setsockopt SO_BROADCAST: %m");
-      close(sock);
-      return -1;
-    }
+  if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) {
+    perror("setsockopt");
+    syslog(LOG_ERR, "setsockopt SO_BROADCAST: %m");
+    close(sock);
+    return -1;
+  }
 #endif
 
-  if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) 
-    {
-      perror("SO_REUSEADDR failed");
-      close(sock);
-      return -1;
-    }
+  if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) {
+    perror("SO_REUSEADDR failed");
+    close(sock);
+    return -1;
+  }
 
 #ifdef SO_RCVBUF
-  for (on = bufspace; ; on -= 1024) 
-    {
-      if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &on, sizeof (on)) == 0)
-       break;
-      if (on <= 8*1024) 
-       {
-         perror("setsockopt");
-         syslog(LOG_ERR, "setsockopt SO_RCVBUF: %m");
-         break;
-       }
+  for (on = bufspace; ; on -= 1024) {
+    if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &on, sizeof(on)) == 0) {
+      break;
     }
+    if (on <= 8*1024) {
+      perror("setsockopt");
+      syslog(LOG_ERR, "setsockopt SO_RCVBUF: %m");
+      break;
+    }
+  }
 #endif
 
   /*
@@ -457,32 +445,31 @@ getsocket(int bufspace, char *int_name)
    */
 
   /* Bind to device */
-  if(bind_socket_to_device(sock, int_name) < 0)
-    {
-      fprintf(stderr, "Could not bind socket to device... exiting!\n\n");
-      syslog(LOG_ERR, "Could not bind socket to device... exiting!\n\n");
-      close(sock);
-      return -1;
-    }
+  if (bind_socket_to_device(sock, int_name) < 0) {
+    fprintf(stderr, "Could not bind socket to device... exiting!\n\n");
+    syslog(LOG_ERR, "Could not bind socket to device... exiting!\n\n");
+    close(sock);
+    return -1;
+  }
 
-  memset(&sin, 0, sizeof (sin));
+  memset(&sin, 0, sizeof(sin));
   sin.sin_family = AF_INET;
   sin.sin_port = htons(OLSRPORT);
   sin.sin_addr.s_addr = INADDR_ANY;
   if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
-      perror("bind");
-      syslog(LOG_ERR, "bind: %m");
-      close(sock);
-      return -1;
+    perror("bind");
+    syslog(LOG_ERR, "bind: %m");
+    close(sock);
+    return -1;
   }
 
   on = fcntl(sock, F_GETFL);
   if (on == -1) {
-      syslog(LOG_ERR, "fcntl (F_GETFL): %m\n");
+    syslog(LOG_ERR, "fcntl (F_GETFL): %m\n");
   } else {
-      if (fcntl(sock, F_SETFL, on|O_NONBLOCK) == -1) {
-          syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n");
-      }
+    if (fcntl(sock, F_SETFL, on|O_NONBLOCK) == -1) {
+      syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n");
+    }
   }
   return sock;
 }
@@ -516,7 +503,7 @@ getsocket6(int bufspace, char *int_name)
 
   //#ifdef SO_BROADCAST
   /*
-  if (setsockopt(sock, SOL_SOCKET, SO_MULTICAST, &on, sizeof (on)) < 0)
+  if (setsockopt(sock, SOL_SOCKET, SO_MULTICAST, &on, sizeof(on)) < 0)
     {
       perror("setsockopt");
       syslog(LOG_ERR, "setsockopt SO_BROADCAST: %m");
@@ -527,32 +514,30 @@ getsocket6(int bufspace, char *int_name)
   //#endif
 
 #ifdef SO_RCVBUF
-  for (on = bufspace; ; on -= 1024) 
-    {
-      if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &on, sizeof (on)) == 0)
-       break;
-      if (on <= 8*1024) 
-       {
-         perror("setsockopt");
-         syslog(LOG_ERR, "setsockopt SO_RCVBUF: %m");
-         break;
-       }
+  for (on = bufspace; ; on -= 1024) {
+    if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &on, sizeof(on)) == 0) {
+      break;
     }
+    if (on <= 8*1024) {
+      perror("setsockopt");
+      syslog(LOG_ERR, "setsockopt SO_RCVBUF: %m");
+      break;
+    }
+  }
 #endif
 
   on = 1;
-  if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) 
-    {
-      perror("SO_REUSEADDR failed");
-      close(sock);
-      return (-1);
-    }
+  if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) {
+    perror("SO_REUSEADDR failed");
+    close(sock);
+    return (-1);
+  }
 
   /*
    * we are abusing "on" here. The value is 1 which is our intended
    * hop limit value.
    */
-  if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &on, sizeof (on)) < 0) {
+  if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &on, sizeof(on)) < 0) {
     perror ("setsockopt");
     close(sock);
     return (-1);
@@ -564,33 +549,31 @@ getsocket6(int bufspace, char *int_name)
    */
 
   /* Bind to device */
-  if(bind_socket_to_device(sock, int_name) < 0)
-    {
-      fprintf(stderr, "Could not bind socket to device... exiting!\n\n");
-      syslog(LOG_ERR, "Could not bind socket to device... exiting!\n\n");
-      close(sock);
-      return -1;
-    }
+  if(bind_socket_to_device(sock, int_name) < 0) {
+    fprintf(stderr, "Could not bind socket to device... exiting!\n\n");
+    syslog(LOG_ERR, "Could not bind socket to device... exiting!\n\n");
+    close(sock);
+    return -1;
+  }
 
   memset(&sin, 0, sizeof(sin));
   sin.sin6_family = AF_INET6;
   sin.sin6_port = htons(OLSRPORT);
   //(addrsock6.sin6_addr).s_addr = IN6ADDR_ANY_INIT;
-  if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) 
-    {
-      perror("bind");
-      syslog(LOG_ERR, "bind: %m");
-      close(sock);
-      return (-1);
-    }
+  if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+    perror("bind");
+    syslog(LOG_ERR, "bind: %m");
+    close(sock);
+    return (-1);
+  }
 
   on = fcntl(sock, F_GETFL);
   if (on == -1) {
-      syslog(LOG_ERR, "fcntl (F_GETFL): %m\n");
+    syslog(LOG_ERR, "fcntl (F_GETFL): %m\n");
   } else {
-      if (fcntl(sock, F_SETFL, on|O_NONBLOCK) == -1) {
-          syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n");
-      }
+    if (fcntl(sock, F_SETFL, on|O_NONBLOCK) == -1) {
+      syslog(LOG_ERR, "fcntl O_NONBLOCK: %m\n");
+    }
   }
   return sock;
 }
@@ -668,41 +651,36 @@ join_mcast(struct interface *ifs, int sock)
 int
 get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, int scope_in)
 {
-  char addr6[40], devname[IFNAMSIZ];
-  char addr6p[8][5];
-  int plen, scope, dad_status, if_idx;
-  FILE *f;
-  struct sockaddr_in6 tmp_sockaddr6;
-
-  if ((f = fopen(_PATH_PROCNET_IFINET6, "r")) != NULL) 
-    {
-      while (fscanf(f, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n",
-                   addr6p[0], addr6p[1], addr6p[2], addr6p[3],
-                   addr6p[4], addr6p[5], addr6p[6], addr6p[7],
-                   &if_idx, &plen, &scope, &dad_status, devname) != EOF) 
-       {
-         if (!strcmp(devname, ifname)) 
-           {
-             sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s",
+  int rv = 0;
+  FILE *f = fopen(_PATH_PROCNET_IFINET6, "r");
+  if (f != NULL) {
+    char devname[IFNAMSIZ];
+    char addr6p[8][5];
+    int plen, scope, dad_status, if_idx;
+    while (fscanf(f, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n",
+                 addr6p[0], addr6p[1], addr6p[2], addr6p[3],
+                 addr6p[4], addr6p[5], addr6p[6], addr6p[7],
+                 &if_idx, &plen, &scope, &dad_status, devname) != EOF) {
+      if (strcmp(devname, ifname) == 0) {
+       char addr6[40];
+       sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s",
+               addr6p[0], addr6p[1], addr6p[2], addr6p[3],
+               addr6p[4], addr6p[5], addr6p[6], addr6p[7]);
+       OLSR_PRINTF(5, "\tinet6 addr: %s\n", addr6);
+       OLSR_PRINTF(5, "\tScope: %d\n", scope);
+       if (scope == scope_in) {
+         OLSR_PRINTF(4, "Found addr: %s:%s:%s:%s:%s:%s:%s:%s\n",
                      addr6p[0], addr6p[1], addr6p[2], addr6p[3],
                      addr6p[4], addr6p[5], addr6p[6], addr6p[7]);
-             OLSR_PRINTF(5, "\tinet6 addr: %s\n", addr6);
-             OLSR_PRINTF(5, "\tScope: %d\n", scope);
-             if(scope == scope_in)
-               {
-                 OLSR_PRINTF(4, "Found addr: %s:%s:%s:%s:%s:%s:%s:%s\n",
-                             addr6p[0], addr6p[1], addr6p[2], addr6p[3],
-                             addr6p[4], addr6p[5], addr6p[6], addr6p[7]);
-                 inet_pton(AF_INET6,addr6,&tmp_sockaddr6);
-                 memcpy(&saddr6->sin6_addr, &tmp_sockaddr6, sizeof(struct in6_addr));    
-                 fclose(f);
-                 return 1;
-               }
-           }
+         inet_pton(AF_INET6, addr6, saddr6);
+         rv = 1;
        }
-      fclose(f);
-    }  
-  return 0;
+       break;
+      }
+    }
+    fclose(f);
+  }
+  return rv;
 }
 
 
@@ -922,3 +900,8 @@ calculate_if_metric(char *ifname)
 }
 #endif
   
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * End:
+ */
index 55d6774..bad7096 100644 (file)
@@ -3,31 +3,31 @@
  * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
  * are met:
  *
- * * Redistributions of source code must retain the above copyright 
+ * * Redistributions of source code must retain the above copyright
  *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright 
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the 
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
  *   distribution.
- * * Neither the name of olsr.org, olsrd nor the names of its 
- *   contributors may be used to endorse or promote products derived 
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
  *   from this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * Visit http://www.olsr.org for more information.
 
 #define BUFSPACE  (127*1024)   /* max. input buffer size to request */
 
+/* global variables are automatically initialized with '\0' */
+static const union olsr_ip_addr null_addr;
+
+#if 0
 int
 set_flag(char *ifname, short flag __attribute__((unused)))
 {
   struct ifreq ifr;
 
-  strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-
   /* Get flags */
-  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) 
-    {
-      fprintf(stderr,"ioctl (get interface flags)");
-      return -1;
-    }
+  strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) {
+    fprintf(stderr,"ioctl (get interface flags)");
+    return -1;
+  }
 
   strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-  
   //printf("Setting flags for if \"%s\"\n", ifr.ifr_name);
-
-  if(!(ifr.ifr_flags & (IFF_UP | IFF_RUNNING)))
-    {
-      /* Add UP */
-      ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
-      /* Set flags + UP */
-      if(ioctl(olsr_cnf->ioctl_s, SIOCSIFFLAGS, &ifr) < 0)
-       {
-         fprintf(stderr, "ERROR(%s): %s\n", ifr.ifr_name, strerror(errno));
-         return -1;
-       }
+  if ((ifr.ifr_flags & (IFF_UP | IFF_RUNNING)) == 0) {
+    /* Add UP */
+    ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
+    /* Set flags + UP */
+    if (ioctl(olsr_cnf->ioctl_s, SIOCSIFFLAGS, &ifr) < 0) {
+      fprintf(stderr, "ERROR(%s): %s\n", ifr.ifr_name, strerror(errno));
+      return -1;
     }
+  }
   return 1;
-
 }
-
-
-
+#endif
 
 void
 check_interface_updates(void *foo __attribute__((unused)))
@@ -117,34 +112,27 @@ check_interface_updates(void *foo __attribute__((unused)))
   OLSR_PRINTF(3, "Checking for updates in the interface set\n");
 #endif
 
-  for(tmp_if = olsr_cnf->interfaces; tmp_if != NULL; tmp_if = tmp_if->next)
-    {
-      if(tmp_if->host_emul)
-       continue;
-      
-      if(olsr_cnf->host_emul) /* XXX: TEMPORARY! */
+  for (tmp_if = olsr_cnf->interfaces; tmp_if != NULL; tmp_if = tmp_if->next) {
+    if (tmp_if->host_emul) {
        continue;
-
-      if(!tmp_if->cnf->autodetect_chg) 
-        {
+    }
+    if (olsr_cnf->host_emul) { /* XXX: TEMPORARY! */
+      continue;
+    }
+    if (!tmp_if->cnf->autodetect_chg) {
 #ifdef DEBUG
-          /* Don't check this interface */
-          OLSR_PRINTF(3, "Not checking interface %s\n", tmp_if->name);
+      /* Don't check this interface */
+      OLSR_PRINTF(3, "Not checking interface %s\n", tmp_if->name);
 #endif
-          continue;
-        }
-
-      if(tmp_if->configured)
-        {
-          chk_if_changed(tmp_if);
-        }
-      else
-        {
-          chk_if_up(tmp_if, 3);
-        }
+      continue;
     }
 
-  return;
+    if (tmp_if->configured) {
+      chk_if_changed(tmp_if);
+    } else {
+      chk_if_up(tmp_if, 3);
+    }
+  }
 }
 
 /**
@@ -157,71 +145,60 @@ check_interface_updates(void *foo __attribute__((unused)))
 int
 chk_if_changed(struct olsr_if *iface)
 {
-  struct interface *ifp, *tmp_ifp;
+  struct ipaddr_str buf;
+  struct interface *ifp;
   struct ifreq ifr;
-  struct sockaddr_in6 tmp_saddr6;
-  int if_changes;
-  if_changes = 0;
+  int if_changes = 0;
 
 #ifdef DEBUG
   OLSR_PRINTF(3, "Checking if %s is set down or changed\n", iface->name);
 #endif
 
-  if(iface->host_emul)
+  if (iface->host_emul) {
     return -1;
-
+  }
   ifp = iface->interf;
+  if (ifp == NULL) {
+    /* Should not happen */
+    iface->configured = 0;
+    return 0;
+  }
 
-  if(ifp == NULL)
-    {
-      /* Should not happen */
-      iface->configured = 0;
-      return 0;
-    }
-
-  memset(&ifr, 0, sizeof(struct ifreq));
+  memset(&ifr, 0, sizeof(ifr));
   strscpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name));
-
-
   /* Get flags (and check if interface exists) */
-  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) 
-    {
-      OLSR_PRINTF(3, "No such interface: %s\n", iface->name);
-      goto remove_interface;
-    }
-
+  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) {
+    OLSR_PRINTF(3, "No such interface: %s\n", iface->name);
+    goto remove_interface;
+  }
   ifp->int_flags = ifr.ifr_flags;
 
   /*
    * First check if the interface is set DOWN
    */
-
-  if ((ifp->int_flags & IFF_UP) == 0)
-    {
-      OLSR_PRINTF(1, "\tInterface %s not up - removing it...\n", iface->name);
-      goto remove_interface;
-    }
+  if ((ifp->int_flags & IFF_UP) == 0) {
+    OLSR_PRINTF(1, "\tInterface %s not up - removing it...\n", iface->name);
+    goto remove_interface;
+  }
 
   /*
    * We do all the interface type checks over.
    * This is because the interface might be a PCMCIA card. Therefore
-   * It might not be the same physical interface as we configured earlier.
+   * it might not be the same physical interface as we configured earlier.
    */
 
   /* Check broadcast */
-  if ((olsr_cnf->ip_version == AF_INET) && 
-      !iface->cnf->ipv4_broadcast.v4.s_addr && /* Skip if fixed bcast */ 
-      (!(ifp->int_flags & IFF_BROADCAST))) 
-    {
-      OLSR_PRINTF(3, "\tNo broadcast - removing\n");
-      goto remove_interface;
-    }
+  if (olsr_cnf->ip_version == AF_INET &&
+      !iface->cnf->ipv4_broadcast.v4.s_addr && /* Skip if fixed bcast */
+      ((ifp->int_flags & IFF_BROADCAST)) == 0) {
+    OLSR_PRINTF(3, "\tNo broadcast - removing\n");
+    goto remove_interface;
+  }
 
-  if (ifp->int_flags & IFF_LOOPBACK)
-    {
-      OLSR_PRINTF(3, "\tThis is a loopback interface - removing it...\n");
-      goto remove_interface;
-    }
+  if (ifp->int_flags & IFF_LOOPBACK) {
+    OLSR_PRINTF(3, "\tThis is a loopback interface - removing it...\n");
+    goto remove_interface;
+  }
 
   ifp->is_hcif = OLSR_FALSE;
 
@@ -229,27 +206,20 @@ chk_if_changed(struct olsr_if *iface)
   ifp->is_wireless = check_wireless_interface(ifr.ifr_name);
 
   /* Set interface metric */
-  if(iface->cnf->weight.fixed)
-    ifp->int_metric = iface->cnf->weight.value;
-  else
-    ifp->int_metric = calculate_if_metric(ifr.ifr_name);
+  ifp->int_metric = iface->cnf->weight.fixed ? iface->cnf->weight.value : calculate_if_metric(ifr.ifr_name);
 
   /* Get MTU */
-  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFMTU, &ifr) < 0)
+  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFMTU, &ifr) < 0) {
     ifp->int_mtu = 0;
-  else
-    {
-      ifr.ifr_mtu -= (olsr_cnf->ip_version == AF_INET6) ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;
-
-      if(ifp->int_mtu != ifr.ifr_mtu)
-       {
-         ifp->int_mtu = ifr.ifr_mtu;
-         /* Create new outputbuffer */
-         net_remove_buffer(ifp); /* Remove old */
-         net_add_buffer(ifp);
-       }
+  } else {
+    ifr.ifr_mtu -= olsr_cnf->ip_version == AF_INET6 ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;
+    if (ifp->int_mtu != ifr.ifr_mtu) {
+      ifp->int_mtu = ifr.ifr_mtu;
+      /* Create new outputbuffer */
+      net_remove_buffer(ifp); /* Remove old */
+      net_add_buffer(ifp);
     }
-
+  }
 
   /* Get interface index */
   ifp->if_index = if_nametoindex(ifr.ifr_name);
@@ -259,149 +229,113 @@ chk_if_changed(struct olsr_if *iface)
    */
   
   /* IP version 6 */
-  if(olsr_cnf->ip_version == AF_INET6)
-    {
-      struct ipaddr_str buf;
-
-      /* Get interface address */
-      
-      if(get_ipv6_address(ifr.ifr_name, &tmp_saddr6, iface->cnf->ipv6_addrtype) <= 0)
-       {
-         if(iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL)
-           OLSR_PRINTF(3, "\tCould not find site-local IPv6 address for %s\n", ifr.ifr_name);
-         else
-           OLSR_PRINTF(3, "\tCould not find global IPv6 address for %s\n", ifr.ifr_name);
-         
-         
-         goto remove_interface;
-       }
+  if (olsr_cnf->ip_version == AF_INET6) {
+    struct sockaddr_in6 tmp_saddr6;
+    /* Get interface address */
+    if (get_ipv6_address(ifr.ifr_name, &tmp_saddr6, iface->cnf->ipv6_addrtype) <= 0) {
+      OLSR_PRINTF(3, "\tCould not find %s IPv6 address for %s\n", iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL ? "site-local" : "global", ifr.ifr_name);
+      goto remove_interface;
+    }
       
 #ifdef DEBUG
-      OLSR_PRINTF(3, "\tAddress: %s\n", ip6_to_string(&buf, &tmp_saddr6.sin6_addr));
+    OLSR_PRINTF(3, "\tAddress: %s\n", ip6_to_string(&buf, &tmp_saddr6.sin6_addr));
 #endif
 
-      if(memcmp(&tmp_saddr6.sin6_addr, &ifp->int6_addr.sin6_addr, olsr_cnf->ipsize) != 0)
-       {
-         OLSR_PRINTF(1, "New IP address for %s:\n", ifr.ifr_name);
-         OLSR_PRINTF(1, "\tOld: %s\n", ip6_to_string(&buf, &ifp->int6_addr.sin6_addr));
-         OLSR_PRINTF(1, "\tNew: %s\n", ip6_to_string(&buf, &tmp_saddr6.sin6_addr));
+    if (ip6equal(&tmp_saddr6.sin6_addr, &ifp->int6_addr.sin6_addr)) {
+      OLSR_PRINTF(1, "New IP address for %s:\n", ifr.ifr_name);
+      OLSR_PRINTF(1, "\tOld: %s\n", ip6_to_string(&buf, &ifp->int6_addr.sin6_addr));
+      OLSR_PRINTF(1, "\tNew: %s\n", ip6_to_string(&buf, &tmp_saddr6.sin6_addr));
 
-         /* Check main addr */
-         if(memcmp(&olsr_cnf->main_addr, &tmp_saddr6.sin6_addr, olsr_cnf->ipsize) == 0)
-           {
-             /* Update main addr */
-             memcpy(&olsr_cnf->main_addr, &tmp_saddr6.sin6_addr, olsr_cnf->ipsize);
-           }
-
-         /* Update address */
-         memcpy(&ifp->int6_addr.sin6_addr, &tmp_saddr6.sin6_addr, olsr_cnf->ipsize);
-         memcpy(&ifp->ip_addr, &tmp_saddr6.sin6_addr, olsr_cnf->ipsize);
+      /* Check main addr */
+      if (ip6equal(&olsr_cnf->main_addr.v6, &tmp_saddr6.sin6_addr)) {
+       /* Update main addr */
+       olsr_cnf->main_addr.v6 = tmp_saddr6.sin6_addr;
+      }
 
-         run_ifchg_cbs(ifp, IFCHG_IF_UPDATE);
+      /* Update address */
+      ifp->int6_addr.sin6_addr = tmp_saddr6.sin6_addr;
+      ifp->ip_addr.v6 = tmp_saddr6.sin6_addr;
 
-         return 1;               
-       }
-      return 0;
+      if_changes = 1;
+    }
+  } else {
+    /* IP version 4 */
+    const struct sockaddr_in *tmp_saddr4  = (struct sockaddr_in *)&ifr.ifr_addr;
 
+    /* Check interface address (IPv4)*/
+    if (ioctl(olsr_cnf->ioctl_s, SIOCGIFADDR, &ifr) < 0) {
+      OLSR_PRINTF(1, "\tCould not get address of interface - removing it\n");
+      goto remove_interface;
     }
-  else
-  /* IP version 4 */
-    {
-      struct ipaddr_str buf;
-
-      /* Check interface address (IPv4)*/
-      if(ioctl(olsr_cnf->ioctl_s, SIOCGIFADDR, &ifr) < 0) {
-       OLSR_PRINTF(1, "\tCould not get address of interface - removing it\n");
-       goto remove_interface;
-      }
 
 #ifdef DEBUG
       OLSR_PRINTF(3, "\tAddress:%s\n", ip4_to_string(&buf, ifp->int_addr.sin_addr));
 #endif
 
-      if(memcmp(&ifp->int_addr.sin_addr.s_addr,
-               &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr, 
-               olsr_cnf->ipsize) != 0)
-       {
-         /* New address */
-         OLSR_PRINTF(1, "IPv4 address changed for %s\n", ifr.ifr_name);
-         OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_addr.sin_addr));
-         OLSR_PRINTF(1, "\tNew:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
-
-         ifp->int_addr = *(struct sockaddr_in *)&ifr.ifr_addr;
-
-         if(memcmp(&olsr_cnf->main_addr, 
-                   &ifp->ip_addr,
-                   olsr_cnf->ipsize) == 0)
-           {
-             OLSR_PRINTF(1, "New main address: %s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
-             olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
-             memcpy(&olsr_cnf->main_addr, 
-                    &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr, 
-                    olsr_cnf->ipsize);
-           }
-
-         memcpy(&ifp->ip_addr, 
-                &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr, 
-                olsr_cnf->ipsize);
-
-         if_changes = 1;
-       }
-
-      /* Check netmask */
-      if (ioctl(olsr_cnf->ioctl_s, SIOCGIFNETMASK, &ifr) < 0) 
-       {
-         olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
-         goto remove_interface;
-       }
+    if (ip4equal(&ifp->int_addr.sin_addr, &tmp_saddr4->sin_addr)) {
+      /* New address */
+      OLSR_PRINTF(1, "IPv4 address changed for %s\n", ifr.ifr_name);
+      OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_addr.sin_addr));
+      OLSR_PRINTF(1, "\tNew:%s\n", ip4_to_string(&buf, tmp_saddr4->sin_addr));
+
+      ifp->int_addr = *(struct sockaddr_in *)&ifr.ifr_addr;
+      if (ip4equal(&olsr_cnf->main_addr.v4, &ifp->ip_addr.v4)) {
+       OLSR_PRINTF(1, "New main address: %s\n", ip4_to_string(&buf, tmp_saddr4->sin_addr));
+       olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", ip4_to_string(&buf, tmp_saddr4->sin_addr));
+       olsr_cnf->main_addr.v4 = tmp_saddr4->sin_addr;
+      }
+
+      ifp->ip_addr.v4 = tmp_saddr4->sin_addr;
+
+      if_changes = 1;
+    }
+
+    /* Check netmask */
+    if (ioctl(olsr_cnf->ioctl_s, SIOCGIFNETMASK, &ifr) < 0) {
+      olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
+      goto remove_interface;
+    }
 
 #ifdef DEBUG
-      OLSR_PRINTF(3, "\tNetmask:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr));
+    OLSR_PRINTF(3, "\tNetmask:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr));
 #endif
 
-      if(memcmp(&ifp->int_netmask.sin_addr.s_addr,
-               &((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr.s_addr, 
-               olsr_cnf->ipsize) != 0)
-       {
-         /* New address */
-         OLSR_PRINTF(1, "IPv4 netmask changed for %s\n", ifr.ifr_name);
-         OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_netmask.sin_addr));
-         OLSR_PRINTF(1, "\tNew:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr));
+    if (ip4equal(&ifp->int_netmask.sin_addr, &((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr)) {
+      /* New address */
+      OLSR_PRINTF(1, "IPv4 netmask changed for %s\n", ifr.ifr_name);
+      OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_netmask.sin_addr));
+      OLSR_PRINTF(1, "\tNew:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr));
 
-         ifp->int_netmask = *(struct sockaddr_in *)&ifr.ifr_netmask;
+      ifp->int_netmask = *(struct sockaddr_in *)&ifr.ifr_netmask;
+
+      if_changes = 1;
+    }
+
+    if (!iface->cnf->ipv4_broadcast.v4.s_addr) {
+      /* Check broadcast address */
+      if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) {
+       olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
+       goto remove_interface;
+      }
 
-         if_changes = 1;
-       }
-      
-      if(!iface->cnf->ipv4_broadcast.v4.s_addr)
-       {
-         /* Check broadcast address */      
-         if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) 
-           {
-             olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
-             goto remove_interface;
-           }
-         
 #ifdef DEBUG
-         OLSR_PRINTF(3, "\tBroadcast address:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr));
+      OLSR_PRINTF(3, "\tBroadcast address:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr));
 #endif
-         
-         if(ifp->int_broadaddr.sin_addr.s_addr != ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr.s_addr)
-           {
-             /* New address */
-             OLSR_PRINTF(1, "IPv4 broadcast changed for %s\n", ifr.ifr_name);
-             OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_broadaddr.sin_addr));
-             OLSR_PRINTF(1, "\tNew:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr));
-             
-             ifp->int_broadaddr = *(struct sockaddr_in *)&ifr.ifr_broadaddr;
-             if_changes = 1;
-           }            
-       }
-    }
 
-  if(if_changes)
+      if (ifp->int_broadaddr.sin_addr.s_addr != ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr.s_addr) {
+       /* New address */
+       OLSR_PRINTF(1, "IPv4 broadcast changed for %s\n", ifr.ifr_name);
+       OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_broadaddr.sin_addr));
+       OLSR_PRINTF(1, "\tNew:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr));
+       
+       ifp->int_broadaddr = *(struct sockaddr_in *)&ifr.ifr_broadaddr;
+       if_changes = 1;
+      }
+    }
+  }
+  if (if_changes) {
     run_ifchg_cbs(ifp, IFCHG_IF_UPDATE);
-
+  }
   return if_changes;
 
 
@@ -412,49 +346,40 @@ chk_if_changed(struct olsr_if *iface)
   olsr_delete_link_entry_by_ip(&ifp->ip_addr);
 
   /*
-   *Call possible ifchange functions registered by plugins  
+   * Call possible ifchange functions registered by plugins
    */
   run_ifchg_cbs(ifp, IFCHG_IF_REMOVE);
-  
+
   /* Dequeue */
-  if(ifp == ifnet)
-    {
-      ifnet = ifp->int_next;
-    }
-  else
-    {
-      tmp_ifp = ifnet;
-      while(tmp_ifp->int_next != ifp)
-       {
-         tmp_ifp = tmp_ifp->int_next;
-       }
-      tmp_ifp->int_next = ifp->int_next;
+  if (ifp == ifnet) {
+    ifnet = ifp->int_next;
+  } else {
+    struct interface *tmp_ifp = ifnet;
+    while (tmp_ifp->int_next != ifp) {
+      tmp_ifp = tmp_ifp->int_next;
     }
-
+    tmp_ifp->int_next = ifp->int_next;
+  }
 
   /* Remove output buffer */
   net_remove_buffer(ifp);
 
   /* Check main addr */
-  if(ipequal(&olsr_cnf->main_addr, &ifp->ip_addr))
-    {
-      if(ifnet == NULL)
-       {
-         /* No more interfaces */
-         memset(&olsr_cnf->main_addr, 0, olsr_cnf->ipsize);
-         OLSR_PRINTF(1, "No more interfaces...\n");
-       }
-      else
-       {
-          struct ipaddr_str buf;
-         olsr_cnf->main_addr = ifnet->ip_addr;
-         OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
-         olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
-       }
+  if (ipequal(&olsr_cnf->main_addr, &ifp->ip_addr)) {
+    if (ifnet == NULL) {
+      /* No more interfaces */
+      memset(&olsr_cnf->main_addr, 0, olsr_cnf->ipsize);
+      OLSR_PRINTF(1, "No more interfaces...\n");
+    } else {
+      olsr_cnf->main_addr = ifnet->ip_addr;
+      olsr_ip_to_string(&buf, &olsr_cnf->main_addr);
+      OLSR_PRINTF(1, "New main address: %s\n", buf.buf);
+      olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", buf.buf);
     }
+  }
 
   /*
-   * Deregister functions for periodic message generation 
+   * Deregister functions for periodic message generation
    */
   olsr_stop_timer(ifp->hello_gen_timer);
   olsr_stop_timer(ifp->tc_gen_timer);
@@ -463,44 +388,42 @@ chk_if_changed(struct olsr_if *iface)
 
   iface->configured = 0;
   iface->interf = NULL;
+
   /* Close olsr socket */
   remove_olsr_socket(ifp->olsr_socket, &olsr_input, NULL);
   close(ifp->olsr_socket);
+  ifp->olsr_socket = -1;
 
   /* Free memory */
   free(ifp->int_name);
   free(ifp);
 
-  if((ifnet == NULL) && (!olsr_cnf->allow_no_interfaces))
-    {
-      OLSR_PRINTF(1, "No more active interfaces - exiting.\n");
-      olsr_syslog(OLSR_LOG_INFO, "No more active interfaces - exiting.\n");
-      olsr_cnf->exit_value = EXIT_FAILURE;
-      kill(getpid(), SIGINT);
-    }
-
+  if (ifnet == NULL && !olsr_cnf->allow_no_interfaces) {
+    OLSR_PRINTF(1, "No more active interfaces - exiting.\n");
+    olsr_syslog(OLSR_LOG_INFO, "No more active interfaces - exiting.\n");
+    olsr_cnf->exit_value = EXIT_FAILURE;
+    kill(getpid(), SIGINT);
+  }
   return 0;
-
 }
 
 /**
  * Initializes the special interface used in
  * host-client emulation
  */
-int add_hemu_if(struct olsr_if *iface)
+int add_hemu_if (struct olsr_if *iface)
 {
   struct interface *ifp;
-  union olsr_ip_addr null_addr;
   olsr_u32_t addr[4];
   struct ipaddr_str buf;
   size_t name_size;
 
-  if(!iface->host_emul)
+  if (!iface->host_emul)
     return -1;
 
-  ifp = olsr_malloc(sizeof (struct interface), "Interface update 2");
+  ifp = olsr_malloc(sizeof(struct interface), "Interface update 2");
 
-  memset(ifp, 0, sizeof (struct interface));
+  memset(ifp, 0, sizeof(struct interface));
 
   iface->configured = OLSR_TRUE;
   iface->interf = ifp;
@@ -521,13 +444,11 @@ int add_hemu_if(struct olsr_if *iface)
   ifp->int_next = ifnet;
   ifnet = ifp;
 
-  memset(&null_addr, 0, olsr_cnf->ipsize);
-  if(ipequal(&null_addr, &olsr_cnf->main_addr))
-    {
-      olsr_cnf->main_addr = iface->hemu_ip;
-      OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
-       olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
-    }
+  if (ipequal(&null_addr, &olsr_cnf->main_addr)) {
+    olsr_cnf->main_addr = iface->hemu_ip;
+    OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
+    olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
+  }
 
   ifp->int_mtu = OLSR_DEFAULT_MTU;
 
@@ -537,62 +458,52 @@ int add_hemu_if(struct olsr_if *iface)
   net_add_buffer(ifp);
 
 
-  if(olsr_cnf->ip_version == AF_INET)
-    {
-      struct sockaddr_in sin;
-
-      memset(&sin, 0, sizeof(sin));
-
-      sin.sin_family = AF_INET;
-      sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-      sin.sin_port = htons(10150);
+  if (olsr_cnf->ip_version == AF_INET) {
+    struct sockaddr_in sin;
  
-     /* IP version 4 */
-      ifp->ip_addr.v4 = iface->hemu_ip.v4;
-
-      memcpy(&ifp->int_addr.sin_addr, &iface->hemu_ip, olsr_cnf->ipsize);
-      
-      /*
-       *We create one socket for each interface and bind
-       *the socket to it. This to ensure that we can control
-       *on what interface the message is transmitted
-       */
-      
-      ifp->olsr_socket = gethemusocket(&sin);
-      
-      if (ifp->olsr_socket < 0)
-       {
-         fprintf(stderr, "Could not initialize socket... exiting!\n\n");
-         olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");
-         olsr_cnf->exit_value = EXIT_FAILURE;
-         kill(getpid(), SIGINT);
-       }
+    memset(&sin, 0, sizeof(sin));
 
+    sin.sin_family = AF_INET;
+    sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+    sin.sin_port = htons(10150);
+    /* IP version 4 */
+    ifp->ip_addr.v4 = iface->hemu_ip.v4;
+    memcpy(&ifp->int_addr.sin_addr, &iface->hemu_ip, olsr_cnf->ipsize);
+
+    /*
+     * We create one socket for each interface and bind
+     * the socket to it. This to ensure that we can control
+     * on what interface the message is transmitted
+     */
+
+    ifp->olsr_socket = gethemusocket(&sin);
+    if (ifp->olsr_socket < 0) {
+      fprintf(stderr, "Could not initialize socket... exiting!\n\n");
+      olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");
+      olsr_cnf->exit_value = EXIT_FAILURE;
+      kill(getpid(), SIGINT);
     }
-  else
-    {
-      /* IP version 6 */
-      memcpy(&ifp->ip_addr, &iface->hemu_ip, olsr_cnf->ipsize);
-
-#if 0      
-      /*
-       *We create one socket for each interface and bind
-       *the socket to it. This to ensure that we can control
-       *on what interface the message is transmitted
-       */
-      
-      ifp->olsr_socket = gethcsocket6(&addrsock6, BUFSPACE, ifp->int_name);
-      
-      join_mcast(ifp, ifp->olsr_socket);
-      
-      if (ifp->olsr_socket < 0)
-       {
-         fprintf(stderr, "Could not initialize socket... exiting!\n\n");
-         olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");
-         olsr_cnf->exit_value = EXIT_FAILURE;
-         kill(getpid(), SIGINT);
-       }
-      
+  } else {
+    /* IP version 6 */
+    memcpy(&ifp->ip_addr, &iface->hemu_ip, olsr_cnf->ipsize);
+
+#if 0
+    /*
+     * We create one socket for each interface and bind
+     * the socket to it. This to ensure that we can control
+     * on what interface the message is transmitted
+     */
+
+    ifp->olsr_socket = gethcsocket6(&addrsock6, BUFSPACE, ifp->int_name);
+    if (ifp->olsr_socket < 0)  {
+      fprintf(stderr, "Could not initialize socket... exiting!\n\n");
+      olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");
+      olsr_cnf->exit_value = EXIT_FAILURE;
+      kill(getpid(), SIGINT);
+    }
+    join_mcast(ifp, ifp->olsr_socket);
 #endif
     }
 
@@ -603,19 +514,17 @@ int add_hemu_if(struct olsr_if *iface)
   addr[2] = htonl(addr[2]);
   addr[3] = htonl(addr[3]);
 
-  if(send(ifp->olsr_socket, addr , olsr_cnf->ipsize, 0) != (int)olsr_cnf->ipsize)
-    {
-      fprintf(stderr, "Error sending IP!");
-    }  
-  
+  if (send(ifp->olsr_socket, addr , olsr_cnf->ipsize, 0) != (int)olsr_cnf->ipsize) {
+    fprintf(stderr, "Error sending IP: %m");
+  }
+
   /* Register socket */
   add_olsr_socket(ifp->olsr_socket, &olsr_input_hostemu, NULL, NULL, SP_PR_READ);
 
-
   /*
-   * Register functions for periodic message generation 
+   * Register functions for periodic message generation
    */
-  
+
   ifp->hello_gen_timer =
     olsr_start_timer(iface->cnf->hello_params.emission_interval * MSEC_PER_SEC,
                      HELLO_JITTER, OLSR_TIMER_PERIODIC,
@@ -636,9 +545,9 @@ int add_hemu_if(struct olsr_if *iface)
                      hna_gen_timer_cookie->ci_id);
 
   /* Recalculate max topology hold time */
-  if(olsr_cnf->max_tc_vtime < iface->cnf->tc_params.emission_interval)
+  if (olsr_cnf->max_tc_vtime < iface->cnf->tc_params.emission_interval) {
     olsr_cnf->max_tc_vtime = iface->cnf->tc_params.emission_interval;
-
+  }
   ifp->hello_etime = (olsr_reltime)(iface->cnf->hello_params.emission_interval * MSEC_PER_SEC);
   ifp->valtimes.hello = reltime_to_me(iface->cnf->hello_params.validity_time * MSEC_PER_SEC);
   ifp->valtimes.tc = reltime_to_me(iface->cnf->tc_params.validity_time * MSEC_PER_SEC);
@@ -652,13 +561,13 @@ static char basenamestr[32];
 static const char* if_basename(const char* name);
 static const char* if_basename(const char* name)
 {
-       char *p = strchr(name, ':');
-       if (NULL == p || p - name >= (int)(sizeof(basenamestr) / sizeof(basenamestr[0]) - 1)) {
-               return name;
-        }
-       memcpy(basenamestr, name, p - name);
-       basenamestr[p - name] = 0;
-       return basenamestr;
+  const char *p = strchr(name, ':');
+  if (NULL == p || p - name >= (int)(ARRAYSIZE(basenamestr) - 1)) {
+    return name;
+  }
+  memcpy(basenamestr, name, p - name);
+  basenamestr[p - name] = 0;
+  return basenamestr;
 }
 
 /**
@@ -674,168 +583,130 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__((unused)))
 {
   struct interface ifs, *ifp;
   struct ifreq ifr;
-  union olsr_ip_addr null_addr;
-  size_t name_size;
-#ifdef linux
-  int precedence = IPTOS_PREC(olsr_cnf->tos);
-  int tos_bits = IPTOS_TOS(olsr_cnf->tos);
-#endif
+  const char *ifr_basename;
 
-  if(iface->host_emul)
+  if (iface->host_emul) {
     return -1;
+  }
+  memset(&ifr, 0, sizeof(ifr));
+  memset(&ifs, 0, sizeof(ifs));
 
-  memset(&ifr, 0, sizeof(struct ifreq));
-  memset(&ifs, 0, sizeof(struct interface));
   strscpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name));
 
   OLSR_PRINTF(debuglvl, "Checking %s:\n", ifr.ifr_name);
 
   /* Get flags (and check if interface exists) */
-  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) 
-    {
-      OLSR_PRINTF(debuglvl, "\tNo such interface!\n");
-      return 0;
-    }
-
-  ifs.int_flags = ifr.ifr_flags;      
-
+  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) {
+    OLSR_PRINTF(debuglvl, "\tNo such interface!\n");
+    return 0;
+  }
 
-  if ((ifs.int_flags & IFF_UP) == 0)
-    {
-      OLSR_PRINTF(debuglvl, "\tInterface not up - skipping it...\n");
-      return 0;
-    }
+  ifs.int_flags = ifr.ifr_flags;
+  if ((ifs.int_flags & IFF_UP) == 0) {
+    OLSR_PRINTF(debuglvl, "\tInterface not up - skipping it...\n");
+    return 0;
+  }
 
   /* Check broadcast */
-  if ((olsr_cnf->ip_version == AF_INET) &&
-      !iface->cnf->ipv4_broadcast.v4.s_addr && /* Skip if fixed bcast */ 
-      (!(ifs.int_flags & IFF_BROADCAST))) 
-    {
-      OLSR_PRINTF(debuglvl, "\tNo broadcast - skipping\n");
-      return 0;
-    }
-
+  if (olsr_cnf->ip_version == AF_INET &&
+      !iface->cnf->ipv4_broadcast.v4.s_addr && /* Skip if fixed bcast */
+      (ifs.int_flags & IFF_BROADCAST) == 0) {
+    OLSR_PRINTF(debuglvl, "\tNo broadcast - skipping\n");
+    return 0;
+  }
 
-  if (ifs.int_flags & IFF_LOOPBACK)
-    {
-      OLSR_PRINTF(debuglvl, "\tThis is a loopback interface - skipping it...\n");
-      return 0;
-    }
+  if (ifs.int_flags & IFF_LOOPBACK) {
+    OLSR_PRINTF(debuglvl, "\tThis is a loopback interface - skipping it...\n");
+    return 0;
+  }
 
   ifs.is_hcif = OLSR_FALSE;
 
   /* trying to detect if interface is wireless. */
   ifs.is_wireless = check_wireless_interface(ifr.ifr_name);
+  OLSR_PRINTF(debuglvl, ifs.is_wireless ? "\tWireless interface detected\n" : "\tNot a wireless interface\n");
 
-  if(ifs.is_wireless)
-    OLSR_PRINTF(debuglvl, "\tWireless interface detected\n");
-  else
-    OLSR_PRINTF(debuglvl, "\tNot a wireless interface\n");
+  ifr_basename = if_basename(ifr.ifr_name);
 
-  
   /* IP version 6 */
-  if(olsr_cnf->ip_version == AF_INET6)
-    {
-      /* Get interface address */
-      struct ipaddr_str buf;
-      if(get_ipv6_address(ifr.ifr_name, &ifs.int6_addr, iface->cnf->ipv6_addrtype) <= 0)
-       {
-         if(iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL)
-           OLSR_PRINTF(debuglvl, "\tCould not find site-local IPv6 address for %s\n", ifr.ifr_name);
-         else
-           OLSR_PRINTF(debuglvl, "\tCould not find global IPv6 address for %s\n", ifr.ifr_name);
-         
-         return 0;
-       }
-      
-      OLSR_PRINTF(debuglvl, "\tAddress: %s\n", ip6_to_string(&buf, &ifs.int6_addr.sin6_addr));
-      
-      /* Multicast */
-      memset (&ifs.int6_multaddr, 0, sizeof (ifs.int6_multaddr));
-      ifs.int6_multaddr.sin6_family   = AF_INET6;
-      ifs.int6_multaddr.sin6_flowinfo = htonl(0);
-      ifs.int6_multaddr.sin6_scope_id = if_nametoindex(ifr.ifr_name);
-      ifs.int6_multaddr.sin6_port     = htons(OLSRPORT);
-      ifs.int6_multaddr.sin6_addr = (iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL) ? 
-       iface->cnf->ipv6_multi_site.v6 :
-       iface->cnf->ipv6_multi_glbl.v6;
-      
+  if (olsr_cnf->ip_version == AF_INET6) {
+    /* Get interface address */
+    struct ipaddr_str buf;
+    if (get_ipv6_address(ifr.ifr_name, &ifs.int6_addr, iface->cnf->ipv6_addrtype) <= 0) {
+      OLSR_PRINTF(debuglvl, "\tCould not find %s IPv6 address for %s\n", iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL ? "site-local" : "global", ifr.ifr_name);
+      return 0;
+    }
+
+    OLSR_PRINTF(debuglvl, "\tAddress: %s\n", ip6_to_string(&buf, &ifs.int6_addr.sin6_addr));
+
+    /* Multicast */
+    memset (&ifs.int6_multaddr, 0, sizeof(ifs.int6_multaddr));
+    ifs.int6_multaddr.sin6_family   = AF_INET6;
+    ifs.int6_multaddr.sin6_flowinfo = htonl(0);
+    ifs.int6_multaddr.sin6_scope_id = if_nametoindex(ifr.ifr_name);
+    ifs.int6_multaddr.sin6_port     = htons(OLSRPORT);
+    ifs.int6_multaddr.sin6_addr = iface->cnf->ipv6_addrtype == IPV6_ADDR_SITELOCAL
+        ? iface->cnf->ipv6_multi_site.v6
+        : iface->cnf->ipv6_multi_glbl.v6;
+
 #ifdef __MacOSX__
-      ifs.int6_multaddr.sin6_scope_id = 0;
+    ifs.int6_multaddr.sin6_scope_id = 0;
 #endif
 
-      OLSR_PRINTF(debuglvl, "\tMulticast: %s\n", ip6_to_string(&buf, &ifs.int6_multaddr.sin6_addr));
-      
+    OLSR_PRINTF(debuglvl, "\tMulticast: %s\n", ip6_to_string(&buf, &ifs.int6_multaddr.sin6_addr));  
+  } else {
+    /* IP version 4 */
+
+    /* Get interface address (IPv4)*/
+    if(ioctl(olsr_cnf->ioctl_s, SIOCGIFADDR, &ifr) < 0) {
+      OLSR_PRINTF(debuglvl, "\tCould not get address of interface - skipping it\n");
+      return 0;
     }
-  /* IP version 4 */
-  else
-    {
-      /* Get interface address (IPv4)*/
-      if(ioctl(olsr_cnf->ioctl_s, SIOCGIFADDR, &ifr) < 0) 
-       {
-         OLSR_PRINTF(debuglvl, "\tCould not get address of interface - skipping it\n");
-         return 0;
-       }
-      
-      ifs.int_addr = *(struct sockaddr_in *)&ifr.ifr_addr;
-      
-      /* Find netmask */
-      
-      if (ioctl(olsr_cnf->ioctl_s, SIOCGIFNETMASK, &ifr) < 0) 
-       {
-         olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get netmask)", ifr.ifr_name);
-         return 0;
-       }
-      
-      ifs.int_netmask = *(struct sockaddr_in *)&ifr.ifr_netmask;
-      
-      /* Find broadcast address */
-      if(iface->cnf->ipv4_broadcast.v4.s_addr)
-       {
-         /* Specified broadcast */
-         memcpy(&ifs.int_broadaddr.sin_addr.s_addr, 
-                &iface->cnf->ipv4_broadcast.v4, 
-                sizeof(olsr_u32_t));
-       }
-      else
-       {
-         /* Autodetect */
-         if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) 
-           {
-             olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
-             return 0;
-           }
-         
-         ifs.int_broadaddr = *(struct sockaddr_in *)&ifr.ifr_broadaddr;
-       }
-      
-      /* Deactivate IP spoof filter */
-      deactivate_spoof(if_basename(ifr.ifr_name), &ifs, olsr_cnf->ip_version);
-      
-      /* Disable ICMP redirects */
-      disable_redirects(if_basename(ifr.ifr_name), &ifs, olsr_cnf->ip_version);
-      
+
+    ifs.int_addr = *(struct sockaddr_in *)&ifr.ifr_addr;
+
+    /* Find netmask */
+    if (ioctl(olsr_cnf->ioctl_s, SIOCGIFNETMASK, &ifr) < 0) {
+      olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get netmask)", ifr.ifr_name);
+      return 0;
     }
-  
+    ifs.int_netmask = *(struct sockaddr_in *)&ifr.ifr_netmask;
+
+    /* Find broadcast address */
+    if (iface->cnf->ipv4_broadcast.v4.s_addr) {
+      /* Specified broadcast */
+      ifs.int_broadaddr.sin_addr = iface->cnf->ipv4_broadcast.v4;
+    } else {
+      /* Autodetect */
+      if (ioctl(olsr_cnf->ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) {
+       olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
+       return 0;
+      }
+       
+      ifs.int_broadaddr = *(struct sockaddr_in *)&ifr.ifr_broadaddr;
+    }
+
+    /* Deactivate IP spoof filter */
+    deactivate_spoof(ifr_basename, &ifs, olsr_cnf->ip_version);
+
+    /* Disable ICMP redirects */
+    disable_redirects(ifr_basename, &ifs, olsr_cnf->ip_version);
+  }
   
   /* Get interface index */
-  
   ifs.if_index = if_nametoindex(ifr.ifr_name);
   
   /* Set interface metric */
-  if(iface->cnf->weight.fixed)
-    ifs.int_metric = iface->cnf->weight.value;
-  else
-    ifs.int_metric = calculate_if_metric(ifr.ifr_name);
+  ifs.int_metric = iface->cnf->weight.fixed ? iface->cnf->weight.value : calculate_if_metric(ifr.ifr_name);
   OLSR_PRINTF(1, "\tMetric: %d\n", ifs.int_metric);
 
   /* Get MTU */
-  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFMTU, &ifr) < 0)
+  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFMTU, &ifr) < 0) {
     ifs.int_mtu = OLSR_DEFAULT_MTU;
-  else
+  } else {
     ifs.int_mtu = ifr.ifr_mtu;
-
-  ifs.int_mtu -= (olsr_cnf->ip_version == AF_INET6) ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;
+  }
+  ifs.int_mtu -= olsr_cnf->ip_version == AF_INET6 ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;
 
   ifs.ttl_index = -32; /* For the first 32 TC's, fish-eye is disabled */
 
@@ -847,103 +718,87 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__((unused)))
   olsr_syslog(OLSR_LOG_INFO, "Adding interface %s\n", iface->name);
   OLSR_PRINTF(1, "\tIndex %d\n", ifs.if_index);
 
-  if(olsr_cnf->ip_version == AF_INET)
-    {
-      struct ipaddr_str buf;
-      OLSR_PRINTF(1, "\tAddress:%s\n", ip4_to_string(&buf, ifs.int_addr.sin_addr));
-      OLSR_PRINTF(1, "\tNetmask:%s\n", ip4_to_string(&buf, ifs.int_netmask.sin_addr));
-      OLSR_PRINTF(1, "\tBroadcast address:%s\n", ip4_to_string(&buf, ifs.int_broadaddr.sin_addr));
-    }
-  else
-    {
-      struct ipaddr_str buf;
-      OLSR_PRINTF(1, "\tAddress: %s\n", ip6_to_string(&buf, &ifs.int6_addr.sin6_addr));
-      OLSR_PRINTF(1, "\tMulticast: %s\n", ip6_to_string(&buf, &ifs.int6_multaddr.sin6_addr));
-    }
+  if(olsr_cnf->ip_version == AF_INET) {
+    struct ipaddr_str buf;
+    OLSR_PRINTF(1, "\tAddress:%s\n", ip4_to_string(&buf, ifs.int_addr.sin_addr));
+    OLSR_PRINTF(1, "\tNetmask:%s\n", ip4_to_string(&buf, ifs.int_netmask.sin_addr));
+    OLSR_PRINTF(1, "\tBroadcast address:%s\n", ip4_to_string(&buf, ifs.int_broadaddr.sin_addr));
+  } else {
+    struct ipaddr_str buf;
+    OLSR_PRINTF(1, "\tAddress: %s\n", ip6_to_string(&buf, &ifs.int6_addr.sin6_addr));
+    OLSR_PRINTF(1, "\tMulticast: %s\n", ip6_to_string(&buf, &ifs.int6_multaddr.sin6_addr));
+  }
   
-  ifp = olsr_malloc(sizeof (struct interface), "Interface update 2");
+  ifp = olsr_malloc(sizeof(*ifp), "Interface update 2");
   
   iface->configured = 1;
   iface->interf = ifp;
 
-  /* XXX bad code */
-  memcpy(ifp, &ifs, sizeof(struct interface));
+  //memcpy(ifp, &ifs, sizeof(*ifp));
+  *ifp = ifs;
   
-  ifp->immediate_send_tc = (iface->cnf->tc_params.emission_interval < iface->cnf->hello_params.emission_interval);
-
-  name_size = strlen(if_basename(ifr.ifr_name)) + 1;
+  ifp->immediate_send_tc = iface->cnf->tc_params.emission_interval < iface->cnf->hello_params.emission_interval;
+  ifp->int_name = olsr_malloc(strlen(ifr_basename) + 1, "Interface update 3");
+  strcpy(ifp->int_name, ifr_basename);
   ifp->gen_properties = NULL;
-  ifp->int_name = olsr_malloc(name_size, "Interface update 3");
-  strscpy(ifp->int_name, if_basename(ifr.ifr_name), name_size);
   ifp->int_next = ifnet;
   ifnet = ifp;
 
-  if(olsr_cnf->ip_version == AF_INET)
-    {
-      /* IP version 4 */
-      ifp->ip_addr.v4 = ifp->int_addr.sin_addr;
-      /*
-       *We create one socket for each interface and bind
-       *the socket to it. This to ensure that we can control
-       *on what interface the message is transmitted
-       */
-      
-      ifp->olsr_socket = getsocket(BUFSPACE, ifp->int_name);
-      
-      if (ifp->olsr_socket < 0)
-       {
-         fprintf(stderr, "Could not initialize socket... exiting!\n\n");
-         olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");
-         olsr_cnf->exit_value = EXIT_FAILURE;
-         kill(getpid(), SIGINT);
-       }
-
+  if (olsr_cnf->ip_version == AF_INET) {
+    /* IP version 4 */
+    ifp->ip_addr.v4 = ifp->int_addr.sin_addr;
+    /*
+     * We create one socket for each interface and bind
+     * the socket to it. This to ensure that we can control
+     * on what interface the message is transmitted
+     */
+    ifp->olsr_socket = getsocket(BUFSPACE, ifp->int_name);
+    if (ifp->olsr_socket < 0) {
+      fprintf(stderr, "Could not initialize socket... exiting!\n\n");
+      olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");
+      olsr_cnf->exit_value = EXIT_FAILURE;
+      kill(getpid(), SIGINT);
     }
-  else
-    {
-      /* IP version 6 */
-      ifp->ip_addr.v6 =  ifp->int6_addr.sin6_addr;
-      
-      /*
-       *We create one socket for each interface and bind
-       *the socket to it. This to ensure that we can control
-       *on what interface the message is transmitted
-       */
-      
-      ifp->olsr_socket = getsocket6(BUFSPACE, ifp->int_name);
-      
-      join_mcast(ifp, ifp->olsr_socket);
-      
-      if (ifp->olsr_socket < 0)
-       {
-         fprintf(stderr, "Could not initialize socket... exiting!\n\n");
-         olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");
-         olsr_cnf->exit_value = EXIT_FAILURE;
-         kill(getpid(), SIGINT);
-       }
-      
+  } else {
+    /* IP version 6 */
+    ifp->ip_addr.v6 =  ifp->int6_addr.sin6_addr;
+
+    /*
+     * We create one socket for each interface and bind
+     * the socket to it. This to ensure that we can control
+     * on what interface the message is transmitted
+     */
+    ifp->olsr_socket = getsocket6(BUFSPACE, ifp->int_name);
+    if (ifp->olsr_socket < 0)  {
+      fprintf(stderr, "Could not initialize socket... exiting!\n\n");
+      olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");
+      olsr_cnf->exit_value = EXIT_FAILURE;
+      kill(getpid(), SIGINT);
     }
+    join_mcast(ifp, ifp->olsr_socket);
+  }
 
   set_buffer_timer(ifp);
 
   /* Register socket */
   add_olsr_socket(ifp->olsr_socket, &olsr_input, NULL, NULL, SP_PR_READ);
   
-#ifdef linux 
-  /* Set TOS */
-  
-  if (setsockopt(ifp->olsr_socket, SOL_SOCKET, SO_PRIORITY, (char*)&precedence, sizeof(precedence)) < 0)
-    {
+#ifdef linux
+  {
+    /* Set TOS */
+    int data = IPTOS_PREC(olsr_cnf->tos);
+    if (setsockopt(ifp->olsr_socket, SOL_SOCKET, SO_PRIORITY, (char*)&data, sizeof(data)) < 0) {
       perror("setsockopt(SO_PRIORITY)");
       olsr_syslog(OLSR_LOG_ERR, "OLSRD: setsockopt(SO_PRIORITY) error %m");
     }
-  if (setsockopt(ifp->olsr_socket, SOL_IP, IP_TOS, (char*)&tos_bits, sizeof(tos_bits)) < 0)    
-    {
+    data = IPTOS_TOS(olsr_cnf->tos);
+    if (setsockopt(ifp->olsr_socket, SOL_IP, IP_TOS, (char*)&data, sizeof(data)) < 0) {
       perror("setsockopt(IP_TOS)");
       olsr_syslog(OLSR_LOG_ERR, "setsockopt(IP_TOS) error %m");
     }
+  }
 #endif
-  
+
   /*
    *Initialize sequencenumber as a random 16bit value
    */
@@ -952,17 +807,15 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__((unused)))
   /*
    * Set main address if this is the only interface
    */
-  memset(&null_addr, 0, olsr_cnf->ipsize);
-  if(ipequal(&null_addr, &olsr_cnf->main_addr))
-    {
-      struct ipaddr_str buf;
-      olsr_cnf->main_addr = ifp->ip_addr;
-      OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
-      olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
-    }
-  
+  if (ipequal(&null_addr, &olsr_cnf->main_addr)) {
+    struct ipaddr_str buf;
+    olsr_cnf->main_addr = ifp->ip_addr;
+    OLSR_PRINTF(1, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
+    olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
+  }
+
   /*
-   * Register functions for periodic message generation 
+   * Register functions for periodic message generation
    */
   ifp->hello_gen_timer =
     olsr_start_timer(iface->cnf->hello_params.emission_interval * MSEC_PER_SEC,
@@ -984,7 +837,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__((unused)))
                      hna_gen_timer_cookie->ci_id);
 
   /* Recalculate max topology hold time */
-  if(olsr_cnf->max_tc_vtime < iface->cnf->tc_params.emission_interval) {
+  if (olsr_cnf->max_tc_vtime < iface->cnf->tc_params.emission_interval) {
     olsr_cnf->max_tc_vtime = iface->cnf->tc_params.emission_interval;
   }
   ifp->hello_etime = (olsr_reltime)(iface->cnf->hello_params.emission_interval * MSEC_PER_SEC);
@@ -993,9 +846,8 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__((unused)))
   ifp->valtimes.mid = reltime_to_me(iface->cnf->mid_params.validity_time * MSEC_PER_SEC);
   ifp->valtimes.hna = reltime_to_me(iface->cnf->hna_params.validity_time * MSEC_PER_SEC);
 
-
   /*
-   *Call possible ifchange functions registered by plugins  
+   * Call possible ifchange functions registered by plugins
    */
   run_ifchg_cbs(ifp, IFCHG_IF_ADD);