doubango/tinyNET/src/stun/tnet_stun_message.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_message.h
 // * @brief STUN2 (RFC 5389) message parser.
 // *
 // * @author Mamadou Diop <diopmamadou(at)doubango[dot]org>
 // *
 //
 // */
 //#define TNET_STUN_MESSAGE_H
 //
 //#include "tinynet_config.h"
 //#include "stun/tnet_stun_attribute.h"
 //
 //#include "tsk_buffer.h"
 //
 //TNET_BEGIN_DECLS
 //
 //#define TNET_STUN_CLASS_REQUEST_MASK		(0x0000)
 //#define TNET_STUN_CLASS_INDICATION_MASK		(0x0010)
 //#define TNET_STUN_CLASS_SUCCESS_MASK		(0x0100)
 //#define TNET_STUN_CLASS_ERROR_MASK			(0x0110)
 //
 ///**@ingroup tnet_stun_group
 //* @def TNET_STUN_MESSAGE_IS_REQUEST
 //* Checks whether the STUN message is a request or not.
 //*/
 ///**@ingroup tnet_stun_group
 //* @def TNET_STUN_MESSAGE_IS_INDICATION
 //* Checks whether the STUN message is an indicaton message or not.
 //*/
 ///**@ingroup tnet_stun_group
 //* @def TNET_STUN_PKT_RESP_IS_SUCCESS
 //* Checks whether the STUN message is a success response or not.
 //*/
 ///**@ingroup tnet_stun_group
 //* @def TNET_STUN_PKT_RESP_IS_ERROR
 //* Checks whether the STUN message is an error response or not.
 //*/
 //#define TNET_STUN_MESSAGE_IS_REQUEST(self)						((self) && (((self)->type & 0x0110) == TNET_STUN_CLASS_REQUEST_MASK))
 //#define TNET_STUN_MESSAGE_IS_RESPONSE(self)						(TNET_STUN_PKT_RESP_IS_SUCCESS((self)) || TNET_STUN_PKT_RESP_IS_ERROR((self)))
 //#define TNET_STUN_MESSAGE_IS_INDICATION(self)					((self) && (((self)->type & 0x0110) == TNET_STUN_CLASS_INDICATION_MASK))
 //#define TNET_STUN_PKT_RESP_IS_SUCCESS(self)						((self) && (((self)->type & 0x0110) == TNET_STUN_CLASS_SUCCESS_MASK))
 //#define TNET_STUN_PKT_RESP_IS_ERROR(self)						((self) && (((self)->type & 0x0110) == TNET_STUN_CLASS_ERROR_MASK))
 //
 ///**@ingroup tnet_stun_group
 // * Checks if the pointer to the buffer hold a STUN header by checking that it starts with 0b00 and contain the magic cookie.
 // *			As per RFC 5389 subclause 19: Explicitly point out that the most significant 2 bits of STUN are
 // *			0b00, allowing easy differentiation with RTP packets when used with ICE.
 // *			As per RFC 5389 subclause 6: The magic cookie field MUST contain the fixed value 0x2112A442 in
 // *			network byte order.
 // *
 // * @param	PU8	The pointer to the buffer holding the STUN raw data.
 //**/
 //#define TNET_STUN_BUFF_IS_STUN2(PU8, SIZE)	\
 //	( \
 //		((PU8)) && \
 //		((SIZE) >= kStunAttrHdrSizeInOctets) && \
 //		(((PU8)[0] & 0xc0) == 0x00) && \
 //		( PU8[4] == 0x21 && PU8[5] == 0x12 && PU8[6] == 0xA4 && PU8[7] == 0x42 ) \
 //	)
 //#define TNET_IS_STUN2 TNET_STUN_BUFF_IS_STUN2 // for backward compatibility
 //
 ///**@ingroup tnet_stun_group
 // * STUN trasactionn ID size (96bits = 12bytes).
 //*/
 //#define TNET_STUN_TRANSACID_SIZE		12
 //
 ///**@ingroup tnet_stun_group
 // * Defines an alias representing the STUN transaction id type.
 //**/
 //typedef uint8_t tnet_stun_transac_id_t[TNET_STUN_TRANSACID_SIZE];
 //
 ///**@ingroup tnet_stun_group
 // * List of all supported STUN classes as per RFC 5389 subcaluse 6.
 //**/
 //typedef enum tnet_stun_class_type_e {
 //    stun_class_request = 0x00,				/**< Request class: 0b00 */
 //    stun_class_indication = 0x01,			/**< Indication class: 0b01 */
 //    stun_class_success_response = 0x02,	/**< Success response class: 0b10 */
 //    stun_class_error_response = 0x03,		/**< Error/failure response class: 0b11 */
 //}
 //tnet_stun_class_type_t;
 //
 ///**@ingroup tnet_stun_group
 // * List of all supported STUN methods.
 // * RFC 5389 only define one method(Bining). All other methods have been defined
 // * by TURN (draft-ietf-behave-turn-16 and draft-ietf-behave-turn-tcp-05).
 //**/
 //typedef enum tnet_stun_method_type_e {
 //    stun_method_binding = 0x0001, /**< RFC 5389 - Binding method: 0b000000000001 */
 //
 //    stun_method_allocate = 0x0003,  /**< draft-ietf-behave-turn-16 - Allocate          (only request/response semantics defined) */
 //    stun_method_refresh = 0x0004,  /**< draft-ietf-behave-turn-16 - Refresh           (only request/response semantics defined) */
 //    stun_method_send = 0x0006,  /**< draft-ietf-behave-turn-16 - Send              (only indication semantics defined) */
 //    stun_method_data = 0x0007,  /**< draft-ietf-behave-turn-16 - Data              (only indication semantics defined) */
 //    stun_method_createpermission = 0x0008,  /**< draft-ietf-behave-turn-16 - CreatePermission  (only request/response semantics defined */
 //    stun_method_channelbind = 0x0009,  /**< draft-ietf-behave-turn-16 - ChannelBind       (only request/response semantics defined) */
 //}
 //tnet_stun_method_type_t;
 //
 ///**@ingroup tnet_stun_group
 //* List of all supported STUN types.
 //*/
 //typedef enum tnet_stun_pkt_type_e {
 //    /*	RFC 5389 - 6.  STUN Message Structure
 //
 //    	The message type defines the message class (request, success
 //    	response, failure response, or indication) and the message method
 //    	(the primary function) of the STUN message.  Although there are four
 //    	message classes, there are only two types of transactions in STUN:
 //    	request/response transactions (which consist of a request message and
 //    	a response message) and indication transactions (which consist of a
 //    	single indication message).  Response classes are split into error
 //    	and success responses to aid in quickly processing the STUN message.
 //
 //    	The message type field is decomposed further into the following
 //    	structure:
 //
 //    	0                 1
 //        2  3  4 5 6 7 8 9 0 1 2 3 4 5
 //       +--+--+-+-+-+-+-+-+-+-+-+-+-+-+
 //       |M |M |M|M|M|C|M|M|M|C|M|M|M|M|
 //       |11|10|9|8|7|1|6|5|4|0|3|2|1|0|
 //       +--+--+-+-+-+-+-+-+-+-+-+-+-+-+
 //    */
 //    stun_binding_request = (stun_method_binding | TNET_STUN_CLASS_REQUEST_MASK),
 //    stun_binding_indication = (stun_method_binding | TNET_STUN_CLASS_INDICATION_MASK),
 //    stun_binding_success_response = (stun_method_binding | TNET_STUN_CLASS_SUCCESS_MASK),
 //    stun_binding_error_response = (stun_method_binding | TNET_STUN_CLASS_ERROR_MASK),
 //
 //    stun_allocate_request = (stun_method_allocate | TNET_STUN_CLASS_REQUEST_MASK),
 //    stun_allocate_indication = (stun_method_allocate | TNET_STUN_CLASS_INDICATION_MASK),
 //    stun_allocate_success_response = (stun_method_allocate | TNET_STUN_CLASS_SUCCESS_MASK),
 //    stun_allocate_error_response = (stun_method_allocate | TNET_STUN_CLASS_ERROR_MASK),
 //
 //    stun_refresh_request = (stun_method_refresh | TNET_STUN_CLASS_REQUEST_MASK),
 //    stun_refresh_indication = (stun_method_refresh | TNET_STUN_CLASS_INDICATION_MASK),
 //    stun_refresh_success_response = (stun_method_refresh | TNET_STUN_CLASS_SUCCESS_MASK),
 //    stun_refresh_error_response = (stun_method_refresh | TNET_STUN_CLASS_ERROR_MASK),
 //
 //    stun_send_indication = (stun_method_send | TNET_STUN_CLASS_INDICATION_MASK),
 //
 //    stun_data_indication = (stun_method_data | TNET_STUN_CLASS_INDICATION_MASK),
 //
 //    stun_createpermission_request = (stun_method_createpermission | TNET_STUN_CLASS_REQUEST_MASK),
 //    stun_createpermission_indication = (stun_method_createpermission | TNET_STUN_CLASS_INDICATION_MASK),
 //    stun_createpermission_success_response = (stun_method_createpermission | TNET_STUN_CLASS_SUCCESS_MASK),
 //    stun_createpermission_error_response = (stun_method_createpermission | TNET_STUN_CLASS_ERROR_MASK),
 //
 //    stun_channelbind_request = (stun_method_channelbind | TNET_STUN_CLASS_REQUEST_MASK),
 //    stun_channelbind_indication = (stun_method_channelbind | TNET_STUN_CLASS_INDICATION_MASK),
 //    stun_channelbind_success_response = (stun_method_channelbind | TNET_STUN_CLASS_SUCCESS_MASK),
 //    stun_channelbind_error_response = (stun_method_channelbind | TNET_STUN_CLASS_ERROR_MASK),
 //}
 //tnet_stun_pkt_type_t;
 //
 ///**@ingroup tnet_stun_group
 // *
 // * STUN Message structure as per RFC 5389 subclause 6.
 // *			http://tools.ietf.org/html/rfc5389#section-6
 //*/
 //typedef struct tnet_stun_pkt_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
 //      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //      |0 0|     STUN Message Type     |         Message Length        |
 //      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //      |                         Magic Cookie                          |
 //      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //      |                                                               |
 //      |                     Transaction ID (96 bits)                  |
 //      |                                                               |
 //      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //    */
 //
 //    tnet_stun_pkt_type_t type;
 //    uint16_t length;
 //    uint32_t cookie;
 //    tnet_stun_transac_id_t transaction_id;
 //
 //    unsigned fingerprint:1;
 //    unsigned integrity:1;
 //    unsigned dontfrag:1;
 //    unsigned nointegrity:1;
 //
 //    char* username;
 //    char* password;
 //    char* realm;
 //    char* nonce;
 //
 //    tnet_stun_attributes_L_t *attributes; /**< List of all attributes associated to this message */
 //}
 //tnet_stun_pkt_t;
 //
 //typedef tnet_stun_pkt_t tnet_stun_pkt_resp_t;
 //typedef tnet_stun_pkt_t tnet_stun_pkt_req_t;
 //
 //TINYNET_API tsk_buffer_t* tnet_stun_pkt_serialize(const tnet_stun_pkt_t *message);
 //tnet_stun_pkt_t* tnet_stun_message_deserialize(const uint8_t *data, tsk_size_t size);
 //tsk_bool_t tnet_stun_message_has_attribute(const tnet_stun_pkt_t *self, tnet_stun_attr_type_t type);
 //TINYNET_API int tnet_stun_message_add_attribute(tnet_stun_pkt_t *self, tnet_stun_attr_t** attribute);
 //int tnet_stun_message_remove_attribute(tnet_stun_pkt_t *self, tnet_stun_attr_type_t type);
 //const tnet_stun_attr_t* tnet_stun_message_get_attribute(const tnet_stun_pkt_t *self, tnet_stun_attr_type_t type);
 //short tnet_stun_message_get_errorcode(const tnet_stun_pkt_t *self);
 //const char* tnet_stun_message_get_realm(const tnet_stun_pkt_t *self);
 //const char* tnet_stun_message_get_nonce(const tnet_stun_pkt_t *self);
 //int32_t tnet_stun_message_get_lifetime(const tnet_stun_pkt_t *self);
 //tsk_bool_t tnet_stun_utils_transac_id_equals(const tnet_stun_transac_id_t id1, const tnet_stun_transac_id_t id2);
 //
 //
 //TINYNET_API tnet_stun_pkt_t* tnet_stun_message_create(const char* username, const char* password);
 //TINYNET_API tnet_stun_pkt_t* tnet_stun_message_create_null();
 //
 //TINYNET_GEXTERN const tsk_object_def_t *tnet_stun_message_def_t;
 //
 //
 //TNET_END_DECLS
 //
 //
 //