Add rp_filter handling for linux 2.6.31+
authorHenning Rogge <hrogge@googlemail.com>
Fri, 12 Feb 2010 17:35:32 +0000 (18:35 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Fri, 12 Feb 2010 17:35:32 +0000 (18:35 +0100)
Cleanup net.c code
Compile-Fixes for BSD and Linux

20 files changed:
src/bsd/dummy.c [new file with mode: 0644]
src/bsd/net.c
src/build_msg.c
src/gateway.c
src/gateway.h
src/gateway_default_handler.c
src/gateway_default_handler.h
src/hna_set.c
src/kernel_routes.h
src/kernel_tunnel.h
src/linux/net.c
src/main.c
src/net_os.h
src/olsr.c
src/scheduler.c
src/tc_set.c
src/unix/ifnet.c
src/win32/dummy.c [new file with mode: 0644]
src/win32/ifnet.c
src/win32/net.c

diff --git a/src/bsd/dummy.c b/src/bsd/dummy.c
new file mode 100644 (file)
index 0000000..f3ffbb4
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * dummy.c
+ *
+ *  Created on: 12.02.2010
+ *      Author: henning
+ */
+
+#include "../defs.h"
+#include "../kernel_routes.h"
+#include "../kernel_tunnel.h"
+#include "../net_os.h"
+
+int olsr_os_init_iptunnel(void) {
+  return -1;
+}
+
+void olsr_os_cleanup_iptunnel(void) {
+}
+
+int olsr_os_add_ipip_tunnel(const char *name __attribute__ ((unused)),
+    union olsr_ip_addr *target __attribute__ ((unused)),
+    bool transportV4 __attribute__ ((unused))) {
+  return -1;
+}
+
+int olsr_os_change_ipip_tunnel(const char *name __attribute__ ((unused)),
+    union olsr_ip_addr *target __attribute__ ((unused)),
+    bool transportV4 __attribute__ ((unused))) {
+  return -1;
+}
+
+int olsr_os_del_ipip_tunnel(const char *name __attribute__ ((unused)),
+    bool transportV4 __attribute__ ((unused))) {
+  return -1;
+}
+
+bool olsr_if_isup(const char * dev __attribute__ ((unused))) {
+  return false;
+}
+
+int olsr_if_set_state(const char *dev __attribute__ ((unused)),
+    bool up __attribute__ ((unused))) {
+  return -1;
+}
+
+int olsr_if_setip(const char *dev __attribute__ ((unused)),
+    union olsr_ip_addr *ip __attribute__ ((unused)),
+    int ipversion __attribute__ ((unused))) {
+  return -1;
+}
+
+void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4 __attribute__ ((unused)),
+    bool set __attribute__ ((unused))) {
+}
+void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6 __attribute__ ((unused)),
+    bool set __attribute__ ((unused))) {
+}
+void olsr_os_inetgw_tunnel_route(uint32_t if_idx __attribute__ ((unused)),
+    bool ipv4 __attribute__ ((unused)),
+    bool set __attribute__ ((unused))) {
+}
+
+int olsr_os_policy_rule(int family __attribute__ ((unused)),
+    int rttable __attribute__ ((unused)),
+    uint32_t priority __attribute__ ((unused)),
+    const char *if_name __attribute__ ((unused)),
+    bool set __attribute__ ((unused))) {
+  return -1;
+}
+
+int olsr_os_create_localhostif(union olsr_ip_addr *ip __attribute__ ((unused)),
+    bool create __attribute__ ((unused))) {
+  return -1;
+}
index 6730f74..1f82d72 100644 (file)
@@ -178,10 +178,9 @@ set_sysctl_int(const char *name, int new)
   return old;
 }
 
-int
-enable_ip_forwarding(int version)
-{
-  const char *name = version == AF_INET ? "net.inet.ip.forwarding" : "net.inet6.ip6.forwarding";
+void
+net_os_set_global_ifoptions(void) {
+  const char *name = olsr_cnf->ip_version == AF_INET ? "net.inet.ip.forwarding" : "net.inet6.ip6.forwarding";
 
   gateway = set_sysctl_int(name, 1);
   if (gateway < 0) {
@@ -189,25 +188,17 @@ enable_ip_forwarding(int version)
     olsr_startup_sleep(3);
   }
 
-  return 1;
-}
-
-int
-disable_redirects_global(int version)
-{
-  const char *name;
-
   /* do not accept ICMP redirects */
 
 #if defined(__OpenBSD__) || defined(__NetBSD__)
-  if (version == AF_INET)
+  if (olsr_cnf->ip_version == AF_INET)
     name = "net.inet.icmp.rediraccept";
   else
     name = "net.inet6.icmp6.rediraccept";
 
   ignore_redir = set_sysctl_int(name, 0);
 #elif defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __MacOSX__
-  if (version == AF_INET) {
+  if (olsr_cnf->ip_version == AF_INET) {
     name = "net.inet.icmp.drop_redirect";
     ignore_redir = set_sysctl_int(name, 1);
   } else {
@@ -215,7 +206,7 @@ disable_redirects_global(int version)
     ignore_redir = set_sysctl_int(name, 0);
   }
 #else
-  if (version == AF_INET)
+  if (olsr_cnf->ip_version == AF_INET)
     name = "net.inet.icmp.drop_redirect";
   else
     name = "net.inet6.icmp6.drop_redirect";
@@ -231,7 +222,7 @@ disable_redirects_global(int version)
 
   /* do not send ICMP redirects */
 
-  if (version == AF_INET)
+  if (olsr_cnf->ip_version == AF_INET)
     name = "net.inet.ip.redirect";
   else
     name = "net.inet6.ip6.redirect";
@@ -242,51 +233,32 @@ disable_redirects_global(int version)
             "Cannot disable outgoing ICMP redirect messages. " "Please disable them manually. Continuing in 3 seconds...\n");
     olsr_startup_sleep(3);
   }
-
-  return 1;
 }
 
