Interface db cleanup
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Wed, 3 Feb 2010 08:33:50 +0000 (09:33 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Wed, 3 Feb 2010 08:33:50 +0000 (09:33 +0100)
lib/bmf/src/olsrd_plugin.c
src/ifnet.h
src/interfaces.c
src/interfaces.h
src/linux/kernel_routes.c
src/main.c
src/unix/ifnet.c
src/win32/ifnet.c

index bbd5ad0..e943b36 100644 (file)
@@ -97,7 +97,7 @@ olsrd_plugin_init(void)
   InitPacketHistory();
 
   /* Register ifchange function */
-  add_ifchgf(&InterfaceChange);
+  olsr_add_ifchange_handler(&InterfaceChange);
 
   /* Register the duplicate registration pruning process */
   olsr_start_timer(3 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &PrunePacketHistory, NULL, 0);
index ea60090..b4e0b99 100644 (file)
@@ -60,8 +60,6 @@ void check_interface_updates(void *);
 
 int chk_if_changed(struct olsr_if *);
 
-void RemoveInterface(struct olsr_if *, bool);
-
 int chk_if_up(struct olsr_if *, int);
 
 int add_hemu_if(struct olsr_if *);
index 94a75fe..db82301 100644 (file)
 #include "olsr.h"
 #include "net_olsr.h"
 #include "ipcalc.h"
+#include "log.h"
+#include "parser.h"
+#include "socket_parser.h"
+
+#include <signal.h>
+#include <sys/types.h>
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <unistd.h>
 
 /* The interface linked-list */
 struct interface *ifnet;
@@ -73,7 +86,7 @@ struct olsr_cookie_info *hna_gen_timer_cookie = NULL;
  *@return the number of interfaces configured
  */
 int
-ifinit(void)
+olsr_init_interfacedb(void)
 {
   struct olsr_if *tmp_if;
 
@@ -109,7 +122,7 @@ ifinit(void)
 }
 
 void
-run_ifchg_cbs(struct interface *ifp, int flag)
+olsr_trigger_ifchange(struct interface *ifp, int flag)
 {
   struct ifchgf *tmp_ifchgf_list = ifchgf_list;
 
@@ -244,7 +257,7 @@ if_ifwithindex_name(const int if_index)
  *@return nada
  */
 struct olsr_if *
-queue_if(const char *name, int hemu)
+olsr_create_olsrif(const char *name, int hemu)
 {
   struct olsr_if *interf_n = olsr_cnf->interfaces;
   size_t name_size;
@@ -289,7 +302,7 @@ queue_if(const char *name, int hemu)
  *@return
  */
 int
-add_ifchgf(int (*f) (struct interface *, int))
+olsr_add_ifchange_handler(int (*f) (struct interface *, int))
 {
 
   struct ifchgf *new_ifchgf;
@@ -308,7 +321,7 @@ add_ifchgf(int (*f) (struct interface *, int))
  * Remove an ifchange function
  */
 int
-del_ifchgf(int (*f) (struct interface *, int))
+olsr_remove_ifchange_handler(int (*f) (struct interface *, int))
 {
   struct ifchgf *tmp_ifchgf, *prev;
 
@@ -334,6 +347,94 @@ del_ifchgf(int (*f) (struct interface *, int))
   return 0;
 }
 
+void
+olsr_remove_interface(struct olsr_if * iface, bool went_down)
+{
+  struct interface *ifp, *tmp_ifp;
+  struct rt_entry *rt;
+  ifp = iface->interf;
+
+  OLSR_PRINTF(1, "Removing interface %s\n", iface->name);
+  olsr_syslog(OLSR_LOG_INFO, "Removing interface %s\n", iface->name);
+
+  olsr_delete_link_entry_by_ip(&ifp->ip_addr);
+
+  /*
+   *Call possible ifchange functions registered by plugins
+   */
+  olsr_trigger_ifchange(ifp, IFCHG_IF_REMOVE);
+
+  /*remove all routes*/
+  if (went_down) {
+    OLSR_FOR_ALL_RT_ENTRIES(rt) {
+      if (rt->rt_nexthop.iif_index == ifp->if_index) {
+        //marks route as unexisting in kernel, do this better !?
+        rt->rt_nexthop.iif_index=-1;
+      }
+    }
+    OLSR_FOR_ALL_RT_ENTRIES_END(rt);
+  }
+
+  /* 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;
+  }
+
+  /* Remove output buffer */
+  net_remove_buffer(ifp);
+
+  /* Check main addr */
+  /* deactivated to prevent change of originator IP */
+#if 0
+  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));
+    }
+  }
+#endif
+  /*
+   * Deregister functions for periodic message generation
+   */
+  olsr_stop_timer(ifp->hello_gen_timer);
+  olsr_stop_timer(ifp->tc_gen_timer);
+  olsr_stop_timer(ifp->mid_gen_timer);
+  olsr_stop_timer(ifp->hna_gen_timer);
+
+  iface->configured = 0;
+  iface->interf = NULL;
+  /* Close olsr socket */
+  close(ifp->olsr_socket);
+  remove_olsr_socket(ifp->olsr_socket, &olsr_input);
+
+  /* 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;
+#ifndef win32
+    kill(getpid(), SIGINT);
+#else
+    CallSignalHandler();
+#endif
+  }
+}
+
 /*
  * Local Variables:
  * c-basic-offset: 2
index 8ab57fa..765e8d6 100644 (file)
@@ -185,10 +185,10 @@ struct interface {
 /* The interface linked-list */
 extern struct interface *ifnet;
 
-int ifinit(void);
+int olsr_init_interfacedb(void);
 void olsr_delete_interfaces(void);
 
-void run_ifchg_cbs(struct interface *, int);
+void olsr_trigger_ifchange(struct interface *, int);
 
 struct interface *if_ifwithsock(int);
 
@@ -200,11 +200,13 @@ const char *if_ifwithindex_name(const int if_index);
 
 struct interface *if_ifwithindex(const int if_index);
 
-struct olsr_if *queue_if(const char *, int);
+struct olsr_if *olsr_create_olsrif(const char *name, int hemu);
 
-int add_ifchgf(int (*f) (struct interface *, int));
+int olsr_add_ifchange_handler(int (*f) (struct interface *, int));
 
-int del_ifchgf(int (*f) (struct interface *, int));
+int olsr_remove_ifchange_handler(int (*f) (struct interface *, int));
+
+void olsr_remove_interface(struct olsr_if *, bool);
 
 extern struct olsr_cookie_info *interface_poll_timer_cookie;
 extern struct olsr_cookie_info *hello_gen_timer_cookie;
index d517fc6..b4efc1a 100644 (file)
@@ -174,7 +174,7 @@ static void netlink_process_link(struct nlmsghdr *h)
   for (tmp_if = olsr_cnf->interfaces; tmp_if != NULL; tmp_if = tmp_if->next) {
     if (tmp_if->interf==iface) {
       OLSR_PRINTF(1,"-> removing %s from olsr config!\n", iface->int_name);
-      RemoveInterface(tmp_if,true);
+      olsr_remove_interface(tmp_if,true);
       break;
     }
   }
index 5f6ef6d..9a42fc4 100644 (file)
@@ -443,7 +443,7 @@ int main(int argc, char *argv[]) {
   init_net();
 
   /* Initializing networkinterfaces */
-  if (!ifinit()) {
+  if (!olsr_init_interfacedb()) {
     if (olsr_cnf->allow_no_interfaces) {
       fprintf(
           stderr,
@@ -1008,12 +1008,12 @@ static int olsr_process_arguments(int argc, char *argv[],
         olsr_exit(__func__, EXIT_FAILURE);
       }
       printf("Queuing if %s\n", *argv);
-      queue_if(*argv, false);
+      olsr_create_olsrif(*argv, false);
 
       while ((argc - 1) && (argv[1][0] != '-')) {
         NEXT_ARG;
         printf("Queuing if %s\n", *argv);
-        queue_if(*argv, false);
+        olsr_create_olsrif(*argv, false);
       }
 
       continue;
@@ -1133,7 +1133,7 @@ static int olsr_process_arguments(int argc, char *argv[],
       }
       /* Add hemu interface */
 
-      ifa = queue_if("hcif01", true);
+      ifa = olsr_create_olsrif("hcif01", true);
 
       if (!ifa)
         continue;
index 1da9c74..6891ab2 100644 (file)
@@ -266,7 +266,7 @@ chk_if_changed(struct olsr_if *iface)
       memcpy(&ifp->int6_addr.sin6_addr, &tmp_saddr6.sin6_addr, olsr_cnf->ipsize);
       memcpy(&ifp->ip_addr, &tmp_saddr6.sin6_addr, olsr_cnf->ipsize);
 
-      run_ifchg_cbs(ifp, IFCHG_IF_UPDATE);
+      olsr_trigger_ifchange(ifp, IFCHG_IF_UPDATE);
 
       return 1;
     }
@@ -352,102 +352,17 @@ chk_if_changed(struct olsr_if *iface)
   }
 
   if (if_changes)
-    run_ifchg_cbs(ifp, IFCHG_IF_UPDATE);
+    olsr_trigger_ifchange(ifp, IFCHG_IF_UPDATE);
 
   return if_changes;
 
 remove_interface:
 
-RemoveInterface(iface, false);
+olsr_remove_interface(iface, false);
 
 return 0;
 }
 
-/*should move to interfaces.c*/
-void 
-RemoveInterface(struct olsr_if * iface, bool went_down)
-{
-  struct interface *ifp, *tmp_ifp;
-  struct rt_entry *rt;
-  ifp = iface->interf;
-
-  OLSR_PRINTF(1, "Removing interface %s\n", iface->name);
-  olsr_syslog(OLSR_LOG_INFO, "Removing interface %s\n", iface->name);
-
-  olsr_delete_link_entry_by_ip(&ifp->ip_addr);
-
-  /*
-   *Call possible ifchange functions registered by plugins
-   */
-  run_ifchg_cbs(ifp, IFCHG_IF_REMOVE);
-
-  /*remove all routes*/
-    if (went_down) {
-    OLSR_FOR_ALL_RT_ENTRIES(rt) {
-      if (rt->rt_nexthop.iif_index == ifp->if_index) {
-       rt->rt_nexthop.iif_index=-1;//marks route as unexisting in kernel, do this better !?
-      }
-    }
-    OLSR_FOR_ALL_RT_ENTRIES_END(rt);
-  }
-
-  /* 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;
-  }
-
-  /* Remove output buffer */
-  net_remove_buffer(ifp);
-
-  /* Check main addr */
-  /* deactivated to prevent change of originator IP */
-#if 0
-  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));
-    }
-  }
-#endif
-  /*
-   * Deregister functions for periodic message generation
-   */
-  olsr_stop_timer(ifp->hello_gen_timer);
-  olsr_stop_timer(ifp->tc_gen_timer);
-  olsr_stop_timer(ifp->mid_gen_timer);
-  olsr_stop_timer(ifp->hna_gen_timer);
-
-  iface->configured = 0;
-  iface->interf = NULL;
-  /* Close olsr socket */
-  close(ifp->olsr_socket);
-  remove_olsr_socket(ifp->olsr_socket, &olsr_input);
-
-  /* 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);
-  }
-
-}
-
 /**
  * Initializes the special interface used in
  * host-client emulation
@@ -921,7 +836,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
   /*
    *Call possible ifchange functions registered by plugins
    */
