/* $Id$ */
/* 
 * Copyright (C) 2003-2005 Benny Prijono <benny@prijono.org>
 *
 * This program 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 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#ifndef __PJLIB_UTIL_STUN_SESSION_H__
#define __PJLIB_UTIL_STUN_SESSION_H__

#include <pjlib-util/stun_msg.h>
#include <pjlib-util/stun_endpoint.h>
#include <pjlib-util/stun_transaction.h>
#include <pj/list.h>


/** Forward declaration for pj_stun_tx_data */
typedef struct pj_stun_tx_data pj_stun_tx_data;

/** Forward declaration for pj_stun_session */
typedef struct pj_stun_session pj_stun_session;

/**
 * This is the callback to be registered to pj_stun_session, to send
 * outgoing message and to receive various notifications from the STUN
 * session.
 */
typedef struct pj_stun_session_cb
{
    /**
     * Callback to be called by the STUN session to send outgoing message.
     *
     * @param tdata	    The STUN transmit data containing the original
     *			    STUN message
     * @param pkt	    Packet to be sent.
     * @param pkt_size	    Size of the packet to be sent.
     * @param addr_len	    Length of destination address.
     * @param dst_addr	    The destination address.
     *
     * @return		    The callback should return the status of the
     *			    packet sending.
     */
    pj_status_t (*on_send_msg)(pj_stun_tx_data *tdata,
			       const void *pkt,
			       pj_size_t pkt_size,
			       unsigned addr_len, 
			       const pj_sockaddr_t *dst_addr);

    /**
     * Callback to be called when Binding response is received or the 
     * transaction has timed out.
     *
     * @param sess	    The STUN session.
     * @param status	    Status of the request. If the value if not
     *			    PJ_SUCCESS, the transaction has timed-out
     *			    or other error has occurred, and the response
     *			    argument may be NULL.
     * @param request	    The original STUN request.
     * @param response	    The response message, on successful transaction.
     */
    void (*on_bind_response)(pj_stun_session *sess, 
			     pj_status_t status, 
			     pj_stun_tx_data *request,
			     const pj_stun_msg *response);

    /**
     * Callback to be called when Allocate response is received or the 
     * transaction has timed out.
     *
     * @param sess	    The STUN session.
     * @param status	    Status of the request. If the value if not
     *			    PJ_SUCCESS, the transaction has timed-out
     *			    or other error has occurred, and the response
     *			    argument may be NULL.
     * @param request	    The original STUN request.
     * @param response	    The response message, on successful transaction.
     */
    void (*on_allocate_response)(pj_stun_session *sess, 
				 pj_status_t status, 
				 pj_stun_tx_data *request,
				 const pj_stun_msg *response);

    /**
     * Callback to be called when Set Active Destination response is received
     * or the transaction has timed out.
     *
     * @param sess	    The STUN session.
     * @param status	    Status of the request. If the value if not
     *			    PJ_SUCCESS, the transaction has timed-out
     *			    or other error has occurred, and the response
     *			    argument may be NULL.
     * @param request	    The original STUN request.
     * @param response	    The response message, on successful transaction.
     */
    void (*on_set_active_destination_response)(pj_stun_session *sess, 
					       pj_status_t status, 
					       pj_stun_tx_data *request,
					       const pj_stun_msg *response);

    /**
     * Callback to be called when Connect response is received or the 
     * transaction has timed out.
     *
     * @param sess	    The STUN session.
     * @param status	    Status of the request. If the value if not
     *			    PJ_SUCCESS, the transaction has timed-out
     *			    or other error has occurred, and the response
     *			    argument may be NULL.
     * @param request	    The original STUN request.
     * @param response	    The response message, on successful transaction.
     */
    void (*on_connect_response)( pj_stun_session *sess, 
				 pj_status_t status, 
				 pj_stun_tx_data *request,
				 const pj_stun_msg *response);
} pj_stun_session_cb;


/**
 * This structure describe the outgoing STUN transmit data to carry the
 * message to be sent.
 */
struct pj_stun_tx_data
{
    PJ_DECL_LIST_MEMBER(struct pj_stun_tx_data);

    pj_pool_t		*pool;		/**< Pool.			    */
    pj_stun_session	*sess;		/**< The STUN session.		    */
    pj_stun_msg		*msg;		/**< The STUN message.		    */
    void		*user_data;	/**< Arbitrary user data.	    */

