/* $Id$ */
/* 
 * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
 * Copyright (C) 2003-2008 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 __PJMEDIA_TRANSPORT_UDP_H__
#define __PJMEDIA_TRANSPORT_UDP_H__


/**
 * @file transport_udp.h
 * @brief Stream transport with UDP.
 */

#include <pjmedia/stream.h>


/**
 * @defgroup PJMEDIA_TRANSPORT_UDP UDP Media Transport
 * @ingroup PJMEDIA_TRANSPORT
 * @brief Implementation of media transport with UDP sockets.
 * @{
 *
 * The UDP media transport is the standard based media transport
 * as described by RFC 3550/3551. It can be used to facilitate RTP/RTCP
 * unicast or multicast communication.
 */

PJ_BEGIN_DECL


/**
 * Options that can be specified when creating UDP transport.
 */
enum pjmedia_transport_udp_options
{
    /**
     * Normally the UDP transport will continuously check the source address
     * of incoming packets to see if it is different than the configured
     * remote address, and switch the remote address to the source address
     * of the packet if they are different after several packets are
     * received.
     * Specifying this option will disable this feature.
     */
    PJMEDIA_UDP_NO_SRC_ADDR_CHECKING = 1
};


/**
 * Create an RTP and RTCP sockets and bind the sockets to the specified
 * port to create media transport.
 *
 * @param endpt	    The media endpoint instance.
 * @param name	    Optional name to be assigned to the transport.
 * @param port	    UDP port number for the RTP socket. The RTCP port number
 *		    will be set to one above RTP port.
 * @param options   Options, bitmask of #pjmedia_transport_udp_options.
 * @param p_tp	    Pointer to receive the transport instance.
 *
 * @return	    PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjmedia_transport_udp_create(pjmedia_endpt *endpt,
						  const char *name,
						  int port,
						  unsigned options,
						  pjmedia_transport **p_tp);


/**
 * Create an RTP and RTCP sockets and bind the sockets to the specified
 * address and port to create media transport.
 *
 * @param endpt	    The media endpoint instance.
 * @param name	    Optional name to be assigned to the transport.
 * @param addr	    Optional local address to bind the sockets to. If this
 *		    argument is NULL or empty, the sockets will be bound
 *		    to all interface.
 * @param port	    UDP port number for the RTP socket. The RTCP port number
 *		    will be set to one above RTP port.
 * @param options   Options, bitmask of #pjmedia_transport_udp_options.
 * @param p_tp	    Pointer to receive the transport instance.
 *
 * @return	    PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjmedia_transport_udp_create2(pjmedia_endpt *endpt,
						   const char *name,
						   const pj_str_t *addr,
						   int port,
						   unsigned options,
						   pjmedia_transport **p_tp);

/**
 * Another variant of #pjmedia_transport_udp_create() which allows
 * the creation of IPv6 transport.
 *
 * @param endpt	    The media endpoint instance.
 * @param af	    Address family, which can be pj_AF_INET() for IPv4 or
 *		    pj_AF_INET6() for IPv6.
 * @param name	    Optional name to be assigned to the transport.
 * @param addr	    Optional local address to bind the sockets to. If this
 *		    argument is NULL or empty, the sockets will be bound
 *		    to all interface.
 * @param port	    UDP port number for the RTP socket. The RTCP port number
 *		    will be set to one above RTP port.
 * @param options   Options, bitmask of #pjmedia_transport_udp_options.
 * @param p_tp	    Pointer to receive the transport instance.
 *
 * @return	    PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjmedia_transport_udp_create3(pjmedia_endpt *endpt,
						   int af,
						   const char *name,
						   const pj_str_t *addr,
						   int port,
						   unsigned options,
						   pjmedia_transport **p_tp);


/**
 * Create UDP stream transport from existing sockets. Use this function when
 * the sockets have previously been created.
 *
 * @param endpt	    The media endpoint instance.
 * @param name	    Optional name to be assigned to the transport.
 * @param si	    Media socket info containing the RTP and RTCP sockets.
 * @param options   Options, bitmask of #pjmedia_transport_udp_options.
 * @param p_tp	    Pointer to receive the transport instance.
 *
 * @return	    PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t) pjmedia_transport_udp_attach(pjmedia_endpt *endpt,
						  const char *name,
						  const pjmedia_sock_info *si,
						  unsigned options,
						  pjmedia_transport **p_tp);


PJ_END_DECL


/**
 * @}
 */


#endif	/* __PJMEDIA_TRANSPORT_UDP_H__ */