-  run_ifchg_cbs(ifp, IFCHG_IF_ADD);
+  olsr_trigger_ifchange(ifp, IFCHG_IF_ADD);
 
   return 1;
 }
index 8abb425..d4a311d 100644 (file)
@@ -488,68 +488,6 @@ ListInterfaces(void)
   }
 }
 
-void
-RemoveInterface(struct olsr_if *IntConf, bool went_down)
-{
-  struct interface *Int, *Prev;
-
-  OLSR_PRINTF(1, "Removing interface %s.\n", IntConf->name);
-
-  Int = IntConf->interf;
-
-  run_ifchg_cbs(Int, IFCHG_IF_ADD);
-
-  /*remove all routes*/
-  if (went_down) OLSR_PRINTF(1,"Hint: ifdown handling unimplemented");
-
-  if (Int == ifnet)
-    ifnet = Int->int_next;
-
-  else {
-    for (Prev = ifnet; Prev->int_next != Int; Prev = Prev->int_next);
-
-    Prev->int_next = Int->int_next;
-  }
-
-  if (ipequal(&olsr_cnf->main_addr, &Int->ip_addr)) {
-    if (ifnet == NULL) {
-      memset(&olsr_cnf->main_addr, 0, olsr_cnf->ipsize);
-      OLSR_PRINTF(1, "Removed last interface. Cleared main address.\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));
-    }
-  }
-
-  /*
-   * Deregister functions for periodic message generation
-   */
-  olsr_stop_timer(Int->hello_gen_timer);
-  olsr_stop_timer(Int->tc_gen_timer);
-  olsr_stop_timer(Int->mid_gen_timer);
-  olsr_stop_timer(Int->hna_gen_timer);
-
-  net_remove_buffer(Int);
-
-  IntConf->configured = 0;
-  IntConf->interf = NULL;
-
-  closesocket(Int->olsr_socket);
-  remove_olsr_socket(Int->olsr_socket, &olsr_input);
-
-  free(Int->int_name);
-  free(Int);
-
-  if (ifnet == NULL && !olsr_cnf->allow_no_interfaces) {
-    OLSR_PRINTF(1, "No more active interfaces - exiting.\n");
-    olsr_cnf->exit_value = EXIT_FAILURE;
-    CallSignalHandler();
-  }
-}
-
 int
 add_hemu_if(struct olsr_if *iface)
 {
@@ -714,7 +652,7 @@ chk_if_changed(struct olsr_if *IntConf)
   Int = IntConf->interf;
 
   if (GetIntInfo(&Info, IntConf->name) < 0) {
-    RemoveInterface(IntConf,false);
+    olsr_remove_interface(IntConf,false);
     return 1;
   }
 
@@ -831,7 +769,7 @@ chk_if_changed(struct olsr_if *IntConf)
     OLSR_PRINTF(3, "\tNo broadcast address change.\n");
 
   if (Res != 0)
-    run_ifchg_cbs(Int, IFCHG_IF_UPDATE);
+    olsr_trigger_ifchange(Int, IFCHG_IF_UPDATE);
 
   return Res;
 }
@@ -979,7 +917,7 @@ chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__ ((unused)))
 
   New->mode = IntConf->cnf->mode;
 
-  run_ifchg_cbs(New, IFCHG_IF_ADD);
+  olsr_trigger_ifchange(New, IFCHG_IF_ADD);
 
   return 1;
 }