olsr_switch looks okay on Windows. Windows port uses correct MTU. With LQ
authorThomas Lopatic <thomas@lopatic.de>
Sun, 23 Oct 2005 19:01:04 +0000 (19:01 +0000)
committerThomas Lopatic <thomas@lopatic.de>
Sun, 23 Oct 2005 19:01:04 +0000 (19:01 +0000)
enabled minimal HELLO-validity-time is HELLO-interval x LQ-Window-Size.

src/cfgparser/olsrd_conf.c
src/olsr_switch/main.c
src/olsr_switch/ohs_cmd.c
src/olsr_switch/ohs_cmd.h
src/win32/ifnet.c

index b5a090e..cf8f124 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_conf.c,v 1.42 2005/09/17 20:48:50 kattemat Exp $
+ * $Id: olsrd_conf.c,v 1.43 2005/10/23 19:01:04 tlopatic Exp $
  */
 
 
@@ -316,6 +316,20 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
          return -1;
        }
 
+      if (cnf->lq_level > 0)
+      {
+        float want = cnf->lq_wsize * io->hello_params.emission_interval;
+
+        if (io->hello_params.validity_time < want)
+        {
+          io->hello_params.validity_time = want;
+
+          fprintf(stderr,
+                  "WARNING: %s HELLO validity time set to %.1f seconds!\n",
+                  in->name, want);
+        }
+      }
+
       /* TC interval */
       if(io->tc_params.emission_interval < cnf->pollrate ||
         io->tc_params.emission_interval > io->tc_params.validity_time)
index 098df78..78b76e0 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: main.c,v 1.20 2005/08/05 15:15:19 kattemat Exp $
+ * $Id: main.c,v 1.21 2005/10/23 19:01:04 tlopatic Exp $
  */
 
 /* olsrd host-switch daemon */
 #include <time.h>
 
 #ifdef WIN32
-#undef EINTR
-#define EINTR WSAEINTR
 #undef errno
 #define errno WSAGetLastError()
 #undef strerror
 #define strerror(x) StrError(x)
+#define close(x) closesocket(x)
 #else
 #include <sys/wait.h>
 #endif
@@ -161,6 +160,7 @@ ohs_init_new_connection(int s)
 {
   struct ohs_connection *oc;
   olsr_u8_t new_addr[4];
+  int i;
 
   if(logbits & LOG_CONNECT)
     printf("ohs_init_new_connection\n");
@@ -179,12 +179,27 @@ ohs_init_new_connection(int s)
   oc->tx = 0;
   oc->linkcnt = 0;
 
+  // hack alert: WSAEventSelect makes sockets non-blocking, so the
+  // recv() may return without having read anything on Windows; hence
+  // re-try for 2 seconds on Windows; shouldn't harm Linux et al.
+
   /* Get "fake IP" */
-  if(recv(oc->socket, new_addr, 4, 0) != 4)
-    {
-      printf("Failed to fetch IP address!\n");
-      return -1;
-    }
+  for (i = 0; i < 20; i++)
+  {
+    if (recv(oc->socket, new_addr, 4, 0) == 4)
+      break;
+
+#if defined WIN32
+    Sleep(100);
+#endif
+  }
+
+  if (i == 20)
+  {
+    printf("Failed to fetch IP address! (%s)\n", strerror(errno));
+    return -1;
+  }
+
   memcpy(&oc->ip_addr, new_addr, 4);
   oc->ip_addr.v4 = ntohl(oc->ip_addr.v4);
   if(logbits & LOG_CONNECT)
@@ -347,22 +362,43 @@ ohs_configure()
   return 1;
 }
 
