Automated merge with http://gredler.at/hg/olsrd
authorBernd Petrovitsch <bernd@firmix.at>
Mon, 27 Oct 2008 23:17:14 +0000 (00:17 +0100)
committerBernd Petrovitsch <bernd@firmix.at>
Mon, 27 Oct 2008 23:17:14 +0000 (00:17 +0100)
23 files changed:
files/olsrd.conf.hemu.lq [new file with mode: 0644]
lib/bmf/src/NetworkInterfaces.c
lib/dyn_gw/src/olsrd_dyn_gw.c
lib/httpinfo/src/admin_interface.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/tas/src/plugin.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/olsrd_conf.h
src/cfgparser/oparse.y
src/generate_msg.c
src/main.c
src/olsr_cfg.h
src/packet.c
src/packet.h
src/parser.c
src/parser.h
src/process_package.c
src/rebuild_packet.c [deleted file]
src/rebuild_packet.h [deleted file]
src/scheduler.c
src/unix/ifnet.c
src/win32/ifnet.c

diff --git a/files/olsrd.conf.hemu.lq b/files/olsrd.conf.hemu.lq
new file mode 100644 (file)
index 0000000..2c85293
--- /dev/null
@@ -0,0 +1,21 @@
+DebugLevel     2
+IpVersion      4
+FIBMetric "flat"
+ClearScreen     yes
+UseHysteresis  no
+LinkQualityLevel       2
+Pollrate       0.05
+TcRedundancy   2
+MprCoverage    3
+    
+Interface "hemu0"
+{
+    HelloInterval      2.0
+    HelloValidityTime  20.0
+    TcInterval         5.0
+    TcValidityTime     30.0
+    MidInterval                5.0
+    MidValidityTime    30.0
+    HnaInterval                5.0
+    HnaValidityTime    30.0
+}
index 3e5b020..ee83109 100644 (file)
@@ -1437,8 +1437,8 @@ static int CreateInterface(
     /* For an OLSR-interface, copy the interface address and broadcast
      * address from the OLSR interface object. Downcast to correct sockaddr
      * subtype. */
-    newIf->intAddr.v4 = ((struct sockaddr_in *)&olsrIntf->int_addr)->sin_addr;
-    newIf->broadAddr.v4 = ((struct sockaddr_in *)&olsrIntf->int_broadaddr)->sin_addr;
+    newIf->intAddr.v4 = olsrIntf->int_addr.sin_addr;
+    newIf->broadAddr.v4 = olsrIntf->int_broadaddr.sin_addr;
   }
   else
   {
index 94a5b57..a11d410 100644 (file)
@@ -177,7 +177,7 @@ static int set_plugin_hna(const char *value, void *data __attribute__((unused)),
     }
 
     //printf("GOT: %s(%08x)",inet_ntoa(foo_addr),foo_addr.s_addr);
-    if (inet_pton(olsr_cnf->ip_version, s_netaddr, &temp_netmask) <= 0) {
+    if (inet_pton(olsr_cnf->ip_version, s_mask, &temp_netmask) <= 0) {
         OLSR_PRINTF(0, "Illegal netmask \"%s\"", s_netaddr);
         return 1;
     }
@@ -185,7 +185,7 @@ static int set_plugin_hna(const char *value, void *data __attribute__((unused)),
     //printf("/%s(%08x)\n",inet_ntoa(foo_addr),foo_addr.s_addr);
     //printf("%s():got->%s/%s\n",__func__,olsr_ip_to_string((union olsr_ip_addr *)&));
     the_hna_list = add_to_hna_list(the_hna_list, &temp_net, olsr_netmask_to_prefix(&temp_netmask));
-    if (the_hna_list != NULL) {
+    if (the_hna_list == NULL) {
         return 1;
     }
     return 0;
index d6b60b1..68d4232 100644 (file)
@@ -78,7 +78,7 @@ build_admin_body(char *buf, olsr_u32_t bufsize __attribute__((unused)))
   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_int,
                  "Debug level:", "debug_level", 2, olsr_cnf->debug_level);
   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_float,
-                 "Pollrate:", "pollrate", 4, olsr_cnf->pollrate);
+                  "Pollrate:", "pollrate", 4, conv_pollrate_to_secs(olsr_cnf->pollrate));
   size += snprintf(&buf[size], bufsize-size, admin_basic_setting_string,
                  "TOS:", "tos", 6, "TBD");
 
@@ -265,10 +265,10 @@ process_param(char *key, char *value)
     {
       float fval = 1.1;
       sscanf(value, "%f", &fval);
-      if((fval < 0.0) || (fval > 1.0))
+      if (check_pollrate(&fval) < 0) {
        return -1;
-
-      olsr_cnf->pollrate = fval;
+      }
+      olsr_cnf->pollrate = conv_pollrate_to_microsecs(fval);
       return 1;
     }
 
index 9a3f710..3d536eb 100644 (file)
@@ -840,7 +840,7 @@ static int build_config_body(char *buf, olsr_u32_t bufsize)
 
     size += snprintf(&buf[size], bufsize-size, "</tr>\n<tr>\n");
 
-    size += snprintf(&buf[size], bufsize-size, "<td>Pollrate: %0.2f</td>\n", olsr_cnf->pollrate);
+    size += snprintf(&buf[size], bufsize-size, "<td>Pollrate: %0.2f</td>\n", conv_pollrate_to_secs(olsr_cnf->pollrate));
     size += snprintf(&buf[size], bufsize-size, "<td>TC redundancy: %d</td>\n", olsr_cnf->tc_redundancy);
     size += snprintf(&buf[size], bufsize-size, "<td>MPR coverage: %d</td>\n", olsr_cnf->mpr_coverage);
     size += snprintf(&buf[size], bufsize-size, "<td>NAT threshold: %f</td>\n", olsr_cnf->lq_nat_thresh);
@@ -1179,11 +1179,11 @@ static int build_cfgfile_body(char *buf, olsr_u32_t bufsize)
            olsrd_write_cnf_buf
         */
         char tmpBuf[10000];
-        size = olsrd_write_cnf_buf(olsr_cnf, tmpBuf, 10000);
+        size = olsrd_write_cnf_buf(olsr_cnf, OLSR_TRUE, tmpBuf, 10000);
         snprintf(&buf[size], bufsize-size, tmpBuf);
   }
 #else
-  size += olsrd_write_cnf_buf(olsr_cnf, &buf[size], bufsize-size);
+  size += olsrd_write_cnf_buf(olsr_cnf, OLSR_TRUE, &buf[size], bufsize-size);
 #endif
 
   if (size < 0) {
index 82a8988..4235fd0 100644 (file)
@@ -76,12 +76,8 @@ int olsrd_plugin_interface_version(void);
 int olsrd_plugin_register_param(char *name, char *value);
 int olsrd_plugin_init(void);
 
-static int ipAddrLen;
-static union olsr_ip_addr *mainAddr;
-
 static struct interface *intTab = NULL;
 static struct neighbor_entry *neighTab = NULL;
-static struct olsrd_config *config = NULL;
 
 static int iterIndex;
 #if 0
@@ -110,9 +106,9 @@ int iterLinkTabNext(char *buff, int len)
     return -1;
 
   snprintf(buff, len, "local~%s~remote~%s~main~%s~hysteresis~%f~cost~%s~",
-           rawIpAddrToString(&iterLinkTab->local_iface_addr, ipAddrLen),
-           rawIpAddrToString(&iterLinkTab->neighbor_iface_addr, ipAddrLen),
-           rawIpAddrToString(&iterLinkTab->neighbor->neighbor_main_addr, ipAddrLen),
+           rawIpAddrToString(&iterLinkTab->local_iface_addr, olsr_cnf->ipsize),
+           rawIpAddrToString(&iterLinkTab->neighbor_iface_addr, olsr_cnf->ipsize),
+           rawIpAddrToString(&iterLinkTab->neighbor->neighbor_main_addr, olsr_cnf->ipsize),
            iterLinkTab->L_link_quality,
            get_linkcost_text(iterLinkTab->linkcost, OLSR_FALSE, &lqbuffer));
 
@@ -150,7 +146,7 @@ int iterNeighTabNext(char *buff, int len)
 
   res = snprintf(buff, len,
                  "main~%s~symmetric~%s~mpr~%s~mprs~%s~willingness~%d~[~neighbors2~",
-                 rawIpAddrToString(&iterNeighTab->neighbor_main_addr, ipAddrLen),
+                 rawIpAddrToString(&iterNeighTab->neighbor_main_addr, olsr_cnf->ipsize),
                  iterNeighTab->status == SYM ? "true" : "false",
                  iterNeighTab->is_mpr != 0 ? "true" : "false",
                  olsr_lookup_mprs_set(&iterNeighTab->neighbor_main_addr) != NULL ?
@@ -170,7 +166,7 @@ int iterNeighTabNext(char *buff, int len)
   {
     res = snprintf(buff, len, "%d~%s~", i,
                    rawIpAddrToString(&neigh2->neighbor_2->neighbor_2_addr,
-                                     ipAddrLen));
+                                     olsr_cnf->ipsize));
 
     if (res < len)
       buff += res;
@@ -225,8 +221,8 @@ int iterRouteTabNext(char *buff, int len)
     return -1;
 
   snprintf(buff, len, "destination~%s~gateway~%s~interface~%s~metric~%d~",
-           rawIpAddrToString(&iterRouteTab->rt_dst.prefix, ipAddrLen),
-           rawIpAddrToString(&iterRouteTab->rt_best->rtp_nexthop.gateway, ipAddrLen),
+           rawIpAddrToString(&iterRouteTab->rt_dst.prefix, olsr_cnf->ipsize),
+           rawIpAddrToString(&iterRouteTab->rt_best->rtp_nexthop.gateway, olsr_cnf->ipsize),
            if_ifwithindex_name(iterRouteTab->rt_best->rtp_nexthop.iif_index),
            iterRouteTab->rt_best->rtp_metric.hops);
 
@@ -278,7 +274,7 @@ int iterTcTabNext(char *buff, int len)
 
   res = snprintf(buff, len,
                  "main~%s~[~destinations~",
-                 rawIpAddrToString(&iterTcTab->addr, ipAddrLen));
+                 rawIpAddrToString(&iterTcTab->addr, olsr_cnf->ipsize));
 
   len -= res;
   buff += res;
@@ -289,7 +285,7 @@ int iterTcTabNext(char *buff, int len)
   OLSR_FOR_ALL_TC_EDGE_ENTRIES(iterTcTab, tc_edge) {
 
     res = snprintf(buff, len, "[~%d~address~%s~cost~%s~]~", i,
-                   rawIpAddrToString(&tc_edge->T_dest_addr, ipAddrLen),
+                   rawIpAddrToString(&tc_edge->T_dest_addr, olsr_cnf->ipsize),
                    get_linkcost_text(tc_edge->cost, OLSR_FALSE, &lqbuffer));
 
     if (res < len)
@@ -330,7 +326,7 @@ static void parserFunc(union olsr_message *msg,
   char *service, *string;
   int i;
 
-  if (memcmp(orig, mainAddr, ipAddrLen) == 0)
+  if (memcmp(orig, &olsr_cnf->main_addr, olsr_cnf->ipsize) == 0)
     return;
 
   if (check_neighbor_link(neighIntAddr) != SYM_LINK)
@@ -339,14 +335,14 @@ static void parserFunc(union olsr_message *msg,
     return;
   }
 
-  if (len < ipAddrLen + 8 + 2)
+  if (len < (int)olsr_cnf->ipsize + 8 + 2)
   {
     error("short TAS message received (%d bytes)\n", len);
     return;
   }
 
-    len -= ipAddrLen + 8;
-    service = mess + ipAddrLen + 8;
+    len -= olsr_cnf->ipsize + 8;
+    service = mess + olsr_cnf->ipsize + 8;
 
     for (i = 0; i < len && service[i] != 0; i++);
 
@@ -373,7 +369,7 @@ static void parserFunc(union olsr_message *msg,
       return;
     }
 
-    httpAddTasMessage(service, string, rawIpAddrToString(orig, ipAddrLen));
+    httpAddTasMessage(service, string, rawIpAddrToString(orig, olsr_cnf->ipsize));
 
   olsr_forward_message(msg, neighIntAddr);
 }
@@ -385,7 +381,7 @@ void sendMessage(const char *service, const char *string)
   unsigned short seqNo;
   struct interface *inter;
 
-  pad = len = ipAddrLen + 8 + strlen(service) + 1 + strlen(string) + 1;
+  pad = len = olsr_cnf->ipsize + 8 + strlen(service) + 1 + strlen(string) + 1;
 
   len = 1 + ((len - 1) | 3);
 
@@ -400,8 +396,8 @@ void sendMessage(const char *service, const char *string)
   *walker++ = (unsigned char)(len >> 8);
   *walker++ = (unsigned char)len;
 
-  memcpy(walker, mainAddr, ipAddrLen);
-  walker += ipAddrLen;
+  memcpy(walker, &olsr_cnf->main_addr, olsr_cnf->ipsize);
+  walker += olsr_cnf->ipsize;
 
   *walker++ = 255;
   *walker++ = 0;
@@ -444,7 +440,7 @@ static void serviceFunc(void *context __attribute__((unused)))
   }
 
   if (up != 0)
-    httpService((int)(1.0 / config->pollrate));
+    httpService((int)(1.0 / conv_pollrate_to_secs(olsr_cnf->pollrate)));
 }
 
 int olsrd_plugin_interface_version(void)
