Example #1
0
int nr_stun_client_ctx_create(char *label, nr_socket *sock, nr_transport_addr *peer, UINT4 RTO, nr_stun_client_ctx **ctxp)
{
    nr_stun_client_ctx *ctx=0;
    int r,_status;

    if ((r=nr_stun_startup()))
        ABORT(r);

    if(!(ctx=RCALLOC(sizeof(nr_stun_client_ctx))))
        ABORT(R_NO_MEMORY);

    ctx->state=NR_STUN_CLIENT_STATE_INITTED;

    if(!(ctx->label=r_strdup(label)))
        ABORT(R_NO_MEMORY);

    ctx->sock=sock;

    nr_socket_getaddr(sock,&ctx->my_addr);
    nr_transport_addr_copy(&ctx->peer_addr,peer);

    if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_RETRANSMIT_TIMEOUT, &ctx->rto_ms)) {
        if (RTO != 0)
            ctx->rto_ms = RTO;
        else
            ctx->rto_ms = 100;
    }

    if (NR_reg_get_double(NR_STUN_REG_PREF_CLNT_RETRANSMIT_BACKOFF, &ctx->retransmission_backoff_factor))
        ctx->retransmission_backoff_factor = 2.0;

    if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_MAXIMUM_TRANSMITS, &ctx->maximum_transmits))
        ctx->maximum_transmits = 7;

    if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_FINAL_RETRANSMIT_BACKOFF, &ctx->final_retransmit_backoff_ms))
        ctx->final_retransmit_backoff_ms = 16 * ctx->rto_ms;

    *ctxp=ctx;

    _status=0;