-int
-disable_redirects(const char *if_name __attribute__ ((unused)), struct interface *iface __attribute__ ((unused)), int version
-                  __attribute__ ((unused)))
-{
-  /*
-   *  this function gets called for each interface olsrd uses; however,
-   * FreeBSD can only globally control ICMP redirects, and not on a
-   * per-interface basis; hence, only disable ICMP redirects in the "global"
-   * function
-   */
-  return 1;
-}
-
-int
-deactivate_spoof(const char *if_name __attribute__ ((unused)), struct interface *iface __attribute__ ((unused)), int version
-                 __attribute__ ((unused)))
-{
-  return 1;
+int net_os_set_ifoptions(const char *if_name __attribute__ ((unused)), struct interface *iface __attribute__ ((unused))) {
+  return -1;
 }
 
 int
-restore_settings(int version)
-{
+net_os_restore_ifoptions(void) {
   /* reset IP forwarding */
-  const char *name = version == AF_INET ? "net.inet.ip.forwarding" : "net.inet6.ip6.forwarding";
+  const char *name = olsr_cnf->ip_version == AF_INET ? "net.inet.ip.forwarding" : "net.inet6.ip6.forwarding";
 
   set_sysctl_int(name, gateway);
 
   /* reset incoming ICMP redirects */
 
 #ifdef __OpenBSD__
-  name = version == AF_INET ? "net.inet.icmp.rediraccept" : "net.inet6.icmp6.rediraccept";
+  name = olsr_cnf->ip_version == AF_INET ? "net.inet.icmp.rediraccept" : "net.inet6.icmp6.rediraccept";
 #elif defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __MacOSX__
-  name = version == AF_INET ? "net.inet.icmp.drop_redirect" : "net.inet6.icmp6.rediraccept";
+  name = olsr_cnf->ip_version == AF_INET ? "net.inet.icmp.drop_redirect" : "net.inet6.icmp6.rediraccept";
 #else
-  name = version == AF_INET ? "net.inet.icmp.drop_redirect" : "net.inet6.icmp6.drop_redirect";
+  name = olsr_cnf->ip_version == AF_INET ? "net.inet.icmp.drop_redirect" : "net.inet6.icmp6.drop_redirect";
 #endif
   set_sysctl_int(name, ignore_redir);
 
   /* reset outgoing ICMP redirects */
-  name = version == AF_INET ? "net.inet.ip.redirect" : "net.inet6.ip6.redirect";
+  name = olsr_cnf->ip_version == AF_INET ? "net.inet.ip.redirect" : "net.inet6.ip6.redirect";
   set_sysctl_int(name, send_redir);
   return 1;
 }
index a0f9035..7d8693f 100644 (file)
@@ -1048,11 +1048,12 @@ serialize_hna4(struct interface *ifp)
 #endif
 
     olsr_prefix_to_netmask(&ip_addr, h->net.prefix_len);
+#ifndef WIN32
     if (olsr_cnf->smart_gw_active && is_prefix_inetgw(&h->net)) {
       /* this is the default route, overwrite it with the smart gateway */
       olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len);
     }
-
+#endif
     pair->addr = h->net.prefix.v4.s_addr;
     pair->netmask = ip_addr.v4.s_addr;
     pair++;
@@ -1140,11 +1141,12 @@ serialize_hna6(struct interface *ifp)
     OLSR_PRINTF(BMSG_DBGLVL, "\tNet: %s\n", olsr_ip_prefix_to_string(&h->net));
 #endif
     olsr_prefix_to_netmask(&tmp_netmask, h->net.prefix_len);
+#ifndef WIN32
     if (olsr_cnf->smart_gw_active && is_prefix_inetgw(&h->net)) {
       /* this is the default gateway, so overwrite it with the smart one */
       olsr_modifiy_inetgw_netmask(&tmp_netmask, h->net.prefix_len);
     }
-
+#endif
     pair6->addr = h->net.prefix.v6;
     pair6->netmask = tmp_netmask.v6;
     pair6++;
index bb53f3d..86ece35 100644 (file)
@@ -22,6 +22,7 @@
 #include <assert.h>
 #include <net/if.h>
 
+#ifndef WIN32
 struct avl_tree gateway_tree;
 
 static struct olsr_cookie_info *gw_mem_cookie = NULL;
@@ -473,3 +474,5 @@ olsr_print_gateway_entries(void) {
   } OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw)
 #endif
 }