+static void accept_handler(void)
+{
+  struct sockaddr_in pin;
+  socklen_t addrlen = sizeof(pin);
+  int s;
+         
+  memset(&pin, 0 , sizeof(pin));
+
+  if((s = accept(srv_socket, (struct sockaddr *)&pin, &addrlen)) < 0)
+    {
+      printf("accept failed socket: %s\n", strerror(errno));
+    }
+  else
+    {
+      /* Create new node */
+      ohs_init_new_connection(s);
+    }
+}
+
+static void stdin_handler(void)
+{
+  ohs_parse_command();
+}
+
+static void read_handler(struct ohs_connection *con)
+{
+  if (ohs_route_data(con) < 0)
+    ohs_delete_connection(con);
+}
 
 static void
 ohs_listen_loop()
 {
+#if !defined WIN32
   int n;
   fd_set ibits;
-#ifdef WIN32
-  struct timeval select_timeout;
-  HANDLE  stdIn = GetStdHandle(STD_INPUT_HANDLE);
-#else
   int fn_stdin = fileno(stdin);
-#endif
-
-  printf("OHS command interpreter reading from STDIN\n");
-  printf("\n> ");
-  fflush(stdout);
 
   while(1)
     {
@@ -377,15 +413,11 @@ ohs_listen_loop()
       high = srv_socket;
       FD_SET(srv_socket, &ibits);
 
-#ifdef WIN32
-      select_timeout.tv_sec = 0;
-      select_timeout.tv_usec = 5;
-#else
       if(fn_stdin > high) 
        high = fn_stdin;
 
       FD_SET(fn_stdin, &ibits);
-#endif
+
       /* Add clients */
       for(ohs_cs = ohs_conns; ohs_cs; ohs_cs = ohs_cs->next)
        {
@@ -395,19 +427,11 @@ ohs_listen_loop()
          FD_SET(ohs_cs->socket, &ibits);
        }
 
-#ifdef WIN32
-      n = select(high + 1, &ibits, 0, 0, &select_timeout);
-#else
       /* block */
       n = select(high + 1, &ibits, 0, 0, NULL);
-#endif
       
       if(n == 0)
-#ifdef WIN32
-       goto read_stdin;
-#else
         continue;
-#endif
 
       /* Did somethig go wrong? */
       if (n < 0) 
@@ -416,32 +440,13 @@ ohs_listen_loop()
            continue;
          
          printf("Error select: %s", strerror(errno));
-#ifdef WIN32
-          goto read_stdin;
-#else
           continue;
-#endif
        }
       
       /* Check server socket */
       if(FD_ISSET(srv_socket, &ibits))
-       {
-         struct sockaddr_in pin;
-         socklen_t addrlen = sizeof(pin);
-         int s;
-         
-         memset(&pin, 0 , sizeof(pin));
+        accept_handler();
 
-         if((s = accept(srv_socket, (struct sockaddr *)&pin, &addrlen)) < 0)
-           {
-             printf("accept failed socket: %s\n", strerror(errno));
-           }
-         else
-           {
-             /* Create new node */
-             ohs_init_new_connection(s);
-           }
-       }
       /* Loop trough clients */
       ohs_cs = ohs_conns;
       while(ohs_cs)
@@ -450,24 +455,82 @@ ohs_listen_loop()
          ohs_cs = ohs_cs->next;
 
          if(FD_ISSET(ohs_tmp->socket, &ibits))
-           {
-             if(ohs_route_data(ohs_tmp) < 0)
-                 ohs_delete_connection(ohs_tmp);
-           }
+            read_handler(ohs_tmp);
        }
-#if WIN32
-    read_stdin:
-      if(WaitForSingleObject(stdIn, 5L) == WAIT_OBJECT_0)
-#else
+
       if(FD_ISSET(fn_stdin, &ibits))
-#endif
-       {
-         ohs_parse_command(stdin);
-         printf("\n> ");
-         fflush(stdout);
-       }
+        stdin_handler();
+
       printf("*");
+      fflush(stdout);
     }
+#else
+  HANDLE Objects[2];
+  WSANETWORKEVENTS NetEvents;
+  struct ohs_connection *Walker, *TmpWalker;
+  unsigned int Res;
+
+  Objects[0] = GetStdHandle(STD_INPUT_HANDLE);
+  Objects[1] = WSACreateEvent();
+
+  if (WSAEventSelect(srv_socket, Objects[1], FD_ACCEPT) == SOCKET_ERROR)
+  {
+    fprintf(stderr, "WSAEventSelect failed (1): %s\n", strerror(errno));
+    return;
+  }
+
+  while (1)
+  {
+    for (Walker = ohs_conns; Walker != NULL; Walker = Walker->next)
+    {
+      if (WSAEventSelect(Walker->socket, Objects[1], FD_READ | FD_CLOSE) == SOCKET_ERROR)
+      {
+        fprintf(stderr, "WSAEventSelect failed (2): %s\n", strerror(errno));
+        Sleep(1000);
+        continue;
+      }
+    }
+
+    Res = WaitForMultipleObjects(2, Objects, FALSE, INFINITE);
+
+    if (Res == WAIT_FAILED)
+    {
+      fprintf(stderr, "WaitForMultipleObjects failed: %s\n", strerror(GetLastError()));
+      Sleep(1000);
+      continue;
+    }
+
+    if (Res == WAIT_OBJECT_0)
+      stdin_handler();
+
+    else if (Res == WAIT_OBJECT_0 + 1)
+    {
+      if (WSAEnumNetworkEvents(srv_socket, Objects[1], &NetEvents) == SOCKET_ERROR)
+        fprintf(stderr, "WSAEnumNetworkEvents failed (1): %s\n", strerror(errno));
+
+      else
+      {
+        if ((NetEvents.lNetworkEvents & FD_ACCEPT) != 0)
+          accept_handler();
+      }
+
+      for (Walker = ohs_conns; Walker != NULL; Walker = TmpWalker)
+      {
+        TmpWalker = Walker->next;
+
+        if (WSAEnumNetworkEvents(Walker->socket, Objects[1], &NetEvents) == SOCKET_ERROR)
+          fprintf(stderr, "WSAEnumNetworkEvents failed (2): %s\n", strerror(errno));
+
+        else
+        {
+          if ((NetEvents.lNetworkEvents & (FD_READ | FD_CLOSE)) != 0)
+            read_handler(Walker);
+        }
+      }
+    }
+  }
+  
+#endif
 }
 
 int
