Add IPv6 support for STUN and TURN.
This commit is contained in:
parent
7bb18c980b
commit
68cf4ff791
|
@ -385,13 +385,25 @@ static void* tnet_stun_attribute_mapped_addr_create(void * self, va_list * app)
|
||||||
memcpy(attribute->address, &addr, 4);
|
memcpy(attribute->address, &addr, 4);
|
||||||
payloadPtr+=4;
|
payloadPtr+=4;
|
||||||
}
|
}
|
||||||
else if(attribute->family == stun_ipv6)
|
|
||||||
{
|
{ /*=== Compute IP address */
|
||||||
TSK_DEBUG_ERROR("IPv6 not supported yet.");
|
size_t addr_size = (attribute->family == stun_ipv6) ? 16 : (attribute->family == stun_ipv4 ? 4 : 0);
|
||||||
}
|
if(addr_size)
|
||||||
else
|
{
|
||||||
{
|
size_t i;
|
||||||
TSK_DEBUG_ERROR("UNKNOWN FAMILY.");
|
uint32_t addr;
|
||||||
|
|
||||||
|
for(i=0; i<addr_size; i+=4)
|
||||||
|
{
|
||||||
|
addr = ntohl(*((uint32_t*)payloadPtr));
|
||||||
|
memcpy(&attribute->address[i], &addr, 4);
|
||||||
|
payloadPtr+=4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TSK_DEBUG_ERROR("UNKNOWN FAMILY [%u].", attribute->family);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -444,29 +456,35 @@ static void* tnet_stun_attribute_xmapped_addr_create(void * self, va_list * app)
|
||||||
then the converting the result to network byte order.
|
then the converting the result to network byte order.
|
||||||
*/
|
*/
|
||||||
attribute->xport = ntohs(*((uint16_t*)payloadPtr));
|
attribute->xport = ntohs(*((uint16_t*)payloadPtr));
|
||||||
//attribute->xport ^= 0x2112;
|
attribute->xport ^= 0x2112;
|
||||||
payloadPtr+=2;
|
payloadPtr+=2;
|
||||||
|
|
||||||
|
|
||||||
|
{ /*=== Compute IP address */
|
||||||
|
|
||||||
if(attribute->family == stun_ipv4)
|
|
||||||
{
|
|
||||||
/* RFC 5389 - 15.2. XOR-MAPPED-ADDRESS
|
/* RFC 5389 - 15.2. XOR-MAPPED-ADDRESS
|
||||||
If the IP address family is IPv4, X-Address is computed by taking the mapped IP
|
If the IP address family is IPv4, X-Address is computed by taking the mapped IP
|
||||||
address in host byte order, XOR'ing it with the magic cookie, and
|
address in host byte order, XOR'ing it with the magic cookie, and
|
||||||
converting the result to network byte order.
|
converting the result to network byte order.
|
||||||
*/
|
*/
|
||||||
uint32_t addr = ntohl(*((uint32_t*)payloadPtr));
|
size_t addr_size = (attribute->family == stun_ipv6) ? 16 : (attribute->family == stun_ipv4 ? 4 : 0);
|
||||||
//addr ^= TNET_STUN_MAGIC_COOKIE;
|
if(addr_size)
|
||||||
memcpy(attribute->xaddress, &addr, 4);
|
{
|
||||||
payloadPtr+=4;
|
size_t i;
|
||||||
}
|
uint32_t addr;
|
||||||
else if(attribute->family == stun_ipv6)
|
|
||||||
{
|
for(i=0; i<addr_size; i+=4)
|
||||||
TSK_DEBUG_ERROR("IPv6 not supported yet.");
|
{
|
||||||
}
|
addr = ntohl(*((uint32_t*)payloadPtr));
|
||||||
else
|
addr ^= TNET_STUN_MAGIC_COOKIE;
|
||||||
{
|
memcpy(&attribute->xaddress[i], &addr, 4);
|
||||||
TSK_DEBUG_ERROR("UNKNOWN FAMILY.");
|
payloadPtr+=4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TSK_DEBUG_ERROR("UNKNOWN FAMILY [%u].", attribute->family);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ TNET_BEGIN_DECLS
|
||||||
**/
|
**/
|
||||||
#define TNET_IS_STUN2(PU8) \
|
#define TNET_IS_STUN2(PU8) \
|
||||||
(((PU8)[0] & 0xc0) == 0x00) && \
|
(((PU8)[0] & 0xc0) == 0x00) && \
|
||||||
((*((uint32_t *)(PU8))+1) == htonl(TNET_STUN_MAGIC_COOKIE))
|
( (*(((uint32_t *)(PU8))+1)) == htonl(TNET_STUN_MAGIC_COOKIE) )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @def TNET_STUN_TRANSACID_SIZE
|
* @def TNET_STUN_TRANSACID_SIZE
|
||||||
|
|
|
@ -131,22 +131,20 @@ int __pred_find_turn_channel_binding(const tsk_list_item_t* item, const void* id
|
||||||
*
|
*
|
||||||
* @return Zero if current list item hold a binding with the same id and -1 otherwise.
|
* @return Zero if current list item hold a binding with the same id and -1 otherwise.
|
||||||
**/
|
**/
|
||||||
int tnet_stun_address_tostring(const uint8_t in_ip[16], tnet_stun_addr_family_t family, int XORed, char** out_ip)
|
int tnet_stun_address_tostring(const uint8_t in_ip[16], tnet_stun_addr_family_t family, char** out_ip)
|
||||||
{
|
{
|
||||||
if(family == stun_ipv6)
|
if(family == stun_ipv6)
|
||||||
{
|
{
|
||||||
TSK_DEBUG_ERROR("IPv6 not supported yet.");
|
tsk_sprintf(out_ip, "%x:%x:%x:%x:%x:%x:%x:%x",
|
||||||
|
ntohs(*((uint16_t*)&in_ip[0])), ntohs(*((uint16_t*)&in_ip[2])), ntohs(*((uint16_t*)&in_ip[4])), ntohs(*((uint16_t*)&in_ip[6])),
|
||||||
|
ntohs(*((uint16_t*)&in_ip[8])), ntohs(*((uint16_t*)&in_ip[10])), ntohs(*((uint16_t*)&in_ip[12])), ntohs(*((uint16_t*)&in_ip[14])));
|
||||||
}
|
}
|
||||||
else if(family == stun_ipv4)
|
else if(family == stun_ipv4)
|
||||||
{
|
{
|
||||||
uint32_t address = *((uint32_t*)in_ip);
|
uint32_t address = *((uint32_t*)in_ip);
|
||||||
address = /*ntohl*/(address);
|
address = /*ntohl*/(address);
|
||||||
if(XORed)
|
|
||||||
{
|
|
||||||
address ^= TNET_STUN_MAGIC_COOKIE;
|
|
||||||
}
|
|
||||||
tsk_sprintf(out_ip, "%u.%u.%u.%u", (address>>24)&0xFF, (address>>16)&0xFF, (address>>8)&0xFF, (address>>0)&0xFF);
|
tsk_sprintf(out_ip, "%u.%u.%u.%u", (address>>24)&0xFF, (address>>16)&0xFF, (address>>8)&0xFF, (address>>0)&0xFF);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -269,15 +267,15 @@ int tnet_nat_stun_get_reflexive_address(const tnet_nat_context_handle_t* self, t
|
||||||
/*STUN2: XOR-MAPPED-ADDRESS */
|
/*STUN2: XOR-MAPPED-ADDRESS */
|
||||||
if(binding->xmaddr)
|
if(binding->xmaddr)
|
||||||
{
|
{
|
||||||
int ret = tnet_stun_address_tostring(binding->xmaddr->xaddress, binding->xmaddr->family, 1, ipaddress);
|
int ret = tnet_stun_address_tostring(binding->xmaddr->xaddress, binding->xmaddr->family, ipaddress);
|
||||||
*port = /*ntohs*/(binding->xmaddr->xport) ^ 0x2112;
|
*port = /*ntohs*/(binding->xmaddr->xport);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*STUN1: MAPPED-ADDRESS*/
|
/*STUN1: MAPPED-ADDRESS*/
|
||||||
if(binding->maddr)
|
if(binding->maddr)
|
||||||
{
|
{
|
||||||
int ret = tnet_stun_address_tostring(binding->maddr->address, binding->maddr->family, 0, ipaddress);
|
int ret = tnet_stun_address_tostring(binding->maddr->address, binding->maddr->family, ipaddress);
|
||||||
*port = /*ntohs*/(binding->maddr->port);
|
*port = /*ntohs*/(binding->maddr->port);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -387,15 +385,15 @@ int tnet_nat_turn_get_reflexive_address(const tnet_nat_context_handle_t* self, t
|
||||||
/*STUN2: XOR-MAPPED-ADDRESS */
|
/*STUN2: XOR-MAPPED-ADDRESS */
|
||||||
if(allocation->xmaddr)
|
if(allocation->xmaddr)
|
||||||
{
|
{
|
||||||
int ret = tnet_stun_address_tostring(allocation->xmaddr->xaddress, allocation->xmaddr->family, 1, ipaddress);
|
int ret = tnet_stun_address_tostring(allocation->xmaddr->xaddress, allocation->xmaddr->family, ipaddress);
|
||||||
*port = /*ntohs*/(allocation->xmaddr->xport) ^ 0x2112;
|
*port = /*ntohs*/(allocation->xmaddr->xport);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*STUN1: MAPPED-ADDRESS*/
|
/*STUN1: MAPPED-ADDRESS*/
|
||||||
if(allocation->maddr)
|
if(allocation->maddr)
|
||||||
{
|
{
|
||||||
int ret = tnet_stun_address_tostring(allocation->maddr->address, allocation->maddr->family, 0, ipaddress);
|
int ret = tnet_stun_address_tostring(allocation->maddr->address, allocation->maddr->family, ipaddress);
|
||||||
*port = /*ntohs*/(allocation->maddr->port);
|
*port = /*ntohs*/(allocation->maddr->port);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -421,25 +421,29 @@ static void* tnet_turn_attribute_xrelayed_addr_create(void * self, va_list * app
|
||||||
attribute->family = (tnet_stun_addr_family_t)(*(payloadPtr++));
|
attribute->family = (tnet_stun_addr_family_t)(*(payloadPtr++));
|
||||||
|
|
||||||
attribute->xport = ntohs(*((uint16_t*)payloadPtr));
|
attribute->xport = ntohs(*((uint16_t*)payloadPtr));
|
||||||
//attribute->xport ^= 0x2112;
|
attribute->xport ^= 0x2112;
|
||||||
payloadPtr+=2;
|
payloadPtr+=2;
|
||||||
|
|
||||||
|
|
||||||
if(attribute->family == stun_ipv4)
|
{ /*=== Compute IP address */
|
||||||
{
|
size_t addr_size = (attribute->family == stun_ipv6) ? 16 : (attribute->family == stun_ipv4 ? 4 : 0);
|
||||||
uint32_t addr = ntohl(*((uint32_t*)payloadPtr));
|
if(addr_size)
|
||||||
//addr ^= TNET_STUN_MAGIC_COOKIE;
|
{
|
||||||
memcpy(attribute->xaddress, &addr, 4);
|
size_t i;
|
||||||
payloadPtr+=4;
|
uint32_t addr;
|
||||||
}
|
|
||||||
else if(attribute->family == stun_ipv6)
|
for(i=0; i<addr_size; i+=4)
|
||||||
{
|
{
|
||||||
TSK_DEBUG_ERROR("IPv6 not supported yet.");
|
addr = ntohl(*((uint32_t*)payloadPtr));
|
||||||
}
|
addr ^= TNET_STUN_MAGIC_COOKIE;
|
||||||
else
|
memcpy(&attribute->xaddress[i], &addr, 4);
|
||||||
{
|
payloadPtr+=4;
|
||||||
TSK_DEBUG_ERROR("UNKNOWN FAMILY.");
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TSK_DEBUG_ERROR("UNKNOWN FAMILY [%u].", attribute->family);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
|
|
|
@ -42,12 +42,13 @@
|
||||||
|
|
||||||
#define RUN_TEST_ALL 0
|
#define RUN_TEST_ALL 0
|
||||||
#define RUN_TEST_SOCKETS 0 /* FIXME: Android */
|
#define RUN_TEST_SOCKETS 0 /* FIXME: Android */
|
||||||
#define RUN_TEST_TRANSPORT 1
|
#define RUN_TEST_TRANSPORT 0
|
||||||
#define RUN_TEST_AUTH 0
|
#define RUN_TEST_AUTH 0
|
||||||
#define RUN_TEST_STUN 0
|
#define RUN_TEST_STUN 0
|
||||||
#define RUN_TEST_NAT 0
|
#define RUN_TEST_NAT 0
|
||||||
#define RUN_TEST_IFACES 0
|
#define RUN_TEST_IFACES 0
|
||||||
#define RUN_TEST_DNS 0
|
#define RUN_TEST_DNS 0
|
||||||
|
#define RUN_TEST_DHCP 0
|
||||||
|
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
int _tmain(int argc, _TCHAR* argv[])
|
int _tmain(int argc, _TCHAR* argv[])
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
void test_dns_query()
|
void test_dns_query()
|
||||||
{
|
{
|
||||||
tnet_dns_ctx_t *ctx = TNET_DNS_CREATE();
|
tnet_dns_ctx_t *ctx = TNET_DNS_CTX_CREATE();
|
||||||
tnet_dns_response_t *response = 0;
|
tnet_dns_response_t *response = 0;
|
||||||
|
|
||||||
if((response = tnet_dns_resolve(ctx, "_stun._udp.ims.inexbee.com", qclass_in, qtype_srv)))
|
if((response = tnet_dns_resolve(ctx, "_stun._udp.ims.inexbee.com", qclass_in, qtype_srv)))
|
||||||
|
|
|
@ -209,16 +209,7 @@ bail:
|
||||||
|
|
||||||
void test_nat()
|
void test_nat()
|
||||||
{
|
{
|
||||||
uint8_t addr[4];
|
test_nat_stun();
|
||||||
|
|
||||||
const char* str = "192.168.16.104";
|
|
||||||
memset(addr, 0, sizeof(addr));
|
|
||||||
|
|
||||||
//sscanf(str,"%64[0-9.]:%32[^,]%n",addr);
|
|
||||||
//sscanf(str,"%3u.%3u.%3u.%3u",&addr[0], &addr[1], &addr[2], &addr[3]);
|
|
||||||
//sscanf(str,"%3u.{1,4}",addr);
|
|
||||||
|
|
||||||
//test_nat_stun();
|
|
||||||
test_nat_turn();
|
test_nat_turn();
|
||||||
tsk_thread_sleep(1000);
|
tsk_thread_sleep(1000);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue