Wed Nov 28 2012 04:18:15

Asterisk developer's documentation


res_rtp_asterisk.c
Go to the documentation of this file.
00001 /*
00002  * Asterisk -- An open source telephony toolkit.
00003  *
00004  * Copyright (C) 1999 - 2008, Digium, Inc.
00005  *
00006  * Mark Spencer <markster@digium.com>
00007  *
00008  * See http://www.asterisk.org for more information about
00009  * the Asterisk project. Please do not directly contact
00010  * any of the maintainers of this project for assistance;
00011  * the project provides a web site, mailing lists and IRC
00012  * channels for your use.
00013  *
00014  * This program is free software, distributed under the terms of
00015  * the GNU General Public License Version 2. See the LICENSE file
00016  * at the top of the source tree.
00017  */
00018 
00019 /*!
00020  * \file
00021  *
00022  * \brief Supports RTP and RTCP with Symmetric RTP support for NAT traversal.
00023  *
00024  * \author Mark Spencer <markster@digium.com>
00025  *
00026  * \note RTP is defined in RFC 3550.
00027  *
00028  * \ingroup rtp_engines
00029  */
00030 
00031 /*** MODULEINFO
00032    <support_level>core</support_level>
00033  ***/
00034 
00035 #include "asterisk.h"
00036 
00037 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 373702 $")
00038 
00039 #include <sys/time.h>
00040 #include <signal.h>
00041 #include <fcntl.h>
00042 
00043 #include "asterisk/stun.h"
00044 #include "asterisk/pbx.h"
00045 #include "asterisk/frame.h"
00046 #include "asterisk/channel.h"
00047 #include "asterisk/acl.h"
00048 #include "asterisk/config.h"
00049 #include "asterisk/lock.h"
00050 #include "asterisk/utils.h"
00051 #include "asterisk/cli.h"
00052 #include "asterisk/manager.h"
00053 #include "asterisk/unaligned.h"
00054 #include "asterisk/module.h"
00055 #include "asterisk/rtp_engine.h"
00056 
00057 #define MAX_TIMESTAMP_SKEW 640
00058 
00059 #define RTP_SEQ_MOD     (1<<16)  /*!< A sequence number can't be more than 16 bits */
00060 #define RTCP_DEFAULT_INTERVALMS   5000 /*!< Default milli-seconds between RTCP reports we send */
00061 #define RTCP_MIN_INTERVALMS       500  /*!< Min milli-seconds between RTCP reports we send */
00062 #define RTCP_MAX_INTERVALMS       60000   /*!< Max milli-seconds between RTCP reports we send */
00063 
00064 #define DEFAULT_RTP_START 5000 /*!< Default port number to start allocating RTP ports from */
00065 #define DEFAULT_RTP_END 31000  /*!< Default maximum port number to end allocating RTP ports at */
00066 
00067 #define MINIMUM_RTP_PORT 1024 /*!< Minimum port number to accept */
00068 #define MAXIMUM_RTP_PORT 65535 /*!< Maximum port number to accept */
00069 
00070 #define RTCP_PT_FUR     192
00071 #define RTCP_PT_SR      200
00072 #define RTCP_PT_RR      201
00073 #define RTCP_PT_SDES    202
00074 #define RTCP_PT_BYE     203
00075 #define RTCP_PT_APP     204
00076 
00077 #define RTP_MTU      1200
00078 
00079 #define DEFAULT_DTMF_TIMEOUT (150 * (8000 / 1000)) /*!< samples */
00080 
00081 #define ZFONE_PROFILE_ID 0x505a
00082 
00083 #define DEFAULT_LEARNING_MIN_SEQUENTIAL 4
00084 
00085 extern struct ast_srtp_res *res_srtp;
00086 static int dtmftimeout = DEFAULT_DTMF_TIMEOUT;
00087 
00088 static int rtpstart = DEFAULT_RTP_START;        /*!< First port for RTP sessions (set in rtp.conf) */
00089 static int rtpend = DEFAULT_RTP_END;         /*!< Last port for RTP sessions (set in rtp.conf) */
00090 static int rtpdebug;       /*!< Are we debugging? */
00091 static int rtcpdebug;         /*!< Are we debugging RTCP? */
00092 static int rtcpstats;         /*!< Are we debugging RTCP? */
00093 static int rtcpinterval = RTCP_DEFAULT_INTERVALMS; /*!< Time between rtcp reports in millisecs */
00094 static struct ast_sockaddr rtpdebugaddr;  /*!< Debug packets to/from this host */
00095 static struct ast_sockaddr rtcpdebugaddr; /*!< Debug RTCP packets to/from this host */
00096 static int rtpdebugport;      /*< Debug only RTP packets from IP or IP+Port if port is > 0 */
00097 static int rtcpdebugport;     /*< Debug only RTCP packets from IP or IP+Port if port is > 0 */
00098 #ifdef SO_NO_CHECK
00099 static int nochecksums;
00100 #endif
00101 static int strictrtp;         /*< Only accept RTP frames from a defined source. If we receive an indication of a changing source, enter learning mode. */
00102 static int learning_min_sequential; /*< Number of sequential RTP frames needed from a single source during learning mode to accept new source. */
00103 
00104 enum strict_rtp_state {
00105    STRICT_RTP_OPEN = 0, /*! No RTP packets should be dropped, all sources accepted */
00106    STRICT_RTP_LEARN,    /*! Accept next packet as source */
00107    STRICT_RTP_CLOSED,   /*! Drop all RTP packets not coming from source that was learned */
00108 };
00109 
00110 #define FLAG_3389_WARNING               (1 << 0)
00111 #define FLAG_NAT_ACTIVE                 (3 << 1)
00112 #define FLAG_NAT_INACTIVE               (0 << 1)
00113 #define FLAG_NAT_INACTIVE_NOWARN        (1 << 1)
00114 #define FLAG_NEED_MARKER_BIT            (1 << 3)
00115 #define FLAG_DTMF_COMPENSATE            (1 << 4)
00116 
00117 /*! \brief RTP session description */
00118 struct ast_rtp {
00119    int s;
00120    struct ast_frame f;
00121    unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET];
00122    unsigned int ssrc;      /*!< Synchronization source, RFC 3550, page 10. */
00123    unsigned int themssrc;     /*!< Their SSRC */
00124    unsigned int rxssrc;
00125    unsigned int lastts;
00126    unsigned int lastrxts;
00127    unsigned int lastividtimestamp;
00128    unsigned int lastovidtimestamp;
00129    unsigned int lastitexttimestamp;
00130    unsigned int lastotexttimestamp;
00131    unsigned int lasteventseqn;
00132    int lastrxseqno;                /*!< Last received sequence number */
00133    unsigned short seedrxseqno;     /*!< What sequence number did they start with?*/
00134    unsigned int seedrxts;          /*!< What RTP timestamp did they start with? */
00135    unsigned int rxcount;           /*!< How many packets have we received? */
00136    unsigned int rxoctetcount;      /*!< How many octets have we received? should be rxcount *160*/
00137    unsigned int txcount;           /*!< How many packets have we sent? */
00138    unsigned int txoctetcount;      /*!< How many octets have we sent? (txcount*160)*/
00139    unsigned int cycles;            /*!< Shifted count of sequence number cycles */
00140    double rxjitter;                /*!< Interarrival jitter at the moment in seconds */
00141    double rxtransit;               /*!< Relative transit time for previous packet */
00142    format_t lasttxformat;
00143    format_t lastrxformat;
00144 
00145    int rtptimeout;         /*!< RTP timeout time (negative or zero means disabled, negative value means temporarily disabled) */
00146    int rtpholdtimeout;     /*!< RTP timeout when on hold (negative or zero means disabled, negative value means temporarily disabled). */
00147    int rtpkeepalive;    /*!< Send RTP comfort noice packets for keepalive */
00148 
00149    /* DTMF Reception Variables */
00150    char resp;                        /*!< The current digit being processed */
00151    unsigned int last_seqno;          /*!< The last known sequence number for any DTMF packet */
00152    unsigned int last_end_timestamp;  /*!< The last known timestamp received from an END packet */
00153    unsigned int dtmf_duration;       /*!< Total duration in samples since the digit start event */
00154    unsigned int dtmf_timeout;        /*!< When this timestamp is reached we consider END frame lost and forcibly abort digit */
00155    unsigned int dtmfsamples;
00156    enum ast_rtp_dtmf_mode dtmfmode;  /*!< The current DTMF mode of the RTP stream */
00157    /* DTMF Transmission Variables */
00158    unsigned int lastdigitts;
00159    char sending_digit;  /*!< boolean - are we sending digits */
00160    char send_digit;  /*!< digit we are sending */
00161    int send_payload;
00162    int send_duration;
00163    unsigned int flags;
00164    struct timeval rxcore;
00165    struct timeval txcore;
00166    double drxcore;                 /*!< The double representation of the first received packet */
00167    struct timeval lastrx;          /*!< timeval when we last received a packet */
00168    struct timeval dtmfmute;
00169    struct ast_smoother *smoother;
00170    int *ioid;
00171    unsigned short seqno;      /*!< Sequence number, RFC 3550, page 13. */
00172    unsigned short rxseqno;
00173    struct sched_context *sched;
00174    struct io_context *io;
00175    void *data;
00176    struct ast_rtcp *rtcp;
00177    struct ast_rtp *bridged;        /*!< Who we are Packet bridged to */
00178 
00179    enum strict_rtp_state strict_rtp_state; /*!< Current state that strict RTP protection is in */
00180    struct ast_sockaddr strict_rtp_address;  /*!< Remote address information for strict RTP purposes */
00181    struct ast_sockaddr alt_rtp_address; /*!<Alternate remote address information */
00182 
00183    /*
00184     * Learning mode values based on pjmedia's probation mode.  Many of these values are redundant to the above,
00185     * but these are in place to keep learning mode sequence values sealed from their normal counterparts.
00186     */
00187    uint16_t learning_max_seq;    /*!< Highest sequence number heard */
00188    int learning_probation;    /*!< Sequential packets untill source is valid */
00189 
00190    struct rtp_red *red;
00191 };
00192 
00193 /*!
00194  * \brief Structure defining an RTCP session.
00195  *
00196  * The concept "RTCP session" is not defined in RFC 3550, but since
00197  * this structure is analogous to ast_rtp, which tracks a RTP session,
00198  * it is logical to think of this as a RTCP session.
00199  *
00200  * RTCP packet is defined on page 9 of RFC 3550.
00201  *
00202  */
00203 struct ast_rtcp {
00204    int rtcp_info;
00205    int s;            /*!< Socket */
00206    struct ast_sockaddr us;    /*!< Socket representation of the local endpoint. */
00207    struct ast_sockaddr them;  /*!< Socket representation of the remote endpoint. */
00208    unsigned int soc;    /*!< What they told us */
00209    unsigned int spc;    /*!< What they told us */
00210    unsigned int themrxlsr;    /*!< The middle 32 bits of the NTP timestamp in the last received SR*/
00211    struct timeval rxlsr;      /*!< Time when we got their last SR */
00212    struct timeval txlsr;      /*!< Time when we sent or last SR*/
00213    unsigned int expected_prior;  /*!< no. packets in previous interval */
00214    unsigned int received_prior;  /*!< no. packets received in previous interval */
00215    int schedid;         /*!< Schedid returned from ast_sched_add() to schedule RTCP-transmissions*/
00216    unsigned int rr_count;     /*!< number of RRs we've sent, not including report blocks in SR's */
00217    unsigned int sr_count;     /*!< number of SRs we've sent */
00218    unsigned int lastsrtxcount;     /*!< Transmit packet count when last SR sent */
00219    double accumulated_transit;   /*!< accumulated a-dlsr-lsr */
00220    double rtt;       /*!< Last reported rtt */
00221    unsigned int reported_jitter; /*!< The contents of their last jitter entry in the RR */
00222    unsigned int reported_lost;   /*!< Reported lost packets in their RR */
00223 
00224    double reported_maxjitter;
00225    double reported_minjitter;
00226    double reported_normdev_jitter;
00227    double reported_stdev_jitter;
00228    unsigned int reported_jitter_count;
00229 
00230    double reported_maxlost;
00231    double reported_minlost;
00232    double reported_normdev_lost;
00233    double reported_stdev_lost;
00234 
00235    double rxlost;
00236    double maxrxlost;
00237    double minrxlost;
00238    double normdev_rxlost;
00239    double stdev_rxlost;
00240    unsigned int rxlost_count;
00241 
00242    double maxrxjitter;
00243    double minrxjitter;
00244    double normdev_rxjitter;
00245    double stdev_rxjitter;
00246    unsigned int rxjitter_count;
00247    double maxrtt;
00248    double minrtt;
00249    double normdevrtt;
00250    double stdevrtt;
00251    unsigned int rtt_count;
00252 };
00253 
00254 struct rtp_red {
00255    struct ast_frame t140;  /*!< Primary data  */
00256    struct ast_frame t140red;   /*!< Redundant t140*/
00257    unsigned char pt[AST_RED_MAX_GENERATION];  /*!< Payload types for redundancy data */
00258    unsigned char ts[AST_RED_MAX_GENERATION]; /*!< Time stamps */
00259    unsigned char len[AST_RED_MAX_GENERATION]; /*!< length of each generation */
00260    int num_gen; /*!< Number of generations */
00261    int schedid; /*!< Timer id */
00262    int ti; /*!< How long to buffer data before send */
00263    unsigned char t140red_data[64000];
00264    unsigned char buf_data[64000]; /*!< buffered primary data */
00265    int hdrlen;
00266    long int prev_ts;
00267 };
00268 
00269 AST_LIST_HEAD_NOLOCK(frame_list, ast_frame);
00270 
00271 /* Forward Declarations */
00272 static int ast_rtp_new(struct ast_rtp_instance *instance, struct sched_context *sched, struct ast_sockaddr *addr, void *data);
00273 static int ast_rtp_destroy(struct ast_rtp_instance *instance);
00274 static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit);
00275 static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit);
00276 static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration);
00277 static int ast_rtp_dtmf_mode_set(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode);
00278 static enum ast_rtp_dtmf_mode ast_rtp_dtmf_mode_get(struct ast_rtp_instance *instance);
00279 static void ast_rtp_update_source(struct ast_rtp_instance *instance);
00280 static void ast_rtp_change_source(struct ast_rtp_instance *instance);
00281 static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame);
00282 static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtcp);
00283 static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value);
00284 static int ast_rtp_fd(struct ast_rtp_instance *instance, int rtcp);
00285 static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr);
00286 static void ast_rtp_alt_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr);
00287 static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations);
00288 static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame);
00289 static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_rtp_instance *instance1);
00290 static int ast_rtp_get_stat(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat);
00291 static int ast_rtp_dtmf_compatible(struct ast_channel *chan0, struct ast_rtp_instance *instance0, struct ast_channel *chan1, struct ast_rtp_instance *instance1);
00292 static void ast_rtp_stun_request(struct ast_rtp_instance *instance, struct ast_sockaddr *suggestion, const char *username);
00293 static void ast_rtp_stop(struct ast_rtp_instance *instance);
00294 static int ast_rtp_qos_set(struct ast_rtp_instance *instance, int tos, int cos, const char* desc);
00295 static int ast_rtp_sendcng(struct ast_rtp_instance *instance, int level);
00296 
00297 /* RTP Engine Declaration */
00298 static struct ast_rtp_engine asterisk_rtp_engine = {
00299    .name = "asterisk",
00300    .new = ast_rtp_new,
00301    .destroy = ast_rtp_destroy,
00302    .dtmf_begin = ast_rtp_dtmf_begin,
00303    .dtmf_end = ast_rtp_dtmf_end,
00304    .dtmf_end_with_duration = ast_rtp_dtmf_end_with_duration,
00305    .dtmf_mode_set = ast_rtp_dtmf_mode_set,
00306    .dtmf_mode_get = ast_rtp_dtmf_mode_get,
00307    .update_source = ast_rtp_update_source,
00308    .change_source = ast_rtp_change_source,
00309    .write = ast_rtp_write,
00310    .read = ast_rtp_read,
00311    .prop_set = ast_rtp_prop_set,
00312    .fd = ast_rtp_fd,
00313    .remote_address_set = ast_rtp_remote_address_set,
00314    .alt_remote_address_set = ast_rtp_alt_remote_address_set,
00315    .red_init = rtp_red_init,
00316    .red_buffer = rtp_red_buffer,
00317    .local_bridge = ast_rtp_local_bridge,
00318    .get_stat = ast_rtp_get_stat,
00319    .dtmf_compatible = ast_rtp_dtmf_compatible,
00320    .stun_request = ast_rtp_stun_request,
00321    .stop = ast_rtp_stop,
00322    .qos = ast_rtp_qos_set,
00323    .sendcng = ast_rtp_sendcng,
00324 };
00325 
00326 static inline int rtp_debug_test_addr(struct ast_sockaddr *addr)
00327 {
00328    if (!rtpdebug) {
00329       return 0;
00330    }
00331    if (!ast_sockaddr_isnull(&rtpdebugaddr)) {
00332       if (rtpdebugport) {
00333          return (ast_sockaddr_cmp(&rtpdebugaddr, addr) == 0); /* look for RTP packets from IP+Port */
00334       } else {
00335          return (ast_sockaddr_cmp_addr(&rtpdebugaddr, addr) == 0); /* only look for RTP packets from IP */
00336       }
00337    }
00338 
00339    return 1;
00340 }
00341 
00342 static inline int rtcp_debug_test_addr(struct ast_sockaddr *addr)
00343 {
00344    if (!rtcpdebug) {
00345       return 0;
00346    }
00347    if (!ast_sockaddr_isnull(&rtcpdebugaddr)) {
00348       if (rtcpdebugport) {
00349          return (ast_sockaddr_cmp(&rtcpdebugaddr, addr) == 0); /* look for RTCP packets from IP+Port */
00350       } else {
00351          return (ast_sockaddr_cmp_addr(&rtcpdebugaddr, addr) == 0); /* only look for RTCP packets from IP */
00352       }
00353    }
00354 
00355    return 1;
00356 }
00357 
00358 static int __rtp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int rtcp)
00359 {
00360    int len;
00361    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00362    struct ast_srtp *srtp = ast_rtp_instance_get_srtp(instance);
00363 
00364    if ((len = ast_recvfrom(rtcp ? rtp->rtcp->s : rtp->s, buf, size, flags, sa)) < 0) {
00365       return len;
00366    }
00367 
00368    if (res_srtp && srtp && res_srtp->unprotect(srtp, buf, &len, rtcp) < 0) {
00369       return -1;
00370    }
00371 
00372    return len;
00373 }
00374 
00375 static int rtcp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
00376 {
00377    return __rtp_recvfrom(instance, buf, size, flags, sa, 1);
00378 }
00379 
00380 static int rtp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
00381 {
00382    return __rtp_recvfrom(instance, buf, size, flags, sa, 0);
00383 }
00384 
00385 static int __rtp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int rtcp)
00386 {
00387    int len = size;
00388    void *temp = buf;
00389    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00390    struct ast_srtp *srtp = ast_rtp_instance_get_srtp(instance);
00391 
00392    if (res_srtp && srtp && res_srtp->protect(srtp, &temp, &len, rtcp) < 0) {
00393       return -1;
00394    }
00395 
00396    return ast_sendto(rtcp ? rtp->rtcp->s : rtp->s, temp, len, flags, sa);
00397 }
00398 
00399 static int rtcp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
00400 {
00401    return __rtp_sendto(instance, buf, size, flags, sa, 1);
00402 }
00403 
00404 static int rtp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
00405 {
00406    return __rtp_sendto(instance, buf, size, flags, sa, 0);
00407 }
00408 
00409 static int rtp_get_rate(format_t subclass)
00410 {
00411    return (subclass == AST_FORMAT_G722) ? 8000 : ast_format_rate(subclass);
00412 }
00413 
00414 static unsigned int ast_rtcp_calc_interval(struct ast_rtp *rtp)
00415 {
00416    unsigned int interval;
00417    /*! \todo XXX Do a more reasonable calculation on this one
00418     * Look in RFC 3550 Section A.7 for an example*/
00419    interval = rtcpinterval;
00420    return interval;
00421 }
00422 
00423 /*! \brief Calculate normal deviation */
00424 static double normdev_compute(double normdev, double sample, unsigned int sample_count)
00425 {
00426    normdev = normdev * sample_count + sample;
00427    sample_count++;
00428 
00429    return normdev / sample_count;
00430 }
00431 
00432 static double stddev_compute(double stddev, double sample, double normdev, double normdev_curent, unsigned int sample_count)
00433 {
00434 /*
00435       for the formula check http://www.cs.umd.edu/~austinjp/constSD.pdf
00436       return sqrt( (sample_count*pow(stddev,2) + sample_count*pow((sample-normdev)/(sample_count+1),2) + pow(sample-normdev_curent,2)) / (sample_count+1));
00437       we can compute the sigma^2 and that way we would have to do the sqrt only 1 time at the end and would save another pow 2 compute
00438       optimized formula
00439 */
00440 #define SQUARE(x) ((x) * (x))
00441 
00442    stddev = sample_count * stddev;
00443    sample_count++;
00444 
00445    return stddev +
00446       ( sample_count * SQUARE( (sample - normdev) / sample_count ) ) +
00447       ( SQUARE(sample - normdev_curent) / sample_count );
00448 
00449 #undef SQUARE
00450 }
00451 
00452 static int create_new_socket(const char *type, int af)
00453 {
00454    int sock = socket(af, SOCK_DGRAM, 0);
00455 
00456    if (sock < 0) {
00457       if (!type) {
00458          type = "RTP/RTCP";
00459       }
00460       ast_log(LOG_WARNING, "Unable to allocate %s socket: %s\n", type, strerror(errno));
00461    } else {
00462       long flags = fcntl(sock, F_GETFL);
00463       fcntl(sock, F_SETFL, flags | O_NONBLOCK);
00464 #ifdef SO_NO_CHECK
00465       if (nochecksums) {
00466          setsockopt(sock, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums));
00467       }
00468 #endif
00469    }
00470 
00471    return sock;
00472 }
00473 
00474 /*!
00475  * \internal
00476  * \brief Initializes sequence values and probation for learning mode.
00477  * \note This is an adaptation of pjmedia's pjmedia_rtp_seq_init function.
00478  *
00479  * \param rtp pointer to rtp struct used with the received rtp packet.
00480  * \param seq sequence number read from the rtp header
00481  */
00482 static void rtp_learning_seq_init(struct ast_rtp *rtp, uint16_t seq)
00483 {
00484    rtp->learning_max_seq = seq - 1;
00485    rtp->learning_probation = learning_min_sequential;
00486 }
00487 
00488 /*!
00489  * \internal
00490  * \brief Updates sequence information for learning mode and determines if probation/learning mode should remain in effect.
00491  * \note This function was adapted from pjmedia's pjmedia_rtp_seq_update function.
00492  *
00493  * \param rtp pointer to rtp struct used with the received rtp packet.
00494  * \param seq sequence number read from the rtp header
00495  * \return boolean value indicating if probation mode is active at the end of the function
00496  */
00497 static int rtp_learning_rtp_seq_update(struct ast_rtp *rtp, uint16_t seq)
00498 {
00499    int probation = 1;
00500 
00501    ast_debug(1, "%p -- probation = %d, seq = %d\n", rtp, rtp->learning_probation, seq);
00502 
00503    if (seq == rtp->learning_max_seq + 1) {
00504       /* packet is in sequence */
00505       rtp->learning_probation--;
00506       rtp->learning_max_seq = seq;
00507       if (rtp->learning_probation == 0) {
00508          probation = 0;
00509       }
00510    } else {
00511       rtp->learning_probation = learning_min_sequential - 1;
00512       rtp->learning_max_seq = seq;
00513    }
00514 
00515    return probation;
00516 }
00517 
00518 static int ast_rtp_new(struct ast_rtp_instance *instance,
00519              struct sched_context *sched, struct ast_sockaddr *addr,
00520              void *data)
00521 {
00522    struct ast_rtp *rtp = NULL;
00523    int x, startplace;
00524 
00525    /* Create a new RTP structure to hold all of our data */
00526    if (!(rtp = ast_calloc(1, sizeof(*rtp)))) {
00527       return -1;
00528    }
00529 
00530    /* Set default parameters on the newly created RTP structure */
00531    rtp->ssrc = ast_random();
00532    rtp->seqno = ast_random() & 0xffff;
00533    rtp->strict_rtp_state = (strictrtp ? STRICT_RTP_LEARN : STRICT_RTP_OPEN);
00534    if (strictrtp) {
00535       rtp_learning_seq_init(rtp, (uint16_t)rtp->seqno);
00536    }
00537 
00538    /* Create a new socket for us to listen on and use */
00539    if ((rtp->s =
00540         create_new_socket("RTP",
00541                 ast_sockaddr_is_ipv4(addr) ? AF_INET  :
00542                 ast_sockaddr_is_ipv6(addr) ? AF_INET6 : -1)) < 0) {
00543       ast_debug(1, "Failed to create a new socket for RTP instance '%p'\n", instance);
00544       ast_free(rtp);
00545       return -1;
00546    }
00547 
00548    /* Now actually find a free RTP port to use */
00549    x = (rtpend == rtpstart) ? rtpstart : (ast_random() % (rtpend - rtpstart)) + rtpstart;
00550    x = x & ~1;
00551    startplace = x;
00552 
00553    for (;;) {
00554       ast_sockaddr_set_port(addr, x);
00555       /* Try to bind, this will tell us whether the port is available or not */
00556       if (!ast_bind(rtp->s, addr)) {
00557          ast_debug(1, "Allocated port %d for RTP instance '%p'\n", x, instance);
00558          ast_rtp_instance_set_local_address(instance, addr);
00559          break;
00560       }
00561 
00562       x += 2;
00563       if (x > rtpend) {
00564          x = (rtpstart + 1) & ~1;
00565       }
00566 
00567       /* See if we ran out of ports or if the bind actually failed because of something other than the address being in use */
00568       if (x == startplace || errno != EADDRINUSE) {
00569          ast_log(LOG_ERROR, "Oh dear... we couldn't allocate a port for RTP instance '%p'\n", instance);
00570          close(rtp->s);
00571          ast_free(rtp);
00572          return -1;
00573       }
00574    }
00575 
00576    /* Record any information we may need */
00577    rtp->sched = sched;
00578 
00579    /* Associate the RTP structure with the RTP instance and be done */
00580    ast_rtp_instance_set_data(instance, rtp);
00581 
00582    return 0;
00583 }
00584 
00585 static int ast_rtp_destroy(struct ast_rtp_instance *instance)
00586 {
00587    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00588 
00589    /* Destroy the smoother that was smoothing out audio if present */
00590    if (rtp->smoother) {
00591       ast_smoother_free(rtp->smoother);
00592    }
00593 
00594    /* Close our own socket so we no longer get packets */
00595    if (rtp->s > -1) {
00596       close(rtp->s);
00597    }
00598 
00599    /* Destroy RTCP if it was being used */
00600    if (rtp->rtcp) {
00601       /*
00602        * It is not possible for there to be an active RTCP scheduler
00603        * entry at this point since it holds a reference to the
00604        * RTP instance while it's active.
00605        */
00606       close(rtp->rtcp->s);
00607       ast_free(rtp->rtcp);
00608    }
00609 
00610    /* Destroy RED if it was being used */
00611    if (rtp->red) {
00612       AST_SCHED_DEL(rtp->sched, rtp->red->schedid);
00613       ast_free(rtp->red);
00614    }
00615 
00616    /* Finally destroy ourselves */
00617    ast_free(rtp);
00618 
00619    return 0;
00620 }
00621 
00622 static int ast_rtp_dtmf_mode_set(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode)
00623 {
00624    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00625    rtp->dtmfmode = dtmf_mode;
00626    return 0;
00627 }
00628 
00629 static enum ast_rtp_dtmf_mode ast_rtp_dtmf_mode_get(struct ast_rtp_instance *instance)
00630 {
00631    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00632    return rtp->dtmfmode;
00633 }
00634 
00635 static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit)
00636 {
00637    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00638    struct ast_sockaddr remote_address = { {0,} };
00639    int hdrlen = 12, res = 0, i = 0, payload = 101;
00640    char data[256];
00641    unsigned int *rtpheader = (unsigned int*)data;
00642 
00643    ast_rtp_instance_get_remote_address(instance, &remote_address);
00644 
00645    /* If we have no remote address information bail out now */
00646    if (ast_sockaddr_isnull(&remote_address)) {
00647       return -1;
00648    }
00649 
00650    /* Convert given digit into what we want to transmit */
00651    if ((digit <= '9') && (digit >= '0')) {
00652       digit -= '0';
00653    } else if (digit == '*') {
00654       digit = 10;
00655    } else if (digit == '#') {
00656       digit = 11;
00657    } else if ((digit >= 'A') && (digit <= 'D')) {
00658       digit = digit - 'A' + 12;
00659    } else if ((digit >= 'a') && (digit <= 'd')) {
00660       digit = digit - 'a' + 12;
00661    } else {
00662       ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
00663       return -1;
00664    }
00665 
00666    /* Grab the payload that they expect the RFC2833 packet to be received in */
00667    payload = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance), 0, AST_RTP_DTMF);
00668 
00669    rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
00670    rtp->send_duration = 160;
00671    rtp->lastdigitts = rtp->lastts + rtp->send_duration;
00672 
00673    /* Create the actual packet that we will be sending */
00674    rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno));
00675    rtpheader[1] = htonl(rtp->lastdigitts);
00676    rtpheader[2] = htonl(rtp->ssrc);
00677 
00678    /* Actually send the packet */
00679    for (i = 0; i < 2; i++) {
00680       rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration));
00681       res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address);
00682       if (res < 0) {
00683          ast_log(LOG_ERROR, "RTP Transmission error to %s: %s\n",
00684             ast_sockaddr_stringify(&remote_address),
00685             strerror(errno));
00686       }
00687       if (rtp_debug_test_addr(&remote_address)) {
00688          ast_verbose("Sent RTP DTMF packet to %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
00689                 ast_sockaddr_stringify(&remote_address),
00690                 payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
00691       }
00692       rtp->seqno++;
00693       rtp->send_duration += 160;
00694       rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno));
00695    }
00696 
00697    /* Record that we are in the process of sending a digit and information needed to continue doing so */
00698    rtp->sending_digit = 1;
00699    rtp->send_digit = digit;
00700    rtp->send_payload = payload;
00701 
00702    return 0;
00703 }
00704 
00705 static int ast_rtp_dtmf_continuation(struct ast_rtp_instance *instance)
00706 {
00707    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00708    struct ast_sockaddr remote_address = { {0,} };
00709    int hdrlen = 12, res = 0;
00710    char data[256];
00711    unsigned int *rtpheader = (unsigned int*)data;
00712 
00713    ast_rtp_instance_get_remote_address(instance, &remote_address);
00714 
00715    /* Make sure we know where the other side is so we can send them the packet */
00716    if (ast_sockaddr_isnull(&remote_address)) {
00717       return -1;
00718    }
00719 
00720    /* Actually create the packet we will be sending */
00721    rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno));
00722    rtpheader[1] = htonl(rtp->lastdigitts);
00723    rtpheader[2] = htonl(rtp->ssrc);
00724    rtpheader[3] = htonl((rtp->send_digit << 24) | (0xa << 16) | (rtp->send_duration));
00725 
00726    /* Boom, send it on out */
00727    res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address);
00728    if (res < 0) {
00729       ast_log(LOG_ERROR, "RTP Transmission error to %s: %s\n",
00730          ast_sockaddr_stringify(&remote_address),
00731          strerror(errno));
00732    }
00733 
00734    if (rtp_debug_test_addr(&remote_address)) {
00735       ast_verbose("Sent RTP DTMF packet to %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
00736              ast_sockaddr_stringify(&remote_address),
00737              rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
00738    }
00739 
00740    /* And now we increment some values for the next time we swing by */
00741    rtp->seqno++;
00742    rtp->send_duration += 160;
00743 
00744    return 0;
00745 }
00746 
00747 static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration)
00748 {
00749    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00750    struct ast_sockaddr remote_address = { {0,} };
00751    int hdrlen = 12, res = 0, i = 0;
00752    char data[256];
00753    unsigned int *rtpheader = (unsigned int*)data;
00754    unsigned int measured_samples;
00755 
00756    ast_rtp_instance_get_remote_address(instance, &remote_address);
00757 
00758    /* Make sure we know where the remote side is so we can send them the packet we construct */
00759    if (ast_sockaddr_isnull(&remote_address)) {
00760       return -1;
00761    }
00762 
00763    /* Convert the given digit to the one we are going to send */
00764    if ((digit <= '9') && (digit >= '0')) {
00765       digit -= '0';
00766    } else if (digit == '*') {
00767       digit = 10;
00768    } else if (digit == '#') {
00769       digit = 11;
00770    } else if ((digit >= 'A') && (digit <= 'D')) {
00771       digit = digit - 'A' + 12;
00772    } else if ((digit >= 'a') && (digit <= 'd')) {
00773       digit = digit - 'a' + 12;
00774    } else {
00775       ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
00776       return -1;
00777    }
00778 
00779    rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
00780 
00781    if (duration > 0 && (measured_samples = duration * rtp_get_rate(rtp->f.subclass.codec) / 1000) > rtp->send_duration) {
00782       ast_debug(2, "Adjusting final end duration from %u to %u\n", rtp->send_duration, measured_samples);
00783       rtp->send_duration = measured_samples;
00784    }
00785 
00786    /* Construct the packet we are going to send */
00787    rtpheader[1] = htonl(rtp->lastdigitts);
00788    rtpheader[2] = htonl(rtp->ssrc);
00789    rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration));
00790    rtpheader[3] |= htonl((1 << 23));
00791 
00792    /* Send it 3 times, that's the magical number */
00793    for (i = 0; i < 3; i++) {
00794 
00795       rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno));
00796 
00797       res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address);
00798       if (res < 0) {
00799          ast_log(LOG_ERROR, "RTP Transmission error to %s: %s\n",
00800             ast_sockaddr_stringify(&remote_address),
00801             strerror(errno));
00802       }
00803       if (rtp_debug_test_addr(&remote_address)) {
00804          ast_verbose("Sent RTP DTMF packet to %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
00805                 ast_sockaddr_stringify(&remote_address),
00806                 rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
00807       }
00808 
00809       rtp->seqno++;
00810    }
00811 
00812    /* Oh and we can't forget to turn off the stuff that says we are sending DTMF */
00813    rtp->lastts += rtp->send_duration;
00814    rtp->sending_digit = 0;
00815    rtp->send_digit = 0;
00816 
00817    return 0;
00818 }
00819 
00820 static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit)
00821 {
00822    return ast_rtp_dtmf_end_with_duration(instance, digit, 0);
00823 }
00824 
00825 static void ast_rtp_update_source(struct ast_rtp_instance *instance)
00826 {
00827    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00828 
00829    /* We simply set this bit so that the next packet sent will have the marker bit turned on */
00830    ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
00831    ast_debug(3, "Setting the marker bit due to a source update\n");
00832 
00833    return;
00834 }
00835 
00836 static void ast_rtp_change_source(struct ast_rtp_instance *instance)
00837 {
00838    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00839    struct ast_srtp *srtp = ast_rtp_instance_get_srtp(instance);
00840    unsigned int ssrc = ast_random();
00841 
00842    if (!rtp->lastts) {
00843       ast_debug(3, "Not changing SSRC since we haven't sent any RTP yet\n");
00844       return;
00845    }
00846 
00847    /* We simply set this bit so that the next packet sent will have the marker bit turned on */
00848    ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
00849 
00850    ast_debug(3, "Changing ssrc from %u to %u due to a source change\n", rtp->ssrc, ssrc);
00851 
00852    if (srtp) {
00853       ast_debug(3, "Changing ssrc for SRTP from %u to %u\n", rtp->ssrc, ssrc);
00854       res_srtp->change_source(srtp, rtp->ssrc, ssrc);
00855    }
00856 
00857    rtp->ssrc = ssrc;
00858 
00859    return;
00860 }
00861 
00862 static unsigned int calc_txstamp(struct ast_rtp *rtp, struct timeval *delivery)
00863 {
00864    struct timeval t;
00865    long ms;
00866 
00867    if (ast_tvzero(rtp->txcore)) {
00868       rtp->txcore = ast_tvnow();
00869       rtp->txcore.tv_usec -= rtp->txcore.tv_usec % 20000;
00870    }
00871 
00872    t = (delivery && !ast_tvzero(*delivery)) ? *delivery : ast_tvnow();
00873    if ((ms = ast_tvdiff_ms(t, rtp->txcore)) < 0) {
00874       ms = 0;
00875    }
00876    rtp->txcore = t;
00877 
00878    return (unsigned int) ms;
00879 }
00880 
00881 static void timeval2ntp(struct timeval tv, unsigned int *msw, unsigned int *lsw)
00882 {
00883    unsigned int sec, usec, frac;
00884    sec = tv.tv_sec + 2208988800u; /* Sec between 1900 and 1970 */
00885    usec = tv.tv_usec;
00886    frac = (usec << 12) + (usec << 8) - ((usec * 3650) >> 6);
00887    *msw = sec;
00888    *lsw = frac;
00889 }
00890 
00891 /*! \brief Send RTCP recipient's report */
00892 static int ast_rtcp_write_rr(struct ast_rtp_instance *instance)
00893 {
00894    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00895    int res;
00896    int len = 32;
00897    unsigned int lost;
00898    unsigned int extended;
00899    unsigned int expected;
00900    unsigned int expected_interval;
00901    unsigned int received_interval;
00902    int lost_interval;
00903    struct timeval now;
00904    unsigned int *rtcpheader;
00905    char bdata[1024];
00906    struct timeval dlsr;
00907    int fraction;
00908    int rate = rtp_get_rate(rtp->f.subclass.codec);
00909 
00910    double rxlost_current;
00911 
00912    if (!rtp || !rtp->rtcp)
00913       return 0;
00914 
00915    if (ast_sockaddr_isnull(&rtp->rtcp->them)) {
00916       /*
00917        * RTCP was stopped.
00918        */
00919       return 0;
00920    }
00921 
00922    extended = rtp->cycles + rtp->lastrxseqno;
00923    expected = extended - rtp->seedrxseqno + 1;
00924    lost = expected - rtp->rxcount;
00925    expected_interval = expected - rtp->rtcp->expected_prior;
00926    rtp->rtcp->expected_prior = expected;
00927    received_interval = rtp->rxcount - rtp->rtcp->received_prior;
00928    rtp->rtcp->received_prior = rtp->rxcount;
00929    lost_interval = expected_interval - received_interval;
00930 
00931    if (lost_interval <= 0)
00932       rtp->rtcp->rxlost = 0;
00933    else rtp->rtcp->rxlost = rtp->rtcp->rxlost;
00934    if (rtp->rtcp->rxlost_count == 0)
00935       rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
00936    if (lost_interval < rtp->rtcp->minrxlost)
00937       rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
00938    if (lost_interval > rtp->rtcp->maxrxlost)
00939       rtp->rtcp->maxrxlost = rtp->rtcp->rxlost;
00940 
00941    rxlost_current = normdev_compute(rtp->rtcp->normdev_rxlost, rtp->rtcp->rxlost, rtp->rtcp->rxlost_count);
00942    rtp->rtcp->stdev_rxlost = stddev_compute(rtp->rtcp->stdev_rxlost, rtp->rtcp->rxlost, rtp->rtcp->normdev_rxlost, rxlost_current, rtp->rtcp->rxlost_count);
00943    rtp->rtcp->normdev_rxlost = rxlost_current;
00944    rtp->rtcp->rxlost_count++;
00945 
00946    if (expected_interval == 0 || lost_interval <= 0)
00947       fraction = 0;
00948    else
00949       fraction = (lost_interval << 8) / expected_interval;
00950    gettimeofday(&now, NULL);
00951    timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
00952    rtcpheader = (unsigned int *)bdata;
00953    rtcpheader[0] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_RR << 16) | ((len/4)-1));
00954    rtcpheader[1] = htonl(rtp->ssrc);
00955    rtcpheader[2] = htonl(rtp->themssrc);
00956    rtcpheader[3] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
00957    rtcpheader[4] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
00958    rtcpheader[5] = htonl((unsigned int)(rtp->rxjitter * rate));
00959    rtcpheader[6] = htonl(rtp->rtcp->themrxlsr);
00960    rtcpheader[7] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
00961 
00962    /*! \note Insert SDES here. Probably should make SDES text equal to mimetypes[code].type (not subtype 'cos
00963      it can change mid call, and SDES can't) */
00964    rtcpheader[len/4]     = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | 2);
00965    rtcpheader[(len/4)+1] = htonl(rtp->ssrc);               /* Our SSRC */
00966    rtcpheader[(len/4)+2] = htonl(0x01 << 24);              /* Empty for the moment */
00967    len += 12;
00968 
00969    res = rtcp_sendto(instance, (unsigned int *)rtcpheader, len, 0, &rtp->rtcp->them);
00970 
00971    if (res < 0) {
00972       ast_log(LOG_ERROR, "RTCP RR transmission error, rtcp halted: %s\n",strerror(errno));
00973       return 0;
00974    }
00975 
00976    rtp->rtcp->rr_count++;
00977    if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
00978       ast_verbose("\n* Sending RTCP RR to %s\n"
00979          "  Our SSRC: %u\nTheir SSRC: %u\niFraction lost: %d\nCumulative loss: %u\n"
00980          "  IA jitter: %.4f\n"
00981          "  Their last SR: %u\n"
00982              "  DLSR: %4.4f (sec)\n\n",
00983              ast_sockaddr_stringify(&rtp->rtcp->them),
00984              rtp->ssrc, rtp->themssrc, fraction, lost,
00985              rtp->rxjitter,
00986              rtp->rtcp->themrxlsr,
00987              (double)(ntohl(rtcpheader[7])/65536.0));
00988    }
00989 
00990    return res;
00991 }
00992 
00993 /*! \brief Send RTCP sender's report */
00994 static int ast_rtcp_write_sr(struct ast_rtp_instance *instance)
00995 {
00996    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
00997    int res;
00998    int len = 0;
00999    struct timeval now;
01000    unsigned int now_lsw;
01001    unsigned int now_msw;
01002    unsigned int *rtcpheader;
01003    unsigned int lost;
01004    unsigned int extended;
01005    unsigned int expected;
01006    unsigned int expected_interval;
01007    unsigned int received_interval;
01008    int lost_interval;
01009    int fraction;
01010    struct timeval dlsr;
01011    char bdata[512];
01012    int rate = rtp_get_rate(rtp->f.subclass.codec);
01013 
01014    if (!rtp || !rtp->rtcp)
01015       return 0;
01016 
01017    if (ast_sockaddr_isnull(&rtp->rtcp->them)) {  /* This'll stop rtcp for this rtp session */
01018       /*
01019        * RTCP was stopped.
01020        */
01021       return 0;
01022    }
01023 
01024    gettimeofday(&now, NULL);
01025    timeval2ntp(now, &now_msw, &now_lsw); /* fill thses ones in from utils.c*/
01026    rtcpheader = (unsigned int *)bdata;
01027    rtcpheader[1] = htonl(rtp->ssrc);               /* Our SSRC */
01028    rtcpheader[2] = htonl(now_msw);                 /* now, MSW. gettimeofday() + SEC_BETWEEN_1900_AND_1970*/
01029    rtcpheader[3] = htonl(now_lsw);                 /* now, LSW */
01030    rtcpheader[4] = htonl(rtp->lastts);             /* FIXME shouldn't be that, it should be now */
01031    rtcpheader[5] = htonl(rtp->txcount);            /* No. packets sent */
01032    rtcpheader[6] = htonl(rtp->txoctetcount);       /* No. bytes sent */
01033    len += 28;
01034 
01035    extended = rtp->cycles + rtp->lastrxseqno;
01036    expected = extended - rtp->seedrxseqno + 1;
01037    if (rtp->rxcount > expected)
01038       expected += rtp->rxcount - expected;
01039    lost = expected - rtp->rxcount;
01040    expected_interval = expected - rtp->rtcp->expected_prior;
01041    rtp->rtcp->expected_prior = expected;
01042    received_interval = rtp->rxcount - rtp->rtcp->received_prior;
01043    rtp->rtcp->received_prior = rtp->rxcount;
01044    lost_interval = expected_interval - received_interval;
01045    if (expected_interval == 0 || lost_interval <= 0)
01046       fraction = 0;
01047    else
01048       fraction = (lost_interval << 8) / expected_interval;
01049    timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
01050    rtcpheader[7] = htonl(rtp->themssrc);
01051    rtcpheader[8] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
01052    rtcpheader[9] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
01053    rtcpheader[10] = htonl((unsigned int)(rtp->rxjitter * rate));
01054    rtcpheader[11] = htonl(rtp->rtcp->themrxlsr);
01055    rtcpheader[12] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
01056    len += 24;
01057 
01058    rtcpheader[0] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SR << 16) | ((len/4)-1));
01059 
01060    /* Insert SDES here. Probably should make SDES text equal to mimetypes[code].type (not subtype 'cos */
01061    /* it can change mid call, and SDES can't) */
01062    rtcpheader[len/4]     = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | 2);
01063    rtcpheader[(len/4)+1] = htonl(rtp->ssrc);               /* Our SSRC */
01064    rtcpheader[(len/4)+2] = htonl(0x01 << 24);                    /* Empty for the moment */
01065    len += 12;
01066 
01067    res = rtcp_sendto(instance, (unsigned int *)rtcpheader, len, 0, &rtp->rtcp->them);
01068    if (res < 0) {
01069       ast_log(LOG_ERROR, "RTCP SR transmission error to %s, rtcp halted %s\n",
01070          ast_sockaddr_stringify(&rtp->rtcp->them),
01071          strerror(errno));
01072       return 0;
01073    }
01074 
01075    /* FIXME Don't need to get a new one */
01076    gettimeofday(&rtp->rtcp->txlsr, NULL);
01077    rtp->rtcp->sr_count++;
01078 
01079    rtp->rtcp->lastsrtxcount = rtp->txcount;
01080 
01081    if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
01082       ast_verbose("* Sent RTCP SR to %s\n", ast_sockaddr_stringify(&rtp->rtcp->them));
01083       ast_verbose("  Our SSRC: %u\n", rtp->ssrc);
01084       ast_verbose("  Sent(NTP): %u.%010u\n", (unsigned int)now.tv_sec, (unsigned int)now.tv_usec*4096);
01085       ast_verbose("  Sent(RTP): %u\n", rtp->lastts);
01086       ast_verbose("  Sent packets: %u\n", rtp->txcount);
01087       ast_verbose("  Sent octets: %u\n", rtp->txoctetcount);
01088       ast_verbose("  Report block:\n");
01089       ast_verbose("  Fraction lost: %u\n", fraction);
01090       ast_verbose("  Cumulative loss: %u\n", lost);
01091       ast_verbose("  IA jitter: %.4f\n", rtp->rxjitter);
01092       ast_verbose("  Their last SR: %u\n", rtp->rtcp->themrxlsr);
01093       ast_verbose("  DLSR: %4.4f (sec)\n\n", (double)(ntohl(rtcpheader[12])/65536.0));
01094    }
01095    manager_event(EVENT_FLAG_REPORTING, "RTCPSent", "To: %s\r\n"
01096                    "OurSSRC: %u\r\n"
01097                    "SentNTP: %u.%010u\r\n"
01098                    "SentRTP: %u\r\n"
01099                    "SentPackets: %u\r\n"
01100                    "SentOctets: %u\r\n"
01101                    "ReportBlock:\r\n"
01102                    "FractionLost: %u\r\n"
01103                    "CumulativeLoss: %u\r\n"
01104                    "IAJitter: %.4f\r\n"
01105                    "TheirLastSR: %u\r\n"
01106             "DLSR: %4.4f (sec)\r\n",
01107             ast_sockaddr_stringify(&rtp->rtcp->them),
01108             rtp->ssrc,
01109             (unsigned int)now.tv_sec, (unsigned int)now.tv_usec*4096,
01110             rtp->lastts,
01111             rtp->txcount,
01112             rtp->txoctetcount,
01113             fraction,
01114             lost,
01115             rtp->rxjitter,
01116             rtp->rtcp->themrxlsr,
01117             (double)(ntohl(rtcpheader[12])/65536.0));
01118    return res;
01119 }
01120 
01121 /*! \brief Write and RTCP packet to the far end
01122  * \note Decide if we are going to send an SR (with Reception Block) or RR
01123  * RR is sent if we have not sent any rtp packets in the previous interval */
01124 static int ast_rtcp_write(const void *data)
01125 {
01126    struct ast_rtp_instance *instance = (struct ast_rtp_instance *) data;
01127    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01128    int res;
01129 
01130    if (!rtp || !rtp->rtcp || rtp->rtcp->schedid == -1) {
01131       ao2_ref(instance, -1);
01132       return 0;
01133    }
01134 
01135    if (rtp->txcount > rtp->rtcp->lastsrtxcount) {
01136       res = ast_rtcp_write_sr(instance);
01137    } else {
01138       res = ast_rtcp_write_rr(instance);
01139    }
01140 
01141    if (!res) {
01142       /* 
01143        * Not being rescheduled.
01144        */
01145       ao2_ref(instance, -1);
01146       rtp->rtcp->schedid = -1;
01147    }
01148 
01149    return res;
01150 }
01151 
01152 static int ast_rtp_raw_write(struct ast_rtp_instance *instance, struct ast_frame *frame, int codec)
01153 {
01154    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01155    int pred, mark = 0;
01156    unsigned int ms = calc_txstamp(rtp, &frame->delivery);
01157    struct ast_sockaddr remote_address = { {0,} };
01158    int rate = rtp_get_rate(frame->subclass.codec) / 1000;
01159 
01160    if (frame->subclass.codec == AST_FORMAT_G722) {
01161       frame->samples /= 2;
01162    }
01163 
01164    if (rtp->sending_digit) {
01165       return 0;
01166    }
01167 
01168    if (frame->frametype == AST_FRAME_VOICE) {
01169       pred = rtp->lastts + frame->samples;
01170 
01171       /* Re-calculate last TS */
01172       rtp->lastts = rtp->lastts + ms * rate;
01173       if (ast_tvzero(frame->delivery)) {
01174          /* If this isn't an absolute delivery time, Check if it is close to our prediction,
01175             and if so, go with our prediction */
01176          if (abs(rtp->lastts - pred) < MAX_TIMESTAMP_SKEW) {
01177             rtp->lastts = pred;
01178          } else {
01179             ast_debug(3, "Difference is %d, ms is %d\n", abs(rtp->lastts - pred), ms);
01180             mark = 1;
01181          }
01182       }
01183    } else if (frame->frametype == AST_FRAME_VIDEO) {
01184       mark = frame->subclass.codec & 0x1;
01185       pred = rtp->lastovidtimestamp + frame->samples;
01186       /* Re-calculate last TS */
01187       rtp->lastts = rtp->lastts + ms * 90;
01188       /* If it's close to our prediction, go for it */
01189       if (ast_tvzero(frame->delivery)) {
01190          if (abs(rtp->lastts - pred) < 7200) {
01191             rtp->lastts = pred;
01192             rtp->lastovidtimestamp += frame->samples;
01193          } else {
01194             ast_debug(3, "Difference is %d, ms is %d (%d), pred/ts/samples %d/%d/%d\n", abs(rtp->lastts - pred), ms, ms * 90, rtp->lastts, pred, frame->samples);
01195             rtp->lastovidtimestamp = rtp->lastts;
01196          }
01197       }
01198    } else {
01199       pred = rtp->lastotexttimestamp + frame->samples;
01200       /* Re-calculate last TS */
01201       rtp->lastts = rtp->lastts + ms;
01202       /* If it's close to our prediction, go for it */
01203       if (ast_tvzero(frame->delivery)) {
01204          if (abs(rtp->lastts - pred) < 7200) {
01205             rtp->lastts = pred;
01206             rtp->lastotexttimestamp += frame->samples;
01207          } else {
01208             ast_debug(3, "Difference is %d, ms is %d, pred/ts/samples %d/%d/%d\n", abs(rtp->lastts - pred), ms, rtp->lastts, pred, frame->samples);
01209             rtp->lastotexttimestamp = rtp->lastts;
01210          }
01211       }
01212    }
01213 
01214    /* If we have been explicitly told to set the marker bit then do so */
01215    if (ast_test_flag(rtp, FLAG_NEED_MARKER_BIT)) {
01216       mark = 1;
01217       ast_clear_flag(rtp, FLAG_NEED_MARKER_BIT);
01218    }
01219 
01220    /* If the timestamp for non-digt packets has moved beyond the timestamp for digits, update the digit timestamp */
01221    if (rtp->lastts > rtp->lastdigitts) {
01222       rtp->lastdigitts = rtp->lastts;
01223    }
01224 
01225    if (ast_test_flag(frame, AST_FRFLAG_HAS_TIMING_INFO)) {
01226       rtp->lastts = frame->ts * rate;
01227    }
01228 
01229    ast_rtp_instance_get_remote_address(instance, &remote_address);
01230 
01231    /* If we know the remote address construct a packet and send it out */
01232    if (!ast_sockaddr_isnull(&remote_address)) {
01233       int hdrlen = 12, res;
01234       unsigned char *rtpheader = (unsigned char *)(frame->data.ptr - hdrlen);
01235 
01236       put_unaligned_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
01237       put_unaligned_uint32(rtpheader + 4, htonl(rtp->lastts));
01238       put_unaligned_uint32(rtpheader + 8, htonl(rtp->ssrc));
01239 
01240       if ((res = rtp_sendto(instance, (void *)rtpheader, frame->datalen + hdrlen, 0, &remote_address)) < 0) {
01241          if (!ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT) || (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT) && (ast_test_flag(rtp, FLAG_NAT_ACTIVE) == FLAG_NAT_ACTIVE))) {
01242             ast_debug(1, "RTP Transmission error of packet %d to %s: %s\n",
01243                  rtp->seqno,
01244                  ast_sockaddr_stringify(&remote_address),
01245                  strerror(errno));
01246          } else if (((ast_test_flag(rtp, FLAG_NAT_ACTIVE) == FLAG_NAT_INACTIVE) || rtpdebug) && !ast_test_flag(rtp, FLAG_NAT_INACTIVE_NOWARN)) {
01247             /* Only give this error message once if we are not RTP debugging */
01248             if (option_debug || rtpdebug)
01249                ast_debug(0, "RTP NAT: Can't write RTP to private address %s, waiting for other end to send audio...\n",
01250                     ast_sockaddr_stringify(&remote_address));
01251             ast_set_flag(rtp, FLAG_NAT_INACTIVE_NOWARN);
01252          }
01253       } else {
01254          rtp->txcount++;
01255          rtp->txoctetcount += (res - hdrlen);
01256 
01257          if (rtp->rtcp && rtp->rtcp->schedid < 1) {
01258             ast_debug(1, "Starting RTCP transmission on RTP instance '%p'\n", instance);
01259             ao2_ref(instance, +1);
01260             rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, instance);
01261             if (rtp->rtcp->schedid < 0) {
01262                ao2_ref(instance, -1);
01263                ast_log(LOG_WARNING, "scheduling RTCP transmission failed.\n");
01264             }
01265          }
01266       }
01267 
01268       if (rtp_debug_test_addr(&remote_address)) {
01269          ast_verbose("Sent RTP packet to      %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
01270                 ast_sockaddr_stringify(&remote_address),
01271                 codec, rtp->seqno, rtp->lastts, res - hdrlen);
01272       }
01273    }
01274 
01275    rtp->seqno++;
01276 
01277    return 0;
01278 }
01279 
01280 static struct ast_frame *red_t140_to_red(struct rtp_red *red) {
01281    unsigned char *data = red->t140red.data.ptr;
01282    int len = 0;
01283    int i;
01284 
01285    /* replace most aged generation */
01286    if (red->len[0]) {
01287       for (i = 1; i < red->num_gen+1; i++)
01288          len += red->len[i];
01289 
01290       memmove(&data[red->hdrlen], &data[red->hdrlen+red->len[0]], len);
01291    }
01292 
01293    /* Store length of each generation and primary data length*/
01294    for (i = 0; i < red->num_gen; i++)
01295       red->len[i] = red->len[i+1];
01296    red->len[i] = red->t140.datalen;
01297 
01298    /* write each generation length in red header */
01299    len = red->hdrlen;
01300    for (i = 0; i < red->num_gen; i++)
01301       len += data[i*4+3] = red->len[i];
01302 
01303    /* add primary data to buffer */
01304    memcpy(&data[len], red->t140.data.ptr, red->t140.datalen);
01305    red->t140red.datalen = len + red->t140.datalen;
01306 
01307    /* no primary data and no generations to send */
01308    if (len == red->hdrlen && !red->t140.datalen)
01309       return NULL;
01310 
01311    /* reset t.140 buffer */
01312    red->t140.datalen = 0;
01313 
01314    return &red->t140red;
01315 }
01316 
01317 static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame)
01318 {
01319    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01320    struct ast_sockaddr remote_address = { {0,} };
01321    format_t codec, subclass;
01322 
01323    ast_rtp_instance_get_remote_address(instance, &remote_address);
01324 
01325    /* If we don't actually know the remote address don't even bother doing anything */
01326    if (ast_sockaddr_isnull(&remote_address)) {
01327       ast_debug(1, "No remote address on RTP instance '%p' so dropping frame\n", instance);
01328       return 0;
01329    }
01330 
01331    /* If there is no data length we can't very well send the packet */
01332    if (!frame->datalen) {
01333       ast_debug(1, "Received frame with no data for RTP instance '%p' so dropping frame\n", instance);
01334       return 0;
01335    }
01336 
01337    /* If the packet is not one our RTP stack supports bail out */
01338    if (frame->frametype != AST_FRAME_VOICE && frame->frametype != AST_FRAME_VIDEO && frame->frametype != AST_FRAME_TEXT) {
01339       ast_log(LOG_WARNING, "RTP can only send voice, video, and text\n");
01340       return -1;
01341    }
01342 
01343    if (rtp->red) {
01344       /* return 0; */
01345       /* no primary data or generations to send */
01346       if ((frame = red_t140_to_red(rtp->red)) == NULL)
01347          return 0;
01348    }
01349 
01350    /* Grab the subclass and look up the payload we are going to use */
01351    subclass = frame->subclass.codec;
01352    if (frame->frametype == AST_FRAME_VIDEO) {
01353       subclass &= ~0x1LL;
01354    }
01355    if ((codec = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance), 1, subclass)) < 0) {
01356       ast_log(LOG_WARNING, "Don't know how to send format %s packets with RTP\n", ast_getformatname(frame->subclass.codec));
01357       return -1;
01358    }
01359 
01360    /* Oh dear, if the format changed we will have to set up a new smoother */
01361    if (rtp->lasttxformat != subclass) {
01362       ast_debug(1, "Ooh, format changed from %s to %s\n", ast_getformatname(rtp->lasttxformat), ast_getformatname(subclass));
01363       rtp->lasttxformat = subclass;
01364       if (rtp->smoother) {
01365          ast_smoother_free(rtp->smoother);
01366          rtp->smoother = NULL;
01367       }
01368    }
01369 
01370    /* If no smoother is present see if we have to set one up */
01371    if (!rtp->smoother) {
01372       struct ast_format_list fmt = ast_codec_pref_getsize(&ast_rtp_instance_get_codecs(instance)->pref, subclass);
01373 
01374       switch (subclass) {
01375       case AST_FORMAT_SPEEX:
01376       case AST_FORMAT_SPEEX16:
01377       case AST_FORMAT_G723_1:
01378       case AST_FORMAT_SIREN7:
01379       case AST_FORMAT_SIREN14:
01380       case AST_FORMAT_G719:
01381          /* these are all frame-based codecs and cannot be safely run through
01382             a smoother */
01383          break;
01384       default:
01385          if (fmt.inc_ms) {
01386             if (!(rtp->smoother = ast_smoother_new((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms))) {
01387                ast_log(LOG_WARNING, "Unable to create smoother: format %s ms: %d len: %d\n", ast_getformatname(subclass), fmt.cur_ms, ((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms));
01388                return -1;
01389             }
01390             if (fmt.flags) {
01391                ast_smoother_set_flags(rtp->smoother, fmt.flags);
01392             }
01393             ast_debug(1, "Created smoother: format: %s ms: %d len: %d\n", ast_getformatname(subclass), fmt.cur_ms, ((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms));
01394          }
01395       }
01396    }
01397 
01398    /* Feed audio frames into the actual function that will create a frame and send it */
01399    if (rtp->smoother) {
01400       struct ast_frame *f;
01401 
01402       if (ast_smoother_test_flag(rtp->smoother, AST_SMOOTHER_FLAG_BE)) {
01403          ast_smoother_feed_be(rtp->smoother, frame);
01404       } else {
01405          ast_smoother_feed(rtp->smoother, frame);
01406       }
01407 
01408       while ((f = ast_smoother_read(rtp->smoother)) && (f->data.ptr)) {
01409             ast_rtp_raw_write(instance, f, codec);
01410       }
01411    } else {
01412       int hdrlen = 12;
01413       struct ast_frame *f = NULL;
01414 
01415       if (frame->offset < hdrlen) {
01416          f = ast_frdup(frame);
01417       } else {
01418          f = frame;
01419       }
01420       if (f->data.ptr) {
01421          ast_rtp_raw_write(instance, f, codec);
01422       }
01423       if (f != frame) {
01424          ast_frfree(f);
01425       }
01426 
01427    }
01428 
01429    return 0;
01430 }
01431 
01432 static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int timestamp, int mark)
01433 {
01434    struct timeval now;
01435    struct timeval tmp;
01436    double transit;
01437    double current_time;
01438    double d;
01439    double dtv;
01440    double prog;
01441    int rate = rtp_get_rate(rtp->f.subclass.codec);
01442 
01443    double normdev_rxjitter_current;
01444    if ((!rtp->rxcore.tv_sec && !rtp->rxcore.tv_usec) || mark) {
01445       gettimeofday(&rtp->rxcore, NULL);
01446       rtp->drxcore = (double) rtp->rxcore.tv_sec + (double) rtp->rxcore.tv_usec / 1000000;
01447       /* map timestamp to a real time */
01448       rtp->seedrxts = timestamp; /* Their RTP timestamp started with this */
01449       tmp = ast_samp2tv(timestamp, rate);
01450       rtp->rxcore = ast_tvsub(rtp->rxcore, tmp);
01451       /* Round to 0.1ms for nice, pretty timestamps */
01452       rtp->rxcore.tv_usec -= rtp->rxcore.tv_usec % 100;
01453    }
01454 
01455    gettimeofday(&now,NULL);
01456    /* rxcore is the mapping between the RTP timestamp and _our_ real time from gettimeofday() */
01457    tmp = ast_samp2tv(timestamp, rate);
01458    *tv = ast_tvadd(rtp->rxcore, tmp);
01459 
01460    prog = (double)((timestamp-rtp->seedrxts)/(float)(rate));
01461    dtv = (double)rtp->drxcore + (double)(prog);
01462    current_time = (double)now.tv_sec + (double)now.tv_usec/1000000;
01463    transit = current_time - dtv;
01464    d = transit - rtp->rxtransit;
01465    rtp->rxtransit = transit;
01466    if (d<0)
01467       d=-d;
01468    rtp->rxjitter += (1./16.) * (d - rtp->rxjitter);
01469 
01470    if (rtp->rtcp) {
01471       if (rtp->rxjitter > rtp->rtcp->maxrxjitter)
01472          rtp->rtcp->maxrxjitter = rtp->rxjitter;
01473       if (rtp->rtcp->rxjitter_count == 1)
01474          rtp->rtcp->minrxjitter = rtp->rxjitter;
01475       if (rtp->rtcp && rtp->rxjitter < rtp->rtcp->minrxjitter)
01476          rtp->rtcp->minrxjitter = rtp->rxjitter;
01477 
01478       normdev_rxjitter_current = normdev_compute(rtp->rtcp->normdev_rxjitter,rtp->rxjitter,rtp->rtcp->rxjitter_count);
01479       rtp->rtcp->stdev_rxjitter = stddev_compute(rtp->rtcp->stdev_rxjitter,rtp->rxjitter,rtp->rtcp->normdev_rxjitter,normdev_rxjitter_current,rtp->rtcp->rxjitter_count);
01480 
01481       rtp->rtcp->normdev_rxjitter = normdev_rxjitter_current;
01482       rtp->rtcp->rxjitter_count++;
01483    }
01484 }
01485 
01486 static struct ast_frame *create_dtmf_frame(struct ast_rtp_instance *instance, enum ast_frame_type type, int compensate)
01487 {
01488    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01489    struct ast_sockaddr remote_address = { {0,} };
01490 
01491    ast_rtp_instance_get_remote_address(instance, &remote_address);
01492 
01493    if (((compensate && type == AST_FRAME_DTMF_END) || (type == AST_FRAME_DTMF_BEGIN)) && ast_tvcmp(ast_tvnow(), rtp->dtmfmute) < 0) {
01494       ast_debug(1, "Ignore potential DTMF echo from '%s'\n",
01495            ast_sockaddr_stringify(&remote_address));
01496       rtp->resp = 0;
01497       rtp->dtmfsamples = 0;
01498       return &ast_null_frame;
01499    }
01500    ast_debug(1, "Creating %s DTMF Frame: %d (%c), at %s\n",
01501       type == AST_FRAME_DTMF_END ? "END" : "BEGIN",
01502       rtp->resp, rtp->resp,
01503       ast_sockaddr_stringify(&remote_address));
01504    if (rtp->resp == 'X') {
01505       rtp->f.frametype = AST_FRAME_CONTROL;
01506       rtp->f.subclass.integer = AST_CONTROL_FLASH;
01507    } else {
01508       rtp->f.frametype = type;
01509       rtp->f.subclass.integer = rtp->resp;
01510    }
01511    rtp->f.datalen = 0;
01512    rtp->f.samples = 0;
01513    rtp->f.mallocd = 0;
01514    rtp->f.src = "RTP";
01515    AST_LIST_NEXT(&rtp->f, frame_list) = NULL;
01516 
01517    return &rtp->f;
01518 }
01519 
01520 static void process_dtmf_rfc2833(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, struct ast_sockaddr *addr, int payloadtype, int mark, struct frame_list *frames)
01521 {
01522    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01523    struct ast_sockaddr remote_address = { {0,} };
01524    unsigned int event, event_end, samples;
01525    char resp = 0;
01526    struct ast_frame *f = NULL;
01527 
01528    ast_rtp_instance_get_remote_address(instance, &remote_address);
01529 
01530    /* Figure out event, event end, and samples */
01531    event = ntohl(*((unsigned int *)(data)));
01532    event >>= 24;
01533    event_end = ntohl(*((unsigned int *)(data)));
01534    event_end <<= 8;
01535    event_end >>= 24;
01536    samples = ntohl(*((unsigned int *)(data)));
01537    samples &= 0xFFFF;
01538 
01539    if (rtp_debug_test_addr(&remote_address)) {
01540       ast_verbose("Got  RTP RFC2833 from   %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u, mark %d, event %08x, end %d, duration %-5.5d) \n",
01541              ast_sockaddr_stringify(&remote_address),
01542              payloadtype, seqno, timestamp, len, (mark?1:0), event, ((event_end & 0x80)?1:0), samples);
01543    }
01544 
01545    /* Print out debug if turned on */
01546    if (rtpdebug || option_debug > 2)
01547       ast_debug(0, "- RTP 2833 Event: %08x (len = %d)\n", event, len);
01548 
01549    /* Figure out what digit was pressed */
01550    if (event < 10) {
01551       resp = '0' + event;
01552    } else if (event < 11) {
01553       resp = '*';
01554    } else if (event < 12) {
01555       resp = '#';
01556    } else if (event < 16) {
01557       resp = 'A' + (event - 12);
01558    } else if (event < 17) {        /* Event 16: Hook flash */
01559       resp = 'X';
01560    } else {
01561       /* Not a supported event */
01562       ast_log(LOG_DEBUG, "Ignoring RTP 2833 Event: %08x. Not a DTMF Digit.\n", event);
01563       return;
01564    }
01565 
01566    if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)) {
01567       if ((rtp->last_end_timestamp != timestamp) || (rtp->resp && rtp->resp != resp)) {
01568          rtp->resp = resp;
01569          rtp->dtmf_timeout = 0;
01570          f = ast_frdup(create_dtmf_frame(instance, AST_FRAME_DTMF_END, ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)));
01571          f->len = 0;
01572          rtp->last_end_timestamp = timestamp;
01573          AST_LIST_INSERT_TAIL(frames, f, frame_list);
01574       }
01575    } else {
01576       /*  The duration parameter measures the complete
01577           duration of the event (from the beginning) - RFC2833.
01578           Account for the fact that duration is only 16 bits long
01579           (about 8 seconds at 8000 Hz) and can wrap is digit
01580           is hold for too long. */
01581       unsigned int new_duration = rtp->dtmf_duration;
01582       unsigned int last_duration = new_duration & 0xFFFF;
01583 
01584       if (last_duration > 64000 && samples < last_duration) {
01585          new_duration += 0xFFFF + 1;
01586       }
01587       new_duration = (new_duration & ~0xFFFF) | samples;
01588 
01589       if (event_end & 0x80) {
01590          if ((seqno != rtp->last_seqno) && (timestamp > rtp->last_end_timestamp)) {
01591             rtp->last_end_timestamp = timestamp;
01592             rtp->dtmf_duration = new_duration;
01593             rtp->resp = resp;
01594             f = ast_frdup(create_dtmf_frame(instance, AST_FRAME_DTMF_END, 0));
01595             f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass.codec)), ast_tv(0, 0));
01596             rtp->resp = 0;
01597             rtp->dtmf_duration = rtp->dtmf_timeout = 0;
01598             AST_LIST_INSERT_TAIL(frames, f, frame_list);
01599          } else if (rtpdebug) {
01600             ast_debug(1, "Dropping re-transmitted, duplicate, or out of order DTMF END frame (seqno: %d, ts %d, digit %c)\n",
01601                seqno, timestamp, resp);
01602          }
01603       } else {
01604          /* Begin/continuation */
01605 
01606          /* The second portion of the seqno check is to not mistakenly
01607           * stop accepting DTMF if the seqno rolls over beyond
01608           * 65535.
01609           */
01610          if ((rtp->last_seqno > seqno && rtp->last_seqno - seqno < 50)
01611             || timestamp <= rtp->last_end_timestamp) {
01612             /* Out of order frame. Processing this can cause us to
01613              * improperly duplicate incoming DTMF, so just drop
01614              * this.
01615              */
01616             if (rtpdebug) {
01617                ast_debug(1, "Dropping out of order DTMF frame (seqno %d, ts %d, digit %c)\n",
01618                   seqno, timestamp, resp);
01619             }
01620             return;
01621          }
01622 
01623          if (rtp->resp && rtp->resp != resp) {
01624             /* Another digit already began. End it */
01625             f = ast_frdup(create_dtmf_frame(instance, AST_FRAME_DTMF_END, 0));
01626             f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass.codec)), ast_tv(0, 0));
01627             rtp->resp = 0;
01628             rtp->dtmf_duration = rtp->dtmf_timeout = 0;
01629             AST_LIST_INSERT_TAIL(frames, f, frame_list);
01630          }
01631 
01632          if (rtp->resp) {
01633             /* Digit continues */
01634             rtp->dtmf_duration = new_duration;
01635          } else {
01636             /* New digit began */
01637             rtp->resp = resp;
01638             f = ast_frdup(create_dtmf_frame(instance, AST_FRAME_DTMF_BEGIN, 0));
01639             rtp->dtmf_duration = samples;
01640             AST_LIST_INSERT_TAIL(frames, f, frame_list);
01641          }
01642 
01643          rtp->dtmf_timeout = timestamp + rtp->dtmf_duration + dtmftimeout;
01644       }
01645 
01646       rtp->last_seqno = seqno;
01647    }
01648 
01649    rtp->dtmfsamples = samples;
01650 
01651    return;
01652 }
01653 
01654 static struct ast_frame *process_dtmf_cisco(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, struct ast_sockaddr *addr, int payloadtype, int mark)
01655 {
01656    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01657    unsigned int event, flags, power;
01658    char resp = 0;
01659    unsigned char seq;
01660    struct ast_frame *f = NULL;
01661 
01662    if (len < 4) {
01663       return NULL;
01664    }
01665 
01666    /*      The format of Cisco RTP DTMF packet looks like next:
01667       +0                              - sequence number of DTMF RTP packet (begins from 1,
01668                     wrapped to 0)
01669       +1                              - set of flags
01670       +1 (bit 0)              - flaps by different DTMF digits delimited by audio
01671                     or repeated digit without audio???
01672       +2 (+4,+6,...)  - power level? (rises from 0 to 32 at begin of tone
01673                     then falls to 0 at its end)
01674       +3 (+5,+7,...)  - detected DTMF digit (0..9,*,#,A-D,...)
01675       Repeated DTMF information (bytes 4/5, 6/7) is history shifted right
01676       by each new packet and thus provides some redudancy.
01677 
01678       Sample of Cisco RTP DTMF packet is (all data in hex):
01679          19 07 00 02 12 02 20 02
01680       showing end of DTMF digit '2'.
01681 
01682       The packets
01683          27 07 00 02 0A 02 20 02
01684          28 06 20 02 00 02 0A 02
01685       shows begin of new digit '2' with very short pause (20 ms) after
01686       previous digit '2'. Bit +1.0 flips at begin of new digit.
01687 
01688       Cisco RTP DTMF packets comes as replacement of audio RTP packets
01689       so its uses the same sequencing and timestamping rules as replaced
01690       audio packets. Repeat interval of DTMF packets is 20 ms and not rely
01691       on audio framing parameters. Marker bit isn't used within stream of
01692       DTMFs nor audio stream coming immediately after DTMF stream. Timestamps
01693       are not sequential at borders between DTMF and audio streams,
01694    */
01695 
01696    seq = data[0];
01697    flags = data[1];
01698    power = data[2];
01699    event = data[3] & 0x1f;
01700 
01701    if (option_debug > 2 || rtpdebug)
01702       ast_debug(0, "Cisco DTMF Digit: %02x (len=%d, seq=%d, flags=%02x, power=%d, history count=%d)\n", event, len, seq, flags, power, (len - 4) / 2);
01703    if (event < 10) {
01704       resp = '0' + event;
01705    } else if (event < 11) {
01706       resp = '*';
01707    } else if (event < 12) {
01708       resp = '#';
01709    } else if (event < 16) {
01710       resp = 'A' + (event - 12);
01711    } else if (event < 17) {
01712       resp = 'X';
01713    }
01714    if ((!rtp->resp && power) || (rtp->resp && (rtp->resp != resp))) {
01715       rtp->resp = resp;
01716       /* Why we should care on DTMF compensation at reception? */
01717       if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)) {
01718          f = create_dtmf_frame(instance, AST_FRAME_DTMF_BEGIN, 0);
01719          rtp->dtmfsamples = 0;
01720       }
01721    } else if ((rtp->resp == resp) && !power) {
01722       f = create_dtmf_frame(instance, AST_FRAME_DTMF_END, ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE));
01723       f->samples = rtp->dtmfsamples * (rtp->lastrxformat ? (rtp_get_rate(rtp->lastrxformat) / 1000) : 8);
01724       rtp->resp = 0;
01725    } else if (rtp->resp == resp)
01726       rtp->dtmfsamples += 20 * (rtp->lastrxformat ? (rtp_get_rate(rtp->lastrxformat) / 1000) : 8);
01727 
01728    rtp->dtmf_timeout = 0;
01729 
01730    return f;
01731 }
01732 
01733 static struct ast_frame *process_cn_rfc3389(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, struct ast_sockaddr *addr, int payloadtype, int mark)
01734 {
01735    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01736 
01737    /* Convert comfort noise into audio with various codecs.  Unfortunately this doesn't
01738       totally help us out becuase we don't have an engine to keep it going and we are not
01739       guaranteed to have it every 20ms or anything */
01740    if (rtpdebug)
01741       ast_debug(0, "- RTP 3389 Comfort noise event: Level %" PRId64 " (len = %d)\n", rtp->lastrxformat, len);
01742 
01743    if (ast_test_flag(rtp, FLAG_3389_WARNING)) {
01744       struct ast_sockaddr remote_address = { {0,} };
01745 
01746       ast_rtp_instance_get_remote_address(instance, &remote_address);
01747 
01748       ast_log(LOG_NOTICE, "Comfort noise support incomplete in Asterisk (RFC 3389). Please turn off on client if possible. Client address: %s\n",
01749          ast_sockaddr_stringify(&remote_address));
01750       ast_set_flag(rtp, FLAG_3389_WARNING);
01751    }
01752 
01753    /* Must have at least one byte */
01754    if (!len)
01755       return NULL;
01756    if (len < 24) {
01757       rtp->f.data.ptr = rtp->rawdata + AST_FRIENDLY_OFFSET;
01758       rtp->f.datalen = len - 1;
01759       rtp->f.offset = AST_FRIENDLY_OFFSET;
01760       memcpy(rtp->f.data.ptr, data + 1, len - 1);
01761    } else {
01762       rtp->f.data.ptr = NULL;
01763       rtp->f.offset = 0;
01764       rtp->f.datalen = 0;
01765    }
01766    rtp->f.frametype = AST_FRAME_CNG;
01767    rtp->f.subclass.integer = data[0] & 0x7f;
01768    rtp->f.samples = 0;
01769    rtp->f.delivery.tv_usec = rtp->f.delivery.tv_sec = 0;
01770 
01771    return &rtp->f;
01772 }
01773 
01774 static struct ast_frame *ast_rtcp_read(struct ast_rtp_instance *instance)
01775 {
01776    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
01777    struct ast_sockaddr addr;
01778    unsigned int rtcpdata[8192 + AST_FRIENDLY_OFFSET];
01779    unsigned int *rtcpheader = (unsigned int *)(rtcpdata + AST_FRIENDLY_OFFSET);
01780    int res, packetwords, position = 0;
01781    struct ast_frame *f = &ast_null_frame;
01782 
01783    /* Read in RTCP data from the socket */
01784    if ((res = rtcp_recvfrom(instance, rtcpdata + AST_FRIENDLY_OFFSET,
01785             sizeof(rtcpdata) - sizeof(unsigned int) * AST_FRIENDLY_OFFSET,
01786             0, &addr)) < 0) {
01787       ast_assert(errno != EBADF);
01788       if (errno != EAGAIN) {
01789          ast_log(LOG_WARNING, "RTCP Read error: %s.  Hanging up.\n", strerror(errno));
01790          return NULL;
01791       }
01792       return &ast_null_frame;
01793    }
01794 
01795    packetwords = res / 4;
01796 
01797    if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT)) {
01798       /* Send to whoever sent to us */
01799       if (ast_sockaddr_cmp(&rtp->rtcp->them, &addr)) {
01800          ast_sockaddr_copy(&rtp->rtcp->them, &addr);
01801          if (option_debug || rtpdebug)
01802             ast_debug(0, "RTCP NAT: Got RTCP from other end. Now sending to address %s\n",
01803                  ast_sockaddr_stringify(&rtp->rtcp->them));
01804       }
01805    }
01806 
01807    ast_debug(1, "Got RTCP report of %d bytes\n", res);
01808 
01809    while (position < packetwords) {
01810       int i, pt, rc;
01811       unsigned int length, dlsr, lsr, msw, lsw, comp;
01812       struct timeval now;
01813       double rttsec, reported_jitter, reported_normdev_jitter_current, normdevrtt_current, reported_lost, reported_normdev_lost_current;
01814       uint64_t rtt = 0;
01815 
01816       i = position;
01817       length = ntohl(rtcpheader[i]);
01818       pt = (length & 0xff0000) >> 16;
01819       rc = (length & 0x1f000000) >> 24;
01820       length &= 0xffff;
01821 
01822       if ((i + length) > packetwords) {
01823          if (option_debug || rtpdebug)
01824             ast_log(LOG_DEBUG, "RTCP Read too short\n");
01825          return &ast_null_frame;
01826       }
01827 
01828       if (rtcp_debug_test_addr(&addr)) {
01829          ast_verbose("\n\nGot RTCP from %s\n",
01830                 ast_sockaddr_stringify(&addr));
01831          ast_verbose("PT: %d(%s)\n", pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown");
01832          ast_verbose("Reception reports: %d\n", rc);
01833          ast_verbose("SSRC of sender: %u\n", rtcpheader[i + 1]);
01834       }
01835 
01836       i += 2; /* Advance past header and ssrc */
01837       if (rc == 0 && pt == RTCP_PT_RR) {      /* We're receiving a receiver report with no reports, which is ok */
01838          position += (length + 1);
01839          continue;
01840       }
01841 
01842       switch (pt) {
01843       case RTCP_PT_SR:
01844          gettimeofday(&rtp->rtcp->rxlsr,NULL); /* To be able to populate the dlsr */
01845          rtp->rtcp->spc = ntohl(rtcpheader[i+3]);
01846          rtp->rtcp->soc = ntohl(rtcpheader[i + 4]);
01847          rtp->rtcp->themrxlsr = ((ntohl(rtcpheader[i]) & 0x0000ffff) << 16) | ((ntohl(rtcpheader[i + 1]) & 0xffff0000) >> 16); /* Going to LSR in RR*/
01848 
01849          if (rtcp_debug_test_addr(&addr)) {
01850             ast_verbose("NTP timestamp: %lu.%010lu\n", (unsigned long) ntohl(rtcpheader[i]), (unsigned long) ntohl(rtcpheader[i + 1]) * 4096);
01851             ast_verbose("RTP timestamp: %lu\n", (unsigned long) ntohl(rtcpheader[i + 2]));
01852             ast_verbose("SPC: %lu\tSOC: %lu\n", (unsigned long) ntohl(rtcpheader[i + 3]), (unsigned long) ntohl(rtcpheader[i + 4]));
01853          }
01854          i += 5;
01855          if (rc < 1)
01856             break;
01857          /* Intentional fall through */
01858       case RTCP_PT_RR:
01859          /* Don't handle multiple reception reports (rc > 1) yet */
01860          /* Calculate RTT per RFC */
01861          gettimeofday(&now, NULL);
01862          timeval2ntp(now, &msw, &lsw);
01863          if (ntohl(rtcpheader[i + 4]) && ntohl(rtcpheader[i + 5])) { /* We must have the LSR && DLSR */
01864             comp = ((msw & 0xffff) << 16) | ((lsw & 0xffff0000) >> 16);
01865             lsr = ntohl(rtcpheader[i + 4]);
01866             dlsr = ntohl(rtcpheader[i + 5]);
01867             rtt = comp - lsr - dlsr;
01868 
01869             /* Convert end to end delay to usec (keeping the calculation in 64bit space)
01870                sess->ee_delay = (eedelay * 1000) / 65536; */
01871             if (rtt < 4294) {
01872                rtt = (rtt * 1000000) >> 16;
01873             } else {
01874                rtt = (rtt * 1000) >> 16;
01875                rtt *= 1000;
01876             }
01877             rtt = rtt / 1000.;
01878             rttsec = rtt / 1000.;
01879             rtp->rtcp->rtt = rttsec;
01880 
01881             if (comp - dlsr >= lsr) {
01882                rtp->rtcp->accumulated_transit += rttsec;
01883 
01884                if (rtp->rtcp->rtt_count == 0)
01885                   rtp->rtcp->minrtt = rttsec;
01886 
01887                if (rtp->rtcp->maxrtt<rttsec)
01888                   rtp->rtcp->maxrtt = rttsec;
01889                if (rtp->rtcp->minrtt>rttsec)
01890                   rtp->rtcp->minrtt = rttsec;
01891 
01892                normdevrtt_current = normdev_compute(rtp->rtcp->normdevrtt, rttsec, rtp->rtcp->rtt_count);
01893 
01894                rtp->rtcp->stdevrtt = stddev_compute(rtp->rtcp->stdevrtt, rttsec, rtp->rtcp->normdevrtt, normdevrtt_current, rtp->rtcp->rtt_count);
01895 
01896                rtp->rtcp->normdevrtt = normdevrtt_current;
01897 
01898                rtp->rtcp->rtt_count++;
01899             } else if (rtcp_debug_test_addr(&addr)) {
01900                ast_verbose("Internal RTCP NTP clock skew detected: "
01901                         "lsr=%u, now=%u, dlsr=%u (%d:%03dms), "
01902                       "diff=%d\n",
01903                       lsr, comp, dlsr, dlsr / 65536,
01904                       (dlsr % 65536) * 1000 / 65536,
01905                       dlsr - (comp - lsr));
01906             }
01907          }
01908 
01909          rtp->rtcp->reported_jitter = ntohl(rtcpheader[i + 3]);
01910          reported_jitter = (double) rtp->rtcp->reported_jitter;
01911 
01912          if (rtp->rtcp->reported_jitter_count == 0)
01913             rtp->rtcp->reported_minjitter = reported_jitter;
01914 
01915          if (reported_jitter < rtp->rtcp->reported_minjitter)
01916             rtp->rtcp->reported_minjitter = reported_jitter;
01917 
01918          if (reported_jitter > rtp->rtcp->reported_maxjitter)
01919             rtp->rtcp->reported_maxjitter = reported_jitter;
01920 
01921          reported_normdev_jitter_current = normdev_compute(rtp->rtcp->reported_normdev_jitter, reported_jitter, rtp->rtcp->reported_jitter_count);
01922 
01923          rtp->rtcp->reported_stdev_jitter = stddev_compute(rtp->rtcp->reported_stdev_jitter, reported_jitter, rtp->rtcp->reported_normdev_jitter, reported_normdev_jitter_current, rtp->rtcp->reported_jitter_count);
01924 
01925          rtp->rtcp->reported_normdev_jitter = reported_normdev_jitter_current;
01926 
01927          rtp->rtcp->reported_lost = ntohl(rtcpheader[i + 1]) & 0xffffff;
01928 
01929          reported_lost = (double) rtp->rtcp->reported_lost;
01930 
01931          /* using same counter as for jitter */
01932          if (rtp->rtcp->reported_jitter_count == 0)
01933             rtp->rtcp->reported_minlost = reported_lost;
01934 
01935          if (reported_lost < rtp->rtcp->reported_minlost)
01936             rtp->rtcp->reported_minlost = reported_lost;
01937 
01938          if (reported_lost > rtp->rtcp->reported_maxlost)
01939             rtp->rtcp->reported_maxlost = reported_lost;
01940          reported_normdev_lost_current = normdev_compute(rtp->rtcp->reported_normdev_lost, reported_lost, rtp->rtcp->reported_jitter_count);
01941 
01942          rtp->rtcp->reported_stdev_lost = stddev_compute(rtp->rtcp->reported_stdev_lost, reported_lost, rtp->rtcp->reported_normdev_lost, reported_normdev_lost_current, rtp->rtcp->reported_jitter_count);
01943 
01944          rtp->rtcp->reported_normdev_lost = reported_normdev_lost_current;
01945 
01946          rtp->rtcp->reported_jitter_count++;
01947 
01948          if (rtcp_debug_test_addr(&addr)) {
01949             ast_verbose("  Fraction lost: %ld\n", (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24));
01950             ast_verbose("  Packets lost so far: %d\n", rtp->rtcp->reported_lost);
01951             ast_verbose("  Highest sequence number: %ld\n", (long) (ntohl(rtcpheader[i + 2]) & 0xffff));
01952             ast_verbose("  Sequence number cycles: %ld\n", (long) (ntohl(rtcpheader[i + 2])) >> 16);
01953             ast_verbose("  Interarrival jitter: %u\n", rtp->rtcp->reported_jitter);
01954             ast_verbose("  Last SR(our NTP): %lu.%010lu\n",(unsigned long) ntohl(rtcpheader[i + 4]) >> 16,((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096);
01955             ast_verbose("  DLSR: %4.4f (sec)\n",ntohl(rtcpheader[i + 5])/65536.0);
01956             if (rtt)
01957                ast_verbose("  RTT: %lu(sec)\n", (unsigned long) rtt);
01958          }
01959          if (rtt) {
01960             manager_event(EVENT_FLAG_REPORTING, "RTCPReceived", "From: %s\r\n"
01961                             "PT: %d(%s)\r\n"
01962                             "ReceptionReports: %d\r\n"
01963                             "SenderSSRC: %u\r\n"
01964                             "FractionLost: %ld\r\n"
01965                             "PacketsLost: %d\r\n"
01966                             "HighestSequence: %ld\r\n"
01967                             "SequenceNumberCycles: %ld\r\n"
01968                             "IAJitter: %u\r\n"
01969                             "LastSR: %lu.%010lu\r\n"
01970                             "DLSR: %4.4f(sec)\r\n"
01971                      "RTT: %llu(sec)\r\n",
01972                      ast_sockaddr_stringify(&addr),
01973                      pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown",
01974                      rc,
01975                      rtcpheader[i + 1],
01976                      (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24),
01977                      rtp->rtcp->reported_lost,
01978                      (long) (ntohl(rtcpheader[i + 2]) & 0xffff),
01979                      (long) (ntohl(rtcpheader[i + 2])) >> 16,
01980                      rtp->rtcp->reported_jitter,
01981                      (unsigned long) ntohl(rtcpheader[i + 4]) >> 16, ((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096,
01982                      ntohl(rtcpheader[i + 5])/65536.0,
01983                      (unsigned long long)rtt);
01984          } else {
01985             manager_event(EVENT_FLAG_REPORTING, "RTCPReceived", "From: %s\r\n"
01986                             "PT: %d(%s)\r\n"
01987                             "ReceptionReports: %d\r\n"
01988                             "SenderSSRC: %u\r\n"
01989                             "FractionLost: %ld\r\n"
01990                             "PacketsLost: %d\r\n"
01991                             "HighestSequence: %ld\r\n"
01992                             "SequenceNumberCycles: %ld\r\n"
01993                             "IAJitter: %u\r\n"
01994                             "LastSR: %lu.%010lu\r\n"
01995                      "DLSR: %4.4f(sec)\r\n",
01996                      ast_sockaddr_stringify(&addr),
01997                      pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown",
01998                      rc,
01999                      rtcpheader[i + 1],
02000                      (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24),
02001                      rtp->rtcp->reported_lost,
02002                      (long) (ntohl(rtcpheader[i + 2]) & 0xffff),
02003                      (long) (ntohl(rtcpheader[i + 2])) >> 16,
02004                      rtp->rtcp->reported_jitter,
02005                      (unsigned long) ntohl(rtcpheader[i + 4]) >> 16,
02006                      ((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096,
02007                      ntohl(rtcpheader[i + 5])/65536.0);
02008          }
02009          break;
02010       case RTCP_PT_FUR:
02011          if (rtcp_debug_test_addr(&addr))
02012             ast_verbose("Received an RTCP Fast Update Request\n");
02013          rtp->f.frametype = AST_FRAME_CONTROL;
02014          rtp->f.subclass.integer = AST_CONTROL_VIDUPDATE;
02015          rtp->f.datalen = 0;
02016          rtp->f.samples = 0;
02017          rtp->f.mallocd = 0;
02018          rtp->f.src = "RTP";
02019          f = &rtp->f;
02020          break;
02021       case RTCP_PT_SDES:
02022          if (rtcp_debug_test_addr(&addr))
02023             ast_verbose("Received an SDES from %s\n",
02024                    ast_sockaddr_stringify(&rtp->rtcp->them));
02025          break;
02026       case RTCP_PT_BYE:
02027          if (rtcp_debug_test_addr(&addr))
02028             ast_verbose("Received a BYE from %s\n",
02029                    ast_sockaddr_stringify(&rtp->rtcp->them));
02030          break;
02031       default:
02032          ast_debug(1, "Unknown RTCP packet (pt=%d) received from %s\n",
02033               pt, ast_sockaddr_stringify(&rtp->rtcp->them));
02034          break;
02035       }
02036       position += (length + 1);
02037    }
02038 
02039    rtp->rtcp->rtcp_info = 1;
02040 
02041    return f;
02042 }
02043 
02044 static int bridge_p2p_rtp_write(struct ast_rtp_instance *instance, unsigned int *rtpheader, int len, int hdrlen)
02045 {
02046    struct ast_rtp_instance *instance1 = ast_rtp_instance_get_bridged(instance);
02047    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance), *bridged = ast_rtp_instance_get_data(instance1);
02048    int res = 0, payload = 0, bridged_payload = 0, mark;
02049    struct ast_rtp_payload_type payload_type;
02050    int reconstruct = ntohl(rtpheader[0]);
02051    struct ast_sockaddr remote_address = { {0,} };
02052 
02053    /* Get fields from packet */
02054    payload = (reconstruct & 0x7f0000) >> 16;
02055    mark = (((reconstruct & 0x800000) >> 23) != 0);
02056 
02057    /* Check what the payload value should be */
02058    payload_type = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(instance), payload);
02059 
02060    /* Otherwise adjust bridged payload to match */
02061    bridged_payload = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance1), payload_type.asterisk_format, payload_type.code);
02062 
02063    /* If no codec could be matched between instance and instance1, then somehow things were made incompatible while we were still bridged.  Bail. */
02064    if (bridged_payload < 0) {
02065       return -1;
02066    }
02067 
02068    /* If the payload coming in is not one of the negotiated ones then send it to the core, this will cause formats to change and the bridge to break */
02069    if (!(ast_rtp_instance_get_codecs(instance1)->payloads[bridged_payload].code)) {
02070       return -1;
02071    }
02072 
02073    /* If the marker bit has been explicitly set turn it on */
02074    if (ast_test_flag(rtp, FLAG_NEED_MARKER_BIT)) {
02075       mark = 1;
02076       ast_clear_flag(rtp, FLAG_NEED_MARKER_BIT);
02077    }
02078 
02079    /* Reconstruct part of the packet */
02080    reconstruct &= 0xFF80FFFF;
02081    reconstruct |= (bridged_payload << 16);
02082    reconstruct |= (mark << 23);
02083    rtpheader[0] = htonl(reconstruct);
02084 
02085    ast_rtp_instance_get_remote_address(instance1, &remote_address);
02086 
02087    if (ast_sockaddr_isnull(&remote_address)) {
02088       ast_debug(1, "Remote address is null, most likely RTP has been stopped\n");
02089       return 0;
02090    }
02091 
02092    /* Send the packet back out */
02093    res = rtp_sendto(instance1, (void *)rtpheader, len, 0, &remote_address);
02094    if (res < 0) {
02095       if (!ast_rtp_instance_get_prop(instance1, AST_RTP_PROPERTY_NAT) || (ast_rtp_instance_get_prop(instance1, AST_RTP_PROPERTY_NAT) && (ast_test_flag(bridged, FLAG_NAT_ACTIVE) == FLAG_NAT_ACTIVE))) {
02096          ast_log(LOG_WARNING,
02097             "RTP Transmission error of packet to %s: %s\n",
02098             ast_sockaddr_stringify(&remote_address),
02099             strerror(errno));
02100       } else if (((ast_test_flag(bridged, FLAG_NAT_ACTIVE) == FLAG_NAT_INACTIVE) || rtpdebug) && !ast_test_flag(bridged, FLAG_NAT_INACTIVE_NOWARN)) {
02101          if (option_debug || rtpdebug)
02102             ast_log(LOG_WARNING,
02103                "RTP NAT: Can't write RTP to private "
02104                "address %s, waiting for other end to "
02105                "send audio...\n",
02106                ast_sockaddr_stringify(&remote_address));
02107          ast_set_flag(bridged, FLAG_NAT_INACTIVE_NOWARN);
02108       }
02109       return 0;
02110    } else if (rtp_debug_test_addr(&remote_address)) {
02111       ast_verbose("Sent RTP P2P packet to %s (type %-2.2d, len %-6.6u)\n",
02112              ast_sockaddr_stringify(&remote_address),
02113              bridged_payload, len - hdrlen);
02114    }
02115 
02116    return 0;
02117 }
02118 
02119 static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtcp)
02120 {
02121    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02122    struct ast_sockaddr addr;
02123    int res, hdrlen = 12, version, payloadtype, padding, mark, ext, cc, prev_seqno;
02124    unsigned int *rtpheader = (unsigned int*)(rtp->rawdata + AST_FRIENDLY_OFFSET), seqno, ssrc, timestamp;
02125    struct ast_rtp_payload_type payload;
02126    struct ast_sockaddr remote_address = { {0,} };
02127    struct frame_list frames;
02128 
02129    /* If this is actually RTCP let's hop on over and handle it */
02130    if (rtcp) {
02131       if (rtp->rtcp) {
02132          return ast_rtcp_read(instance);
02133       }
02134       return &ast_null_frame;
02135    }
02136 
02137    /* If we are currently sending DTMF to the remote party send a continuation packet */
02138    if (rtp->sending_digit) {
02139       ast_rtp_dtmf_continuation(instance);
02140    }
02141 
02142    /* Actually read in the data from the socket */
02143    if ((res = rtp_recvfrom(instance, rtp->rawdata + AST_FRIENDLY_OFFSET,
02144             sizeof(rtp->rawdata) - AST_FRIENDLY_OFFSET, 0,
02145             &addr)) < 0) {
02146       ast_assert(errno != EBADF);
02147       if (errno != EAGAIN) {
02148          ast_log(LOG_WARNING, "RTP Read error: %s. Hanging up.\n", strerror(errno));
02149          return NULL;
02150       }
02151       return &ast_null_frame;
02152    }
02153 
02154    /* Make sure the data that was read in is actually enough to make up an RTP packet */
02155    if (res < hdrlen) {
02156       ast_log(LOG_WARNING, "RTP Read too short\n");
02157       return &ast_null_frame;
02158    }
02159 
02160    /* Get fields and verify this is an RTP packet */
02161    seqno = ntohl(rtpheader[0]);
02162 
02163    ast_rtp_instance_get_remote_address(instance, &remote_address);
02164 
02165    if (!(version = (seqno & 0xC0000000) >> 30)) {
02166       struct sockaddr_in addr_tmp;
02167       struct ast_sockaddr addr_v4;
02168       if (ast_sockaddr_is_ipv4(&addr)) {
02169          ast_sockaddr_to_sin(&addr, &addr_tmp);
02170       } else if (ast_sockaddr_ipv4_mapped(&addr, &addr_v4)) {
02171          ast_debug(1, "Using IPv6 mapped address %s for STUN\n",
02172               ast_sockaddr_stringify(&addr));
02173          ast_sockaddr_to_sin(&addr_v4, &addr_tmp);
02174       } else {
02175          ast_debug(1, "Cannot do STUN for non IPv4 address %s\n",
02176               ast_sockaddr_stringify(&addr));
02177          return &ast_null_frame;
02178       }
02179       if ((ast_stun_handle_packet(rtp->s, &addr_tmp, rtp->rawdata + AST_FRIENDLY_OFFSET, res, NULL, NULL) == AST_STUN_ACCEPT) &&
02180           ast_sockaddr_isnull(&remote_address)) {
02181          ast_sockaddr_from_sin(&addr, &addr_tmp);
02182          ast_rtp_instance_set_remote_address(instance, &addr);
02183       }
02184       return &ast_null_frame;
02185    }
02186 
02187    /* If strict RTP protection is enabled see if we need to learn the remote address or if we need to drop the packet */
02188    if (rtp->strict_rtp_state == STRICT_RTP_LEARN) {
02189       ast_debug(1, "%p -- start learning mode pass with addr = %s\n", rtp, ast_sockaddr_stringify(&addr));
02190       /* For now, we always copy the address. */
02191       ast_sockaddr_copy(&rtp->strict_rtp_address, &addr);
02192 
02193       /* Send the rtp and the seqno from header to rtp_learning_rtp_seq_update to see whether we can exit or not*/
02194       if (rtp_learning_rtp_seq_update(rtp, ntohl(rtpheader[0]))) {
02195          ast_debug(1, "%p -- Condition for learning hasn't exited, so reject the frame.\n", rtp);
02196          return &ast_null_frame;
02197       }
02198 
02199       ast_debug(1, "%p -- Probation Ended. Set strict_rtp_state to STRICT_RTP_CLOSED with address %s\n", rtp, ast_sockaddr_stringify(&addr));
02200       rtp->strict_rtp_state = STRICT_RTP_CLOSED;
02201    } else if (rtp->strict_rtp_state == STRICT_RTP_CLOSED) {
02202       if (ast_sockaddr_cmp(&rtp->strict_rtp_address, &addr)) {
02203          /* Hmm, not the strict addres. Perhaps we're getting audio from the alternate? */
02204          if (!ast_sockaddr_cmp(&rtp->alt_rtp_address, &addr)) {
02205             /* ooh, we did! You're now the new expected address, son! */
02206             ast_sockaddr_copy(&rtp->strict_rtp_address,
02207                     &addr);
02208          } else  {
02209             const char *real_addr = ast_strdupa(ast_sockaddr_stringify(&addr));
02210             const char *expected_addr = ast_strdupa(ast_sockaddr_stringify(&rtp->strict_rtp_address));
02211 
02212             ast_debug(1, "Received RTP packet from %s, dropping due to strict RTP protection. Expected it to be from %s\n",
02213                   real_addr, expected_addr);
02214 
02215             return &ast_null_frame;
02216          }
02217       }
02218    }
02219 
02220    /* If symmetric RTP is enabled see if the remote side is not what we expected and change where we are sending audio */
02221    if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT)) {
02222       if (ast_sockaddr_cmp(&remote_address, &addr)) {
02223          ast_rtp_instance_set_remote_address(instance, &addr);
02224          ast_sockaddr_copy(&remote_address, &addr);
02225          if (rtp->rtcp) {
02226             ast_sockaddr_copy(&rtp->rtcp->them, &addr);
02227             ast_sockaddr_set_port(&rtp->rtcp->them, ast_sockaddr_port(&addr) + 1);
02228          }
02229          rtp->rxseqno = 0;
02230          ast_set_flag(rtp, FLAG_NAT_ACTIVE);
02231          if (option_debug || rtpdebug)
02232             ast_debug(0, "RTP NAT: Got audio from other end. Now sending to address %s\n",
02233                  ast_sockaddr_stringify(&remote_address));
02234       }
02235    }
02236 
02237    /* If we are directly bridged to another instance send the audio directly out */
02238    if (ast_rtp_instance_get_bridged(instance) && !bridge_p2p_rtp_write(instance, rtpheader, res, hdrlen)) {
02239       return &ast_null_frame;
02240    }
02241 
02242    /* If the version is not what we expected by this point then just drop the packet */
02243    if (version != 2) {
02244       return &ast_null_frame;
02245    }
02246 
02247    /* Pull out the various other fields we will need */
02248    payloadtype = (seqno & 0x7f0000) >> 16;
02249    padding = seqno & (1 << 29);
02250    mark = seqno & (1 << 23);
02251    ext = seqno & (1 << 28);
02252    cc = (seqno & 0xF000000) >> 24;
02253    seqno &= 0xffff;
02254    timestamp = ntohl(rtpheader[1]);
02255    ssrc = ntohl(rtpheader[2]);
02256 
02257    AST_LIST_HEAD_INIT_NOLOCK(&frames);
02258    /* Force a marker bit and change SSRC if the SSRC changes */
02259    if (rtp->rxssrc && rtp->rxssrc != ssrc) {
02260       struct ast_frame *f, srcupdate = {
02261          AST_FRAME_CONTROL,
02262          .subclass.integer = AST_CONTROL_SRCCHANGE,
02263       };
02264 
02265       if (!mark) {
02266          if (option_debug || rtpdebug) {
02267             ast_debug(1, "Forcing Marker bit, because SSRC has changed\n");
02268          }
02269          mark = 1;
02270       }
02271 
02272       f = ast_frisolate(&srcupdate);
02273       AST_LIST_INSERT_TAIL(&frames, f, frame_list);
02274    }
02275 
02276    rtp->rxssrc = ssrc;
02277 
02278    /* Remove any padding bytes that may be present */
02279    if (padding) {
02280       res -= rtp->rawdata[AST_FRIENDLY_OFFSET + res - 1];
02281    }
02282 
02283    /* Skip over any CSRC fields */
02284    if (cc) {
02285       hdrlen += cc * 4;
02286    }
02287 
02288    /* Look for any RTP extensions, currently we do not support any */
02289    if (ext) {
02290       hdrlen += (ntohl(rtpheader[hdrlen/4]) & 0xffff) << 2;
02291       hdrlen += 4;
02292       if (option_debug) {
02293          int profile;
02294          profile = (ntohl(rtpheader[3]) & 0xffff0000) >> 16;
02295          if (profile == 0x505a)
02296             ast_debug(1, "Found Zfone extension in RTP stream - zrtp - not supported.\n");
02297          else
02298             ast_debug(1, "Found unknown RTP Extensions %x\n", profile);
02299       }
02300    }
02301 
02302    /* Make sure after we potentially mucked with the header length that it is once again valid */
02303    if (res < hdrlen) {
02304       ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d\n", res, hdrlen);
02305       return AST_LIST_FIRST(&frames) ? AST_LIST_FIRST(&frames) : &ast_null_frame;
02306    }
02307 
02308    rtp->rxcount++;
02309    if (rtp->rxcount == 1) {
02310       rtp->seedrxseqno = seqno;
02311    }
02312 
02313    /* Do not schedule RR if RTCP isn't run */
02314    if (rtp->rtcp && !ast_sockaddr_isnull(&rtp->rtcp->them) && rtp->rtcp->schedid < 1) {
02315       /* Schedule transmission of Receiver Report */
02316       ao2_ref(instance, +1);
02317       rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, instance);
02318       if (rtp->rtcp->schedid < 0) {
02319          ao2_ref(instance, -1);
02320          ast_log(LOG_WARNING, "scheduling RTCP transmission failed.\n");
02321       }
02322    }
02323    if ((int)rtp->lastrxseqno - (int)seqno  > 100) /* if so it would indicate that the sender cycled; allow for misordering */
02324       rtp->cycles += RTP_SEQ_MOD;
02325 
02326    prev_seqno = rtp->lastrxseqno;
02327    rtp->lastrxseqno = seqno;
02328 
02329    if (!rtp->themssrc) {
02330       rtp->themssrc = ntohl(rtpheader[2]); /* Record their SSRC to put in future RR */
02331    }
02332 
02333    if (rtp_debug_test_addr(&addr)) {
02334       ast_verbose("Got  RTP packet from    %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
02335              ast_sockaddr_stringify(&addr),
02336              payloadtype, seqno, timestamp,res - hdrlen);
02337    }
02338 
02339    payload = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(instance), payloadtype);
02340 
02341    /* If the payload is not actually an Asterisk one but a special one pass it off to the respective handler */
02342    if (!payload.asterisk_format) {
02343       struct ast_frame *f = NULL;
02344       if (payload.code == AST_RTP_DTMF) {
02345          /* process_dtmf_rfc2833 may need to return multiple frames. We do this
02346           * by passing the pointer to the frame list to it so that the method
02347           * can append frames to the list as needed.
02348           */
02349          process_dtmf_rfc2833(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &addr, payloadtype, mark, &frames);
02350       } else if (payload.code == AST_RTP_CISCO_DTMF) {
02351          f = process_dtmf_cisco(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &addr, payloadtype, mark);
02352       } else if (payload.code == AST_RTP_CN) {
02353          f = process_cn_rfc3389(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &addr, payloadtype, mark);
02354       } else {
02355          ast_log(LOG_NOTICE, "Unknown RTP codec %d received from '%s'\n",
02356             payloadtype,
02357             ast_sockaddr_stringify(&remote_address));
02358       }
02359 
02360       if (f) {
02361          AST_LIST_INSERT_TAIL(&frames, f, frame_list);
02362       }
02363       /* Even if no frame was returned by one of the above methods,
02364        * we may have a frame to return in our frame list
02365        */
02366       if (!AST_LIST_EMPTY(&frames)) {
02367          return AST_LIST_FIRST(&frames);
02368       }
02369       return &ast_null_frame;
02370    }
02371 
02372    rtp->lastrxformat = rtp->f.subclass.codec = payload.code;
02373    rtp->f.frametype = (rtp->f.subclass.codec & AST_FORMAT_AUDIO_MASK) ? AST_FRAME_VOICE : (rtp->f.subclass.codec & AST_FORMAT_VIDEO_MASK) ? AST_FRAME_VIDEO : AST_FRAME_TEXT;
02374 
02375    rtp->rxseqno = seqno;
02376 
02377    if (rtp->dtmf_timeout && rtp->dtmf_timeout < timestamp) {
02378       rtp->dtmf_timeout = 0;
02379 
02380       if (rtp->resp) {
02381          struct ast_frame *f;
02382          f = create_dtmf_frame(instance, AST_FRAME_DTMF_END, 0);
02383          f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass.codec)), ast_tv(0, 0));
02384          rtp->resp = 0;
02385          rtp->dtmf_timeout = rtp->dtmf_duration = 0;
02386          AST_LIST_INSERT_TAIL(&frames, f, frame_list);
02387          return AST_LIST_FIRST(&frames);
02388       }
02389    }
02390 
02391    rtp->lastrxts = timestamp;
02392 
02393    rtp->f.src = "RTP";
02394    rtp->f.mallocd = 0;
02395    rtp->f.datalen = res - hdrlen;
02396    rtp->f.data.ptr = rtp->rawdata + hdrlen + AST_FRIENDLY_OFFSET;
02397    rtp->f.offset = hdrlen + AST_FRIENDLY_OFFSET;
02398    rtp->f.seqno = seqno;
02399 
02400    if (rtp->f.subclass.codec == AST_FORMAT_T140 && (int)seqno - (prev_seqno+1) > 0 && (int)seqno - (prev_seqno+1) < 10) {
02401       unsigned char *data = rtp->f.data.ptr;
02402 
02403       memmove(rtp->f.data.ptr+3, rtp->f.data.ptr, rtp->f.datalen);
02404       rtp->f.datalen +=3;
02405       *data++ = 0xEF;
02406       *data++ = 0xBF;
02407       *data = 0xBD;
02408    }
02409 
02410    if (rtp->f.subclass.codec == AST_FORMAT_T140RED) {
02411       unsigned char *data = rtp->f.data.ptr;
02412       unsigned char *header_end;
02413       int num_generations;
02414       int header_length;
02415       int len;
02416       int diff =(int)seqno - (prev_seqno+1); /* if diff = 0, no drop*/
02417       int x;
02418 
02419       rtp->f.subclass.codec = AST_FORMAT_T140;
02420       header_end = memchr(data, ((*data) & 0x7f), rtp->f.datalen);
02421       if (header_end == NULL) {
02422          return AST_LIST_FIRST(&frames) ? AST_LIST_FIRST(&frames) : &ast_null_frame;
02423       }
02424       header_end++;
02425 
02426       header_length = header_end - data;
02427       num_generations = header_length / 4;
02428       len = header_length;
02429 
02430       if (!diff) {
02431          for (x = 0; x < num_generations; x++)
02432             len += data[x * 4 + 3];
02433 
02434          if (!(rtp->f.datalen - len))
02435             return AST_LIST_FIRST(&frames) ? AST_LIST_FIRST(&frames) : &ast_null_frame;
02436 
02437          rtp->f.data.ptr += len;
02438          rtp->f.datalen -= len;
02439       } else if (diff > num_generations && diff < 10) {
02440          len -= 3;
02441          rtp->f.data.ptr += len;
02442          rtp->f.datalen -= len;
02443 
02444          data = rtp->f.data.ptr;
02445          *data++ = 0xEF;
02446          *data++ = 0xBF;
02447          *data = 0xBD;
02448       } else {
02449          for ( x = 0; x < num_generations - diff; x++)
02450             len += data[x * 4 + 3];
02451 
02452          rtp->f.data.ptr += len;
02453          rtp->f.datalen -= len;
02454       }
02455    }
02456 
02457    if (rtp->f.subclass.codec & AST_FORMAT_AUDIO_MASK) {
02458       rtp->f.samples = ast_codec_get_samples(&rtp->f);
02459       if ((rtp->f.subclass.codec == AST_FORMAT_SLINEAR) || (rtp->f.subclass.codec == AST_FORMAT_SLINEAR16)) {
02460          ast_frame_byteswap_be(&rtp->f);
02461       }
02462       calc_rxstamp(&rtp->f.delivery, rtp, timestamp, mark);
02463       /* Add timing data to let ast_generic_bridge() put the frame into a jitterbuf */
02464       ast_set_flag(&rtp->f, AST_FRFLAG_HAS_TIMING_INFO);
02465       rtp->f.ts = timestamp / (rtp_get_rate(rtp->f.subclass.codec) / 1000);
02466       rtp->f.len = rtp->f.samples / ((ast_format_rate(rtp->f.subclass.codec) / 1000));
02467    } else if (rtp->f.subclass.codec & AST_FORMAT_VIDEO_MASK) {
02468       /* Video -- samples is # of samples vs. 90000 */
02469       if (!rtp->lastividtimestamp)
02470          rtp->lastividtimestamp = timestamp;
02471       rtp->f.samples = timestamp - rtp->lastividtimestamp;
02472       rtp->lastividtimestamp = timestamp;
02473       rtp->f.delivery.tv_sec = 0;
02474       rtp->f.delivery.tv_usec = 0;
02475       /* Pass the RTP marker bit as bit 0 in the subclass field.
02476        * This is ok because subclass is actually a bitmask, and
02477        * the low bits represent audio formats, that are not
02478        * involved here since we deal with video.
02479        */
02480       if (mark)
02481          rtp->f.subclass.codec |= 0x1;
02482    } else {
02483       /* TEXT -- samples is # of samples vs. 1000 */
02484       if (!rtp->lastitexttimestamp)
02485          rtp->lastitexttimestamp = timestamp;
02486       rtp->f.samples = timestamp - rtp->lastitexttimestamp;
02487       rtp->lastitexttimestamp = timestamp;
02488       rtp->f.delivery.tv_sec = 0;
02489       rtp->f.delivery.tv_usec = 0;
02490    }
02491 
02492    AST_LIST_INSERT_TAIL(&frames, &rtp->f, frame_list);
02493    return AST_LIST_FIRST(&frames);
02494 }
02495 
02496 static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value)
02497 {
02498    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02499 
02500    if (property == AST_RTP_PROPERTY_RTCP) {
02501       if (value) {
02502          if (rtp->rtcp) {
02503             ast_debug(1, "Ignoring duplicate RTCP property on RTP instance '%p'\n", instance);
02504             return;
02505          }
02506          /* Setup RTCP to be activated on the next RTP write */
02507          if (!(rtp->rtcp = ast_calloc(1, sizeof(*rtp->rtcp)))) {
02508             return;
02509          }
02510 
02511          /* Grab the IP address and port we are going to use */
02512          ast_rtp_instance_get_local_address(instance, &rtp->rtcp->us);
02513          ast_sockaddr_set_port(&rtp->rtcp->us,
02514                      ast_sockaddr_port(&rtp->rtcp->us) + 1);
02515 
02516          if ((rtp->rtcp->s =
02517               create_new_socket("RTCP",
02518                       ast_sockaddr_is_ipv4(&rtp->rtcp->us) ?
02519                       AF_INET :
02520                       ast_sockaddr_is_ipv6(&rtp->rtcp->us) ?
02521                       AF_INET6 : -1)) < 0) {
02522             ast_debug(1, "Failed to create a new socket for RTCP on instance '%p'\n", instance);
02523             ast_free(rtp->rtcp);
02524             rtp->rtcp = NULL;
02525             return;
02526          }
02527 
02528          /* Try to actually bind to the IP address and port we are going to use for RTCP, if this fails we have to bail out */
02529          if (ast_bind(rtp->rtcp->s, &rtp->rtcp->us)) {
02530             ast_debug(1, "Failed to setup RTCP on RTP instance '%p'\n", instance);
02531             close(rtp->rtcp->s);
02532             ast_free(rtp->rtcp);
02533             rtp->rtcp = NULL;
02534             return;
02535          }
02536 
02537          ast_debug(1, "Setup RTCP on RTP instance '%p'\n", instance);
02538          rtp->rtcp->schedid = -1;
02539 
02540          return;
02541       } else {
02542          if (rtp->rtcp) {
02543             if (rtp->rtcp->schedid > 0) {
02544                if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
02545                   /* Successfully cancelled scheduler entry. */
02546                   ao2_ref(instance, -1);
02547                } else {
02548                   /* Unable to cancel scheduler entry */
02549                   ast_debug(1, "Failed to tear down RTCP on RTP instance '%p'\n", instance);
02550                   return;
02551                }
02552                rtp->rtcp->schedid = -1;
02553             }
02554             close(rtp->rtcp->s);
02555             ast_free(rtp->rtcp);
02556             rtp->rtcp = NULL;
02557          }
02558          return;
02559       }
02560    }
02561 
02562    return;
02563 }
02564 
02565 static int ast_rtp_fd(struct ast_rtp_instance *instance, int rtcp)
02566 {
02567    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02568 
02569    return rtcp ? (rtp->rtcp ? rtp->rtcp->s : -1) : rtp->s;
02570 }
02571 
02572 static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr)
02573 {
02574    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02575 
02576    if (rtp->rtcp) {
02577       ast_debug(1, "Setting RTCP address on RTP instance '%p'\n", instance);
02578       ast_sockaddr_copy(&rtp->rtcp->them, addr);
02579       if (!ast_sockaddr_isnull(addr)) {
02580          ast_sockaddr_set_port(&rtp->rtcp->them,
02581                      ast_sockaddr_port(addr) + 1);
02582       }
02583    }
02584 
02585    rtp->rxseqno = 0;
02586 
02587    if (strictrtp) {
02588       rtp->strict_rtp_state = STRICT_RTP_LEARN;
02589       rtp_learning_seq_init(rtp, rtp->seqno);
02590    }
02591 
02592    return;
02593 }
02594 
02595 static void ast_rtp_alt_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr)
02596 {
02597    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02598 
02599    /* No need to futz with rtp->rtcp here because ast_rtcp_read is already able to adjust if receiving
02600     * RTCP from an "unexpected" source
02601     */
02602    ast_sockaddr_copy(&rtp->alt_rtp_address, addr);
02603 
02604    return;
02605 }
02606 
02607 /*! \brief Write t140 redundacy frame
02608  * \param data primary data to be buffered
02609  */
02610 static int red_write(const void *data)
02611 {
02612    struct ast_rtp_instance *instance = (struct ast_rtp_instance*) data;
02613    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02614 
02615    ast_rtp_write(instance, &rtp->red->t140);
02616 
02617    return 1;
02618 }
02619 
02620 static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations)
02621 {
02622    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02623    int x;
02624 
02625    if (!(rtp->red = ast_calloc(1, sizeof(*rtp->red)))) {
02626       return -1;
02627    }
02628 
02629    rtp->red->t140.frametype = AST_FRAME_TEXT;
02630    rtp->red->t140.subclass.codec = AST_FORMAT_T140RED;
02631    rtp->red->t140.data.ptr = &rtp->red->buf_data;
02632 
02633    rtp->red->t140.ts = 0;
02634    rtp->red->t140red = rtp->red->t140;
02635    rtp->red->t140red.data.ptr = &rtp->red->t140red_data;
02636    rtp->red->t140red.datalen = 0;
02637    rtp->red->ti = buffer_time;
02638    rtp->red->num_gen = generations;
02639    rtp->red->hdrlen = generations * 4 + 1;
02640    rtp->red->prev_ts = 0;
02641 
02642    for (x = 0; x < generations; x++) {
02643       rtp->red->pt[x] = payloads[x];
02644       rtp->red->pt[x] |= 1 << 7; /* mark redundant generations pt */
02645       rtp->red->t140red_data[x*4] = rtp->red->pt[x];
02646    }
02647    rtp->red->t140red_data[x*4] = rtp->red->pt[x] = payloads[x]; /* primary pt */
02648    rtp->red->schedid = ast_sched_add(rtp->sched, generations, red_write, instance);
02649 
02650    rtp->red->t140.datalen = 0;
02651 
02652    return 0;
02653 }
02654 
02655 static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame)
02656 {
02657    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02658 
02659    if (frame->datalen > -1) {
02660       struct rtp_red *red = rtp->red;
02661       memcpy(&red->buf_data[red->t140.datalen], frame->data.ptr, frame->datalen);
02662       red->t140.datalen += frame->datalen;
02663       red->t140.ts = frame->ts;
02664    }
02665 
02666    return 0;
02667 }
02668 
02669 static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_rtp_instance *instance1)
02670 {
02671    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance0);
02672 
02673    ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
02674 
02675    return 0;
02676 }
02677 
02678 static int ast_rtp_get_stat(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat)
02679 {
02680    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02681 
02682    if (!rtp->rtcp) {
02683       return -1;
02684    }
02685 
02686    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXCOUNT, -1, stats->txcount, rtp->txcount);
02687    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RXCOUNT, -1, stats->rxcount, rtp->rxcount);
02688 
02689    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->txploss, rtp->rtcp->reported_lost);
02690    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->rxploss, rtp->rtcp->expected_prior - rtp->rtcp->received_prior);
02691    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MAXRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_maxrxploss, rtp->rtcp->reported_maxlost);
02692    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MINRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_minrxploss, rtp->rtcp->reported_minlost);
02693    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_normdevrxploss, rtp->rtcp->reported_normdev_lost);
02694    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_STDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_stdevrxploss, rtp->rtcp->reported_stdev_lost);
02695    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MAXRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_maxrxploss, rtp->rtcp->maxrxlost);
02696    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MINRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_minrxploss, rtp->rtcp->minrxlost);
02697    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_normdevrxploss, rtp->rtcp->normdev_rxlost);
02698    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_STDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_stdevrxploss, rtp->rtcp->stdev_rxlost);
02699    AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_LOSS);
02700 
02701    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->txjitter, rtp->rxjitter);
02702    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->rxjitter, rtp->rtcp->reported_jitter / (unsigned int) 65536.0);
02703    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MAXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_maxjitter, rtp->rtcp->reported_maxjitter);
02704    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MINJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_minjitter, rtp->rtcp->reported_minjitter);
02705    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_normdevjitter, rtp->rtcp->reported_normdev_jitter);
02706    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_STDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_stdevjitter, rtp->rtcp->reported_stdev_jitter);
02707    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MAXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_maxjitter, rtp->rtcp->maxrxjitter);
02708    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MINJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_minjitter, rtp->rtcp->minrxjitter);
02709    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_normdevjitter, rtp->rtcp->normdev_rxjitter);
02710    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_STDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_stdevjitter, rtp->rtcp->stdev_rxjitter);
02711    AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_JITTER);
02712 
02713    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->rtt, rtp->rtcp->rtt);
02714    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_MAX_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->maxrtt, rtp->rtcp->maxrtt);
02715    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_MIN_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->minrtt, rtp->rtcp->minrtt);
02716    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_NORMDEVRTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->normdevrtt, rtp->rtcp->normdevrtt);
02717    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_STDEVRTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->stdevrtt, rtp->rtcp->stdevrtt);
02718    AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_RTT);
02719 
02720    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_SSRC, -1, stats->local_ssrc, rtp->ssrc);
02721    AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_SSRC, -1, stats->remote_ssrc, rtp->themssrc);
02722 
02723    return 0;
02724 }
02725 
02726 static int ast_rtp_dtmf_compatible(struct ast_channel *chan0, struct ast_rtp_instance *instance0, struct ast_channel *chan1, struct ast_rtp_instance *instance1)
02727 {
02728    /* If both sides are not using the same method of DTMF transmission
02729     * (ie: one is RFC2833, other is INFO... then we can not do direct media.
02730     * --------------------------------------------------
02731     * | DTMF Mode |  HAS_DTMF  |  Accepts Begin Frames |
02732     * |-----------|------------|-----------------------|
02733     * | Inband    | False      | True                  |
02734     * | RFC2833   | True       | True                  |
02735     * | SIP INFO  | False      | False                 |
02736     * --------------------------------------------------
02737     */
02738    return (((ast_rtp_instance_get_prop(instance0, AST_RTP_PROPERTY_DTMF) != ast_rtp_instance_get_prop(instance1, AST_RTP_PROPERTY_DTMF)) ||
02739        (!chan0->tech->send_digit_begin != !chan1->tech->send_digit_begin)) ? 0 : 1);
02740 }
02741 
02742 static void ast_rtp_stun_request(struct ast_rtp_instance *instance, struct ast_sockaddr *suggestion, const char *username)
02743 {
02744    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02745    struct sockaddr_in suggestion_tmp;
02746 
02747    ast_sockaddr_to_sin(suggestion, &suggestion_tmp);
02748    ast_stun_request(rtp->s, &suggestion_tmp, username, NULL);
02749    ast_sockaddr_from_sin(suggestion, &suggestion_tmp);
02750 }
02751 
02752 static void ast_rtp_stop(struct ast_rtp_instance *instance)
02753 {
02754    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02755    struct ast_sockaddr addr = { {0,} };
02756 
02757    if (rtp->rtcp && rtp->rtcp->schedid > 0) {
02758       if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
02759          /* successfully cancelled scheduler entry. */
02760          ao2_ref(instance, -1);
02761       }
02762       rtp->rtcp->schedid = -1;
02763    }
02764 
02765    if (rtp->red) {
02766       AST_SCHED_DEL(rtp->sched, rtp->red->schedid);
02767       free(rtp->red);
02768       rtp->red = NULL;
02769    }
02770 
02771    ast_rtp_instance_set_remote_address(instance, &addr);
02772    if (rtp->rtcp) {
02773       ast_sockaddr_setnull(&rtp->rtcp->them);
02774    }
02775 
02776    ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
02777 }
02778 
02779 static int ast_rtp_qos_set(struct ast_rtp_instance *instance, int tos, int cos, const char *desc)
02780 {
02781    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02782 
02783    return ast_set_qos(rtp->s, tos, cos, desc);
02784 }
02785 
02786 /*! \brief generate comfort noice (CNG) */
02787 static int ast_rtp_sendcng(struct ast_rtp_instance *instance, int level)
02788 {
02789    unsigned int *rtpheader;
02790    int hdrlen = 12;
02791    int res;
02792    struct ast_rtp_payload_type payload;
02793    char data[256];
02794    struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
02795    struct ast_sockaddr remote_address = { {0,} };
02796 
02797    ast_rtp_instance_get_remote_address(instance, &remote_address);
02798 
02799    if (ast_sockaddr_isnull(&remote_address)) {
02800       return -1;
02801    }
02802 
02803    payload = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(instance), AST_RTP_CN);
02804 
02805    level = 127 - (level & 0x7f);
02806    
02807    rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
02808 
02809    /* Get a pointer to the header */
02810    rtpheader = (unsigned int *)data;
02811    rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload.code << 16) | (rtp->seqno++));
02812    rtpheader[1] = htonl(rtp->lastts);
02813    rtpheader[2] = htonl(rtp->ssrc); 
02814    data[12] = level;
02815 
02816    res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 1, 0, &remote_address);
02817 
02818    if (res < 0) {
02819       ast_log(LOG_ERROR, "RTP Comfort Noise Transmission error to %s: %s\n", ast_sockaddr_stringify(&remote_address), strerror(errno));
02820    } else if (rtp_debug_test_addr(&remote_address)) {
02821       ast_verbose("Sent Comfort Noise RTP packet to %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
02822             ast_sockaddr_stringify(&remote_address),
02823             AST_RTP_CN, rtp->seqno, rtp->lastdigitts, res - hdrlen);
02824    }
02825 
02826    return res;
02827 }
02828 
02829 static char *rtp_do_debug_ip(struct ast_cli_args *a)
02830 {
02831    char *arg = ast_strdupa(a->argv[4]);
02832    char *debughost = NULL;
02833    char *debugport = NULL;
02834 
02835    if (!ast_sockaddr_parse(&rtpdebugaddr, arg, 0) || !ast_sockaddr_split_hostport(arg, &debughost, &debugport, 0)) {
02836       ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
02837       return CLI_FAILURE;
02838    }
02839    rtpdebugport = (!ast_strlen_zero(debugport) && debugport[0] != '0');
02840    ast_cli(a->fd, "RTP Debugging Enabled for address: %s\n",
02841       ast_sockaddr_stringify(&rtpdebugaddr));
02842    rtpdebug = 1;
02843    return CLI_SUCCESS;
02844 }
02845 
02846 static char *rtcp_do_debug_ip(struct ast_cli_args *a)
02847 {
02848    char *arg = ast_strdupa(a->argv[4]);
02849    char *debughost = NULL;
02850    char *debugport = NULL;
02851 
02852    if (!ast_sockaddr_parse(&rtcpdebugaddr, arg, 0) || !ast_sockaddr_split_hostport(arg, &debughost, &debugport, 0)) {
02853       ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
02854       return CLI_FAILURE;
02855    }
02856    rtcpdebugport = (!ast_strlen_zero(debugport) && debugport[0] != '0');
02857    ast_cli(a->fd, "RTCP Debugging Enabled for address: %s\n",
02858       ast_sockaddr_stringify(&rtcpdebugaddr));
02859    rtcpdebug = 1;
02860    return CLI_SUCCESS;
02861 }
02862 
02863 static char *handle_cli_rtp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
02864 {
02865    switch (cmd) {
02866    case CLI_INIT:
02867       e->command = "rtp set debug {on|off|ip}";
02868       e->usage =
02869          "Usage: rtp set debug {on|off|ip host[:port]}\n"
02870          "       Enable/Disable dumping of all RTP packets. If 'ip' is\n"
02871          "       specified, limit the dumped packets to those to and from\n"
02872          "       the specified 'host' with optional port.\n";
02873       return NULL;
02874    case CLI_GENERATE:
02875       return NULL;
02876    }
02877 
02878    if (a->argc == e->args) { /* set on or off */
02879       if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
02880          rtpdebug = 1;
02881          memset(&rtpdebugaddr, 0, sizeof(rtpdebugaddr));
02882          ast_cli(a->fd, "RTP Debugging Enabled\n");
02883          return CLI_SUCCESS;
02884       } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
02885          rtpdebug = 0;
02886          ast_cli(a->fd, "RTP Debugging Disabled\n");
02887          return CLI_SUCCESS;
02888       }
02889    } else if (a->argc == e->args +1) { /* ip */
02890       return rtp_do_debug_ip(a);
02891    }
02892 
02893    return CLI_SHOWUSAGE;   /* default, failure */
02894 }
02895 
02896 static char *handle_cli_rtcp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
02897 {
02898    switch (cmd) {
02899    case CLI_INIT:
02900       e->command = "rtcp set debug {on|off|ip}";
02901       e->usage =
02902          "Usage: rtcp set debug {on|off|ip host[:port]}\n"
02903          "       Enable/Disable dumping of all RTCP packets. If 'ip' is\n"
02904          "       specified, limit the dumped packets to those to and from\n"
02905          "       the specified 'host' with optional port.\n";
02906       return NULL;
02907    case CLI_GENERATE:
02908       return NULL;
02909    }
02910 
02911    if (a->argc == e->args) { /* set on or off */
02912       if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
02913          rtcpdebug = 1;
02914          memset(&rtcpdebugaddr, 0, sizeof(rtcpdebugaddr));
02915          ast_cli(a->fd, "RTCP Debugging Enabled\n");
02916          return CLI_SUCCESS;
02917       } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
02918          rtcpdebug = 0;
02919          ast_cli(a->fd, "RTCP Debugging Disabled\n");
02920          return CLI_SUCCESS;
02921       }
02922    } else if (a->argc == e->args +1) { /* ip */
02923       return rtcp_do_debug_ip(a);
02924    }
02925 
02926    return CLI_SHOWUSAGE;   /* default, failure */
02927 }
02928 
02929 static char *handle_cli_rtcp_set_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
02930 {
02931    switch (cmd) {
02932    case CLI_INIT:
02933       e->command = "rtcp set stats {on|off}";
02934       e->usage =
02935          "Usage: rtcp set stats {on|off}\n"
02936          "       Enable/Disable dumping of RTCP stats.\n";
02937       return NULL;
02938    case CLI_GENERATE:
02939       return NULL;
02940    }
02941 
02942    if (a->argc != e->args)
02943       return CLI_SHOWUSAGE;
02944 
02945    if (!strncasecmp(a->argv[e->args-1], "on", 2))
02946       rtcpstats = 1;
02947    else if (!strncasecmp(a->argv[e->args-1], "off", 3))
02948       rtcpstats = 0;
02949    else
02950       return CLI_SHOWUSAGE;
02951 
02952    ast_cli(a->fd, "RTCP Stats %s\n", rtcpstats ? "Enabled" : "Disabled");
02953    return CLI_SUCCESS;
02954 }
02955 
02956 static struct ast_cli_entry cli_rtp[] = {
02957    AST_CLI_DEFINE(handle_cli_rtp_set_debug,  "Enable/Disable RTP debugging"),
02958    AST_CLI_DEFINE(handle_cli_rtcp_set_debug, "Enable/Disable RTCP debugging"),
02959    AST_CLI_DEFINE(handle_cli_rtcp_set_stats, "Enable/Disable RTCP stats"),
02960 };
02961 
02962 static int rtp_reload(int reload)
02963 {
02964    struct ast_config *cfg;
02965    const char *s;
02966    struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
02967 
02968    cfg = ast_config_load2("rtp.conf", "rtp", config_flags);
02969    if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID) {
02970       return 0;
02971    }
02972 
02973    rtpstart = DEFAULT_RTP_START;
02974    rtpend = DEFAULT_RTP_END;
02975    dtmftimeout = DEFAULT_DTMF_TIMEOUT;
02976    strictrtp = STRICT_RTP_OPEN;
02977    learning_min_sequential = DEFAULT_LEARNING_MIN_SEQUENTIAL;
02978    if (cfg) {
02979       if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
02980          rtpstart = atoi(s);
02981          if (rtpstart < MINIMUM_RTP_PORT)
02982             rtpstart = MINIMUM_RTP_PORT;
02983          if (rtpstart > MAXIMUM_RTP_PORT)
02984             rtpstart = MAXIMUM_RTP_PORT;
02985       }
02986       if ((s = ast_variable_retrieve(cfg, "general", "rtpend"))) {
02987          rtpend = atoi(s);
02988          if (rtpend < MINIMUM_RTP_PORT)
02989             rtpend = MINIMUM_RTP_PORT;
02990          if (rtpend > MAXIMUM_RTP_PORT)
02991             rtpend = MAXIMUM_RTP_PORT;
02992       }
02993       if ((s = ast_variable_retrieve(cfg, "general", "rtcpinterval"))) {
02994          rtcpinterval = atoi(s);
02995          if (rtcpinterval == 0)
02996             rtcpinterval = 0; /* Just so we're clear... it's zero */
02997          if (rtcpinterval < RTCP_MIN_INTERVALMS)
02998             rtcpinterval = RTCP_MIN_INTERVALMS; /* This catches negative numbers too */
02999          if (rtcpinterval > RTCP_MAX_INTERVALMS)
03000             rtcpinterval = RTCP_MAX_INTERVALMS;
03001       }
03002       if ((s = ast_variable_retrieve(cfg, "general", "rtpchecksums"))) {
03003 #ifdef SO_NO_CHECK
03004          nochecksums = ast_false(s) ? 1 : 0;
03005 #else
03006          if (ast_false(s))
03007             ast_log(LOG_WARNING, "Disabling RTP checksums is not supported on this operating system!\n");
03008 #endif
03009       }
03010       if ((s = ast_variable_retrieve(cfg, "general", "dtmftimeout"))) {
03011          dtmftimeout = atoi(s);
03012          if ((dtmftimeout < 0) || (dtmftimeout > 64000)) {
03013             ast_log(LOG_WARNING, "DTMF timeout of '%d' outside range, using default of '%d' instead\n",
03014                dtmftimeout, DEFAULT_DTMF_TIMEOUT);
03015             dtmftimeout = DEFAULT_DTMF_TIMEOUT;
03016          };
03017       }
03018       if ((s = ast_variable_retrieve(cfg, "general", "strictrtp"))) {
03019          strictrtp = ast_true(s);
03020       }
03021       if ((s = ast_variable_retrieve(cfg, "general", "probation"))) {
03022          if ((sscanf(s, "%d", &learning_min_sequential) <= 0) || learning_min_sequential <= 0) {
03023             ast_log(LOG_WARNING, "Value for 'probation' could not be read, using default of '%d' instead\n",
03024                DEFAULT_LEARNING_MIN_SEQUENTIAL);
03025          }
03026       }
03027       ast_config_destroy(cfg);
03028    }
03029    if (rtpstart >= rtpend) {
03030       ast_log(LOG_WARNING, "Unreasonable values for RTP start/end port in rtp.conf\n");
03031       rtpstart = DEFAULT_RTP_START;
03032       rtpend = DEFAULT_RTP_END;
03033    }
03034    ast_verb(2, "RTP Allocating from port range %d -> %d\n", rtpstart, rtpend);
03035    return 0;
03036 }
03037 
03038 static int reload_module(void)
03039 {
03040    rtp_reload(1);
03041    return 0;
03042 }
03043 
03044 static int load_module(void)
03045 {
03046    if (ast_rtp_engine_register(&asterisk_rtp_engine)) {
03047       return AST_MODULE_LOAD_DECLINE;
03048    }
03049 
03050    if (ast_cli_register_multiple(cli_rtp, ARRAY_LEN(cli_rtp))) {
03051       ast_rtp_engine_unregister(&asterisk_rtp_engine);
03052       return AST_MODULE_LOAD_DECLINE;
03053    }
03054 
03055    rtp_reload(0);
03056 
03057    return AST_MODULE_LOAD_SUCCESS;
03058 }
03059 
03060 static int unload_module(void)
03061 {
03062    ast_rtp_engine_unregister(&asterisk_rtp_engine);
03063    ast_cli_unregister_multiple(cli_rtp, ARRAY_LEN(cli_rtp));
03064 
03065    return 0;
03066 }
03067 
03068 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Asterisk RTP Stack",
03069       .load = load_module,
03070       .unload = unload_module,
03071       .reload = reload_module,
03072       .load_pri = AST_MODPRI_CHANNEL_DEPEND,
03073       );