doubango/tinyNET/src/stun/tnet_stun_attribute.h
c732d49e
 ///*
 //* Copyright (C) 2010-2011 Mamadou Diop.
 //*
 //* Contact: Mamadou Diop <diopmamadou(at)doubango[dot]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.h
 // * @brief STUN2(RFC 5389) attribute parser.
 // *
 // * @author Mamadou Diop <diopmamadou(at)doubango[dot]org>
 // *
 //
 // */
 //#define TNET_STUN_ATTRIBUTE_H
 //
 //#include "tinynet_config.h"
 //
 //#include "tnet_types.h"
 //
 //#include "tsk_object.h"
 //#include "tsk_buffer.h"
 //#include "tsk_sha1.h"
 //
 ///**@ingroup tnet_stun_group
 //* @def TNET_STUN_ATTRIBUTE
 //* Converts (cast) any STUN attribute to @ref tnet_stun_attr_t pointer.
 //* @param self The attribute to convert (cast).
 //* @retval A pointer to @ref tnet_stun_attr_t object.
 //*/
 //TNET_BEGIN_DECLS
 //
 //#define TNET_STUN_ATTRIBUTE(self)		((tnet_stun_attr_t*)(self))
 //
 ///**@ingroup tnet_stun_group
 // * STUN IP family as per RFC 5389 subclause 15.1.
 //**/
 //typedef enum tnet_stun_addr_family_e {
 //    stun_ipv4 = 0x01,
 //    stun_ipv6 = 0x02
 //}
 //tnet_stun_addr_family_t;
 //
 ///**@ingroup tnet_stun_group
 // * STUN attribute types as per RFC 5389 subclause 18.2.
 //**/
 //typedef enum tnet_stun_attr_type_e {
 //    /* === RFC 5389 - Comprehension-required range (0x0000-0x7FFF) */
 //    stun_reserved = 0x0000,				/**< (Reserved) */
 //    stun_mapped_address = 0x0001,			/**< http://tools.ietf.org/html/rfc5389#page-32 */
 //    stun_response_address = 0x0002,		/**< (Reserved; was RESPONSE-ADDRESS) */
 //    stun_change_address = 0x0003,			/**< (Reserved; was CHANGE-ADDRESS) */
 //    stun_source_address = 0x0004,			/**< (Reserved; was SOURCE-ADDRESS) */
 //    stun_changed_address = 0x0005,			/**< (Reserved; was CHANGED-ADDRESS) */
 //    stun_username = 0x0006,				/**< http://tools.ietf.org/html/rfc5389#page-34 */
 //    stun_password = 0x0007,				/**< (Reserved; was PASSWORD) */
 //    stun_message_integrity = 0x0008,		/**< http://tools.ietf.org/html/rfc5389#page-34 */
 //    stun_error_code = 0x0009,				/**< http://tools.ietf.org/html/rfc5389#page-36 */
 //    stun_unknown_attributes = 0x000A,		/**< http://tools.ietf.org/html/rfc5389#page-38 */
 //    stun_reflected_from = 0x000B,			/**< (Reserved; was REFLECTED-FROM) */
 //    stun_realm = 0x0014,					/**< http://tools.ietf.org/html/rfc5389#page-38 */
 //    stun_nonce = 0x0015,					/**< http://tools.ietf.org/html/rfc5389#page-38 */
 //    stun_xor_mapped_address = 0x0020,		/**< http://tools.ietf.org/html/rfc5389#page-33 */
 //
 //    /* === RFC 5389 - Comprehension-optional range (0x8000-0xFFFF) */
 //    stun_software = 0x8022,				/**< http://tools.ietf.org/html/rfc5389#page-39 */
 //    stun_alternate_server = 0x8023,		/**< http://tools.ietf.org/html/rfc5389#page-39 */
 //    stun_fingerprint = 0x8028,				/**< http://tools.ietf.org/html/rfc5389#page-36 */
 //
 //    /* === draft-ietf-behave-turn-16 */
 //    stun_channel_number = 0x000C,			/**< draft-ietf-behave-turn-16 -  CHANNEL-NUMBER */
 //    stun_lifetime = 0x000D,					/**< draft-ietf-behave-turn-16 -  LIFETIME */
 //    stun_reserved2 = 0x0010,				/**< draft-ietf-behave-turn-16 -  Reserved (was BANDWIDTH) */
 //    stun_xor_peer_address = 0x0012,			/**< draft-ietf-behave-turn-16 -  XOR-PEER-ADDRESS */
 //    stun_data = 0x0013,						/**< draft-ietf-behave-turn-16 -  DATA */
 //    stun_xor_relayed_address = 0x0016,		/**< draft-ietf-behave-turn-16 -  XOR-RELAYED-ADDRESS */
 //    stun_even_port = 0x0018,				/**< draft-ietf-behave-turn-16 -  EVEN-PORT */
 //    stun_requested_transport = 0x0019,		/**< draft-ietf-behave-turn-16 -  REQUESTED-TRANSPORT */
 //    stun_dont_fragment = 0x001A,			/**< draft-ietf-behave-turn-16 -  DONT-FRAGMENT */
 //    stun_reserved3 = 0x0021,				/**< draft-ietf-behave-turn-16 -  Reserved (was TIMER-VAL) */
 //    stun_reservation_token = 0x0022,		/**< draft-ietf-behave-turn-16 -  RESERVATION-TOKEN */
 //
 //    /* RFC 5245 */
 //    stun_ice_priority = 0x0024, /**< 21.2. STUN Attributes */
 //    stun_ice_use_candidate = 0x0025, /**< 21.2. STUN Attributes */
 //    stun_ice_controlled = 0x8029, /**< 21.2. STUN Attributes */
 //    stun_ice_controlling = 0x802A, /**< 21.2. STUN Attributes */
 //}
 //tnet_stun_attr_type_t;
 //
 //
 ///**@ingroup tnet_stun_group
 //	RFC 5389 - 15.  STUN Attributes
 //*/
 //typedef struct tnet_stun_attribute_s {
 //    TSK_DECLARE_OBJECT;
 //    /*
 //    0                   1                   2                   3
 //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    |         Type                  |            Length             |
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    |                         Value (variable)                ....
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    */
 //    tnet_stun_attr_type_t type;
 //    uint16_t length;
 //}
 //tnet_stun_attr_t;
 //
 //typedef tsk_list_t tnet_stun_attributes_L_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_def_t;
 //
 //#define TNET_STUN_DECLARE_ATTRIBUTE tnet_stun_attr_t attribute
 //
 //
 ///**@ingroup tnet_stun_group
 //	*RFC 5389 - 15.1.  MAPPED-ADDRESS
 //	*/
 //typedef struct tnet_stun_attribute_mapped_addr_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //
 //    /*
 //    0                   1                   2                   3
 //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    |0 0 0 0 0 0 0 0|    Family     |           Port                |
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    |                                                               |
 //    |                 Address (32 bits or 128 bits)                 |
 //    |                                                               |
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    */
 //    tnet_stun_addr_family_t family;
 //    uint16_t port;
 //    uint8_t address[16];
 //}
 //tnet_stun_attribute_mapped_addr_t;
 //
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_mapped_addr_def_t;
 //
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5389 - 15.2.  XOR-MAPPED-ADDRESS
 //*/
 //typedef struct tnet_stun_attribute_xmapped_addr_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //
 //    /*
 //    0                   1                   2                   3
 //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    |x x x x x x x x|    Family     |         X-Port                |
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    |                X-Address (Variable)
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    */
 //    tnet_stun_addr_family_t family;
 //    uint16_t xport;
 //    uint8_t xaddress[16];
 //}
 //tnet_stun_attribute_xmapped_addr_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_xmapped_addr_def_t;
 //
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5389 - 15.3.  USERNAME.
 //*/
 //typedef struct tnet_stun_attribute_username_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //
 //    char* value;
 //}
 //tnet_stun_attribute_username_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_username_def_t;
 //
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5389 - 15.4.  MESSAGE-INTEGRITY.
 //*/
 //typedef struct tnet_stun_attribute_integrity_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //
 //    tsk_sha1digest_t sha1digest;
 //}
 //tnet_stun_attribute_integrity_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_integrity_def_t;
 //
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5389 - 15.5.  FINGERPRINT.
 //*/
 //typedef struct tnet_stun_attribute_fingerprint_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //
 //    uint32_t value;
 //}
 //tnet_stun_attribute_fingerprint_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_fingerprint_def_t;
 //
 ///**@ingroup tnet_stun_group
 //	*RFC 5389 - 15.6.  ERROR-CODE
 //*/
 //typedef struct tnet_stun_attribute_errorcode_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //    /*
 //    0                   1                   2                   3
 //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    |           Reserved, should be 0         |Class|     Number    |
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    |      Reason Phrase (variable)                                ..
 //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    */
 //    uint8_t _class;
 //    uint8_t number;
 //    char* reason_phrase;
 //}
 //tnet_stun_attribute_errorcode_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_errorcode_def_t;
 //
 //
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5389 - 15.7.  REALM. */
 //typedef struct tnet_stun_attribute_realm_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //
 //    char* value;
 //}
 //tnet_stun_attribute_realm_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_realm_def_t;
 //
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5389 - 15.8.  NONCE. */
 //typedef struct tnet_stun_attribute_nonce_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //
 //    char* value;
 //}
 //tnet_stun_attribute_nonce_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_nonce_def_t;
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5389 - 15.9.  UNKNOWN-ATTRIBUTES. */
 //typedef struct tnet_stun_attribute_unknowns_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //
 //    tsk_buffer_t *value;
 //}
 //tnet_stun_attribute_unknowns_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_unknowns_def_t;
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5389 - 15.10.  SOFTWARE. */
 //typedef struct tnet_stun_attribute_software_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //
 //    char *value;
 //}
 //tnet_stun_attribute_software_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_software_def_t;
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5389 - 15.11.  ALTERNATE-SERVER. */
 //typedef struct tnet_stun_attribute_altserver_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //
 //    tnet_stun_addr_family_t family;
 //    uint16_t port;
 //    uint8_t server[128];
 //}
 //tnet_stun_attribute_altserver_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_altserver_def_t;
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5245 - 19.1.  New Attributes */
 //typedef struct tnet_stun_attribute_ice_priority_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //    uint32_t value;
 //}
 //tnet_stun_attribute_ice_priority_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_ice_priority_def_t;
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5245 - 19.1.  New Attributes */
 //typedef struct tnet_stun_attribute_ice_use_candidate_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //}
 //tnet_stun_attribute_ice_use_candidate_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_ice_use_candidate_def_t;
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5245 - 19.1.  New Attributes */
 //typedef struct tnet_stun_attribute_ice_controlled_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //    uint64_t value;
 //}
 //tnet_stun_attribute_ice_controlled_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_ice_controlled_def_t;
 //
 ///**@ingroup tnet_stun_group
 //* RFC 5245 - 19.1.  New Attributes */
 //typedef struct tnet_stun_attribute_ice_controlling_s {
 //    TNET_STUN_DECLARE_ATTRIBUTE;
 //    uint64_t value;
 //}
 //tnet_stun_attribute_ice_controlling_t;
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_attribute_ice_controlling_def_t;
 //
 //tnet_stun_attr_t* tnet_stun_attribute_deserialize(const void* data, tsk_size_t size);
 //int tnet_stun_attribute_serialize(const tnet_stun_attr_t* attribute, tsk_buffer_t *output);
 //void tnet_stun_attribute_pad(const tnet_stun_attr_t* attribute, tsk_buffer_t *output);
 //
 //
 //
 //
 //tnet_stun_attr_t* tnet_stun_attribute_create();
 //TINYNET_API tnet_stun_attribute_mapped_addr_t* tnet_stun_attribute_mapped_address_create(const void* payload, tsk_size_t payload_size);
 //TINYNET_API tnet_stun_attribute_xmapped_addr_t* tnet_stun_attribute_xmapped_address_create(const void* payload, tsk_size_t payload_size);
 //TINYNET_API tnet_stun_attribute_username_t* tnet_stun_attribute_username_create(const void* payload, tsk_size_t payload_size);
 //TINYNET_API tnet_stun_attribute_integrity_t* tnet_stun_attribute_integrity_create(const void* payload, tsk_size_t payload_size);
 //TINYNET_API tnet_stun_attribute_fingerprint_t* tnet_stun_attribute_fingerprint_create(uint32_t fingerprint);
 //TINYNET_API tnet_stun_attribute_errorcode_t* tnet_stun_attribute_errorcode_create(const void* payload, tsk_size_t payload_size);
 //TINYNET_API tnet_stun_attribute_realm_t* tnet_stun_attribute_realm_create(const void* payload, tsk_size_t payload_size);
 //TINYNET_API tnet_stun_attribute_nonce_t* tnet_stun_attribute_nonce_create(const void* payload, tsk_size_t payload_size);
 //TINYNET_API tnet_stun_attribute_unknowns_t* tnet_stun_attribute_unknowns_create(const void* payload, tsk_size_t payload_size);
 //TINYNET_API tnet_stun_attribute_software_t* tnet_stun_attribute_software_create(const void* payload, tsk_size_t payload_size);
 //TINYNET_API tnet_stun_attribute_altserver_t* tnet_stun_attribute_altserver_create(const void* payload, tsk_size_t payload_size);
 //TINYNET_API tnet_stun_attribute_ice_priority_t* tnet_stun_attribute_ice_priority_create(uint32_t value);
 //TINYNET_API tnet_stun_attribute_ice_use_candidate_t* tnet_stun_attribute_ice_use_candidate_create();
 //TINYNET_API tnet_stun_attribute_ice_controlled_t* tnet_stun_attribute_ice_controlled_create(uint64_t value);
 //TINYNET_API tnet_stun_attribute_ice_controlling_t* tnet_stun_attribute_ice_controlling_create(uint64_t value);
 //
 //
 //TNET_END_DECLS
 //
 //