@@ -482,7 +545,9 @@ main(int argc, char *argv[])
       fprintf(stderr, "Could not initialize WinSock.\n");
       exit(EXIT_FAILURE);
     }
+
   SetConsoleCtrlHandler(ohs_close, OLSR_TRUE);
+
 #else
   signal(SIGINT, ohs_close);  
   signal(SIGTERM, ohs_close);  
@@ -505,6 +570,10 @@ main(int argc, char *argv[])
 
   ohs_configure();
 
+  printf("OHS command interpreter reading from STDIN\n");
+  printf("\n> ");
+  fflush(stdout);
+
   ohs_listen_loop();
 
   ohs_close(0);
index 86580c5..b8a866c 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: ohs_cmd.c,v 1.16 2005/08/04 18:57:11 kattemat Exp $
+ * $Id: ohs_cmd.c,v 1.17 2005/10/23 19:01:04 tlopatic Exp $
  */
 
 #include "olsr_host_switch.h"
 #include <errno.h>
 
 
-#define ARG_BUF_SIZE 500
-static char arg_buf[ARG_BUF_SIZE];
-
 #define TOK_BUF_SIZE 500
 static char tok_buf[TOK_BUF_SIZE];
 
 #define MAX_OLSRD_ARGS 10
 static char olsrd_path[FILENAME_MAX];
 
-static void
-get_arg_buf(FILE *handle, char *buf, size_t size)
-{
-  char c = 0;
-  int pos = 0;
-
-  while(((c = fgetc(handle)) != '\n') &&
-       pos < ((int)size - 2))
-    {
-      buf[pos] = c;
-      pos++;
-    }
-
-  buf[pos] = 0;
-}
-
 static int
 get_next_token(char *src, char *dst, size_t buflen)
 {
@@ -114,7 +95,7 @@ ohs_set_olsrd_path(char *path)
 }
 
 int
-ohs_cmd_olsrd(FILE *handle, char *args)
+ohs_cmd_olsrd(char *args)
 {
 #ifdef WIN32
   printf("olsrd command not available in windows version\nStart instances manually\n");
@@ -250,7 +231,7 @@ ohs_cmd_olsrd(FILE *handle, char *args)
 }
 
 int
-ohs_cmd_link(FILE *handle, char *args)
+ohs_cmd_link(char *args)
 {
   olsr_u8_t bi = 0, wildc_src = 0, wildc_dst = 0;
   struct ohs_connection *src, *dst;
@@ -404,7 +385,7 @@ ohs_cmd_link(FILE *handle, char *args)
 }
 
 int
-ohs_cmd_list(FILE *handle, char *args)
+ohs_cmd_list(char *args)
 {
   struct ohs_connection *oc = ohs_conns;
 
@@ -453,7 +434,7 @@ ohs_cmd_list(FILE *handle, char *args)
 }
 
 int
-ohs_cmd_help(FILE *handle, char *args)
+ohs_cmd_help(char *args)
 {
   int i;
 
@@ -493,7 +474,7 @@ ohs_cmd_help(FILE *handle, char *args)
 }
 
 int
-ohs_cmd_log(FILE *handle, char *args)
+ohs_cmd_log(char *args)
 {
   olsr_u8_t set = 0;
 
@@ -554,7 +535,7 @@ ohs_cmd_log(FILE *handle, char *args)
 }
 
 int
-ohs_cmd_exit(FILE *handle, char *args)
+ohs_cmd_exit(char *args)
 {
 
   printf("Exitting... bye-bye!\n");
@@ -563,37 +544,89 @@ ohs_cmd_exit(FILE *handle, char *args)
   return 0;
 }
 