@@ -454,12 +450,8 @@ int olsrd_plugin_interface_version(void)
 
 int olsrd_plugin_init(void)
 {
-  ipAddrLen = olsr_cnf->ipsize;
-  mainAddr = &olsr_cnf->main_addr;
-
   intTab = ifnet;
   neighTab = neighbortable;
-  config = olsr_cnf;
 
   httpInit();
   
index 900d681..9a58610 100644 (file)
 
 
 int
-olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
+olsrd_write_cnf(const struct olsrd_config *cnf, const char *fname)
 {
-  struct ip_prefix_list   *h  = cnf->hna_entries;
-  struct olsr_if          *in = cnf->interfaces;
-  struct plugin_entry     *pe = cnf->plugins;
-  struct plugin_param     *pp;
-  struct ip_prefix_list   *ie = cnf->ipc_nets;
-  struct olsr_lq_mult     *mult;
-
-  char ipv6_buf[100];             /* buffer for IPv6 inet_htop */
-
-  FILE *fd;
-
-  fd = fopen(fname, "w");
-
-  if(fd == NULL)
-    {
-      fprintf(stderr, "Could not open file %s for writing\n%s\n", fname, strerror(errno));
-      return -1;
-    }
-
-  printf("Writing config to file \"%s\".... ", fname);
-
-  fprintf(fd, "#\n# Configuration file for s%s\n# automatically generated by olsrd-cnf parser v. %s\n#\n\n", olsrd_version, PARSER_VERSION);
-
-  /* Debug level */
-  fprintf(fd, "# Debug level(0-9)\n# If set to 0 the daemon runs in the background\n\nDebugLevel\t%d\n\n", cnf->debug_level);
-
-  /* IP version */
-  fprintf(fd, "# IP version to use (4 or 6)\n\nIpVersion\t%d\n\n", cnf->ip_version == AF_INET ? 4 : 6);
-
-  /* FIB Metric */
-  fprintf(fd, "# FIBMetric (\"%s\", \"%s\", or \"%s\")\n\nFIBMetric\t\"%s\"\n\n", CFG_FIBM_FLAT, CFG_FIBM_CORRECT, CFG_FIBM_APPROX,
-    FIBM_FLAT == cnf->fib_metric ? CFG_FIBM_FLAT : FIBM_CORRECT == cnf->fib_metric ? CFG_FIBM_CORRECT : CFG_FIBM_APPROX);
-
-  /* HNA IPv4/IPv6 */
-  fprintf(fd, "# HNA IPv%d routes\n# syntax: netaddr/prefix\n\nHna%d {\n", cnf->ip_version == AF_INET ? 4 : 6, cnf->ip_version == AF_INET ? 4 : 6);
-  while(h) {
-    struct ipprefix_str strbuf;
-    fprintf(fd, "    %s\n", olsr_ip_prefix_to_string(&strbuf, &h->net));
-    h = h->next;
-  }
-  fprintf(fd, "}\n\n");
-
-  /* No interfaces */
-  fprintf(fd, "# Should olsrd keep on running even if there are\n# no interfaces available? This is a good idea\n# for a PCMCIA/USB hotswap environment.\n# \"yes\" OR \"no\"\n\nAllowNoInt\t");
-  if(cnf->allow_no_interfaces)
-    fprintf(fd, "yes\n\n");
-  else
-    fprintf(fd, "no\n\n");
-
-  /* TOS */
-  fprintf(fd, "# TOS(type of service) to use. Default is 16\n\n");
-  fprintf(fd, "TosValue\t%d\n\n", cnf->tos);
-
-  /* RtTable */
-  fprintf(fd, "# Policy Routing Table to use. Default is 254\n\n");
-  fprintf(fd, "RtTable\t\t%d\n\n", cnf->rttable);
-
-  /* RtTableDefault */
-  fprintf(fd, "# Policy Routing Table to use for the default Route. Default is 0 (Take the same table as specified by RtTable)\n\n");
-  fprintf(fd, "RtTableDefault\t\t%d\n\n", cnf->rttable_default);
-
-  /* Willingness */
-  fprintf(fd, "# The fixed willingness to use(0-7)\n# If not set willingness will be calculated\n# dynammically based on battery/power status\n\n");
-  if(cnf->willingness_auto)
-    fprintf(fd, "#Willingness\t4\n\n");
-  else
-    fprintf(fd, "Willingness\t%d\n\n", cnf->willingness);
-
-  /* IPC */
-  fprintf(fd, "# Allow processes like the GUI front-end\n# to connect to the daemon.\n\n");
-  fprintf(fd, "IpcConnect {\n");
-  fprintf(fd, "    MaxConnections\t%d\n", cnf->ipc_connections);
-
-  while (ie) {
-    if (ie->net.prefix_len == olsr_cnf->maxplen) {
-      struct ipaddr_str strbuf;
-      fprintf(fd, "    Host\t\t%s\n", olsr_ip_to_string(&strbuf, &ie->net.prefix));
-    } else {
-      struct ipprefix_str strbuf;
-      fprintf(fd, "    Net\t\t\t%s\n", olsr_ip_prefix_to_string(&strbuf, &ie->net));
-    }
-    ie = ie->next;
-  }
-
-  fprintf(fd, "}\n\n");
-
-  /* Hysteresis */
-  fprintf(fd, "# Hysteresis adds more robustness to the\n# link sensing.\n# Used by default. 'yes' or 'no'\n\n");
-
-  if(cnf->use_hysteresis)
-    {
-      fprintf(fd, "UseHysteresis\tyes\n\n");
-      fprintf(fd, "# Hysteresis parameters\n# Do not alter these unless you know \n# what you are doing!\n# Set to auto by default. Allowed\n# values are floating point values\n# in the interval 0,1\n# THR_LOW must always be lower than\n# THR_HIGH!!\n\n");
-      fprintf(fd, "HystScaling\t%0.2f\n", cnf->hysteresis_param.scaling);
-      fprintf(fd, "HystThrHigh\t%0.2f\n", cnf->hysteresis_param.thr_high);
-      fprintf(fd, "HystThrLow\t%0.2f\n\n", cnf->hysteresis_param.thr_low);
-    }
-  else
-    {
-      fprintf(fd, "UseHysteresis\tno\n\n");
-      fprintf(fd, "# Hysteresis parameters\n# Do not alter these unless you know \n# what you are doing!\n# Set to auto by default. Allowed\n# values are floating point values\n# in the interval 0,1\n# THR_LOW must always be lower than\n# THR_HIGH!!\n\n");
-      fprintf(fd, "#HystScaling\t%0.2f\n", cnf->hysteresis_param.scaling);
-      fprintf(fd, "#HystThrHigh\t%0.2f\n", cnf->hysteresis_param.thr_high);
-      fprintf(fd, "#HystThrLow\t%0.2f\n\n", cnf->hysteresis_param.thr_low);
-    }
-
-  /* Pollrate */
-  fprintf(fd, "# Polling rate in seconds(float).\n# Auto uses default value 0.05 sec\n\n");
-  fprintf(fd, "Pollrate\t%0.2f\n", cnf->pollrate);
-
-  /* NIC Changes Pollrate */
-  fprintf(fd, "# Interval to poll network interfaces for configuration\n# changes. Defaults to 2.5 seconds\n");
-  fprintf(fd, "NicChgsPollInt\t%0.2f\n", cnf->nic_chgs_pollrate);
-
-  /* TC redundancy */
-  fprintf(fd, "# TC redundancy\n# Specifies how much neighbor info should\n# be sent in TC messages\n# Possible values are:\n# 0 - only send MPR selectors\n# 1 - send MPR selectors and MPRs\n# 2 - send all neighbors\n#\n# defaults to 0\n\n");
-  fprintf(fd, "TcRedundancy\t%d\n\n", cnf->tc_redundancy);
-
-  /* MPR coverage */
-  fprintf(fd, "# MPR coverage\n# Specifies how many MPRs a node should\n# try select to reach every 2 hop neighbor\n# Can be set to any integer >0\n# defaults to 1\n\n");
-
-  fprintf(fd, "MprCoverage\t%d\n\n", cnf->mpr_coverage);
-
-  fprintf(fd, "# Link quality level\n# 0 = do not use link quality\n# 1 = use link quality for MPR selection\n# 2 = use link quality for MPR selection and routing\n\n");
-  fprintf(fd, "LinkQualityLevel\t%d\n\n", cnf->lq_level);
-
-  fprintf(fd, "# Fish Eye algorithm\n# 0 = do not use fish eye\n# 1 = use fish eye\n\n");
-  fprintf(fd, "LinkQualityFishEye\t%d\n\n", cnf->lq_fish);
-
-  if (NULL != cnf->lq_algorithm)
-  {
-    fprintf(fd, "# Link quality algorithm (if LinkQualityLevel > 0)\n# etx_fpm (hello loss, fixed point math)\n# etx_float (hello loss, floating point)\n# etx_ff (packet loss for freifunk compat)\n\n");
-    fprintf(fd, "LinkQualityAlgorithm\t\"%s\"\n\n", cnf->lq_algorithm);
+  char buf[10000];
+  FILE *fd = fopen(fname, "w");
+  if(fd == NULL) {
+    fprintf(stderr, "Could not open file %s for writing\n%s\n", fname, strerror(errno));
+    return -1;
   }
 
-  fprintf(fd, "# Link quality aging factor\n\n");
-  fprintf(fd, "LinkQualityAging\t%f\n\n", cnf->lq_aging);
-
-  fprintf(fd, "# NAT threshold\n\n");
-  fprintf(fd, "NatThreshold\t%f\n\n", cnf->lq_nat_thresh);
-
-  fprintf(fd, "# Clear screen when printing debug output?\n\n");
-  fprintf(fd, "ClearScreen\t%s\n\n", cnf->clear_screen ? "yes" : "no");
-
-  /* Plugins */
-  fprintf(fd, "# Olsrd plugins to load\n# This must be the absolute path to the file\n# or the loader will use the following scheme:\n# - Try the paths in the LD_LIBRARY_PATH \n#   environment variable.\n# - The list of libraries cached in /etc/ld.so.cache\n# - /lib, followed by /usr/lib\n\n");
-  if(pe)
-    {
-      while(pe)
-       {
-         fprintf(fd, "LoadPlugin \"%s\" {\n", pe->name);
-          pp = pe->params;
-          while(pp)
-            {
-              fprintf(fd, "    PlParam \"%s\"\t\"%s\"\n", pp->key, pp->value);
-              pp = pp->next;
-            }
-         fprintf(fd, "}\n");
-         pe = pe->next;
-       }
-    }
-  fprintf(fd, "\n");
-
-  
-  
-
-  /* Interfaces */
-  fprintf(fd, "# Interfaces\n# Multiple interfaces with the same configuration\n# can shar the same config block. Just list the\n# interfaces(e.g. Interface \"eth0\" \"eth2\"\n\n");
-  /* Interfaces */
-  if(in)
-    {
-      while(in)
-       {
-         fprintf(fd, "Interface \"%s\" {\n", in->name);
-         fprintf(fd, "\n");
-      
-         fprintf(fd, "    # IPv4 broadcast address to use. The\n    # one usefull example would be 255.255.255.255\n    # If not defined the broadcastaddress\n    # every card is configured with is used\n\n");
-
-
-         if(in->cnf->ipv4_broadcast.v4.s_addr)
-           {
-             fprintf(fd, "    Ip4Broadcast\t%s\n\n", inet_ntoa(in->cnf->ipv4_broadcast.v4));
-           }
-         else
-           {
-             fprintf(fd, "    #Ip4Broadcast\t255.255.255.255\n\n");
-           }
-         
-         
-         fprintf(fd, "    # IPv6 address scope to use.\n    # Must be 'site-local' or 'global'\n\n");
-         if(in->cnf->ipv6_addrtype)
-           fprintf(fd, "    Ip6AddrType \tsite-local\n\n");
-         else
-           fprintf(fd, "    Ip6AddrType \tglobal\n\n");
-         
-         fprintf(fd, "    # IPv6 multicast address to use when\n    # using site-local addresses.\n    # If not defined, ff05::15 is used\n");
-         fprintf(fd, "    Ip6MulticastSite\t%s\n\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multi_site.v6, ipv6_buf, sizeof(ipv6_buf)));
-         fprintf(fd, "    # IPv6 multicast address to use when\n    # using global addresses\n    # If not defined, ff0e::1 is used\n");
-         fprintf(fd, "    Ip6MulticastGlobal\t%s\n\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multi_glbl.v6, ipv6_buf, sizeof(ipv6_buf)));
-         
-         
-          fprintf(fd, "    # Olsrd can autodetect changes in\n    # interface configurations. Enabled by default\n    # turn off to save CPU.\n    AutoDetectChanges: %s\n", in->cnf->autodetect_chg ? "yes" : "no");
-
-         fprintf(fd, "    # Emission and validity intervals.\n    # If not defined, RFC proposed values will\n    # in most cases be used.\n\n");
-         
-         
-         if(in->cnf->hello_params.emission_interval != HELLO_INTERVAL)
-           fprintf(fd, "    HelloInterval\t%0.2f\n", in->cnf->hello_params.emission_interval);
-         else
-           fprintf(fd, "    #HelloInterval\t%0.2f\n", in->cnf->hello_params.emission_interval);
-         if(in->cnf->hello_params.validity_time != NEIGHB_HOLD_TIME)
-           fprintf(fd, "    HelloValidityTime\t%0.2f\n", in->cnf->hello_params.validity_time);
-         else
-           fprintf(fd, "    #HelloValidityTime\t%0.2f\n", in->cnf->hello_params.validity_time);
-         if(in->cnf->tc_params.emission_interval != TC_INTERVAL)
-           fprintf(fd, "    TcInterval\t\t%0.2f\n", in->cnf->tc_params.emission_interval);
-         else
-           fprintf(fd, "    #TcInterval\t\t%0.2f\n", in->cnf->tc_params.emission_interval);
-         if(in->cnf->tc_params.validity_time != TOP_HOLD_TIME)
-           fprintf(fd, "    TcValidityTime\t%0.2f\n", in->cnf->tc_params.validity_time);
-         else
-           fprintf(fd, "    #TcValidityTime\t%0.2f\n", in->cnf->tc_params.validity_time);
-         if(in->cnf->mid_params.emission_interval != MID_INTERVAL)
-           fprintf(fd, "    MidInterval\t\t%0.2f\n", in->cnf->mid_params.emission_interval);
-         else
-           fprintf(fd, "    #MidInterval\t%0.2f\n", in->cnf->mid_params.emission_interval);
-         if(in->cnf->mid_params.validity_time != MID_HOLD_TIME)
-           fprintf(fd, "    MidValidityTime\t%0.2f\n", in->cnf->mid_params.validity_time);
-         else
-           fprintf(fd, "    #MidValidityTime\t%0.2f\n", in->cnf->mid_params.validity_time);
-         if(in->cnf->hna_params.emission_interval != HNA_INTERVAL)
-           fprintf(fd, "    HnaInterval\t\t%0.2f\n", in->cnf->hna_params.emission_interval);
-         else
-           fprintf(fd, "    #HnaInterval\t%0.2f\n", in->cnf->hna_params.emission_interval);
-         if(in->cnf->hna_params.validity_time != HNA_HOLD_TIME)
-           fprintf(fd, "    HnaValidityTime\t%0.2f\n", in->cnf->hna_params.validity_time);       
-         else
-           fprintf(fd, "    #HnaValidityTime\t%0.2f\n", in->cnf->hna_params.validity_time);      
-         
-          mult = in->cnf->lq_mult;
-
-          if (mult == NULL)
-           {
-             fprintf(fd, "    #LinkQualityMult\tdefault 1.0\n");
-           }
-          else
-           {
-             while (mult != NULL)
-               {
-                 fprintf(fd, "    LinkQualityMult\t%s %0.2f\n", inet_ntop(cnf->ip_version, &mult->addr, ipv6_buf, sizeof(ipv6_buf)), (float)(mult->value) / 65536.0);
-                 mult = mult->next;
-               }
-           }
-
-         fprintf(fd, "    # When multiple links exist between hosts\n");
-         fprintf(fd, "    # the weight of interface is used to determine\n");
-         fprintf(fd, "    # the link to use. Normally the weight is\n");
-         fprintf(fd, "    # automatically calculated by olsrd based\n");
-         fprintf(fd, "    # on the characteristics of the interface,\n");
-         fprintf(fd, "    # but here you can specify a fixed value.\n");
-         fprintf(fd, "    # Olsrd will choose links with the lowest value.\n");
-         fprintf(fd, "    # Note:\n");
-         fprintf(fd, "    # Interface weight is used only when LinkQualityLevel is 0.\n");
-         fprintf(fd, "    # For any other value of LinkQualityLevel, the interface ETX\n");
-         fprintf(fd, "    # value is used instead.\n\n");
-         if(in->cnf->weight.fixed)
-           {
-             fprintf(fd, "    Weight\t %d\n\n", in->cnf->weight.value);
-           }
-         else
-           {
-             fprintf(fd, "    #Weight\t 0\n\n");
-           }
-
-         
-         fprintf(fd, "}\n\n");
-         in = in->next;
-       }
-
-    }
-
+  printf("Writing config to file \"%s\".... ", fname);
 
-  fprintf(fd, "\n# END AUTOGENERATED CONFIG\n");
+  olsrd_write_cnf_buf(cnf, OLSR_FALSE, buf, sizeof(buf));
+  fputs(buf, fd);
 
   fclose(fd);
   printf("DONE\n");
@@ -354,7 +82,7 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
     } while (0)
 
 int
-olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
+olsrd_write_cnf_buf(const struct olsrd_config *cnf, olsr_bool write_more_comments, char *buf, olsr_u32_t bufsize)
 {
   struct ip_prefix_list   *h  = cnf->hna_entries;
   struct olsr_if           *in = cnf->interfaces;
@@ -367,14 +95,11 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
 
   char ipv6_buf[100];             /* buffer for IPv6 inet_htop */
 
-#if 0
-  printf("\n\n\n\nolsrd_write_cnf_buf bufsize  %d\n\n\n\n\n", bufsize);
-#endif
   if (buf == NULL || bufsize < MAX_LINESIZE) {
       return -1;
   }
 
-  WRITE_TO_BUF("#\n# Configuration file for olsr.org olsrd\n# automatically generated by olsrd-cnf %s\n#\n\n\n", PARSER_VERSION);
+  WRITE_TO_BUF("#\n# Configuration file for %s\n# automatically generated by olsrd-cnf parser v.  %s\n#\n\n", olsrd_version, PARSER_VERSION);
 
   /* Debug level */
   WRITE_TO_BUF("# Debug level(0-9)\n# If set to 0 the daemon runs in the background\n\nDebugLevel\t%d\n\n", cnf->debug_level);
@@ -387,7 +112,7 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
     FIBM_FLAT == cnf->fib_metric ? CFG_FIBM_FLAT : FIBM_CORRECT == cnf->fib_metric ? CFG_FIBM_CORRECT : CFG_FIBM_APPROX);
 
   /* HNA IPv4/IPv6 */
-  WRITE_TO_BUF("# HNA IPv%1$d routes\n# syntax: netaddr netmask\n\nHna%1$d {\n", cnf->ip_version == AF_INET ? 4 : 6);
+  WRITE_TO_BUF("# HNA IPv%d routes\n# syntax: netaddr/prefix\n\nHna%d {\n", cnf->ip_version == AF_INET ? 4 : 6, cnf->ip_version == AF_INET ? 4 : 6);
   while(h) {
     struct ipprefix_str strbuf;
     WRITE_TO_BUF("    %s\n", olsr_ip_prefix_to_string(&strbuf, &h->net));
@@ -407,9 +132,13 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
   WRITE_TO_BUF("TosValue\t%d\n\n", cnf->tos);
 
   /* RtTable */
-  WRITE_TO_BUF("# Policy Routing Tableto use. Default is 254\n\n");
+  WRITE_TO_BUF("# Policy Routing Table to use. Default is 254\n\n");
   WRITE_TO_BUF("RtTable\t\t%d\n\n", cnf->rttable);
 
+  /* RtTableDefault */
+  WRITE_TO_BUF("# Policy Routing Table to use for the default Route. Default is 0 (Take the same table as specified by RtTable)\n\n");
+  WRITE_TO_BUF("RtTableDefault\t\t%d\n\n", cnf->rttable_default);
+
   /* Willingness */
   WRITE_TO_BUF("# The fixed willingness to use(0-7)\n# If not set willingness will be calculated\n# dynammically based on battery/power status\n\n");
   if(cnf->willingness_auto)
@@ -421,6 +150,7 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
   WRITE_TO_BUF("# Allow processes like the GUI front-end\n# to connect to the daemon.\n\n");
   WRITE_TO_BUF("IpcConnect {\n");
   WRITE_TO_BUF("    MaxConnections\t%d\n", cnf->ipc_connections);
+
   while (ie) {
     if (ie->net.prefix_len == olsr_cnf->maxplen) {
       struct ipaddr_str strbuf;
@@ -456,7 +186,11 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
 
   /* Pollrate */
   WRITE_TO_BUF("# Polling rate in seconds(float).\n# Auto uses default value 0.05 sec\n\n");
-  WRITE_TO_BUF("Pollrate\t%0.2f\n", cnf->pollrate);
+  WRITE_TO_BUF("Pollrate\t%0.2f\n", conv_pollrate_to_secs(cnf->pollrate));
+
+  /* NIC Changes Pollrate */
+  WRITE_TO_BUF("# Interval to poll network interfaces for configuration\n# changes. Defaults to 2.5 seconds\n");
+  WRITE_TO_BUF("NicChgsPollInt\t%0.2f\n", cnf->nic_chgs_pollrate);
 
   /* TC redundancy */
   WRITE_TO_BUF("# TC redundancy\n# Specifies how much neighbor info should\n# be sent in TC messages\n# Possible values are:\n# 0 - only send MPR selectors\n# 1 - send MPR selectors and MPRs\n# 2 - send all neighbors\n#\n# defaults to 0\n\n");
@@ -470,6 +204,15 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
   WRITE_TO_BUF("# Link quality level\n# 0 = do not use link quality\n# 1 = use link quality for MPR selection\n# 2 = use link quality for MPR selection and routing\n\n");
   WRITE_TO_BUF("LinkQualityLevel\t%d\n\n", cnf->lq_level);
 
+  WRITE_TO_BUF("# Fish Eye algorithm\n# 0 = do not use fish eye\n# 1 = use fish eye\n\n");
+  WRITE_TO_BUF("LinkQualityFishEye\t%d\n\n", cnf->lq_fish);
+
+  if (NULL != cnf->lq_algorithm)
+  {
+    WRITE_TO_BUF("# Link quality algorithm (if LinkQualityLevel > 0)\n# etx_fpm (hello loss, fixed point math)\n# etx_float (hello loss, floating point)\n# etx_ff (packet loss for freifunk compat)\n\n");
+    WRITE_TO_BUF("LinkQualityAlgorithm\t\"%s\"\n\n", cnf->lq_algorithm);
+  }
+
   WRITE_TO_BUF("# Link quality aging factor\n\n");
   WRITE_TO_BUF("LinkQualityAging\t%f\n\n", cnf->lq_aging);
 
@@ -503,12 +246,11 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
   
 
   /* Interfaces */
-  WRITE_TO_BUF("# Interfaces\n# Multiple interfaces with the same configuration\n");
-  WRITE_TO_BUF("# can shar the same config block. Just list the\n# interfaces(e.g. Interface \"eth0\" \"eth2\"\n\n");
+  WRITE_TO_BUF("# Interfaces\n# Multiple interfaces with the same configuration\n# can shar the same config block. Just list the\n# interfaces(e.g. Interface \"eth0\" \"eth2\"\n\n");
   /* Interfaces */
   if(in)
     {
-      olsr_bool first = OLSR_TRUE;
+      olsr_bool first = write_more_comments;
       while(in)
        {
          WRITE_TO_BUF("Interface \"%s\" {\n", in->name);
@@ -546,8 +288,10 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
            WRITE_TO_BUF("    # IPv6 multicast address to use when\n    # using global addresses\n    # If not defined, ff0e::1 is used\n");
          WRITE_TO_BUF("    Ip6MulticastGlobal\t%s\n", inet_ntop(AF_INET6, &in->cnf->ipv6_multi_glbl.v6, ipv6_buf, sizeof(ipv6_buf)));
           if(first) WRITE_TO_BUF("\n");
+  
          
-         
+          WRITE_TO_BUF("    # Olsrd can autodetect changes in\n    # interface configurations. Enabled by default\n    # turn off to save CPU.\n    AutoDetectChanges: %s\n", in->cnf->autodetect_chg ? "yes" : "no");
+
           if(first)
             WRITE_TO_BUF("    # Emission and validity intervals.\n    # If not defined, RFC proposed values will\n    # in most cases be used.\n\n");
          
@@ -596,24 +340,24 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
            {
              while (mult != NULL)
                {
-                 WRITE_TO_BUF("    LinkQualityMult\t%s %0.2f\n", inet_ntop(cnf->ip_version, &mult->addr, ipv6_buf, sizeof (ipv6_buf)), (float)(mult->value) / 65536.0);
+                 WRITE_TO_BUF("    LinkQualityMult\t%s %0.2f\n", inet_ntop(cnf->ip_version, &mult->addr, ipv6_buf, sizeof(ipv6_buf)), (float)(mult->value) / 65536.0);
                  mult = mult->next;
                }
            }
 
          if(first)
            {
-             WRITE_TO_BUF("    # When multiple links exist between hosts\n");;
-             WRITE_TO_BUF("    # the weight of interface is used to determine\n");;
+             WRITE_TO_BUF("    # When multiple links exist between hosts\n");
+             WRITE_TO_BUF("    # the weight of interface is used to determine\n");
              WRITE_TO_BUF("    # the link to use. Normally the weight is\n");
-             WRITE_TO_BUF("    # automatically calculated by olsrd based\n");;
-             WRITE_TO_BUF("    # on the characteristics of the interface,\n");;
-             WRITE_TO_BUF("    # but here you can specify a fixed value.\n");;
+             WRITE_TO_BUF("    # automatically calculated by olsrd based\n");
+             WRITE_TO_BUF("    # on the characteristics of the interface,\n");
+             WRITE_TO_BUF("    # but here you can specify a fixed value.\n");
              WRITE_TO_BUF("    # Olsrd will choose links with the lowest value.\n");
-             WRITE_TO_BUF("    # Note:\n");;
-             WRITE_TO_BUF("    # Interface weight is used only when LinkQualityLevel is 0.\n");;
-             WRITE_TO_BUF("    # For any other value of LinkQualityLevel, the interface ETX\n");;
-             WRITE_TO_BUF("    # value is used instead.\n\n");;
+             WRITE_TO_BUF("    # Note:\n");
+             WRITE_TO_BUF("    # Interface weight is used only when LinkQualityLevel is 0.\n");
+             WRITE_TO_BUF("    # For any other value of LinkQualityLevel, the interface ETX\n");
+             WRITE_TO_BUF("    # value is used instead.\n\n");
             }
          if(in->cnf->weight.fixed)
            {
index 8cc7cd7..ddc8e35 100644 (file)
@@ -50,6 +50,7 @@
 #include <string.h>
 #include <errno.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -166,6 +167,23 @@ olsrd_parse_cnf(const char *filename)
 }
 
 
+int
+check_pollrate(float *pollrate)
+{
+  if (*pollrate > MAX_POLLRATE) {
+    fprintf(stderr, "Pollrate %0.2f is too large\n", *pollrate);
+    return -1;
+  }
+#ifdef WIN32
+#define sysconf(_SC_CLK_TCK) 1000
+#endif
+  if (*pollrate < MIN_POLLRATE || *pollrate < 1.0/sysconf(_SC_CLK_TCK)) {
+    fprintf(stderr, "Pollrate %0.2f is too small - setting it to %ld\n", *pollrate, sysconf(_SC_CLK_TCK));
+    *pollrate = 1.0/sysconf(_SC_CLK_TCK);
+  }
+  return 0;
+}
+
 int
 olsrd_sanity_check_cnf(struct olsrd_config *cnf)
 {
@@ -235,22 +253,12 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     }
 
   /* Check Link quality dijkstra limit */
-  if (olsr_cnf->lq_dinter < cnf->pollrate && olsr_cnf->lq_dlimit != 255) {
+  if (olsr_cnf->lq_dinter < conv_pollrate_to_secs(cnf->pollrate) && olsr_cnf->lq_dlimit != 255) {
        fprintf(stderr, "Link quality dijkstra limit must be higher than pollrate\n");
        return -1;
   }
   
-  /* Pollrate */
-
-  if(cnf->pollrate < MIN_POLLRATE ||
-     cnf->pollrate > MAX_POLLRATE)
-    {
-      fprintf(stderr, "Pollrate %0.2f is not allowed\n", cnf->pollrate);
-      return -1;
-    }
-
   /* NIC Changes Pollrate */
-
   if(cnf->nic_chgs_pollrate < MIN_NICCHGPOLLRT ||
      cnf->nic_chgs_pollrate > MAX_NICCHGPOLLRT)
     {
@@ -259,7 +267,6 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     }
 
   /* TC redundancy */
-
   if(//cnf->tc_redundancy < MIN_TC_REDUNDANCY ||
      cnf->tc_redundancy > MAX_TC_REDUNDANCY)
     {
@@ -283,7 +290,6 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     }
 
   /* Link quality level */
-
   if(cnf->lq_level > MAX_LQ_LEVEL)
     {
       fprintf(stderr, "LQ level %d is not allowed\n", cnf->lq_level);
@@ -338,7 +344,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
           io->hello_params.validity_time = (int)(REFRESH_INTERVAL / cnf->lq_aging);
       }
 
-      if(io->hello_params.emission_interval < cnf->pollrate ||
+      if(io->hello_params.emission_interval < conv_pollrate_to_secs(cnf->pollrate) ||
         io->hello_params.emission_interval > io->hello_params.validity_time)
        {
          fprintf(stderr, "Bad HELLO parameters! (em: %0.2f, vt: %0.2f)\n", io->hello_params.emission_interval, io->hello_params.validity_time);
@@ -346,7 +352,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
        }
 
       /* TC interval */
-      if(io->tc_params.emission_interval < cnf->pollrate ||
+      if(io->tc_params.emission_interval < conv_pollrate_to_secs(cnf->pollrate) ||
         io->tc_params.emission_interval > io->tc_params.validity_time)
        {
          fprintf(stderr, "Bad TC parameters! (em: %0.2f, vt: %0.2f)\n", io->tc_params.emission_interval, io->tc_params.validity_time);
@@ -354,7 +360,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
        }
 
       /* MID interval */
-      if(io->mid_params.emission_interval < cnf->pollrate ||
+      if(io->mid_params.emission_interval < conv_pollrate_to_secs(cnf->pollrate) ||
         io->mid_params.emission_interval > io->mid_params.validity_time)
        {
          fprintf(stderr, "Bad MID parameters! (em: %0.2f, vt: %0.2f)\n", io->mid_params.emission_interval, io->mid_params.validity_time);
@@ -362,7 +368,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
        }
 
       /* HNA interval */
-      if(io->hna_params.emission_interval < cnf->pollrate ||
+      if(io->hna_params.emission_interval < conv_pollrate_to_secs(cnf->pollrate) ||
         io->hna_params.emission_interval > io->hna_params.validity_time)
        {
          fprintf(stderr, "Bad HNA parameters! (em: %0.2f, vt: %0.2f)\n", io->hna_params.emission_interval, io->hna_params.validity_time);
@@ -460,7 +466,7 @@ set_default_cnf(struct olsrd_config *cnf)
     cnf->hysteresis_param.thr_high = HYST_THRESHOLD_HIGH;
     cnf->hysteresis_param.thr_low = HYST_THRESHOLD_LOW;
 
-    cnf->pollrate = DEF_POLLRATE;
+    cnf->pollrate = conv_pollrate_to_microsecs(DEF_POLLRATE);
     cnf->nic_chgs_pollrate = DEF_NICCHGPOLLRT;
 
     cnf->tc_redundancy = TC_REDUNDANCY;
@@ -534,7 +540,7 @@ struct if_config_options *get_default_if_config(void)
 
 
 void
-olsrd_print_cnf(struct olsrd_config *cnf)
+olsrd_print_cnf(const struct olsrd_config *cnf)
 {
   struct ip_prefix_list   *h  = cnf->hna_entries;
   struct olsr_if           *in = cnf->interfaces;
@@ -577,7 +583,7 @@ olsrd_print_cnf(struct olsrd_config *cnf)
   }
 
 
-  printf("Pollrate         : %0.2f\n", cnf->pollrate);
+  printf("Pollrate         : %0.2f\n", conv_pollrate_to_secs(cnf->pollrate));
 
   printf("NIC ChangPollrate: %0.2f\n", cnf->nic_chgs_pollrate);
 
index 6eda564..3847c4c 100644 (file)
@@ -50,8 +50,7 @@
 
 extern int current_line;
 
-struct conf_token
-{
+struct conf_token {
   olsr_u32_t integer;
   float      floating;
   olsr_bool  boolean;
index a5a47a4..a14e875 100644 (file)
@@ -932,7 +932,10 @@ fhystlower: TOK_HYSTLOWER TOK_FLOAT
 fpollrate: TOK_POLLRATE TOK_FLOAT
 {
   PARSER_DEBUG_PRINTF("Pollrate %0.2f\n", $2->floating);
-  olsr_cnf->pollrate = $2->floating;
+  if (check_pollrate(&$2->floating) < 0) {
+    YYABORT;
+  }
+  olsr_cnf->pollrate = conv_pollrate_to_microsecs($2->floating);
   free($2);
 }
 ;
index 8c58413..cece89b 100644 (file)
  */
 
 #include "generate_msg.h"
-#include "defs.h"
+#include "lq_plugin.h"
 #include "olsr.h"
 #include "build_msg.h"
-#include "packet.h"
 
 /*
  * Infomation repositiries
  */
-#include "hna_set.h"
 #include "mid_set.h"
 #include "tc_set.h"
 #include "mpr_selector_set.h"
-#include "duplicate_set.h"
 #include "neighbor_table.h"
-#include "link_set.h"
-#include "two_hop_neighbor_table.h"
 #include "net_olsr.h"
 
-
-static char pulsedata[] = {'\\', '|', '/', '-'};
-#define PULSE_MAX 4
+static char pulsedata[] = "\\|/-";
 static olsr_u8_t pulse_state = 0;
 
+static void free_tc_packet(struct tc_message *);
+static void build_tc_packet(struct tc_message *);
+
+/**
+ *Free the memory allocated for a TC packet.
+ *
+ *@param message the pointer to the packet to erase
+ *
+ *@return nada
+ */
+static void 
+free_tc_packet(struct tc_message *message)
+{
+  struct tc_mpr_addr *mprs = message->multipoint_relay_selector_address;
+  while (mprs != NULL) {
+    struct tc_mpr_addr *prev_mprs = mprs;
+    mprs = mprs->next;
+    free(prev_mprs);
+  }
+}
+
+/**
+ *Build an internal TC package for this
+ *node.
+ *
+ *@param message the tc_message struct to fill with info
+ *@return 0
+ */
+static void
+build_tc_packet(struct tc_message *message)
+{
+  struct neighbor_entry *entry;
+
+  message->multipoint_relay_selector_address = NULL;
+  message->packet_seq_number = 0;
+  message->hop_count = 0;
+  message->ttl = MAX_TTL;
+  message->ansn = get_local_ansn();
+
+  message->originator = olsr_cnf->main_addr;
+  message->source_addr = olsr_cnf->main_addr;
+  
+  /* Loop trough all neighbors */  
+  OLSR_FOR_ALL_NBR_ENTRIES(entry) {
+    struct tc_mpr_addr *message_mpr;
+    if (entry->status != SYM) {
+      continue;
+    }
+
+    switch (olsr_cnf->tc_redundancy) {
+    case 2:
+      break;
+    case 1:
+      if (!entry->is_mpr &&
+          olsr_lookup_mprs_set(&entry->neighbor_main_addr) == NULL) {
+       continue;
+      }
+      break;
+    default:
+      if (olsr_lookup_mprs_set(&entry->neighbor_main_addr) == NULL) {
+       continue;
+      }
+      break;
+    } /* Switch */
+
+    //printf("\t%s\n", olsr_ip_to_string(&mprs->mpr_selector_addr));
+    message_mpr = olsr_malloc_tc_mpr_addr("Build TC");
+                   
+    message_mpr->address = entry->neighbor_main_addr;
+    message_mpr->next = message->multipoint_relay_selector_address;
+    message->multipoint_relay_selector_address = message_mpr;
+
+  } OLSR_FOR_ALL_NBR_ENTRIES_END(entry);
+}
 
 void
 generate_hello(void *p)
 {
+  struct interface *ifn = p;
   struct hello_message hellopacket;
-  struct interface *ifn = (struct interface *)p;
 
   olsr_build_hello_packet(&hellopacket, ifn);
       
-  if(queue_hello(&hellopacket, ifn))
+  if (queue_hello(&hellopacket, ifn)) {
     net_output(ifn);
-
+  }
   olsr_free_hello_packet(&hellopacket);
 
 }
@@ -84,10 +152,10 @@ generate_hello(void *p)
 void
 generate_tc(void *p)
 {
+  struct interface *ifn = p;
   struct tc_message tcpacket;
-  struct interface *ifn = (struct interface *)p;
 
-  olsr_build_tc_packet(&tcpacket);
+  build_tc_packet(&tcpacket);
 
   /* empty message ? */
   if (!tcpacket.multipoint_relay_selector_address) {
@@ -98,25 +166,23 @@ generate_tc(void *p)
     set_buffer_timer(ifn);
   }
 
-  olsr_free_tc_packet(&tcpacket);
+  free_tc_packet(&tcpacket);
 }
 
 void
 generate_mid(void *p)
 {
-  struct interface *ifn = (struct interface *)p;
+  struct interface *ifn = p;
   
   if (queue_mid(ifn)) {
     set_buffer_timer(ifn);
   }
 }
 
-
-
 void
 generate_hna(void *p)
 {
-  struct interface *ifn = (struct interface *)p;
+  struct interface *ifn = p;
   
   if (queue_hna(ifn)) {
     set_buffer_timer(ifn);
@@ -127,13 +193,12 @@ generate_hna(void *p)
 void
 generate_stdout_pulse(void *foo __attribute__((unused)))
 {
-  if(olsr_cnf->debug_level == 0)
-    return;
-
-  pulse_state = pulse_state == 3 ? 0 : pulse_state + 1;
-
-  printf("%c\r", pulsedata[pulse_state]);
-
+  if (olsr_cnf->debug_level > 0) {
+    if (pulsedata[++pulse_state] == '\0') {
+      pulse_state = 0;
+    }
+    printf("%c\r", pulsedata[pulse_state]);
+  }
 }
 
 /*
index a3aa0e8..966de25 100644 (file)
@@ -234,7 +234,6 @@ main(int argc, char *argv[])
 
   /* Sanity check configuration */
   if (olsrd_sanity_check_cnf(olsr_cnf) < 0) {
-      fprintf(stderr, "Bad configuration!\n");
       olsr_exit(__func__, EXIT_FAILURE);      
     }
 
@@ -745,9 +744,14 @@ olsr_process_arguments(int argc, char *argv[],
      * Set the polling interval to be used by olsrd.
      */
     if (strcmp(*argv, "-T") == 0) {
+      float pollrate;
       NEXT_ARG;
       CHECK_ARGC;
-      sscanf(*argv,"%f",&cnf->pollrate);
+      sscanf(*argv,"%f", &pollrate);
+      if (check_pollrate(&pollrate) < 0) {
+       olsr_exit(__func__, EXIT_FAILURE);
+      }
+      cnf->pollrate = conv_pollrate_to_microsecs(pollrate);
       continue;
     }
 
index 22d085f..bdf2f12 100644 (file)
@@ -212,7 +212,7 @@ struct olsrd_config
   struct ip_prefix_list    *hna_entries;
   struct ip_prefix_list    *ipc_nets;
   struct olsr_if           *interfaces;
-  float                    pollrate;
+  olsr_u32_t               pollrate; /* in microseconds */
   float                    nic_chgs_pollrate;
   olsr_bool                clear_screen;
   olsr_u8_t                tc_redundancy;
@@ -277,18 +277,24 @@ int olsrd_sanity_check_cnf(struct olsrd_config *);
 
 void olsrd_free_cnf(struct olsrd_config *);
 
-void olsrd_print_cnf(struct olsrd_config *);
+void olsrd_print_cnf(const struct olsrd_config *);
 
-int olsrd_write_cnf(struct olsrd_config *, const char *);
+int olsrd_write_cnf(const struct olsrd_config *, const char *);
 
-int olsrd_write_cnf_buf(struct olsrd_config *, char *, olsr_u32_t);
+  int olsrd_write_cnf_buf(const struct olsrd_config *, olsr_bool, char *, olsr_u32_t);
 
 void init_default_if_config(struct if_config_options *);
 
-  struct if_config_options *get_default_if_config(void);
+struct if_config_options *get_default_if_config(void);
 
 struct olsrd_config *olsrd_get_default_cnf(void);
 
+int check_pollrate(float *pollrate);
+
+static inline float conv_pollrate_to_secs(olsr_u32_t p)   { return p / 1000000.0; }
+
+static inline olsr_u32_t conv_pollrate_to_microsecs(float p) { return p * 1000000; }
+
 #if defined WIN32
 void win32_stdio_hack(unsigned int);
 
@@ -297,6 +303,7 @@ void *win32_olsrd_malloc(size_t size);
 void win32_olsrd_free(void *ptr);
 #endif
 
+
 #if defined __cplusplus
 }
 #endif
index f8ee44b..95fc911 100644 (file)
  *
  */
 
-#include "ipcalc.h"
-#include "defs.h"
+#include "packet.h"
 #include "link_set.h"
 #include "mpr_selector_set.h"
-#include "mpr.h"
-#include "olsr.h"
 #include "neighbor_table.h"
-#include "build_msg.h"
-#include "net_olsr.h"
-#include "lq_plugin.h"
-
-#include <stdlib.h>
-
 
 /**
  *Free the memory allocated for a HELLO packet.
@@ -282,129 +273,6 @@ olsr_build_hello_packet(struct hello_message *message, struct interface *outif)
   return 0;
 }
 
-
-/**
- *Free the memory allocated for a TC packet.
- *
- *@param message the pointer to the packet to erase
- *
- *@return nada
- */
-void 
-olsr_free_tc_packet(struct tc_message *message)
-{
-  struct tc_mpr_addr *mprs;
-
-  if(!message)
-    return;
-
-  mprs = message->multipoint_relay_selector_address;
-  while (mprs != NULL) {
-    struct tc_mpr_addr *prev_mprs = mprs;
-    mprs = mprs->next;
-    free(prev_mprs);
-  }
-}
-
-/**
- *Build an internal TC package for this
- *node.
- *
- *@param message the tc_message struct to fill with info
- *@return 0
- */
-int
-olsr_build_tc_packet(struct tc_message *message)
-{
-  struct tc_mpr_addr     *message_mpr;
-  struct neighbor_entry  *entry;
-
-  message->multipoint_relay_selector_address=NULL;
-  message->packet_seq_number=0;
-  message->hop_count = 0;
-  message->ttl = MAX_TTL;
-  message->ansn = get_local_ansn();
-
-  message->originator = olsr_cnf->main_addr;
-  message->source_addr = olsr_cnf->main_addr;
-  
-
-  /* Loop trough all neighbors */  
-  OLSR_FOR_ALL_NBR_ENTRIES(entry) {
-    if (entry->status != SYM) {
-      continue;
-    }
-
-    switch (olsr_cnf->tc_redundancy) {
-    case(2):
-    {
-               /* 2 = Add all neighbors */
-               //printf("\t%s\n", olsr_ip_to_string(&mprs->mpr_selector_addr));
-                 message_mpr = olsr_malloc_tc_mpr_addr("Build TC");
-               
-      message_mpr->address = entry->neighbor_main_addr;
-      message_mpr->next = message->multipoint_relay_selector_address;
-      message->multipoint_relay_selector_address = message_mpr;
-      break;
-    }
-    case(1):
-    {
-      /* 1 = Add all MPR selectors and selected MPRs */
-      if ((entry->is_mpr) ||
-          (olsr_lookup_mprs_set(&entry->neighbor_main_addr) != NULL)) {
-        //printf("\t%s\n", olsr_ip_to_string(&mprs->mpr_selector_addr));
-        message_mpr = olsr_malloc_tc_mpr_addr("Build TC 2");
-                   
-        message_mpr->address = entry->neighbor_main_addr;
-        message_mpr->next = message->multipoint_relay_selector_address;
-        message->multipoint_relay_selector_address = message_mpr;
-      }
-      break;
-    }
-    default:
-    {
-      /* 0 = Add only MPR selectors(default) */
-      if (olsr_lookup_mprs_set(&entry->neighbor_main_addr) != NULL) {
-        //printf("\t%s\n", olsr_ip_to_string(&mprs->mpr_selector_addr));
-        message_mpr = olsr_malloc_tc_mpr_addr("Build TC 3");
-                   
-        message_mpr->address = entry->neighbor_main_addr;
-        message_mpr->next = message->multipoint_relay_selector_address;
-        message->multipoint_relay_selector_address = message_mpr;
-      }
-      break;
-    }          
-         
-    } /* Switch */
-  } OLSR_FOR_ALL_NBR_ENTRIES_END(entry);
-
-  return 0;
-}
-
-/**
- *Free the memory allocated for a MID packet.
- *
- *@param message the pointer to the packet to erase
- *
- *@return nada
- */
-
-void
-olsr_free_mid_packet(struct mid_message *message)
-{
-  struct mid_alias *tmp_adr, *tmp_adr2;
-
-  tmp_adr = message->mid_addr;
-
-  while(tmp_adr)
-    {
-      tmp_adr2 = tmp_adr;
-      tmp_adr = tmp_adr->next;
-      free(tmp_adr2);
-    }
-}
-
 /*
  * Local Variables:
  * c-basic-offset: 2
index c1e4d48..b87634a 100644 (file)
@@ -88,40 +88,6 @@ struct tc_message
   struct tc_mpr_addr  *multipoint_relay_selector_address;
 };
 
-/*
- *MID messages - format:
- *
- *ADDR
- *ADDR
- *ADDR
- *.....
- */
-
-struct mid_alias
-{
-  union olsr_ip_addr alias_addr;
-  struct mid_alias   *next;
-};
-
-struct mid_message
-{
-  olsr_reltime       vtime;
-  union olsr_ip_addr mid_origaddr;  /* originator's address */
-  olsr_u8_t          mid_hopcnt;    /* number of hops to destination */
-  olsr_u8_t          mid_ttl;       /* ttl */
-  olsr_u16_t         mid_seqno;     /* sequence number */
-  union olsr_ip_addr addr;          /* main address */
-  struct mid_alias   *mid_addr;     /* variable length */
-};
-
-
-struct unknown_message
-{
-  olsr_u16_t         seqno;
-  union olsr_ip_addr originator;
-  olsr_u8_t          type;
-};
-
 
 void
 olsr_free_hello_packet(struct hello_message *);
@@ -129,13 +95,4 @@ olsr_free_hello_packet(struct hello_message *);
 int
 olsr_build_hello_packet(struct hello_message *, struct interface *);
 
-void 
-olsr_free_tc_packet(struct tc_message *);
-
-int
-olsr_build_tc_packet(struct tc_message *);
-
-void
-olsr_free_mid_packet(struct mid_message *);
-
 #endif
index ab5302e..054580a 100644 (file)
@@ -3,31 +3,31 @@
  * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
  * are met:
  *
- * * Redistributions of source code must retain the above copyright 
+ * * Redistributions of source code must retain the above copyright
  *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright 
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the 
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
  *   distribution.
- * * Neither the name of olsr.org, olsrd nor the names of its 
- *   contributors may be used to endorse or promote products derived 
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
  *   from this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * Visit http://www.olsr.org for more information.
@@ -47,7 +47,6 @@
 #include "duplicate_set.h"
 #include "mid_set.h"
 #include "olsr.h"
-#include "rebuild_packet.h"
 #include "net_os.h"
 #include "log.h"
 #include "print_packet.h"
 extern char *StrError(unsigned int ErrNo);
 #endif
 
+static void parse_packet(struct olsr *, int, struct interface *, union olsr_ip_addr *);
+
+
 /* Sven-Ola: On very slow devices used in huge networks
- * the amount of lq_tc messages is so high, that the 
+ * the amount of lq_tc messages is so high, that the
  * recv() loop never ends. This is a small hack to end
  * the loop in this cases
  */
 
-unsigned int cpu_overload_exit = 0;
-
 struct parse_function_entry *parse_functions;
 struct preprocessor_function_entry *preprocessor_functions;
 struct packetparser_function_entry *packetparser_functions;
 
-static char inbuf[MAXMESSAGESIZE+1];
-
 static olsr_bool disp_pack_in = OLSR_FALSE;
 
-void parser_set_disp_pack_in(olsr_bool val) {
+void parser_set_disp_pack_in(olsr_bool val)
+{
   disp_pack_in = val;
 }
 
 /**
- *Initialize the parser. 
+ *Initialize the parser.
  *
  *@return nada
  */
-void olsr_init_parser(void) {
+void olsr_init_parser(void)
+{
   OLSR_PRINTF(3, "Initializing parser...\n");
-  
+
   /* Initialize the packet functions */
   olsr_init_package_process();
-  
 }
 
-void olsr_parser_add_function(parse_function *function, olsr_u32_t type, int forwarding) {
+void olsr_parser_add_function(parse_function *function, olsr_u32_t type, int forwarding)
+{
   struct parse_function_entry *new_entry;
   
   OLSR_PRINTF(3, "Parser: registering event for type %d\n", type);
-  
-  new_entry = olsr_malloc(sizeof(struct parse_function_entry), "Register parse function");
-  
+
+  new_entry = olsr_malloc(sizeof(*new_entry), "Register parse function");
+
   new_entry->function = function;
   new_entry->type = type;
   new_entry->caller_forwarding = forwarding;
-  
+
   /* Queue */
   new_entry->next = parse_functions;
   parse_functions = new_entry;
-  
+
   OLSR_PRINTF(3, "Register parse function: Added function for type %d\n", type);
-  
 }
 
-int olsr_parser_remove_function(parse_function *function, olsr_u32_t type, int forwarding) {
+int olsr_parser_remove_function(parse_function *function, olsr_u32_t type, int forwarding)
+{
   struct parse_function_entry *entry, *prev;
-  
-  entry = parse_functions;
-  prev = NULL;
-  
-  while (entry) {
+
+  for (entry = parse_functions, prev = NULL;
+       entry != NULL;
+       prev = entry, entry = entry->next) {
     if ((entry->function == function) && (entry->type == type) && (entry->caller_forwarding == forwarding)) {
       if (entry == parse_functions) {
         parse_functions = entry->next;
@@ -134,38 +133,33 @@ int olsr_parser_remove_function(parse_function *function, olsr_u32_t type, int f
       free(entry);
       return 1;
     }
-    
-    prev = entry;
-    entry = entry->next;
   }
-  
   return 0;
 }
 
-void olsr_preprocessor_add_function(preprocessor_function *function) {
+void olsr_preprocessor_add_function(preprocessor_function *function)
+{
   struct preprocessor_function_entry *new_entry;
-  
+
   OLSR_PRINTF(3, "Parser: registering preprocessor\n");
-  
-  new_entry = olsr_malloc(sizeof(struct preprocessor_function_entry), "Register preprocessor function");
-  
+
+  new_entry = olsr_malloc(sizeof(*new_entry), "Register preprocessor function");
   new_entry->function = function;
-  
+
   /* Queue */
   new_entry->next = preprocessor_functions;
   preprocessor_functions = new_entry;
-  
+
   OLSR_PRINTF(3, "Registered preprocessor function\n");
-  
 }
 
-int olsr_preprocessor_remove_function(preprocessor_function *function) {
+int olsr_preprocessor_remove_function(preprocessor_function *function)
+{
   struct preprocessor_function_entry *entry, *prev;
-  
-  entry = preprocessor_functions;
-  prev = NULL;
-  
-  while (entry) {
+
+  for (entry = preprocessor_functions, prev = NULL;
+       entry != NULL;
+       prev = entry, entry = entry->next) {
     if (entry->function == function) {
       if (entry == preprocessor_functions) {
         preprocessor_functions = entry->next;
@@ -175,38 +169,35 @@ int olsr_preprocessor_remove_function(preprocessor_function *function) {
       free(entry);
       return 1;
     }
-    
-    prev = entry;
-    entry = entry->next;
   }
-  
   return 0;
 }
 
-void olsr_packetparser_add_function(packetparser_function *function) {
+void olsr_packetparser_add_function(packetparser_function *function)
+{
   struct packetparser_function_entry *new_entry;
-  
+
   OLSR_PRINTF(3, "Parser: registering packetparser\n");
-  
+
   new_entry = olsr_malloc(sizeof(struct packetparser_function_entry), "Register packetparser function");
-  
+
   new_entry->function = function;
-  
+
   /* Queue */
   new_entry->next = packetparser_functions;
   packetparser_functions = new_entry;
-  
+
   OLSR_PRINTF(3, "Registered packetparser  function\n");
-  
+
 }
 
-int olsr_packetparser_remove_function(packetparser_function *function) {
+int olsr_packetparser_remove_function(packetparser_function *function)
+{
   struct packetparser_function_entry *entry, *prev;
-  
-  entry = packetparser_functions;
-  prev = NULL;
-  
-  while (entry) {
+
+  for (entry = packetparser_functions, prev = NULL;
+       entry!= NULL;
+       prev = entry, entry = entry->next) {
     if (entry->function == function) {
       if (entry == packetparser_functions) {
         packetparser_functions = entry->next;
@@ -216,11 +207,7 @@ int olsr_packetparser_remove_function(packetparser_function *function) {
       free(entry);
       return 1;
     }
-    
-    prev = entry;
-    entry = entry->next;
   }
-  
   return 0;
 }
 
@@ -228,11 +215,9 @@ int olsr_packetparser_remove_function(packetparser_function *function) {
  * Shared code to parse the message headers and validate the message originator.
  */
 const unsigned char *
-olsr_parse_msg_hdr(union olsr_message *msg, struct olsrmsg_hdr *msg_hdr)
+olsr_parse_msg_hdr(const union olsr_message *msg, struct olsrmsg_hdr *msg_hdr)
 {
-  const unsigned char *curr;
-
-  curr = (void *)msg;
+  const unsigned char *curr = (const void *)msg;
   if (!msg) {
     return NULL;
   }
@@ -248,7 +233,6 @@ olsr_parse_msg_hdr(union olsr_message *msg, struct olsrmsg_hdr *msg_hdr)
   if (!olsr_validate_address(&msg_hdr->originator)) {
     return NULL;
   }
-
   return curr;
 }
 
@@ -261,87 +245,68 @@ olsr_parse_msg_hdr(union olsr_message *msg, struct olsrmsg_hdr *msg_hdr)
  *@param size the size of the message
  *@return nada
  */
-void parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip_addr *from_addr) {
+static void parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip_addr *from_addr)
+{
   union olsr_message *m = (union olsr_message *)olsr->olsr_msg;
-  struct unknown_message unkpacket;
-  int count;
   int msgsize;
   int processed;
   struct parse_function_entry *entry;
   struct packetparser_function_entry *packetparser;
-  
-  count = size - ((char *)m - (char *)olsr);
-  
-  if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version))
+  int count = size - ((char *)m - (char *)olsr);
+
+  if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version)) {
     return;
-  
+  }
   if (ntohs(olsr->olsr_packlen) != size) {
     struct ipaddr_str buf;
     OLSR_PRINTF(1, "Size error detected in received packet.\nRecieved %d, in packet %d\n", size, ntohs(olsr->olsr_packlen));
-    
-    olsr_syslog(OLSR_LOG_ERR, " packet length error in  packet received from %s!",
-    olsr_ip_to_string(&buf, from_addr));
+    olsr_syslog(OLSR_LOG_ERR, " packet length error in  packet received from %s!", olsr_ip_to_string(&buf, from_addr));
     return;
   }
-  
+
   // translate sequence number to host order
   olsr->olsr_seqno = ntohs(olsr->olsr_seqno);
-  
+
   // call packetparser
-  packetparser = packetparser_functions;
-  while (packetparser) {
+  for (packetparser = packetparser_functions; packetparser != NULL; packetparser = packetparser->next) {
     packetparser->function(olsr, in_if, from_addr);
-    packetparser = packetparser->next;
   }
-  
-  //printf("Message from %s\n\n", olsr_ip_to_string(&buf, from_addr)); 
+
+  //printf("Message from %s\n\n", olsr_ip_to_string(&buf, from_addr));
 
   /* Display packet */
-  if (disp_pack_in)
+  if (disp_pack_in) {
     print_olsr_serialized_packet(stdout, (union olsr_packet *)olsr, size, from_addr);
-  
-  if (olsr_cnf->ip_version == AF_INET)
-    msgsize = ntohs(m->v4.olsr_msgsize);
-  else
-    msgsize = ntohs(m->v6.olsr_msgsize);
-  
+  }
+  msgsize = ntohs(olsr_cnf->ip_version == AF_INET ? m->v4.olsr_msgsize : m->v6.olsr_msgsize);
+
   /*
    * Hysteresis update - for every OLSR package
    */
   if (olsr_cnf->use_hysteresis) {
-    if (olsr_cnf->ip_version == AF_INET) {
-      /* IPv4 */
-      update_hysteresis_incoming(from_addr, in_if, ntohs(olsr->olsr_seqno));
-    } else {
-      /* IPv6 */
-      update_hysteresis_incoming(from_addr, in_if, ntohs(olsr->olsr_seqno));
-    }
+    update_hysteresis_incoming(from_addr, in_if, ntohs(olsr->olsr_seqno));
   }
-  
-  for (; count > 0; m = (union olsr_message *)((char *)m + (msgsize))) {
-    
+
+  for (; count > 0; m = (union olsr_message *)((char *)m + msgsize)) {
     processed = 0;
-    if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version))
+    if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version)) {
       break;
-    
-    if (olsr_cnf->ip_version == AF_INET)
-      msgsize = ntohs(m->v4.olsr_msgsize);
-    else
-      msgsize = ntohs(m->v6.olsr_msgsize);
-    
+    }
+    msgsize = ntohs(olsr_cnf->ip_version == AF_INET ? m->v4.olsr_msgsize : m->v6.olsr_msgsize);
+
     count -= msgsize;
-    
+
     /* Check size of message */
     if (count < 0) {
       struct ipaddr_str buf;
       OLSR_PRINTF(1, "packet length error in  packet received from %s!",
-          olsr_ip_to_string(&buf, from_addr));
-      
+                 olsr_ip_to_string(&buf, from_addr));
+
       olsr_syslog(OLSR_LOG_ERR, " packet length error in  packet received from %s!",
       olsr_ip_to_string(&buf, from_addr));
       break;
     }
-    
+
 #if 0
     /*
      * Sven-Ola: This code leads to flooding our meshes with invalid /
@@ -353,32 +318,27 @@ void parse_packet(struct olsr *olsr, int size, struct interface *in_if, union ol
      */
 
     /* Treat TTL hopcnt */
-    if(olsr_cnf->ip_version == AF_INET)
-    {
+    if(olsr_cnf->ip_version == AF_INET) {
       /* IPv4 */
-      if (m->v4.ttl <= 0 && olsr_cnf->lq_fish == 0)
-      {
+      if (m->v4.ttl <= 0 && olsr_cnf->lq_fish == 0) {
         struct ipaddr_str buf;
         OLSR_PRINTF(2, "Dropping packet type %d from neigh %s with TTL 0\n",
-            m->v4.olsr_msgtype,
-            olsr_ip_to_string(&buf, from_addr));
+                   m->v4.olsr_msgtype,
+                   olsr_ip_to_string(&buf, from_addr));
         continue;
       }
-    }
-    else
-    {
+    } else {
       /* IPv6 */
-      if (m->v6.ttl <= 0 && olsr_cnf->lq_fish == 0)
-      {
+      if (m->v6.ttl <= 0 && olsr_cnf->lq_fish == 0) {
         struct ipaddr_str buf;
         OLSR_PRINTF(2, "Dropping packet type %d from %s with TTL 0\n",
-            m->v4.olsr_msgtype,
-            olsr_ip_to_string(&buf, from_addr));
+                   m->v4.olsr_msgtype,
+                   olsr_ip_to_string(&buf, from_addr));
         continue;
       }
     }
 #endif
-    
+
     /*RFC 3626 section 3.4:
      *  2    If the time to live of the message is less than or equal to
      *  '0' (zero), or if the message was sent by the receiving node
@@ -392,14 +352,12 @@ void parse_packet(struct olsr *olsr, int size, struct interface *in_if, union ol
         || !olsr_validate_address((union olsr_ip_addr *)&m->v4.originator)) {
 #ifdef DEBUG
       struct ipaddr_str buf;
-#endif
-#ifdef DEBUG
       OLSR_PRINTF(3, "Not processing message originating from %s!\n",
-          olsr_ip_to_string(&buf,(union olsr_ip_addr *)&m->v4.originator));
+                 olsr_ip_to_string(&buf,(union olsr_ip_addr *)&m->v4.originator));
 #endif
       continue;
     }
-    
+
     /* check for message duplicates */
     if (olsr_cnf->ip_version == AF_INET) {
       /* IPv4 */
@@ -412,79 +370,80 @@ void parse_packet(struct olsr *olsr, int size, struct interface *in_if, union ol
         continue;
       }
     }
-    
-    //printf("MESSAGETYPE: %d\n", m->v4.olsr_msgtype);
 
-    entry = parse_functions;
-    
-    while (entry) {
+    //printf("MESSAGETYPE: %d\n", m->v4.olsr_msgtype);
+    for (entry = parse_functions; entry != NULL; entry = entry->next) {
       /* Should be the same for IPv4 and IPv6 */
 
       /* Promiscuous or exact match */
       if ((entry->type == PROMISCUOUS) || (entry->type == m->v4.olsr_msgtype)) {
         entry->function(m, in_if, from_addr);
-        if (entry->caller_forwarding)
+        if (entry->caller_forwarding) {
           processed = 1;
+       }
       }
-      entry = entry->next;
     }
-    
+
     /* UNKNOWN PACKETTYPE */
     if (processed == 0) {
+      union olsr_ip_addr originator;
+      //struct unknown_message unkpacket;
       struct ipaddr_str buf;
-      unk_chgestruct(&unkpacket, m);
-      
+      if (olsr_cnf->ip_version == AF_INET) {
+       originator.v4.s_addr = m->v4.originator;
+      } else {
+       originator.v6 = m->v6.originator;
+      }
+
       OLSR_PRINTF(3, "Unknown type: %d, size %d, from %s\n",
-          m->v4.olsr_msgtype,
-          size,
-          olsr_ip_to_string(&buf, &unkpacket.originator));
-      
+                 m->v4.olsr_msgtype,
+                 size,
+                 olsr_ip_to_string(&buf, &originator));
+
       /* Forward message */
-      if (!ipequal(&unkpacket.originator, &olsr_cnf->main_addr)) {
+      if (!ipequal(&originator, &olsr_cnf->main_addr)) {
         /* Forward */
         olsr_forward_message(m, from_addr);
       }
-      
+
       /* Cancel loop here, otherwise olsrd just hangs forever at this point */
       break;
     }
-    
   } /* for olsr_msg */
 }
 
 /**
- *Processing OLSR data from socket. Reading data, setting 
- *wich interface recieved the message, Sends IPC(if used) 
+ *Processing OLSR data from socket. Reading data, setting
+ *wich interface recieved the message, Sends IPC(if used)
  *and passes the packet on to parse_packet().
  *
  *@param fd the filedescriptor that data should be read from.
  *@return nada
  */
 void
-olsr_input(int fd, void *data __attribute__((unused)), unsigned int flags __attribute__((unused))) {
+olsr_input(int fd, void *data __attribute__((unused)), unsigned int flags __attribute__((unused)))
+{
+  unsigned int cpu_overload_exit = 0;
 
-  struct interface *olsr_in_if;
-  union olsr_ip_addr from_addr;
-  struct preprocessor_function_entry *entry;
-  struct ipaddr_str buf;
-  char *packet;
-  
-  cpu_overload_exit = 0;
-  
   for (;;) {
+    struct interface *olsr_in_if;
+    union olsr_ip_addr from_addr;
+    struct preprocessor_function_entry *entry;
+    char *packet;
     /* sockaddr_in6 is bigger than sockaddr !!!! */
     struct sockaddr_storage from;
     socklen_t fromlen;
     int cc;
-    
+    char inbuf[MAXMESSAGESIZE+1];
+
     if (32 < ++cpu_overload_exit) {
       OLSR_PRINTF(1, "CPU overload detected, ending olsr_input() loop\n");
       break;
     }
-    
-    fromlen = sizeof(struct sockaddr_storage);
-    cc = olsr_recvfrom(fd, inbuf, sizeof (inbuf), 0, (struct sockaddr *)&from, &fromlen);
-    
+
+    fromlen = sizeof(from);
+    cc = olsr_recvfrom(fd, inbuf, sizeof(inbuf), 0, (struct sockaddr *)&from, &fromlen);
+
     if (cc <= 0) {
       if (cc < 0 && errno != EWOULDBLOCK) {
         OLSR_PRINTF(1, "error recvfrom: %s", strerror(errno));
@@ -492,69 +451,75 @@ olsr_input(int fd, void *data __attribute__((unused)), unsigned int flags __attr
       }
       break;
     }
+
+#ifdef DEBUG
+    {
+#ifndef NODEBUG
+      char addrbuf[128];
+#endif
+      OLSR_PRINTF(5, "Recieved a packet from %s\n", sockaddr_to_string(addrbuf, sizeof(addrbuf), (struct sockaddr *)&from, fromlen));
+    }
+#endif
+
     if (olsr_cnf->ip_version == AF_INET) {
       /* IPv4 sender address */
+      if (fromlen != sizeof(struct sockaddr_in)) {
+       break;
+      }
       from_addr.v4 = ((struct sockaddr_in *)&from)->sin_addr;
     } else {
       /* IPv6 sender address */
+      if (fromlen != sizeof(struct sockaddr_in6)) {
+       break;
+      }
       from_addr.v6 = ((struct sockaddr_in6 *)&from)->sin6_addr;
     }
-    
-#ifdef DEBUG
-    OLSR_PRINTF(5, "Recieved a packet from %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&((struct sockaddr_in *)&from)->sin_addr.s_addr));
-#endif
-    
-    if ((olsr_cnf->ip_version == AF_INET) && (fromlen != sizeof(struct sockaddr_in)))
-      break;
-    else if ((olsr_cnf->ip_version == AF_INET6) && (fromlen != sizeof(struct sockaddr_in6)))
-      break;
-    
+
     /* are we talking to ourselves? */
-    if (if_ifwithaddr(&from_addr) != NULL)
+    if (if_ifwithaddr(&from_addr) != NULL) {
       return;
-    
-    if ((olsr_in_if = if_ifwithsock(fd)) == NULL) {
+    }
+    olsr_in_if = if_ifwithsock(fd);
+    if (olsr_in_if == NULL) {
+      struct ipaddr_str buf;
       OLSR_PRINTF(1, "Could not find input interface for message from %s size %d\n",
-          olsr_ip_to_string(&buf, &from_addr),
-          cc);
+                 olsr_ip_to_string(&buf, &from_addr),
+                 cc);
       olsr_syslog(OLSR_LOG_ERR, "Could not find input interface for message from %s size %d\n",
-      olsr_ip_to_string(&buf, &from_addr),
-      cc);
+                 olsr_ip_to_string(&buf, &from_addr),
+                 cc);
       return;
     }
-    
+
     // call preprocessors
-    entry = preprocessor_functions;
     packet = &inbuf[0];
-    
-    while (entry) {
+    for (entry = preprocessor_functions; entry != NULL; entry = entry->next) {
       packet = entry->function(packet, olsr_in_if, &from_addr, &cc);
       // discard package ?
       if (packet == NULL) {
         return;
       }
-      entry = entry->next;
     }
-    
+
     /*
      * &from - sender
-     * &inbuf.olsr 
+     * &inbuf.olsr
      * cc - bytes read
      */
     parse_packet((struct olsr *)packet, cc, olsr_in_if, &from_addr);
-    
   }
 }
 
 /**
- *Processing OLSR data from socket. Reading data, setting 
- *wich interface recieved the message, Sends IPC(if used) 
+ *Processing OLSR data from socket. Reading data, setting
+ *wich interface recieved the message, Sends IPC(if used)
  *and passes the packet on to parse_packet().
  *
  *@param fd the filedescriptor that data should be read from.
  *@return nada
  */
-void olsr_input_hostemu(int fd, void *data __attribute__((unused)), unsigned int flags __attribute__((unused))) {
+void olsr_input_hostemu(int fd, void *data __attribute__((unused)), unsigned int flags __attribute__((unused)))
+{
   /* sockaddr_in6 is bigger than sockaddr !!!! */
   struct sockaddr_storage from;
   socklen_t fromlen;
@@ -563,7 +528,8 @@ void olsr_input_hostemu(int fd, void *data __attribute__((unused)), unsigned int
   olsr_u16_t pcklen;
   struct preprocessor_function_entry *entry;
   char *packet;
-  
+  char inbuf[MAXMESSAGESIZE+1];
+
   /* Host emulator receives IP address first to emulate
    direct link */
 
@@ -572,15 +538,15 @@ void olsr_input_hostemu(int fd, void *data __attribute__((unused)), unsigned int
     fprintf(stderr, "Error receiving host-client IP hook(%d) %s!\n", cc, strerror(errno));
     memcpy(&from_addr, &((struct olsr *)inbuf)->olsr_msg->originator, olsr_cnf->ipsize);
   }
-  
+
   /* are we talking to ourselves? */
-  if (if_ifwithaddr(&from_addr) != NULL)
+  if (if_ifwithaddr(&from_addr) != NULL) {
     return;
-  
+  }
+
   /* Extract size */
-  cc = recv(fd, (void *)&pcklen, 2, MSG_PEEK);
-  if (cc != 2) /* Win needs a cast */
-  {
+  cc = recv(fd, (void *)&pcklen, 2, MSG_PEEK);/* Win needs a cast */
+  if (cc != 2) {
     if (cc <= 0) {
       fprintf(stderr, "Lost olsr_switch connection - exit!\n");
       olsr_exit(__func__, EXIT_FAILURE);
@@ -589,9 +555,8 @@ void olsr_input_hostemu(int fd, void *data __attribute__((unused)), unsigned int
     return;
   }
   pcklen = ntohs(pcklen);
-  
-  fromlen = sizeof(struct sockaddr_storage);
-  
+
+  fromlen = sizeof(from);
   cc = olsr_recvfrom(fd, inbuf, pcklen, 0, (struct sockaddr *)&from, &fromlen);
   if (cc <= 0) {
     if (cc < 0 && errno != EWOULDBLOCK) {
@@ -601,44 +566,40 @@ void olsr_input_hostemu(int fd, void *data __attribute__((unused)), unsigned int
     }
     return;
   }
-  
+
   if (cc != pcklen) {
     printf("Could not read whole packet(size %d, read %d)\n", pcklen, cc);
     return;
   }
-  
+
   olsr_in_if = if_ifwithsock(fd);
   if (olsr_in_if == NULL) {
     struct ipaddr_str buf;
     OLSR_PRINTF(1, "Could not find input interface for message from %s size %d\n",
-        olsr_ip_to_string(&buf, &from_addr),
-        cc);
+               olsr_ip_to_string(&buf, &from_addr),
+               cc);
     olsr_syslog(OLSR_LOG_ERR, "Could not find input interface for message from %s size %d\n",
-    olsr_ip_to_string(&buf, &from_addr),
-    cc);
+               olsr_ip_to_string(&buf, &from_addr),
+               cc);
     return;
   }
-  
+
   // call preprocessors
-  entry = preprocessor_functions;
   packet = &inbuf[0];
-  
-  while (entry) {
+  for (entry = preprocessor_functions; entry != NULL; entry = entry->next) {
     packet = entry->function(packet, olsr_in_if, &from_addr, &cc);
     // discard package ?
     if (packet == NULL) {
       return;
     }
-    entry = entry->next;
   }
-  
+
   /*
    * &from - sender
-   * &inbuf.olsr 
+   * &inbuf.olsr
    * cc - bytes read
    */
   parse_packet((struct olsr *)inbuf, cc, olsr_in_if, &from_addr);
-  
 }
 
 /*
index 0e9d9c9..5450d05 100644 (file)
@@ -51,8 +51,7 @@
 
 typedef void parse_function(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
-struct parse_function_entry
-{
+struct parse_function_entry {
   olsr_u32_t type;       /* If set to PROMISCUOUS all messages will be received */
   int caller_forwarding; /* If set to 0 this entry is not registered as forwarding packets */
   parse_function *function;
@@ -61,16 +60,14 @@ struct parse_function_entry
 
 typedef char *preprocessor_function(char *packet, struct interface *, union olsr_ip_addr *, int *length);
 
-struct preprocessor_function_entry
-{
+struct preprocessor_function_entry {
   preprocessor_function *function;
   struct preprocessor_function_entry *next;
 };
 
 typedef void packetparser_function(struct olsr *olsr, struct interface *in_if, union olsr_ip_addr *from_addr);
 
-struct packetparser_function_entry
-{
+struct packetparser_function_entry {
   packetparser_function *function;
   struct packetparser_function_entry *next;
 };
@@ -105,10 +102,7 @@ olsr_packetparser_add_function(packetparser_function *function);
 int
 olsr_packetparser_remove_function(packetparser_function *function);
 
-void
-parse_packet(struct olsr *, int, struct interface *, union olsr_ip_addr *);
-
 const unsigned char *
-olsr_parse_msg_hdr(union olsr_message *, struct olsrmsg_hdr *);
+olsr_parse_msg_hdr(const union olsr_message *, struct olsrmsg_hdr *);
 
 #endif
index 584c9fc..f014b24 100644 (file)
@@ -50,7 +50,6 @@
 #include "olsr.h"
 #include "parser.h"
 #include "duplicate_set.h"
-#include "rebuild_packet.h"
 #include "scheduler.h"
 #include "net_olsr.h"
 #include "lq_plugin.h"
@@ -367,65 +366,6 @@ lookup_mpr_status(const struct hello_message *message,
   return OLSR_FALSE;
 }
 
-static int deserialize_hello(struct hello_message *hello, const void *ser) {
-       const unsigned char *limit;
-       olsr_u8_t type;
-       olsr_u16_t size;
-       
-       const unsigned char *curr = ser;
-       pkt_get_u8(&curr, &type);
-       if (type != HELLO_MESSAGE && type != LQ_HELLO_MESSAGE) {
-               /* No need to do anything more */
-               return 1;
-       }
-       pkt_get_reltime(&curr, &hello->vtime);
-       pkt_get_u16(&curr, &size);
-       pkt_get_ipaddress(&curr, &hello->source_addr);
-       
-       pkt_get_u8(&curr, &hello->ttl);
-       pkt_get_u8(&curr, &hello->hop_count);
-       pkt_get_u16(&curr, &hello->packet_seq_number);
-       pkt_ignore_u16(&curr);
-       
-       pkt_get_reltime(&curr, &hello->htime);
-       pkt_get_u8(&curr, &hello->willingness);
-       
-       hello->neighbors = NULL;
-       limit = ((const unsigned char *)ser) + size;
-       while (curr < limit) {
-               const struct lq_hello_info_header *info_head = (const struct lq_hello_info_header *)curr;
-               const unsigned char *limit2 = curr + ntohs(info_head->size);
-               
-               curr = (const unsigned char *)(info_head + 1);
-               while (curr < limit2) {
-                       struct hello_neighbor *neigh = olsr_malloc_hello_neighbor("HELLO deserialization");
-                       pkt_get_ipaddress(&curr, &neigh->address);
-                       
-                       if (type == LQ_HELLO_MESSAGE) {
-                               olsr_deserialize_hello_lq_pair(&curr, neigh);
-                       }
-                       neigh->link = EXTRACT_LINK(info_head->link_code);
-                       neigh->status = EXTRACT_STATUS(info_head->link_code);
-                       
-                       neigh->next = hello->neighbors;
-                       hello->neighbors = neigh;
-               }
-       }
-       return 0;
-}
-
-void olsr_input_hello(union olsr_message *ser, struct interface *inif, union olsr_ip_addr *from) {
-       struct hello_message hello;
-       
-       if (ser == NULL) {
-               return;
-       }
-       if (deserialize_hello(&hello, ser) != 0) {
-               return;
-       }
-       olsr_hello_tap(&hello, inif, from);
-}
-
 /**
  * Initializing the parser functions we are using
  * For downwards compatibility reasons we also understand the non-LQ messages. 
@@ -441,86 +381,140 @@ olsr_init_package_process(void)
   olsr_parser_add_function(&olsr_input_hna, HNA_MESSAGE, 1);
 }
 
+static int
+deserialize_hello(struct hello_message *hello, const void *ser)
+{
+  const unsigned char *limit;
+  olsr_u8_t type;
+  olsr_u16_t size;
+
+  const unsigned char *curr = ser;
+  pkt_get_u8(&curr, &type);
+  if (type != HELLO_MESSAGE && type != LQ_HELLO_MESSAGE) {
+    /* No need to do anything more */
+    return 1;
+  }
+  pkt_get_reltime(&curr, &hello->vtime);
+  pkt_get_u16(&curr, &size);
+  pkt_get_ipaddress(&curr, &hello->source_addr);
+
+  pkt_get_u8(&curr, &hello->ttl);
+  pkt_get_u8(&curr, &hello->hop_count);
+  pkt_get_u16(&curr, &hello->packet_seq_number);
+  pkt_ignore_u16(&curr);
+
+  pkt_get_reltime(&curr, &hello->htime);
+  pkt_get_u8(&curr, &hello->willingness);
+
+  hello->neighbors = NULL;
+  limit = ((const unsigned char *)ser) + size;
+  while (curr < limit) {
+    const struct lq_hello_info_header *info_head = (const struct lq_hello_info_header *)curr;
+    const unsigned char *limit2 = curr + ntohs(info_head->size);
+
+    curr = (const unsigned char *)(info_head + 1);
+    while (curr < limit2) {
+      struct hello_neighbor *neigh = olsr_malloc_hello_neighbor("HELLO deserialization");
+      pkt_get_ipaddress(&curr, &neigh->address);
+
+      if (type == LQ_HELLO_MESSAGE) {
+       olsr_deserialize_hello_lq_pair(&curr, neigh);
+      }
+      neigh->link = EXTRACT_LINK(info_head->link_code);
+      neigh->status = EXTRACT_STATUS(info_head->link_code);
+
+      neigh->next = hello->neighbors;
+      hello->neighbors = neigh;
+    }
+  }
+  return 0;
+}
+
+
 void
 olsr_hello_tap(struct hello_message *message,
                struct interface *in_if,
                const union olsr_ip_addr *from_addr)
 {
-  struct neighbor_entry     *neighbor;
-
   /*
    * Update link status
    */
   struct link_entry *lnk = update_link_entry(&in_if->ip_addr, from_addr, message, in_if);
 
-  if (olsr_cnf->lq_level > 0)
-    {
-      struct hello_neighbor *walker;
-      /* just in case our neighbor has changed its HELLO interval */
-      olsr_update_packet_loss_hello_int(lnk, message->htime);
+  if (olsr_cnf->lq_level > 0) {
+    struct hello_neighbor *walker;
+    /* just in case our neighbor has changed its HELLO interval */
+    olsr_update_packet_loss_hello_int(lnk, message->htime);
 
-      /* find the input interface in the list of neighbor interfaces */
-      for (walker = message->neighbors; walker != NULL; walker = walker->next)
-        if (ipequal(&walker->address, &in_if->ip_addr))
-          break;
+    /* find the input interface in the list of neighbor interfaces */
+    for (walker = message->neighbors; walker != NULL; walker = walker->next) {
+      if (ipequal(&walker->address, &in_if->ip_addr)) {
+       break;
+      }
+    }
 
-      // memorize our neighbour's idea of the link quality, so that we
-      // know the link quality in both directions
-      olsr_memorize_foreign_hello_lq(lnk, walker);
+    // memorize our neighbour's idea of the link quality, so that we
+    // know the link quality in both directions
+    olsr_memorize_foreign_hello_lq(lnk, walker);
 
-      /* update packet loss for link quality calculation */
-      olsr_update_packet_loss(lnk);
-    }
-  
-  neighbor = lnk->neighbor;
+    /* update packet loss for link quality calculation */
+    olsr_update_packet_loss(lnk);
+  }
 
   /*
    * Hysteresis
    */
-  if(olsr_cnf->use_hysteresis)
-    {
-      /* Update HELLO timeout */
-      /* printf("MESSAGE HTIME: %f\n", message->htime);*/
-      olsr_update_hysteresis_hello(lnk, message->htime);
-    }
+  if(olsr_cnf->use_hysteresis) {
+    /* Update HELLO timeout */
+    /* printf("MESSAGE HTIME: %f\n", message->htime);*/
+    olsr_update_hysteresis_hello(lnk, message->htime);
+  }
 
   /* Check if we are chosen as MPR */
-  if(lookup_mpr_status(message, in_if))
+  if(lookup_mpr_status(message, in_if)) {
     /* source_addr is always the main addr of a node! */
     olsr_update_mprs_set(&message->source_addr, message->vtime);
-
-
+  }
 
   /* Check willingness */
-  if(neighbor->willingness != message->willingness)
-    {
-      struct ipaddr_str buf;
-      OLSR_PRINTF(1, "Willingness for %s changed from %d to %d - UPDATING\n", 
-                 olsr_ip_to_string(&buf, &neighbor->neighbor_main_addr),
-                 neighbor->willingness,
-                 message->willingness);
-      /*
-       *If willingness changed - recalculate
-       */
-      neighbor->willingness = message->willingness;
-      changes_neighborhood = OLSR_TRUE;
-      changes_topology = OLSR_TRUE;
-    }
-
+  if(lnk->neighbor->willingness != message->willingness) {
+    struct ipaddr_str buf;
+    OLSR_PRINTF(1, "Willingness for %s changed from %d to %d - UPDATING\n", 
+               olsr_ip_to_string(&buf, &lnk->neighbor->neighbor_main_addr),
+               lnk->neighbor->willingness,
+               message->willingness);
+    /*
+     *If willingness changed - recalculate
+     */
+    lnk->neighbor->willingness = message->willingness;
+    changes_neighborhood = OLSR_TRUE;
+    changes_topology = OLSR_TRUE;
+  }
 
   /* Don't register neighbors of neighbors that announces WILL_NEVER */
-  if(neighbor->willingness != WILL_NEVER)
-    process_message_neighbors(neighbor, message);
+  if(lnk->neighbor->willingness != WILL_NEVER) {
+    process_message_neighbors(lnk->neighbor, message);
+  }
 
   /* Process changes immedeatly in case of MPR updates */
   olsr_process_changes();
 
   olsr_free_hello_packet(message);
-
-  return;
 }
 
 
+void olsr_input_hello(union olsr_message *msg, struct interface *inif, union olsr_ip_addr *from) {
+  struct hello_message hello;
+       
+  if (msg == NULL) {
+    return;
+  }
+  if (deserialize_hello(&hello, msg) != 0) {
+    return;
+  }
+  olsr_hello_tap(&hello, inif, from);
+}
+
 /*
  * Local Variables:
  * c-basic-offset: 2
diff --git a/src/rebuild_packet.c b/src/rebuild_packet.c
deleted file mode 100644 (file)
index 86d03d4..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions 
- * are met:
- *
- * * Redistributions of source code must retain the above copyright 
- *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright 
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the 
- *   distribution.
- * * Neither the name of olsr.org, olsrd nor the names of its 
- *   contributors may be used to endorse or promote products derived 
- *   from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Visit http://www.olsr.org for more information.
- *
- * If you find this software useful feel free to make a donation
- * to the project. For more information see the website or contact
- * the copyright holders.
- *
- */
-
-#include "rebuild_packet.h"
-#include "ipcalc.h"
-#include "defs.h"
-#include "olsr.h"
-#include "mid_set.h"
-#include "mantissa.h"
-#include "net_olsr.h"
-
-/**
- *Process/rebuild a message of unknown type. Converts the OLSR
- *packet to the internal unknown_message format.
- *@param umsg the unknown_message struct in wich infomation
- *is to be put.
- *@param m the entire OLSR message revieved.
- *@return negative on error
- */
-
-void
-unk_chgestruct(struct unknown_message *umsg, const union olsr_message *m)
-{
-
-  /* Checking if everything is ok */
-  if (!m)
-    return;
-
-
-  if(olsr_cnf->ip_version == AF_INET)
-    {
-      /* IPv4 */
-      /* address */
-      umsg->originator.v4.s_addr = m->v4.originator;
-      /*seq number*/
-      umsg->seqno = ntohs(m->v4.seqno);
-      /* type */
-      umsg->type = m->v4.olsr_msgtype;
-    }
-  else
-    {
-      /* IPv6 */
-      /* address */
-      umsg->originator.v6 = m->v6.originator;
-      /*seq number*/
-      umsg->seqno = ntohs(m->v6.seqno);
-      /* type */
-      umsg->type = m->v4.olsr_msgtype;
-    }
-  
-}
diff --git a/src/rebuild_packet.h b/src/rebuild_packet.h
deleted file mode 100644 (file)
index d2903e7..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions 
- * are met:
- *
- * * Redistributions of source code must retain the above copyright 
- *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright 
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the 
- *   distribution.
- * * Neither the name of olsr.org, olsrd nor the names of its 
- *   contributors may be used to endorse or promote products derived 
- *   from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * Visit http://www.olsr.org for more information.
- *
- * If you find this software useful feel free to make a donation
- * to the project. For more information see the website or contact
- * the copyright holders.
- *
- */
-
-
-
-
-#ifndef _OLSR_REBUILD
-#define _OLSR_REBUILD
-
-#include "olsr_protocol.h"
-#include "packet.h"
-
-void
-mid_chgestruct(struct mid_message *, const union olsr_message *);
-
-void
-unk_chgestruct(struct unknown_message *, const union olsr_message *);
-
-void
-hello_chgestruct(struct hello_message *, const union olsr_message *);
-
-#endif
index 0e5a4cd..f3f8a31 100644 (file)
  *
  */
 
-#include "defs.h"
 #include "scheduler.h"
 #include "log.h"
-#include "tc_set.h"
 #include "link_set.h"
-#include "duplicate_set.h"
 #include "mpr_selector_set.h"
-#include "mid_set.h"
-#include "mpr.h"
 #include "olsr.h"
-#include "build_msg.h"
-#include "net_olsr.h"
-#include "olsr_spf.h"
-#include "link_set.h"
 #include "olsr_cookie.h"
 #include "net_os.h"
 
-#include <stdlib.h>
 #include <errno.h>
 
 #ifdef WIN32
@@ -77,11 +67,12 @@ static struct list_node free_timer_list;
 /* Statistics */
 static unsigned int timers_running;
 
-static void olsr_walk_timers(clock_t *);
-static struct list_node *olsr_get_next_list_entry(struct list_node **prev_node, struct list_node *current_node);
+static void walk_timers(clock_t *);
+static struct list_node *get_next_list_entry(struct list_node **prev_node, struct list_node *current_node);
 
-static void olsr_poll_sockets(void);
+static void poll_sockets(void);
 
+static clock_t calc_jitter(unsigned int rel_time, olsr_u8_t jitter_pct, unsigned int random_val);
 
 static struct olsr_socket_entry *olsr_socket_entries = NULL;
 
@@ -178,7 +169,7 @@ void disable_olsr_socket(int fd, socket_handler_func pf_pr, socket_handler_func
 
 
 static void
-olsr_poll_sockets(void)
+poll_sockets(void)
 {
   int n;
   struct olsr_socket_entry *entry;
@@ -209,18 +200,11 @@ olsr_poll_sockets(void)
       fdsets |= SP_PR_WRITE;
       FD_SET((unsigned int)entry->fd, &obits); /* And we cast here since we get a warning on Win32 */    
     }
-    if ((entry->flags & (SP_PR_READ|SP_PR_WRITE)) != 0) {
-      if (entry->fd >= hfd) {
-       hfd = entry->fd + 1;
-      }
+    if ((entry->flags & (SP_PR_READ|SP_PR_WRITE)) != 0 && entry->fd >= hfd) {
+      hfd = entry->fd + 1;
     }
   }
 
-  if (hfd == 0) {
-    /* we didn't set anything - no need to continue */
-    return;
-  }
-      
   /* Running select on the FD set */
   do {
     n = olsr_select(hfd, 
@@ -228,12 +212,12 @@ olsr_poll_sockets(void)
                    fdsets & SP_PR_WRITE ? &obits : NULL,
                    NULL,
                    &tvp);
-  } while (n == -1 && (errno == EINTR || errno == EAGAIN));
+  } while (n == -1 && errno == EINTR);
 
   if (n == 0) {
     return;
   }
-  if (n == -1) {       /* Did somethig go wrong? */
+  if (n == -1) {       /* Did something go wrong? */
     const char * const err_msg = strerror(errno);
     olsr_syslog(OLSR_LOG_ERR, "select: %s", err_msg);
     OLSR_PRINTF(1, "Error select: %s", err_msg);
@@ -243,19 +227,19 @@ olsr_poll_sockets(void)
   /* Update time since this is much used by the parsing functions */
   now_times = olsr_times();
   for (entry = olsr_socket_entries; entry != NULL; entry = entry->next) {
-    int f;
+    int flags;
     if (entry->process_pollrate == NULL) {
       continue;
     }
-    f = 0;
+    flags = 0;
     if (FD_ISSET(entry->fd, &ibits)) {
-      f |= SP_PR_READ;
+      flags |= SP_PR_READ;
     }
     if (FD_ISSET(entry->fd, &obits)) {
-      f |= SP_PR_WRITE;
+      flags |= SP_PR_WRITE;
     }
-    if (f != 0) {
-      entry->process_pollrate(entry->fd, entry->data, f);
+    if (flags != 0) {
+      entry->process_pollrate(entry->fd, entry->data, flags);
     }
   }
 }
@@ -265,22 +249,21 @@ static void handle_fds(const unsigned long next_interval)
   struct timeval tvp;
   unsigned long remaining;
 
-  /* If there are no registered sockets we
-   * do not call select(2)
-   */
-  if (olsr_socket_entries == NULL) {
-    return;
-  }
-
   /* calculate the first timeout */
   now_times = olsr_times();
-  if ((long)(next_interval - (unsigned long)now_times) < 0) {
+
+  remaining = next_interval - (unsigned long)now_times;
+  if ((long)remaining <= 0) {
     /* we are already over the interval */
+    if (olsr_socket_entries == NULL) {
+      /* If there are no registered sockets we do not call select(2) */
+      return;
+    }
     tvp.tv_sec = 0;
     tvp.tv_usec = 0;
   } else {
     /* we need an absolute time - milliseconds */
-    remaining = (next_interval - now_times) * olsr_cnf->system_tick_divider;
+    remaining *= olsr_cnf->system_tick_divider;
     tvp.tv_sec = remaining / MSEC_PER_SEC;
     tvp.tv_usec = (remaining % MSEC_PER_SEC) * USEC_PER_MSEC;
   }
@@ -306,12 +289,15 @@ static void handle_fds(const unsigned long next_interval)
         fdsets |= SP_IMM_WRITE;
         FD_SET((unsigned int)entry->fd, &obits); /* And we cast here since we get a warning on Win32 */    
       }
-      if ((entry->flags & (SP_IMM_READ|SP_IMM_WRITE)) != 0) {
-       if (entry->fd >= hfd) {
-         hfd = entry->fd + 1;
-       }
+      if ((entry->flags & (SP_IMM_READ|SP_IMM_WRITE)) != 0 && entry->fd >= hfd) {
+       hfd = entry->fd + 1;
       }
     }
+
+    if (hfd == 0 && (long)remaining <= 0) {
+      /* we are over the interval and we have no fd's. Skip the select() etc. */
+      return;
+    }
     
     do {
       n = olsr_select(hfd,
@@ -319,12 +305,12 @@ static void handle_fds(const unsigned long next_interval)
                      fdsets & SP_IMM_WRITE ? &obits : NULL,
                      NULL,
                      &tvp);
-    } while (n == -1 && (errno == EINTR || errno == EAGAIN));
+    } while (n == -1 && errno == EINTR);
 
     if (n == 0) { /* timeout! */
       break;
     }
-    if (n == -1) { /* Did somethig go wrong? */
+    if (n == -1) { /* Did something go wrong? */
       olsr_syslog(OLSR_LOG_ERR, "select: %s", strerror(errno));
       break;
     }
@@ -332,29 +318,30 @@ static void handle_fds(const unsigned long next_interval)
     /* Update time since this is much used by the parsing functions */
     now_times = olsr_times();
     for (entry = olsr_socket_entries; entry != NULL; entry = entry->next) {
-      int f;
+      int flags;
       if (entry->process_immediate == NULL) {
        continue;
       }
-      f = 0;
+      flags = 0;
       if (FD_ISSET(entry->fd, &ibits)) {
-       f |= SP_IMM_READ;
+       flags |= SP_IMM_READ;
       }
       if (FD_ISSET(entry->fd, &obits)) {
-       f |= SP_IMM_WRITE;
+       flags |= SP_IMM_WRITE;
       }
-      if (f != 0) {
-       entry->process_immediate(entry->fd, entry->data, f);
+      if (flags != 0) {
+       entry->process_immediate(entry->fd, entry->data, flags);
       }
     }
 
     /* calculate the next timeout */
-    if ((long)(next_interval - (unsigned long)now_times) < 0) {
+    remaining = next_interval - (unsigned long)now_times;
+    if ((long)remaining <= 0) {
       /* we are already over the interval */
       break;
     }
     /* we need an absolute time - milliseconds */
-    remaining = (next_interval - now_times) * olsr_cnf->system_tick_divider;
+    remaining *= olsr_cnf->system_tick_divider;
     tvp.tv_sec = remaining / MSEC_PER_SEC;
     tvp.tv_usec = (remaining % MSEC_PER_SEC) * USEC_PER_MSEC;
   }
@@ -372,8 +359,7 @@ static void handle_fds(const unsigned long next_interval)
 void
 olsr_scheduler(void)
 {
-  OLSR_PRINTF(1, "Scheduler started - polling every %0.2f seconds\n",
-             olsr_cnf->pollrate);
+  OLSR_PRINTF(1, "Scheduler started - polling every %u microseconds\n", olsr_cnf->pollrate);
 
   /* Main scheduler loop */
   while (app_state == STATE_RUNNING) {
@@ -384,13 +370,13 @@ olsr_scheduler(void)
      * to avoid any undesired side effects if the system clock changes.
      */
     now_times = olsr_times();
-    next_interval = GET_TIMESTAMP(olsr_cnf->pollrate * MSEC_PER_SEC);
+    next_interval = GET_TIMESTAMP(olsr_cnf->pollrate / USEC_PER_MSEC);
 
     /* Read incoming data */
-    olsr_poll_sockets();
+    poll_sockets();
 
     /* Process timers */
-    olsr_walk_timers(&timer_last_run);
+    walk_timers(&timer_last_run);
 
     /* Update */
     olsr_process_changes();
@@ -417,7 +403,7 @@ olsr_scheduler(void)
  * @return the absolute timer in system clock tick units
  */
 static clock_t
-olsr_jitter(unsigned int rel_time, olsr_u8_t jitter_pct, unsigned int random_val)
+calc_jitter(unsigned int rel_time, olsr_u8_t jitter_pct, unsigned int random_val)
 {
   unsigned int jitter_time;
 
@@ -530,7 +516,7 @@ olsr_init_timers(void)
 }
 
 /*
- * olsr_get_next_list_entry
+ * get_next_list_entry
  *
  * Get the next list node in a hash bucket.
  * The listnode of the timer in may be subject to getting removed from
@@ -540,7 +526,7 @@ olsr_init_timers(void)
  * has been removed from the hash bucket and compute the next node.
  */
 static struct list_node *
-olsr_get_next_list_entry (struct list_node **prev_node,
+get_next_list_entry (struct list_node **prev_node,
                           struct list_node *current_node)
 {
   if ((*prev_node)->next == current_node) {
@@ -564,10 +550,8 @@ olsr_get_next_list_entry (struct list_node **prev_node,
  * Callback the provided function with the context pointer.
  */
 static void
-olsr_walk_timers(clock_t * last_run)
+walk_timers(clock_t * last_run)
 {
-  static struct timer_entry *timer;
-  struct list_node *timer_head_node, *timer_walk_node, *timer_walk_prev_node;
   unsigned int timers_walked, timers_fired;
   unsigned int total_timers_walked, total_timers_fired;
   unsigned int wheel_slot_walks = 0;
@@ -579,6 +563,7 @@ olsr_walk_timers(clock_t * last_run)
    */
   total_timers_walked = total_timers_fired = timers_walked = timers_fired = 0;
   while ((*last_run <= now_times) && (wheel_slot_walks < TIMER_WHEEL_SLOTS)) {
+    struct list_node *timer_head_node, *timer_walk_node, *timer_walk_prev_node;
 
     /* keep some statistics */
     total_timers_walked += timers_walked;
@@ -593,9 +578,9 @@ olsr_walk_timers(clock_t * last_run)
     /* Walk all entries hanging off this hash bucket */
     for (timer_walk_node = timer_head_node->next;
          timer_walk_node != timer_head_node; /* circular list */
-        timer_walk_node = olsr_get_next_list_entry(&timer_walk_prev_node,
+        timer_walk_node = get_next_list_entry(&timer_walk_prev_node,
                                                     timer_walk_node)) {
-
+      static struct timer_entry *timer;
       timer = list2timer(timer_walk_node);
 
       timers_walked++;
@@ -787,7 +772,7 @@ olsr_start_timer(unsigned int rel_time, olsr_u8_t jitter_pct,
   timer = olsr_get_timer();
 
   /* Fill entry */
-  timer->timer_clock = olsr_jitter(rel_time, jitter_pct, timer->timer_random);
+  timer->timer_clock = calc_jitter(rel_time, jitter_pct, timer->timer_random);
   timer->timer_cb = timer_cb_function;
   timer->timer_cb_context = context;
   timer->timer_jitter_pct = jitter_pct;
@@ -877,7 +862,7 @@ olsr_change_timer(struct timer_entry *timer, unsigned int rel_time,
     timer->timer_period = 0;
   }
 
-  timer->timer_clock = olsr_jitter(rel_time, jitter_pct, timer->timer_random);
+  timer->timer_clock = calc_jitter(rel_time, jitter_pct, timer->timer_random);
   timer->timer_jitter_pct = jitter_pct;
 
   /*
index d505ab5..55d6774 100644 (file)
@@ -316,10 +316,10 @@ chk_if_changed(struct olsr_if *iface)
       }
 
 #ifdef DEBUG
-      OLSR_PRINTF(3, "\tAddress:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifp->int_addr)->sin_addr));
+      OLSR_PRINTF(3, "\tAddress:%s\n", ip4_to_string(&buf, ifp->int_addr.sin_addr));
 #endif
 
-      if(memcmp(&((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr,
+      if(memcmp(&ifp->int_addr.sin_addr.s_addr,
                &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr, 
                olsr_cnf->ipsize) != 0)
        {
@@ -359,7 +359,7 @@ chk_if_changed(struct olsr_if *iface)
       OLSR_PRINTF(3, "\tNetmask:%s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr));
 #endif
 
-      if(memcmp(&((struct sockaddr_in *)&ifp->int_netmask)->sin_addr.s_addr,
+      if(memcmp(&ifp->int_netmask.sin_addr.s_addr,
                &((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr.s_addr, 
                olsr_cnf->ipsize) != 0)
        {
@@ -464,8 +464,8 @@ chk_if_changed(struct olsr_if *iface)
   iface->configured = 0;
   iface->interf = NULL;
   /* Close olsr socket */
-  close(ifp->olsr_socket);
   remove_olsr_socket(ifp->olsr_socket, &olsr_input, NULL);
+  close(ifp->olsr_socket);
 
   /* Free memory */
   free(ifp->int_name);
@@ -487,8 +487,7 @@ chk_if_changed(struct olsr_if *iface)
  * Initializes the special interface used in
  * host-client emulation
  */
-int
-add_hemu_if(struct olsr_if *iface)
+int add_hemu_if(struct olsr_if *iface)
 {
   struct interface *ifp;
   union olsr_ip_addr null_addr;
@@ -551,7 +550,7 @@ add_hemu_if(struct olsr_if *iface)
      /* IP version 4 */
       ifp->ip_addr.v4 = iface->hemu_ip.v4;
 
-      memcpy(&((struct sockaddr_in *)&ifp->int_addr)->sin_addr, &iface->hemu_ip, olsr_cnf->ipsize);
+      memcpy(&ifp->int_addr.sin_addr, &iface->hemu_ip, olsr_cnf->ipsize);
       
       /*
        *We create one socket for each interface and bind
@@ -794,7 +793,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__((unused)))
       if(iface->cnf->ipv4_broadcast.v4.s_addr)
        {
          /* Specified broadcast */
-         memcpy(&((struct sockaddr_in *)&ifs.int_broadaddr)->sin_addr.s_addr, 
+         memcpy(&ifs.int_broadaddr.sin_addr.s_addr, 
                 &iface->cnf->ipv4_broadcast.v4, 
                 sizeof(olsr_u32_t));
        }
index 26469cf..76dde02 100644 (file)
@@ -310,8 +310,7 @@ int GetIntInfo(struct InterfaceInfo *Info, char *Name)
   Info->Index = IfTable->table[TabIdx].dwIndex;
   Info->Mtu = (int)IfTable->table[TabIdx].dwMtu;
 
-  Info->Mtu -= (olsr_cnf->ip_version == AF_INET6) ?
-    UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;
+  Info->Mtu -= olsr_cnf->ip_version == AF_INET6 ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;
 
   Lib = LoadLibrary("iphlpapi.dll");
 
@@ -572,8 +571,8 @@ void RemoveInterface(struct olsr_if *IntConf)
   IntConf->configured = 0;
   IntConf->interf = NULL;
 
-  closesocket(Int->olsr_socket);
   remove_olsr_socket(Int->olsr_socket, &olsr_input, NULL);
+  closesocket(Int->olsr_socket);
 
   free(Int->int_name);
   free(Int);
@@ -586,6 +585,10 @@ void RemoveInterface(struct olsr_if *IntConf)
   }
 }
 
+/**
+ * Initializes the special interface used in
+ * host-client emulation
+ */
 int add_hemu_if(struct olsr_if *iface)
 {
   struct interface *ifp;
@@ -629,8 +632,7 @@ int add_hemu_if(struct olsr_if *iface)
 
   ifp->int_mtu = OLSR_DEFAULT_MTU;
 
-  ifp->int_mtu -= (olsr_cnf->ip_version == AF_INET6) ?
-    UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;
+  ifp->int_mtu -= olsr_cnf->ip_version == AF_INET6 ? UDP_IPV6_HDRSIZE : UDP_IPV4_HDRSIZE;
 
   /* Set up buffer */
   net_add_buffer(ifp);
@@ -649,7 +651,7 @@ int add_hemu_if(struct olsr_if *iface)
      /* IP version 4 */
       ifp->ip_addr.v4 = iface->hemu_ip.v4;
 
-      memcpy(&((struct sockaddr_in *)&ifp->int_addr)->sin_addr, &iface->hemu_ip, olsr_cnf->ipsize);
+      memcpy(&ifp->int_addr.sin_addr, &iface->hemu_ip, olsr_cnf->ipsize);
       
       /*
        *We create one socket for each interface and bind
@@ -804,7 +806,7 @@ int chk_if_changed(struct olsr_if *IntConf)
     Res = 1;
   }
 
-  OldVal.v4 = ((struct sockaddr_in *)&Int->int_addr)->sin_addr;
+  OldVal.v4 = Int->int_addr.sin_addr;
   NewVal.v4.s_addr = Info.Addr;
 
 #ifdef DEBUG
@@ -819,7 +821,7 @@ int chk_if_changed(struct olsr_if *IntConf)
 
     Int->ip_addr.v4 = NewVal.v4;
 
-    AddrIn = (struct sockaddr_in *)&Int->int_addr;
+    AddrIn = &Int->int_addr;
 
     AddrIn->sin_family = AF_INET;
     AddrIn->sin_port = 0;
@@ -863,7 +865,7 @@ int chk_if_changed(struct olsr_if *IntConf)
   else
     OLSR_PRINTF(3, "\tNo netmask change.\n");
 
-  OldVal.v4 = ((struct sockaddr_in *)&Int->int_broadaddr)->sin_addr;
+  OldVal.v4 = Int->int_broadaddr.sin_addr;
   NewVal.v4.s_addr = Info.Broad;
 
 #ifdef DEBUG
@@ -876,7 +878,7 @@ int chk_if_changed(struct olsr_if *IntConf)
     OLSR_PRINTF(1, "\tOld: %s\n", olsr_ip_to_string(&buf, &OldVal));
     OLSR_PRINTF(1, "\tNew: %s\n", olsr_ip_to_string(&buf, &NewVal));
 
-    AddrIn = (struct sockaddr_in *)&Int->int_broadaddr;
+    AddrIn = &Int->int_broadaddr;
 
     AddrIn->sin_family = AF_INET;
     AddrIn->sin_port = 0;
@@ -919,7 +921,7 @@ int chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__((unused)))
 
   New->gen_properties = NULL;
 
-  AddrIn = (struct sockaddr_in *)&New->int_addr;
+  AddrIn = &New->int_addr;
 
   AddrIn->sin_family = AF_INET;
   AddrIn->sin_port = 0;
@@ -931,7 +933,7 @@ int chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__((unused)))
   AddrIn->sin_port = 0;
   AddrIn->sin_addr.s_addr = Info.Mask;
 
-  AddrIn = (struct sockaddr_in *)&New->int_broadaddr;
+  AddrIn = &New->int_broadaddr;
 
   AddrIn->sin_family = AF_INET;
   AddrIn->sin_port = 0;
@@ -971,9 +973,9 @@ int chk_if_up(struct olsr_if *IntConf, int DebugLevel __attribute__((unused)))
               IntConf->name, New->if_index);
       
   OLSR_PRINTF(1, "\tMTU: %d\n", New->int_mtu);
-  OLSR_PRINTF(1, "\tAddress: %s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&New->int_addr)->sin_addr));
+  OLSR_PRINTF(1, "\tAddress: %s\n", ip4_to_string(&buf, New->int_addr.sin_addr));
   OLSR_PRINTF(1, "\tNetmask: %s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&New->int_netmask)->sin_addr));
-  OLSR_PRINTF(1, "\tBroadcast address: %s\n", ip4_to_string(&buf, ((struct sockaddr_in *)&New->int_broadaddr)->sin_addr));
+  OLSR_PRINTF(1, "\tBroadcast address: %s\n", ip4_to_string(&buf, New->int_broadaddr.sin_addr));
 
   New->ip_addr.v4 = New->int_addr.sin_addr;