abort:
    if(_status) {
        nr_stun_client_ctx_destroy(&ctx);
    }
    return(_status);
}
Example #2
0
int
main(int argc, char* argv[])
{
   int verbose = 0;
   const int maxaddr = 256;
   nr_transport_addr addresses[maxaddr];
   int has_address = 0;
   StunAddress4 address;
   int numAddresses = 0;
   int i;
   int testNum;
   int srcPort = 0;
   
   printf("STUN client version %s\n",NR_STUN_VERSION);
   fflush(stdout);

   nr_crypto_openssl_set();

   nr_app_startup("client",NR_APP_STARTUP_INIT_LOGGING|NR_APP_STARTUP_REGISTRY_LOCAL,&NR_LOG_STUN,0,0);
   NR_reg_set_char("logging.stderr.enabled", 1);
   NR_reg_set_char("logging.syslog.enabled", 1);
   NR_reg_set_string("logging.syslog.facility.client.level", "debug");
   NR_reg_set_string("logging.syslog.facility.stun.level", "debug");
   NR_reg_set_string("logging.stderr.facility.client.level", "debug");
   NR_reg_set_string("logging.stderr.facility.stun.level", "debug");
   
   if (nr_stun_startup()) {
       printf("Failed to start STUN\n");
       exit(1);
   }

   if (initNetwork()) {
       printf("Failed to start STUN\n");
       exit(1);
   }

 
   StunAddress4 stunServerAddr;
   stunServerAddr.addr=0;

   int arg;
   for ( arg = 1; arg<argc; arg++ )
   {
      if ( !strcmp( argv[arg] , "-v" ) )
      {
         verbose = 1;
      }
      else if ( !strcmp( argv[arg] , "-n" ) )
      {
         auth_rule = NR_STUN_AUTH_RULE_OPTIONAL;
      }
      else if ( !strcmp( argv[arg] , "-s" ) )
      {
         auth_rule = NR_STUN_AUTH_RULE_SHORT_TERM;
      }
      else if ( !strcmp( argv[arg] , "-l" ) )
      {
         auth_rule = NR_STUN_AUTH_RULE_LONG_TERM;
      }
#ifdef USE_STUND_0_96
      else if ( !strcmp( argv[arg] , "-c" ) )
      {
         stun_mode = NR_STUN_MODE_STUND_0_96;
      }
#endif /* USE_STUND_0_96 */
      else if ( !strcmp( argv[arg] , "-p" ) )
      {
         arg++;
         if ( argc <= arg ) 
         {
            usage();
            exit(-1);
         }
         srcPort = strtol( argv[arg], NULL, 10);
      }
      else if ( !strcmp( argv[arg] , "-i" ) )
      {
         arg++;
         if ( argc <= arg ) 
         {
            usage();
            exit(-1);
         }
           if (nr_stun_parse_server_name( argv[arg], &address))
           {
              fprintf(stderr,"%s is not a valid host name \n",argv[arg]);
              fflush(stderr);
              usage();
              exit(-1);
           }
           has_address = 1;
      }
      else    
      {
        char* ptr;
        int t =  strtol( argv[arg], &ptr, 10 );
        if ( *ptr == 0 )
        { 
           // conversion worked
           testNum = t;
           printf("running test number %d\n",testNum);
           fflush(stdout);
        }
        else
        {
           if (nr_stun_parse_server_name( argv[arg], &stunServerAddr))
           {
              fprintf(stderr,"%s is not a valid host name \n",argv[arg]);
              usage();
              exit(-1);
           }
	}	
      }
   }

   if (has_address) {
       if (nr_ip4_port_to_transport_addr(address.addr, srcPort, IPPROTO_UDP, &addresses[0]))
       {
              fprintf(stderr,"bad address\n");
              exit(1);
       }
       numAddresses=1;
   }

   if (numAddresses == 0) {
       if (nr_stun_find_local_addresses(addresses, maxaddr, &numAddresses))
           numAddresses = 0;
   }
   else if ( srcPort == 0 )
   {
      if (nr_stun_randomPort(&srcPort)) {
          fprintf(stderr,"Failed\n");
          exit(1);
      }
   }

   if (numAddresses == 0) {
       address.addr = 0;
       address.port = srcPort;
       nr_stun_request(&stunServerAddr,1,&address);
   }
   else for (i = 0; i < numAddresses; ++i) {
       address.addr = ntohl(addresses[i].u.addr4.sin_addr.s_addr);
       address.port = ntohs(addresses[i].u.addr4.sin_port);
       nr_stun_request(&stunServerAddr,1,&address);
   }

   return 0;
}
Example #3
0
int nr_stun_client_ctx_create(char *label, nr_socket *sock, nr_transport_addr *peer, UINT4 RTO, nr_stun_client_ctx **ctxp)
  {
    nr_stun_client_ctx *ctx=0;
    char allow_loopback;
    int r,_status;

    if ((r=nr_stun_startup()))
      ABORT(r);

    if(!(ctx=RCALLOC(sizeof(nr_stun_client_ctx))))
      ABORT(R_NO_MEMORY);

    ctx->state=NR_STUN_CLIENT_STATE_INITTED;

    if(!(ctx->label=r_strdup(label)))
      ABORT(R_NO_MEMORY);

    ctx->sock=sock;

    nr_socket_getaddr(sock,&ctx->my_addr);
    nr_transport_addr_copy(&ctx->peer_addr,peer);

    if (RTO != 0) {
      ctx->rto_ms = RTO;
    } else if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_RETRANSMIT_TIMEOUT, &ctx->rto_ms)) {
      ctx->rto_ms = 100;
    }

    if (NR_reg_get_double(NR_STUN_REG_PREF_CLNT_RETRANSMIT_BACKOFF, &ctx->retransmission_backoff_factor))
      ctx->retransmission_backoff_factor = 2.0;

    if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_MAXIMUM_TRANSMITS, &ctx->maximum_transmits))
      ctx->maximum_transmits = 7;

    if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_FINAL_RETRANSMIT_BACKOFF, &ctx->maximum_transmits_timeout_ms))
      ctx->maximum_transmits_timeout_ms = 16 * ctx->rto_ms;

    ctx->mapped_addr_check_mask = NR_STUN_TRANSPORT_ADDR_CHECK_WILDCARD;
    if (NR_reg_get_char(NR_STUN_REG_PREF_ALLOW_LOOPBACK_ADDRS, &allow_loopback) ||
        !allow_loopback) {
      ctx->mapped_addr_check_mask |= NR_STUN_TRANSPORT_ADDR_CHECK_LOOPBACK;
    }

    if (ctx->my_addr.protocol == IPPROTO_TCP) {
      /* Because TCP is reliable there is only one final timeout value.
       * We store the timeout value for TCP in here, because timeout_ms gets
       * reset to 0 in client_reset() which gets called from client_start() */
      ctx->maximum_transmits_timeout_ms = ctx->rto_ms *
                        pow(ctx->retransmission_backoff_factor,
                            ctx->maximum_transmits);
      ctx->maximum_transmits = 1;
    }

    *ctxp=ctx;

    _status=0;
  abort:
    if(_status){
      nr_stun_client_ctx_destroy(&ctx);
    }
    return(_status);
  }