-int
-ohs_parse_command(FILE *handle)
+void
+ohs_parse_command(void)
 {
-  char input_data[100];
+  static char cmd_line[500];
+  static int cmd_len = 0;
+  char c;
+  char *args;
+  char cmd_token[20];
   int i;
+#if defined WIN32
+  unsigned long Read;
+  INPUT_RECORD InRec;
+  KEY_EVENT_RECORD *KeyEventRec;
+#endif
+
+#if defined WIN32
+  if (!ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &InRec, sizeof (InRec), &Read))
+  {
+    fprintf(stderr, "ReadConsoleInput failed: %s\n", strerror(GetLastError()));
+    return;
+  }
+
+  if (InRec.EventType != KEY_EVENT)
+    return;
+
+  KeyEventRec = &InRec.Event.KeyEvent;
+
+  if (!KeyEventRec->bKeyDown)
+    return;
+
+  c = KeyEventRec->uChar.AsciiChar;
+
+  if (c == 8)
+  {
+    if (cmd_len == 0)
+      return;
+
+    cmd_len--;
+
+    fputc(8, stdout);
+    fputc(32, stdout);
+    fputc(8, stdout);
+
+    fflush(stdout);
+
+    return;
+  }
 
-  fscanf(handle, "%s", input_data);
+  fputc(c, stdout);
+  fflush(stdout);
 
-  get_arg_buf(handle, arg_buf, ARG_BUF_SIZE);
+#else
+  c = fgetc(stdin);
+#endif
+
+  if (c != '\n' && c != '\r' && cmd_len < (int)sizeof (cmd_line) - 1)
+    cmd_line[cmd_len++] = (char)c;
+
+  else
+  {
+    cmd_line[cmd_len] = 0;
+    cmd_len = 0;
 
-  for(i = 0; ohs_commands[i].cmd; i++)
+    args = cmd_line + get_next_token(cmd_line, cmd_token, sizeof (cmd_token));
+
+    for (i = 0; ohs_commands[i].cmd != NULL; i++)
     {
-      if(!strcmp(input_data, ohs_commands[i].cmd))
-       {
-         if(ohs_commands[i].cmd_cb)
-           {
-             ohs_commands[i].cmd_cb(handle, arg_buf);
-           }
-         else
-           {
-             printf("No action registered on cmd %s!\n", input_data);
-           }
-         break;
-       }
+      if (strcmp(cmd_token, ohs_commands[i].cmd) == 0)
+      {
+        if(ohs_commands[i].cmd_cb != NULL)
+          ohs_commands[i].cmd_cb(args);
+
+        else
+          printf("No action registered on cmd %s!\n", cmd_token);
+
+        break;
+      }
     }
   
-  if(!ohs_commands[i].cmd)
-    {
-      printf("%s: no such cmd!\n", input_data);
-    }
+    if(ohs_commands[i].cmd == NULL)
+      printf("%s: no such cmd!\n", cmd_token);
 
-
-  return 0;
+    printf("\n> ");
+    fflush(stdout);
+  }
 }
index 88ec8e8..91233e5 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: ohs_cmd.h,v 1.4 2005/06/04 21:07:33 kattemat Exp $
+ * $Id: ohs_cmd.h,v 1.5 2005/10/23 19:01:04 tlopatic Exp $
  */
 
 
@@ -52,31 +52,31 @@ struct ohs_command
   char *syntax;
   char *helptext_brief;
   char *helptext_long;
-  int (*cmd_cb)(FILE *, char *);
+  int (*cmd_cb)(char *);
 };
 
 int
 ohs_set_olsrd_path(char *);
 
-int
-ohs_parse_command(FILE *);
+void
+ohs_parse_command(void);
 
 int
-ohs_cmd_olsrd(FILE *, char *);
+ohs_cmd_olsrd(char *);
 
 int
-ohs_cmd_list(FILE *, char *);
+ohs_cmd_list(char *);
 
 int
-ohs_cmd_help(FILE *, char *);
+ohs_cmd_help(char *);
 
 int
-ohs_cmd_exit(FILE *, char *);
+ohs_cmd_exit(char *);
 
 int
-ohs_cmd_log(FILE *, char *);
+ohs_cmd_log(char *);
 
 int
-ohs_cmd_link(FILE *, char *);
+ohs_cmd_link(char *);
 
 #endif
index 250d416..2af4247 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: ifnet.c,v 1.28 2005/08/04 20:45:29 kattemat Exp $
+ * $Id: ifnet.c,v 1.29 2005/10/23 19:01:04 tlopatic Exp $
  */
 
 #include "interfaces.h"
@@ -183,6 +183,9 @@ 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;
+
   BuffLen = sizeof (AdInfo);
 
   Res = GetAdaptersInfo(AdInfo, &BuffLen);
@@ -482,7 +485,8 @@ 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);
@@ -550,7 +554,7 @@ int add_hemu_if(struct olsr_if *iface)
   addr[2] = htonl(addr[2]);
   addr[3] = htonl(addr[3]);
 
-  if(send(ifp->olsr_socket, addr , ipsize, 0) != (int)ipsize)
+  if(send(ifp->olsr_socket, (char *)addr, ipsize, 0) != (int)ipsize)
     {
       fprintf(stderr, "Error sending IP!");
     }