Update ifchange interface so it can handle ifup/ifdown events for non-olsr interfaces
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Fri, 5 Feb 2010 14:22:07 +0000 (15:22 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Fri, 5 Feb 2010 14:22:07 +0000 (15:22 +0100)
lib/bmf/src/Bmf.c
lib/bmf/src/Bmf.h
src/interfaces.c
src/interfaces.h
src/linux/kernel_routes.c
src/unix/ifnet.c
src/win32/ifnet.c

index ac89b42..c000da7 100644 (file)
@@ -1149,16 +1149,22 @@ BmfRun(void *useless __attribute__ ((unused)))
  * Function   : InterfaceChange
  * Description: Callback function passed to OLSRD for it to call whenever a
  *              network interface has been added, removed or updated
- * Input      : interf - the network interface to deal with
+ * Input      : if_index - interface index
+ *              interf - the network interface to deal with, might be NULL
+ *                 if interface is not an OLSR interface (tunl0 for example)
  *              action - indicates if the specified network interface was
  *                added, removed or updated.
  * Output     : none
- * Return     : always 0
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int
-InterfaceChange(struct interface *interf, enum olsr_ifchg_flag action)
+void
+InterfaceChange(int if_index  __attribute__ ((unused)), struct interface *interf, enum olsr_ifchg_flag action)
 {
+  if (interf == NULL) {
+    /* we only care for OLSR interfaces */
+    return;
+  }
+
   switch (action) {
   case (IFCHG_IF_ADD):
     AddInterface(interf);
@@ -1184,8 +1190,6 @@ InterfaceChange(struct interface *interf, enum olsr_ifchg_flag action)
     olsr_printf(1, "%s: interface %s: error - unknown action (%d)\n", PLUGIN_NAME, interf->int_name, action);
     break;
   }
-
-  return 0;
 }                               /* InterfaceChange */
 
 /* -------------------------------------------------------------------------
index f57fb4d..d291128 100644 (file)
@@ -63,7 +63,7 @@ extern int BroadcastRetransmitCount;
 
 void BmfPError(const char *format, ...) __attribute__ ((format(printf, 1, 2)));
 union olsr_ip_addr *MainAddressOf(union olsr_ip_addr *ip);
-int InterfaceChange(struct interface *interf, enum olsr_ifchg_flag action);
+void InterfaceChange(int if_index, struct interface *interf, enum olsr_ifchg_flag action);
 int SetFanOutLimit(const char *value, void *data, set_plugin_parameter_addon addon);
 int InitBmf(struct interface *skipThisIntf);
 void CloseBmf(void);
index d5c855c..9fd7954 100644 (file)
@@ -63,7 +63,7 @@ struct interface *ifnet;
 
 /* Ifchange functions */
 struct ifchgf {
-  int (*function) (struct interface *, enum olsr_ifchg_flag);
+  void (*function) (int if_index, struct interface *, enum olsr_ifchg_flag);
   struct ifchgf *next;
 };
 
@@ -120,12 +120,12 @@ olsr_init_interfacedb(void)
 }
 
 void
-olsr_trigger_ifchange(struct interface *ifp, enum olsr_ifchg_flag flag)
+olsr_trigger_ifchange(int if_index, struct interface *ifp, enum olsr_ifchg_flag flag)
 {
   struct ifchgf *tmp_ifchgf_list = ifchgf_list;
 
   while (tmp_ifchgf_list != NULL) {
-    tmp_ifchgf_list->function(ifp, flag);
+    tmp_ifchgf_list->function(if_index, ifp, flag);
     tmp_ifchgf_list = tmp_ifchgf_list->next;
   }
 }
@@ -322,7 +322,7 @@ olsr_create_olsrif(const char *name, int hemu)
  *@return
  */
 int