+
+#endif /* !WIN32 */
index c4cfda0..126e6a4 100644 (file)
@@ -88,5 +88,4 @@ struct olsr_gw_handler {
 };
 
 void olsr_set_inetgw_handler(struct olsr_gw_handler *l);
-
 #endif /* GATEWAY_H_ */
index 4b25e2e..2796f3a 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "assert.h"
 
+#ifndef WIN32
 static uint32_t gw_def_nodecount, gw_def_stablecount;
 static bool gw_def_finished_ipv4, gw_def_finished_ipv6;
 
@@ -169,3 +170,4 @@ void olsr_gw_default_lookup_gateway(bool ipv4, bool ipv6) {
     gw_default_choose_gateway();
   }
 }
+#endif
index 3e0c86b..cd9dbf4 100644 (file)
@@ -8,6 +8,7 @@
 #ifndef GATEWAY_DEFAULT_HANDLER_H_
 #define GATEWAY_DEFAULT_HANDLER_H_
 
+#ifndef WIN32
 #include "gateway.h"
 
 #define GW_DEFAULT_TIMER_INTERVAL 10*1000
@@ -16,4 +17,5 @@
 void olsr_gw_default_init(void);
 void olsr_gw_default_lookup_gateway(bool, bool);
 
+#endif /* !WIN32 */
 #endif /* GATEWAY_DEFAULT_HANDLER_H_ */
index bca0ceb..a4a44b8 100644 (file)
@@ -216,10 +216,12 @@ olsr_delete_hna_net_entry(struct hna_net *net_to_delete) {
   struct hna_entry *hna_gw;
   bool removed_entry = false;
 
+#ifndef WIN32
   if (is_prefix_inetgw(&net_to_delete->hna_prefix)) {
     /* modify smart gateway entry if necessary */
     olsr_delete_gateway_entry(&net_to_delete->hna_gw->A_gateway_addr, net_to_delete->hna_prefix.prefix_len);
   }
+#endif
 
   olsr_stop_timer(net_to_delete->hna_net_timer);
   net_to_delete->hna_net_timer = NULL;  /* be pedandic */
@@ -450,9 +452,11 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
     pkt_get_ipaddress(&curr, &mask);
     prefix.prefix_len = olsr_netmask_to_prefix(&mask);
 
+#ifndef WIN32
     if (olsr_cnf->smart_gw_active && olsr_is_smart_gateway(&prefix, &mask)) {
       olsr_update_gateway_entry(&originator, &mask, prefix.prefix_len, msg_seq_number);
     }
+#endif
 
 #ifdef MAXIMUM_GATEWAY_PREFIX_LENGTH
     if (olsr_cnf->smart_gw_active && prefix.prefix_len > 0 && prefix.prefix_len <= MAXIMUM_GATEWAY_PREFIX_LENGTH) {
index 442cd8e..0c20d2f 100644 (file)
@@ -55,6 +55,7 @@ int olsr_ioctl_del_route6(const struct rt_entry *);
 
 #ifdef LINUX_NETLINK_ROUTING
 int rtnetlink_register_socket(int);
+#endif
 
 void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4, bool set);
 void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set);
@@ -62,7 +63,6 @@ void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set);
 
 int olsr_os_policy_rule(int family, int rttable, uint32_t priority, const char *if_name, bool set);
 int olsr_os_create_localhostif(union olsr_ip_addr *ip, bool create);
-#endif
 
 #endif
 
index 125010b..a09abf1 100644 (file)
 #include "defs.h"
 #include "olsr_types.h"
 
-#ifdef linux
-
 int olsr_os_init_iptunnel(void);
 void olsr_os_cleanup_iptunnel(void);
 
 int olsr_os_add_ipip_tunnel(const char *name, union olsr_ip_addr *target, bool transportV4);
 int olsr_os_change_ipip_tunnel(const char *name, union olsr_ip_addr *target, bool transportV4);
 int olsr_os_del_ipip_tunnel(const char *name, bool transportV4);
-#endif
 
 #endif /* KERNEL_TUNNEL_H_ */
index dee3f10..8767df5 100644 (file)
 #include "../net_os.h"
 #include "../ipcalc.h"
 #include "../olsr.h"
