Move more interface code into machine independent core
authorHenning Rogge <hrogge@googlemail.com>
Sat, 7 Aug 2010 11:33:01 +0000 (13:33 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 7 Aug 2010 11:33:01 +0000 (13:33 +0200)
Makefile
src/bsd/net.c
src/ifnet.h
src/interfaces.c
src/interfaces.h
src/linux/net.c
src/net_os.h
src/olsr_cfg.h
src/unix/ifnet.c
src/win32/ifnet.c
src/win32/net.c

index a2ea40a..5823f49 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -151,7 +151,7 @@ else
 ifeq ($(OS),win32)
 SUBDIRS := dot_draw httpinfo lq_etx_ff lq_etx_float lq_etx_fpm lq_rfc mini secure txtinfo watchdog
 else
-SUBDIRS := bmf debuginfo dot_draw dyn_gw dyn_gw_plain httpinfo lq_etx_ff lq_etx_float lq_etx_fpm lq_rfc mdns mini nameservice secure txtinfo watchdog cl_roam
+SUBDIRS := debuginfo dot_draw dyn_gw dyn_gw_plain httpinfo lq_etx_ff lq_etx_float lq_etx_fpm lq_rfc mini nameservice secure txtinfo watchdog cl_roam
 endif
 endif
 
index 27cd91b..83c6222 100644 (file)
@@ -430,7 +430,9 @@ getsocket6(int bufspace, struct interface *ifp __attribute__ ((unused)))
   return sock;
 }
 
-
+void
+os_set_olsr_socketoptions(int sock __attribute__ ((unused))) {
+}
 
 int
 join_mcast(struct interface *ifs, int sock)
index 4fb55d5..7ee4300 100644 (file)
@@ -59,9 +59,8 @@ int
   set_flag(char *, short);
 #endif
 
-int chk_if_up(struct olsr_if_config *);
+struct interface *os_init_interface(struct olsr_if_config *);
 int chk_if_changed(struct olsr_if_config *);
-int add_hemu_if(struct olsr_if_config *);
 
 #ifdef WIN32
 void CallSignalHandler(void);
index b2ce7ff..b3f76f7 100644 (file)
@@ -52,6 +52,7 @@
 #include "common/avl.h"
 #include "olsr_logging.h"
 #include "valgrind/valgrind.h"
+#include "net_os.h"
 
 #include <signal.h>
 #include <unistd.h>
@@ -121,7 +122,7 @@ init_interfaces(void)
 
   /* Run trough all interfaces immediately */
   for (tmp_if = olsr_cnf->if_configs; tmp_if != NULL; tmp_if = tmp_if->next) {
-    chk_if_up(tmp_if);
+    add_interface(tmp_if);
   }
 
   /* Kick a periodic timer for the network interface update function */
@@ -186,6 +187,77 @@ void destroy_interfaces(void) {
   }
 }
 
+struct interface *
+add_interface(struct olsr_if_config *iface) {
+  struct interface *ifp;
+
+  if ((ifp = os_init_interface(iface)) == NULL) {
+    return NULL;
+  }
+
+  set_buffer_timer(ifp);
+
+  /* Register sockets */
+  add_olsr_socket(ifp->olsr_socket, &olsr_input, NULL, NULL, SP_PR_READ);
+  add_olsr_socket(ifp->send_socket, &olsr_input, NULL, NULL, SP_PR_READ);
+
+  os_set_olsr_socketoptions(ifp->olsr_socket);
+  os_set_olsr_socketoptions(ifp->send_socket);
+
+  /*
+   *Initialize packet sequencenumber as a random 16bit value
+   */
+  ifp->olsr_seqnum = random() & 0xFFFF;
+
+  /*
+   * Set main address if it's not set
+   */
+  if (olsr_ipcmp(&all_zero, &olsr_cnf->router_id) == 0) {
+    struct ipaddr_str buf;
+
+    olsr_cnf->router_id = ifp->ip_addr;
+    OLSR_INFO(LOG_INTERFACE, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->router_id));
+
+    /* initialize representation of this node in tc_set */
+    olsr_change_myself_tc();
+  }
+
+  /* Set up buffer */
+  net_add_buffer(ifp);
+
+  /*
+   * Register functions for periodic message generation
+   */
+  ifp->hello_gen_timer =
+    olsr_start_timer(iface->cnf->hello_params.emission_interval,
+                     HELLO_JITTER, OLSR_TIMER_PERIODIC, &generate_hello, ifp, hello_gen_timer_cookie);
+  ifp->hello_interval = iface->cnf->hello_params.emission_interval;
+  ifp->hello_validity = iface->cnf->hello_params.validity_time;
+
+  ifp->mode = iface->cnf->mode;
+
+  /*
+   * Call possible ifchange functions registered by plugins
+   */
+  run_ifchg_cbs(ifp, IFCHG_IF_ADD);
+
+  /*
+   * The interface is ready, lock it.
+   */
+  lock_interface(ifp);
+
+  /*
+   * Link to config.
+   */
+  iface->interf = ifp;
+  lock_interface(iface->interf);
+
+  /* Queue */
+  list_add_before(&interface_head, &ifp->int_node);
+
+  return ifp;
+}
+
 /**
  * Callback function for periodic check of interface parameters.
  */
