provide olsr_if pointer in interface
authorHenning Rogge <hrogge@googlemail.com>
Wed, 3 Feb 2010 19:12:22 +0000 (20:12 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Wed, 3 Feb 2010 19:12:22 +0000 (20:12 +0100)
fix some smaller compile bugs for BSD and WIN32

src/interfaces.c
src/interfaces.h
src/linux/kernel_routes.c
src/main.c
src/olsr_cfg.h
src/olsr_niit.c
src/olsr_niit.h
src/unix/ifnet.c
src/win32/ifnet.c

index db82301..acd2969 100644 (file)
@@ -39,6 +39,9 @@
  *
  */
 
+#include <signal.h>
+#include <unistd.h>
+
 #include "defs.h"
 #include "interfaces.h"
 #include "ifnet.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>
+#ifdef WIN32
+#include <winbase.h>
+#define close(x) closesocket(x)
+int __stdcall SignalHandler(unsigned long signo);
+
+static unsigned long __stdcall
+SignalHandlerWrapper(void *Dummy __attribute__ ((unused)))
+{
+  SignalHandler(0);
+  return 0;
+}
+
+static void
+CallSignalHandler(void)
+{
+  unsigned long ThreadId;
+
+  CreateThread(NULL, 0, SignalHandlerWrapper, NULL, 0, &ThreadId);
+}
+
+
+#endif
 
 /* The interface linked-list */
 struct interface *ifnet;
@@ -427,7 +443,7 @@ olsr_remove_interface(struct olsr_if * iface, bool went_down)
     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
+#ifndef WIN32
     kill(getpid(), SIGINT);
 #else
     CallSignalHandler();
index 765e8d6..969b973 100644 (file)
@@ -153,24 +153,34 @@ struct interface {
 
 /* Struct used to store original redirect/ingress setting */
   struct nic_state {
-    char redirect;                     /* The original state of icmp redirect */
-    char spoof;                        /* The original state of the IP spoof filter */
+    /* The original state of icmp redirect */
+    char redirect;
+
+    /* The original state of the IP spoof filter */
+    char spoof;
   } nic_state;
 #endif
 
   olsr_reltime hello_etime;
   struct vtimes valtimes;
 
-  uint32_t fwdtimer;                    /* Timeout for OLSR forwarding on this if */
+  /* Timeout for OLSR forwarding on this if */
+  uint32_t fwdtimer;
 
-  struct olsr_netbuf netbuf;           /* the buffer to construct the packet data */
+  /* the buffer to construct the packet data */
+  struct olsr_netbuf netbuf;
 
-  struct if_gen_property *gen_properties;       /* Generic interface properties */
+  /* Generic interface properties */
+  struct if_gen_property *gen_properties;
 
-  int ttl_index;                       /* index in TTL array for fish-eye */
+  /* index in TTL array for fish-eye */
+  int ttl_index;
 
-  bool immediate_send_tc;              /* Hello's are sent immediately normally, this flag prefers to send TC's */
+  /* Hello's are sent immediately normally, this flag prefers to send TC's */
+  bool immediate_send_tc;
 
+  /* backpointer to olsr_if configuration */
+  struct olsr_if *olsr_if;
   struct interface *int_next;
 };
 
index b4efc1a..2b44ee8 100644 (file)
@@ -97,22 +97,21 @@ int rtnetlink_register_socket(int rtnl_mgrp)
   struct sockaddr_nl addr;
 
   if (sock<0) {
-    OLSR_PRINTF(1,"could not create rtnetlink socket! %d",sock);
+    OLSR_PRINTF(1,"could not create rtnetlink socket! %s (%d)", strerror(errno), errno);
+    return -1;
   }
-  else {
-    memset(&addr, 0, sizeof(addr));
 
-    addr.nl_family = AF_NETLINK;
-    addr.nl_pid = 0; //kernel will assign appropiate number instead of pid (which is already used by primaray rtnetlink socket to add/delete routes)
-    addr.nl_groups = rtnl_mgrp;
-    if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0) {
-      OLSR_PRINTF(1,"could not bind socket! (%d %s)",errno,strerror(errno));
-    }
-    else {
-      add_olsr_socket(sock, &rtnetlink_read);
-    }
-    fcntl(sock, F_SETFL, O_NONBLOCK);
+  memset(&addr, 0, sizeof(addr));
+  addr.nl_family = AF_NETLINK;
+  addr.nl_pid = 0; //kernel will assign appropiate number instead of pid (which is already used by primaray rtnetlink socket to add/delete routes)
+  addr.nl_groups = rtnl_mgrp;
+
+  if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0) {
+    OLSR_PRINTF(1,"could not bind rtnetlink socket! %s (%d)",strerror(errno), errno);
+    return -1;
   }
+
+  add_olsr_socket(sock, &rtnetlink_read);
   return sock;
 }
 
index 07acb7c..fe7cfe0 100644 (file)
@@ -389,6 +389,14 @@ int main(int argc, char *argv[]) {
     olsr_exit(__func__, 0);
   }
   fcntl(olsr_cnf->rtnl_s, F_SETFL, O_NONBLOCK);