+#include "../log.h"
 
 #include <net/if.h>
 
 #include <sys/ioctl.h>
+#include <sys/utsname.h>
 
 #include <fcntl.h>
 #include <string.h>
 #define IPV6_ADDR_LINKLOCAL     0x0020U
 #define IPV6_ADDR_SITELOCAL     0x0040U
 
+/* ip forwarding */
+#define PROC_IPFORWARD_V4 "/proc/sys/net/ipv4/ip_forward"
+#define PROC_IPFORWARD_V6 "/proc/sys/net/ipv6/conf/all/forwarding"
+
 /* Redirect proc entry */
-#define REDIRECT_PROC "/proc/sys/net/ipv4/conf/%s/send_redirects"
+#define PROC_IF_REDIRECT "/proc/sys/net/ipv4/conf/%s/send_redirects"
+#define PROC_ALL_REDIRECT "/proc/sys/net/ipv4/conf/all/send_redirects"
 
 /* IP spoof proc entry */
-#define SPOOF_PROC "/proc/sys/net/ipv4/conf/%s/rp_filter"
+#define PROC_IF_SPOOF "/proc/sys/net/ipv4/conf/%s/rp_filter"
+#define PROC_ALL_SPOOF "/proc/sys/net/ipv4/conf/all/rp_filter"
+
 
 /* list of IPv6 interfaces */
 #define PATH_PROCNET_IFINET6           "/proc/net/if_inet6"
@@ -80,6 +89,7 @@
 /* The original state of the IP forwarding proc entry */
 static char orig_fwd_state;
 static char orig_global_redirect_state;
+static char orig_global_rp_filter;
 
 /**
  *Bind a socket to a device
@@ -100,130 +110,89 @@ bind_socket_to_device(int sock, char *dev_name)
   return setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, dev_name, strlen(dev_name) + 1);
 }
 
-/**
- *Enable IP forwarding.
- *Just writing "1" to the /proc/sys/net/ipv4/ip_forward
- *if using IPv4 or /proc/sys/net/ipv6/conf/all/forwarding
- *if using IPv6.
- *Could probably drop the check for
- *"0" here and write "1" anyways.
- *
- *@param version IP version.
- *
- *@return 1 on sucess 0 on failiure
- */
-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";
-
-  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);
+static int writeToProc(const char *file, char *old, char value) {
+  int fd;
+  char rv;
 
-    olsr_startup_sleep(3);
-    return 0;
+  if ((fd = open(file, O_RDWR)) < 0) {
+    OLSR_PRINTF(0, "Error, cannot open proc entry %s: %s (%d)\n", file, strerror(errno), errno);
+    return -1;
   }
 
-  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");
-      olsr_startup_sleep(3);
-      return 0;
-    } else {
-      syslog(LOG_INFO, "Writing \"1\" to %s\n", procfile);
-      fputs("1", proc_fwd);
-    }
-    fclose(proc_fwd);
+  if (read(fd, &rv, 1) != 1) {
+    OLSR_PRINTF(0, "Error, cannot read proc entry %s: %s (%d)\n", file, strerror(errno), errno);
+    return -1;
   }
-  return 1;
-}
 
-int
-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 (lseek(fd, SEEK_SET, 0) == -1) {
+    OLSR_PRINTF(0, "Error, cannot rewind proc entry %s: %s (%d)\n", file, strerror(errno), errno);
     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);
+  if (write(fd, &value, 1) != 1) {
+    OLSR_PRINTF(0, "Error, cannot write proc entry %s: %s (%d)\n", file, strerror(errno), errno);
+    return -1;
+  }
 
-    olsr_startup_sleep(3);
+  if (close(fd) != 0) {
+    OLSR_PRINTF(0, "Error while closing proc entry %s: %s (%d)\n", file, strerror(errno), errno);
     return -1;
   }
-  orig_global_redirect_state = fgetc(proc_redirect);
-  fclose(proc_redirect);
 
-  if (orig_global_redirect_state == '0')
-    return 0;
+  if (old) {
+    *old = rv;
+  }
+  olsr_syslog(OLSR_LOG_INFO, "Writing '%c' to %s", value, file);
+  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");
-    olsr_startup_sleep(3);
-    return 0;
+static bool is_at_least_linuxkernel_2_6_31(void) {
+  struct utsname uts;
+
+  memset(&uts, 0, sizeof(uts));
+  if (uname(&uts)) {
+    OLSR_PRINTF(1, "Error, could not read kernel version: %s (%d)\n", strerror(errno), errno);
+    return false;
   }
-  syslog(LOG_INFO, "Writing \"0\" to %s", procfile);
-  fputs("0", proc_redirect);
-  fclose(proc_redirect);
-  return 1;
+
+  if (strncmp(uts.release, "2.6.",4) != 0) {
+    return false;
+  }
+  return atoi(&uts.release[4]) >= 31;
 }
 
 /**
- *
- *@return 1 on sucess 0 on failiure
+ * Setup global interface options (icmp redirect, ip forwarding, rp_filter)
+ * @return 1 on success 0 on failure
  */
