diff --git a/src/stuntrace.c b/src/stuntrace.c index b1451dd..19378bc 100644 --- a/src/stuntrace.c +++ b/src/stuntrace.c @@ -181,9 +181,6 @@ handleStunRespIcmp(struct hiutResult* result, { if (result->currentTTL < result->user_max_ttl) { - - - result->currentTTL++; while (result->pathElement[result->currentTTL].inactive && result->currentTTL < result->path_max_ttl) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b267558..2bc8998 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,6 +18,7 @@ sa_test ( stunclient ) sa_test ( turnmessage ) sa_test ( stunserver ) sa_test ( turnclient ) +sa_test ( stuntrace ) diff --git a/test/stuntrace_test.c b/test/stuntrace_test.c new file mode 100644 index 0000000..d7ab149 --- /dev/null +++ b/test/stuntrace_test.c @@ -0,0 +1,369 @@ +#include +#include +#include + +#include "test_utils.h" +#include "stunclient.h" +#include "stuntrace.h" +#include "sockaddr_util.h" + + +static StunMsgId LastTransId; +static struct sockaddr_storage LastAddress; +static struct sockaddr_storage LastHopAddr; +static int LastTTL; +static bool Done; +static bool EndOfTrace; + + +static void +sendPacket(void* ctx, + int sockfd, + const uint8_t* buf, + int len, + const struct sockaddr* addr, + int proto, + bool useRelay, + uint8_t ttl) +{ + (void) ctx; + (void) sockfd; + (void) len; + (void) proto; + (void) useRelay; + char addr_str[SOCKADDR_MAX_STRLEN]; + /* find the transaction id so we can use this in the simulated resp */ + + memcpy(&LastTransId, &buf[8], STUN_MSG_ID_SIZE); + + sockaddr_copy( (struct sockaddr*)&LastAddress, addr ); + + sockaddr_toString(addr, addr_str, SOCKADDR_MAX_STRLEN, true); + + LastTTL = ttl; +} + +void +StunTraceCallBack(void* userCtx, + StunTraceCallBackData_T* data) +{ + (void) userCtx; + if (data->nodeAddr == NULL) + { + sockaddr_copy( (struct sockaddr*)&LastHopAddr, data->nodeAddr ); + } + else + { + sockaddr_copy( (struct sockaddr*)&LastHopAddr, data->nodeAddr ); + } + Done = data->done; + EndOfTrace = data->traceEnd; + +} + + +CTEST(stuntrace, run_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", + 1, + StunTraceCallBack, + sendPacket); + ASSERT_TRUE(len == 68); + 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 ) ); + + 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_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 == 68); + 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 ) ); + + 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); +} + +CTEST(stuntrace, no_answer_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", + 1, + StunTraceCallBack, + sendPacket); + ASSERT_TRUE(len == 68); + + /* 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_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 == 68); + + /* 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); + +} diff --git a/test/turnmessage_test.c b/test/turnmessage_test.c index 845f10d..c270bf0 100644 --- a/test/turnmessage_test.c +++ b/test/turnmessage_test.c @@ -267,3 +267,45 @@ CTEST(turnmessage, decode_requestedAddrFamily_IPv6) ASSERT_TRUE(stunMsg.requestedAddrFamilyIPv6.family == 0x2); } + +CTEST(turnmessage, Alternate_server) +{ + StunMessage stunMsg; + + unsigned char stunBuf[120]; + char pad = ' '; + uint32_t mapped = 3221225985U; + memset( &stunMsg, 0, sizeof(StunMessage) ); + + + stunMsg.msgHdr.msgType = STUN_MSG_AllocateErrorResponseMsg; + memcpy(&stunMsg.msgHdr.id.octet,&idOctet,12); + + /*Add Error*/ + ASSERT_TRUE( stunlib_addError(&stunMsg, "Try Alternate", + STUN_ERROR_TRY_ALTERNATE, pad) ); + stunMsg.hasMappedAddress = true; + stunMsg.mappedAddress.familyType = STUN_ADDR_IPv4Family; + stunMsg.mappedAddress.addr.v4.addr = mapped; + stunMsg.mappedAddress.addr.v4.port = 3478; + + ASSERT_TRUE( stunlib_encodeMessage(&stunMsg, + stunBuf, + 120, + (unsigned char*)password, + strlen(password), + NULL) ); + + memset( &stunMsg, 0, sizeof(StunMessage) ); + + ASSERT_TRUE( stunlib_DecodeMessage(stunBuf, + 120, + &stunMsg, + NULL, + NULL) ); + + ASSERT_TRUE(stunMsg.hasMappedAddress); + ASSERT_TRUE(stunMsg.mappedAddress.addr.v4.addr == mapped); + ASSERT_TRUE(stunMsg.mappedAddress.addr.v4.port == 3478); + +}