    pj_stun_client_tsx	*client_tsx;	/**< Client STUN transaction.	    */
    pj_uint8_t		 client_key[12];/**< Client transaction key.	    */

    void		*pkt;		/**< The STUN packet.		    */
    unsigned		 max_len;	/**< Length of packet buffer.	    */
    unsigned		 pkt_size;	/**< The actual length of STUN pkt. */

    unsigned		 addr_len;	/**< Length of destination address. */
    const pj_sockaddr_t	*dst_addr;	/**< Destination address.	    */
};


/**
 * Options that can be specified when creating or sending outgoing STUN
 * messages. These options may be specified as bitmask.
 */
enum pj_stun_session_option
{
    /**
     * Add short term credential to the message. This option may not be used
     * together with PJ_STUN_USE_LONG_TERM_CRED option.
     */
    PJ_STUN_USE_SHORT_TERM_CRED	= 1,

    /**
     * Add long term credential to the message. This option may not be used
     * together with PJ_STUN_USE_SHORT_TERM_CRED option.
     */
    PJ_STUN_USE_LONG_TERM_CRED	= 2,

    /**
     * Add STUN fingerprint to the message.
     */
    PJ_STUN_USE_FINGERPRINT	= 4
};


/**
 * Create a STUN session.
 *
 * @param endpt	    The STUN endpoint, to be used to register timers etc.
 * @param name	    Optional name to be associated with this instance. The
 *		    name will be used for example for logging purpose.
 * @param cb	    Session callback.
 * @param p_sess    Pointer to receive STUN session instance.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_stun_session_create(pj_stun_endpoint *endpt,
					    const char *name,
					    const pj_stun_session_cb *cb,
					    pj_stun_session **p_sess);

/**
 * Destroy the STUN session.
 *
 * @param sess	    The STUN session instance.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_stun_session_destroy(pj_stun_session *sess);

/**
 * Associated an arbitrary data with this STUN session. The user data may
 * be retrieved later with pj_stun_session_get_user_data() function.
 *
 * @param sess	    The STUN session instance.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_stun_session_set_user_data(pj_stun_session *sess,
						   void *user_data);

/**
 * Retrieve the user data previously associated to this STUN session with
 * pj_stun_session_set_user_data().
 *
 * @param sess	    The STUN session instance.
 *
 * @return	    The user data associated with this STUN session.
 */
PJ_DECL(void*) pj_stun_session_get_user_data(pj_stun_session *sess);