-int
-disable_redirects(const char *if_name, struct interface *iface, int version)
-{
-  FILE *proc_redirect;
-  char procfile[FILENAME_MAX];
-
-  if (version == AF_INET6)
-    return -1;
+void
+net_os_set_global_ifoptions(void) {
 
-  /* 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);
+  if (writeToProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, &orig_fwd_state, '0')) {
+    OLSR_PRINTF(1, "Warning, could not enable IP forwarding!\n"
+        "you should manually ensure that IP forwarding is enabled!\n\n");
     olsr_startup_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");
-    olsr_startup_sleep(3);
-    return 0;
+  if (olsr_cnf->ip_version == AF_INET) {
+    if (writeToProc(PROC_ALL_REDIRECT, &orig_global_redirect_state, '0')) {
+      OLSR_PRINTF(1, "WARNING! Could not disable ICMP redirects!\n"
+          "you should manually ensure that ICMP redirects are disabled!\n\n");
+
+      olsr_startup_sleep(3);
+    }
+
+    /* check kernel version and disable global rp_filter */
+    if (is_at_least_linuxkernel_2_6_31()) {
+      if (writeToProc(PROC_ALL_SPOOF, &orig_global_rp_filter, '0')) {
+        OLSR_PRINTF(1, "WARNING! Could not disable global rp_filter (necessary for kernel 2.6.31 and higher!\n"
+            "you should manually ensure that rp_filter is disabled!\n\n");
+
+        olsr_startup_sleep(3);
+      }
+    }
   }
-  syslog(LOG_INFO, "Writing \"0\" to %s", procfile);
-  fputs("0", proc_redirect);
-  fclose(proc_redirect);
-  return 1;
+  return;
 }
 
 /**
@@ -231,37 +200,32 @@ disable_redirects(const char *if_name, struct interface *iface, int version)
  *@return 1 on sucess 0 on failiure
  */
 int
-deactivate_spoof(const char *if_name, struct interface *iface, int version)
+net_os_set_ifoptions(const char *if_name, struct interface *iface)
 {
-  FILE *proc_spoof;
   char procfile[FILENAME_MAX];
-
-  if (version == AF_INET6)
+  if (olsr_cnf->ip_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);
+  snprintf(procfile, sizeof(procfile), PROC_IF_REDIRECT, if_name);
 
+  if (writeToProc(procfile, &iface->nic_state.redirect, '0')) {
+    OLSR_PRINTF(0, "WARNING! Could not disable ICMP redirects!\n"
+        "you should mannually ensure that ICMP redirects are disabled!\n\n");
     olsr_startup_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");
+  /* Generate the procfile name */
+  snprintf(procfile, sizeof(procfile), PROC_IF_SPOOF, if_name);
+
+  if (writeToProc(procfile, &iface->nic_state.spoof, '0')) {
+    OLSR_PRINTF(0, "WARNING! Could not disable the IP spoof filter!\n"
+        "you should mannually ensure that IP spoof filtering is disabled!\n\n");
+
     olsr_startup_sleep(3);
     return 0;
   }
-  syslog(LOG_INFO, "Writing \"0\" to %s", procfile);
-  fputs("0", proc_spoof);
-  fclose(proc_spoof);
   return 1;
 }
 
@@ -269,76 +233,46 @@ deactivate_spoof(const char *if_name, struct interface *iface, int version)
  *Resets the spoof filter and ICMP redirect settings
  */
 int
-restore_settings(int version)
+net_os_restore_ifoptions(void)
 {
   struct interface *ifs;
+  char procfile[FILENAME_MAX];
 
   OLSR_PRINTF(1, "Restoring network state\n");
 
   /* Restore IP forwarding to "off" */
-  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);
-    }
+  if (writeToProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, NULL, orig_fwd_state)) {
+    OLSR_PRINTF(1, "Error, could not restore ip_forward settings\n");
   }
 
-  /* 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 (olsr_cnf->ip_version == AF_INET) {
+    /* Restore global ICMP redirect setting */
+    if (writeToProc(PROC_ALL_REDIRECT, NULL, orig_global_redirect_state)) {
+      OLSR_PRINTF(1, "Error, could not restore global icmp_redirect setting\n");
     }
-  }
 
-  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)
-      continue;
-    /* ICMP redirects */
-
-    /* Generate the procfile name */
-    snprintf(procfile, sizeof(procfile), REDIRECT_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.redirect);
-
-      fputc(ifs->nic_state.redirect, proc_fd);
-      fclose(proc_fd);
+    /* Restore global rp_filter setting for linux 2.6.31+ */
+    if (is_at_least_linuxkernel_2_6_31()) {
+      if (writeToProc(PROC_ALL_SPOOF, NULL, orig_global_rp_filter)) {
+        OLSR_PRINTF(1, "Error, could not restore global rp_filter setting\n");
+      }
     }
