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" ));




}
Exemple #6
0
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*/));

}
Exemple #7
0
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) );

}
Exemple #8
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) );

}
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 );
}
Exemple #12
0
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 ));



}
Exemple #14
0
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 );

}
Exemple #15
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");


}
Exemple #18
0
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;
}
Exemple #19
0
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);

}