@@ -209,7 +281,7 @@ check_interface_updates(void *foo __attribute__ ((unused)))
     if (tmp_if->interf) {
       chk_if_changed(tmp_if);
     } else {
-      if (chk_if_up(tmp_if) == 1) {
+      if (add_interface(tmp_if)) {
         lost = get_lost_interface_ip(&tmp_if->interf->ip_addr);
         if (lost) {
           remove_lost_interface_ip(lost);
index 185c203..8f0f775 100644 (file)
 #endif
 #include <time.h>
 
+/* prototype declaration to break loop with olsr_cnf.h */
+struct interface;
+
 #include "olsr_types.h"
 #include "olsr_cfg_data.h"
+#include "olsr_cfg.h"
 #include "olsr_time.h"
 #include "common/list.h"
 #include "common/avl.h"
@@ -196,6 +200,7 @@ typedef int (*ifchg_cb_func) (struct interface *, int);
 bool init_interfaces(void);
 bool EXPORT(is_lost_interface_ip)(union olsr_ip_addr *ip);
 void destroy_interfaces(void);
+struct interface *add_interface(struct olsr_if_config *iface);
 void remove_interface(struct interface **);
 void run_ifchg_cbs(struct interface *, int);
 struct interface *if_ifwithsock(int);
index f3dee97..a7990fe 100644 (file)
@@ -63,6 +63,7 @@
 #include <errno.h>
 #include <unistd.h>
 #include <assert.h>
+#include <netinet/ip.h>
 
 /* Redirect proc entry */
 #define REDIRECT_PROC "/proc/sys/net/ipv4/conf/%s/send_redirects"
@@ -518,6 +519,19 @@ getsocket6(int bufspace, struct interface *ifp)
   return sock;
 }
 
+void
+os_set_olsr_socketoptions(int sock) {
+  /* Set TOS */
+  int data = IPTOS_PREC(olsr_cnf->tos);
+  if (setsockopt(sock, SOL_SOCKET, SO_PRIORITY, (char *)&data, sizeof(data)) < 0) {
+    OLSR_WARN(LOG_INTERFACE, "setsockopt(SO_PRIORITY) error %s", strerror(errno));
+  }
+  data = IPTOS_TOS(olsr_cnf->tos);
+  if (setsockopt(sock, SOL_IP, IP_TOS, (char *)&data, sizeof(data)) < 0) {
+    OLSR_WARN(LOG_INTERFACE, "setsockopt(IP_TOS) error %s", strerror(errno));
+  }
+}
+
 int
 join_mcast(struct interface *ifs, int sock)
 {
index bab7968..f065e2b 100644 (file)
@@ -78,6 +78,8 @@ int getsocket(int, struct interface *);
 
 int getsocket6(int, struct interface *);
 
+void os_set_olsr_socketoptions(int socket);
+
 int get_ipv6_address(char *, struct sockaddr_in6 *, int);
 
 bool is_if_link_up(char *);
index 81e3ceb..6d1d15e 100644 (file)
 #define IPV6_ADDR_SITELOCAL    0x0040U
 #endif
 
+/* prototype declaration to break loop with interface.h */
+struct olsr_if_config;
+
 #include "interfaces.h"
 #include "olsr_ip_acl.h"
 #include "olsr_cfg_data.h"
index 5404101..62e6ba3 100644 (file)
@@ -62,6 +62,7 @@
 #include "../common/string.h"
 #include "../valgrind/valgrind.h"
 
+#include <assert.h>
 #include <signal.h>
 #include <sys/types.h>
 #include <net/if.h>
@@ -303,8 +304,8 @@ if_basename(const char *name)
  *@param so the socket to use for ioctls
  *
  */
-int
-chk_if_up(struct olsr_if_config *iface)
+struct interface *
+os_init_interface(struct olsr_if_config *iface)
 {
   struct interface *ifp;
   struct ifreq ifr;
@@ -317,9 +318,7 @@ chk_if_up(struct olsr_if_config *iface)
   /*
    * Sanity check.
    */
-  if (iface->interf) {
-    return -1;
-  }
+  assert (iface->interf == NULL);
   ifp = olsr_cookie_malloc(interface_mem_cookie);
 
    /*
@@ -472,9 +471,6 @@ chk_if_up(struct olsr_if_config *iface)
   }
   ifp->int_mtu -= olsr_cnf->ip_version == AF_INET6 ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;
 
-  /* Set up buffer */
-  net_add_buffer(ifp);
-
   OLSR_DEBUG(LOG_INTERFACE, "\tMTU - IPhdr: %d\n", ifp->int_mtu);
 
   OLSR_INFO(LOG_INTERFACE, "Adding interface %s\n", iface->name);
@@ -507,7 +503,7 @@ chk_if_up(struct olsr_if_config *iface)
     ifp->olsr_socket = getsocket(BUFSPACE, ifp);
     ifp->send_socket = getsocket(0, ifp);
 
-    if (ifp->olsr_socket < 0) {
+    if (ifp->olsr_socket < 0 || ifp->send_socket < 0) {
       OLSR_ERROR(LOG_INTERFACE, "Could not initialize socket... exiting!\n\n");
       olsr_exit(EXIT_FAILURE);
     }
@@ -522,79 +518,19 @@ chk_if_up(struct olsr_if_config *iface)
     ifp->olsr_socket = getsocket6(BUFSPACE, ifp);
     ifp->send_socket = getsocket6(0, ifp);
 
-    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 */
-    int data = IPTOS_PREC(olsr_cnf->tos);
-    if (setsockopt(ifp->olsr_socket, SOL_SOCKET, SO_PRIORITY, (char *)&data, sizeof(data)) < 0) {
-      OLSR_WARN(LOG_INTERFACE, "setsockopt(SO_PRIORITY) error %s", strerror(errno));
-    }
-    data = IPTOS_TOS(olsr_cnf->tos);
-    if (setsockopt(ifp->olsr_socket, SOL_IP, IP_TOS, (char *)&data, sizeof(data)) < 0) {
-      OLSR_WARN(LOG_INTERFACE, "setsockopt(IP_TOS) error %s", strerror(errno));
+    if (ifp->olsr_socket < 0 || ifp->send_socket < 0) {
+      OLSR_ERROR(LOG_INTERFACE, "Could not initialize socket... exiting!\n\n");
+      olsr_exit(EXIT_FAILURE);
     }
-  }
-#endif
-
-  /*
-   *Initialize sequencenumber as a random 16bit value
-   */
-  ifp->olsr_seqnum = random() & 0xFFFF;
-
-  /*
-   * Set main address if it's not set
-   */
-  if (olsr_ipcmp(&all_zero, &olsr_cnf->router_id) == 0) {
-    olsr_cnf->router_id = ifp->ip_addr;
-    OLSR_INFO(LOG_INTERFACE, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->router_id));
 
-    /* initialize representation of this node in tc_set */
-    olsr_change_myself_tc();
+    join_mcast(ifp, ifp->olsr_socket);
   }
 
-  /*
-   * Register functions for periodic message generation
-   */
-  ifp->hello_gen_timer =
-    olsr_start_timer(iface->cnf->hello_params.emission_interval,
-                     HELLO_JITTER, OLSR_TIMER_PERIODIC, &generate_hello, ifp, hello_gen_timer_cookie);
-  ifp->hello_interval = iface->cnf->hello_params.emission_interval;
-  ifp->hello_validity = iface->cnf->hello_params.validity_time;
-
-  ifp->mode = iface->cnf->mode;
-
-  /*
-   * Call possible ifchange functions registered by plugins
-   */
-  run_ifchg_cbs(ifp, IFCHG_IF_ADD);
-
-  /*
-   * The interface is ready, lock it.
-   */
-  lock_interface(ifp);
-
-  /*
-   * Link to config.
-   */
-  iface->interf = ifp;
-  lock_interface(iface->interf);
-
-  /* Queue */
-  list_add_before(&interface_head, &ifp->int_node);
-
-  return 1;
+  return ifp;
 
 cleanup:
   olsr_cookie_free(interface_mem_cookie, ifp);
-  return 0;
+  return NULL;
 }
 
 /*
index a3d9b7a..51f00e0 100644 (file)
@@ -41,8 +41,9 @@
 
 #include <winsock2.h>
 
-#include "interfaces.h"
 #include "olsr.h"
+#include "olsr_cfg.h"
+#include "interfaces.h"
 #include "parser.h"
 #include "defs.h"
 #include "net_os.h"
@@ -522,110 +523,63 @@ chk_if_changed(struct olsr_if_config *IntConf)
   return Res;
 }
 
-int
-chk_if_up(struct olsr_if_config *IntConf)
+struct interface *
+os_init_interface(struct olsr_if_config *IntConf)
 {
   struct ipaddr_str buf;
-  struct InterfaceInfo Info;
-  struct interface *New;
-  union olsr_ip_addr NullAddr;
-  struct sockaddr_in *AddrIn;
+  struct InterfaceInfo if_info;
+  struct interface *ifp;
+  struct sockaddr_in *if_addr;
   size_t name_size;
 
   if (olsr_cnf->ip_version == AF_INET6) {
-    OLSR_WARN(LOG_NETWORKING, "IPv6 not supported by chk_if_up()!\n");
-    return 0;
+    OLSR_ERROR(LOG_NETWORKING, "IPv6 not supported by win32!\n");
+    olsr_exit(1);
   }
 
-  if (GetIntInfo(&Info, IntConf->name) < 0)
+  if (GetIntInfo(&if_info, IntConf->name) < 0)
     return 0;
 
-  New = olsr_cookie_malloc(interface_mem_cookie);
+  ifp = olsr_cookie_malloc(interface_mem_cookie);
 
 #if 0
-  New->gen_properties = NULL;
+  ifp->gen_properties = NULL;
 #endif
-  AddrIn = &New->int_src.v4;
+  if_addr = &ifp->int_src.v4;
 
-  AddrIn->sin_family = AF_INET;
-  AddrIn->sin_port = 0;
-  AddrIn->sin_addr.s_addr = Info.Addr;
+  if_addr->sin_family = AF_INET;
+  if_addr->sin_port = 0;
+  if_addr->sin_addr.s_addr = if_info.Addr;
 
-  AddrIn = &New->int_multicast.v4;
+  if_addr = &ifp->int_multicast.v4;
 
-  AddrIn->sin_family = AF_INET;
-  AddrIn->sin_port = 0;
-  AddrIn->sin_addr.s_addr = Info.Broad;
+  if_addr->sin_family = AF_INET;
+  if_addr->sin_port = 0;
+  if_addr->sin_addr.s_addr = if_info.Broad;
 
   if (IntConf->cnf->ipv4_broadcast.v4.s_addr != 0)
-    AddrIn->sin_addr = IntConf->cnf->ipv4_broadcast.v4;
+    if_addr->sin_addr = IntConf->cnf->ipv4_broadcast.v4;
 
-  New->int_mtu = Info.Mtu;
+  ifp->int_mtu = if_info.Mtu;
 
   name_size = strlen(IntConf->name) + 1;
-  New->int_name = olsr_malloc(name_size, "Interface 2");
-  strscpy(New->int_name, IntConf->name, name_size);
-
-  New->olsr_seqnum = rand() & 0xffff;
-
-  OLSR_INFO(LOG_NETWORKING, "\tInterface %s set up for use with index %d\n\n", IntConf->name, New->if_index);
-
-  OLSR_INFO(LOG_NETWORKING, "\tMTU: %d\n", New->int_mtu);
-  OLSR_INFO(LOG_NETWORKING, "\tAddress: %s\n", ip4_to_string(&buf, New->int_src.v4.sin_addr));
-  OLSR_INFO(LOG_NETWORKING, "\tBroadcast address: %s\n", ip4_to_string(&buf, New->int_multicast.v4.sin_addr));
-
-  New->ip_addr.v4 = New->int_src.v4.sin_addr;
-
-  New->if_index = Info.Index;
-
-  OLSR_INFO(LOG_NETWORKING, "\tKernel index: %08x\n", New->if_index);
-
-  New->olsr_socket = getsocket(BUFSPACE, New);
-  New->send_socket = getsocket(0, New);
-
-  if (New->olsr_socket < 0) {
-    OLSR_ERROR(LOG_NETWORKING, "Could not initialize socket... exiting!\n\n");
-    olsr_exit(1);
-  }
-
-  add_olsr_socket(New->olsr_socket, &olsr_input, NULL, NULL, SP_PR_READ);
-
-  /* Queue */
-  list_init_node(&New->int_node);
-  list_add_before(&interface_head, &New->int_node);
-
-  IntConf->interf = New;
-  lock_interface(IntConf->interf);
-
-  memset(&NullAddr, 0, olsr_cnf->ipsize);
-
-  if (olsr_ipcmp(&NullAddr, &olsr_cnf->router_id) == 0) {
-    olsr_cnf->router_id = New->ip_addr;
-    OLSR_INFO(LOG_NETWORKING, "New main address: %s\n", olsr_ip_to_string(&buf, &olsr_cnf->router_id));
-  }
-
-  net_add_buffer(New);
+  ifp->int_name = olsr_malloc(name_size, "Interface 2");
+  strscpy(ifp->int_name, IntConf->name, name_size);
 
-  /*
-   * Register functions for periodic message generation
-   */
-  New->hello_gen_timer =
-    olsr_start_timer(IntConf->cnf->hello_params.emission_interval,
-                     HELLO_JITTER, OLSR_TIMER_PERIODIC, &generate_hello, New, hello_gen_timer_cookie);
+  ifp->olsr_seqnum = rand() & 0xffff;
 
-  New->hello_interval = (uint32_t) (IntConf->cnf->hello_params.emission_interval);
-  New->hello_validity = reltime_to_me(IntConf->cnf->hello_params.validity_time);
+  OLSR_INFO(LOG_NETWORKING, "\tInterface %s set up for use with index %d\n\n", IntConf->name, ifp->if_index);
 
-  New->mode = IntConf->cnf->mode;
+  OLSR_INFO(LOG_NETWORKING, "\tMTU: %d\n", ifp->int_mtu);
+  OLSR_INFO(LOG_NETWORKING, "\tAddress: %s\n", ip4_to_string(&buf, ifp->int_src.v4.sin_addr));
+  OLSR_INFO(LOG_NETWORKING, "\tBroadcast address: %s\n", ip4_to_string(&buf, ifp->int_multicast.v4.sin_addr));
 
-  /*
-   * Call possible ifchange functions registered by plugins
-   */
-  run_ifchg_cbs(New, IFCHG_IF_ADD);
+  ifp->ip_addr.v4 = ifp->int_src.v4.sin_addr;
 
-  lock_interface(New);
+  ifp->if_index = if_info.Index;
 
-  return 1;
+  OLSR_INFO(LOG_NETWORKING, "\tKernel index: %08x\n", ifp->if_index);
+  return ifp;
 }
 
 /*
index 0192fcd..5499c60 100644 (file)
@@ -183,6 +183,10 @@ getsocket6(int BuffSize, struct interface *ifp __attribute__ ((unused)))
   return Sock;
 }
 
+void
+os_set_olsr_socketoptions(int sock __attribute__ ((unused))) {
+}
+
 static OVERLAPPED RouterOver;
 
 int