Beispiel #1
0
Datei: veth.c Projekt: 0xcc/tapip
/* Altough dev is already created, this function is safe! */
static int tap_dev_init(void)
{
	tap = xmalloc(sizeof(*tap));
	tap->fd = alloc_tap("tap0");
	if (tap->fd < 0)
		goto free_tap;
	if (setpersist_tap(tap->fd) < 0)
		goto close_tap;
	/* set tap information */
	set_tap();
	getname_tap(tap->fd, tap->dev.net_name);
	getmtu_tap(tap->dev.net_name, &tap->dev.net_mtu);
#ifndef CONFIG_TOP1
	gethwaddr_tap(tap->fd, tap->dev.net_hwaddr);
	setipaddr_tap(tap->dev.net_name, FAKE_TAP_ADDR);
	getipaddr_tap(tap->dev.net_name, &tap->dev.net_ipaddr);
	setnetmask_tap(tap->dev.net_name, FAKE_TAP_NETMASK);
	setup_tap(tap->dev.net_name);
#endif
	unset_tap();
	/* Dont add tap device into local net device list */
	list_init(&tap->dev.net_list);
	return 0;

close_tap:
	close(tap->fd);
free_tap:
	free(tap);
	return -1;
}
Beispiel #2
0
/*
 * main()
 *
 * Main command-line routine.
 */
int main (int argc, char **argv)
{
  int rc;
  char *error_buf;

  argv++, argc--;
  while (argc > 0)
    {
      rc = 0;
      if (strcmp(*argv, "-i") == 0)
        {
          rc = hip_install_service();
          if (rc == 0)
            {
              printf("HIP has been successfully installed ");
              printf("as a service.\n");
            }
        }
      else if (strcmp(*argv, "-r") == 0)
        {
          rc = hip_remove_service();
          if (rc == 0)
            {
              printf("HIP has been successfully ");
              printf("uninstalled.\n");
            }
        }
      else if (strcmp(*argv, "-setuptap") == 0)
        {
          rc = setup_tap();
        }
      else if (strcmp(*argv, "-s") == 0)
        {
          rc = hip_start_service();
        }
      else if (strcmp(*argv, "-e") == 0)
        {
          rc = hip_stop_service();
        }
      else if (strcmp(*argv, "-X") == 0)
        {
          DWORD dw;
          TCHAR szBuf[80];
          LPVOID lpMsgBuf;
          SERVICE_TABLE_ENTRY ent[] = {
            { SERVICE_NAME, ServiceMain }, { 0, 0 },
          };
          StartServiceCtrlDispatcher (ent);
          dw = GetLastError();
          FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
                         FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw,
                         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                         (LPTSTR) &lpMsgBuf, 0, NULL);
          wsprintf(szBuf, "Failed with error %d: %s",
                   dw, lpMsgBuf);
          /* Insert errors that we don't care about here. */
          if (dw != ERROR_IO_PENDING)
            {
              MessageBox(NULL, szBuf, "HIP Error", MB_OK);
            }
          LocalFree(lpMsgBuf);
          exit(0);
          /* Add new hipd option flags here: */
        }
      else if (strstr("-a-d-conf-e-g-i3-m-nr-o-p-q-r1-t-u-v",
                      *argv))
        {
          argv--, argc++;
          goto start_hip;
        }
      else
        {
          print_hip_service_usage();
          exit(0);
        }
      /* print error */
      if (rc)
        {
          FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                        FORMAT_MESSAGE_FROM_SYSTEM |
                        FORMAT_MESSAGE_IGNORE_INSERTS,
                        NULL, rc, MAKELANGID(LANG_NEUTRAL,
                                             SUBLANG_DEFAULT),
                        (LPTSTR) &error_buf, 0, NULL);
          printf("%s\n", error_buf);
        }
      return(0);
    }     /* end while */

