2 * Asterisk -- An open source telephony toolkit.
4 * Copyright (C) 1999 - 2008, Digium, Inc.
6 * Mark Spencer <markster@digium.com>
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
22 * \brief Supports RTP and RTCP with Symmetric RTP support for NAT traversal.
24 * \author Mark Spencer <markster@digium.com>
26 * \note RTP is defined in RFC 3550.
31 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
38 #include "asterisk/stun.h"
39 #include "asterisk/pbx.h"
40 #include "asterisk/frame.h"
41 #include "asterisk/channel.h"
42 #include "asterisk/acl.h"
43 #include "asterisk/config.h"
44 #include "asterisk/lock.h"
45 #include "asterisk/utils.h"
46 #include "asterisk/netsock.h"
47 #include "asterisk/cli.h"
48 #include "asterisk/manager.h"
49 #include "asterisk/unaligned.h"
50 #include "asterisk/module.h"
51 #include "asterisk/rtp_engine.h"
53 #define MAX_TIMESTAMP_SKEW 640
55 #define RTP_SEQ_MOD (1<<16) /*!< A sequence number can't be more than 16 bits */
56 #define RTCP_DEFAULT_INTERVALMS 5000 /*!< Default milli-seconds between RTCP reports we send */
57 #define RTCP_MIN_INTERVALMS 500 /*!< Min milli-seconds between RTCP reports we send */
58 #define RTCP_MAX_INTERVALMS 60000 /*!< Max milli-seconds between RTCP reports we send */
60 #define DEFAULT_RTP_START 5000 /*!< Default port number to start allocating RTP ports from */
61 #define DEFAULT_RTP_END 31000 /*!< Default maximum port number to end allocating RTP ports at */
63 #define MINIMUM_RTP_PORT 1024 /*!< Minimum port number to accept */
64 #define MAXIMUM_RTP_PORT 65535 /*!< Maximum port number to accept */
66 #define RTCP_PT_FUR 192
67 #define RTCP_PT_SR 200
68 #define RTCP_PT_RR 201
69 #define RTCP_PT_SDES 202
70 #define RTCP_PT_BYE 203
71 #define RTCP_PT_APP 204
75 #define DEFAULT_DTMF_TIMEOUT (150 * (8000 / 1000)) /*!< samples */
77 #define ZFONE_PROFILE_ID 0x505a
79 static int dtmftimeout = DEFAULT_DTMF_TIMEOUT;
81 static int rtpstart = DEFAULT_RTP_START; /*!< First port for RTP sessions (set in rtp.conf) */
82 static int rtpend = DEFAULT_RTP_END; /*!< Last port for RTP sessions (set in rtp.conf) */
83 static int rtpdebug; /*!< Are we debugging? */
84 static int rtcpdebug; /*!< Are we debugging RTCP? */
85 static int rtcpstats; /*!< Are we debugging RTCP? */
86 static int rtcpinterval = RTCP_DEFAULT_INTERVALMS; /*!< Time between rtcp reports in millisecs */
87 static struct sockaddr_in rtpdebugaddr; /*!< Debug packets to/from this host */
88 static struct sockaddr_in rtcpdebugaddr; /*!< Debug RTCP packets to/from this host */
90 static int nochecksums;
94 enum strict_rtp_state {
95 STRICT_RTP_OPEN = 0, /*! No RTP packets should be dropped, all sources accepted */
96 STRICT_RTP_LEARN, /*! Accept next packet as source */
97 STRICT_RTP_CLOSED, /*! Drop all RTP packets not coming from source that was learned */
100 #define FLAG_3389_WARNING (1 << 0)
101 #define FLAG_NAT_ACTIVE (3 << 1)
102 #define FLAG_NAT_INACTIVE (0 << 1)
103 #define FLAG_NAT_INACTIVE_NOWARN (1 << 1)
104 #define FLAG_NEED_MARKER_BIT (1 << 3)
105 #define FLAG_DTMF_COMPENSATE (1 << 4)
107 /*! \brief RTP session description */
111 unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET];
112 unsigned int ssrc; /*!< Synchronization source, RFC 3550, page 10. */
113 unsigned int themssrc; /*!< Their SSRC */
116 unsigned int lastrxts;
117 unsigned int lastividtimestamp;
118 unsigned int lastovidtimestamp;
119 unsigned int lastitexttimestamp;
120 unsigned int lastotexttimestamp;
121 unsigned int lasteventseqn;
122 int lastrxseqno; /*!< Last received sequence number */
123 unsigned short seedrxseqno; /*!< What sequence number did they start with?*/
124 unsigned int seedrxts; /*!< What RTP timestamp did they start with? */
125 unsigned int rxcount; /*!< How many packets have we received? */
126 unsigned int rxoctetcount; /*!< How many octets have we received? should be rxcount *160*/
127 unsigned int txcount; /*!< How many packets have we sent? */
128 unsigned int txoctetcount; /*!< How many octets have we sent? (txcount*160)*/
129 unsigned int cycles; /*!< Shifted count of sequence number cycles */
130 double rxjitter; /*!< Interarrival jitter at the moment */
131 double rxtransit; /*!< Relative transit time for previous packet */
135 int rtptimeout; /*!< RTP timeout time (negative or zero means disabled, negative value means temporarily disabled) */
136 int rtpholdtimeout; /*!< RTP timeout when on hold (negative or zero means disabled, negative value means temporarily disabled). */
137 int rtpkeepalive; /*!< Send RTP comfort noice packets for keepalive */
139 /* DTMF Reception Variables */
141 unsigned int lastevent;
142 unsigned int dtmf_duration; /*!< Total duration in samples since the digit start event */
143 unsigned int dtmf_timeout; /*!< When this timestamp is reached we consider END frame lost and forcibly abort digit */
144 unsigned int dtmfsamples;
145 /* DTMF Transmission Variables */
146 unsigned int lastdigitts;
147 char sending_digit; /*!< boolean - are we sending digits */
148 char send_digit; /*!< digit we are sending */
152 struct timeval rxcore;
153 struct timeval txcore;
154 double drxcore; /*!< The double representation of the first received packet */
155 struct timeval lastrx; /*!< timeval when we last received a packet */
156 struct timeval dtmfmute;
157 struct ast_smoother *smoother;
159 unsigned short seqno; /*!< Sequence number, RFC 3550, page 13. */
160 unsigned short rxseqno;
161 struct sched_context *sched;
162 struct io_context *io;
164 struct ast_rtcp *rtcp;
165 struct ast_rtp *bridged; /*!< Who we are Packet bridged to */
167 enum strict_rtp_state strict_rtp_state; /*!< Current state that strict RTP protection is in */
168 struct sockaddr_in strict_rtp_address; /*!< Remote address information for strict RTP purposes */
169 struct sockaddr_in alt_rtp_address; /*!<Alternate remote address information */
175 * \brief Structure defining an RTCP session.
177 * The concept "RTCP session" is not defined in RFC 3550, but since
178 * this structure is analogous to ast_rtp, which tracks a RTP session,
179 * it is logical to think of this as a RTCP session.
181 * RTCP packet is defined on page 9 of RFC 3550.
186 int s; /*!< Socket */
187 struct sockaddr_in us; /*!< Socket representation of the local endpoint. */
188 struct sockaddr_in them; /*!< Socket representation of the remote endpoint. */
189 unsigned int soc; /*!< What they told us */
190 unsigned int spc; /*!< What they told us */
191 unsigned int themrxlsr; /*!< The middle 32 bits of the NTP timestamp in the last received SR*/
192 struct timeval rxlsr; /*!< Time when we got their last SR */
193 struct timeval txlsr; /*!< Time when we sent or last SR*/
194 unsigned int expected_prior; /*!< no. packets in previous interval */
195 unsigned int received_prior; /*!< no. packets received in previous interval */
196 int schedid; /*!< Schedid returned from ast_sched_add() to schedule RTCP-transmissions*/
197 unsigned int rr_count; /*!< number of RRs we've sent, not including report blocks in SR's */
198 unsigned int sr_count; /*!< number of SRs we've sent */
199 unsigned int lastsrtxcount; /*!< Transmit packet count when last SR sent */
200 double accumulated_transit; /*!< accumulated a-dlsr-lsr */
201 double rtt; /*!< Last reported rtt */
202 unsigned int reported_jitter; /*!< The contents of their last jitter entry in the RR */
203 unsigned int reported_lost; /*!< Reported lost packets in their RR */
205 double reported_maxjitter;
206 double reported_minjitter;
207 double reported_normdev_jitter;
208 double reported_stdev_jitter;
209 unsigned int reported_jitter_count;
211 double reported_maxlost;
212 double reported_minlost;
213 double reported_normdev_lost;
214 double reported_stdev_lost;
219 double normdev_rxlost;
221 unsigned int rxlost_count;
225 double normdev_rxjitter;
226 double stdev_rxjitter;
227 unsigned int rxjitter_count;
232 unsigned int rtt_count;
236 struct ast_frame t140; /*!< Primary data */
237 struct ast_frame t140red; /*!< Redundant t140*/
238 unsigned char pt[AST_RED_MAX_GENERATION]; /*!< Payload types for redundancy data */
239 unsigned char ts[AST_RED_MAX_GENERATION]; /*!< Time stamps */
240 unsigned char len[AST_RED_MAX_GENERATION]; /*!< length of each generation */
241 int num_gen; /*!< Number of generations */
242 int schedid; /*!< Timer id */
243 int ti; /*!< How long to buffer data before send */
244 unsigned char t140red_data[64000];
245 unsigned char buf_data[64000]; /*!< buffered primary data */
250 /* Forward Declarations */
251 static int ast_rtp_new(struct ast_rtp_instance *instance, struct sched_context *sched, struct sockaddr_in *sin, void *data);
252 static int ast_rtp_destroy(struct ast_rtp_instance *instance);
253 static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit);
254 static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit);
255 static void ast_rtp_new_source(struct ast_rtp_instance *instance);
256 static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame);
257 static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtcp);
258 static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value);
259 static int ast_rtp_fd(struct ast_rtp_instance *instance, int rtcp);
260 static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct sockaddr_in *sin);
261 static void ast_rtp_alt_remote_address_set(struct ast_rtp_instance *instance, struct sockaddr_in *sin);
262 static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations);
263 static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame);
264 static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_rtp_instance *instance1);
265 static int ast_rtp_get_stat(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat);
266 static int ast_rtp_dtmf_compatible(struct ast_channel *chan0, struct ast_rtp_instance *instance0, struct ast_channel *chan1, struct ast_rtp_instance *instance1);
267 static void ast_rtp_stun_request(struct ast_rtp_instance *instance, struct sockaddr_in *suggestion, const char *username);
268 static void ast_rtp_stop(struct ast_rtp_instance *instance);
270 /* RTP Engine Declaration */
271 static struct ast_rtp_engine asterisk_rtp_engine = {
274 .destroy = ast_rtp_destroy,
275 .dtmf_begin = ast_rtp_dtmf_begin,
276 .dtmf_end = ast_rtp_dtmf_end,
277 .new_source = ast_rtp_new_source,
278 .write = ast_rtp_write,
279 .read = ast_rtp_read,
280 .prop_set = ast_rtp_prop_set,
282 .remote_address_set = ast_rtp_remote_address_set,
283 .alt_remote_address_set = ast_rtp_alt_remote_address_set,
284 .red_init = rtp_red_init,
285 .red_buffer = rtp_red_buffer,
286 .local_bridge = ast_rtp_local_bridge,
287 .get_stat = ast_rtp_get_stat,
288 .dtmf_compatible = ast_rtp_dtmf_compatible,
289 .stun_request = ast_rtp_stun_request,
290 .stop = ast_rtp_stop,
293 static inline int rtp_debug_test_addr(struct sockaddr_in *addr)
299 if (rtpdebugaddr.sin_addr.s_addr) {
300 if (((ntohs(rtpdebugaddr.sin_port) != 0)
301 && (rtpdebugaddr.sin_port != addr->sin_port))
302 || (rtpdebugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
309 static inline int rtcp_debug_test_addr(struct sockaddr_in *addr)
315 if (rtcpdebugaddr.sin_addr.s_addr) {
316 if (((ntohs(rtcpdebugaddr.sin_port) != 0)
317 && (rtcpdebugaddr.sin_port != addr->sin_port))
318 || (rtcpdebugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
325 static int rtp_get_rate(int subclass)
327 return (subclass == AST_FORMAT_G722) ? 8000 : ast_format_rate(subclass);
330 static unsigned int ast_rtcp_calc_interval(struct ast_rtp *rtp)
332 unsigned int interval;
333 /*! \todo XXX Do a more reasonable calculation on this one
334 * Look in RFC 3550 Section A.7 for an example*/
335 interval = rtcpinterval;
339 /*! \brief Calculate normal deviation */
340 static double normdev_compute(double normdev, double sample, unsigned int sample_count)
342 normdev = normdev * sample_count + sample;
345 return normdev / sample_count;
348 static double stddev_compute(double stddev, double sample, double normdev, double normdev_curent, unsigned int sample_count)
351 for the formula check http://www.cs.umd.edu/~austinjp/constSD.pdf
352 return sqrt( (sample_count*pow(stddev,2) + sample_count*pow((sample-normdev)/(sample_count+1),2) + pow(sample-normdev_curent,2)) / (sample_count+1));
353 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
356 #define SQUARE(x) ((x) * (x))
358 stddev = sample_count * stddev;
362 ( sample_count * SQUARE( (sample - normdev) / sample_count ) ) +
363 ( SQUARE(sample - normdev_curent) / sample_count );
368 static int create_new_socket(const char *type)
370 int sock = socket(AF_INET, SOCK_DGRAM, 0);
376 ast_log(LOG_WARNING, "Unable to allocate %s socket: %s\n", type, strerror(errno));
378 long flags = fcntl(sock, F_GETFL);
379 fcntl(sock, F_SETFL, flags | O_NONBLOCK);
382 setsockopt(sock, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums));
390 static int ast_rtp_new(struct ast_rtp_instance *instance, struct sched_context *sched, struct sockaddr_in *sin, void *data)
392 struct ast_rtp *rtp = NULL;
395 /* Create a new RTP structure to hold all of our data */
396 if (!(rtp = ast_calloc(1, sizeof(*rtp)))) {
400 /* Set default parameters on the newly created RTP structure */
401 rtp->ssrc = ast_random();
402 rtp->seqno = ast_random() & 0xffff;
403 rtp->strict_rtp_state = (strictrtp ? STRICT_RTP_LEARN : STRICT_RTP_OPEN);
405 /* Create a new socket for us to listen on and use */
406 if ((rtp->s = create_new_socket("RTP")) < 0) {
407 ast_debug(1, "Failed to create a new socket for RTP instance '%p'\n", instance);
412 /* Now actually find a free RTP port to use */
413 x = (rtpend == rtpstart) ? rtpstart : (ast_random() % (rtpend - rtpstart)) + rtpstart;
418 sin->sin_port = htons(x);
419 /* Try to bind, this will tell us whether the port is available or not */
420 if (!bind(rtp->s, (struct sockaddr *)sin, sizeof(*sin))) {
421 ast_debug(1, "Allocated port %d for RTP instance '%p'\n", x, instance);
422 ast_rtp_instance_set_local_address(instance, sin);
428 x = (rtpstart + 1) & ~1;
431 /* See if we ran out of ports or if the bind actually failed because of something other than the address being in use */
432 if (x == startplace || errno != EADDRINUSE) {
433 ast_log(LOG_ERROR, "Oh dear... we couldn't allocate a port for RTP instance '%p'\n", instance);
438 /* Record any information we may need */
441 /* Associate the RTP structure with the RTP instance and be done */
442 ast_rtp_instance_set_data(instance, rtp);
447 static int ast_rtp_destroy(struct ast_rtp_instance *instance)
449 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
451 /* Destroy the smoother that was smoothing out audio if present */
453 ast_smoother_free(rtp->smoother);
456 /* Close our own socket so we no longer get packets */
461 /* Destroy RTCP if it was being used */
463 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
468 /* Destroy RED if it was being used */
470 AST_SCHED_DEL(rtp->sched, rtp->red->schedid);
474 /* Finally destroy ourselves */
480 static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit)
482 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
483 struct sockaddr_in remote_address = { 0, };
484 int hdrlen = 12, res = 0, i = 0, payload = 101;
486 unsigned int *rtpheader = (unsigned int*)data;
488 ast_rtp_instance_get_remote_address(instance, &remote_address);
490 /* If we have no remote address information bail out now */
491 if (!remote_address.sin_addr.s_addr || !remote_address.sin_port) {
495 /* Convert given digit into what we want to transmit */
496 if ((digit <= '9') && (digit >= '0')) {
498 } else if (digit == '*') {
500 } else if (digit == '#') {
502 } else if ((digit >= 'A') && (digit <= 'D')) {
503 digit = digit - 'A' + 12;
504 } else if ((digit >= 'a') && (digit <= 'd')) {
505 digit = digit - 'a' + 12;
507 ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
511 /* Grab the payload that they expect the RFC2833 packet to be received in */
512 payload = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance), 0, AST_RTP_DTMF);
514 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
515 rtp->send_duration = 160;
516 rtp->lastdigitts = rtp->lastts + rtp->send_duration;
518 /* Create the actual packet that we will be sending */
519 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno));
520 rtpheader[1] = htonl(rtp->lastdigitts);
521 rtpheader[2] = htonl(rtp->ssrc);
523 /* Actually send the packet */
524 for (i = 0; i < 2; i++) {
525 rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration));
526 res = sendto(rtp->s, (void *) rtpheader, hdrlen + 4, 0, (struct sockaddr *) &remote_address, sizeof(remote_address));
528 ast_log(LOG_ERROR, "RTP Transmission error to %s:%u: %s\n",
529 ast_inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port), strerror(errno));
531 if (rtp_debug_test_addr(&remote_address)) {
532 ast_verbose("Sent RTP DTMF packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
533 ast_inet_ntoa(remote_address.sin_addr),
534 ntohs(remote_address.sin_port), payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
537 rtp->send_duration += 160;
538 rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno));
541 /* Record that we are in the process of sending a digit and information needed to continue doing so */
542 rtp->sending_digit = 1;
543 rtp->send_digit = digit;
544 rtp->send_payload = payload;
549 static int ast_rtp_dtmf_continuation(struct ast_rtp_instance *instance)
551 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
552 struct sockaddr_in remote_address = { 0, };
553 int hdrlen = 12, res = 0;
555 unsigned int *rtpheader = (unsigned int*)data;
557 ast_rtp_instance_get_remote_address(instance, &remote_address);
559 /* Make sure we know where the other side is so we can send them the packet */
560 if (!remote_address.sin_addr.s_addr || !remote_address.sin_port) {
564 /* Actually create the packet we will be sending */
565 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (rtp->send_payload << 16) | (rtp->seqno));
566 rtpheader[1] = htonl(rtp->lastdigitts);
567 rtpheader[2] = htonl(rtp->ssrc);
568 rtpheader[3] = htonl((rtp->send_digit << 24) | (0xa << 16) | (rtp->send_duration));
569 rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno));
571 /* Boom, send it on out */
572 res = sendto(rtp->s, (void *) rtpheader, hdrlen + 4, 0, (struct sockaddr *) &remote_address, sizeof(remote_address));
574 ast_log(LOG_ERROR, "RTP Transmission error to %s:%d: %s\n",
575 ast_inet_ntoa(remote_address.sin_addr),
576 ntohs(remote_address.sin_port), strerror(errno));
579 if (rtp_debug_test_addr(&remote_address)) {
580 ast_verbose("Sent RTP DTMF packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
581 ast_inet_ntoa(remote_address.sin_addr),
582 ntohs(remote_address.sin_port), rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
585 /* And now we increment some values for the next time we swing by */
587 rtp->send_duration += 160;
592 static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit)
594 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
595 struct sockaddr_in remote_address = { 0, };
596 int hdrlen = 12, res = 0, i = 0;
598 unsigned int *rtpheader = (unsigned int*)data;
600 ast_rtp_instance_get_remote_address(instance, &remote_address);
602 /* Make sure we know where the remote side is so we can send them the packet we construct */
603 if (!remote_address.sin_addr.s_addr || !remote_address.sin_port) {
607 /* Convert the given digit to the one we are going to send */
608 if ((digit <= '9') && (digit >= '0')) {
610 } else if (digit == '*') {
612 } else if (digit == '#') {
614 } else if ((digit >= 'A') && (digit <= 'D')) {
615 digit = digit - 'A' + 12;
616 } else if ((digit >= 'a') && (digit <= 'd')) {
617 digit = digit - 'a' + 12;
619 ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
623 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
625 /* Construct the packet we are going to send */
626 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (rtp->send_payload << 16) | (rtp->seqno));
627 rtpheader[1] = htonl(rtp->lastdigitts);
628 rtpheader[2] = htonl(rtp->ssrc);
629 rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration));
630 rtpheader[3] |= htonl((1 << 23));
631 rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno));
633 /* Send it 3 times, that's the magical number */
634 for (i = 0; i < 3; i++) {
635 res = sendto(rtp->s, (void *) rtpheader, hdrlen + 4, 0, (struct sockaddr *) &remote_address, sizeof(remote_address));
637 ast_log(LOG_ERROR, "RTP Transmission error to %s:%d: %s\n",
638 ast_inet_ntoa(remote_address.sin_addr),
639 ntohs(remote_address.sin_port), strerror(errno));
641 if (rtp_debug_test_addr(&remote_address)) {
642 ast_verbose("Sent RTP DTMF packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
643 ast_inet_ntoa(remote_address.sin_addr),
644 ntohs(remote_address.sin_port), rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
648 /* Oh and we can't forget to turn off the stuff that says we are sending DTMF */
649 rtp->lastts += rtp->send_duration;
650 rtp->sending_digit = 0;
656 static void ast_rtp_new_source(struct ast_rtp_instance *instance)
658 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
660 /* We simply set this bit so that the next packet sent will have the marker bit turned on */
661 ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
666 static unsigned int calc_txstamp(struct ast_rtp *rtp, struct timeval *delivery)
671 if (ast_tvzero(rtp->txcore)) {
672 rtp->txcore = ast_tvnow();
673 rtp->txcore.tv_usec -= rtp->txcore.tv_usec % 20000;
676 t = (delivery && !ast_tvzero(*delivery)) ? *delivery : ast_tvnow();
677 if ((ms = ast_tvdiff_ms(t, rtp->txcore)) < 0) {
682 return (unsigned int) ms;
685 static void timeval2ntp(struct timeval tv, unsigned int *msw, unsigned int *lsw)
687 unsigned int sec, usec, frac;
688 sec = tv.tv_sec + 2208988800u; /* Sec between 1900 and 1970 */
690 frac = (usec << 12) + (usec << 8) - ((usec * 3650) >> 6);
695 /*! \brief Send RTCP recipient's report */
696 static int ast_rtcp_write_rr(const void *data)
698 struct ast_rtp *rtp = (struct ast_rtp *)data;
702 unsigned int extended;
703 unsigned int expected;
704 unsigned int expected_interval;
705 unsigned int received_interval;
708 unsigned int *rtcpheader;
713 double rxlost_current;
715 if (!rtp || !rtp->rtcp || (&rtp->rtcp->them.sin_addr == 0))
718 if (!rtp->rtcp->them.sin_addr.s_addr) {
719 ast_log(LOG_ERROR, "RTCP RR transmission error, rtcp halted\n");
720 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
724 extended = rtp->cycles + rtp->lastrxseqno;
725 expected = extended - rtp->seedrxseqno + 1;
726 lost = expected - rtp->rxcount;
727 expected_interval = expected - rtp->rtcp->expected_prior;
728 rtp->rtcp->expected_prior = expected;
729 received_interval = rtp->rxcount - rtp->rtcp->received_prior;
730 rtp->rtcp->received_prior = rtp->rxcount;
731 lost_interval = expected_interval - received_interval;
733 if (lost_interval <= 0)
734 rtp->rtcp->rxlost = 0;
735 else rtp->rtcp->rxlost = rtp->rtcp->rxlost;
736 if (rtp->rtcp->rxlost_count == 0)
737 rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
738 if (lost_interval < rtp->rtcp->minrxlost)
739 rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
740 if (lost_interval > rtp->rtcp->maxrxlost)
741 rtp->rtcp->maxrxlost = rtp->rtcp->rxlost;
743 rxlost_current = normdev_compute(rtp->rtcp->normdev_rxlost, rtp->rtcp->rxlost, rtp->rtcp->rxlost_count);
744 rtp->rtcp->stdev_rxlost = stddev_compute(rtp->rtcp->stdev_rxlost, rtp->rtcp->rxlost, rtp->rtcp->normdev_rxlost, rxlost_current, rtp->rtcp->rxlost_count);
745 rtp->rtcp->normdev_rxlost = rxlost_current;
746 rtp->rtcp->rxlost_count++;
748 if (expected_interval == 0 || lost_interval <= 0)
751 fraction = (lost_interval << 8) / expected_interval;
752 gettimeofday(&now, NULL);
753 timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
754 rtcpheader = (unsigned int *)bdata;
755 rtcpheader[0] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_RR << 16) | ((len/4)-1));
756 rtcpheader[1] = htonl(rtp->ssrc);
757 rtcpheader[2] = htonl(rtp->themssrc);
758 rtcpheader[3] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
759 rtcpheader[4] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
760 rtcpheader[5] = htonl((unsigned int)(rtp->rxjitter * 65536.));
761 rtcpheader[6] = htonl(rtp->rtcp->themrxlsr);
762 rtcpheader[7] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
764 /*! \note Insert SDES here. Probably should make SDES text equal to mimetypes[code].type (not subtype 'cos
765 it can change mid call, and SDES can't) */
766 rtcpheader[len/4] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | 2);
767 rtcpheader[(len/4)+1] = htonl(rtp->ssrc); /* Our SSRC */
768 rtcpheader[(len/4)+2] = htonl(0x01 << 24); /* Empty for the moment */
771 res = sendto(rtp->rtcp->s, (unsigned int *)rtcpheader, len, 0, (struct sockaddr *)&rtp->rtcp->them, sizeof(rtp->rtcp->them));
774 ast_log(LOG_ERROR, "RTCP RR transmission error, rtcp halted: %s\n",strerror(errno));
775 /* Remove the scheduler */
776 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
780 rtp->rtcp->rr_count++;
781 if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
782 ast_verbose("\n* Sending RTCP RR to %s:%d\n"
783 " Our SSRC: %u\nTheir SSRC: %u\niFraction lost: %d\nCumulative loss: %u\n"
785 " Their last SR: %u\n"
786 " DLSR: %4.4f (sec)\n\n",
787 ast_inet_ntoa(rtp->rtcp->them.sin_addr),
788 ntohs(rtp->rtcp->them.sin_port),
789 rtp->ssrc, rtp->themssrc, fraction, lost,
791 rtp->rtcp->themrxlsr,
792 (double)(ntohl(rtcpheader[7])/65536.0));
798 /*! \brief Send RTCP sender's report */
799 static int ast_rtcp_write_sr(const void *data)
801 struct ast_rtp *rtp = (struct ast_rtp *)data;
805 unsigned int now_lsw;
806 unsigned int now_msw;
807 unsigned int *rtcpheader;
809 unsigned int extended;
810 unsigned int expected;
811 unsigned int expected_interval;
812 unsigned int received_interval;
818 /* Commented condition is always not NULL if rtp->rtcp is not NULL */
819 if (!rtp || !rtp->rtcp/* || (&rtp->rtcp->them.sin_addr == 0)*/)
822 if (!rtp->rtcp->them.sin_addr.s_addr) { /* This'll stop rtcp for this rtp session */
823 ast_verbose("RTCP SR transmission error, rtcp halted\n");
824 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
828 gettimeofday(&now, NULL);
829 timeval2ntp(now, &now_msw, &now_lsw); /* fill thses ones in from utils.c*/
830 rtcpheader = (unsigned int *)bdata;
831 rtcpheader[1] = htonl(rtp->ssrc); /* Our SSRC */
832 rtcpheader[2] = htonl(now_msw); /* now, MSW. gettimeofday() + SEC_BETWEEN_1900_AND_1970*/
833 rtcpheader[3] = htonl(now_lsw); /* now, LSW */
834 rtcpheader[4] = htonl(rtp->lastts); /* FIXME shouldn't be that, it should be now */
835 rtcpheader[5] = htonl(rtp->txcount); /* No. packets sent */
836 rtcpheader[6] = htonl(rtp->txoctetcount); /* No. bytes sent */
839 extended = rtp->cycles + rtp->lastrxseqno;
840 expected = extended - rtp->seedrxseqno + 1;
841 if (rtp->rxcount > expected)
842 expected += rtp->rxcount - expected;
843 lost = expected - rtp->rxcount;
844 expected_interval = expected - rtp->rtcp->expected_prior;
845 rtp->rtcp->expected_prior = expected;
846 received_interval = rtp->rxcount - rtp->rtcp->received_prior;
847 rtp->rtcp->received_prior = rtp->rxcount;
848 lost_interval = expected_interval - received_interval;
849 if (expected_interval == 0 || lost_interval <= 0)
852 fraction = (lost_interval << 8) / expected_interval;
853 timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
854 rtcpheader[7] = htonl(rtp->themssrc);
855 rtcpheader[8] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
856 rtcpheader[9] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
857 rtcpheader[10] = htonl((unsigned int)(rtp->rxjitter * 65536.));
858 rtcpheader[11] = htonl(rtp->rtcp->themrxlsr);
859 rtcpheader[12] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
862 rtcpheader[0] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SR << 16) | ((len/4)-1));
864 /* Insert SDES here. Probably should make SDES text equal to mimetypes[code].type (not subtype 'cos */
865 /* it can change mid call, and SDES can't) */
866 rtcpheader[len/4] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | 2);
867 rtcpheader[(len/4)+1] = htonl(rtp->ssrc); /* Our SSRC */
868 rtcpheader[(len/4)+2] = htonl(0x01 << 24); /* Empty for the moment */
871 res = sendto(rtp->rtcp->s, (unsigned int *)rtcpheader, len, 0, (struct sockaddr *)&rtp->rtcp->them, sizeof(rtp->rtcp->them));
873 ast_log(LOG_ERROR, "RTCP SR transmission error to %s:%d, rtcp halted %s\n",ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port), strerror(errno));
874 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
878 /* FIXME Don't need to get a new one */
879 gettimeofday(&rtp->rtcp->txlsr, NULL);
880 rtp->rtcp->sr_count++;
882 rtp->rtcp->lastsrtxcount = rtp->txcount;
884 if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
885 ast_verbose("* Sent RTCP SR to %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
886 ast_verbose(" Our SSRC: %u\n", rtp->ssrc);
887 ast_verbose(" Sent(NTP): %u.%010u\n", (unsigned int)now.tv_sec, (unsigned int)now.tv_usec*4096);
888 ast_verbose(" Sent(RTP): %u\n", rtp->lastts);
889 ast_verbose(" Sent packets: %u\n", rtp->txcount);
890 ast_verbose(" Sent octets: %u\n", rtp->txoctetcount);
891 ast_verbose(" Report block:\n");
892 ast_verbose(" Fraction lost: %u\n", fraction);
893 ast_verbose(" Cumulative loss: %u\n", lost);
894 ast_verbose(" IA jitter: %.4f\n", rtp->rxjitter);
895 ast_verbose(" Their last SR: %u\n", rtp->rtcp->themrxlsr);
896 ast_verbose(" DLSR: %4.4f (sec)\n\n", (double)(ntohl(rtcpheader[12])/65536.0));
898 manager_event(EVENT_FLAG_REPORTING, "RTCPSent", "To %s:%d\r\n"
900 "SentNTP: %u.%010u\r\n"
902 "SentPackets: %u\r\n"
905 "FractionLost: %u\r\n"
906 "CumulativeLoss: %u\r\n"
908 "TheirLastSR: %u\r\n"
909 "DLSR: %4.4f (sec)\r\n",
910 ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port),
912 (unsigned int)now.tv_sec, (unsigned int)now.tv_usec*4096,
919 rtp->rtcp->themrxlsr,
920 (double)(ntohl(rtcpheader[12])/65536.0));
924 /*! \brief Write and RTCP packet to the far end
925 * \note Decide if we are going to send an SR (with Reception Block) or RR
926 * RR is sent if we have not sent any rtp packets in the previous interval */
927 static int ast_rtcp_write(const void *data)
929 struct ast_rtp *rtp = (struct ast_rtp *)data;
932 if (!rtp || !rtp->rtcp)
935 if (rtp->txcount > rtp->rtcp->lastsrtxcount)
936 res = ast_rtcp_write_sr(data);
938 res = ast_rtcp_write_rr(data);
943 static int ast_rtp_raw_write(struct ast_rtp_instance *instance, struct ast_frame *frame, int codec)
945 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
947 unsigned int ms = calc_txstamp(rtp, &frame->delivery);
948 struct sockaddr_in remote_address = { 0, };
949 int rate = rtp_get_rate(frame->subclass) / 1000;
951 if (frame->subclass == AST_FORMAT_G722) {
955 if (rtp->sending_digit) {
959 if (frame->frametype == AST_FRAME_VOICE) {
960 pred = rtp->lastts + frame->samples;
962 /* Re-calculate last TS */
963 rtp->lastts = rtp->lastts + ms * rate;
964 if (ast_tvzero(frame->delivery)) {
965 /* If this isn't an absolute delivery time, Check if it is close to our prediction,
966 and if so, go with our prediction */
967 if (abs(rtp->lastts - pred) < MAX_TIMESTAMP_SKEW) {
970 ast_debug(3, "Difference is %d, ms is %d\n", abs(rtp->lastts - pred), ms);
974 } else if (frame->frametype == AST_FRAME_VIDEO) {
975 mark = frame->subclass & 0x1;
976 pred = rtp->lastovidtimestamp + frame->samples;
977 /* Re-calculate last TS */
978 rtp->lastts = rtp->lastts + ms * 90;
979 /* If it's close to our prediction, go for it */
980 if (ast_tvzero(frame->delivery)) {
981 if (abs(rtp->lastts - pred) < 7200) {
983 rtp->lastovidtimestamp += frame->samples;
985 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);
986 rtp->lastovidtimestamp = rtp->lastts;
990 pred = rtp->lastotexttimestamp + frame->samples;
991 /* Re-calculate last TS */
992 rtp->lastts = rtp->lastts + ms;
993 /* If it's close to our prediction, go for it */
994 if (ast_tvzero(frame->delivery)) {
995 if (abs(rtp->lastts - pred) < 7200) {
997 rtp->lastotexttimestamp += frame->samples;
999 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);
1000 rtp->lastotexttimestamp = rtp->lastts;
1005 /* If we have been explicitly told to set the marker bit then do so */
1006 if (ast_test_flag(rtp, FLAG_NEED_MARKER_BIT)) {
1008 ast_clear_flag(rtp, FLAG_NEED_MARKER_BIT);
1011 /* If the timestamp for non-digt packets has moved beyond the timestamp for digits, update the digit timestamp */
1012 if (rtp->lastts > rtp->lastdigitts) {
1013 rtp->lastdigitts = rtp->lastts;
1016 if (ast_test_flag(frame, AST_FRFLAG_HAS_TIMING_INFO)) {
1017 rtp->lastts = frame->ts * rate;
1020 ast_rtp_instance_get_remote_address(instance, &remote_address);
1022 /* If we know the remote address construct a packet and send it out */
1023 if (remote_address.sin_port && remote_address.sin_addr.s_addr) {
1024 int hdrlen = 12, res;
1025 unsigned char *rtpheader = (unsigned char *)(frame->data.ptr - hdrlen);
1027 put_unaligned_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
1028 put_unaligned_uint32(rtpheader + 4, htonl(rtp->lastts));
1029 put_unaligned_uint32(rtpheader + 8, htonl(rtp->ssrc));
1031 if ((res = sendto(rtp->s, (void *)rtpheader, frame->datalen + hdrlen, 0, (struct sockaddr *)&remote_address, sizeof(remote_address))) < 0) {
1032 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))) {
1033 ast_debug(1, "RTP Transmission error of packet %d to %s:%d: %s\n", rtp->seqno, ast_inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port), strerror(errno));
1034 } else if (((ast_test_flag(rtp, FLAG_NAT_ACTIVE) == FLAG_NAT_INACTIVE) || rtpdebug) && !ast_test_flag(rtp, FLAG_NAT_INACTIVE_NOWARN)) {
1035 /* Only give this error message once if we are not RTP debugging */
1036 if (option_debug || rtpdebug)
1037 ast_debug(0, "RTP NAT: Can't write RTP to private address %s:%d, waiting for other end to send audio...\n", ast_inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port));
1038 ast_set_flag(rtp, FLAG_NAT_INACTIVE_NOWARN);
1042 rtp->txoctetcount += (res - hdrlen);
1044 if (rtp->rtcp && rtp->rtcp->schedid < 1) {
1045 ast_debug(1, "Starting RTCP transmission on RTP instance '%p'\n", instance);
1046 rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, rtp);
1050 if (rtp_debug_test_addr(&remote_address)) {
1051 ast_verbose("Sent RTP packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
1052 ast_inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port), codec, rtp->seqno, rtp->lastts, res - hdrlen);
1061 static struct ast_frame *red_t140_to_red(struct rtp_red *red) {
1062 unsigned char *data = red->t140red.data.ptr;
1066 /* replace most aged generation */
1068 for (i = 1; i < red->num_gen+1; i++)
1071 memmove(&data[red->hdrlen], &data[red->hdrlen+red->len[0]], len);
1074 /* Store length of each generation and primary data length*/
1075 for (i = 0; i < red->num_gen; i++)
1076 red->len[i] = red->len[i+1];
1077 red->len[i] = red->t140.datalen;
1079 /* write each generation length in red header */
1081 for (i = 0; i < red->num_gen; i++)
1082 len += data[i*4+3] = red->len[i];
1084 /* add primary data to buffer */
1085 memcpy(&data[len], red->t140.data.ptr, red->t140.datalen);
1086 red->t140red.datalen = len + red->t140.datalen;
1088 /* no primary data and no generations to send */
1089 if (len == red->hdrlen && !red->t140.datalen)
1092 /* reset t.140 buffer */
1093 red->t140.datalen = 0;
1095 return &red->t140red;
1098 static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame)
1100 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1101 struct sockaddr_in remote_address = { 0, };
1102 int codec, subclass;
1104 ast_rtp_instance_get_remote_address(instance, &remote_address);
1106 /* If we don't actually know the remote address don't even bother doing anything */
1107 if (!remote_address.sin_addr.s_addr) {
1108 ast_debug(1, "No remote address on RTP instance '%p' so dropping frame\n", instance);
1112 /* If there is no data length we can't very well send the packet */
1113 if (!frame->datalen) {
1114 ast_debug(1, "Received frame with no data for RTP instance '%p' so dropping frame\n", instance);
1118 /* If the packet is not one our RTP stack supports bail out */
1119 if (frame->frametype != AST_FRAME_VOICE && frame->frametype != AST_FRAME_VIDEO && frame->frametype != AST_FRAME_TEXT) {
1120 ast_log(LOG_WARNING, "RTP can only send voice, video, and text\n");
1126 /* no primary data or generations to send */
1127 if ((frame = red_t140_to_red(rtp->red)) == NULL)
1131 /* Grab the subclass and look up the payload we are going to use */
1132 subclass = frame->subclass;
1133 if (frame->frametype == AST_FRAME_VIDEO) {
1136 if ((codec = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance), 1, subclass)) < 0) {
1137 ast_log(LOG_WARNING, "Don't know how to send format %s packets with RTP\n", ast_getformatname(frame->subclass));
1141 /* Oh dear, if the format changed we will have to set up a new smoother */
1142 if (rtp->lasttxformat != subclass) {
1143 ast_debug(1, "Ooh, format changed from %s to %s\n", ast_getformatname(rtp->lasttxformat), ast_getformatname(subclass));
1144 rtp->lasttxformat = subclass;
1145 if (rtp->smoother) {
1146 ast_smoother_free(rtp->smoother);
1147 rtp->smoother = NULL;
1151 /* If no smoother is present see if we have to set one up */
1152 if (!rtp->smoother) {
1153 struct ast_format_list fmt = ast_codec_pref_getsize(&ast_rtp_instance_get_codecs(instance)->pref, subclass);
1156 case AST_FORMAT_SPEEX:
1157 case AST_FORMAT_G723_1:
1158 case AST_FORMAT_SIREN7:
1159 case AST_FORMAT_SIREN14:
1160 /* these are all frame-based codecs and cannot be safely run through
1165 if (!(rtp->smoother = ast_smoother_new((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms))) {
1166 ast_log(LOG_WARNING, "Unable to create smoother: format %d ms: %d len: %d\n", subclass, fmt.cur_ms, ((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms));
1170 ast_smoother_set_flags(rtp->smoother, fmt.flags);
1172 ast_debug(1, "Created smoother: format: %d ms: %d len: %d\n", subclass, fmt.cur_ms, ((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms));
1177 /* Feed audio frames into the actual function that will create a frame and send it */
1178 if (rtp->smoother) {
1179 struct ast_frame *f;
1181 if (ast_smoother_test_flag(rtp->smoother, AST_SMOOTHER_FLAG_BE)) {
1182 ast_smoother_feed_be(rtp->smoother, frame);
1184 ast_smoother_feed(rtp->smoother, frame);
1187 while ((f = ast_smoother_read(rtp->smoother)) && (f->data.ptr)) {
1188 ast_rtp_raw_write(instance, f, codec);
1192 struct ast_frame *f = NULL;
1194 if (frame->offset < hdrlen) {
1195 f = ast_frdup(frame);
1200 ast_rtp_raw_write(instance, f, codec);
1211 static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int timestamp, int mark)
1215 double current_time;
1219 int rate = rtp_get_rate(rtp->f.subclass);
1221 double normdev_rxjitter_current;
1222 if ((!rtp->rxcore.tv_sec && !rtp->rxcore.tv_usec) || mark) {
1223 gettimeofday(&rtp->rxcore, NULL);
1224 rtp->drxcore = (double) rtp->rxcore.tv_sec + (double) rtp->rxcore.tv_usec / 1000000;
1225 /* map timestamp to a real time */
1226 rtp->seedrxts = timestamp; /* Their RTP timestamp started with this */
1227 rtp->rxcore.tv_sec -= timestamp / rate;
1228 rtp->rxcore.tv_usec -= (timestamp % rate) * 125;
1229 /* Round to 0.1ms for nice, pretty timestamps */
1230 rtp->rxcore.tv_usec -= rtp->rxcore.tv_usec % 100;
1231 if (rtp->rxcore.tv_usec < 0) {
1232 /* Adjust appropriately if necessary */
1233 rtp->rxcore.tv_usec += 1000000;
1234 rtp->rxcore.tv_sec -= 1;
1238 gettimeofday(&now,NULL);
1239 /* rxcore is the mapping between the RTP timestamp and _our_ real time from gettimeofday() */
1240 tv->tv_sec = rtp->rxcore.tv_sec + timestamp / rate;
1241 tv->tv_usec = rtp->rxcore.tv_usec + (timestamp % rate) * 125;
1242 if (tv->tv_usec >= 1000000) {
1243 tv->tv_usec -= 1000000;
1246 prog = (double)((timestamp-rtp->seedrxts)/(float)(rate));
1247 dtv = (double)rtp->drxcore + (double)(prog);
1248 current_time = (double)now.tv_sec + (double)now.tv_usec/1000000;
1249 transit = current_time - dtv;
1250 d = transit - rtp->rxtransit;
1251 rtp->rxtransit = transit;
1254 rtp->rxjitter += (1./16.) * (d - rtp->rxjitter);
1257 if (rtp->rxjitter > rtp->rtcp->maxrxjitter)
1258 rtp->rtcp->maxrxjitter = rtp->rxjitter;
1259 if (rtp->rtcp->rxjitter_count == 1)
1260 rtp->rtcp->minrxjitter = rtp->rxjitter;
1261 if (rtp->rtcp && rtp->rxjitter < rtp->rtcp->minrxjitter)
1262 rtp->rtcp->minrxjitter = rtp->rxjitter;
1264 normdev_rxjitter_current = normdev_compute(rtp->rtcp->normdev_rxjitter,rtp->rxjitter,rtp->rtcp->rxjitter_count);
1265 rtp->rtcp->stdev_rxjitter = stddev_compute(rtp->rtcp->stdev_rxjitter,rtp->rxjitter,rtp->rtcp->normdev_rxjitter,normdev_rxjitter_current,rtp->rtcp->rxjitter_count);
1267 rtp->rtcp->normdev_rxjitter = normdev_rxjitter_current;
1268 rtp->rtcp->rxjitter_count++;
1272 static struct ast_frame *send_dtmf(struct ast_rtp_instance *instance, enum ast_frame_type type, int compensate)
1274 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1275 struct sockaddr_in remote_address = { 0, };
1277 ast_rtp_instance_get_remote_address(instance, &remote_address);
1279 if (((compensate && type == AST_FRAME_DTMF_END) || (type == AST_FRAME_DTMF_BEGIN)) && ast_tvcmp(ast_tvnow(), rtp->dtmfmute) < 0) {
1280 ast_debug(1, "Ignore potential DTMF echo from '%s'\n", ast_inet_ntoa(remote_address.sin_addr));
1282 rtp->dtmfsamples = 0;
1283 return &ast_null_frame;
1285 ast_debug(1, "Sending dtmf: %d (%c), at %s\n", rtp->resp, rtp->resp, ast_inet_ntoa(remote_address.sin_addr));
1286 if (rtp->resp == 'X') {
1287 rtp->f.frametype = AST_FRAME_CONTROL;
1288 rtp->f.subclass = AST_CONTROL_FLASH;
1290 rtp->f.frametype = type;
1291 rtp->f.subclass = rtp->resp;
1301 static struct ast_frame *process_dtmf_rfc2833(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, struct sockaddr_in *sin, int payloadtype, int mark)
1303 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1304 struct sockaddr_in remote_address = { 0, };
1305 unsigned int event, event_end, samples;
1307 struct ast_frame *f = NULL;
1309 ast_rtp_instance_get_remote_address(instance, &remote_address);
1311 /* Figure out event, event end, and samples */
1312 event = ntohl(*((unsigned int *)(data)));
1314 event_end = ntohl(*((unsigned int *)(data)));
1317 samples = ntohl(*((unsigned int *)(data)));
1320 if (rtp_debug_test_addr(&remote_address)) {
1321 ast_verbose("Got RTP RFC2833 from %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u, mark %d, event %08x, end %d, duration %-5.5d) \n", ast_inet_ntoa(remote_address.sin_addr),
1322 ntohs(remote_address.sin_port), payloadtype, seqno, timestamp, len, (mark?1:0), event, ((event_end & 0x80)?1:0), samples);
1325 /* Print out debug if turned on */
1326 if (rtpdebug || option_debug > 2)
1327 ast_debug(0, "- RTP 2833 Event: %08x (len = %d)\n", event, len);
1329 /* Figure out what digit was pressed */
1332 } else if (event < 11) {
1334 } else if (event < 12) {
1336 } else if (event < 16) {
1337 resp = 'A' + (event - 12);
1338 } else if (event < 17) { /* Event 16: Hook flash */
1341 /* Not a supported event */
1342 ast_log(LOG_DEBUG, "Ignoring RTP 2833 Event: %08x. Not a DTMF Digit.\n", event);
1343 return &ast_null_frame;
1346 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)) {
1347 if ((rtp->lastevent != timestamp) || (rtp->resp && rtp->resp != resp)) {
1349 rtp->dtmf_timeout = 0;
1350 f = send_dtmf(instance, AST_FRAME_DTMF_END, ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE));
1352 rtp->lastevent = timestamp;
1355 /* The duration parameter measures the complete
1356 duration of the event (from the beginning) - RFC2833.
1357 Account for the fact that duration is only 16 bits long
1358 (about 8 seconds at 8000 Hz) and can wrap is digit
1359 is hold for too long. */
1360 unsigned int new_duration = rtp->dtmf_duration;
1361 unsigned int last_duration = new_duration & 0xFFFF;
1363 if (last_duration > 64000 && samples < last_duration) {
1364 new_duration += 0xFFFF + 1;
1366 new_duration = (new_duration & ~0xFFFF) | samples;
1368 if (event_end & 0x80) {
1370 if ((rtp->lastevent != seqno) && rtp->resp) {
1371 rtp->dtmf_duration = new_duration;
1372 f = send_dtmf(instance, AST_FRAME_DTMF_END, 0);
1373 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
1375 rtp->dtmf_duration = rtp->dtmf_timeout = 0;
1378 /* Begin/continuation */
1380 if (rtp->resp && rtp->resp != resp) {
1381 /* Another digit already began. End it */
1382 f = send_dtmf(instance, AST_FRAME_DTMF_END, 0);
1383 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
1385 rtp->dtmf_duration = rtp->dtmf_timeout = 0;
1389 /* Digit continues */
1390 rtp->dtmf_duration = new_duration;
1392 /* New digit began */
1394 f = send_dtmf(instance, AST_FRAME_DTMF_BEGIN, 0);
1395 rtp->dtmf_duration = samples;
1398 rtp->dtmf_timeout = timestamp + rtp->dtmf_duration + dtmftimeout;
1401 rtp->lastevent = seqno;
1404 rtp->dtmfsamples = samples;
1409 static struct ast_frame *process_dtmf_cisco(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, struct sockaddr_in *sin, int payloadtype, int mark)
1411 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1412 unsigned int event, flags, power;
1415 struct ast_frame *f = NULL;
1421 /* The format of Cisco RTP DTMF packet looks like next:
1422 +0 - sequence number of DTMF RTP packet (begins from 1,
1425 +1 (bit 0) - flaps by different DTMF digits delimited by audio
1426 or repeated digit without audio???
1427 +2 (+4,+6,...) - power level? (rises from 0 to 32 at begin of tone
1428 then falls to 0 at its end)
1429 +3 (+5,+7,...) - detected DTMF digit (0..9,*,#,A-D,...)
1430 Repeated DTMF information (bytes 4/5, 6/7) is history shifted right
1431 by each new packet and thus provides some redudancy.
1433 Sample of Cisco RTP DTMF packet is (all data in hex):
1434 19 07 00 02 12 02 20 02
1435 showing end of DTMF digit '2'.
1438 27 07 00 02 0A 02 20 02
1439 28 06 20 02 00 02 0A 02
1440 shows begin of new digit '2' with very short pause (20 ms) after
1441 previous digit '2'. Bit +1.0 flips at begin of new digit.
1443 Cisco RTP DTMF packets comes as replacement of audio RTP packets
1444 so its uses the same sequencing and timestamping rules as replaced
1445 audio packets. Repeat interval of DTMF packets is 20 ms and not rely
1446 on audio framing parameters. Marker bit isn't used within stream of
1447 DTMFs nor audio stream coming immediately after DTMF stream. Timestamps
1448 are not sequential at borders between DTMF and audio streams,
1454 event = data[3] & 0x1f;
1456 if (option_debug > 2 || rtpdebug)
1457 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);
1460 } else if (event < 11) {
1462 } else if (event < 12) {
1464 } else if (event < 16) {
1465 resp = 'A' + (event - 12);
1466 } else if (event < 17) {
1469 if ((!rtp->resp && power) || (rtp->resp && (rtp->resp != resp))) {
1471 /* Why we should care on DTMF compensation at reception? */
1472 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)) {
1473 f = send_dtmf(instance, AST_FRAME_DTMF_BEGIN, 0);
1474 rtp->dtmfsamples = 0;
1476 } else if ((rtp->resp == resp) && !power) {
1477 f = send_dtmf(instance, AST_FRAME_DTMF_END, ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE));
1478 f->samples = rtp->dtmfsamples * (rtp_get_rate(f->subclass) / 1000);
1480 } else if (rtp->resp == resp)
1481 rtp->dtmfsamples += 20 * (rtp_get_rate(f->subclass) / 1000);
1482 rtp->dtmf_timeout = 0;
1487 static struct ast_frame *process_cn_rfc3389(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, struct sockaddr_in *sin, int payloadtype, int mark)
1489 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1491 /* Convert comfort noise into audio with various codecs. Unfortunately this doesn't
1492 totally help us out becuase we don't have an engine to keep it going and we are not
1493 guaranteed to have it every 20ms or anything */
1495 ast_debug(0, "- RTP 3389 Comfort noise event: Level %d (len = %d)\n", rtp->lastrxformat, len);
1497 if (ast_test_flag(rtp, FLAG_3389_WARNING)) {
1498 struct sockaddr_in remote_address = { 0, };
1500 ast_rtp_instance_get_remote_address(instance, &remote_address);
1502 ast_log(LOG_NOTICE, "Comfort noise support incomplete in Asterisk (RFC 3389). Please turn off on client if possible. Client IP: %s\n",
1503 ast_inet_ntoa(remote_address.sin_addr));
1504 ast_set_flag(rtp, FLAG_3389_WARNING);
1507 /* Must have at least one byte */
1511 rtp->f.data.ptr = rtp->rawdata + AST_FRIENDLY_OFFSET;
1512 rtp->f.datalen = len - 1;
1513 rtp->f.offset = AST_FRIENDLY_OFFSET;
1514 memcpy(rtp->f.data.ptr, data + 1, len - 1);
1516 rtp->f.data.ptr = NULL;
1520 rtp->f.frametype = AST_FRAME_CNG;
1521 rtp->f.subclass = data[0] & 0x7f;
1522 rtp->f.datalen = len - 1;
1524 rtp->f.delivery.tv_usec = rtp->f.delivery.tv_sec = 0;
1529 static struct ast_frame *ast_rtcp_read(struct ast_rtp_instance *instance)
1531 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1532 struct sockaddr_in sin;
1533 socklen_t len = sizeof(sin);
1534 unsigned int rtcpdata[8192 + AST_FRIENDLY_OFFSET];
1535 unsigned int *rtcpheader = (unsigned int *)(rtcpdata + AST_FRIENDLY_OFFSET);
1536 int res, packetwords, position = 0;
1537 struct ast_frame *f = &ast_null_frame;
1539 /* Read in RTCP data from the socket */
1540 if ((res = recvfrom(rtp->rtcp->s, rtcpdata + AST_FRIENDLY_OFFSET, sizeof(rtcpdata) - sizeof(unsigned int) * AST_FRIENDLY_OFFSET, 0, (struct sockaddr *)&sin, &len)) < 0) {
1541 ast_assert(errno != EBADF);
1542 if (errno != EAGAIN) {
1543 ast_log(LOG_WARNING, "RTCP Read error: %s. Hanging up.\n", strerror(errno));
1546 return &ast_null_frame;
1549 packetwords = res / 4;
1551 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT)) {
1552 /* Send to whoever sent to us */
1553 if ((rtp->rtcp->them.sin_addr.s_addr != sin.sin_addr.s_addr) ||
1554 (rtp->rtcp->them.sin_port != sin.sin_port)) {
1555 memcpy(&rtp->rtcp->them, &sin, sizeof(rtp->rtcp->them));
1556 if (option_debug || rtpdebug)
1557 ast_debug(0, "RTCP NAT: Got RTCP from other end. Now sending to address %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
1561 ast_debug(1, "Got RTCP report of %d bytes\n", res);
1563 while (position < packetwords) {
1565 unsigned int length, dlsr, lsr, msw, lsw, comp;
1567 double rttsec, reported_jitter, reported_normdev_jitter_current, normdevrtt_current, reported_lost, reported_normdev_lost_current;
1571 length = ntohl(rtcpheader[i]);
1572 pt = (length & 0xff0000) >> 16;
1573 rc = (length & 0x1f000000) >> 24;
1576 if ((i + length) > packetwords) {
1577 if (option_debug || rtpdebug)
1578 ast_log(LOG_DEBUG, "RTCP Read too short\n");
1579 return &ast_null_frame;
1582 if (rtcp_debug_test_addr(&sin)) {
1583 ast_verbose("\n\nGot RTCP from %s:%d\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
1584 ast_verbose("PT: %d(%s)\n", pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown");
1585 ast_verbose("Reception reports: %d\n", rc);
1586 ast_verbose("SSRC of sender: %u\n", rtcpheader[i + 1]);
1589 i += 2; /* Advance past header and ssrc */
1593 gettimeofday(&rtp->rtcp->rxlsr,NULL); /* To be able to populate the dlsr */
1594 rtp->rtcp->spc = ntohl(rtcpheader[i+3]);
1595 rtp->rtcp->soc = ntohl(rtcpheader[i + 4]);
1596 rtp->rtcp->themrxlsr = ((ntohl(rtcpheader[i]) & 0x0000ffff) << 16) | ((ntohl(rtcpheader[i + 1]) & 0xffff0000) >> 16); /* Going to LSR in RR*/
1598 if (rtcp_debug_test_addr(&sin)) {
1599 ast_verbose("NTP timestamp: %lu.%010lu\n", (unsigned long) ntohl(rtcpheader[i]), (unsigned long) ntohl(rtcpheader[i + 1]) * 4096);
1600 ast_verbose("RTP timestamp: %lu\n", (unsigned long) ntohl(rtcpheader[i + 2]));
1601 ast_verbose("SPC: %lu\tSOC: %lu\n", (unsigned long) ntohl(rtcpheader[i + 3]), (unsigned long) ntohl(rtcpheader[i + 4]));
1606 /* Intentional fall through */
1608 /* Don't handle multiple reception reports (rc > 1) yet */
1609 /* Calculate RTT per RFC */
1610 gettimeofday(&now, NULL);
1611 timeval2ntp(now, &msw, &lsw);
1612 if (ntohl(rtcpheader[i + 4]) && ntohl(rtcpheader[i + 5])) { /* We must have the LSR && DLSR */
1613 comp = ((msw & 0xffff) << 16) | ((lsw & 0xffff0000) >> 16);
1614 lsr = ntohl(rtcpheader[i + 4]);
1615 dlsr = ntohl(rtcpheader[i + 5]);
1616 rtt = comp - lsr - dlsr;
1618 /* Convert end to end delay to usec (keeping the calculation in 64bit space)
1619 sess->ee_delay = (eedelay * 1000) / 65536; */
1621 rtt = (rtt * 1000000) >> 16;
1623 rtt = (rtt * 1000) >> 16;
1627 rttsec = rtt / 1000.;
1628 rtp->rtcp->rtt = rttsec;
1630 if (comp - dlsr >= lsr) {
1631 rtp->rtcp->accumulated_transit += rttsec;
1633 if (rtp->rtcp->rtt_count == 0)
1634 rtp->rtcp->minrtt = rttsec;
1636 if (rtp->rtcp->maxrtt<rttsec)
1637 rtp->rtcp->maxrtt = rttsec;
1638 if (rtp->rtcp->minrtt>rttsec)
1639 rtp->rtcp->minrtt = rttsec;
1641 normdevrtt_current = normdev_compute(rtp->rtcp->normdevrtt, rttsec, rtp->rtcp->rtt_count);
1643 rtp->rtcp->stdevrtt = stddev_compute(rtp->rtcp->stdevrtt, rttsec, rtp->rtcp->normdevrtt, normdevrtt_current, rtp->rtcp->rtt_count);
1645 rtp->rtcp->normdevrtt = normdevrtt_current;
1647 rtp->rtcp->rtt_count++;
1648 } else if (rtcp_debug_test_addr(&sin)) {
1649 ast_verbose("Internal RTCP NTP clock skew detected: "
1650 "lsr=%u, now=%u, dlsr=%u (%d:%03dms), "
1652 lsr, comp, dlsr, dlsr / 65536,
1653 (dlsr % 65536) * 1000 / 65536,
1654 dlsr - (comp - lsr));
1658 rtp->rtcp->reported_jitter = ntohl(rtcpheader[i + 3]);
1659 reported_jitter = (double) rtp->rtcp->reported_jitter;
1661 if (rtp->rtcp->reported_jitter_count == 0)
1662 rtp->rtcp->reported_minjitter = reported_jitter;
1664 if (reported_jitter < rtp->rtcp->reported_minjitter)
1665 rtp->rtcp->reported_minjitter = reported_jitter;
1667 if (reported_jitter > rtp->rtcp->reported_maxjitter)
1668 rtp->rtcp->reported_maxjitter = reported_jitter;
1670 reported_normdev_jitter_current = normdev_compute(rtp->rtcp->reported_normdev_jitter, reported_jitter, rtp->rtcp->reported_jitter_count);
1672 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);
1674 rtp->rtcp->reported_normdev_jitter = reported_normdev_jitter_current;
1676 rtp->rtcp->reported_lost = ntohl(rtcpheader[i + 1]) & 0xffffff;
1678 reported_lost = (double) rtp->rtcp->reported_lost;
1680 /* using same counter as for jitter */
1681 if (rtp->rtcp->reported_jitter_count == 0)
1682 rtp->rtcp->reported_minlost = reported_lost;
1684 if (reported_lost < rtp->rtcp->reported_minlost)
1685 rtp->rtcp->reported_minlost = reported_lost;
1687 if (reported_lost > rtp->rtcp->reported_maxlost)
1688 rtp->rtcp->reported_maxlost = reported_lost;
1689 reported_normdev_lost_current = normdev_compute(rtp->rtcp->reported_normdev_lost, reported_lost, rtp->rtcp->reported_jitter_count);
1691 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);
1693 rtp->rtcp->reported_normdev_lost = reported_normdev_lost_current;
1695 rtp->rtcp->reported_jitter_count++;
1697 if (rtcp_debug_test_addr(&sin)) {
1698 ast_verbose(" Fraction lost: %ld\n", (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24));
1699 ast_verbose(" Packets lost so far: %d\n", rtp->rtcp->reported_lost);
1700 ast_verbose(" Highest sequence number: %ld\n", (long) (ntohl(rtcpheader[i + 2]) & 0xffff));
1701 ast_verbose(" Sequence number cycles: %ld\n", (long) (ntohl(rtcpheader[i + 2]) & 0xffff) >> 16);
1702 ast_verbose(" Interarrival jitter: %u\n", rtp->rtcp->reported_jitter);
1703 ast_verbose(" Last SR(our NTP): %lu.%010lu\n",(unsigned long) ntohl(rtcpheader[i + 4]) >> 16,((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096);
1704 ast_verbose(" DLSR: %4.4f (sec)\n",ntohl(rtcpheader[i + 5])/65536.0);
1706 ast_verbose(" RTT: %lu(sec)\n", (unsigned long) rtt);
1709 manager_event(EVENT_FLAG_REPORTING, "RTCPReceived", "From %s:%d\r\n"
1711 "ReceptionReports: %d\r\n"
1712 "SenderSSRC: %u\r\n"
1713 "FractionLost: %ld\r\n"
1714 "PacketsLost: %d\r\n"
1715 "HighestSequence: %ld\r\n"
1716 "SequenceNumberCycles: %ld\r\n"
1718 "LastSR: %lu.%010lu\r\n"
1719 "DLSR: %4.4f(sec)\r\n"
1720 "RTT: %llu(sec)\r\n",
1721 ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port),
1722 pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown",
1725 (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24),
1726 rtp->rtcp->reported_lost,
1727 (long) (ntohl(rtcpheader[i + 2]) & 0xffff),
1728 (long) (ntohl(rtcpheader[i + 2]) & 0xffff) >> 16,
1729 rtp->rtcp->reported_jitter,
1730 (unsigned long) ntohl(rtcpheader[i + 4]) >> 16, ((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096,
1731 ntohl(rtcpheader[i + 5])/65536.0,
1732 (unsigned long long)rtt);
1734 manager_event(EVENT_FLAG_REPORTING, "RTCPReceived", "From %s:%d\r\n"
1736 "ReceptionReports: %d\r\n"
1737 "SenderSSRC: %u\r\n"
1738 "FractionLost: %ld\r\n"
1739 "PacketsLost: %d\r\n"
1740 "HighestSequence: %ld\r\n"
1741 "SequenceNumberCycles: %ld\r\n"
1743 "LastSR: %lu.%010lu\r\n"
1744 "DLSR: %4.4f(sec)\r\n",
1745 ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port),
1746 pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown",
1749 (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24),
1750 rtp->rtcp->reported_lost,
1751 (long) (ntohl(rtcpheader[i + 2]) & 0xffff),
1752 (long) (ntohl(rtcpheader[i + 2]) & 0xffff) >> 16,
1753 rtp->rtcp->reported_jitter,
1754 (unsigned long) ntohl(rtcpheader[i + 4]) >> 16,
1755 ((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096,
1756 ntohl(rtcpheader[i + 5])/65536.0);
1760 if (rtcp_debug_test_addr(&sin))
1761 ast_verbose("Received an RTCP Fast Update Request\n");
1762 rtp->f.frametype = AST_FRAME_CONTROL;
1763 rtp->f.subclass = AST_CONTROL_VIDUPDATE;
1771 if (rtcp_debug_test_addr(&sin))
1772 ast_verbose("Received an SDES from %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
1775 if (rtcp_debug_test_addr(&sin))
1776 ast_verbose("Received a BYE from %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
1779 ast_debug(1, "Unknown RTCP packet (pt=%d) received from %s:%d\n", pt, ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
1782 position += (length + 1);
1785 rtp->rtcp->rtcp_info = 1;
1790 static int bridge_p2p_rtp_write(struct ast_rtp_instance *instance, unsigned int *rtpheader, int len, int hdrlen)
1792 struct ast_rtp_instance *instance1 = ast_rtp_instance_get_bridged(instance);
1793 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance), *bridged = ast_rtp_instance_get_data(instance1);
1794 int res = 0, payload = 0, bridged_payload = 0, mark;
1795 struct ast_rtp_payload_type payload_type;
1796 int reconstruct = ntohl(rtpheader[0]);
1797 struct sockaddr_in remote_address = { 0, };
1799 /* Get fields from packet */
1800 payload = (reconstruct & 0x7f0000) >> 16;
1801 mark = (((reconstruct & 0x800000) >> 23) != 0);
1803 /* Check what the payload value should be */
1804 payload_type = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(instance), payload);
1806 /* Otherwise adjust bridged payload to match */
1807 bridged_payload = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance1), payload_type.asterisk_format, payload_type.code);
1809 /* 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 */
1810 if (!(ast_rtp_instance_get_codecs(instance1)->payloads[bridged_payload].code)) {
1814 /* If the marker bit has been explicitly set turn it on */
1815 if (ast_test_flag(rtp, FLAG_NEED_MARKER_BIT)) {
1817 ast_clear_flag(rtp, FLAG_NEED_MARKER_BIT);
1820 /* Reconstruct part of the packet */
1821 reconstruct &= 0xFF80FFFF;
1822 reconstruct |= (bridged_payload << 16);
1823 reconstruct |= (mark << 23);
1824 rtpheader[0] = htonl(reconstruct);
1826 ast_rtp_instance_get_remote_address(instance1, &remote_address);
1828 /* Send the packet back out */
1829 res = sendto(bridged->s, (void *)rtpheader, len, 0, (struct sockaddr *)&remote_address, sizeof(remote_address));
1831 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))) {
1832 ast_debug(1, "RTP Transmission error of packet to %s:%d: %s\n", ast_inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port), strerror(errno));
1833 } else if (((ast_test_flag(bridged, FLAG_NAT_ACTIVE) == FLAG_NAT_INACTIVE) || rtpdebug) && !ast_test_flag(bridged, FLAG_NAT_INACTIVE_NOWARN)) {
1834 if (option_debug || rtpdebug)
1835 ast_debug(0, "RTP NAT: Can't write RTP to private address %s:%d, waiting for other end to send audio...\n", ast_inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port));
1836 ast_set_flag(bridged, FLAG_NAT_INACTIVE_NOWARN);
1839 } else if (rtp_debug_test_addr(&remote_address)) {
1840 ast_verbose("Sent RTP P2P packet to %s:%u (type %-2.2d, len %-6.6u)\n", ast_inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port), bridged_payload, len - hdrlen);
1846 static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtcp)
1848 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1849 struct sockaddr_in sin;
1850 socklen_t len = sizeof(sin);
1851 int res, hdrlen = 12, version, payloadtype, padding, mark, ext, cc, prev_seqno;
1852 unsigned int *rtpheader = (unsigned int*)(rtp->rawdata + AST_FRIENDLY_OFFSET), seqno, ssrc, timestamp;
1853 struct ast_rtp_payload_type payload;
1854 struct sockaddr_in remote_address = { 0, };
1856 /* If this is actually RTCP let's hop on over and handle it */
1859 return ast_rtcp_read(instance);
1861 return &ast_null_frame;
1864 /* If we are currently sending DTMF to the remote party send a continuation packet */
1865 if (rtp->sending_digit) {
1866 ast_rtp_dtmf_continuation(instance);
1869 /* Actually read in the data from the socket */
1870 if ((res = recvfrom(rtp->s, rtp->rawdata + AST_FRIENDLY_OFFSET, sizeof(rtp->rawdata) - AST_FRIENDLY_OFFSET, 0, (struct sockaddr*)&sin, &len)) < 0) {
1871 ast_assert(errno != EBADF);
1872 if (errno != EAGAIN) {
1873 ast_log(LOG_WARNING, "RTP Read error: %s. Hanging up.\n", strerror(errno));
1876 return &ast_null_frame;
1879 /* Make sure the data that was read in is actually enough to make up an RTP packet */
1881 ast_log(LOG_WARNING, "RTP Read too short\n");
1882 return &ast_null_frame;
1885 /* If strict RTP protection is enabled see if we need to learn the remote address or if we need to drop the packet */
1886 if (rtp->strict_rtp_state == STRICT_RTP_LEARN) {
1887 memcpy(&rtp->strict_rtp_address, &sin, sizeof(rtp->strict_rtp_address));
1888 rtp->strict_rtp_state = STRICT_RTP_CLOSED;
1889 } else if (rtp->strict_rtp_state == STRICT_RTP_CLOSED) {
1890 if ((rtp->strict_rtp_address.sin_addr.s_addr != sin.sin_addr.s_addr) || (rtp->strict_rtp_address.sin_port != sin.sin_port)) {
1891 /* Hmm, not the strict addres. Perhaps we're getting audio from the alternate? */
1892 if ((rtp->alt_rtp_address.sin_addr.s_addr == sin.sin_addr.s_addr) && (rtp->alt_rtp_address.sin_port == sin.sin_port)) {
1893 /* ooh, we did! You're now the new expected address, son! */
1894 rtp->strict_rtp_address = sin;
1896 ast_debug(1, "Received RTP packet from %s:%d, dropping due to strict RTP protection. Expected it to be from %s:%d\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), ast_inet_ntoa(rtp->strict_rtp_address.sin_addr), ntohs(rtp->strict_rtp_address.sin_port));
1897 return &ast_null_frame;
1902 /* Get fields and verify this is an RTP packet */
1903 seqno = ntohl(rtpheader[0]);
1905 ast_rtp_instance_get_remote_address(instance, &remote_address);
1907 if (!(version = (seqno & 0xC0000000) >> 30)) {
1908 if ((ast_stun_handle_packet(rtp->s, &sin, rtp->rawdata + AST_FRIENDLY_OFFSET, res, NULL, NULL) == AST_STUN_ACCEPT) &&
1909 (!remote_address.sin_port && !remote_address.sin_addr.s_addr)) {
1910 ast_rtp_instance_set_remote_address(instance, &sin);
1912 return &ast_null_frame;
1915 /* If symmetric RTP is enabled see if the remote side is not what we expected and change where we are sending audio */
1916 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT)) {
1917 if ((remote_address.sin_addr.s_addr != sin.sin_addr.s_addr) ||
1918 (remote_address.sin_port != sin.sin_port)) {
1919 ast_rtp_instance_set_remote_address(instance, &sin);
1920 memcpy(&remote_address, &sin, sizeof(remote_address));
1922 memcpy(&rtp->rtcp->them, &sin, sizeof(rtp->rtcp->them));
1923 rtp->rtcp->them.sin_port = htons(ntohs(sin.sin_port)+1);
1926 ast_set_flag(rtp, FLAG_NAT_ACTIVE);
1927 if (option_debug || rtpdebug)
1928 ast_debug(0, "RTP NAT: Got audio from other end. Now sending to address %s:%d\n", ast_inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port));
1932 /* If we are directly bridged to another instance send the audio directly out */
1933 if (ast_rtp_instance_get_bridged(instance) && !bridge_p2p_rtp_write(instance, rtpheader, res, hdrlen)) {
1934 return &ast_null_frame;
1937 /* If the version is not what we expected by this point then just drop the packet */
1939 return &ast_null_frame;
1942 /* Pull out the various other fields we will need */
1943 payloadtype = (seqno & 0x7f0000) >> 16;
1944 padding = seqno & (1 << 29);
1945 mark = seqno & (1 << 23);
1946 ext = seqno & (1 << 28);
1947 cc = (seqno & 0xF000000) >> 24;
1949 timestamp = ntohl(rtpheader[1]);
1950 ssrc = ntohl(rtpheader[2]);
1952 /* Force a marker bit if the SSRC changes */
1953 if (!mark && rtp->rxssrc && rtp->rxssrc != ssrc) {
1954 if (option_debug || rtpdebug) {
1955 ast_debug(1, "Forcing Marker bit, because SSRC has changed\n");
1960 /* Remove any padding bytes that may be present */
1962 res -= rtp->rawdata[AST_FRIENDLY_OFFSET + res - 1];
1965 /* Skip over any CSRC fields */
1970 /* Look for any RTP extensions, currently we do not support any */
1972 hdrlen += (ntohl(rtpheader[hdrlen/4]) & 0xffff) << 2;
1976 profile = (ntohl(rtpheader[3]) & 0xffff0000) >> 16;
1977 if (profile == 0x505a)
1978 ast_debug(1, "Found Zfone extension in RTP stream - zrtp - not supported.\n");
1980 ast_debug(1, "Found unknown RTP Extensions %x\n", profile);
1984 /* Make sure after we potentially mucked with the header length that it is once again valid */
1986 ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d\n", res, hdrlen);
1987 return &ast_null_frame;
1991 if (rtp->rxcount == 1) {
1992 rtp->seedrxseqno = seqno;
1995 /* Do not schedule RR if RTCP isn't run */
1996 if (rtp->rtcp && rtp->rtcp->them.sin_addr.s_addr && rtp->rtcp->schedid < 1) {
1997 /* Schedule transmission of Receiver Report */
1998 rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, rtp);
2000 if ((int)rtp->lastrxseqno - (int)seqno > 100) /* if so it would indicate that the sender cycled; allow for misordering */
2001 rtp->cycles += RTP_SEQ_MOD;
2003 prev_seqno = rtp->lastrxseqno;
2004 rtp->lastrxseqno = seqno;
2006 if (!rtp->themssrc) {
2007 rtp->themssrc = ntohl(rtpheader[2]); /* Record their SSRC to put in future RR */
2010 if (rtp_debug_test_addr(&sin)) {
2011 ast_verbose("Got RTP packet from %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
2012 ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), payloadtype, seqno, timestamp,res - hdrlen);
2015 payload = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(instance), payloadtype);
2017 /* If the payload is not actually an Asterisk one but a special one pass it off to the respective handler */
2018 if (!payload.asterisk_format) {
2019 struct ast_frame *f = NULL;
2020 if (payload.code == AST_RTP_DTMF) {
2021 f = process_dtmf_rfc2833(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &sin, payloadtype, mark);
2022 } else if (payload.code == AST_RTP_CISCO_DTMF) {
2023 f = process_dtmf_cisco(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &sin, payloadtype, mark);
2024 } else if (payload.code == AST_RTP_CN) {
2025 f = process_cn_rfc3389(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &sin, payloadtype, mark);
2027 ast_log(LOG_NOTICE, "Unknown RTP codec %d received from '%s'\n", payloadtype, ast_inet_ntoa(remote_address.sin_addr));
2030 return f ? f : &ast_null_frame;
2033 rtp->lastrxformat = rtp->f.subclass = payload.code;
2034 rtp->f.frametype = (rtp->f.subclass & AST_FORMAT_AUDIO_MASK) ? AST_FRAME_VOICE : (rtp->f.subclass & AST_FORMAT_VIDEO_MASK) ? AST_FRAME_VIDEO : AST_FRAME_TEXT;
2036 rtp->rxseqno = seqno;
2038 if (rtp->dtmf_timeout && rtp->dtmf_timeout < timestamp) {
2039 rtp->dtmf_timeout = 0;
2042 struct ast_frame *f;
2043 f = send_dtmf(instance, AST_FRAME_DTMF_END, 0);
2044 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
2046 rtp->dtmf_timeout = rtp->dtmf_duration = 0;
2051 rtp->lastrxts = timestamp;
2055 rtp->f.datalen = res - hdrlen;
2056 rtp->f.data.ptr = rtp->rawdata + hdrlen + AST_FRIENDLY_OFFSET;
2057 rtp->f.offset = hdrlen + AST_FRIENDLY_OFFSET;
2058 rtp->f.seqno = seqno;
2060 if (rtp->f.subclass == AST_FORMAT_T140 && (int)seqno - (prev_seqno+1) > 0 && (int)seqno - (prev_seqno+1) < 10) {
2061 unsigned char *data = rtp->f.data.ptr;
2063 memmove(rtp->f.data.ptr+3, rtp->f.data.ptr, rtp->f.datalen);
2070 if (rtp->f.subclass == AST_FORMAT_T140RED) {
2071 unsigned char *data = rtp->f.data.ptr;
2072 unsigned char *header_end;
2073 int num_generations;
2076 int diff =(int)seqno - (prev_seqno+1); /* if diff = 0, no drop*/
2079 rtp->f.subclass = AST_FORMAT_T140;
2080 header_end = memchr(data, ((*data) & 0x7f), rtp->f.datalen);
2083 header_length = header_end - data;
2084 num_generations = header_length / 4;
2085 len = header_length;
2088 for (x = 0; x < num_generations; x++)
2089 len += data[x * 4 + 3];
2091 if (!(rtp->f.datalen - len))
2092 return &ast_null_frame;
2094 rtp->f.data.ptr += len;
2095 rtp->f.datalen -= len;
2096 } else if (diff > num_generations && diff < 10) {
2098 rtp->f.data.ptr += len;
2099 rtp->f.datalen -= len;
2101 data = rtp->f.data.ptr;
2106 for ( x = 0; x < num_generations - diff; x++)
2107 len += data[x * 4 + 3];
2109 rtp->f.data.ptr += len;
2110 rtp->f.datalen -= len;
2114 if (rtp->f.subclass & AST_FORMAT_AUDIO_MASK) {
2115 rtp->f.samples = ast_codec_get_samples(&rtp->f);
2116 if (rtp->f.subclass == AST_FORMAT_SLINEAR)
2117 ast_frame_byteswap_be(&rtp->f);
2118 calc_rxstamp(&rtp->f.delivery, rtp, timestamp, mark);
2119 /* Add timing data to let ast_generic_bridge() put the frame into a jitterbuf */
2120 ast_set_flag(&rtp->f, AST_FRFLAG_HAS_TIMING_INFO);
2121 rtp->f.ts = timestamp / (rtp_get_rate(rtp->f.subclass) / 1000);
2122 rtp->f.len = rtp->f.samples / ((ast_format_rate(rtp->f.subclass) / 1000));
2123 } else if (rtp->f.subclass & AST_FORMAT_VIDEO_MASK) {
2124 /* Video -- samples is # of samples vs. 90000 */
2125 if (!rtp->lastividtimestamp)
2126 rtp->lastividtimestamp = timestamp;
2127 rtp->f.samples = timestamp - rtp->lastividtimestamp;
2128 rtp->lastividtimestamp = timestamp;
2129 rtp->f.delivery.tv_sec = 0;
2130 rtp->f.delivery.tv_usec = 0;
2131 /* Pass the RTP marker bit as bit 0 in the subclass field.
2132 * This is ok because subclass is actually a bitmask, and
2133 * the low bits represent audio formats, that are not
2134 * involved here since we deal with video.
2137 rtp->f.subclass |= 0x1;
2139 /* TEXT -- samples is # of samples vs. 1000 */
2140 if (!rtp->lastitexttimestamp)
2141 rtp->lastitexttimestamp = timestamp;
2142 rtp->f.samples = timestamp - rtp->lastitexttimestamp;
2143 rtp->lastitexttimestamp = timestamp;
2144 rtp->f.delivery.tv_sec = 0;
2145 rtp->f.delivery.tv_usec = 0;
2151 static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value)
2153 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2155 if (property == AST_RTP_PROPERTY_RTCP) {
2157 ast_debug(1, "Ignoring duplicate RTCP property on RTP instance '%p'\n", instance);
2160 if (!(rtp->rtcp = ast_calloc(1, sizeof(*rtp->rtcp)))) {
2163 if ((rtp->rtcp->s = create_new_socket("RTCP")) < 0) {
2164 ast_debug(1, "Failed to create a new socket for RTCP on instance '%p'\n", instance);
2165 ast_free(rtp->rtcp);
2170 /* Grab the IP address and port we are going to use */
2171 ast_rtp_instance_get_local_address(instance, &rtp->rtcp->us);
2172 rtp->rtcp->us.sin_port = htons(ntohs(rtp->rtcp->us.sin_port) + 1);
2174 /* 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 */
2175 if (bind(rtp->rtcp->s, (struct sockaddr*)&rtp->rtcp->us, sizeof(rtp->rtcp->us))) {
2176 ast_debug(1, "Failed to setup RTCP on RTP instance '%p'\n", instance);
2177 close(rtp->rtcp->s);
2178 ast_free(rtp->rtcp);
2183 ast_debug(1, "Setup RTCP on RTP instance '%p'\n", instance);
2184 rtp->rtcp->schedid = -1;
2192 static int ast_rtp_fd(struct ast_rtp_instance *instance, int rtcp)
2194 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2196 return rtcp ? (rtp->rtcp ? rtp->rtcp->s : -1) : rtp->s;
2199 static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct sockaddr_in *sin)
2201 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2204 ast_debug(1, "Setting RTCP address on RTP instance '%p'\n", instance);
2205 memcpy(&rtp->rtcp->them, sin, sizeof(rtp->rtcp->them));
2206 rtp->rtcp->them.sin_port = htons(ntohs(sin->sin_port) + 1);
2212 rtp->strict_rtp_state = STRICT_RTP_LEARN;
2218 static void ast_rtp_alt_remote_address_set(struct ast_rtp_instance *instance, struct sockaddr_in *sin)
2220 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2222 /* No need to futz with rtp->rtcp here because ast_rtcp_read is already able to adjust if receiving
2223 * RTCP from an "unexpected" source
2225 rtp->alt_rtp_address = *sin;
2230 /*! \brief Write t140 redundacy frame
2231 * \param data primary data to be buffered
2233 static int red_write(const void *data)
2235 struct ast_rtp_instance *instance = (struct ast_rtp_instance*) data;
2236 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2238 ast_rtp_write(instance, &rtp->red->t140);
2243 static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations)
2245 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2248 if (!(rtp->red = ast_calloc(1, sizeof(*rtp->red)))) {
2252 rtp->red->t140.frametype = AST_FRAME_TEXT;
2253 rtp->red->t140.subclass = AST_FORMAT_T140RED;
2254 rtp->red->t140.data.ptr = &rtp->red->buf_data;
2256 rtp->red->t140.ts = 0;
2257 rtp->red->t140red = rtp->red->t140;
2258 rtp->red->t140red.data.ptr = &rtp->red->t140red_data;
2259 rtp->red->t140red.datalen = 0;
2260 rtp->red->ti = buffer_time;
2261 rtp->red->num_gen = generations;
2262 rtp->red->hdrlen = generations * 4 + 1;
2263 rtp->red->prev_ts = 0;
2265 for (x = 0; x < generations; x++) {
2266 rtp->red->pt[x] = payloads[x];
2267 rtp->red->pt[x] |= 1 << 7; /* mark redundant generations pt */
2268 rtp->red->t140red_data[x*4] = rtp->red->pt[x];
2270 rtp->red->t140red_data[x*4] = rtp->red->pt[x] = payloads[x]; /* primary pt */
2271 rtp->red->schedid = ast_sched_add(rtp->sched, generations, red_write, instance);
2273 rtp->red->t140.datalen = 0;
2278 static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame)
2280 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2282 if (frame->datalen > -1) {
2283 struct rtp_red *red = rtp->red;
2284 memcpy(&red->buf_data[red->t140.datalen], frame->data.ptr, frame->datalen);
2285 red->t140.datalen += frame->datalen;
2286 red->t140.ts = frame->ts;
2292 static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_rtp_instance *instance1)
2294 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance0);
2296 ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
2301 static int ast_rtp_get_stat(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat)
2303 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2309 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXCOUNT, -1, stats->txcount, rtp->txcount);
2310 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RXCOUNT, -1, stats->rxcount, rtp->rxcount);
2312 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->txploss, rtp->rtcp->reported_lost);
2313 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);
2314 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MAXRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_maxrxploss, rtp->rtcp->reported_maxlost);
2315 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MINRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_minrxploss, rtp->rtcp->reported_minlost);
2316 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_normdevrxploss, rtp->rtcp->reported_normdev_lost);
2317 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_STDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_stdevrxploss, rtp->rtcp->reported_stdev_lost);
2318 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MAXRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_maxrxploss, rtp->rtcp->maxrxlost);
2319 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MINRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_minrxploss, rtp->rtcp->minrxlost);
2320 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_normdevrxploss, rtp->rtcp->normdev_rxlost);
2321 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_STDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_stdevrxploss, rtp->rtcp->stdev_rxlost);
2322 AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_LOSS);
2324 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->txjitter, rtp->rxjitter);
2325 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);
2326 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MAXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_maxjitter, rtp->rtcp->reported_maxjitter);
2327 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MINJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_minjitter, rtp->rtcp->reported_minjitter);
2328 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_normdevjitter, rtp->rtcp->reported_normdev_jitter);
2329 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_STDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_stdevjitter, rtp->rtcp->reported_stdev_jitter);
2330 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MAXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_maxjitter, rtp->rtcp->maxrxjitter);
2331 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MINJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_minjitter, rtp->rtcp->minrxjitter);
2332 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_normdevjitter, rtp->rtcp->normdev_rxjitter);
2333 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_STDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_stdevjitter, rtp->rtcp->stdev_rxjitter);
2334 AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_JITTER);
2336 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->rtt, rtp->rtcp->rtt);
2337 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_MAX_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->maxrtt, rtp->rtcp->maxrtt);
2338 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_MIN_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->minrtt, rtp->rtcp->minrtt);
2339 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_NORMDEVRTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->normdevrtt, rtp->rtcp->normdevrtt);
2340 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_STDEVRTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->stdevrtt, rtp->rtcp->stdevrtt);
2341 AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_RTT);
2343 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_SSRC, -1, stats->local_ssrc, rtp->ssrc);
2344 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_SSRC, -1, stats->remote_ssrc, rtp->themssrc);
2349 static int ast_rtp_dtmf_compatible(struct ast_channel *chan0, struct ast_rtp_instance *instance0, struct ast_channel *chan1, struct ast_rtp_instance *instance1)
2351 /* If both sides are not using the same method of DTMF transmission
2352 * (ie: one is RFC2833, other is INFO... then we can not do direct media.
2353 * --------------------------------------------------
2354 * | DTMF Mode | HAS_DTMF | Accepts Begin Frames |
2355 * |-----------|------------|-----------------------|
2356 * | Inband | False | True |
2357 * | RFC2833 | True | True |
2358 * | SIP INFO | False | False |
2359 * --------------------------------------------------
2361 return (((ast_rtp_instance_get_prop(instance0, AST_RTP_PROPERTY_DTMF) != ast_rtp_instance_get_prop(instance1, AST_RTP_PROPERTY_DTMF)) ||
2362 (!chan0->tech->send_digit_begin != !chan1->tech->send_digit_begin)) ? 0 : 1);
2365 static void ast_rtp_stun_request(struct ast_rtp_instance *instance, struct sockaddr_in *suggestion, const char *username)
2367 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2369 ast_stun_request(rtp->s, suggestion, username, NULL);
2372 static void ast_rtp_stop(struct ast_rtp_instance *instance)
2374 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2375 struct sockaddr_in sin = { 0, };
2378 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
2381 AST_SCHED_DEL(rtp->sched, rtp->red->schedid);
2386 ast_rtp_instance_set_remote_address(instance, &sin);
2388 memset(&rtp->rtcp->them.sin_addr, 0, sizeof(rtp->rtcp->them.sin_addr));
2389 memset(&rtp->rtcp->them.sin_port, 0, sizeof(rtp->rtcp->them.sin_port));
2392 ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
2395 static char *rtp_do_debug_ip(struct ast_cli_args *a)
2398 struct ast_hostent ahp;
2400 char *p, *arg = ast_strdupa(a->argv[3]);
2402 p = strstr(arg, ":");
2408 hp = ast_gethostbyname(arg, &ahp);
2410 ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
2413 rtpdebugaddr.sin_family = AF_INET;
2414 memcpy(&rtpdebugaddr.sin_addr, hp->h_addr, sizeof(rtpdebugaddr.sin_addr));
2415 rtpdebugaddr.sin_port = htons(port);
2417 ast_cli(a->fd, "RTP Debugging Enabled for IP: %s\n", ast_inet_ntoa(rtpdebugaddr.sin_addr));
2419 ast_cli(a->fd, "RTP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(rtpdebugaddr.sin_addr), port);
2424 static char *rtcp_do_debug_ip(struct ast_cli_args *a)
2427 struct ast_hostent ahp;
2429 char *p, *arg = ast_strdupa(a->argv[3]);
2431 p = strstr(arg, ":");
2437 hp = ast_gethostbyname(arg, &ahp);
2439 ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
2442 rtcpdebugaddr.sin_family = AF_INET;
2443 memcpy(&rtcpdebugaddr.sin_addr, hp->h_addr, sizeof(rtcpdebugaddr.sin_addr));
2444 rtcpdebugaddr.sin_port = htons(port);
2446 ast_cli(a->fd, "RTCP Debugging Enabled for IP: %s\n", ast_inet_ntoa(rtcpdebugaddr.sin_addr));
2448 ast_cli(a->fd, "RTCP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(rtcpdebugaddr.sin_addr), port);
2453 static char *handle_cli_rtp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
2457 e->command = "rtp set debug {on|off|ip}";
2459 "Usage: rtp set debug {on|off|ip host[:port]}\n"
2460 " Enable/Disable dumping of all RTP packets. If 'ip' is\n"
2461 " specified, limit the dumped packets to those to and from\n"
2462 " the specified 'host' with optional port.\n";
2468 if (a->argc == e->args) { /* set on or off */
2469 if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
2471 memset(&rtpdebugaddr, 0, sizeof(rtpdebugaddr));
2472 ast_cli(a->fd, "RTP Debugging Enabled\n");
2474 } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
2476 ast_cli(a->fd, "RTP Debugging Disabled\n");
2479 } else if (a->argc == e->args +1) { /* ip */
2480 return rtp_do_debug_ip(a);
2483 return CLI_SHOWUSAGE; /* default, failure */
2486 static char *handle_cli_rtcp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
2490 e->command = "rtcp set debug {on|off|ip}";
2492 "Usage: rtcp set debug {on|off|ip host[:port]}\n"
2493 " Enable/Disable dumping of all RTCP packets. If 'ip' is\n"
2494 " specified, limit the dumped packets to those to and from\n"
2495 " the specified 'host' with optional port.\n";
2501 if (a->argc == e->args) { /* set on or off */
2502 if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
2504 memset(&rtcpdebugaddr, 0, sizeof(rtcpdebugaddr));
2505 ast_cli(a->fd, "RTCP Debugging Enabled\n");
2507 } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
2509 ast_cli(a->fd, "RTCP Debugging Disabled\n");
2512 } else if (a->argc == e->args +1) { /* ip */
2513 return rtcp_do_debug_ip(a);
2516 return CLI_SHOWUSAGE; /* default, failure */
2519 static char *handle_cli_rtcp_set_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
2523 e->command = "rtcp set stats {on|off}";
2525 "Usage: rtcp set stats {on|off}\n"
2526 " Enable/Disable dumping of RTCP stats.\n";
2532 if (a->argc != e->args)
2533 return CLI_SHOWUSAGE;
2535 if (!strncasecmp(a->argv[e->args-1], "on", 2))
2537 else if (!strncasecmp(a->argv[e->args-1], "off", 3))
2540 return CLI_SHOWUSAGE;
2542 ast_cli(a->fd, "RTCP Stats %s\n", rtcpstats ? "Enabled" : "Disabled");
2546 static struct ast_cli_entry cli_rtp[] = {
2547 AST_CLI_DEFINE(handle_cli_rtp_set_debug, "Enable/Disable RTP debugging"),
2548 AST_CLI_DEFINE(handle_cli_rtcp_set_debug, "Enable/Disable RTCP debugging"),
2549 AST_CLI_DEFINE(handle_cli_rtcp_set_stats, "Enable/Disable RTCP stats"),
2552 static int rtp_reload(int reload)
2554 struct ast_config *cfg;
2556 struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
2558 cfg = ast_config_load2("rtp.conf", "rtp", config_flags);
2559 if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID) {
2563 rtpstart = DEFAULT_RTP_START;
2564 rtpend = DEFAULT_RTP_END;
2565 dtmftimeout = DEFAULT_DTMF_TIMEOUT;
2566 strictrtp = STRICT_RTP_OPEN;
2568 if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
2570 if (rtpstart < MINIMUM_RTP_PORT)
2571 rtpstart = MINIMUM_RTP_PORT;
2572 if (rtpstart > MAXIMUM_RTP_PORT)
2573 rtpstart = MAXIMUM_RTP_PORT;
2575 if ((s = ast_variable_retrieve(cfg, "general", "rtpend"))) {
2577 if (rtpend < MINIMUM_RTP_PORT)
2578 rtpend = MINIMUM_RTP_PORT;
2579 if (rtpend > MAXIMUM_RTP_PORT)
2580 rtpend = MAXIMUM_RTP_PORT;
2582 if ((s = ast_variable_retrieve(cfg, "general", "rtcpinterval"))) {
2583 rtcpinterval = atoi(s);
2584 if (rtcpinterval == 0)
2585 rtcpinterval = 0; /* Just so we're clear... it's zero */
2586 if (rtcpinterval < RTCP_MIN_INTERVALMS)
2587 rtcpinterval = RTCP_MIN_INTERVALMS; /* This catches negative numbers too */
2588 if (rtcpinterval > RTCP_MAX_INTERVALMS)
2589 rtcpinterval = RTCP_MAX_INTERVALMS;
2591 if ((s = ast_variable_retrieve(cfg, "general", "rtpchecksums"))) {
2593 nochecksums = ast_false(s) ? 1 : 0;
2596 ast_log(LOG_WARNING, "Disabling RTP checksums is not supported on this operating system!\n");
2599 if ((s = ast_variable_retrieve(cfg, "general", "dtmftimeout"))) {
2600 dtmftimeout = atoi(s);
2601 if ((dtmftimeout < 0) || (dtmftimeout > 64000)) {
2602 ast_log(LOG_WARNING, "DTMF timeout of '%d' outside range, using default of '%d' instead\n",
2603 dtmftimeout, DEFAULT_DTMF_TIMEOUT);
2604 dtmftimeout = DEFAULT_DTMF_TIMEOUT;
2607 if ((s = ast_variable_retrieve(cfg, "general", "strictrtp"))) {
2608 strictrtp = ast_true(s);
2610 ast_config_destroy(cfg);
2612 if (rtpstart >= rtpend) {
2613 ast_log(LOG_WARNING, "Unreasonable values for RTP start/end port in rtp.conf\n");
2614 rtpstart = DEFAULT_RTP_START;
2615 rtpend = DEFAULT_RTP_END;
2617 ast_verb(2, "RTP Allocating from port range %d -> %d\n", rtpstart, rtpend);
2621 static int reload_module(void)
2627 static int load_module(void)
2629 if (ast_rtp_engine_register(&asterisk_rtp_engine)) {
2630 return AST_MODULE_LOAD_DECLINE;
2633 if (ast_cli_register_multiple(cli_rtp, ARRAY_LEN(cli_rtp))) {
2634 ast_rtp_engine_unregister(&asterisk_rtp_engine);
2635 return AST_MODULE_LOAD_DECLINE;
2640 return AST_MODULE_LOAD_SUCCESS;
2643 static int unload_module(void)
2645 ast_rtp_engine_unregister(&asterisk_rtp_engine);
2646 ast_cli_unregister_multiple(cli_rtp, ARRAY_LEN(cli_rtp));
2651 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Asterisk RTP Stack",
2652 .load = load_module,
2653 .unload = unload_module,
2654 .reload = reload_module,