Example #4
0
int
main(int argc, char* argv[])
{
   StunAddress4 myAddr;
   int myPort = 0;
   char verbose=0;
   char background=0;
   
   printf("STUN server version %s\n",NR_STUN_VERSION);
   fflush(stdout);

   nr_crypto_openssl_set();

   nr_app_startup("server",NR_APP_STARTUP_INIT_LOGGING|NR_APP_STARTUP_REGISTRY_LOCAL,&NR_LOG_STUN,0,0);
   NR_reg_set_char("logging.stderr.enabled", 1);
   NR_reg_set_char("logging.syslog.enabled", 1);
   NR_reg_set_string("logging.syslog.facility.server.level", "debug");
   NR_reg_set_string("logging.syslog.facility.stun.level", "debug");
   NR_reg_set_string("logging.stderr.facility.client.level", "debug");
   NR_reg_set_string("logging.stderr.facility.stun.level", "debug");

   if (nr_stun_startup()) {
       printf("Failed to start STUN\n");
       exit(1);
   }
      
   if (initNetwork()) {
       printf("Failed to start STUN\n");
       exit(1);
   }
 
   myAddr.addr = 0;
   myAddr.port = NR_STUN_PORT;
 
   if ( argc <= 2 ) 
   {
      usage();
      exit(-1);
   }

   int arg;
   for ( arg = 1; arg<argc; arg++ )
   {
      if ( !strcmp( argv[arg] , "-v" ) )
      {
         verbose = 1;
      }
      else if ( !strcmp( argv[arg] , "-b" ) )
      {
         background = 1;
      }
      else if ( !strcmp( argv[arg] , "-a" ) )
      {
         alternate_server = 1;
      }
      else if ( !strcmp( argv[arg] , "-h" ) )
      {
         arg++;
         if ( argc <= arg ) 
         {
            usage();
            exit(-1);
         }

         if (nr_stun_parse_server_name(argv[arg], &myAddr))
         {
            usage();
            exit(-1);
         }
      }
      else if ( !strcmp( argv[arg] , "-p" ) )
      {
         arg++;
         if ( argc <= arg ) 
         {
            usage();
            exit(-1);
         }
         myPort = (UINT2)(strtol( argv[arg], NULL, 10));
      }
      else
      {
         usage();
         exit(-1);
      }
   }

   if ( myPort != 0 )
   {
      myAddr.port = myPort;
   }
 
   if (
      ( myAddr.addr  == 0 ) ||
      ( myAddr.port  == 0 ) 
      )
   {
      fprintf(stderr,"Bad command line\n");
      fflush(stderr);
      exit(1);
   }
   
#if defined(WIN32)
   int pid=0;

   if ( background )
   {
      fprintf(stderr,"The -b background option does not work in windows\n");
      fflush(stderr);
      exit(-1);
   }
#else
   pid_t pid=0;

   if ( background )
   {
      pid = fork();

      if (pid < 0)
      {
         fprintf(stderr,"fork: unable to fork\n");
	 fflush(stderr);
         exit(-1);
      }
   }
#endif

   if (pid == 0) //child or not using background
   {
      StunServerInfo info;
      char ok = 1;
      if (nr_stun_init_server(&info, &myAddr))
          ok = 0;
      
      int c=0;
      while (ok)
      {
         if (nr_stun_server_process(&info)) {
             fprintf(stderr,"Failed\n");
             exit(1);
         }
         c++;
         if ( c%10000 == 0 ) 
         {
            printf("*");
	    fflush(stdout);
         }
      }
   }
   
   return 0;
}