+    for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) {
+      /* Discard host-emulation interfaces */
+      if (ifs->is_hcif)
+        continue;
+
+      /* ICMP redirects */
+      snprintf(procfile, sizeof(procfile), PROC_IF_REDIRECT, ifs->int_name);
+      if (writeToProc(procfile, NULL, ifs->nic_state.redirect)) {
+        OLSR_PRINTF(1, "Error, could not restore icmp_redirect for interface %s\n", ifs->int_name);
+      }
 
-    /* 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);
+      /* Spoof filter */
+      sprintf(procfile, PROC_IF_SPOOF, ifs->int_name);
+      if (writeToProc(procfile, NULL, ifs->nic_state.spoof)) {
+        OLSR_PRINTF(1, "Error, could not restore rp_filter for interface %s\n", ifs->int_name);
+      }
     }
   }
   return 1;
index f65ee45..341b007 100644 (file)
@@ -363,10 +363,6 @@ int main(int argc, char *argv[]) {
   if (olsr_cnf->debug_level > 1) {
     olsrd_print_cnf(olsr_cnf);
   }
-#ifndef WIN32
-  /* Disable redirects globally */
-  disable_redirects_global(olsr_cnf->ip_version);
-#endif
 
   def_timer_ci = olsr_alloc_cookie("Default Timer Cookie", OLSR_COOKIE_TYPE_TIMER);
 
@@ -422,10 +418,11 @@ int main(int argc, char *argv[]) {
   /* Init empty TC timer */
   set_empty_tc_timer(GET_TIMESTAMP(0));
 
-  /*
-   *enable ip forwarding on host
-   */
-  enable_ip_forwarding(olsr_cnf->ip_version);
+  /* enable ip forwarding on host */
+  /* Disable redirects globally */
+#ifndef WIN32
+  net_os_set_global_ifoptions();
+#endif
 
   /* Initialize parser */
   olsr_init_parser();
@@ -801,7 +798,7 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   olsr_close_plugins();
 
   /* Reset network settings */
-  restore_settings(olsr_cnf->ip_version);
+  net_os_restore_ifoptions();
 
   /* ioctl socket */
   close(olsr_cnf->ioctl_s);
index 9fa3f9d..b5cdc7d 100644 (file)
@@ -63,15 +63,9 @@ int bind_socket_to_device(int, char *);
 
 int convert_ip_to_mac(union olsr_ip_addr *, struct sockaddr *, char *);
 
-int disable_redirects(const char *, struct interface *, int);
-
-int disable_redirects_global(int);
-
-int deactivate_spoof(const char *, struct interface *, int);
-
-int restore_settings(int);
-
-int enable_ip_forwarding(int);
+void net_os_set_global_ifoptions(void);
+int net_os_set_ifoptions(const char *if_name, struct interface *iface);
+int net_os_restore_ifoptions(void);
 
 int gethemusocket(struct sockaddr_in *);
 
@@ -89,11 +83,9 @@ bool is_if_link_up(char *);
 
 int join_mcast(struct interface *, int);
 
-#ifdef linux
 bool olsr_if_isup(const char * dev);
 int olsr_if_set_state(const char *dev, bool up);
 int olsr_if_setip(const char *dev, union olsr_ip_addr *ip, int ipversion);
-#endif
 
 #endif
 
index 3e9192e..3020358 100644 (file)
@@ -231,8 +231,10 @@ olsr_process_changes(void)
     olsr_print_tc_table();
 
     // TODO push this to debug level 3 or 4
+#ifndef WIN32
     olsr_print_gateway_entries();
 #endif
+#endif
   }
 
   for (tmp_pc_list = pcf_list; tmp_pc_list != NULL; tmp_pc_list = tmp_pc_list->next) {
index 7325b1b..9a9319f 100644 (file)
 #include <unistd.h>
 #include <assert.h>
 
+#ifdef WIN32
+#define close(x) closesocket(x)
+#endif
+
 /* Timer data, global. Externed in scheduler.h */
 uint32_t now_times;                    /* relative time compared to startup (in milliseconds */
 struct timeval first_tv;               /* timevalue during startup */
index 2c076a5..5eb9e92 100644 (file)
@@ -286,8 +286,9 @@ olsr_delete_tc_entry(struct tc_entry *tc)
 #endif
 
   /* delete gateway if available */
+#ifndef WIN32
   olsr_delete_gateway_entry(&tc->addr, FORCE_DELETE_GW_ENTRY);
-
+#endif
   /*
    * Delete the rt_path for ourselves.
    */
index 06c5d51..3b56a41 100644 (file)
@@ -57,6 +57,7 @@
 #include "lq_packet.h"
 #include "log.h"
 #include "link_set.h"
+
 #include <signal.h>
 #include <sys/types.h>
 #include <net/if.h>
@@ -657,11 +658,8 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
     }
 
     /* 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);
-
+    net_os_set_ifoptions(if_basename(ifr.ifr_name), &ifs);
   }
 
   /* Get interface index */
diff --git a/src/win32/dummy.c b/src/win32/dummy.c
new file mode 100644 (file)
index 0000000..f3ffbb4
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * dummy.c
+ *
+ *  Created on: 12.02.2010
+ *      Author: henning
+ */
+
+#include "../defs.h"
+#include "../kernel_routes.h"
+#include "../kernel_tunnel.h"
+#include "../net_os.h"
+
+int olsr_os_init_iptunnel(void) {
+  return -1;
+}
+
+void olsr_os_cleanup_iptunnel(void) {
+}
+
+int olsr_os_add_ipip_tunnel(const char *name __attribute__ ((unused)),
+    union olsr_ip_addr *target __attribute__ ((unused)),
+    bool transportV4 __attribute__ ((unused))) {
+  return -1;
+}
+
+int olsr_os_change_ipip_tunnel(const char *name __attribute__ ((unused)),
+    union olsr_ip_addr *target __attribute__ ((unused)),
+    bool transportV4 __attribute__ ((unused))) {
+  return -1;
+}
+
+int olsr_os_del_ipip_tunnel(const char *name __attribute__ ((unused)),
+    bool transportV4 __attribute__ ((unused))) {
+  return -1;
+}
+
+bool olsr_if_isup(const char * dev __attribute__ ((unused))) {
+  return false;
+}
+
+int olsr_if_set_state(const char *dev __attribute__ ((unused)),
+    bool up __attribute__ ((unused))) {
+  return -1;
+}
+
+int olsr_if_setip(const char *dev __attribute__ ((unused)),
+    union olsr_ip_addr *ip __attribute__ ((unused)),
+    int ipversion __attribute__ ((unused))) {
+  return -1;
+}
+
+void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4 __attribute__ ((unused)),
+    bool set __attribute__ ((unused))) {
+}
+void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6 __attribute__ ((unused)),
+    bool set __attribute__ ((unused))) {
+}
+void olsr_os_inetgw_tunnel_route(uint32_t if_idx __attribute__ ((unused)),
+    bool ipv4 __attribute__ ((unused)),
+    bool set __attribute__ ((unused))) {
+}
+
+int olsr_os_policy_rule(int family __attribute__ ((unused)),
+    int rttable __attribute__ ((unused)),
+    uint32_t priority __attribute__ ((unused)),
+    const char *if_name __attribute__ ((unused)),
+    bool set __attribute__ ((unused))) {
+  return -1;
+}
+
+int olsr_os_create_localhostif(union olsr_ip_addr *ip __attribute__ ((unused)),
+    bool create __attribute__ ((unused))) {
+  return -1;
+}
index 6111d18..3dc2404 100644 (file)
@@ -46,7 +46,6 @@
 #include "interfaces.h"
 #include "olsr.h"
 #include "parser.h"
