Exemple #1
0
/*
 * init_hip()
 *
 * HIP Windows service initialization. Start all of the threads.
 */
void init_hip(DWORD ac, char **av)
{
  WORD wVer;
  WSADATA wsaData;
  __u32 tunreader_thrd, esp_output_thrd, esp_input_thrd;
  __u32 hipd_thrd, netlink_thrd, dns_thrd, status_thrd;
  int err;
  char hipd_args[255];
  int i;

  printf("%s v%s HIP Windows service\n", HIP_NAME, HIP_VERSION);
  printf("init_hip()\n");

  /* get arguments for hipd */
  memset(hipd_args, 0, sizeof(hipd_args));
  if (ac > 0)
    {
      ac--, av++;
    }
  i = 0;
  while (ac > 0)
    {
      if (i > 0)             /* add a space between parameters */
        {
          hipd_args[i++] = ' ';
        }
      sprintf(&hipd_args[i], "%s", *av);
      i += strlen(*av);
      av++, ac--;
    }

  /* Initialize Windows sockets */
  wVer = MAKEWORD( 2, 2);
  err = WSAStartup(wVer, &wsaData);
  if (err != 0)
    {
      printf("Error finding usable WinSock DLL.\n");
      exit(-1);
    }
  /* Initialize crypto library */
  init_crypto();
  hip_sadb_init();
  g_state = 0;

  /*
   * Kernel helpers
   */
  if (!(netlink_thrd = _beginthread(hip_netlink, 0, NULL)))
    {
      printf("Error creating netlink thread.\n");
      exit(-1);
    }
  if (!(status_thrd = _beginthread(hip_status, 0, NULL)))
    {
      printf("Error creating status thread.\n");
      exit(-1);
    }

  /*
   * HIP daemon
   */
  if (!(hipd_thrd = _beginthread(hipd_main, 0, (void*)&hipd_args)))
    {
      printf("Error creating HIP daemon thread.\n");
      exit(-1);
    }

  /*
   * tap device
   */
  if ((tapfd = init_tap()))
    {
      printf("Initialized TAP device.\n");
    }
  else
    {
      printf("Error initializing TAP device.\n");
      exit(-1);
    }

  if (!(tunreader_thrd = _beginthread(tunreader, 0, NULL)))
    {
      printf("Error creating tunreader thread.\n");
      exit(-1);
    }

  /*
   * ESP and DNS handlers
   */
  if (!(esp_output_thrd = _beginthread(hip_esp_output, 0, NULL)))
    {
      printf("Error creating ESP output thread.\n");
      exit(-1);
    }
  if ((s_esp = init_esp_input(AF_INET, SOCK_RAW, IPPROTO_ESP, 0,
                              "IPv4 ESP")) < 0)
    {
      printf("Error creating IPv4 ESP input socket.\n");
      exit(-1);
    }
  if ((s_esp_udp = init_esp_input(AF_INET, SOCK_RAW, IPPROTO_UDP,
                                  HIP_UDP_PORT, "IPv4 UDP")) < 0)
    {
      printf("Error creating IPv4 UDP input socket.\n");
      exit(-1);
    }

  if (!(esp_input_thrd = _beginthread(hip_esp_input, 0, NULL)))
    {
      printf("Error creating ESP input thread.\n");
      exit(-1);
    }
  if (!is_dns_thread_disabled())
    {
      if (!(dns_thrd = _beginthread(hip_dns, 0, NULL)))
        {
          printf("Error creating DNS thread.\n");
          exit(-1);
        }
    }
}
void sdlnetdev_init(running_machine &machine)
{
	init_tap();
}