/**
 * Save a long term credential to be used by this STUN session when sending
 * outgoing messages. After long term credential is configured, application
 * may specify PJ_STUN_USE_LONG_TERM_CRED option when sending outgoing STUN
 * message to send the long term credential in the message.
 *
 * @param sess	    The STUN session instance.
 * @param realm	    Realm of the long term credential.
 * @param user	    The user name.
 * @param passwd    The pain-text password.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) 
pj_stun_session_set_long_term_credential(pj_stun_session *sess,
					 const pj_str_t *realm,
					 const pj_str_t *user,
					 const pj_str_t *passwd);


/**
 * Save a short term credential to be used by this STUN session when sending
 * outgoing messages. After short term credential is configured, application
 * may specify PJ_STUN_USE_SHORT_TERM_CRED option when sending outgoing STUN
 * message to send the short term credential in the message.
 *
 * @param sess	    The STUN session instance.
 * @param user	    The user name.
 * @param passwd    The pain-text password.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) 
pj_stun_session_set_short_term_credential(pj_stun_session *sess,
					  const pj_str_t *user,
					  const pj_str_t *passwd);

/**
 * Create a STUN Bind request message. After the message has been 
 * successfully created, application can send the message by calling 
 * pj_stun_session_send_msg().
 *
 * @param sess	    The STUN session instance.
 * @param p_tdata   Pointer to receive STUN transmit data instance containing
 *		    the request.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_stun_session_create_bind_req(pj_stun_session *sess,
						     pj_stun_tx_data **p_tdata);

/**
 * Create a STUN Allocate request message. After the message has been
 * successfully created, application can send the message by calling  
 * pj_stun_session_send_msg().
 *
 * @param sess	    The STUN session instance.
 * @param p_tdata   Pointer to receive STUN transmit data instance containing
 *		    the request.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_stun_session_create_allocate_req(pj_stun_session *sess,
							 pj_stun_tx_data **p_tdata);

/**
 * Create a STUN Set Active Destination request message. After the message 
 * has been successfully created, application can send the message by calling
 * pj_stun_session_send_msg().
 *
 * @param sess	    The STUN session instance.
 * @param p_tdata   Pointer to receive STUN transmit data instance containing
 *		    the request.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) 
pj_stun_session_create_set_active_destination_req(pj_stun_session *sess,
						  pj_stun_tx_data **p_tdata);

/**
 * Create a STUN Connect request message. After the message has been 
 * successfully created, application can send the message by calling 
 * pj_stun_session_send_msg().
 *
 * @param sess	    The STUN session instance.
 * @param p_tdata   Pointer to receive STUN transmit data instance containing
 *		    the request.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_stun_session_create_connect_req(pj_stun_session *sess,
							pj_stun_tx_data **p_tdata);

/**
 * Create a STUN Connection Status Indication message. After the message 
 * has been successfully created, application can send the message by calling
 * pj_stun_session_send_msg().
 *
 * @param sess	    The STUN session instance.
 * @param p_tdata   Pointer to receive STUN transmit data instance containing
 *		    the message.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t)
pj_stun_session_create_connection_status_ind(pj_stun_session *sess,
					     pj_stun_tx_data **p_tdata);

/**
 * Create a STUN Send Indication message. After the message has been 
 * successfully created, application can send the message by calling 
 * pj_stun_session_send_msg().
 *
 * @param sess	    The STUN session instance.
 * @param p_tdata   Pointer to receive STUN transmit data instance containing
 *		    the message.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_stun_session_create_send_ind(pj_stun_session *sess,
						     pj_stun_tx_data **p_tdata);

/**
 * Create a STUN Data Indication message. After the message has been 
 * successfully created, application can send the message by calling 
 * pj_stun_session_send_msg().
 *
 * @param sess	    The STUN session instance.
 * @param p_tdata   Pointer to receive STUN transmit data instance containing
 *		    the message.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_stun_session_create_data_ind(pj_stun_session *sess,
						     pj_stun_tx_data **p_tdata);

/**
 * Send STUN message to the specified destination. This function will encode
 * the pj_stun_msg instance to a packet buffer, and add credential or
 * fingerprint if necessary. If the message is a request, the session will
 * also create and manage a STUN client transaction to be used to manage the
 * retransmission of the request. After the message has been encoded and
 * transaction is setup, the \a on_send_msg() callback of pj_stun_session_cb
 * (which is registered when the STUN session is created) will be called
 * to actually send the message to the wire.
 *
 * @param sess	    The STUN session instance.
 * @param options   Optional flags, from pj_stun_session_option.
 * @param addr_len  Length of destination address.
 * @param dst_addr  The destination socket address.
 * @param tdata	    The STUN transmit data containing the STUN message to
 *		    be sent.
 *
 * @return	    PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_stun_session_send_msg(pj_stun_session *sess,
					      unsigned options,
					      unsigned addr_len,
					      const pj_sockaddr_t *dst_addr,
					      pj_stun_tx_data *tdata);

/**
 * Application must call this function to notify the STUN session about
 * the arrival of STUN packet. The STUN packet MUST have been checked
 * first with #pj_stun_msg_check() to verify that this is indeed a valid
 * STUN packet.
 *
 * The STUN session will decode the packet into pj_stun_msg, and process
 * the message accordingly. If the message is a response, it will search
 * through the outstanding STUN client transactions for a matching
 * transaction ID and hand over the response to the transaction.
 *
 * On successful message processing, application will be notified about
 * the message via one of the pj_stun_session_cb callback.
 *
 * @param sess	     The STUN session instance.
 * @param packet     The packet containing STUN message.
 * @param pkt_size   Size of the packet.
 * @param parsed_len Optional pointer to receive the size of the parsed
 *		     STUN message (useful if packet is received via a
 *		     stream oriented protocol).
 *
 * @return	     PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pj_stun_session_on_rx_pkt(pj_stun_session *sess,
					       const void *packet,
					       pj_size_t pkt_size,
					       unsigned *parsed_len);



#endif	/* __PJLIB_UTIL_STUN_SESSION_H__ */

