diff options
Diffstat (limited to 'branches/1.0/tinyNET/src/stun/tnet_stun_attribute.c')
-rw-r--r-- | branches/1.0/tinyNET/src/stun/tnet_stun_attribute.c | 960 |
1 files changed, 0 insertions, 960 deletions
diff --git a/branches/1.0/tinyNET/src/stun/tnet_stun_attribute.c b/branches/1.0/tinyNET/src/stun/tnet_stun_attribute.c deleted file mode 100644 index feb6909..0000000 --- a/branches/1.0/tinyNET/src/stun/tnet_stun_attribute.c +++ /dev/null @@ -1,960 +0,0 @@ -/* -* Copyright (C) 2009-2010 Mamadou Diop. -* -* Contact: Mamadou Diop <diopmamadou(at)doubango.org> -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file tnet_stun_attribute.c - * @brief STUN2(RFC 5389) attribute parser. - * - * @author Mamadou Diop <diopmamadou(at)doubango.org> - * - * @date Created: Sat Nov 8 16:54:58 2009 mdiop - */ -#include "tnet_stun_attribute.h" - -#include "tnet_stun.h" - -#include "../tnet_types.h" -#include "../tnet_endianness.h" - -#include "../turn/tnet_turn_attribute.h" - -#include "tsk_memory.h" -#include "tsk_string.h" -#include "tsk_debug.h" - -#include <string.h> - - -/**@ingroup tnet_stun_group -* RFC 5389 - 15. STUN Attributes -* Creates new @ref tnet_stun_attribute_def_t object. -*/ -tnet_stun_attribute_t* tnet_stun_attribute_create() -{ - return tsk_object_new(tnet_stun_attribute_def_t); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.1. MAPPED-ADDRESS. -* Creates new @ref tnet_stun_attribute_mapped_addr_t object. -*/ -tnet_stun_attribute_mapped_addr_t* tnet_stun_attribute_mapped_address_create(const void* payload, tsk_size_t payload_size) -{ - return tsk_object_new(tnet_stun_attribute_mapped_addr_def_t, payload, payload_size); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.2. XOR-MAPPED-ADDRESS. -* Creates new @ref tnet_stun_attribute_xmapped_addr_t object. -*/ -tnet_stun_attribute_xmapped_addr_t* tnet_stun_attribute_xmapped_address_create(const void* payload, tsk_size_t payload_size) -{ - return tsk_object_new(tnet_stun_attribute_xmapped_addr_def_t, payload, payload_size); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.3. USERNAME. -* Creates new @ref tnet_stun_attribute_username_t object. -*/ -tnet_stun_attribute_username_t* tnet_stun_attribute_username_create(const void* payload, tsk_size_t payload_size) -{ - return tsk_object_new(tnet_stun_attribute_username_def_t, payload, payload_size); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.4. MESSAGE-INTEGRITY. -* Creates new @ref tnet_stun_attribute_integrity_t object. -*/ -tnet_stun_attribute_integrity_t* tnet_stun_attribute_integrity_create(const void* payload, tsk_size_t payload_size) -{ - return tsk_object_new(tnet_stun_attribute_integrity_def_t, payload, payload_size); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.5. FINGERPRINT. -* Creates new @ref tnet_stun_attribute_fingerprint_t object. -*/ -tnet_stun_attribute_fingerprint_t* tnet_stun_attribute_fingerprint_create(uint32_t fingerprint) -{ - return tsk_object_new(tnet_stun_attribute_fingerprint_def_t, fingerprint); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.6. ERROR-CODE -* Creates new @ref tnet_stun_attribute_errorcode_t object. -*/ -tnet_stun_attribute_errorcode_t* tnet_stun_attribute_errorcode_create(const void* payload, tsk_size_t payload_size) -{ - return tsk_object_new(tnet_stun_attribute_errorcode_def_t, payload, payload_size); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.7. REALM. -* Creates new @ref tnet_stun_attribute_realm_t object. -*/ -tnet_stun_attribute_realm_t* tnet_stun_attribute_realm_create(const void* payload, tsk_size_t payload_size) -{ - return tsk_object_new(tnet_stun_attribute_realm_def_t, payload, payload_size); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.8. NONCE. -* Creates new @ref tnet_stun_attribute_nonce_t object. -*/ -tnet_stun_attribute_nonce_t* tnet_stun_attribute_nonce_create(const void* payload, tsk_size_t payload_size) -{ - return tsk_object_new(tnet_stun_attribute_nonce_def_t, payload, payload_size); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.9. UNKNOWN-ATTRIBUTES. -* Creates new @ref tnet_stun_attribute_unknowns_t object. -*/ -tnet_stun_attribute_unknowns_t* tnet_stun_attribute_unknowns_create(const void* payload, tsk_size_t payload_size) -{ - return tsk_object_new(tnet_stun_attribute_unknowns_def_t, payload, payload_size); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.10. SOFTWARE. -* Creates new @ref tnet_stun_attribute_software_t object. -*/ -tnet_stun_attribute_software_t* tnet_stun_attribute_software_create(const void* payload, tsk_size_t payload_size) -{ - return tsk_object_new(tnet_stun_attribute_software_def_t, payload, payload_size); -} - -/**@ingroup tnet_stun_group -* RFC 5389 - 15.11. ALTERNATE-SERVER. -* Creates new @ref tnet_stun_attribute_altserver_t object. -*/ -tnet_stun_attribute_altserver_t* tnet_stun_attribute_altserver_create(const void* payload, tsk_size_t payload_size) -{ - return tsk_object_new(tnet_stun_attribute_altserver_def_t, payload, payload_size); -} - -/**@ingroup tnet_stun_group -* Creates @ref tnet_stun_attribute_t from raw buffer. -* @param data Raw buffer from which to create the STUN attribute.* -* @param size The size of the eaw buffer. -* @retval @ref tnet_stun_attribute_t object if succeed and NULL other wise. -*/ -tnet_stun_attribute_t* tnet_stun_attribute_deserialize(const void* data, tsk_size_t size) -{ - tnet_stun_attribute_t *attribute = 0; - const uint8_t* dataPtr = data; - - tnet_stun_attribute_type_t type = (tnet_stun_attribute_type_t)tnet_ntohs_2(dataPtr); - uint16_t length = tnet_ntohs_2(&dataPtr[2]); - - /* Check validity */ - if(!data || size<=4/* Type(2-bytes) plus Length (2-bytes) */) - { - return 0; - } - - dataPtr += (2 /* Type */+ 2/* Length */); - - /* Attribute Value - */ - - switch(type) - { - /* RFC 5389 - 15.1. MAPPED-ADDRESS */ - case stun_mapped_address: - { - attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_mapped_address_create(dataPtr, length); - break; - } - - /* RFC 5389 - 15.2. XOR-MAPPED-ADDRESS*/ - case stun_xor_mapped_address: - { - attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_xmapped_address_create(dataPtr, length); - break; - } - - /* RFC 5389 - 15.3. USERNAME*/ - case stun_username: - { - attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_username_create(dataPtr, length); - break; - } - - - /* RFC 5389 - MESSAGE-INTEGRITY*/ - case stun_message_integrity: - { - if(length == TSK_SHA1_DIGEST_SIZE){ - attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_integrity_create(dataPtr, length); - } - break; - } - - /* RFC 5389 - 15.5. FINGERPRINT*/ - case stun_fingerprint: - { - uint32_t fingerprint = tnet_htonl_2(dataPtr); - attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_fingerprint_create(fingerprint); - break; - } - - /* RFC 5389 - 15.6. ERROR-CODE*/ - case stun_error_code: - { - attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_errorcode_create(dataPtr, length); - break; - } - - /* RFC 5389 - 15.7. REALM*/ - case stun_realm: - { - attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_realm_create(dataPtr, length); - break; - } - - /* RFC 5389 - 15.8. NONCE*/ - case stun_nonce: - { - attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_nonce_create(dataPtr, length); - break; - } - - /* RFC 5389 - 15.9. UNKNOWN-ATTRIBUTES*/ - case stun_unknown_attributes: - { - TSK_DEBUG_ERROR("DESERIALIZE:UNKNOWN-ATTRIBUTES ==> NOT IMPLEMENTED"); - attribute = tnet_stun_attribute_create(); - break; - } - - /* RFC 5389 - 15.10. SOFTWARE */ - case stun_software: - { - attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_software_create(dataPtr, length); - break; - } - - /* RFC 5389 - 15.11. ALTERNATE-SERVER */ - case stun_alternate_server: - { - attribute = (tnet_stun_attribute_t *)tnet_stun_attribute_altserver_create(dataPtr, length); - break; - } - - /* draft-ietf-behave-turn-16 subclause 14 */ - case stun_channel_number: - case stun_lifetime: - case stun_reserved2: - case stun_xor_peer_address: - case stun_data: - case stun_xor_relayed_address: - case stun_even_port: - case stun_requested_transport: - case stun_dont_fragment: - case stun_reserved3: - case stun_reservation_token: - { - attribute = tnet_turn_attribute_deserialize(type, length, dataPtr, length); - break; - } - - default: - //TSK_DEBUG_WARN("==> NOT IMPLEMENTED"); - break; - } - - if(!attribute){ - /* Create default */ - attribute = tnet_stun_attribute_create(); - } - - /* Set common values (Do I need this ==> already set by the constructor). */ - attribute->type = type; - attribute->length = length; - - return attribute; -} - -/**@ingroup tnet_stun_group -* Serializes a @ref tnet_stun_attribute_t objet in binary format. -* @param attribute The STUN attribute to serialize. -* @param output The output binary buffer. -* @retval Zero if succeed and non-zero error code otherwise. -*/ -int tnet_stun_attribute_serialize(const tnet_stun_attribute_t* attribute, tsk_buffer_t *output) -{ - if(!attribute || !output){ - return -1; - } - - /* Attribute Type - */ - { - uint16_t type = tnet_htons(attribute->type); - tsk_buffer_append(output, &(type), 2); - } - - /* Attribute Length - */ - { - uint16_t length = tnet_htons(attribute->length); - tsk_buffer_append(output, &(length), 2); - } - - /* Attribute Value - */ - - switch(attribute->type){ - /* RFC 5389 - 15.1. MAPPED-ADDRESS */ - case stun_mapped_address: - { - TSK_DEBUG_ERROR("NOT IMPLEMENTED"); - return -3; - } - - /* RFC 5389 - 15.2. XOR-MAPPED-ADDRESS*/ - case stun_xor_mapped_address: - { - TSK_DEBUG_ERROR("NOT IMPLEMENTED"); - return -3; - } - - /* RFC 5389 - 15.3. USERNAME*/ - case stun_username: - { - tnet_stun_attribute_username_t *username = (tnet_stun_attribute_username_t*)attribute; - tsk_buffer_append(output, username->value, tsk_strlen(username->value)); - return 0; - } - - - /* RFC 5389 - MESSAGE-INTEGRITY*/ - case stun_message_integrity: - { - tnet_stun_attribute_integrity_t *integrity = (tnet_stun_attribute_integrity_t*)attribute; - tsk_buffer_append(output, integrity->sha1digest, TSK_SHA1_DIGEST_SIZE); - return 0; - } - - /* RFC 5389 - 15.5. FINGERPRINT*/ - case stun_fingerprint: - { - uint32_t fingerprint = /*tnet_htonl*/(((tnet_stun_attribute_fingerprint_t*)attribute)->value); - tsk_buffer_append(output, &fingerprint, 4); - return 0; - } - - /* RFC 5389 - 15.6. ERROR-CODE*/ - case stun_error_code: - { - TSK_DEBUG_ERROR("NOT IMPLEMENTED"); - return -3; - } - - /* RFC 5389 - 15.7. REALM*/ - case stun_realm: - { - tnet_stun_attribute_realm_t *realm = (tnet_stun_attribute_realm_t*)attribute; - tsk_buffer_append(output, realm->value, tsk_strlen(realm->value)); - return 0; - } - - /* RFC 5389 - 15.8. NONCE*/ - case stun_nonce: - { - tnet_stun_attribute_nonce_t *nonce = (tnet_stun_attribute_nonce_t*)attribute; - tsk_buffer_append(output, nonce->value, tsk_strlen(nonce->value)); - return 0; - } - - /* RFC 5389 - 15.9. UNKNOWN-ATTRIBUTES*/ - case stun_unknown_attributes: - { - TSK_DEBUG_ERROR("NOT IMPLEMENTED"); - return -3; - } - - /* RFC 5389 - 15.10. SOFTWARE */ - case stun_software: - { - tnet_stun_attribute_software_t *software = (tnet_stun_attribute_software_t*)attribute; - tsk_buffer_append(output, software->value, tsk_strlen(software->value)); - return 0; - } - - /* RFC 5389 - 15.11. ALTERNATE-SERVER */ - case stun_alternate_server: - { - TSK_DEBUG_ERROR("NOT IMPLEMENTED"); - return -3; - } - /* draft-ietf-behave-turn-16 - */ - case stun_channel_number: - case stun_lifetime: - case stun_reserved2: - case stun_xor_peer_address: - case stun_data: - case stun_xor_relayed_address: - case stun_even_port: - case stun_requested_transport: - case stun_dont_fragment: - case stun_reserved3: - case stun_reservation_token: - { - return tnet_turn_attribute_serialize(attribute, output); - } - - default: - return -2; - } -} - -/**@ingroup tnet_stun_group -* Pads a STUN attribute to align it on 4 octets. -* @param attribute The STUN attribute to pad. -* @param output The output buffer into which to put zeros. -*/ -void tnet_stun_attribute_pad(const tnet_stun_attribute_t* attribute, tsk_buffer_t *output) -{ - if(attribute->length%4){ - static uint32_t zeros = 0x00000000; - tsk_buffer_append(output, &zeros, 4-(attribute->length%4)); - } -} - - - - -//================================================================================================= -// [[RFC 5389 - 15. STUN Attributes]] object definition -// -static tsk_object_t* tnet_stun_attribute_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_t *attribute = self; - if(attribute){ - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_t *attribute = self; - if(attribute){ - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_def_s = -{ - sizeof(tnet_stun_attribute_t), - tnet_stun_attribute_ctor, - tnet_stun_attribute_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_def_t = &tnet_stun_attribute_def_s; - - -//================================================================================================= -// [[RFC 5389 - 15.1. MAPPED-ADDRESS]] object definition -// -static tsk_object_t* tnet_stun_attribute_mapped_addr_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_mapped_addr_t *attribute = self; - if(attribute){ - const void *payload = va_arg(*app, const void*); - tsk_size_t payload_size = va_arg(*app, tsk_size_t); - - if(payload && payload_size){ - const uint8_t *payloadPtr = (const uint8_t*)payload; - payloadPtr += 1; /* Ignore first 8bits */ - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_mapped_address; - TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; - - attribute->family = (tnet_stun_addr_family_t) (*(payloadPtr++)); - attribute->port = tnet_ntohs_2(payloadPtr); - payloadPtr+=2; - - { /*=== Compute IP address */ - tsk_size_t addr_size = (attribute->family == stun_ipv6) ? 16 : (attribute->family == stun_ipv4 ? 4 : 0); - if(addr_size){ - tsk_size_t i; - - for(i=0; i<addr_size; i+=4){ - // ntohl() not needed : byte per byte to avoid endianness problem - attribute->address[i] = payloadPtr[0], - attribute->address[i+1] = payloadPtr[1], - attribute->address[i+2] = payloadPtr[2], - attribute->address[i+3] = payloadPtr[3]; - payloadPtr+=4; - } - } - else{ - TSK_DEBUG_ERROR("UNKNOWN FAMILY [%u].", attribute->family); - } - } - } - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_mapped_addr_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_mapped_addr_t *attribute = self; - if(attribute){ - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_mapped_addr_def_s = -{ - sizeof(tnet_stun_attribute_mapped_addr_t), - tnet_stun_attribute_mapped_addr_ctor, - tnet_stun_attribute_mapped_addr_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_mapped_addr_def_t = &tnet_stun_attribute_mapped_addr_def_s; - -//================================================================================================= -// [[RFC 5389 - 15.2. XOR-MAPPED-ADDRESS]] object definition -// -static tsk_object_t* tnet_stun_attribute_xmapped_addr_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_xmapped_addr_t *attribute = self; - if(attribute){ - const void *payload = va_arg(*app, const void*); - tsk_size_t payload_size = va_arg(*app, tsk_size_t); - - if(payload && payload_size){ - const uint8_t *payloadPtr = (const uint8_t*)payload; - payloadPtr += 1; /* Ignore first 8bits */ - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_xor_mapped_address; - TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; - - attribute->family = (tnet_stun_addr_family_t)(*(payloadPtr++)); - - /* RFC 5389 - 15.2. XOR-MAPPED-ADDRESS - X-Port is computed by taking the mapped port in host byte order, - XOR'ing it with the most significant 16 bits of the magic cookie, and - then the converting the result to network byte order. - */ - attribute->xport = tnet_ntohs_2(payloadPtr); - attribute->xport ^= 0x2112; - payloadPtr+=2; - - - { /*=== Compute IP address */ - - /* RFC 5389 - 15.2. XOR-MAPPED-ADDRESS - 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 - converting the result to network byte order. - */ - tsk_size_t addr_size = (attribute->family == stun_ipv6) ? 16 : (attribute->family == stun_ipv4 ? 4 : 0); - if(addr_size){ - tsk_size_t i; - uint32_t addr; - - for(i=0; i<addr_size; i+=4){ - addr = tnet_ntohl(tnet_ntohl_2(payloadPtr) ^ TNET_STUN_MAGIC_COOKIE); - memcpy(&attribute->xaddress[i], &addr, 4); - payloadPtr+=4; - } - } - else{ - TSK_DEBUG_ERROR("UNKNOWN FAMILY [%u].", attribute->family); - } - } - } - - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_xmapped_addr_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_xmapped_addr_t *attribute = self; - if(attribute){ - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_xmapped_addr_def_s = -{ - sizeof(tnet_stun_attribute_xmapped_addr_t), - tnet_stun_attribute_xmapped_addr_ctor, - tnet_stun_attribute_xmapped_addr_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_xmapped_addr_def_t = &tnet_stun_attribute_xmapped_addr_def_s; - - -//================================================================================================= -// [[RFC 5389 - 15.3. USERNAME]] object definition -// -static tsk_object_t* tnet_stun_attribute_username_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_username_t *attribute = self; - if(attribute){ - const void *payload = va_arg(*app, const void*); - tsk_size_t payload_size = va_arg(*app, tsk_size_t); - - attribute->value = tsk_strndup(payload, payload_size); - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_username; - TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_username_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_username_t *attribute = self; - if(attribute){ - TSK_FREE(attribute->value); - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_username_def_s = -{ - sizeof(tnet_stun_attribute_username_t), - tnet_stun_attribute_username_ctor, - tnet_stun_attribute_username_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_username_def_t = &tnet_stun_attribute_username_def_s; - - -//================================================================================================= -// [[RFC 5389 - 15.4. MESSAGE-INTEGRITY]] object definition -// -static tsk_object_t* tnet_stun_attribute_integrity_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_integrity_t *attribute = self; - if(attribute){ - const void *payload = va_arg(*app, const void*); - tsk_size_t payload_size = va_arg(*app, tsk_size_t); - - if(payload_size == TSK_SHA1_DIGEST_SIZE){ - memcpy(attribute->sha1digest, payload, TSK_SHA1_DIGEST_SIZE); - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_message_integrity; - TNET_STUN_ATTRIBUTE(attribute)->length = TSK_SHA1_DIGEST_SIZE; - } - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_integrity_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_integrity_t *attribute = self; - if(attribute){ - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_integrity_def_s = -{ - sizeof(tnet_stun_attribute_integrity_t), - tnet_stun_attribute_integrity_ctor, - tnet_stun_attribute_integrity_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_integrity_def_t = &tnet_stun_attribute_integrity_def_s; - - -//================================================================================================= -// [[RFC 5389 - 15.5. FINGERPRINT]] object definition -// -static tsk_object_t* tnet_stun_attribute_fingerprint_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_fingerprint_t *attribute = self; - if(attribute){ - attribute->value = va_arg(*app, uint32_t); - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_fingerprint; - TNET_STUN_ATTRIBUTE(attribute)->length = 4; - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_fingerprint_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_fingerprint_t *attribute = self; - if(attribute){ - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_fingerprint_def_s = -{ - sizeof(tnet_stun_attribute_fingerprint_t), - tnet_stun_attribute_fingerprint_ctor, - tnet_stun_attribute_fingerprint_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_fingerprint_def_t = &tnet_stun_attribute_fingerprint_def_s; - - - -//================================================================================================= -// [[RFC 5389 - 15.6. ERROR-CODE]] object definition -// -static tsk_object_t* tnet_stun_attribute_errorcode_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_errorcode_t *attribute = self; - if(attribute){ - const uint8_t *payload = (const uint8_t*)va_arg(*app, const void*); - tsk_size_t payload_size = va_arg(*app, tsk_size_t); - - if(payload_size >4){ - uint32_t code = tnet_htonl_2(payload); - payload += 4; - - attribute->_class = code >>8; - attribute->number = (code & 0xFF); - attribute->reason_phrase = tsk_strndup((const char*)payload, (payload_size-4)); - } - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_error_code; - TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_errorcode_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_errorcode_t *attribute = self; - if(attribute){ - TSK_FREE(attribute->reason_phrase); - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_errorcode_def_s = -{ - sizeof(tnet_stun_attribute_errorcode_t), - tnet_stun_attribute_errorcode_ctor, - tnet_stun_attribute_errorcode_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_errorcode_def_t = &tnet_stun_attribute_errorcode_def_s; - - -//================================================================================================= -// [[RFC 5389 - 15.7. REALM]] object definition -// -static tsk_object_t* tnet_stun_attribute_realm_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_realm_t *attribute = self; - if(attribute){ - const void *payload = va_arg(*app, const void*); - tsk_size_t payload_size = va_arg(*app, tsk_size_t); - - attribute->value = tsk_strndup(payload, payload_size); - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_realm; - TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_realm_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_realm_t *attribute = self; - if(attribute){ - TSK_FREE(attribute->value); - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_realm_def_s = -{ - sizeof(tnet_stun_attribute_realm_t), - tnet_stun_attribute_realm_ctor, - tnet_stun_attribute_realm_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_realm_def_t = &tnet_stun_attribute_realm_def_s; - - -//================================================================================================= -// [[RFC 5389 - 15.8. NONCE]] object definition -// -static tsk_object_t* tnet_stun_attribute_nonce_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_nonce_t *attribute = self; - if(attribute){ - const void *payload = va_arg(*app, const void*); - tsk_size_t payload_size = va_arg(*app, tsk_size_t); - - attribute->value = tsk_strndup(payload, payload_size); - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_nonce; - TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_nonce_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_nonce_t *attribute = self; - if(attribute){ - TSK_FREE(attribute->value); - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_nonce_def_s = -{ - sizeof(tnet_stun_attribute_nonce_t), - tnet_stun_attribute_nonce_ctor, - tnet_stun_attribute_nonce_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_nonce_def_t = &tnet_stun_attribute_nonce_def_s; - - -//================================================================================================= -// [[RFC 5389 - 15.9. UNKNOWN-ATTRIBUTES]] object definition -// -static tsk_object_t* tnet_stun_attribute_unknowns_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_unknowns_t *attribute = self; - if(attribute){ - //--const void *payload = va_arg(*app, const void*); - //--tsk_size_t payload_size = va_arg(*app, tsk_size_t); - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_unknown_attributes; - attribute->value = tsk_buffer_create_null(); - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_unknowns_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_unknowns_t *attribute = self; - if(attribute){ - TSK_OBJECT_SAFE_FREE(attribute->value); - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_unknowns_def_s = -{ - sizeof(tnet_stun_attribute_unknowns_t), - tnet_stun_attribute_unknowns_ctor, - tnet_stun_attribute_unknowns_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_unknowns_def_t = &tnet_stun_attribute_unknowns_def_s; - -//================================================================================================= -// [[RFC 5389 - 15.10. SOFTWARE]] object definition -// -static tsk_object_t* tnet_stun_attribute_software_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_software_t *attribute = self; - if(attribute){ - const void *payload = va_arg(*app, const void*); - tsk_size_t payload_size = va_arg(*app, tsk_size_t); - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_software; - - attribute->value = tsk_strndup(payload, payload_size); - TNET_STUN_ATTRIBUTE(attribute)->length = tsk_strlen(attribute->value); - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_software_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_software_t *attribute = self; - if(attribute){ - TSK_FREE(attribute->value); - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_software_def_s = -{ - sizeof(tnet_stun_attribute_software_t), - tnet_stun_attribute_software_ctor, - tnet_stun_attribute_software_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_software_def_t = &tnet_stun_attribute_software_def_s; - -//================================================================================================= -// [[RFC 5389 - 15.11. ALTERNATE-SERVER]] object definition -// -static tsk_object_t* tnet_stun_attribute_altserver_ctor(tsk_object_t * self, va_list * app) -{ - tnet_stun_attribute_altserver_t *attribute = self; - if(attribute){ - const void *payload = va_arg(*app, const void*); - tsk_size_t payload_size = va_arg(*app, tsk_size_t); - - const uint8_t *payloadPtr = (const uint8_t*)payload; - payloadPtr += 1; /* Ignore first 8bits */ - - TNET_STUN_ATTRIBUTE(attribute)->type = stun_alternate_server; - TNET_STUN_ATTRIBUTE(attribute)->length = payload_size; - - attribute->family = (tnet_stun_addr_family_t) (*(payloadPtr++)); - attribute->port = tnet_ntohs_2(payloadPtr); - payloadPtr+=2; - - if(attribute->family == stun_ipv4){ - uint32_t addr = tnet_htonl_2(payloadPtr); - memcpy(attribute->server, &addr, 4); - payloadPtr+=4; - } - else if(attribute->family == stun_ipv6){ - TSK_DEBUG_ERROR("IPv6 not supported yet."); - } - else{ - TSK_DEBUG_ERROR("UNKNOWN FAMILY."); - } - } - return self; -} - -static tsk_object_t* tnet_stun_attribute_altserver_dtor(tsk_object_t * self) -{ - tnet_stun_attribute_altserver_t *attribute = self; - if(attribute){ - } - return self; -} - -static const tsk_object_def_t tnet_stun_attribute_altserver_def_s = -{ - sizeof(tnet_stun_attribute_altserver_t), - tnet_stun_attribute_altserver_ctor, - tnet_stun_attribute_altserver_dtor, - tsk_null, -}; -const tsk_object_def_t *tnet_stun_attribute_altserver_def_t = &tnet_stun_attribute_altserver_def_s; - |