-#include "socket_parser.h"
 #include "defs.h"
 #include "net_os.h"
 #include "ifnet.h"
@@ -583,23 +582,23 @@ add_hemu_if(struct olsr_if *iface)
   }
 
   /* Register socket */
-  add_olsr_socket(ifp->olsr_socket, &olsr_input_hostemu);
+  add_olsr_socket(ifp->olsr_socket, &olsr_input_hostemu, NULL, NULL, SP_PR_READ);
 
   /*
    * 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,
-                     olsr_cnf->lq_level == 0 ? &generate_hello : &olsr_output_lq_hello, ifp, hello_gen_timer_cookie->ci_id);
+                     olsr_cnf->lq_level == 0 ? &generate_hello : &olsr_output_lq_hello, ifp, hello_gen_timer_cookie);
   ifp->tc_gen_timer =
     olsr_start_timer(iface->cnf->tc_params.emission_interval * MSEC_PER_SEC, TC_JITTER, OLSR_TIMER_PERIODIC,
-                     olsr_cnf->lq_level == 0 ? &generate_tc : &olsr_output_lq_tc, ifp, tc_gen_timer_cookie->ci_id);
+                     olsr_cnf->lq_level == 0 ? &generate_tc : &olsr_output_lq_tc, ifp, tc_gen_timer_cookie);
   ifp->mid_gen_timer =
     olsr_start_timer(iface->cnf->mid_params.emission_interval * MSEC_PER_SEC, MID_JITTER, OLSR_TIMER_PERIODIC, &generate_mid, ifp,
-                     mid_gen_timer_cookie->ci_id);
+                     mid_gen_timer_cookie);
   ifp->hna_gen_timer =
     olsr_start_timer(iface->cnf->hna_params.emission_interval * MSEC_PER_SEC, HNA_JITTER, OLSR_TIMER_PERIODIC, &generate_hna, ifp,
-                     hna_gen_timer_cookie->ci_id);
+                     hna_gen_timer_cookie);
 
   /* Recalculate max topology hold time */
   if (olsr_cnf->max_tc_vtime < iface->cnf->tc_params.emission_interval)
