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);
663 if (!ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_CONSTANT_SSRC)) {
664 ast_log(LOG_ERROR, "Changing ssrc\n");
665 rtp->ssrc = ast_random();
671 static unsigned int calc_txstamp(struct ast_rtp *rtp, struct timeval *delivery)
676 if (ast_tvzero(rtp->txcore)) {
677 rtp->txcore = ast_tvnow();
678 rtp->txcore.tv_usec -= rtp->txcore.tv_usec % 20000;
681 t = (delivery && !ast_tvzero(*delivery)) ? *delivery : ast_tvnow();
682 if ((ms = ast_tvdiff_ms(t, rtp->txcore)) < 0) {
687 return (unsigned int) ms;
690 static void timeval2ntp(struct timeval tv, unsigned int *msw, unsigned int *lsw)
692 unsigned int sec, usec, frac;
693 sec = tv.tv_sec + 2208988800u; /* Sec between 1900 and 1970 */
695 frac = (usec << 12) + (usec << 8) - ((usec * 3650) >> 6);
700 /*! \brief Send RTCP recipient's report */
701 static int ast_rtcp_write_rr(const void *data)
703 struct ast_rtp *rtp = (struct ast_rtp *)data;
707 unsigned int extended;
708 unsigned int expected;
709 unsigned int expected_interval;
710 unsigned int received_interval;
713 unsigned int *rtcpheader;
718 double rxlost_current;
720 if (!rtp || !rtp->rtcp || (&rtp->rtcp->them.sin_addr == 0))
723 if (!rtp->rtcp->them.sin_addr.s_addr) {
724 ast_log(LOG_ERROR, "RTCP RR transmission error, rtcp halted\n");
725 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
729 extended = rtp->cycles + rtp->lastrxseqno;
730 expected = extended - rtp->seedrxseqno + 1;
731 lost = expected - rtp->rxcount;
732 expected_interval = expected - rtp->rtcp->expected_prior;
733 rtp->rtcp->expected_prior = expected;
734 received_interval = rtp->rxcount - rtp->rtcp->received_prior;
735 rtp->rtcp->received_prior = rtp->rxcount;
736 lost_interval = expected_interval - received_interval;
738 if (lost_interval <= 0)
739 rtp->rtcp->rxlost = 0;
740 else rtp->rtcp->rxlost = rtp->rtcp->rxlost;
741 if (rtp->rtcp->rxlost_count == 0)
742 rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
743 if (lost_interval < rtp->rtcp->minrxlost)
744 rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
745 if (lost_interval > rtp->rtcp->maxrxlost)
746 rtp->rtcp->maxrxlost = rtp->rtcp->rxlost;
748 rxlost_current = normdev_compute(rtp->rtcp->normdev_rxlost, rtp->rtcp->rxlost, rtp->rtcp->rxlost_count);
749 rtp->rtcp->stdev_rxlost = stddev_compute(rtp->rtcp->stdev_rxlost, rtp->rtcp->rxlost, rtp->rtcp->normdev_rxlost, rxlost_current, rtp->rtcp->rxlost_count);
750 rtp->rtcp->normdev_rxlost = rxlost_current;
751 rtp->rtcp->rxlost_count++;
753 if (expected_interval == 0 || lost_interval <= 0)
756 fraction = (lost_interval << 8) / expected_interval;
757 gettimeofday(&now, NULL);
758 timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
759 rtcpheader = (unsigned int *)bdata;
760 rtcpheader[0] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_RR << 16) | ((len/4)-1));
761 rtcpheader[1] = htonl(rtp->ssrc);
762 rtcpheader[2] = htonl(rtp->themssrc);
763 rtcpheader[3] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
764 rtcpheader[4] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
765 rtcpheader[5] = htonl((unsigned int)(rtp->rxjitter * 65536.));
766 rtcpheader[6] = htonl(rtp->rtcp->themrxlsr);
767 rtcpheader[7] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
769 /*! \note Insert SDES here. Probably should make SDES text equal to mimetypes[code].type (not subtype 'cos
770 it can change mid call, and SDES can't) */
771 rtcpheader[len/4] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | 2);
772 rtcpheader[(len/4)+1] = htonl(rtp->ssrc); /* Our SSRC */
773 rtcpheader[(len/4)+2] = htonl(0x01 << 24); /* Empty for the moment */
776 res = sendto(rtp->rtcp->s, (unsigned int *)rtcpheader, len, 0, (struct sockaddr *)&rtp->rtcp->them, sizeof(rtp->rtcp->them));
779 ast_log(LOG_ERROR, "RTCP RR transmission error, rtcp halted: %s\n",strerror(errno));
780 /* Remove the scheduler */
781 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
785 rtp->rtcp->rr_count++;
786 if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
787 ast_verbose("\n* Sending RTCP RR to %s:%d\n"
788 " Our SSRC: %u\nTheir SSRC: %u\niFraction lost: %d\nCumulative loss: %u\n"
790 " Their last SR: %u\n"
791 " DLSR: %4.4f (sec)\n\n",
792 ast_inet_ntoa(rtp->rtcp->them.sin_addr),
793 ntohs(rtp->rtcp->them.sin_port),
794 rtp->ssrc, rtp->themssrc, fraction, lost,
796 rtp->rtcp->themrxlsr,
797 (double)(ntohl(rtcpheader[7])/65536.0));
803 /*! \brief Send RTCP sender's report */
804 static int ast_rtcp_write_sr(const void *data)
806 struct ast_rtp *rtp = (struct ast_rtp *)data;
810 unsigned int now_lsw;
811 unsigned int now_msw;
812 unsigned int *rtcpheader;
814 unsigned int extended;
815 unsigned int expected;
816 unsigned int expected_interval;
817 unsigned int received_interval;
823 /* Commented condition is always not NULL if rtp->rtcp is not NULL */
824 if (!rtp || !rtp->rtcp/* || (&rtp->rtcp->them.sin_addr == 0)*/)
827 if (!rtp->rtcp->them.sin_addr.s_addr) { /* This'll stop rtcp for this rtp session */
828 ast_verbose("RTCP SR transmission error, rtcp halted\n");
829 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
833 gettimeofday(&now, NULL);
834 timeval2ntp(now, &now_msw, &now_lsw); /* fill thses ones in from utils.c*/
835 rtcpheader = (unsigned int *)bdata;
836 rtcpheader[1] = htonl(rtp->ssrc); /* Our SSRC */
837 rtcpheader[2] = htonl(now_msw); /* now, MSW. gettimeofday() + SEC_BETWEEN_1900_AND_1970*/
838 rtcpheader[3] = htonl(now_lsw); /* now, LSW */
839 rtcpheader[4] = htonl(rtp->lastts); /* FIXME shouldn't be that, it should be now */
840 rtcpheader[5] = htonl(rtp->txcount); /* No. packets sent */
841 rtcpheader[6] = htonl(rtp->txoctetcount); /* No. bytes sent */
844 extended = rtp->cycles + rtp->lastrxseqno;
845 expected = extended - rtp->seedrxseqno + 1;
846 if (rtp->rxcount > expected)
847 expected += rtp->rxcount - expected;
848 lost = expected - rtp->rxcount;
849 expected_interval = expected - rtp->rtcp->expected_prior;
850 rtp->rtcp->expected_prior = expected;
851 received_interval = rtp->rxcount - rtp->rtcp->received_prior;
852 rtp->rtcp->received_prior = rtp->rxcount;
853 lost_interval = expected_interval - received_interval;
854 if (expected_interval == 0 || lost_interval <= 0)
857 fraction = (lost_interval << 8) / expected_interval;
858 timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
859 rtcpheader[7] = htonl(rtp->themssrc);
860 rtcpheader[8] = htonl(((fraction & 0xff) << 24) | (lost & 0xffffff));
861 rtcpheader[9] = htonl((rtp->cycles) | ((rtp->lastrxseqno & 0xffff)));
862 rtcpheader[10] = htonl((unsigned int)(rtp->rxjitter * 65536.));
863 rtcpheader[11] = htonl(rtp->rtcp->themrxlsr);
864 rtcpheader[12] = htonl((((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000);
867 rtcpheader[0] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SR << 16) | ((len/4)-1));
869 /* Insert SDES here. Probably should make SDES text equal to mimetypes[code].type (not subtype 'cos */
870 /* it can change mid call, and SDES can't) */
871 rtcpheader[len/4] = htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | 2);
872 rtcpheader[(len/4)+1] = htonl(rtp->ssrc); /* Our SSRC */
873 rtcpheader[(len/4)+2] = htonl(0x01 << 24); /* Empty for the moment */
876 res = sendto(rtp->rtcp->s, (unsigned int *)rtcpheader, len, 0, (struct sockaddr *)&rtp->rtcp->them, sizeof(rtp->rtcp->them));
878 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));
879 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
883 /* FIXME Don't need to get a new one */
884 gettimeofday(&rtp->rtcp->txlsr, NULL);
885 rtp->rtcp->sr_count++;
887 rtp->rtcp->lastsrtxcount = rtp->txcount;
889 if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
890 ast_verbose("* Sent RTCP SR to %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
891 ast_verbose(" Our SSRC: %u\n", rtp->ssrc);
892 ast_verbose(" Sent(NTP): %u.%010u\n", (unsigned int)now.tv_sec, (unsigned int)now.tv_usec*4096);
893 ast_verbose(" Sent(RTP): %u\n", rtp->lastts);
894 ast_verbose(" Sent packets: %u\n", rtp->txcount);
895 ast_verbose(" Sent octets: %u\n", rtp->txoctetcount);
896 ast_verbose(" Report block:\n");
897 ast_verbose(" Fraction lost: %u\n", fraction);
898 ast_verbose(" Cumulative loss: %u\n", lost);
899 ast_verbose(" IA jitter: %.4f\n", rtp->rxjitter);
900 ast_verbose(" Their last SR: %u\n", rtp->rtcp->themrxlsr);
901 ast_verbose(" DLSR: %4.4f (sec)\n\n", (double)(ntohl(rtcpheader[12])/65536.0));
903 manager_event(EVENT_FLAG_REPORTING, "RTCPSent", "To %s:%d\r\n"
905 "SentNTP: %u.%010u\r\n"
907 "SentPackets: %u\r\n"
910 "FractionLost: %u\r\n"
911 "CumulativeLoss: %u\r\n"
913 "TheirLastSR: %u\r\n"
914 "DLSR: %4.4f (sec)\r\n",
915 ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port),
917 (unsigned int)now.tv_sec, (unsigned int)now.tv_usec*4096,
924 rtp->rtcp->themrxlsr,
925 (double)(ntohl(rtcpheader[12])/65536.0));
929 /*! \brief Write and RTCP packet to the far end
930 * \note Decide if we are going to send an SR (with Reception Block) or RR
931 * RR is sent if we have not sent any rtp packets in the previous interval */
932 static int ast_rtcp_write(const void *data)
934 struct ast_rtp *rtp = (struct ast_rtp *)data;
937 if (!rtp || !rtp->rtcp)
940 if (rtp->txcount > rtp->rtcp->lastsrtxcount)
941 res = ast_rtcp_write_sr(data);
943 res = ast_rtcp_write_rr(data);
948 static int ast_rtp_raw_write(struct ast_rtp_instance *instance, struct ast_frame *frame, int codec)
950 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
952 unsigned int ms = calc_txstamp(rtp, &frame->delivery);
953 struct sockaddr_in remote_address = { 0, };
954 int rate = rtp_get_rate(frame->subclass) / 1000;
956 if (frame->subclass == AST_FORMAT_G722) {
960 if (rtp->sending_digit) {
964 if (frame->frametype == AST_FRAME_VOICE) {
965 pred = rtp->lastts + frame->samples;
967 /* Re-calculate last TS */
968 rtp->lastts = rtp->lastts + ms * rate;
969 if (ast_tvzero(frame->delivery)) {
970 /* If this isn't an absolute delivery time, Check if it is close to our prediction,
971 and if so, go with our prediction */
972 if (abs(rtp->lastts - pred) < MAX_TIMESTAMP_SKEW) {
975 ast_debug(3, "Difference is %d, ms is %d\n", abs(rtp->lastts - pred), ms);
979 } else if (frame->frametype == AST_FRAME_VIDEO) {
980 mark = frame->subclass & 0x1;
981 pred = rtp->lastovidtimestamp + frame->samples;
982 /* Re-calculate last TS */
983 rtp->lastts = rtp->lastts + ms * 90;
984 /* If it's close to our prediction, go for it */
985 if (ast_tvzero(frame->delivery)) {
986 if (abs(rtp->lastts - pred) < 7200) {
988 rtp->lastovidtimestamp += frame->samples;
990 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);
991 rtp->lastovidtimestamp = rtp->lastts;
995 pred = rtp->lastotexttimestamp + frame->samples;
996 /* Re-calculate last TS */
997 rtp->lastts = rtp->lastts + ms;
998 /* If it's close to our prediction, go for it */
999 if (ast_tvzero(frame->delivery)) {
1000 if (abs(rtp->lastts - pred) < 7200) {
1002 rtp->lastotexttimestamp += frame->samples;
1004 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);
1005 rtp->lastotexttimestamp = rtp->lastts;
1010 /* If we have been explicitly told to set the marker bit then do so */
1011 if (ast_test_flag(rtp, FLAG_NEED_MARKER_BIT)) {
1013 ast_clear_flag(rtp, FLAG_NEED_MARKER_BIT);
1016 /* If the timestamp for non-digt packets has moved beyond the timestamp for digits, update the digit timestamp */
1017 if (rtp->lastts > rtp->lastdigitts) {
1018 rtp->lastdigitts = rtp->lastts;
1021 if (ast_test_flag(frame, AST_FRFLAG_HAS_TIMING_INFO)) {
1022 rtp->lastts = frame->ts * rate;
1025 ast_rtp_instance_get_remote_address(instance, &remote_address);
1027 /* If we know the remote address construct a packet and send it out */
1028 if (remote_address.sin_port && remote_address.sin_addr.s_addr) {
1029 int hdrlen = 12, res;
1030 unsigned char *rtpheader = (unsigned char *)(frame->data.ptr - hdrlen);
1032 put_unaligned_uint32(rtpheader, htonl((2 << 30) | (codec << 16) | (rtp->seqno) | (mark << 23)));
1033 put_unaligned_uint32(rtpheader + 4, htonl(rtp->lastts));
1034 put_unaligned_uint32(rtpheader + 8, htonl(rtp->ssrc));
1036 if ((res = sendto(rtp->s, (void *)rtpheader, frame->datalen + hdrlen, 0, (struct sockaddr *)&remote_address, sizeof(remote_address))) < 0) {
1037 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))) {
1038 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));
1039 } else if (((ast_test_flag(rtp, FLAG_NAT_ACTIVE) == FLAG_NAT_INACTIVE) || rtpdebug) && !ast_test_flag(rtp, FLAG_NAT_INACTIVE_NOWARN)) {
1040 /* Only give this error message once if we are not RTP debugging */
1041 if (option_debug || rtpdebug)
1042 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));
1043 ast_set_flag(rtp, FLAG_NAT_INACTIVE_NOWARN);
1047 rtp->txoctetcount += (res - hdrlen);
1049 if (rtp->rtcp && rtp->rtcp->schedid < 1) {
1050 ast_debug(1, "Starting RTCP transmission on RTP instance '%p'\n", instance);
1051 rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, rtp);
1055 if (rtp_debug_test_addr(&remote_address)) {
1056 ast_verbose("Sent RTP packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
1057 ast_inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port), codec, rtp->seqno, rtp->lastts, res - hdrlen);
1066 static struct ast_frame *red_t140_to_red(struct rtp_red *red) {
1067 unsigned char *data = red->t140red.data.ptr;
1071 /* replace most aged generation */
1073 for (i = 1; i < red->num_gen+1; i++)
1076 memmove(&data[red->hdrlen], &data[red->hdrlen+red->len[0]], len);
1079 /* Store length of each generation and primary data length*/
1080 for (i = 0; i < red->num_gen; i++)
1081 red->len[i] = red->len[i+1];
1082 red->len[i] = red->t140.datalen;
1084 /* write each generation length in red header */
1086 for (i = 0; i < red->num_gen; i++)
1087 len += data[i*4+3] = red->len[i];
1089 /* add primary data to buffer */
1090 memcpy(&data[len], red->t140.data.ptr, red->t140.datalen);
1091 red->t140red.datalen = len + red->t140.datalen;
1093 /* no primary data and no generations to send */
1094 if (len == red->hdrlen && !red->t140.datalen)
1097 /* reset t.140 buffer */
1098 red->t140.datalen = 0;
1100 return &red->t140red;
1103 static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame)
1105 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1106 struct sockaddr_in remote_address = { 0, };
1107 int codec, subclass;
1109 ast_rtp_instance_get_remote_address(instance, &remote_address);
1111 /* If we don't actually know the remote address don't even bother doing anything */
1112 if (!remote_address.sin_addr.s_addr) {
1113 ast_debug(1, "No remote address on RTP instance '%p' so dropping frame\n", instance);
1117 /* If there is no data length we can't very well send the packet */
1118 if (!frame->datalen) {
1119 ast_debug(1, "Received frame with no data for RTP instance '%p' so dropping frame\n", instance);
1123 /* If the packet is not one our RTP stack supports bail out */
1124 if (frame->frametype != AST_FRAME_VOICE && frame->frametype != AST_FRAME_VIDEO && frame->frametype != AST_FRAME_TEXT) {
1125 ast_log(LOG_WARNING, "RTP can only send voice, video, and text\n");
1131 /* no primary data or generations to send */
1132 if ((frame = red_t140_to_red(rtp->red)) == NULL)
1136 /* Grab the subclass and look up the payload we are going to use */
1137 subclass = frame->subclass;
1138 if (frame->frametype == AST_FRAME_VIDEO) {
1141 if ((codec = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance), 1, subclass)) < 0) {
1142 ast_log(LOG_WARNING, "Don't know how to send format %s packets with RTP\n", ast_getformatname(frame->subclass));
1146 /* Oh dear, if the format changed we will have to set up a new smoother */
1147 if (rtp->lasttxformat != subclass) {
1148 ast_debug(1, "Ooh, format changed from %s to %s\n", ast_getformatname(rtp->lasttxformat), ast_getformatname(subclass));
1149 rtp->lasttxformat = subclass;
1150 if (rtp->smoother) {
1151 ast_smoother_free(rtp->smoother);
1152 rtp->smoother = NULL;
1156 /* If no smoother is present see if we have to set one up */
1157 if (!rtp->smoother) {
1158 struct ast_format_list fmt = ast_codec_pref_getsize(&ast_rtp_instance_get_codecs(instance)->pref, subclass);
1161 case AST_FORMAT_SPEEX:
1162 case AST_FORMAT_G723_1:
1163 case AST_FORMAT_SIREN7:
1164 case AST_FORMAT_SIREN14:
1165 /* these are all frame-based codecs and cannot be safely run through
1170 if (!(rtp->smoother = ast_smoother_new((fmt.cur_ms * fmt.fr_len) / fmt.inc_ms))) {
1171 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));
1175 ast_smoother_set_flags(rtp->smoother, fmt.flags);
1177 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));
1182 /* Feed audio frames into the actual function that will create a frame and send it */
1183 if (rtp->smoother) {
1184 struct ast_frame *f;
1186 if (ast_smoother_test_flag(rtp->smoother, AST_SMOOTHER_FLAG_BE)) {
1187 ast_smoother_feed_be(rtp->smoother, frame);
1189 ast_smoother_feed(rtp->smoother, frame);
1192 while ((f = ast_smoother_read(rtp->smoother)) && (f->data.ptr)) {
1193 ast_rtp_raw_write(instance, f, codec);
1197 struct ast_frame *f = NULL;
1199 if (frame->offset < hdrlen) {
1200 f = ast_frdup(frame);
1205 ast_rtp_raw_write(instance, f, codec);
1216 static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int timestamp, int mark)
1220 double current_time;
1224 int rate = rtp_get_rate(rtp->f.subclass);
1226 double normdev_rxjitter_current;
1227 if ((!rtp->rxcore.tv_sec && !rtp->rxcore.tv_usec) || mark) {
1228 gettimeofday(&rtp->rxcore, NULL);
1229 rtp->drxcore = (double) rtp->rxcore.tv_sec + (double) rtp->rxcore.tv_usec / 1000000;
1230 /* map timestamp to a real time */
1231 rtp->seedrxts = timestamp; /* Their RTP timestamp started with this */
1232 rtp->rxcore.tv_sec -= timestamp / rate;
1233 rtp->rxcore.tv_usec -= (timestamp % rate) * 125;
1234 /* Round to 0.1ms for nice, pretty timestamps */
1235 rtp->rxcore.tv_usec -= rtp->rxcore.tv_usec % 100;
1236 if (rtp->rxcore.tv_usec < 0) {
1237 /* Adjust appropriately if necessary */
1238 rtp->rxcore.tv_usec += 1000000;
1239 rtp->rxcore.tv_sec -= 1;
1243 gettimeofday(&now,NULL);
1244 /* rxcore is the mapping between the RTP timestamp and _our_ real time from gettimeofday() */
1245 tv->tv_sec = rtp->rxcore.tv_sec + timestamp / rate;
1246 tv->tv_usec = rtp->rxcore.tv_usec + (timestamp % rate) * 125;
1247 if (tv->tv_usec >= 1000000) {
1248 tv->tv_usec -= 1000000;
1251 prog = (double)((timestamp-rtp->seedrxts)/(float)(rate));
1252 dtv = (double)rtp->drxcore + (double)(prog);
1253 current_time = (double)now.tv_sec + (double)now.tv_usec/1000000;
1254 transit = current_time - dtv;
1255 d = transit - rtp->rxtransit;
1256 rtp->rxtransit = transit;
1259 rtp->rxjitter += (1./16.) * (d - rtp->rxjitter);
1262 if (rtp->rxjitter > rtp->rtcp->maxrxjitter)
1263 rtp->rtcp->maxrxjitter = rtp->rxjitter;
1264 if (rtp->rtcp->rxjitter_count == 1)
1265 rtp->rtcp->minrxjitter = rtp->rxjitter;
1266 if (rtp->rtcp && rtp->rxjitter < rtp->rtcp->minrxjitter)
1267 rtp->rtcp->minrxjitter = rtp->rxjitter;
1269 normdev_rxjitter_current = normdev_compute(rtp->rtcp->normdev_rxjitter,rtp->rxjitter,rtp->rtcp->rxjitter_count);
1270 rtp->rtcp->stdev_rxjitter = stddev_compute(rtp->rtcp->stdev_rxjitter,rtp->rxjitter,rtp->rtcp->normdev_rxjitter,normdev_rxjitter_current,rtp->rtcp->rxjitter_count);
1272 rtp->rtcp->normdev_rxjitter = normdev_rxjitter_current;
1273 rtp->rtcp->rxjitter_count++;
1277 static struct ast_frame *send_dtmf(struct ast_rtp_instance *instance, enum ast_frame_type type, int compensate)
1279 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1280 struct sockaddr_in remote_address = { 0, };
1282 ast_rtp_instance_get_remote_address(instance, &remote_address);
1284 if (((compensate && type == AST_FRAME_DTMF_END) || (type == AST_FRAME_DTMF_BEGIN)) && ast_tvcmp(ast_tvnow(), rtp->dtmfmute) < 0) {
1285 ast_debug(1, "Ignore potential DTMF echo from '%s'\n", ast_inet_ntoa(remote_address.sin_addr));
1287 rtp->dtmfsamples = 0;
1288 return &ast_null_frame;
1290 ast_debug(1, "Sending dtmf: %d (%c), at %s\n", rtp->resp, rtp->resp, ast_inet_ntoa(remote_address.sin_addr));
1291 if (rtp->resp == 'X') {
1292 rtp->f.frametype = AST_FRAME_CONTROL;
1293 rtp->f.subclass = AST_CONTROL_FLASH;
1295 rtp->f.frametype = type;
1296 rtp->f.subclass = rtp->resp;
1306 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)
1308 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1309 struct sockaddr_in remote_address = { 0, };
1310 unsigned int event, event_end, samples;
1312 struct ast_frame *f = NULL;
1314 ast_rtp_instance_get_remote_address(instance, &remote_address);
1316 /* Figure out event, event end, and samples */
1317 event = ntohl(*((unsigned int *)(data)));
1319 event_end = ntohl(*((unsigned int *)(data)));
1322 samples = ntohl(*((unsigned int *)(data)));
1325 if (rtp_debug_test_addr(&remote_address)) {
1326 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),
1327 ntohs(remote_address.sin_port), payloadtype, seqno, timestamp, len, (mark?1:0), event, ((event_end & 0x80)?1:0), samples);
1330 /* Print out debug if turned on */
1331 if (rtpdebug || option_debug > 2)
1332 ast_debug(0, "- RTP 2833 Event: %08x (len = %d)\n", event, len);
1334 /* Figure out what digit was pressed */
1337 } else if (event < 11) {
1339 } else if (event < 12) {
1341 } else if (event < 16) {
1342 resp = 'A' + (event - 12);
1343 } else if (event < 17) { /* Event 16: Hook flash */
1346 /* Not a supported event */
1347 ast_log(LOG_DEBUG, "Ignoring RTP 2833 Event: %08x. Not a DTMF Digit.\n", event);
1348 return &ast_null_frame;
1351 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)) {
1352 if ((rtp->lastevent != timestamp) || (rtp->resp && rtp->resp != resp)) {
1354 rtp->dtmf_timeout = 0;
1355 f = send_dtmf(instance, AST_FRAME_DTMF_END, ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE));
1357 rtp->lastevent = timestamp;
1360 /* The duration parameter measures the complete
1361 duration of the event (from the beginning) - RFC2833.
1362 Account for the fact that duration is only 16 bits long
1363 (about 8 seconds at 8000 Hz) and can wrap is digit
1364 is hold for too long. */
1365 unsigned int new_duration = rtp->dtmf_duration;
1366 unsigned int last_duration = new_duration & 0xFFFF;
1368 if (last_duration > 64000 && samples < last_duration) {
1369 new_duration += 0xFFFF + 1;
1371 new_duration = (new_duration & ~0xFFFF) | samples;
1373 if (event_end & 0x80) {
1375 if ((rtp->lastevent != seqno) && rtp->resp) {
1376 rtp->dtmf_duration = new_duration;
1377 f = send_dtmf(instance, AST_FRAME_DTMF_END, 0);
1378 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
1380 rtp->dtmf_duration = rtp->dtmf_timeout = 0;
1383 /* Begin/continuation */
1385 if (rtp->resp && rtp->resp != resp) {
1386 /* Another digit already began. End it */
1387 f = send_dtmf(instance, AST_FRAME_DTMF_END, 0);
1388 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
1390 rtp->dtmf_duration = rtp->dtmf_timeout = 0;
1394 /* Digit continues */
1395 rtp->dtmf_duration = new_duration;
1397 /* New digit began */
1399 f = send_dtmf(instance, AST_FRAME_DTMF_BEGIN, 0);
1400 rtp->dtmf_duration = samples;
1403 rtp->dtmf_timeout = timestamp + rtp->dtmf_duration + dtmftimeout;
1406 rtp->lastevent = seqno;
1409 rtp->dtmfsamples = samples;
1414 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)
1416 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1417 unsigned int event, flags, power;
1420 struct ast_frame *f = NULL;
1426 /* The format of Cisco RTP DTMF packet looks like next:
1427 +0 - sequence number of DTMF RTP packet (begins from 1,
1430 +1 (bit 0) - flaps by different DTMF digits delimited by audio
1431 or repeated digit without audio???
1432 +2 (+4,+6,...) - power level? (rises from 0 to 32 at begin of tone
1433 then falls to 0 at its end)
1434 +3 (+5,+7,...) - detected DTMF digit (0..9,*,#,A-D,...)
1435 Repeated DTMF information (bytes 4/5, 6/7) is history shifted right
1436 by each new packet and thus provides some redudancy.
1438 Sample of Cisco RTP DTMF packet is (all data in hex):
1439 19 07 00 02 12 02 20 02
1440 showing end of DTMF digit '2'.
1443 27 07 00 02 0A 02 20 02
1444 28 06 20 02 00 02 0A 02
1445 shows begin of new digit '2' with very short pause (20 ms) after
1446 previous digit '2'. Bit +1.0 flips at begin of new digit.
1448 Cisco RTP DTMF packets comes as replacement of audio RTP packets
1449 so its uses the same sequencing and timestamping rules as replaced
1450 audio packets. Repeat interval of DTMF packets is 20 ms and not rely
1451 on audio framing parameters. Marker bit isn't used within stream of
1452 DTMFs nor audio stream coming immediately after DTMF stream. Timestamps
1453 are not sequential at borders between DTMF and audio streams,
1459 event = data[3] & 0x1f;
1461 if (option_debug > 2 || rtpdebug)
1462 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);
1465 } else if (event < 11) {
1467 } else if (event < 12) {
1469 } else if (event < 16) {
1470 resp = 'A' + (event - 12);
1471 } else if (event < 17) {
1474 if ((!rtp->resp && power) || (rtp->resp && (rtp->resp != resp))) {
1476 /* Why we should care on DTMF compensation at reception? */
1477 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE)) {
1478 f = send_dtmf(instance, AST_FRAME_DTMF_BEGIN, 0);
1479 rtp->dtmfsamples = 0;
1481 } else if ((rtp->resp == resp) && !power) {
1482 f = send_dtmf(instance, AST_FRAME_DTMF_END, ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_DTMF_COMPENSATE));
1483 f->samples = rtp->dtmfsamples * (rtp_get_rate(f->subclass) / 1000);
1485 } else if (rtp->resp == resp)
1486 rtp->dtmfsamples += 20 * (rtp_get_rate(f->subclass) / 1000);
1487 rtp->dtmf_timeout = 0;
1492 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)
1494 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1496 /* Convert comfort noise into audio with various codecs. Unfortunately this doesn't
1497 totally help us out becuase we don't have an engine to keep it going and we are not
1498 guaranteed to have it every 20ms or anything */
1500 ast_debug(0, "- RTP 3389 Comfort noise event: Level %d (len = %d)\n", rtp->lastrxformat, len);
1502 if (ast_test_flag(rtp, FLAG_3389_WARNING)) {
1503 struct sockaddr_in remote_address = { 0, };
1505 ast_rtp_instance_get_remote_address(instance, &remote_address);
1507 ast_log(LOG_NOTICE, "Comfort noise support incomplete in Asterisk (RFC 3389). Please turn off on client if possible. Client IP: %s\n",
1508 ast_inet_ntoa(remote_address.sin_addr));
1509 ast_set_flag(rtp, FLAG_3389_WARNING);
1512 /* Must have at least one byte */
1516 rtp->f.data.ptr = rtp->rawdata + AST_FRIENDLY_OFFSET;
1517 rtp->f.datalen = len - 1;
1518 rtp->f.offset = AST_FRIENDLY_OFFSET;
1519 memcpy(rtp->f.data.ptr, data + 1, len - 1);
1521 rtp->f.data.ptr = NULL;
1525 rtp->f.frametype = AST_FRAME_CNG;
1526 rtp->f.subclass = data[0] & 0x7f;
1527 rtp->f.datalen = len - 1;
1529 rtp->f.delivery.tv_usec = rtp->f.delivery.tv_sec = 0;
1534 static struct ast_frame *ast_rtcp_read(struct ast_rtp_instance *instance)
1536 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1537 struct sockaddr_in sin;
1538 socklen_t len = sizeof(sin);
1539 unsigned int rtcpdata[8192 + AST_FRIENDLY_OFFSET];
1540 unsigned int *rtcpheader = (unsigned int *)(rtcpdata + AST_FRIENDLY_OFFSET);
1541 int res, packetwords, position = 0;
1542 struct ast_frame *f = &ast_null_frame;
1544 /* Read in RTCP data from the socket */
1545 if ((res = recvfrom(rtp->rtcp->s, rtcpdata + AST_FRIENDLY_OFFSET, sizeof(rtcpdata) - sizeof(unsigned int) * AST_FRIENDLY_OFFSET, 0, (struct sockaddr *)&sin, &len)) < 0) {
1546 ast_assert(errno != EBADF);
1547 if (errno != EAGAIN) {
1548 ast_log(LOG_WARNING, "RTCP Read error: %s. Hanging up.\n", strerror(errno));
1551 return &ast_null_frame;
1554 packetwords = res / 4;
1556 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT)) {
1557 /* Send to whoever sent to us */
1558 if ((rtp->rtcp->them.sin_addr.s_addr != sin.sin_addr.s_addr) ||
1559 (rtp->rtcp->them.sin_port != sin.sin_port)) {
1560 memcpy(&rtp->rtcp->them, &sin, sizeof(rtp->rtcp->them));
1561 if (option_debug || rtpdebug)
1562 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));
1566 ast_debug(1, "Got RTCP report of %d bytes\n", res);
1568 while (position < packetwords) {
1570 unsigned int length, dlsr, lsr, msw, lsw, comp;
1572 double rttsec, reported_jitter, reported_normdev_jitter_current, normdevrtt_current, reported_lost, reported_normdev_lost_current;
1576 length = ntohl(rtcpheader[i]);
1577 pt = (length & 0xff0000) >> 16;
1578 rc = (length & 0x1f000000) >> 24;
1581 if ((i + length) > packetwords) {
1582 if (option_debug || rtpdebug)
1583 ast_log(LOG_DEBUG, "RTCP Read too short\n");
1584 return &ast_null_frame;
1587 if (rtcp_debug_test_addr(&sin)) {
1588 ast_verbose("\n\nGot RTCP from %s:%d\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
1589 ast_verbose("PT: %d(%s)\n", pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown");
1590 ast_verbose("Reception reports: %d\n", rc);
1591 ast_verbose("SSRC of sender: %u\n", rtcpheader[i + 1]);
1594 i += 2; /* Advance past header and ssrc */
1598 gettimeofday(&rtp->rtcp->rxlsr,NULL); /* To be able to populate the dlsr */
1599 rtp->rtcp->spc = ntohl(rtcpheader[i+3]);
1600 rtp->rtcp->soc = ntohl(rtcpheader[i + 4]);
1601 rtp->rtcp->themrxlsr = ((ntohl(rtcpheader[i]) & 0x0000ffff) << 16) | ((ntohl(rtcpheader[i + 1]) & 0xffff0000) >> 16); /* Going to LSR in RR*/
1603 if (rtcp_debug_test_addr(&sin)) {
1604 ast_verbose("NTP timestamp: %lu.%010lu\n", (unsigned long) ntohl(rtcpheader[i]), (unsigned long) ntohl(rtcpheader[i + 1]) * 4096);
1605 ast_verbose("RTP timestamp: %lu\n", (unsigned long) ntohl(rtcpheader[i + 2]));
1606 ast_verbose("SPC: %lu\tSOC: %lu\n", (unsigned long) ntohl(rtcpheader[i + 3]), (unsigned long) ntohl(rtcpheader[i + 4]));
1611 /* Intentional fall through */
1613 /* Don't handle multiple reception reports (rc > 1) yet */
1614 /* Calculate RTT per RFC */
1615 gettimeofday(&now, NULL);
1616 timeval2ntp(now, &msw, &lsw);
1617 if (ntohl(rtcpheader[i + 4]) && ntohl(rtcpheader[i + 5])) { /* We must have the LSR && DLSR */
1618 comp = ((msw & 0xffff) << 16) | ((lsw & 0xffff0000) >> 16);
1619 lsr = ntohl(rtcpheader[i + 4]);
1620 dlsr = ntohl(rtcpheader[i + 5]);
1621 rtt = comp - lsr - dlsr;
1623 /* Convert end to end delay to usec (keeping the calculation in 64bit space)
1624 sess->ee_delay = (eedelay * 1000) / 65536; */
1626 rtt = (rtt * 1000000) >> 16;
1628 rtt = (rtt * 1000) >> 16;
1632 rttsec = rtt / 1000.;
1633 rtp->rtcp->rtt = rttsec;
1635 if (comp - dlsr >= lsr) {
1636 rtp->rtcp->accumulated_transit += rttsec;
1638 if (rtp->rtcp->rtt_count == 0)
1639 rtp->rtcp->minrtt = rttsec;
1641 if (rtp->rtcp->maxrtt<rttsec)
1642 rtp->rtcp->maxrtt = rttsec;
1643 if (rtp->rtcp->minrtt>rttsec)
1644 rtp->rtcp->minrtt = rttsec;
1646 normdevrtt_current = normdev_compute(rtp->rtcp->normdevrtt, rttsec, rtp->rtcp->rtt_count);
1648 rtp->rtcp->stdevrtt = stddev_compute(rtp->rtcp->stdevrtt, rttsec, rtp->rtcp->normdevrtt, normdevrtt_current, rtp->rtcp->rtt_count);
1650 rtp->rtcp->normdevrtt = normdevrtt_current;
1652 rtp->rtcp->rtt_count++;
1653 } else if (rtcp_debug_test_addr(&sin)) {
1654 ast_verbose("Internal RTCP NTP clock skew detected: "
1655 "lsr=%u, now=%u, dlsr=%u (%d:%03dms), "
1657 lsr, comp, dlsr, dlsr / 65536,
1658 (dlsr % 65536) * 1000 / 65536,
1659 dlsr - (comp - lsr));
1663 rtp->rtcp->reported_jitter = ntohl(rtcpheader[i + 3]);
1664 reported_jitter = (double) rtp->rtcp->reported_jitter;
1666 if (rtp->rtcp->reported_jitter_count == 0)
1667 rtp->rtcp->reported_minjitter = reported_jitter;
1669 if (reported_jitter < rtp->rtcp->reported_minjitter)
1670 rtp->rtcp->reported_minjitter = reported_jitter;
1672 if (reported_jitter > rtp->rtcp->reported_maxjitter)
1673 rtp->rtcp->reported_maxjitter = reported_jitter;
1675 reported_normdev_jitter_current = normdev_compute(rtp->rtcp->reported_normdev_jitter, reported_jitter, rtp->rtcp->reported_jitter_count);
1677 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);
1679 rtp->rtcp->reported_normdev_jitter = reported_normdev_jitter_current;
1681 rtp->rtcp->reported_lost = ntohl(rtcpheader[i + 1]) & 0xffffff;
1683 reported_lost = (double) rtp->rtcp->reported_lost;
1685 /* using same counter as for jitter */
1686 if (rtp->rtcp->reported_jitter_count == 0)
1687 rtp->rtcp->reported_minlost = reported_lost;
1689 if (reported_lost < rtp->rtcp->reported_minlost)
1690 rtp->rtcp->reported_minlost = reported_lost;
1692 if (reported_lost > rtp->rtcp->reported_maxlost)
1693 rtp->rtcp->reported_maxlost = reported_lost;
1694 reported_normdev_lost_current = normdev_compute(rtp->rtcp->reported_normdev_lost, reported_lost, rtp->rtcp->reported_jitter_count);
1696 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);
1698 rtp->rtcp->reported_normdev_lost = reported_normdev_lost_current;
1700 rtp->rtcp->reported_jitter_count++;
1702 if (rtcp_debug_test_addr(&sin)) {
1703 ast_verbose(" Fraction lost: %ld\n", (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24));
1704 ast_verbose(" Packets lost so far: %d\n", rtp->rtcp->reported_lost);
1705 ast_verbose(" Highest sequence number: %ld\n", (long) (ntohl(rtcpheader[i + 2]) & 0xffff));
1706 ast_verbose(" Sequence number cycles: %ld\n", (long) (ntohl(rtcpheader[i + 2]) & 0xffff) >> 16);
1707 ast_verbose(" Interarrival jitter: %u\n", rtp->rtcp->reported_jitter);
1708 ast_verbose(" Last SR(our NTP): %lu.%010lu\n",(unsigned long) ntohl(rtcpheader[i + 4]) >> 16,((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096);
1709 ast_verbose(" DLSR: %4.4f (sec)\n",ntohl(rtcpheader[i + 5])/65536.0);
1711 ast_verbose(" RTT: %lu(sec)\n", (unsigned long) rtt);
1714 manager_event(EVENT_FLAG_REPORTING, "RTCPReceived", "From %s:%d\r\n"
1716 "ReceptionReports: %d\r\n"
1717 "SenderSSRC: %u\r\n"
1718 "FractionLost: %ld\r\n"
1719 "PacketsLost: %d\r\n"
1720 "HighestSequence: %ld\r\n"
1721 "SequenceNumberCycles: %ld\r\n"
1723 "LastSR: %lu.%010lu\r\n"
1724 "DLSR: %4.4f(sec)\r\n"
1725 "RTT: %llu(sec)\r\n",
1726 ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port),
1727 pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown",
1730 (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24),
1731 rtp->rtcp->reported_lost,
1732 (long) (ntohl(rtcpheader[i + 2]) & 0xffff),
1733 (long) (ntohl(rtcpheader[i + 2]) & 0xffff) >> 16,
1734 rtp->rtcp->reported_jitter,
1735 (unsigned long) ntohl(rtcpheader[i + 4]) >> 16, ((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096,
1736 ntohl(rtcpheader[i + 5])/65536.0,
1737 (unsigned long long)rtt);
1739 manager_event(EVENT_FLAG_REPORTING, "RTCPReceived", "From %s:%d\r\n"
1741 "ReceptionReports: %d\r\n"
1742 "SenderSSRC: %u\r\n"
1743 "FractionLost: %ld\r\n"
1744 "PacketsLost: %d\r\n"
1745 "HighestSequence: %ld\r\n"
1746 "SequenceNumberCycles: %ld\r\n"
1748 "LastSR: %lu.%010lu\r\n"
1749 "DLSR: %4.4f(sec)\r\n",
1750 ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port),
1751 pt, (pt == 200) ? "Sender Report" : (pt == 201) ? "Receiver Report" : (pt == 192) ? "H.261 FUR" : "Unknown",
1754 (((long) ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24),
1755 rtp->rtcp->reported_lost,
1756 (long) (ntohl(rtcpheader[i + 2]) & 0xffff),
1757 (long) (ntohl(rtcpheader[i + 2]) & 0xffff) >> 16,
1758 rtp->rtcp->reported_jitter,
1759 (unsigned long) ntohl(rtcpheader[i + 4]) >> 16,
1760 ((unsigned long) ntohl(rtcpheader[i + 4]) << 16) * 4096,
1761 ntohl(rtcpheader[i + 5])/65536.0);
1765 if (rtcp_debug_test_addr(&sin))
1766 ast_verbose("Received an RTCP Fast Update Request\n");
1767 rtp->f.frametype = AST_FRAME_CONTROL;
1768 rtp->f.subclass = AST_CONTROL_VIDUPDATE;
1776 if (rtcp_debug_test_addr(&sin))
1777 ast_verbose("Received an SDES from %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
1780 if (rtcp_debug_test_addr(&sin))
1781 ast_verbose("Received a BYE from %s:%d\n", ast_inet_ntoa(rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
1784 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));
1787 position += (length + 1);
1790 rtp->rtcp->rtcp_info = 1;
1795 static int bridge_p2p_rtp_write(struct ast_rtp_instance *instance, unsigned int *rtpheader, int len, int hdrlen)
1797 struct ast_rtp_instance *instance1 = ast_rtp_instance_get_bridged(instance);
1798 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance), *bridged = ast_rtp_instance_get_data(instance1);
1799 int res = 0, payload = 0, bridged_payload = 0, mark;
1800 struct ast_rtp_payload_type payload_type;
1801 int reconstruct = ntohl(rtpheader[0]);
1802 struct sockaddr_in remote_address = { 0, };
1804 /* Get fields from packet */
1805 payload = (reconstruct & 0x7f0000) >> 16;
1806 mark = (((reconstruct & 0x800000) >> 23) != 0);
1808 /* Check what the payload value should be */
1809 payload_type = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(instance), payload);
1811 /* Otherwise adjust bridged payload to match */
1812 bridged_payload = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance1), payload_type.asterisk_format, payload_type.code);
1814 /* 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 */
1815 if (!(ast_rtp_instance_get_codecs(instance1)->payloads[bridged_payload].code)) {
1819 /* If the marker bit has been explicitly set turn it on */
1820 if (ast_test_flag(rtp, FLAG_NEED_MARKER_BIT)) {
1822 ast_clear_flag(rtp, FLAG_NEED_MARKER_BIT);
1825 /* Reconstruct part of the packet */
1826 reconstruct &= 0xFF80FFFF;
1827 reconstruct |= (bridged_payload << 16);
1828 reconstruct |= (mark << 23);
1829 rtpheader[0] = htonl(reconstruct);
1831 ast_rtp_instance_get_remote_address(instance1, &remote_address);
1833 /* Send the packet back out */
1834 res = sendto(bridged->s, (void *)rtpheader, len, 0, (struct sockaddr *)&remote_address, sizeof(remote_address));
1836 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))) {
1837 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));
1838 } else if (((ast_test_flag(bridged, FLAG_NAT_ACTIVE) == FLAG_NAT_INACTIVE) || rtpdebug) && !ast_test_flag(bridged, FLAG_NAT_INACTIVE_NOWARN)) {
1839 if (option_debug || rtpdebug)
1840 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));
1841 ast_set_flag(bridged, FLAG_NAT_INACTIVE_NOWARN);
1844 } else if (rtp_debug_test_addr(&remote_address)) {
1845 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);
1851 static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtcp)
1853 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1854 struct sockaddr_in sin;
1855 socklen_t len = sizeof(sin);
1856 int res, hdrlen = 12, version, payloadtype, padding, mark, ext, cc, prev_seqno;
1857 unsigned int *rtpheader = (unsigned int*)(rtp->rawdata + AST_FRIENDLY_OFFSET), seqno, ssrc, timestamp;
1858 struct ast_rtp_payload_type payload;
1859 struct sockaddr_in remote_address = { 0, };
1861 /* If this is actually RTCP let's hop on over and handle it */
1864 return ast_rtcp_read(instance);
1866 return &ast_null_frame;
1869 /* If we are currently sending DTMF to the remote party send a continuation packet */
1870 if (rtp->sending_digit) {
1871 ast_rtp_dtmf_continuation(instance);
1874 /* Actually read in the data from the socket */
1875 if ((res = recvfrom(rtp->s, rtp->rawdata + AST_FRIENDLY_OFFSET, sizeof(rtp->rawdata) - AST_FRIENDLY_OFFSET, 0, (struct sockaddr*)&sin, &len)) < 0) {
1876 ast_assert(errno != EBADF);
1877 if (errno != EAGAIN) {
1878 ast_log(LOG_WARNING, "RTP Read error: %s. Hanging up.\n", strerror(errno));
1881 return &ast_null_frame;
1884 /* Make sure the data that was read in is actually enough to make up an RTP packet */
1886 ast_log(LOG_WARNING, "RTP Read too short\n");
1887 return &ast_null_frame;
1890 /* If strict RTP protection is enabled see if we need to learn the remote address or if we need to drop the packet */
1891 if (rtp->strict_rtp_state == STRICT_RTP_LEARN) {
1892 memcpy(&rtp->strict_rtp_address, &sin, sizeof(rtp->strict_rtp_address));
1893 rtp->strict_rtp_state = STRICT_RTP_CLOSED;
1894 } else if (rtp->strict_rtp_state == STRICT_RTP_CLOSED) {
1895 if ((rtp->strict_rtp_address.sin_addr.s_addr != sin.sin_addr.s_addr) || (rtp->strict_rtp_address.sin_port != sin.sin_port)) {
1896 /* Hmm, not the strict addres. Perhaps we're getting audio from the alternate? */
1897 if ((rtp->alt_rtp_address.sin_addr.s_addr == sin.sin_addr.s_addr) && (rtp->alt_rtp_address.sin_port == sin.sin_port)) {
1898 /* ooh, we did! You're now the new expected address, son! */
1899 rtp->strict_rtp_address = sin;
1901 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));
1902 return &ast_null_frame;
1907 /* Get fields and verify this is an RTP packet */
1908 seqno = ntohl(rtpheader[0]);
1910 ast_rtp_instance_get_remote_address(instance, &remote_address);
1912 if (!(version = (seqno & 0xC0000000) >> 30)) {
1913 if ((ast_stun_handle_packet(rtp->s, &sin, rtp->rawdata + AST_FRIENDLY_OFFSET, res, NULL, NULL) == AST_STUN_ACCEPT) &&
1914 (!remote_address.sin_port && !remote_address.sin_addr.s_addr)) {
1915 ast_rtp_instance_set_remote_address(instance, &sin);
1917 return &ast_null_frame;
1920 /* If symmetric RTP is enabled see if the remote side is not what we expected and change where we are sending audio */
1921 if (ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT)) {
1922 if ((remote_address.sin_addr.s_addr != sin.sin_addr.s_addr) ||
1923 (remote_address.sin_port != sin.sin_port)) {
1924 ast_rtp_instance_set_remote_address(instance, &sin);
1925 memcpy(&remote_address, &sin, sizeof(remote_address));
1927 memcpy(&rtp->rtcp->them, &sin, sizeof(rtp->rtcp->them));
1928 rtp->rtcp->them.sin_port = htons(ntohs(sin.sin_port)+1);
1931 ast_set_flag(rtp, FLAG_NAT_ACTIVE);
1932 if (option_debug || rtpdebug)
1933 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));
1937 /* If we are directly bridged to another instance send the audio directly out */
1938 if (ast_rtp_instance_get_bridged(instance) && !bridge_p2p_rtp_write(instance, rtpheader, res, hdrlen)) {
1939 return &ast_null_frame;
1942 /* If the version is not what we expected by this point then just drop the packet */
1944 return &ast_null_frame;
1947 /* Pull out the various other fields we will need */
1948 payloadtype = (seqno & 0x7f0000) >> 16;
1949 padding = seqno & (1 << 29);
1950 mark = seqno & (1 << 23);
1951 ext = seqno & (1 << 28);
1952 cc = (seqno & 0xF000000) >> 24;
1954 timestamp = ntohl(rtpheader[1]);
1955 ssrc = ntohl(rtpheader[2]);
1957 /* Force a marker bit if the SSRC changes */
1958 if (!mark && rtp->rxssrc && rtp->rxssrc != ssrc) {
1959 if (option_debug || rtpdebug) {
1960 ast_debug(1, "Forcing Marker bit, because SSRC has changed\n");
1965 /* Remove any padding bytes that may be present */
1967 res -= rtp->rawdata[AST_FRIENDLY_OFFSET + res - 1];
1970 /* Skip over any CSRC fields */
1975 /* Look for any RTP extensions, currently we do not support any */
1977 hdrlen += (ntohl(rtpheader[hdrlen/4]) & 0xffff) << 2;
1981 profile = (ntohl(rtpheader[3]) & 0xffff0000) >> 16;
1982 if (profile == 0x505a)
1983 ast_debug(1, "Found Zfone extension in RTP stream - zrtp - not supported.\n");
1985 ast_debug(1, "Found unknown RTP Extensions %x\n", profile);
1989 /* Make sure after we potentially mucked with the header length that it is once again valid */
1991 ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d\n", res, hdrlen);
1992 return &ast_null_frame;
1996 if (rtp->rxcount == 1) {
1997 rtp->seedrxseqno = seqno;
2000 /* Do not schedule RR if RTCP isn't run */
2001 if (rtp->rtcp && rtp->rtcp->them.sin_addr.s_addr && rtp->rtcp->schedid < 1) {
2002 /* Schedule transmission of Receiver Report */
2003 rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, rtp);
2005 if ((int)rtp->lastrxseqno - (int)seqno > 100) /* if so it would indicate that the sender cycled; allow for misordering */
2006 rtp->cycles += RTP_SEQ_MOD;
2008 prev_seqno = rtp->lastrxseqno;
2009 rtp->lastrxseqno = seqno;
2011 if (!rtp->themssrc) {
2012 rtp->themssrc = ntohl(rtpheader[2]); /* Record their SSRC to put in future RR */
2015 if (rtp_debug_test_addr(&sin)) {
2016 ast_verbose("Got RTP packet from %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
2017 ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), payloadtype, seqno, timestamp,res - hdrlen);
2020 payload = ast_rtp_codecs_payload_lookup(ast_rtp_instance_get_codecs(instance), payloadtype);
2022 /* If the payload is not actually an Asterisk one but a special one pass it off to the respective handler */
2023 if (!payload.asterisk_format) {
2024 struct ast_frame *f = NULL;
2025 if (payload.code == AST_RTP_DTMF) {
2026 f = process_dtmf_rfc2833(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &sin, payloadtype, mark);
2027 } else if (payload.code == AST_RTP_CISCO_DTMF) {
2028 f = process_dtmf_cisco(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &sin, payloadtype, mark);
2029 } else if (payload.code == AST_RTP_CN) {
2030 f = process_cn_rfc3389(instance, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp, &sin, payloadtype, mark);
2032 ast_log(LOG_NOTICE, "Unknown RTP codec %d received from '%s'\n", payloadtype, ast_inet_ntoa(remote_address.sin_addr));
2035 return f ? f : &ast_null_frame;
2038 rtp->lastrxformat = rtp->f.subclass = payload.code;
2039 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;
2041 rtp->rxseqno = seqno;
2043 if (rtp->dtmf_timeout && rtp->dtmf_timeout < timestamp) {
2044 rtp->dtmf_timeout = 0;
2047 struct ast_frame *f;
2048 f = send_dtmf(instance, AST_FRAME_DTMF_END, 0);
2049 f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
2051 rtp->dtmf_timeout = rtp->dtmf_duration = 0;
2056 rtp->lastrxts = timestamp;
2060 rtp->f.datalen = res - hdrlen;
2061 rtp->f.data.ptr = rtp->rawdata + hdrlen + AST_FRIENDLY_OFFSET;
2062 rtp->f.offset = hdrlen + AST_FRIENDLY_OFFSET;
2063 rtp->f.seqno = seqno;
2065 if (rtp->f.subclass == AST_FORMAT_T140 && (int)seqno - (prev_seqno+1) > 0 && (int)seqno - (prev_seqno+1) < 10) {
2066 unsigned char *data = rtp->f.data.ptr;
2068 memmove(rtp->f.data.ptr+3, rtp->f.data.ptr, rtp->f.datalen);
2075 if (rtp->f.subclass == AST_FORMAT_T140RED) {
2076 unsigned char *data = rtp->f.data.ptr;
2077 unsigned char *header_end;
2078 int num_generations;
2081 int diff =(int)seqno - (prev_seqno+1); /* if diff = 0, no drop*/
2084 rtp->f.subclass = AST_FORMAT_T140;
2085 header_end = memchr(data, ((*data) & 0x7f), rtp->f.datalen);
2086 if (header_end == NULL) {
2087 return &ast_null_frame;
2091 header_length = header_end - data;
2092 num_generations = header_length / 4;
2093 len = header_length;
2096 for (x = 0; x < num_generations; x++)
2097 len += data[x * 4 + 3];
2099 if (!(rtp->f.datalen - len))
2100 return &ast_null_frame;
2102 rtp->f.data.ptr += len;
2103 rtp->f.datalen -= len;
2104 } else if (diff > num_generations && diff < 10) {
2106 rtp->f.data.ptr += len;
2107 rtp->f.datalen -= len;
2109 data = rtp->f.data.ptr;
2114 for ( x = 0; x < num_generations - diff; x++)
2115 len += data[x * 4 + 3];
2117 rtp->f.data.ptr += len;
2118 rtp->f.datalen -= len;
2122 if (rtp->f.subclass & AST_FORMAT_AUDIO_MASK) {
2123 rtp->f.samples = ast_codec_get_samples(&rtp->f);
2124 if (rtp->f.subclass == AST_FORMAT_SLINEAR)
2125 ast_frame_byteswap_be(&rtp->f);
2126 calc_rxstamp(&rtp->f.delivery, rtp, timestamp, mark);
2127 /* Add timing data to let ast_generic_bridge() put the frame into a jitterbuf */
2128 ast_set_flag(&rtp->f, AST_FRFLAG_HAS_TIMING_INFO);
2129 rtp->f.ts = timestamp / (rtp_get_rate(rtp->f.subclass) / 1000);
2130 rtp->f.len = rtp->f.samples / ((ast_format_rate(rtp->f.subclass) / 1000));
2131 } else if (rtp->f.subclass & AST_FORMAT_VIDEO_MASK) {
2132 /* Video -- samples is # of samples vs. 90000 */
2133 if (!rtp->lastividtimestamp)
2134 rtp->lastividtimestamp = timestamp;
2135 rtp->f.samples = timestamp - rtp->lastividtimestamp;
2136 rtp->lastividtimestamp = timestamp;
2137 rtp->f.delivery.tv_sec = 0;
2138 rtp->f.delivery.tv_usec = 0;
2139 /* Pass the RTP marker bit as bit 0 in the subclass field.
2140 * This is ok because subclass is actually a bitmask, and
2141 * the low bits represent audio formats, that are not
2142 * involved here since we deal with video.
2145 rtp->f.subclass |= 0x1;
2147 /* TEXT -- samples is # of samples vs. 1000 */
2148 if (!rtp->lastitexttimestamp)
2149 rtp->lastitexttimestamp = timestamp;
2150 rtp->f.samples = timestamp - rtp->lastitexttimestamp;
2151 rtp->lastitexttimestamp = timestamp;
2152 rtp->f.delivery.tv_sec = 0;
2153 rtp->f.delivery.tv_usec = 0;
2159 static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value)
2161 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2163 if (property == AST_RTP_PROPERTY_RTCP) {
2165 ast_debug(1, "Ignoring duplicate RTCP property on RTP instance '%p'\n", instance);
2168 if (!(rtp->rtcp = ast_calloc(1, sizeof(*rtp->rtcp)))) {
2171 if ((rtp->rtcp->s = create_new_socket("RTCP")) < 0) {
2172 ast_debug(1, "Failed to create a new socket for RTCP on instance '%p'\n", instance);
2173 ast_free(rtp->rtcp);
2178 /* Grab the IP address and port we are going to use */
2179 ast_rtp_instance_get_local_address(instance, &rtp->rtcp->us);
2180 rtp->rtcp->us.sin_port = htons(ntohs(rtp->rtcp->us.sin_port) + 1);
2182 /* 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 */
2183 if (bind(rtp->rtcp->s, (struct sockaddr*)&rtp->rtcp->us, sizeof(rtp->rtcp->us))) {
2184 ast_debug(1, "Failed to setup RTCP on RTP instance '%p'\n", instance);
2185 close(rtp->rtcp->s);
2186 ast_free(rtp->rtcp);
2191 ast_debug(1, "Setup RTCP on RTP instance '%p'\n", instance);
2192 rtp->rtcp->schedid = -1;
2200 static int ast_rtp_fd(struct ast_rtp_instance *instance, int rtcp)
2202 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2204 return rtcp ? (rtp->rtcp ? rtp->rtcp->s : -1) : rtp->s;
2207 static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct sockaddr_in *sin)
2209 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2212 ast_debug(1, "Setting RTCP address on RTP instance '%p'\n", instance);
2213 memcpy(&rtp->rtcp->them, sin, sizeof(rtp->rtcp->them));
2214 rtp->rtcp->them.sin_port = htons(ntohs(sin->sin_port) + 1);
2220 rtp->strict_rtp_state = STRICT_RTP_LEARN;
2226 static void ast_rtp_alt_remote_address_set(struct ast_rtp_instance *instance, struct sockaddr_in *sin)
2228 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2230 /* No need to futz with rtp->rtcp here because ast_rtcp_read is already able to adjust if receiving
2231 * RTCP from an "unexpected" source
2233 rtp->alt_rtp_address = *sin;
2238 /*! \brief Write t140 redundacy frame
2239 * \param data primary data to be buffered
2241 static int red_write(const void *data)
2243 struct ast_rtp_instance *instance = (struct ast_rtp_instance*) data;
2244 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2246 ast_rtp_write(instance, &rtp->red->t140);
2251 static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations)
2253 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2256 if (!(rtp->red = ast_calloc(1, sizeof(*rtp->red)))) {
2260 rtp->red->t140.frametype = AST_FRAME_TEXT;
2261 rtp->red->t140.subclass = AST_FORMAT_T140RED;
2262 rtp->red->t140.data.ptr = &rtp->red->buf_data;
2264 rtp->red->t140.ts = 0;
2265 rtp->red->t140red = rtp->red->t140;
2266 rtp->red->t140red.data.ptr = &rtp->red->t140red_data;
2267 rtp->red->t140red.datalen = 0;
2268 rtp->red->ti = buffer_time;
2269 rtp->red->num_gen = generations;
2270 rtp->red->hdrlen = generations * 4 + 1;
2271 rtp->red->prev_ts = 0;
2273 for (x = 0; x < generations; x++) {
2274 rtp->red->pt[x] = payloads[x];
2275 rtp->red->pt[x] |= 1 << 7; /* mark redundant generations pt */
2276 rtp->red->t140red_data[x*4] = rtp->red->pt[x];
2278 rtp->red->t140red_data[x*4] = rtp->red->pt[x] = payloads[x]; /* primary pt */
2279 rtp->red->schedid = ast_sched_add(rtp->sched, generations, red_write, instance);
2281 rtp->red->t140.datalen = 0;
2286 static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame)
2288 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2290 if (frame->datalen > -1) {
2291 struct rtp_red *red = rtp->red;
2292 memcpy(&red->buf_data[red->t140.datalen], frame->data.ptr, frame->datalen);
2293 red->t140.datalen += frame->datalen;
2294 red->t140.ts = frame->ts;
2300 static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_rtp_instance *instance1)
2302 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance0);
2304 ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
2309 static int ast_rtp_get_stat(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat)
2311 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2317 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXCOUNT, -1, stats->txcount, rtp->txcount);
2318 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RXCOUNT, -1, stats->rxcount, rtp->rxcount);
2320 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->txploss, rtp->rtcp->reported_lost);
2321 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);
2322 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MAXRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_maxrxploss, rtp->rtcp->reported_maxlost);
2323 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MINRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_minrxploss, rtp->rtcp->reported_minlost);
2324 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_normdevrxploss, rtp->rtcp->reported_normdev_lost);
2325 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_STDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->remote_stdevrxploss, rtp->rtcp->reported_stdev_lost);
2326 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MAXRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_maxrxploss, rtp->rtcp->maxrxlost);
2327 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MINRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_minrxploss, rtp->rtcp->minrxlost);
2328 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_normdevrxploss, rtp->rtcp->normdev_rxlost);
2329 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_STDEVRXPLOSS, AST_RTP_INSTANCE_STAT_COMBINED_LOSS, stats->local_stdevrxploss, rtp->rtcp->stdev_rxlost);
2330 AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_LOSS);
2332 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_TXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->txjitter, rtp->rxjitter);
2333 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);
2334 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MAXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_maxjitter, rtp->rtcp->reported_maxjitter);
2335 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_MINJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_minjitter, rtp->rtcp->reported_minjitter);
2336 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_normdevjitter, rtp->rtcp->reported_normdev_jitter);
2337 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_STDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->remote_stdevjitter, rtp->rtcp->reported_stdev_jitter);
2338 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MAXJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_maxjitter, rtp->rtcp->maxrxjitter);
2339 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_MINJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_minjitter, rtp->rtcp->minrxjitter);
2340 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_normdevjitter, rtp->rtcp->normdev_rxjitter);
2341 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_STDEVJITTER, AST_RTP_INSTANCE_STAT_COMBINED_JITTER, stats->local_stdevjitter, rtp->rtcp->stdev_rxjitter);
2342 AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_JITTER);
2344 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->rtt, rtp->rtcp->rtt);
2345 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_MAX_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->maxrtt, rtp->rtcp->maxrtt);
2346 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_MIN_RTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->minrtt, rtp->rtcp->minrtt);
2347 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_NORMDEVRTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->normdevrtt, rtp->rtcp->normdevrtt);
2348 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_STDEVRTT, AST_RTP_INSTANCE_STAT_COMBINED_RTT, stats->stdevrtt, rtp->rtcp->stdevrtt);
2349 AST_RTP_STAT_TERMINATOR(AST_RTP_INSTANCE_STAT_COMBINED_RTT);
2351 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_LOCAL_SSRC, -1, stats->local_ssrc, rtp->ssrc);
2352 AST_RTP_STAT_SET(AST_RTP_INSTANCE_STAT_REMOTE_SSRC, -1, stats->remote_ssrc, rtp->themssrc);
2357 static int ast_rtp_dtmf_compatible(struct ast_channel *chan0, struct ast_rtp_instance *instance0, struct ast_channel *chan1, struct ast_rtp_instance *instance1)
2359 /* If both sides are not using the same method of DTMF transmission
2360 * (ie: one is RFC2833, other is INFO... then we can not do direct media.
2361 * --------------------------------------------------
2362 * | DTMF Mode | HAS_DTMF | Accepts Begin Frames |
2363 * |-----------|------------|-----------------------|
2364 * | Inband | False | True |
2365 * | RFC2833 | True | True |
2366 * | SIP INFO | False | False |
2367 * --------------------------------------------------
2369 return (((ast_rtp_instance_get_prop(instance0, AST_RTP_PROPERTY_DTMF) != ast_rtp_instance_get_prop(instance1, AST_RTP_PROPERTY_DTMF)) ||
2370 (!chan0->tech->send_digit_begin != !chan1->tech->send_digit_begin)) ? 0 : 1);
2373 static void ast_rtp_stun_request(struct ast_rtp_instance *instance, struct sockaddr_in *suggestion, const char *username)
2375 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2377 ast_stun_request(rtp->s, suggestion, username, NULL);
2380 static void ast_rtp_stop(struct ast_rtp_instance *instance)
2382 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2383 struct sockaddr_in sin = { 0, };
2386 AST_SCHED_DEL(rtp->sched, rtp->rtcp->schedid);
2389 AST_SCHED_DEL(rtp->sched, rtp->red->schedid);
2394 ast_rtp_instance_set_remote_address(instance, &sin);
2396 memset(&rtp->rtcp->them.sin_addr, 0, sizeof(rtp->rtcp->them.sin_addr));
2397 memset(&rtp->rtcp->them.sin_port, 0, sizeof(rtp->rtcp->them.sin_port));
2400 ast_set_flag(rtp, FLAG_NEED_MARKER_BIT);
2403 static char *rtp_do_debug_ip(struct ast_cli_args *a)
2406 struct ast_hostent ahp;
2408 char *p, *arg = ast_strdupa(a->argv[4]);
2410 p = strstr(arg, ":");
2416 hp = ast_gethostbyname(arg, &ahp);
2418 ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
2421 rtpdebugaddr.sin_family = AF_INET;
2422 memcpy(&rtpdebugaddr.sin_addr, hp->h_addr, sizeof(rtpdebugaddr.sin_addr));
2423 rtpdebugaddr.sin_port = htons(port);
2425 ast_cli(a->fd, "RTP Debugging Enabled for IP: %s\n", ast_inet_ntoa(rtpdebugaddr.sin_addr));
2427 ast_cli(a->fd, "RTP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(rtpdebugaddr.sin_addr), port);
2432 static char *rtcp_do_debug_ip(struct ast_cli_args *a)
2435 struct ast_hostent ahp;
2437 char *p, *arg = ast_strdupa(a->argv[3]);
2439 p = strstr(arg, ":");
2445 hp = ast_gethostbyname(arg, &ahp);
2447 ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
2450 rtcpdebugaddr.sin_family = AF_INET;
2451 memcpy(&rtcpdebugaddr.sin_addr, hp->h_addr, sizeof(rtcpdebugaddr.sin_addr));
2452 rtcpdebugaddr.sin_port = htons(port);
2454 ast_cli(a->fd, "RTCP Debugging Enabled for IP: %s\n", ast_inet_ntoa(rtcpdebugaddr.sin_addr));
2456 ast_cli(a->fd, "RTCP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(rtcpdebugaddr.sin_addr), port);
2461 static char *handle_cli_rtp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
2465 e->command = "rtp set debug {on|off|ip}";
2467 "Usage: rtp set debug {on|off|ip host[:port]}\n"
2468 " Enable/Disable dumping of all RTP packets. If 'ip' is\n"
2469 " specified, limit the dumped packets to those to and from\n"
2470 " the specified 'host' with optional port.\n";
2476 if (a->argc == e->args) { /* set on or off */
2477 if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
2479 memset(&rtpdebugaddr, 0, sizeof(rtpdebugaddr));
2480 ast_cli(a->fd, "RTP Debugging Enabled\n");
2482 } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
2484 ast_cli(a->fd, "RTP Debugging Disabled\n");
2487 } else if (a->argc == e->args +1) { /* ip */
2488 return rtp_do_debug_ip(a);
2491 return CLI_SHOWUSAGE; /* default, failure */
2494 static char *handle_cli_rtcp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
2498 e->command = "rtcp set debug {on|off|ip}";
2500 "Usage: rtcp set debug {on|off|ip host[:port]}\n"
2501 " Enable/Disable dumping of all RTCP packets. If 'ip' is\n"
2502 " specified, limit the dumped packets to those to and from\n"
2503 " the specified 'host' with optional port.\n";
2509 if (a->argc == e->args) { /* set on or off */
2510 if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
2512 memset(&rtcpdebugaddr, 0, sizeof(rtcpdebugaddr));
2513 ast_cli(a->fd, "RTCP Debugging Enabled\n");
2515 } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
2517 ast_cli(a->fd, "RTCP Debugging Disabled\n");
2520 } else if (a->argc == e->args +1) { /* ip */
2521 return rtcp_do_debug_ip(a);
2524 return CLI_SHOWUSAGE; /* default, failure */
2527 static char *handle_cli_rtcp_set_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
2531 e->command = "rtcp set stats {on|off}";
2533 "Usage: rtcp set stats {on|off}\n"
2534 " Enable/Disable dumping of RTCP stats.\n";
2540 if (a->argc != e->args)
2541 return CLI_SHOWUSAGE;
2543 if (!strncasecmp(a->argv[e->args-1], "on", 2))
2545 else if (!strncasecmp(a->argv[e->args-1], "off", 3))
2548 return CLI_SHOWUSAGE;
2550 ast_cli(a->fd, "RTCP Stats %s\n", rtcpstats ? "Enabled" : "Disabled");
2554 static struct ast_cli_entry cli_rtp[] = {
2555 AST_CLI_DEFINE(handle_cli_rtp_set_debug, "Enable/Disable RTP debugging"),
2556 AST_CLI_DEFINE(handle_cli_rtcp_set_debug, "Enable/Disable RTCP debugging"),
2557 AST_CLI_DEFINE(handle_cli_rtcp_set_stats, "Enable/Disable RTCP stats"),
2560 static int rtp_reload(int reload)
2562 struct ast_config *cfg;
2564 struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
2566 cfg = ast_config_load2("rtp.conf", "rtp", config_flags);
2567 if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID) {
2571 rtpstart = DEFAULT_RTP_START;
2572 rtpend = DEFAULT_RTP_END;
2573 dtmftimeout = DEFAULT_DTMF_TIMEOUT;
2574 strictrtp = STRICT_RTP_OPEN;
2576 if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
2578 if (rtpstart < MINIMUM_RTP_PORT)
2579 rtpstart = MINIMUM_RTP_PORT;
2580 if (rtpstart > MAXIMUM_RTP_PORT)
2581 rtpstart = MAXIMUM_RTP_PORT;
2583 if ((s = ast_variable_retrieve(cfg, "general", "rtpend"))) {
2585 if (rtpend < MINIMUM_RTP_PORT)
2586 rtpend = MINIMUM_RTP_PORT;
2587 if (rtpend > MAXIMUM_RTP_PORT)
2588 rtpend = MAXIMUM_RTP_PORT;
2590 if ((s = ast_variable_retrieve(cfg, "general", "rtcpinterval"))) {
2591 rtcpinterval = atoi(s);
2592 if (rtcpinterval == 0)
2593 rtcpinterval = 0; /* Just so we're clear... it's zero */
2594 if (rtcpinterval < RTCP_MIN_INTERVALMS)
2595 rtcpinterval = RTCP_MIN_INTERVALMS; /* This catches negative numbers too */
2596 if (rtcpinterval > RTCP_MAX_INTERVALMS)
2597 rtcpinterval = RTCP_MAX_INTERVALMS;
2599 if ((s = ast_variable_retrieve(cfg, "general", "rtpchecksums"))) {
2601 nochecksums = ast_false(s) ? 1 : 0;
2604 ast_log(LOG_WARNING, "Disabling RTP checksums is not supported on this operating system!\n");
2607 if ((s = ast_variable_retrieve(cfg, "general", "dtmftimeout"))) {
2608 dtmftimeout = atoi(s);
2609 if ((dtmftimeout < 0) || (dtmftimeout > 64000)) {
2610 ast_log(LOG_WARNING, "DTMF timeout of '%d' outside range, using default of '%d' instead\n",
2611 dtmftimeout, DEFAULT_DTMF_TIMEOUT);
2612 dtmftimeout = DEFAULT_DTMF_TIMEOUT;
2615 if ((s = ast_variable_retrieve(cfg, "general", "strictrtp"))) {
2616 strictrtp = ast_true(s);
2618 ast_config_destroy(cfg);
2620 if (rtpstart >= rtpend) {
2621 ast_log(LOG_WARNING, "Unreasonable values for RTP start/end port in rtp.conf\n");
2622 rtpstart = DEFAULT_RTP_START;
2623 rtpend = DEFAULT_RTP_END;
2625 ast_verb(2, "RTP Allocating from port range %d -> %d\n", rtpstart, rtpend);
2629 static int reload_module(void)
2635 static int load_module(void)
2637 if (ast_rtp_engine_register(&asterisk_rtp_engine)) {
2638 return AST_MODULE_LOAD_DECLINE;
2641 if (ast_cli_register_multiple(cli_rtp, ARRAY_LEN(cli_rtp))) {
2642 ast_rtp_engine_unregister(&asterisk_rtp_engine);
2643 return AST_MODULE_LOAD_DECLINE;
2648 return AST_MODULE_LOAD_SUCCESS;
2651 static int unload_module(void)
2653 ast_rtp_engine_unregister(&asterisk_rtp_engine);
2654 ast_cli_unregister_multiple(cli_rtp, ARRAY_LEN(cli_rtp));
2659 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Asterisk RTP Stack",
2660 .load = load_module,
2661 .unload = unload_module,
2662 .reload = reload_module,