-olsr_add_ifchange_handler(int (*f) (struct interface *, enum olsr_ifchg_flag))
+olsr_add_ifchange_handler(void (*f) (int if_index, struct interface *, enum olsr_ifchg_flag))
 {
 
   struct ifchgf *new_ifchgf;
@@ -341,7 +341,7 @@ olsr_add_ifchange_handler(int (*f) (struct interface *, enum olsr_ifchg_flag))
  * Remove an ifchange function
  */
 int
-olsr_remove_ifchange_handler(int (*f) (struct interface *, enum olsr_ifchg_flag))
+olsr_remove_ifchange_handler(void (*f) (int if_index, struct interface *, enum olsr_ifchg_flag))
 {
   struct ifchgf *tmp_ifchgf, *prev;
 
@@ -381,7 +381,7 @@ olsr_remove_interface(struct olsr_if * iface)
   /*
    *Call possible ifchange functions registered by plugins
    */
-  olsr_trigger_ifchange(ifp, IFCHG_IF_REMOVE);
+  olsr_trigger_ifchange(ifp->if_index, ifp, IFCHG_IF_REMOVE);
 
   /* cleanup routes over this interface */
   olsr_delete_interface_routes(ifp->if_index);
index 0eed0c1..b257ca3 100644 (file)
@@ -200,7 +200,7 @@ extern struct interface *ifnet;
 int olsr_init_interfacedb(void);
 void olsr_delete_interfaces(void);
 
-void olsr_trigger_ifchange(struct interface *, enum olsr_ifchg_flag);
+void olsr_trigger_ifchange(int if_index, struct interface *, enum olsr_ifchg_flag);
 
 struct interface *if_ifwithsock(int);
 
@@ -215,9 +215,8 @@ struct interface *if_ifwithindex(const int if_index);
 
 struct olsr_if *olsr_create_olsrif(const char *name, int hemu);
 
-int olsr_add_ifchange_handler(int (*f) (struct interface *, enum olsr_ifchg_flag));
-
-int olsr_remove_ifchange_handler(int (*f) (struct interface *, enum olsr_ifchg_flag));
+int olsr_add_ifchange_handler(void (*f) (int if_index, struct interface *, enum olsr_ifchg_flag));
+int olsr_remove_ifchange_handler(void (*f) (int if_index, struct interface *, enum olsr_ifchg_flag));
 
 void olsr_remove_interface(struct olsr_if *);
 
index 0864b91..e8e27b4 100644 (file)
@@ -119,7 +119,9 @@ static void netlink_process_link(struct nlmsghdr *h)
 {
   struct ifinfomsg *ifi = (struct ifinfomsg *) NLMSG_DATA(h);
   struct interface *iface;
+  struct olsr_if *oif;
 
+#if 0
   /*monitor tunl0 and olsrtunl*/
   if (olsr_cnf->smart_gw_active) {
     if (ifi->ifi_index==olsr_cnf->ipip_if_index) {
@@ -153,21 +155,30 @@ static void netlink_process_link(struct nlmsghdr *h)
       }
     }
   }
+#endif
 
   iface = if_ifwithindex(ifi->ifi_index);
+  oif = NULL;
   if (iface == NULL && (ifi->ifi_flags & IFF_UP) != 0) {
     char namebuffer[IF_NAMESIZE];
-    struct olsr_if *oif;
 
     if (if_indextoname(ifi->ifi_index, namebuffer)) {
       if ((oif = olsrif_ifwithname(namebuffer)) != NULL) {
+        /* try to take interface up, will trigger ifchange */
         chk_if_up(oif, 3);
       }
     }
   }
   else if (iface != NULL && (ifi->ifi_flags & IFF_UP) == 0) {
+    /* try to take interface down, will trigger ifchange */
     olsr_remove_interface(iface->olsr_if);
   }
+
+  if (iface == NULL && oif == NULL) {
+    /* this is not an OLSR interface */
+    olsr_trigger_ifchange(ifi->ifi_index, NULL,
+        (ifi->ifi_flags & IFF_UP) == 0 ? IFCHG_IF_REMOVE : IFCHG_IF_ADD);
+  }
 }
 
 void rtnetlink_read(int sock)
index bd50ab3..cdfb7e5 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);
 
-      olsr_trigger_ifchange(ifp, IFCHG_IF_UPDATE);
+      olsr_trigger_ifchange(ifp->if_index, ifp, IFCHG_IF_UPDATE);
 
       return 1;
     }
@@ -352,7 +352,7 @@ chk_if_changed(struct olsr_if *iface)
   }
 
   if (if_changes)
-    olsr_trigger_ifchange(ifp, IFCHG_IF_UPDATE);
+    olsr_trigger_ifchange(ifp->if_index, ifp, IFCHG_IF_UPDATE);
 
   return if_changes;
 
@@ -841,7 +841,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
   /*
    *Call possible ifchange functions registered by plugins
    */
-  olsr_trigger_ifchange(ifp, IFCHG_IF_ADD);
+  olsr_trigger_ifchange(ifp->if_index, ifp, IFCHG_IF_ADD);
 
   return 1;
 }
index fef1b83..6111d18 100644 (file)
@@ -755,7 +755,7 @@ chk_if_changed(struct olsr_if *IntConf)
     OLSR_PRINTF(3, "\tNo broadcast address change.\n");
 
   if (Res != 0)
-    olsr_trigger_ifchange(Int, IFCHG_IF_UPDATE);
+    olsr_trigger_ifchange(Int->if_index, Int, IFCHG_IF_UPDATE);
 
   return Res;
 }
@@ -906,7 +906,7 @@ chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__ ((unused)))
 
   New->mode = IntConf->cnf->mode;
 
-  olsr_trigger_ifchange(New, IFCHG_IF_ADD);
+  olsr_trigger_ifchange(New->if_index, New, IFCHG_IF_ADD);
 
   return 1;
 }