start_hip:
  init_hip(argc, argv);
  while (g_state == 0)
    {
      Sleep(1000);
    }
  WSACleanup();
  hip_sadb_deinit();
  printf("Returning from main(), g_state=%d\n", g_state);
  fflush(stdout);
  return(0);
}
Beispiel #3
0
int main(int argc, char **argv)
{
  int result, index;
  char *bptr, *tptr;
  char *app;
  int i, j, c;
  struct getap_state *gs;

  index = 0;
  app = argv[0];
  i = j = 1;

  tptr = "tgtap%d";
  bptr = "/proc/%d/hw/ioreg/ten_Gbe_v2";

  gs = malloc(sizeof(struct getap_state));
  if(gs == NULL){
    fprintf(stderr, "%s: unable to allocate %d bytes\n", app, sizeof(struct getap_state));
    return EX_USAGE;
  }

  gs->s_address_name[0] = '\0';
  gs->s_gateway_name[0] = '\0';
  gs->s_mac_name[0] = '\0';
  gs->s_port = 0;

  gs->s_verbose = 1;
  gs->s_testing = 0;

  while (i < argc) {
    if (argv[i][0] == '-') {
      c = argv[i][j];
      switch (c) {
        case 'h' :
          usage(app);
          return EX_OK;
        case 'v' :
          gs->s_verbose++;
          j++;
          break;
        case 'T' :
          gs->s_testing++;
          j++;
          break;
        case 'a' :
        case 'g' :
        case 'm' :
        case 'p' :
        case 'n' :
        case 't' : 
        case 'b' : 
          j++;
          if (argv[i][j] == '\0') {
            j = 0;
            i++;
          }
          if (i >= argc) {
            fprintf(stderr, "%s: -%c needs a parameter\n", app, c);
            return EX_USAGE;
          }

          switch(c){
            case 'a' :
              strncpy(gs->s_address_name, argv[i] + j, IP_BUFFER - 1);
              gs->s_address_name[IP_BUFFER - 1] = '\0';
              break;
            case 'g' :
              strncpy(gs->s_gateway_name, argv[i] + j, IP_BUFFER - 1);
              gs->s_gateway_name[IP_BUFFER - 1] = '\0';
              break;
            case 'm' :
              strncpy(gs->s_mac_name, argv[i] + j, MAC_BUFFER - 1);
              gs->s_mac_name[MAC_BUFFER - 1] = '\0';
            case 'p' :
              gs->s_port = atoi(argv[i] + j);
              break;
            case 'n' :
              index = atoi(argv[i] + j);
              break;
            case 't' :
              tptr = NULL;
              strncpy(gs->s_tap_name, argv[i] + j, NAME_BUFFER - 1);
              gs->s_tap_name[NAME_BUFFER - 1] = '\0';
              break;
            case 'b' :
              bptr = NULL;
              strncpy(gs->s_borph_name, argv[i] + j, NAME_BUFFER - 1);
              gs->s_borph_name[NAME_BUFFER - 1] = '\0';
              break;
          }

          i++;
          j = 1;
          break;

        case '\0':
          j = 1;
          i++;
          break;
        default:
          fprintf(stderr, "%s: unknown option -%c\n", app, argv[i][j]);
          return EX_USAGE;
      }
    } else {
      fprintf(stderr, "%s: bad argument %s\n", app, argv[i]);
      return EX_USAGE;
    }
  }

  if(tptr){
    result = snprintf(gs->s_tap_name, NAME_BUFFER - 1, tptr, index); 
    if((result < 0) || (result >= NAME_BUFFER)){
      fprintf(stderr, "unable to expand %s: Value too long\n", tptr);
      return EX_USAGE;
    }
  }
  if(bptr){
    result = snprintf(gs->s_borph_name, NAME_BUFFER - 1, bptr, getpid()); 
    if((result < 0) || (result >= NAME_BUFFER)){
      fprintf(stderr, "unable to expand %s: Value too long\n", bptr);
      return EX_USAGE;
    }
  }
  if(gs->s_address_name[0] == '\0'){
    fprintf(stderr, "%s: need an ip address\n", app);
    return EX_OSERR;
  }

  if(gs->s_gateway_name[0] == '\0'){
    /* risky, gateware may not like it */
    strncpy(gs->s_gateway_name, gs->s_address_name, IP_BUFFER);
  }

  if(gs->s_mac_name[0] == '\0'){
    make_mac(gs);
  }

  if(gs->s_verbose){
    printf("%s: tap interface name: %s\n", app, gs->s_tap_name);
    printf("%s: borph file: %s\n", app, gs->s_borph_name);
    printf("%s: %s file interface \n", app, gs->s_testing ? "testing" : "borph");
    printf("%s: ip address %s\n", app, gs->s_address_name);
    printf("%s: mac address %s\n", app, gs->s_mac_name);
  }

  gs->s_tfd = tap_open(gs->s_tap_name);
  if(gs->s_tfd < 0){
    fprintf(stderr, "%s: unable to set up tap device %s: %s\n", app, gs->s_tap_name, strerror(errno));
    return EX_OSERR;
  }

  if(setup_borph(gs) < 0){
    fprintf(stderr, "%s: unable to initialise borph register file %s: %s\n", app, gs->s_borph_name, strerror(errno));
    return EX_OSERR;
  }

  if(setup_tap(gs)){
    fprintf(stderr, "%s: unable to configure tap device %s\n", app, gs->s_tap_name);
    return EX_OSERR;
  }

  printf("%s: my arp table index %d\n", app, gs->s_index);

  if(gs->s_verbose){
    printf("%s: my network: 0x%08x\n", app, gs->s_network_binary);
  }

  run = 1;

  /* signal stuff */

  mainloop(gs);

  tap_close(gs->s_tfd);
  close(gs->s_bfd);

  return EX_OK;
}