CTEST(stunserver, SendDiscussResp_Valid) { bool useRelay = false; discussData.streamType = 0x004; discussData.interactivity = 0x01; discussData.networkStatus_flags = 0; discussData.networkStatus_nodeCnt = 0; discussData.networkStatus_tbd = 0; discussData.networkStatus_upMaxBandwidth = 0; discussData.networkStatus_downMaxBandwidth = 0; sockaddr_initFromString( (struct sockaddr*)&stunServerAddr, "193.200.93.152:3478" ); StunClient_Alloc(&stunInstance); ASSERT_TRUE( StunServer_SendConnectivityBindingResp(stunInstance, 0, /* sockhandle */ LastTransId, "pem", (struct sockaddr*)& stunServerAddr, (struct sockaddr*)& stunServerAddr, 2, 2, NULL, SendRawStun, 0, useRelay, 0, /* responseCode */ &discussData) ); }
static void setupIPv6 (void) { stunResult = StunResult_Empty; runningAsIPv6 = true; sockaddr_initFromString((struct sockaddr*)&stunServerAddr, "[2001:470:dc88:2:226:18ff:fe92:6d53]:3478"); StunClient_Alloc(&stunInstance); }
static void setup (void) { stunResult = StunResult_Empty; runningAsIPv6 = false; sockaddr_initFromString((struct sockaddr*)&stunServerAddr, "193.200.93.152:3478"); StunClient_Alloc(&stunInstance); }
CTEST(stuntrace, null_ptr) { int someData = 3; STUN_CLIENT_DATA* clientData = NULL; struct sockaddr_storage localAddr, remoteAddr; int sockfd = 4; sockaddr_initFromString( (struct sockaddr*)&remoteAddr, "193.200.93.152:45674" ); sockaddr_initFromString( (struct sockaddr*)&localAddr, "192.168.1.34:45674" ); int len = StunTrace_startTrace(clientData, &someData, (const struct sockaddr*)&remoteAddr, (const struct sockaddr*)&localAddr, sockfd, "test", "tset", 1, StunTraceCallBack, sendPacket); ASSERT_TRUE(len == 0); StunClient_Alloc(&clientData); len = StunTrace_startTrace(clientData, &someData, (const struct sockaddr*)&remoteAddr, (const struct sockaddr*)&localAddr, sockfd, "test", "tset", 1, StunTraceCallBack, NULL); ASSERT_TRUE(len == 0); len = StunTrace_startTrace(clientData, &someData, NULL, (const struct sockaddr*)&localAddr, sockfd, "test", "tset", 1, StunTraceCallBack, sendPacket); ASSERT_TRUE(len == 0); }
CTEST(stunserver, SendResp_Valid_IPv6) { bool useRelay = false; struct sockaddr_storage mappedAddr,servAddr; sockaddr_reset( &servAddr); sockaddr_reset( &mappedAddr); sockaddr_initFromString( (struct sockaddr*)&servAddr, "[2a02:fe0:c410:cb31:e4d:e93f:fecb:bf6b]:1234" ); StunClient_Alloc(&stunInstance); ASSERT_FALSE( StunServer_SendConnectivityBindingResp(stunInstance, 0, /* sockhandle */ LastTransId, "pem", (struct sockaddr*)& mappedAddr, (struct sockaddr*)& servAddr, 0, 0, NULL, SendRawStun, 0, useRelay, 0, /* responseCode */ NULL) ); sockaddr_initFromString( (struct sockaddr*)&mappedAddr, "[2a02:fe0:c410:cb31:e4d:e93f:fecb:bf6b]:1234" ); ASSERT_TRUE( StunServer_SendConnectivityBindingResp(stunInstance, 0, LastTransId, "pem", (struct sockaddr*)& mappedAddr, (struct sockaddr*)& servAddr, 0, 0, NULL, SendRawStun, 0, useRelay, 0, NULL) ); }
CTEST(stunserver, SendResp_Valid) { bool useRelay = false; struct sockaddr_storage mappedAddr,servAddr; sockaddr_initFromString( (struct sockaddr*)&servAddr, "193.200.93.152:3478" ); StunClient_Alloc(&stunInstance); ASSERT_FALSE( StunServer_SendConnectivityBindingResp(stunInstance, 0, /* sockhandle */ LastTransId, "pem", (struct sockaddr*)& mappedAddr, (struct sockaddr*)& servAddr, 0, 0, NULL, SendRawStun, 0, useRelay, 0, /* responseCode */ NULL) ); sockaddr_initFromString( (struct sockaddr*)&mappedAddr, "193.200.93.152:3478" ); ASSERT_TRUE( StunServer_SendConnectivityBindingResp(stunInstance, 0, LastTransId, "pem", (struct sockaddr*)& mappedAddr, (struct sockaddr*)& servAddr, 2, 3, NULL, SendRawStun, 0, useRelay, 0, NULL) ); }
int main(void) { struct addrinfo* servinfo, * p; int numbytes; struct sockaddr_storage their_addr; unsigned char buf[MAXBUFLEN]; StunMessage stunRequest; STUN_INCOMING_REQ_DATA pReq; pthread_t socketListenThread; STUN_CLIENT_DATA* clientData; struct listenConfig listenConfig; StunClient_Alloc(&clientData); signal(SIGINT, teardown); sockfd = createSocket(NULL, MYPORT, AI_PASSIVE, servinfo, &p); listenConfig.socketConfig[0].tInst = clientData; listenConfig.socketConfig[0].sockfd = sockfd; listenConfig.socketConfig[0].user = NULL; listenConfig.socketConfig[0].pass = PASSWORD; listenConfig.stun_handler = stunHandler; listenConfig.numSockets = 1; pthread_create(&socketListenThread, NULL, socketListenDemux, (void*)&listenConfig); while (1) { printf("stunserver: waiting to recvfrom...\n"); sleep(1000); } }
int main(int argc, char* argv[]) { //struct addrinfo* servinfo; //int numbytes; //struct sockaddr_storage their_addr; //unsigned char buf[MAXBUFLEN]; struct sockaddr_storage localAddr; char interface[10]; int port; //StunMessage stunRequest; //STUN_INCOMING_REQ_DATA pReq; pthread_t socketListenThread; STUN_CLIENT_DATA* clientData; struct listenConfig listenConfig; StunClient_Alloc(&clientData); signal(SIGINT, teardown); int c; /* int digit_optind = 0; */ /* set config to default values */ strncpy(interface, "default", 7); port = 3478; static struct option long_options[] = { {"interface", 1, 0, 'i'}, {"port", 1, 0, 'p'}, {"help", 0, 0, 'h'}, {"version", 0, 0, 'v'}, {NULL, 0, NULL, 0} }; if (argc < 1) { printUsage(); exit(0); } int option_index = 0; while ( ( c = getopt_long(argc, argv, "hvi:p:j:m:M:w:r:", long_options, &option_index) ) != -1 ) { /* int this_option_optind = optind ? optind : 1; */ switch (c) { case 'i': strncpy(interface, optarg, max_iface_len); break; case 'p': port = atoi(optarg); break; case 'h': printUsage(); break; case 'v': printf("Version %s\n", VERSION_SHORT); exit(0); break; default: printf("?? getopt returned character code 0%o ??\n", c); } } if ( !getLocalInterFaceAddrs( (struct sockaddr*)&localAddr, interface, AF_INET, IPv6_ADDR_NORMAL, false ) ) { printf("Error getting IPaddr on %s\n", interface); exit(1); } //sockfd = createSocket(NULL, MYPORT, AI_PASSIVE, servinfo, &p); sockfd = createLocalSocket(AF_INET, (struct sockaddr*)&localAddr, SOCK_DGRAM, port); listenConfig.tInst = clientData; listenConfig.socketConfig[0].sockfd = sockfd; listenConfig.socketConfig[0].user = NULL; listenConfig.socketConfig[0].pass = PASSWORD; listenConfig.stun_handler = stunHandler; listenConfig.numSockets = 1; pthread_create(&socketListenThread, NULL, socketListenDemux, (void*)&listenConfig); while (1) { printf("stunserver: waiting to recvfrom...\n"); sleep(1000); } }
CTEST(stuntrace, run_IPv4_Stunresp_max_ttl) { int someData = 3; STUN_CLIENT_DATA* clientData; struct sockaddr_storage localAddr, remoteAddr, hop1Addr; int sockfd = 4; sockaddr_initFromString( (struct sockaddr*)&remoteAddr, "193.200.93.152:45674" ); sockaddr_initFromString( (struct sockaddr*)&localAddr, "192.168.1.34:45674" ); StunClient_Alloc(&clientData); int len = StunTrace_startTrace(clientData, &someData, (const struct sockaddr*)&remoteAddr, (const struct sockaddr*)&localAddr, sockfd, "test", "tset", 1, StunTraceCallBack, sendPacket); /* First alive probe */ ASSERT_TRUE(len != 0); ASSERT_TRUE(LastTTL == 40); StunMessage m; memset( &m, 0, sizeof(m) ); memcpy( &m.msgHdr.id, &LastTransId, STUN_MSG_ID_SIZE); memcpy( &m.msgHdr.cookie, StunCookie, sizeof(m.msgHdr.cookie) ); m.msgHdr.msgType = STUN_MSG_BindResponseMsg; m.hasXorMappedAddress = true; m.xorMappedAddress.familyType = STUN_ADDR_IPv4Family; m.xorMappedAddress.addr.v4.addr = test_addr_ipv4; m.xorMappedAddress.addr.v4.port = test_port_ipv4; StunClient_HandleIncResp(clientData, &m, NULL); /*Timeout is roughtly 160*50 ms*/ for (int i = 0; i < 160 * 38; i++) { StunClient_HandleTick(clientData, 50); } /* First hop.. */ ASSERT_TRUE(LastTTL == 39); sockaddr_initFromString( (struct sockaddr*)&hop1Addr, "192.168.1.1:45674" ); StunClient_HandleICMP(clientData, (struct sockaddr*)&hop1Addr, 11); ASSERT_TRUE( sockaddr_alike( (struct sockaddr*)&LastHopAddr, (struct sockaddr*)&hop1Addr ) ); ASSERT_TRUE( Done); ASSERT_TRUE( EndOfTrace); }
CTEST(stuntrace, run_IPv4_Stunresp_dead) { int someData = 3; STUN_CLIENT_DATA* clientData; struct sockaddr_storage localAddr, remoteAddr, hop1Addr; int sockfd = 4; sockaddr_initFromString( (struct sockaddr*)&remoteAddr, "193.200.93.152:45674" ); sockaddr_initFromString( (struct sockaddr*)&localAddr, "192.168.1.34:45674" ); StunClient_Alloc(&clientData); StunTrace_startTrace(clientData, &someData, (const struct sockaddr*)&remoteAddr, (const struct sockaddr*)&localAddr, sockfd, "test", "tset", 1, StunTraceCallBack, sendPacket); /*Timeout is roughtly 160*50 ms*/ for (int i = 0; i < 160; i++) { StunClient_HandleTick(clientData, 50); } /* First hop.. */ ASSERT_TRUE(LastTTL == 1); sockaddr_initFromString( (struct sockaddr*)&hop1Addr, "192.168.1.1:45674" ); StunClient_HandleICMP(clientData, (struct sockaddr*)&hop1Addr, 11); ASSERT_TRUE( sockaddr_alike( (struct sockaddr*)&LastHopAddr, (struct sockaddr*)&hop1Addr ) ); ASSERT_TRUE( LastTTL == 2); for (int i = 0; i < 160; i++) { StunClient_HandleTick(clientData, 50); } ASSERT_TRUE(LastTTL == 3); for (int i = 0; i < 160; i++) { StunClient_HandleTick(clientData, 50); } ASSERT_TRUE(LastTTL == 4); for (int i = 0; i < 160; i++) { StunClient_HandleTick(clientData, 50); } ASSERT_TRUE(LastTTL == 5); for (int i = 0; i < 160; i++) { StunClient_HandleTick(clientData, 50); } ASSERT_TRUE(LastTTL == 5); ASSERT_TRUE(Done); ASSERT_TRUE(EndOfTrace); }
CTEST(stuntrace, no_answer_recurring_IPv4) { int someData = 3; STUN_CLIENT_DATA* clientData; struct sockaddr_storage localAddr, remoteAddr, hop1Addr, hop2Addr; int sockfd = 4; sockaddr_initFromString( (struct sockaddr*)&remoteAddr, "193.200.93.152:45674" ); sockaddr_initFromString( (struct sockaddr*)&localAddr, "192.168.1.34:45674" ); StunClient_Alloc(&clientData); int len = StunTrace_startTrace(clientData, &someData, (const struct sockaddr*)&remoteAddr, (const struct sockaddr*)&localAddr, sockfd, "test", "tset", 2, StunTraceCallBack, sendPacket); ASSERT_TRUE(len != 0); StunClient_HandleICMP(clientData, (struct sockaddr*)&remoteAddr, 3); /* HOP 1 Answer */ ASSERT_TRUE(LastTTL == 1); sockaddr_initFromString( (struct sockaddr*)&hop1Addr, "192.168.1.1:45674" ); StunClient_HandleICMP(clientData, (struct sockaddr*)&hop1Addr, 11); ASSERT_FALSE(Done); ASSERT_FALSE(EndOfTrace); ASSERT_TRUE( sockaddr_alike( (struct sockaddr*)&LastHopAddr, (struct sockaddr*)&hop1Addr ) ); /* HOP 2 No Answer */ ASSERT_TRUE( LastTTL == 2); ASSERT_TRUE( LastTTL == 2); /*Timeout is roughtly 160*50 ms*/ for (int i = 0; i < 160; i++) { StunClient_HandleTick(clientData, 50); } ASSERT_FALSE(Done); ASSERT_FALSE(EndOfTrace); /* HOP 3 Answer */ ASSERT_TRUE(LastTTL == 3); sockaddr_initFromString( (struct sockaddr*)&hop2Addr, "193.200.93.152:45674" ); StunClient_HandleICMP(clientData, (struct sockaddr*)&hop2Addr, 3); ASSERT_TRUE( sockaddr_alike( (struct sockaddr*)&LastHopAddr, (struct sockaddr*)&hop2Addr ) ); ASSERT_FALSE(Done); ASSERT_TRUE(EndOfTrace); /* HOP 1 Answer */ ASSERT_TRUE(LastTTL == 1); sockaddr_initFromString( (struct sockaddr*)&hop1Addr, "192.168.1.1:45674" ); StunClient_HandleICMP(clientData, (struct sockaddr*)&hop1Addr, 11); ASSERT_FALSE(Done); ASSERT_FALSE(EndOfTrace); ASSERT_TRUE( sockaddr_alike( (struct sockaddr*)&LastHopAddr, (struct sockaddr*)&hop1Addr ) ); /* HOP 3 Answer */ ASSERT_TRUE(LastTTL == 3); sockaddr_initFromString( (struct sockaddr*)&hop2Addr, "193.200.93.152:45674" ); StunClient_HandleICMP(clientData, (struct sockaddr*)&hop2Addr, 3); ASSERT_TRUE( sockaddr_alike( (struct sockaddr*)&LastHopAddr, (struct sockaddr*)&hop2Addr ) ); ASSERT_TRUE( Done); ASSERT_TRUE( EndOfTrace); }
CTEST(stuntrace, recurring_IPv4) { int someData = 3; STUN_CLIENT_DATA* clientData; struct sockaddr_storage localAddr, remoteAddr, hop1Addr, hop2Addr; int sockfd = 4; sockaddr_initFromString( (struct sockaddr*)&remoteAddr, "193.200.93.152:45674" ); sockaddr_initFromString( (struct sockaddr*)&localAddr, "192.168.1.34:45674" ); StunClient_Alloc(&clientData); int len = StunTrace_startTrace(clientData, &someData, (const struct sockaddr*)&remoteAddr, (const struct sockaddr*)&localAddr, sockfd, "test", "tset", 2, StunTraceCallBack, sendPacket); ASSERT_TRUE(len != 0); ASSERT_TRUE(LastTTL == 40); StunClient_HandleICMP(clientData, (struct sockaddr*)&remoteAddr, 3); sockaddr_initFromString( (struct sockaddr*)&hop1Addr, "192.168.1.1:45674" ); StunClient_HandleICMP(clientData, (struct sockaddr*)&hop1Addr, 11); ASSERT_FALSE(Done); ASSERT_FALSE(EndOfTrace); ASSERT_TRUE( sockaddr_alike( (struct sockaddr*)&LastHopAddr, (struct sockaddr*)&hop1Addr ) ); ASSERT_TRUE( LastTTL == 2); sockaddr_initFromString( (struct sockaddr*)&hop2Addr, "193.200.93.152:45674" ); StunClient_HandleICMP(clientData, (struct sockaddr*)&hop2Addr, 3); ASSERT_TRUE( sockaddr_alike( (struct sockaddr*)&LastHopAddr, (struct sockaddr*)&hop2Addr ) ); ASSERT_FALSE(Done); ASSERT_TRUE(EndOfTrace); ASSERT_TRUE(LastTTL == 1); StunClient_HandleICMP(clientData, (struct sockaddr*)&hop1Addr, 11); ASSERT_FALSE(Done); ASSERT_FALSE(EndOfTrace); ASSERT_TRUE(LastTTL == 2); StunClient_HandleICMP(clientData, (struct sockaddr*)&hop2Addr, 3); ASSERT_TRUE( sockaddr_alike( (struct sockaddr*)&LastHopAddr, (struct sockaddr*)&hop2Addr ) ); ASSERT_TRUE( Done); ASSERT_TRUE( EndOfTrace); }
int main(int argc, char* argv[]) { struct sockaddr_storage localAddr; char interface[10]; int port; transIDSinUse = 0; pthread_t socketListenThread; pthread_t cleanupThread; STUN_CLIENT_DATA* clientData; struct listenConfig listenConfig; StunClient_Alloc(&clientData); /* StunClient_RegisterLogger(clientData, */ /* stundbg, */ /* NULL); */ signal(SIGINT, teardown); int c; /* int digit_optind = 0; */ /* set config to default values */ strncpy(interface, "default", 7); port = 3478; upstream_loss = 0; static struct option long_options[] = { {"interface", 1, 0, 'i'}, {"port", 1, 0, 'p'}, {"upstream", 1, 0, 'u'}, {"csv", 0, 0, '2'}, {"help", 0, 0, 'h'}, {"version", 0, 0, 'v'}, {NULL, 0, NULL, 0} }; if (argc < 1) { printUsage(); exit(0); } int option_index = 0; while ( ( c = getopt_long(argc, argv, "h2vi:p:m:u:", long_options, &option_index) ) != -1 ) { /* int this_option_optind = optind ? optind : 1; */ switch (c) { case 'i': strncpy(interface, optarg, max_iface_len); break; case 'p': port = atoi(optarg); break; case 'u': upstream_loss = atoi(optarg); break; case '2': csv_output = true; break; case 'h': printUsage(); break; case 'v': printf("Version %s\n", VERSION_SHORT); exit(0); break; default: printf("?? getopt returned character code 0%o ??\n", c); } } if ( !getLocalInterFaceAddrs( (struct sockaddr*)&localAddr, interface, AF_INET, IPv6_ADDR_NORMAL, false ) ) { printf("Error getting IPaddr on %s\n", interface); exit(1); } /* sockfd = createSocket(NULL, MYPORT, AI_PASSIVE, servinfo, &p); */ sockfd = createLocalSocket(AF_INET, (struct sockaddr*)&localAddr, SOCK_DGRAM, port); pthread_mutex_init(&mutexTransId, NULL); pthread_create(&cleanupThread, NULL, transIDCleanup, (void*)transIDs); listenConfig.tInst = clientData; listenConfig.socketConfig[0].sockfd = sockfd; listenConfig.socketConfig[0].user = NULL; listenConfig.socketConfig[0].pass = PASSWORD; listenConfig.stun_handler = stunHandler; listenConfig.numSockets = 1; pthread_create(&socketListenThread, NULL, socketListenDemux, (void*)&listenConfig); pause(); }
int main(int argc, char* argv[]) { struct prg_data prg; struct sigListenConfig lconf; prg.sigData = calloc( 1, sizeof(struct sig_data) ); prg.mediaCnf = calloc( 1, sizeof(struct mediaConfig) ); /* struct mediaConfig mconf; */ /* struct addrinfo servinfo, * p; */ /* Intializes random number generator */ time_t t; srand( (unsigned) time(&t) ); /* struct sockaddr_storage taddr; */ /* Set up the pointer(s).. */ lconf.prg = &prg; /* lconf.mconf = &mconf; */ pthread_t sigSocketListenThread; pthread_t stunTickThread; pthread_t iceTickThread; /* pthread_t turnTickThread; */ if (argc < 3) { fprintf(stderr,"usage: icebox hostname user remoteuser\n"); exit(1); } lconf.sigsock = createTcpSocket(argv[1], SERVERPORT); lconf.signal_path_handler = signalPathHandler; /* lconf.msock = createUdpSocket(argv[1], */ /* STUNPORT, */ /* "turnclient", */ /* 0, */ /* &servinfo, */ /* &p); */ /* if (lconf.msock == -1) */ /* { */ /* return 1; */ /* } */ /* else if (lconf.msock == -2) */ /* { */ /* return 2; */ /* } */ pthread_create(&sigSocketListenThread, NULL, sigSocketListen, (void*)&lconf); strncpy(prg.user, argv[2], MAX_USER_LEN); registerUser(&prg.sigData->state, lconf.sigsock, prg.user); /* Setup ICE */ ICELIB_CONFIGURATION iceConfig; iceConfig.tickIntervalMS = 20; iceConfig.keepAliveIntervalS = 15; iceConfig.maxCheckListPairs = ICELIB_MAX_PAIRS; iceConfig.aggressiveNomination = false; iceConfig.iceLite = false; iceConfig.logLevel = ICELIB_logDebug; /* iceConfig.logLevel = ICELIB_logDisable; */ prg.mediaCnf->icelib = malloc( sizeof(ICELIB_INSTANCE) ); ICELIB_Constructor(prg.mediaCnf->icelib, &iceConfig); /* ICELIB_setCallbackLog(prg.mediaCnf->icelib, */ /* ICELIB_printLog, */ /* NULL, */ /* ICELIB_logDebug); */ ICELIB_setCallbackOutgoingBindingRequest(prg.mediaCnf->icelib, sendConnectivityCheck, &prg); ICELIB_setCallbackOutgoingBindingResponse(prg.mediaCnf->icelib, sendConnectivityResp, &prg); ICELIB_setCallbackConnecitivityChecksComplete(prg.mediaCnf->icelib, complete, &prg); ICELIB_setCallbackNominated(prg.mediaCnf->icelib, nominated, &prg); ICELIB_setCallbackOutgoingCancelRequest(prg.mediaCnf->icelib, cancelSTUNtrans, &prg); /* Setup stun */ StunClient_Alloc(&prg.mediaCnf->stunInstance); /* StunClient_RegisterLogger(prg.mediaCnf->stunInstance, */ /* stunLog, */ /* &prg); */ /* Signal path set up, time to gather the candidates */ /* Turn setup */ /* if ( 0 != getSockaddrFromFqdn( (struct sockaddr*)&taddr, argv[1] ) ) */ /* { */ /* printf("Error getting TURN Server IP\n"); */ /* return 1; */ /* } */ /* TurnClient_StartAllocateTransaction(&lconf.turnInst, */ /* 50, */ /* turnInfoFunc, */ /* "icebox", */ /* &lconf.msock, / * *userCtx * / */ /* (struct sockaddr*)&taddr, */ /* / "test\0", / *argv[2],* / */ /* "pass\0", / *argv[2],* / */ /* AF_INET, */ /* turnSendFunc, */ /* turnCbFunc, */ /* false, */ /* 0); */ /* pthread_create(&turnTickThread, NULL, tickTurn, (void*)lconf.turnInst); */ pthread_create(&stunTickThread, NULL, tickStun, (void*)prg.mediaCnf->stunInstance); pthread_create(&iceTickThread, NULL, tickIce, (void*)prg.mediaCnf->icelib); if (argc == 4) { /* Ok got nothing better to do. Busywaiting */ while (prg.sigData->state != REGISTERED) { } char* sdp = NULL; harvest(prg.mediaCnf->icelib); printf("Completed harvesting\n"); crateCandidateJson(prg.mediaCnf->icelib, &sdp); /* Start to listen here.. */ pthread_create(&prg.mediaCnf->mSocketListenThread, NULL, mSocketListen, (void*)prg.mediaCnf); inviteUser(&prg.sigData->state, lconf.sigsock, argv[3], prg.user, sdp); if (sdp != NULL) { free(sdp); } } /* Just wait a bit for now.. */ sleep(100); printf("Done sleeping teardown\n"); close(lconf.sigsock); StunClient_free(prg.mediaCnf->stunInstance); free(prg.mediaCnf); free(prg.sigData->sdp); free(prg.sigData->msgBuf); free(prg.sigData); return 0; }