@@ -862,7 +861,7 @@ chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__ ((unused)))
     exit(1);
   }
 
-  add_olsr_socket(New->olsr_socket, &olsr_input);
+  add_olsr_socket(New->olsr_socket, &olsr_input, NULL, NULL, SP_PR_READ);
 
   New->int_next = ifnet;
   ifnet = New;
@@ -884,16 +883,16 @@ chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__ ((unused)))
    */
   New->hello_gen_timer =
     olsr_start_timer(IntConf->cnf->hello_params.emission_interval * MSEC_PER_SEC, HELLO_JITTER, OLSR_TIMER_PERIODIC,
-                     olsr_cnf->lq_level == 0 ? &generate_hello : &olsr_output_lq_hello, New, hello_gen_timer_cookie->ci_id);
+                     olsr_cnf->lq_level == 0 ? &generate_hello : &olsr_output_lq_hello, New, hello_gen_timer_cookie);
   New->tc_gen_timer =
     olsr_start_timer(IntConf->cnf->tc_params.emission_interval * MSEC_PER_SEC, TC_JITTER, OLSR_TIMER_PERIODIC,
-                     olsr_cnf->lq_level == 0 ? &generate_tc : &olsr_output_lq_tc, New, tc_gen_timer_cookie->ci_id);
+                     olsr_cnf->lq_level == 0 ? &generate_tc : &olsr_output_lq_tc, New, tc_gen_timer_cookie);
   New->mid_gen_timer =
     olsr_start_timer(IntConf->cnf->mid_params.emission_interval * MSEC_PER_SEC, MID_JITTER, OLSR_TIMER_PERIODIC, &generate_mid, New,
-                     mid_gen_timer_cookie->ci_id);
+                     mid_gen_timer_cookie);
   New->hna_gen_timer =
     olsr_start_timer(IntConf->cnf->hna_params.emission_interval * MSEC_PER_SEC, HNA_JITTER, OLSR_TIMER_PERIODIC, &generate_hna, New,
-                     hna_gen_timer_cookie->ci_id);
+                     hna_gen_timer_cookie);
 
   if (olsr_cnf->max_tc_vtime < IntConf->cnf->tc_params.emission_interval)
     olsr_cnf->max_tc_vtime = IntConf->cnf->tc_params.emission_interval;
index 969b65f..f721945 100644 (file)
@@ -67,7 +67,6 @@ void WinSockPError(const char *Str);
 void PError(const char *);
 
 void DisableIcmpRedirects(void);
-int disable_ip_forwarding(int Ver);
 
 int
 gethemusocket(struct sockaddr_in *pin)
@@ -205,24 +204,21 @@ getsocket6(int BuffSize, struct interface *ifp __attribute__ ((unused)))
 
 static OVERLAPPED RouterOver;
 
-int
-enable_ip_forwarding(int Ver)
+void net_os_set_global_ifoptions(void)
 {
   HMODULE Lib;
   unsigned int __stdcall(*enable_router)(HANDLE *, OVERLAPPED *);
   HANDLE Hand;
 
-  Ver = Ver;
-
   Lib = LoadLibrary(WIDE_STRING("iphlpapi.dll"));
 
   if (Lib == NULL)
-    return 0;
+    return;
 
   enable_router = (unsigned int __stdcall(*)(HANDLE *, OVERLAPPED *))GetProcAddress(Lib, WIDE_STRING("EnableRouter"));
 
   if (enable_router == NULL)
-    return 0;
+    return;
 
   memset(&RouterOver, 0, sizeof(OVERLAPPED));
 
@@ -230,20 +226,20 @@ enable_ip_forwarding(int Ver)
 
   if (RouterOver.hEvent == NULL) {
     PError("CreateEvent()");
-    return -1;
+    return;
   }
 
   if (enable_router(&Hand, &RouterOver) != ERROR_IO_PENDING) {
     PError("EnableRouter()");
-    return -1;
+    return;
   }
 
   OLSR_PRINTF(3, "Routing enabled.\n");
 
-  return 0;
+  return;
 }
 
-int
+static int
 disable_ip_forwarding(int Ver)
 {
   HMODULE Lib;
@@ -272,10 +268,11 @@ disable_ip_forwarding(int Ver)
   return 0;
 }
 
+
 int
-restore_settings(int Ver)
+net_os_restore_ifoptions(void)
 {
-  disable_ip_forwarding(Ver);
+  disable_ip_forwarding(olsr_cnf->ip_version);
 
   return 0;
 }