+
+#if LINUX_RTNETLINK_LISTEN
+  if ((olsr_cnf->rt_monitor_socket = rtnetlink_register_socket(RTMGRP_LINK)) < 0) {
+    olsr_syslog(OLSR_LOG_ERR, "rtmonitor socket: %m");
+    olsr_exit(__func__, 0);
+  }
+#endif /*LINUX_RTNETLINK_LISTEN*/
+
 #endif
 
   /*
@@ -505,11 +513,13 @@ int main(int argc, char *argv[]) {
 
   OLSR_PRINTF(1, "Main address: %s\n\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
 
+#ifdef linux
 /*deativate spoof on all, this is neede ddue to an change in kernel 2.6.31 
  * all and device-specific settings are now combined differently
  * new max(all,device) old: all && device 
  * !!?? does this change only affect rp_filter or other aswell (e.g. icmp_redirect)*/
 deactivate_spoof("all", &olsr_cnf->ipip_base_if, AF_INET );
+#endif
 
 #if LINUX_POLICY_ROUTING
   /*create smart-gateway-tunnel policy rules*/
@@ -591,10 +601,6 @@ printf("\nMain Table is %i prio %i", olsr_cnf->rttable, olsr_cnf->rttable_rule);
   /* Create rtnetlink socket to listen on interface change events RTMGRP_LINK and RTMGRP_IPV4_ROUTE */
   //todo listen on tunl0 events aswell
 
-#if LINUX_RTNETLINK_LISTEN
-  rtnetlink_register_socket(RTMGRP_LINK);
-#endif /*LINUX_RTNETLINK_LISTEN*/
-
 #endif
 
 #if defined linux
@@ -818,6 +824,10 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
 
   close(olsr_cnf->rtnl_s);
 
+#if LINUX_RTNETLINK_LISTEN
+  close (olsr_cnf->rt_monitor_socket);
+#endif /*LINUX_RTNETLINK_LISTEN*/
+
   /*rp_filter*/
   if (olsr_cnf->ipip_base_if.if_index) printf("\nresetting of tunl0 rp_filter not implemented");//!!?? no function extists to reset a single interface
 #endif
index a3b4fa8..682b251 100644 (file)
@@ -286,6 +286,7 @@ struct olsrd_config {
   int ioctl_s;                         /* Socket used for ioctl calls */
 #if LINUX_POLICY_ROUTING
   int rtnl_s;                          /* Socket used for rtnetlink messages */
+  int rt_monitor_socket;
 #endif
 
 #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __MacOSX__ || defined __NetBSD__ || defined __OpenBSD__
index e857639..6bb4d2f 100644 (file)
@@ -5,13 +5,14 @@
  *      Author: henning
  */
 
-#include <net/if.h>
-
 #include "defs.h"
 #include "kernel_routes.h"
 #include "net_os.h"
 #include "olsr_niit.h"
 
+#include <net/if.h>
+
+#ifdef linux
 int olsr_init_niit(void) {
   olsr_cnf->niit4to6_if_index = if_nametoindex(DEF_NIIT4TO6_IFNAME);
   if (olsr_cnf->niit4to6_if_index <= 0 || !olsr_if_isup(DEF_NIIT4TO6_IFNAME)) {
@@ -41,3 +42,4 @@ void olsr_cleanup_niit_routes(void) {
     olsr_netlink_static_niit_routes(&h->net, false);
   }
 }
+#endif
index 9c33477..64d0bf1 100644 (file)
 #define DEF_NIIT4TO6_IFNAME         "niit4to6"
 #define DEF_NIIT6TO4_IFNAME         "niit6to4"
 
+#ifdef linux
 int olsr_init_niit(void);
 void olsr_setup_niit_routes(void);
 void olsr_cleanup_niit_routes(void);
+#endif
 
 #endif /* OLSR_NIIT_H_ */
index 6891ab2..09b1c02 100644 (file)
@@ -383,6 +383,9 @@ add_hemu_if(struct olsr_if *iface)
 
   memset(ifp, 0, sizeof(struct interface));
 
+  /* initialize backpointer */
+  ifp->olsr_if = iface;
+
   iface->configured = true;
   iface->interf = ifp;
 
@@ -705,6 +708,9 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
 
   ifp = olsr_malloc(sizeof(struct interface), "Interface update 2");
 
+  /* initialize backpointer */
+  ifp->olsr_if = iface;
+
   iface->configured = 1;
   iface->interf = ifp;
 
index d4a311d..b107d5e 100644 (file)
@@ -124,23 +124,6 @@ int GetIntInfo(struct InterfaceInfo *Info, char *Name);
 
 #define MAX_INTERFACES 100
 
-int __stdcall SignalHandler(unsigned long Signal);
-
-static unsigned long __stdcall
-SignalHandlerWrapper(void *Dummy __attribute__ ((unused)))
-{
-  SignalHandler(0);
-  return 0;
-}
-
-static void
-CallSignalHandler(void)
-{
-  unsigned long ThreadId;
-
-  CreateThread(NULL, 0, SignalHandlerWrapper, NULL, 0, &ThreadId);
-}
-
 static void
 MiniIndexToIntName(char *String, int MiniIndex)
 {
@@ -504,6 +487,9 @@ add_hemu_if(struct olsr_if *iface)
 
   memset(ifp, 0, sizeof(struct interface));
 
+  /* initialize backpointer */
+  ifp->olsr_if = iface;
+
   iface->configured = true;
   iface->interf = ifp;
 
@@ -794,6 +780,9 @@ chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__ ((unused)))
     return 0;
 
   New = olsr_malloc(sizeof(struct interface), "Interface 1");
+  /* initialize backpointer */
+  New->olsr_if = IntConf;
+
 
   New->immediate_send_tc = (IntConf->cnf->tc_params.emission_interval < IntConf->cnf->hello_params.emission_interval);
   if (olsr_cnf->max_jitter == 0) {