END_TEST START_TEST (sockaddr_IPv6_ula) { struct sockaddr_storage ip_link; struct sockaddr_storage ip_4; struct sockaddr_storage ip_6; struct sockaddr_storage ip_wrong; sockaddr_initFromString( (struct sockaddr *)&ip_link, "fc00::836:da94:3910:d502" ); sockaddr_initFromString( (struct sockaddr *)&ip_4, "1.2.3.4" ); sockaddr_initFromString( (struct sockaddr *)&ip_6, "2001:470:dc88:2:226:18ff:fe92:6d53" ); fail_unless( sockaddr_isAddrULA( (struct sockaddr *)&ip_link )); fail_if( sockaddr_isAddrULA( (struct sockaddr *)&ip_4 )); fail_if( sockaddr_isAddrULA( (struct sockaddr *)&ip_6 )); ip_wrong.ss_family = 12; fail_if( sockaddr_isAddrULA( (struct sockaddr *)&ip_wrong )); }
END_TEST START_TEST (sockaddr_IPv6_linklocal) { struct sockaddr_storage ip_link; struct sockaddr_storage ip_4; struct sockaddr_storage ip_6; struct sockaddr_storage ip_wrong; sockaddr_initFromString( (struct sockaddr *)&ip_link, "fe80::226:18ff:fe92:6d53" ); sockaddr_initFromString( (struct sockaddr *)&ip_4, "1.2.3.4" ); sockaddr_initFromString( (struct sockaddr *)&ip_6, "2001:470:dc88:2:226:18ff:fe92:6d53" ); fail_unless( sockaddr_isAddrLinkLocal( (struct sockaddr *)&ip_link )); fail_if( sockaddr_isAddrLinkLocal( (struct sockaddr *)&ip_4 )); fail_if( sockaddr_isAddrLinkLocal( (struct sockaddr *)&ip_6 )); ip_wrong.ss_family = 12; fail_if( sockaddr_isAddrLinkLocal( (struct sockaddr *)&ip_wrong )); }
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); }
void sockaddr_setup (void) { //IPv4 sockaddr_IPv4_1 = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initFromString((struct sockaddr *)sockaddr_IPv4_1, ipv4_1_str); sockaddr_IPv4_2 = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initFromString((struct sockaddr *)sockaddr_IPv4_2, ipv4_2_str); sockaddr_IPv4_3 = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initFromString((struct sockaddr *)sockaddr_IPv4_3, ipv4_1_str); sockaddr_IPv4_4 = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initFromString((struct sockaddr *)sockaddr_IPv4_4, ipv4_4_str); //IPv6 sockaddr_IPv6_1 = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initFromString((struct sockaddr *)sockaddr_IPv6_1, ipv6_1_str); sockaddr_IPv6_2 = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initFromString((struct sockaddr *)sockaddr_IPv6_2, ipv6_2_str); sockaddr_IPv6_3 = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initFromString((struct sockaddr *)sockaddr_IPv6_3, ipv6_1_str); sockaddr_IPv6_4 = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initFromString((struct sockaddr *)sockaddr_IPv6_4, ipv6_4_str); //unitialized sockaddr_uninit = (struct sockaddr *)malloc(sizeof(struct sockaddr_storage)); //any sockaddr_IPv4_any = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initFromString((struct sockaddr *)sockaddr_IPv4_any, ipv4_any_str); sockaddr_IPv4_any_2 = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initAsIPv4Any((struct sockaddr_in *)sockaddr_IPv4_any_2); sockaddr_IPv6_any = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initFromString((struct sockaddr *)sockaddr_IPv6_any, ipv6_any_str); sockaddr_IPv6_any_2 = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage)); sockaddr_initAsIPv6Any((struct sockaddr_in6 *)sockaddr_IPv6_any_2); }
END_TEST START_TEST (test_initFromString) { struct sockaddr_storage ip; fail_if( sockaddr_initFromString( (struct sockaddr *)&ip, "" )); fail_if( sockaddr_initFromString( (struct sockaddr *)&ip, "1.2.3.4.5" )); }
CTEST(stunserver, Encode_decode) { StunMessage stunMsg; StunMessage stunResponse; StunMsgId stunId; uint8_t stunBuff[STUN_MAX_PACKET_SIZE]; stunlib_createId(&stunId); sockaddr_initFromString( (struct sockaddr*)&mappedAddr, "193.200.93.152:3478" ); CreateConnectivityBindingResp(&stunMsg, stunId, (struct sockaddr *)&mappedAddr, 1, 1, STUN_MSG_BindResponseMsg, 200, NULL); int len = stunlib_encodeMessage(&stunMsg, (uint8_t*)stunBuff, STUN_MAX_PACKET_SIZE, (unsigned char *) passwd, strlen(passwd), NULL); ASSERT_TRUE(len == 72); ASSERT_TRUE( stunlib_DecodeMessage(stunBuff, len, &stunResponse, NULL, NULL /*stdout for debug*/)); }
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) ); }
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) ); }
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); }
END_TEST START_TEST (sockaddr_IPv4_private) { /* set up addresses */ struct sockaddr_storage addr_192, addr_192_l,addr_192_h; struct sockaddr_storage addr_10, addr_10_l, addr_10_h; struct sockaddr_storage addr_172, addr_172_l, addr_172_h;; struct sockaddr_storage addr_public; sockaddr_initFromString( (struct sockaddr *)&addr_192, "192.168.2.10:3456"); sockaddr_initFromString( (struct sockaddr *)&addr_192_l, "192.168.0.0:3456"); sockaddr_initFromString( (struct sockaddr *)&addr_192_h, "192.168.255.255:3456"); sockaddr_initFromString( (struct sockaddr *)&addr_172, "172.16.31.5:4534"); sockaddr_initFromString( (struct sockaddr *)&addr_172_l, "172.16.0.0:4534"); sockaddr_initFromString( (struct sockaddr *)&addr_172_h, "172.31.255.255:4534"); sockaddr_initFromString( (struct sockaddr *)&addr_10, "10.47.4.5:3459"); sockaddr_initFromString( (struct sockaddr *)&addr_10_l, "10.0.0.0:3459"); sockaddr_initFromString( (struct sockaddr *)&addr_10_h, "10.255.255.255:3459"); sockaddr_initFromString( (struct sockaddr *)&addr_public, "8.8.8.8:4444"); fail_unless( sockaddr_isAddrPrivate( (struct sockaddr *)&addr_192 ) ); fail_unless( sockaddr_isAddrPrivate( (struct sockaddr *)&addr_192_l ) ); fail_unless( sockaddr_isAddrPrivate( (struct sockaddr *)&addr_192_h ) ); fail_unless( sockaddr_isAddrPrivate( (struct sockaddr *)&addr_172 ) ); fail_unless( sockaddr_isAddrPrivate( (struct sockaddr *)&addr_172_l ) ); fail_unless( sockaddr_isAddrPrivate( (struct sockaddr *)&addr_172_h ) ); fail_unless( sockaddr_isAddrPrivate( (struct sockaddr *)&addr_10 ) ); fail_unless( sockaddr_isAddrPrivate( (struct sockaddr *)&addr_10_l ) ); fail_unless( sockaddr_isAddrPrivate( (struct sockaddr *)&addr_10_h ) ); fail_if( sockaddr_isAddrPrivate( (struct sockaddr *)&addr_public ) ); fail_if( sockaddr_isAddrPrivate( (struct sockaddr *)sockaddr_IPv6_1 ) ); //fail_if( sockaddr_ipPort( (struct sockaddr *)sockaddr_IPv6_1 ) == 1234 ); }
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) ); }
END_TEST START_TEST (sockaddr_IPv6_loopback) { struct sockaddr_storage ip; sockaddr_initFromString( (struct sockaddr *)&ip, "::1" ); fail_unless( sockaddr_isAddrLoopBack( (struct sockaddr *)&ip )); }
END_TEST START_TEST (response_encode_IPv6) { StunMessage stunMsg; unsigned char stunBuf[120]; struct sockaddr_storage b; sockaddr_initFromString((struct sockaddr*)&b, "[2001:db8:1234:5678:11:2233:4455:6677]:32853"); memset(&stunMsg, 0, sizeof(StunMessage)); stunMsg.msgHdr.msgType = STUN_MSG_BindResponseMsg; /*id*/ memcpy(&stunMsg.msgHdr.id.octet,&idOctet,12); /*Server*/ stunMsg.hasSoftware = true; memcpy( stunMsg.software.value, software, strlen(software)); stunMsg.software.sizeValue = strlen(software); /*Mapped Address*/ stunMsg.hasXorMappedAddress = true; stunlib_setIP6Address(&stunMsg.xorMappedAddress, ((struct sockaddr_in6 *)&b)->sin6_addr.s6_addr, port); fail_unless( stunlib_addSoftware(&stunMsg, software_resp, '\x20') ); fail_unless( stunlib_encodeMessage(&stunMsg, stunBuf, 96, (unsigned char*)password, strlen(password), NULL)); fail_unless( memcmp(stunBuf, respv6, 92) == 0 ); }
END_TEST START_TEST (response_decode_IPv6) { StunMessage stunMsg; struct sockaddr_storage a; struct sockaddr_storage b; sockaddr_initFromString((struct sockaddr*)&b, "[2001:db8:1234:5678:11:2233:4455:6677]:32853"); fail_unless( stunlib_DecodeMessage( respv6, 96, &stunMsg, NULL, NULL )); fail_unless( stunlib_checkIntegrity(respv6, 96, &stunMsg, password, sizeof(password)) ); fail_unless ( 0 == memcmp(&stunMsg.msgHdr.id.octet,&idOctet,12)); fail_unless( stunMsg.msgHdr.msgType == STUN_MSG_BindResponseMsg ); fail_unless( stunMsg.hasXorMappedAddress ); sockaddr_initFromIPv6Int((struct sockaddr_in6 *)&a, stunMsg.xorMappedAddress.addr.v6.addr, htons(stunMsg.xorMappedAddress.addr.v6.port)); fail_unless( sockaddr_alike((struct sockaddr *)&a, (struct sockaddr *)&b) ); fail_unless( stunMsg.xorMappedAddress.addr.v6.port == port ); fail_unless( stunMsg.hasSoftware); fail_unless( strncmp( stunMsg.software.value, software_resp, max(stunMsg.software.sizeValue,sizeof(software_resp)) )==0 ); }
END_TEST START_TEST (sockaddr_IPv4_loopback) { struct sockaddr_storage ip; struct sockaddr_storage addr; addr.ss_family = 12; sockaddr_initFromString( (struct sockaddr *)&ip, "127.0.0.1" ); fail_unless( sockaddr_isAddrLoopBack( (struct sockaddr *)&ip )); fail_if( sockaddr_isAddrLoopBack( (struct sockaddr *)&addr )); }
END_TEST START_TEST (sockaddr_IPv6_setPort) { struct sockaddr_storage ip; sockaddr_initFromString( (struct sockaddr *)&ip, ipv6_1_noport_str ); sockaddr_setPort( (struct sockaddr *)&ip, 3456 ); fail_unless( sockaddr_alike((struct sockaddr *)&ip, (struct sockaddr *)sockaddr_IPv6_1), "setPort failed"); sockaddr_setPort( (struct sockaddr *)&ip, 1111 ); fail_if( sockaddr_alike((struct sockaddr *)&ip, (struct sockaddr *)sockaddr_IPv6_1), "setPort failed"); }
int sendMessage(struct turn_info *turnInfo, char *dstAddr, char *message) { struct sockaddr_storage addr; unsigned char stunBuf[200]; int msg_len; if (dstAddr != NULL) { sockaddr_initFromString((struct sockaddr *)&addr, dstAddr); /* msg_len = TurnClient_createSendIndication(stunBuf, message, sizeof(stunBuf), strlen(message), (struct sockaddr *)&addr, false, 0, 0); if (addr.ss_family == AF_INET){ if (sockaddr_isSet((struct sockaddr *)&turnInfo->turnAlloc_44.relAddr)){ sendRawUDP(turnInfo->turnAlloc_44.sockfd, stunBuf, msg_len, (struct sockaddr *)&turnInfo->remoteIp4, sizeof( struct sockaddr_storage)); } else if (sockaddr_isSet((struct sockaddr *)&turnInfo->turnAlloc_64.relAddr)){ sendRawUDP(turnInfo->turnAlloc_64.sockfd, stunBuf, msg_len, (struct sockaddr *)&turnInfo->remoteIp6, sizeof( struct sockaddr_storage)); } } if (addr.ss_family == AF_INET6){ if (sockaddr_isSet((struct sockaddr *)&turnInfo->turnAlloc_46.relAddr)){ sendRawUDP(turnInfo->turnAlloc_46.sockfd, stunBuf, msg_len, (struct sockaddr *)&turnInfo->remoteIp4, sizeof( struct sockaddr_storage)); } else if (sockaddr_isSet((struct sockaddr *)&turnInfo->turnAlloc_66.relAddr)){ sendRawUDP(turnInfo->turnAlloc_66.sockfd, stunBuf, msg_len, (struct sockaddr *)&turnInfo->remoteIp6, sizeof( struct sockaddr_storage)); } } */ } else{ //Send messge only where channel is bound } return msg_len; }
bool getLocalInterFaceAddrs(struct sockaddr *addr, char *iface, int ai_family, IPv6_ADDR_TYPE ipv6_addr_type, bool force_privacy){ struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; int rc; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } /* Walk through linked list, maintaining head pointer so we can free list later */ for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; if(ifa->ifa_addr->sa_family != ai_family){ continue; } if (sockaddr_isAddrLoopBack(ifa->ifa_addr)) continue; if( strcmp(iface, ifa->ifa_name)!=0 ) continue; family = ifa->ifa_addr->sa_family; if (family == AF_INET6 ){ if( sockaddr_isAddrDeprecated(ifa->ifa_addr, ifa->ifa_name, sizeof(ifa->ifa_name)) ){ continue; } if (sockaddr_isAddrLinkLocal(ifa->ifa_addr)){ continue; } if (sockaddr_isAddrSiteLocal(ifa->ifa_addr)){ continue; } if(force_privacy){ if( !sockaddr_isAddrTemporary(ifa->ifa_addr, ifa->ifa_name, sizeof(ifa->ifa_name)) ){ continue; } } switch(ipv6_addr_type){ case IPv6_ADDR_NONE: //huh break; case IPv6_ADDR_ULA: if (!sockaddr_isAddrULA(ifa->ifa_addr)){ continue; } break; case IPv6_ADDR_PRIVACY: if( !sockaddr_isAddrTemporary(ifa->ifa_addr, ifa->ifa_name, sizeof(ifa->ifa_name)) ){ continue; } break; case IPv6_ADDR_NORMAL: if (sockaddr_isAddrULA(ifa->ifa_addr)){ continue; } break; }//switch }//IPv6 s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s != 0) { //printf("getnameinfo() failed: %s\n", gai_strerror(s)); exit(EXIT_FAILURE); } break; //for }//for freeifaddrs(ifaddr); if (sockaddr_initFromString(addr, host)) return true; return false; }
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); }
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, 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, 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); }