Asterisk - The Open Source Telephony Project GIT-master-80b953f
Loading...
Searching...
No Matches
res_rtp_asterisk.c
Go to the documentation of this file.
1/*
2 * Asterisk -- An open source telephony toolkit.
3 *
4 * Copyright (C) 1999 - 2008, Digium, Inc.
5 *
6 * Mark Spencer <markster@digium.com>
7 *
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.
13 *
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.
17 */
18
19/*!
20 * \file
21 *
22 * \brief Supports RTP and RTCP with Symmetric RTP support for NAT traversal.
23 *
24 * \author Mark Spencer <markster@digium.com>
25 *
26 * \note RTP is defined in RFC 3550.
27 *
28 * \ingroup rtp_engines
29 */
30
31/*** MODULEINFO
32 <use type="external">openssl</use>
33 <use type="external">pjproject</use>
34 <support_level>core</support_level>
35 ***/
36
37#include "asterisk.h"
38
39#include <arpa/nameser.h>
40#include "asterisk/dns_core.h"
43
44#include <sys/time.h>
45#include <signal.h>
46#include <fcntl.h>
47#include <math.h>
48
49#ifdef HAVE_OPENSSL
50#include <openssl/opensslconf.h>
51#include <openssl/opensslv.h>
52#if !defined(OPENSSL_NO_SRTP) && (OPENSSL_VERSION_NUMBER >= 0x10001000L)
53#include <openssl/ssl.h>
54#include <openssl/err.h>
55#include <openssl/bio.h>
56#if !defined(OPENSSL_NO_ECDH) && (OPENSSL_VERSION_NUMBER >= 0x10000000L)
57#include <openssl/bn.h>
58#endif
59#ifndef OPENSSL_NO_DH
60#include <openssl/dh.h>
61#endif
62#endif
63#endif
64
65#ifdef HAVE_PJPROJECT
66#include <pjlib.h>
67#include <pjlib-util.h>
68#include <pjnath.h>
69#include <ifaddrs.h>
70#endif
71
73#include "asterisk/options.h"
75#include "asterisk/stun.h"
76#include "asterisk/pbx.h"
77#include "asterisk/frame.h"
79#include "asterisk/channel.h"
80#include "asterisk/acl.h"
81#include "asterisk/config.h"
82#include "asterisk/lock.h"
83#include "asterisk/utils.h"
84#include "asterisk/cli.h"
85#include "asterisk/manager.h"
86#include "asterisk/unaligned.h"
87#include "asterisk/module.h"
88#include "asterisk/rtp_engine.h"
89#include "asterisk/smoother.h"
90#include "asterisk/uuid.h"
91#include "asterisk/test.h"
93#ifdef HAVE_PJPROJECT
96#endif
97
98#define MAX_TIMESTAMP_SKEW 640
99
100#define RTP_SEQ_MOD (1<<16) /*!< A sequence number can't be more than 16 bits */
101#define RTCP_DEFAULT_INTERVALMS 5000 /*!< Default milli-seconds between RTCP reports we send */
102#define RTCP_MIN_INTERVALMS 500 /*!< Min milli-seconds between RTCP reports we send */
103#define RTCP_MAX_INTERVALMS 60000 /*!< Max milli-seconds between RTCP reports we send */
104
105#define DEFAULT_RTP_START 5000 /*!< Default port number to start allocating RTP ports from */
106#define DEFAULT_RTP_END 31000 /*!< Default maximum port number to end allocating RTP ports at */
107
108#define MINIMUM_RTP_PORT 1024 /*!< Minimum port number to accept */
109#define MAXIMUM_RTP_PORT 65535 /*!< Maximum port number to accept */
110
111#define DEFAULT_TURN_PORT 3478
112
113#define TURN_STATE_WAIT_TIME 2000
114
115#define DEFAULT_RTP_SEND_BUFFER_SIZE 250 /*!< The initial size of the RTP send buffer */
116#define MAXIMUM_RTP_SEND_BUFFER_SIZE (DEFAULT_RTP_SEND_BUFFER_SIZE + 200) /*!< Maximum RTP send buffer size */
117#define DEFAULT_RTP_RECV_BUFFER_SIZE 20 /*!< The initial size of the RTP receiver buffer */
118#define MAXIMUM_RTP_RECV_BUFFER_SIZE (DEFAULT_RTP_RECV_BUFFER_SIZE + 20) /*!< Maximum RTP receive buffer size */
119#define OLD_PACKET_COUNT 1000 /*!< The number of previous packets that are considered old */
120#define MISSING_SEQNOS_ADDED_TRIGGER 2 /*!< The number of immediate missing packets that will trigger an immediate NACK */
121
122#define SEQNO_CYCLE_OVER 65536 /*!< The number after the maximum allowed sequence number */
123
124/*! Full INTRA-frame Request / Fast Update Request (From RFC2032) */
125#define RTCP_PT_FUR 192
126/*! Sender Report (From RFC3550) */
127#define RTCP_PT_SR AST_RTP_RTCP_SR
128/*! Receiver Report (From RFC3550) */
129#define RTCP_PT_RR AST_RTP_RTCP_RR
130/*! Source Description (From RFC3550) */
131#define RTCP_PT_SDES 202
132/*! Goodbye (To remove SSRC's from tables) (From RFC3550) */
133#define RTCP_PT_BYE 203
134/*! Application defined (From RFC3550) */
135#define RTCP_PT_APP 204
136/* VP8: RTCP Feedback */
137/*! Payload Specific Feed Back (From RFC4585 also RFC5104) */
138#define RTCP_PT_PSFB AST_RTP_RTCP_PSFB
139
140#define RTP_MTU 1200
141
142#define DEFAULT_DTMF_TIMEOUT (150 * (8000 / 1000)) /*!< samples */
143
144#define ZFONE_PROFILE_ID 0x505a
145
146#define DEFAULT_LEARNING_MIN_SEQUENTIAL 4
147/*!
148 * \brief Calculate the min learning duration in ms.
149 *
150 * \details
151 * The min supported packet size represents 10 ms and we need to account
152 * for some jitter and fast clocks while learning. Some messed up devices
153 * have very bad jitter for a small packet sample size. Jitter can also
154 * be introduced by the network itself.
155 *
156 * So we'll allow packets to come in every 9ms on average for fast clocking
157 * with the last one coming in 5ms early for jitter.
158 */
159#define CALC_LEARNING_MIN_DURATION(count) (((count) - 1) * 9 - 5)
160#define DEFAULT_LEARNING_MIN_DURATION CALC_LEARNING_MIN_DURATION(DEFAULT_LEARNING_MIN_SEQUENTIAL)
161
162#define SRTP_MASTER_KEY_LEN 16
163#define SRTP_MASTER_SALT_LEN 14
164#define SRTP_MASTER_LEN (SRTP_MASTER_KEY_LEN + SRTP_MASTER_SALT_LEN)
165
166#define RTP_DTLS_ESTABLISHED -37
167
169 STRICT_RTP_OPEN = 0, /*! No RTP packets should be dropped, all sources accepted */
170 STRICT_RTP_LEARN, /*! Accept next packet as source */
171 STRICT_RTP_CLOSED, /*! Drop all RTP packets not coming from source that was learned */
172};
173
175 STRICT_RTP_NO = 0, /*! Don't adhere to any strict RTP rules */
176 STRICT_RTP_YES, /*! Strict RTP that restricts packets based on time and sequence number */
177 STRICT_RTP_SEQNO, /*! Strict RTP that restricts packets based on sequence number */
178};
179
180/*!
181 * \brief Strict RTP learning timeout time in milliseconds
182 *
183 * \note Set to 5 seconds to allow reinvite chains for direct media
184 * to settle before media actually starts to arrive. There may be a
185 * reinvite collision involved on the other leg.
186 */
187#define STRICT_RTP_LEARN_TIMEOUT 5000
188
189#define DEFAULT_STRICT_RTP STRICT_RTP_YES /*!< Enabled by default */
190#define DEFAULT_SRTP_REPLAY_PROTECTION 1
191#define DEFAULT_ICESUPPORT 1
192#define DEFAULT_STUN_SOFTWARE_ATTRIBUTE 1
193#define DEFAULT_DTLS_MTU 1200
194
195/*!
196 * Because both ends usually don't start sending RTP
197 * at the same time, some of the calculations like
198 * rtt and jitter will probably be unstable for a while
199 * so we'll skip some received packets before starting
200 * analyzing. This just affects analyzing; we still
201 * process the RTP as normal.
202 */
203#define RTP_IGNORE_FIRST_PACKETS_COUNT 15
204
205extern struct ast_srtp_res *res_srtp;
207
209
210static int rtpstart = DEFAULT_RTP_START; /*!< First port for RTP sessions (set in rtp.conf) */
211static int rtpend = DEFAULT_RTP_END; /*!< Last port for RTP sessions (set in rtp.conf) */
212static int rtcpstats; /*!< Are we debugging RTCP? */
213static int rtcpinterval = RTCP_DEFAULT_INTERVALMS; /*!< Time between rtcp reports in millisecs */
214static struct ast_sockaddr rtpdebugaddr; /*!< Debug packets to/from this host */
215static struct ast_sockaddr rtcpdebugaddr; /*!< Debug RTCP packets to/from this host */
216static int rtpdebugport; /*!< Debug only RTP packets from IP or IP+Port if port is > 0 */
217static int rtcpdebugport; /*!< Debug only RTCP packets from IP or IP+Port if port is > 0 */
218#ifdef SO_NO_CHECK
219static int nochecksums;
220#endif
221static int strictrtp = DEFAULT_STRICT_RTP; /*!< Only accept RTP frames from a defined source. If we receive an indication of a changing source, enter learning mode. */
222static int learning_min_sequential = DEFAULT_LEARNING_MIN_SEQUENTIAL; /*!< Number of sequential RTP frames needed from a single source during learning mode to accept new source. */
223static int learning_min_duration = DEFAULT_LEARNING_MIN_DURATION; /*!< Lowest acceptable timeout between the first and the last sequential RTP frame. */
225#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
226static int dtls_mtu = DEFAULT_DTLS_MTU;
227#endif
228#ifdef HAVE_PJPROJECT
229static int icesupport = DEFAULT_ICESUPPORT;
230static int stun_software_attribute = DEFAULT_STUN_SOFTWARE_ATTRIBUTE;
231static struct sockaddr_in stunaddr;
232static pj_str_t turnaddr;
233static int turnport = DEFAULT_TURN_PORT;
234static pj_str_t turnusername;
235static pj_str_t turnpassword;
237static struct ast_sockaddr lo6 = { .len = 0 };
238
239/*! ACL for ICE addresses */
240static struct ast_acl_list *ice_acl = NULL;
241static ast_rwlock_t ice_acl_lock = AST_RWLOCK_INIT_VALUE;
242
243/*! ACL for STUN requests */
244static struct ast_acl_list *stun_acl = NULL;
245static ast_rwlock_t stun_acl_lock = AST_RWLOCK_INIT_VALUE;
246
247/*! stunaddr recurring resolution */
248static ast_rwlock_t stunaddr_lock = AST_RWLOCK_INIT_VALUE;
249static struct ast_dns_query_recurring *stunaddr_resolver = NULL;
250
251/*! \brief Pool factory used by pjlib to allocate memory. */
252static pj_caching_pool cachingpool;
253
254/*! \brief Global memory pool for configuration and timers */
255static pj_pool_t *pool;
256
257/*! \brief Global timer heap */
258static pj_timer_heap_t *timer_heap;
259
260/*! \brief Thread executing the timer heap */
261static pj_thread_t *timer_thread;
262
263/*! \brief Used to tell the timer thread to terminate */
264static int timer_terminate;
265
266/*! \brief Structure which contains ioqueue thread information */
267struct ast_rtp_ioqueue_thread {
268 /*! \brief Pool used by the thread */
269 pj_pool_t *pool;
270 /*! \brief The thread handling the queue and timer heap */
271 pj_thread_t *thread;
272 /*! \brief Ioqueue which polls on sockets */
273 pj_ioqueue_t *ioqueue;
274 /*! \brief Timer heap for scheduled items */
275 pj_timer_heap_t *timerheap;
276 /*! \brief Termination request */
277 int terminate;
278 /*! \brief Current number of descriptors being waited on */
279 unsigned int count;
280 /*! \brief Linked list information */
281 AST_LIST_ENTRY(ast_rtp_ioqueue_thread) next;
282};
283
284/*! \brief List of ioqueue threads */
285static AST_LIST_HEAD_STATIC(ioqueues, ast_rtp_ioqueue_thread);
286
287/*! \brief Structure which contains ICE host candidate mapping information */
288struct ast_ice_host_candidate {
289 struct ast_sockaddr local;
290 struct ast_sockaddr advertised;
291 unsigned int include_local;
292 AST_RWLIST_ENTRY(ast_ice_host_candidate) next;
293};
294
295/*! \brief List of ICE host candidate mappings */
296static AST_RWLIST_HEAD_STATIC(host_candidates, ast_ice_host_candidate);
297
298static char *generate_random_string(char *buf, size_t size);
299
300#endif
301
302#define FLAG_3389_WARNING (1 << 0)
303#define FLAG_NAT_ACTIVE (3 << 1)
304#define FLAG_NAT_INACTIVE (0 << 1)
305#define FLAG_NAT_INACTIVE_NOWARN (1 << 1)
306#define FLAG_NEED_MARKER_BIT (1 << 3)
307#define FLAG_DTMF_COMPENSATE (1 << 4)
308#define FLAG_REQ_LOCAL_BRIDGE_BIT (1 << 5)
309
310#define TRANSPORT_SOCKET_RTP 0
311#define TRANSPORT_SOCKET_RTCP 1
312#define TRANSPORT_TURN_RTP 2
313#define TRANSPORT_TURN_RTCP 3
314
315/*! \brief RTP learning mode tracking information */
317 struct ast_sockaddr proposed_address; /*!< Proposed remote address for strict RTP */
318 struct timeval start; /*!< The time learning mode was started */
319 struct timeval received; /*!< The time of the first received packet */
320 int max_seq; /*!< The highest sequence number received */
321 int packets; /*!< The number of remaining packets before the source is accepted */
322 /*! Type of media stream carried by the RTP instance */
324};
325
326#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
327struct dtls_details {
328 SSL *ssl; /*!< SSL session */
329 BIO *read_bio; /*!< Memory buffer for reading */
330 BIO *write_bio; /*!< Memory buffer for writing */
331 enum ast_rtp_dtls_setup dtls_setup; /*!< Current setup state */
332 enum ast_rtp_dtls_connection connection; /*!< Whether this is a new or existing connection */
333 int timeout_timer; /*!< Scheduler id for timeout timer */
334};
335#endif
336
337#ifdef HAVE_PJPROJECT
338/*! An ao2 wrapper protecting the PJPROJECT ice structure with ref counting. */
339struct ice_wrap {
340 pj_ice_sess *real_ice; /*!< ICE session */
341};
342#endif
343
344/*! \brief Structure used for mapping an incoming SSRC to an RTP instance */
346 /*! \brief The received SSRC */
347 unsigned int ssrc;
348 /*! True if the SSRC is available. Otherwise, this is a placeholder mapping until the SSRC is set. */
349 unsigned int ssrc_valid;
350 /*! \brief The RTP instance this SSRC belongs to*/
352};
353
354/*! \brief Packet statistics (used for transport-cc) */
356 /*! The transport specific sequence number */
357 unsigned int seqno;
358 /*! The time at which the packet was received */
359 struct timeval received;
360 /*! The delta between this packet and the previous */
361 int delta;
362};
363
364/*! \brief Statistics information (used for transport-cc) */
366 /*! A vector of packet statistics */
367 AST_VECTOR(, struct rtp_transport_wide_cc_packet_statistics) packet_statistics; /*!< Packet statistics, used for transport-cc */
368 /*! The last sequence number received */
369 unsigned int last_seqno;
370 /*! The last extended sequence number */
372 /*! How many feedback packets have gone out */
373 unsigned int feedback_count;
374 /*! How many cycles have occurred for the sequence numbers */
375 unsigned int cycles;
376 /*! Scheduler id for periodic feedback transmission */
378};
379
380typedef struct {
381 unsigned int ts;
382 unsigned char is_set;
384
385/*! \brief RTP session description */
386struct ast_rtp {
387 int s;
388 /*! \note The f.subclass.format holds a ref. */
389 struct ast_frame f;
390 unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET];
391 unsigned int ssrc; /*!< Synchronization source, RFC 3550, page 10. */
392 unsigned int ssrc_orig; /*!< SSRC used before native bridge activated */
393 unsigned char ssrc_saved; /*!< indicates if ssrc_orig has a value */
394 char cname[AST_UUID_STR_LEN]; /*!< Our local CNAME */
395 unsigned int themssrc; /*!< Their SSRC */
396 unsigned int themssrc_valid; /*!< True if their SSRC is available. */
397 unsigned int lastts;
398 unsigned int lastividtimestamp;
399 unsigned int lastovidtimestamp;
400 unsigned int lastitexttimestamp;
401 unsigned int lastotexttimestamp;
402 int prevrxseqno; /*!< Previous received packeted sequence number, from the network */
403 int lastrxseqno; /*!< Last received sequence number, from the network */
404 int expectedrxseqno; /*!< Next expected sequence number, from the network */
405 AST_VECTOR(, int) missing_seqno; /*!< A vector of sequence numbers we never received */
406 int expectedseqno; /*!< Next expected sequence number, from the core */
407 unsigned short seedrxseqno; /*!< What sequence number did they start with?*/
408 unsigned int rxcount; /*!< How many packets have we received? */
409 unsigned int rxoctetcount; /*!< How many octets have we received? should be rxcount *160*/
410 unsigned int txcount; /*!< How many packets have we sent? */
411 unsigned int txoctetcount; /*!< How many octets have we sent? (txcount*160)*/
412 unsigned int cycles; /*!< Shifted count of sequence number cycles */
415
416 /*
417 * RX RTP Timestamp and Jitter calculation.
418 */
419 double rxstart; /*!< RX time of the first packet in the session in seconds since EPOCH. */
420 double rxstart_stable; /*!< RX time of the first packet after RTP_IGNORE_FIRST_PACKETS_COUNT */
421 unsigned int remote_seed_rx_rtp_ts; /*!< RTP timestamp of first RX packet. */
422 unsigned int remote_seed_rx_rtp_ts_stable; /*!< RTP timestamp of first packet after RTP_IGNORE_FIRST_PACKETS_COUNT */
423 unsigned int last_transit_time_samples; /*!< The last transit time in samples */
424 double rxjitter; /*!< Last calculated Interarrival jitter in seconds. */
425 double rxjitter_samples; /*!< Last calculated Interarrival jitter in samples. */
426 double rxmes; /*!< Media Experince Score at the moment to be reported */
427
428 /* DTMF Reception Variables */
429 char resp; /*!< The current digit being processed */
430 unsigned int last_seqno; /*!< The last known sequence number for any DTMF packet */
431 optional_ts last_end_timestamp; /*!< The last known timestamp received from an END packet */
432 unsigned int dtmf_duration; /*!< Total duration in samples since the digit start event */
433 unsigned int dtmf_timeout; /*!< When this timestamp is reached we consider END frame lost and forcibly abort digit */
434 unsigned int dtmfsamples;
435 enum ast_rtp_dtmf_mode dtmfmode; /*!< The current DTMF mode of the RTP stream */
436 unsigned int dtmf_samplerate_ms; /*!< The sample rate of the current RTP stream in ms (sample rate / 1000) */
437 /* DTMF Transmission Variables */
438 unsigned int lastdigitts;
439 char sending_digit; /*!< boolean - are we sending digits */
440 char send_digit; /*!< digit we are sending */
443 unsigned int flags;
444 struct timeval rxcore;
445 struct timeval txcore;
446
447 struct timeval dtmfmute;
449 unsigned short seqno; /*!< Sequence number, RFC 3550, page 13. */
451 struct ast_rtcp *rtcp;
452 unsigned int asymmetric_codec; /*!< Indicate if asymmetric send/receive codecs are allowed */
453
454 struct ast_rtp_instance *bundled; /*!< The RTP instance we are bundled to */
455 /*!
456 * \brief The RTP instance owning us (used for debugging purposes)
457 * We don't hold a reference to the instance because it created
458 * us in the first place. It can't go away.
459 */
461 int stream_num; /*!< Stream num for this RTP instance */
462 AST_VECTOR(, struct rtp_ssrc_mapping) ssrc_mapping; /*!< Mappings of SSRC to RTP instances */
463 struct ast_sockaddr bind_address; /*!< Requested bind address for the sockets */
464
465 enum strict_rtp_state strict_rtp_state; /*!< Current state that strict RTP protection is in */
466 struct ast_sockaddr strict_rtp_address; /*!< Remote address information for strict RTP purposes */
467
468 /*
469 * Learning mode values based on pjmedia's probation mode. Many of these values are redundant to the above,
470 * but these are in place to keep learning mode sequence values sealed from their normal counterparts.
471 */
472 struct rtp_learning_info rtp_source_learn; /* Learning mode track for the expected RTP source */
473
474 struct rtp_red *red;
475
476 struct ast_data_buffer *send_buffer; /*!< Buffer for storing sent packets for retransmission */
477 struct ast_data_buffer *recv_buffer; /*!< Buffer for storing received packets for retransmission */
478
479 struct rtp_transport_wide_cc_statistics transport_wide_cc; /*!< Transport-cc statistics information */
480
481#ifdef HAVE_PJPROJECT
482 ast_cond_t cond; /*!< ICE/TURN condition for signaling */
483
484 struct ice_wrap *ice; /*!< ao2 wrapped ICE session */
485 enum ast_rtp_ice_role role; /*!< Our role in ICE negotiation */
486 pj_turn_sock *turn_rtp; /*!< RTP TURN relay */
487 pj_turn_sock *turn_rtcp; /*!< RTCP TURN relay */
488 pj_turn_state_t turn_state; /*!< Current state of the TURN relay session */
489 unsigned int passthrough:1; /*!< Bit to indicate that the received packet should be passed through */
490 unsigned int rtp_passthrough:1; /*!< Bit to indicate that TURN RTP should be passed through */
491 unsigned int rtcp_passthrough:1; /*!< Bit to indicate that TURN RTCP should be passed through */
492 unsigned int ice_port; /*!< Port that ICE was started with if it was previously started */
493 struct ast_sockaddr rtp_loop; /*!< Loopback address for forwarding RTP from TURN */
494 struct ast_sockaddr rtcp_loop; /*!< Loopback address for forwarding RTCP from TURN */
495
496 struct ast_rtp_ioqueue_thread *ioqueue; /*!< The ioqueue thread handling us */
497
498 char remote_ufrag[257]; /*!< The remote ICE username */
499 char remote_passwd[257]; /*!< The remote ICE password */
500
501 char local_ufrag[257]; /*!< The local ICE username */
502 char local_passwd[257]; /*!< The local ICE password */
503
504 struct ao2_container *ice_local_candidates; /*!< The local ICE candidates */
505 struct ao2_container *ice_active_remote_candidates; /*!< The remote ICE candidates */
506 struct ao2_container *ice_proposed_remote_candidates; /*!< Incoming remote ICE candidates for new session */
507 struct ast_sockaddr ice_original_rtp_addr; /*!< rtp address that ICE started on first session */
508 unsigned int ice_num_components; /*!< The number of ICE components */
509 unsigned int ice_media_started:1; /*!< ICE media has started, either on a valid pair or on ICE completion */
510#endif
511
512#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
513 SSL_CTX *ssl_ctx; /*!< SSL context */
514 enum ast_rtp_dtls_verify dtls_verify; /*!< What to verify */
515 enum ast_srtp_suite suite; /*!< SRTP crypto suite */
516 enum ast_rtp_dtls_hash local_hash; /*!< Local hash used for the fingerprint */
517 char local_fingerprint[160]; /*!< Fingerprint of our certificate */
518 enum ast_rtp_dtls_hash remote_hash; /*!< Remote hash used for the fingerprint */
519 unsigned char remote_fingerprint[EVP_MAX_MD_SIZE]; /*!< Fingerprint of the peer certificate */
520 unsigned int rekey; /*!< Interval at which to renegotiate and rekey */
521 int rekeyid; /*!< Scheduled item id for rekeying */
522 struct dtls_details dtls; /*!< DTLS state information */
523#endif
524};
525
526/*!
527 * \brief Structure defining an RTCP session.
528 *
529 * The concept "RTCP session" is not defined in RFC 3550, but since
530 * this structure is analogous to ast_rtp, which tracks a RTP session,
531 * it is logical to think of this as a RTCP session.
532 *
533 * RTCP packet is defined on page 9 of RFC 3550.
534 *
535 */
536struct ast_rtcp {
538 int s; /*!< Socket */
539 struct ast_sockaddr us; /*!< Socket representation of the local endpoint. */
540 struct ast_sockaddr them; /*!< Socket representation of the remote endpoint. */
541 unsigned int soc; /*!< What they told us */
542 unsigned int spc; /*!< What they told us */
543 unsigned int themrxlsr; /*!< The middle 32 bits of the NTP timestamp in the last received SR*/
544 struct timeval rxlsr; /*!< Time when we got their last SR */
545 struct timeval txlsr; /*!< Time when we sent or last SR*/
546 unsigned int expected_prior; /*!< no. packets in previous interval */
547 unsigned int received_prior; /*!< no. packets received in previous interval */
548 int schedid; /*!< Schedid returned from ast_sched_add() to schedule RTCP-transmissions*/
549 unsigned int rr_count; /*!< number of RRs we've sent, not including report blocks in SR's */
550 unsigned int sr_count; /*!< number of SRs we've sent */
551 unsigned int lastsrtxcount; /*!< Transmit packet count when last SR sent */
552 double accumulated_transit; /*!< accumulated a-dlsr-lsr */
553 double rtt; /*!< Last reported rtt */
554 double reported_jitter; /*!< The contents of their last jitter entry in the RR in seconds */
555 unsigned int reported_lost; /*!< Reported lost packets in their RR */
556
557 double reported_maxjitter; /*!< Maximum reported interarrival jitter */
558 double reported_minjitter; /*!< Minimum reported interarrival jitter */
559 double reported_normdev_jitter; /*!< Mean of reported interarrival jitter */
560 double reported_stdev_jitter; /*!< Standard deviation of reported interarrival jitter */
561 unsigned int reported_jitter_count; /*!< Reported interarrival jitter count */
562
563 double reported_maxlost; /*!< Maximum reported packets lost */
564 double reported_minlost; /*!< Minimum reported packets lost */
565 double reported_normdev_lost; /*!< Mean of reported packets lost */
566 double reported_stdev_lost; /*!< Standard deviation of reported packets lost */
567 unsigned int reported_lost_count; /*!< Reported packets lost count */
568
569 double rxlost; /*!< Calculated number of lost packets since last report */
570 double maxrxlost; /*!< Maximum calculated lost number of packets between reports */
571 double minrxlost; /*!< Minimum calculated lost number of packets between reports */
572 double normdev_rxlost; /*!< Mean of calculated lost packets between reports */
573 double stdev_rxlost; /*!< Standard deviation of calculated lost packets between reports */
574 unsigned int rxlost_count; /*!< Calculated lost packets sample count */
575
576 double maxrxjitter; /*!< Maximum of calculated interarrival jitter */
577 double minrxjitter; /*!< Minimum of calculated interarrival jitter */
578 double normdev_rxjitter; /*!< Mean of calculated interarrival jitter */
579 double stdev_rxjitter; /*!< Standard deviation of calculated interarrival jitter */
580 unsigned int rxjitter_count; /*!< Calculated interarrival jitter count */
581
582 double maxrtt; /*!< Maximum of calculated round trip time */
583 double minrtt; /*!< Minimum of calculated round trip time */
584 double normdevrtt; /*!< Mean of calculated round trip time */
585 double stdevrtt; /*!< Standard deviation of calculated round trip time */
586 unsigned int rtt_count; /*!< Calculated round trip time count */
587
588 double reported_mes; /*!< The calculated MES from their last RR */
589 double reported_maxmes; /*!< Maximum reported mes */
590 double reported_minmes; /*!< Minimum reported mes */
591 double reported_normdev_mes; /*!< Mean of reported mes */
592 double reported_stdev_mes; /*!< Standard deviation of reported mes */
593 unsigned int reported_mes_count; /*!< Reported mes count */
594
595 double maxrxmes; /*!< Maximum of calculated mes */
596 double minrxmes; /*!< Minimum of calculated mes */
597 double normdev_rxmes; /*!< Mean of calculated mes */
598 double stdev_rxmes; /*!< Standard deviation of calculated mes */
599 unsigned int rxmes_count; /*!< mes count */
600
601 /* VP8: sequence number for the RTCP FIR FCI */
603
604#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
605 struct dtls_details dtls; /*!< DTLS state information */
606#endif
607
608 /* Cached local address string allows us to generate
609 * RTCP stasis messages without having to look up our
610 * own address every time
611 */
614 /* Buffer for frames created during RTCP interpretation */
615 unsigned char frame_buf[512 + AST_FRIENDLY_OFFSET];
616};
617
618struct rtp_red {
619 struct ast_frame t140; /*!< Primary data */
620 struct ast_frame t140red; /*!< Redundant t140*/
621 unsigned char pt[AST_RED_MAX_GENERATION]; /*!< Payload types for redundancy data */
622 unsigned char ts[AST_RED_MAX_GENERATION]; /*!< Time stamps */
623 unsigned char len[AST_RED_MAX_GENERATION]; /*!< length of each generation */
624 int num_gen; /*!< Number of generations */
625 int schedid; /*!< Timer id */
626 unsigned char t140red_data[64000];
627 unsigned char buf_data[64000]; /*!< buffered primary data */
629 long int prev_ts;
630};
631
632/*! \brief Structure for storing RTP packets for retransmission */
634 size_t size; /*!< The size of the payload */
635 unsigned char buf[0]; /*!< The payload data */
636};
637
639
640/* Forward Declarations */
641static int ast_rtp_new(struct ast_rtp_instance *instance, struct ast_sched_context *sched, struct ast_sockaddr *addr, void *data);
642static int ast_rtp_destroy(struct ast_rtp_instance *instance);
643static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit);
644static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit);
645static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration);
646static int ast_rtp_dtmf_mode_set(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode);
647static enum ast_rtp_dtmf_mode ast_rtp_dtmf_mode_get(struct ast_rtp_instance *instance);
648static void ast_rtp_update_source(struct ast_rtp_instance *instance);
649static void ast_rtp_change_source(struct ast_rtp_instance *instance);
650static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame);
651static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtcp);
652static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value);
653static int ast_rtp_fd(struct ast_rtp_instance *instance, int rtcp);
654static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr);
655static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations);
656static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame);
657static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_rtp_instance *instance1);
658static int ast_rtp_get_stat(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat);
659static int ast_rtp_dtmf_compatible(struct ast_channel *chan0, struct ast_rtp_instance *instance0, struct ast_channel *chan1, struct ast_rtp_instance *instance1);
660static void ast_rtp_stun_request(struct ast_rtp_instance *instance, struct ast_sockaddr *suggestion, const char *username);
661static void ast_rtp_stop(struct ast_rtp_instance *instance);
662static int ast_rtp_qos_set(struct ast_rtp_instance *instance, int tos, int cos, const char* desc);
663static int ast_rtp_sendcng(struct ast_rtp_instance *instance, int level);
664static unsigned int ast_rtp_get_ssrc(struct ast_rtp_instance *instance);
665static const char *ast_rtp_get_cname(struct ast_rtp_instance *instance);
666static void ast_rtp_set_remote_ssrc(struct ast_rtp_instance *instance, unsigned int ssrc);
667static void ast_rtp_set_stream_num(struct ast_rtp_instance *instance, int stream_num);
669static int ast_rtp_bundle(struct ast_rtp_instance *child, struct ast_rtp_instance *parent);
670static void update_reported_mes_stats(struct ast_rtp *rtp);
671static void update_local_mes_stats(struct ast_rtp *rtp);
672
673#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
674static int ast_rtp_activate(struct ast_rtp_instance *instance);
675static void dtls_srtp_start_timeout_timer(struct ast_rtp_instance *instance, struct ast_rtp *rtp, int rtcp);
676static void dtls_srtp_stop_timeout_timer(struct ast_rtp_instance *instance, struct ast_rtp *rtp, int rtcp);
677static int dtls_bio_write(BIO *bio, const char *buf, int len);
678static long dtls_bio_ctrl(BIO *bio, int cmd, long arg1, void *arg2);
679static int dtls_bio_new(BIO *bio);
680static int dtls_bio_free(BIO *bio);
681
682#ifndef HAVE_OPENSSL_BIO_METHOD
683static BIO_METHOD dtls_bio_methods = {
684 .type = BIO_TYPE_BIO,
685 .name = "rtp write",
686 .bwrite = dtls_bio_write,
687 .ctrl = dtls_bio_ctrl,
688 .create = dtls_bio_new,
689 .destroy = dtls_bio_free,
690};
691#else
692static BIO_METHOD *dtls_bio_methods;
693#endif
694#endif
695
696static int __rtp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int rtcp, int *via_ice, int use_srtp);
697
698#ifdef HAVE_PJPROJECT
699static void stunaddr_resolve_callback(const struct ast_dns_query *query);
700static int store_stunaddr_resolved(const struct ast_dns_query *query);
701#endif
702
703#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
704static int dtls_bio_new(BIO *bio)
705{
706#ifdef HAVE_OPENSSL_BIO_METHOD
707 BIO_set_init(bio, 1);
708 BIO_set_data(bio, NULL);
709 BIO_set_shutdown(bio, 0);
710#else
711 bio->init = 1;
712 bio->ptr = NULL;
713 bio->flags = 0;
714#endif
715 return 1;
716}
717
718static int dtls_bio_free(BIO *bio)
719{
720 /* The pointer on the BIO is that of the RTP instance. It is not reference counted as the BIO
721 * lifetime is tied to the instance, and actions on the BIO are taken by the thread handling
722 * the RTP instance - not another thread.
723 */
724#ifdef HAVE_OPENSSL_BIO_METHOD
725 BIO_set_data(bio, NULL);
726#else
727 bio->ptr = NULL;
728#endif
729 return 1;
730}
731
732static int dtls_bio_write(BIO *bio, const char *buf, int len)
733{
734#ifdef HAVE_OPENSSL_BIO_METHOD
735 struct ast_rtp_instance *instance = BIO_get_data(bio);
736#else
737 struct ast_rtp_instance *instance = bio->ptr;
738#endif
739 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
740 int rtcp = 0;
741 struct ast_sockaddr remote_address = { {0, } };
742 int ice;
743 int bytes_sent;
744
745 /* OpenSSL can't tolerate a packet not being sent, so we always state that
746 * we sent the packet. If it isn't then retransmission will occur.
747 */
748
749 if (rtp->rtcp && rtp->rtcp->dtls.write_bio == bio) {
750 rtcp = 1;
751 ast_sockaddr_copy(&remote_address, &rtp->rtcp->them);
752 } else {
753 ast_rtp_instance_get_remote_address(instance, &remote_address);
754 }
755
756 if (ast_sockaddr_isnull(&remote_address)) {
757 return len;
758 }
759
760 bytes_sent = __rtp_sendto(instance, (char *)buf, len, 0, &remote_address, rtcp, &ice, 0);
761
762 if (bytes_sent > 0 && ast_debug_dtls_packet_is_allowed) {
763 ast_debug(0, "(%p) DTLS - sent %s packet to %s%s (len %-6.6d)\n",
764 instance, rtcp ? "RTCP" : "RTP", ast_sockaddr_stringify(&remote_address),
765 ice ? " (via ICE)" : "", bytes_sent);
766 }
767
768 return len;
769}
770
771static long dtls_bio_ctrl(BIO *bio, int cmd, long arg1, void *arg2)
772{
773 switch (cmd) {
774 case BIO_CTRL_FLUSH:
775 return 1;
776 case BIO_CTRL_DGRAM_QUERY_MTU:
777 return dtls_mtu;
778 case BIO_CTRL_WPENDING:
779 case BIO_CTRL_PENDING:
780 return 0L;
781 default:
782 return 0;
783 }
784}
785
786#endif
787
788#ifdef HAVE_PJPROJECT
789/*! \brief Helper function which clears the ICE host candidate mapping */
790static void host_candidate_overrides_clear(void)
791{
792 struct ast_ice_host_candidate *candidate;
793
794 AST_RWLIST_WRLOCK(&host_candidates);
795 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&host_candidates, candidate, next) {
797 ast_free(candidate);
798 }
800 AST_RWLIST_UNLOCK(&host_candidates);
801}
802
803/*! \brief Helper function which updates an ast_sockaddr with the candidate used for the component */
804static void update_address_with_ice_candidate(pj_ice_sess *ice, enum ast_rtp_ice_component_type component,
805 struct ast_sockaddr *cand_address)
806{
807 char address[PJ_INET6_ADDRSTRLEN];
808
809 if (component < 1 || !ice->comp[component - 1].valid_check) {
810 return;
811 }
812
813 ast_sockaddr_parse(cand_address,
814 pj_sockaddr_print(&ice->comp[component - 1].valid_check->rcand->addr, address,
815 sizeof(address), 0), 0);
816 ast_sockaddr_set_port(cand_address,
817 pj_sockaddr_get_port(&ice->comp[component - 1].valid_check->rcand->addr));
818}
819
820/*! \brief Destructor for locally created ICE candidates */
821static void ast_rtp_ice_candidate_destroy(void *obj)
822{
823 struct ast_rtp_engine_ice_candidate *candidate = obj;
824
825 if (candidate->foundation) {
826 ast_free(candidate->foundation);
827 }
828
829 if (candidate->transport) {
830 ast_free(candidate->transport);
831 }
832}
833
834/*! \pre instance is locked */
835static void ast_rtp_ice_set_authentication(struct ast_rtp_instance *instance, const char *ufrag, const char *password)
836{
837 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
838 int ice_attrb_reset = 0;
839
840 if (!ast_strlen_zero(ufrag)) {
841 if (!ast_strlen_zero(rtp->remote_ufrag) && strcmp(ufrag, rtp->remote_ufrag)) {
842 ice_attrb_reset = 1;
843 }
844 ast_copy_string(rtp->remote_ufrag, ufrag, sizeof(rtp->remote_ufrag));
845 }
846
847 if (!ast_strlen_zero(password)) {
848 if (!ast_strlen_zero(rtp->remote_passwd) && strcmp(password, rtp->remote_passwd)) {
849 ice_attrb_reset = 1;
850 }
851 ast_copy_string(rtp->remote_passwd, password, sizeof(rtp->remote_passwd));
852 }
853
854 /* If the remote ufrag or passwd changed, local ufrag and passwd need to regenerate */
855 if (ice_attrb_reset) {
856 generate_random_string(rtp->local_ufrag, sizeof(rtp->local_ufrag));
857 generate_random_string(rtp->local_passwd, sizeof(rtp->local_passwd));
858 }
859}
860
861static int ice_candidate_cmp(void *obj, void *arg, int flags)
862{
863 struct ast_rtp_engine_ice_candidate *candidate1 = obj, *candidate2 = arg;
864
865 if (strcmp(candidate1->foundation, candidate2->foundation) ||
866 candidate1->id != candidate2->id ||
867 candidate1->type != candidate2->type ||
868 ast_sockaddr_cmp(&candidate1->address, &candidate2->address)) {
869 return 0;
870 }
871
872 return CMP_MATCH | CMP_STOP;
873}
874
875/*! \pre instance is locked */
876static void ast_rtp_ice_add_remote_candidate(struct ast_rtp_instance *instance, const struct ast_rtp_engine_ice_candidate *candidate)
877{
878 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
879 struct ast_rtp_engine_ice_candidate *remote_candidate;
880
881 /* ICE sessions only support UDP candidates */
882 if (strcasecmp(candidate->transport, "udp")) {
883 return;
884 }
885
886 if (!rtp->ice_proposed_remote_candidates) {
887 rtp->ice_proposed_remote_candidates = ao2_container_alloc_list(
888 AO2_ALLOC_OPT_LOCK_MUTEX, 0, NULL, ice_candidate_cmp);
889 if (!rtp->ice_proposed_remote_candidates) {
890 return;
891 }
892 }
893
894 /* If this is going to exceed the maximum number of ICE candidates don't even add it */
895 if (ao2_container_count(rtp->ice_proposed_remote_candidates) == PJ_ICE_MAX_CAND) {
896 return;
897 }
898
899 if (!(remote_candidate = ao2_alloc(sizeof(*remote_candidate), ast_rtp_ice_candidate_destroy))) {
900 return;
901 }
902
903 remote_candidate->foundation = ast_strdup(candidate->foundation);
904 remote_candidate->id = candidate->id;
905 remote_candidate->transport = ast_strdup(candidate->transport);
906 remote_candidate->priority = candidate->priority;
907 ast_sockaddr_copy(&remote_candidate->address, &candidate->address);
908 ast_sockaddr_copy(&remote_candidate->relay_address, &candidate->relay_address);
909 remote_candidate->type = candidate->type;
910
911 ast_debug_ice(2, "(%p) ICE add remote candidate\n", instance);
912
913 ao2_link(rtp->ice_proposed_remote_candidates, remote_candidate);
914 ao2_ref(remote_candidate, -1);
915}
916
917AST_THREADSTORAGE(pj_thread_storage);
918
919/*! \brief Function used to check if the calling thread is registered with pjlib. If it is not it will be registered. */
920static void pj_thread_register_check(void)
921{
922 pj_thread_desc *desc;
923 pj_thread_t *thread;
924
925 if (pj_thread_is_registered() == PJ_TRUE) {
926 return;
927 }
928
929 desc = ast_threadstorage_get(&pj_thread_storage, sizeof(pj_thread_desc));
930 if (!desc) {
931 ast_log(LOG_ERROR, "Could not get thread desc from thread-local storage. Expect awful things to occur\n");
932 return;
933 }
934 pj_bzero(*desc, sizeof(*desc));
935
936 if (pj_thread_register("Asterisk Thread", *desc, &thread) != PJ_SUCCESS) {
937 ast_log(LOG_ERROR, "Coudln't register thread with PJLIB.\n");
938 }
939 return;
940}
941
942static int ice_create(struct ast_rtp_instance *instance, struct ast_sockaddr *addr,
943 int port, int replace);
944
945/*! \pre instance is locked */
946static void ast_rtp_ice_stop(struct ast_rtp_instance *instance)
947{
948 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
949 struct ice_wrap *ice;
950
951 ice = rtp->ice;
952 rtp->ice = NULL;
953 if (ice) {
954 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
955 ao2_unlock(instance);
956 ao2_ref(ice, -1);
957 ao2_lock(instance);
958 ast_debug_ice(2, "(%p) ICE stopped\n", instance);
959 }
960}
961
962/*!
963 * \brief ao2 ICE wrapper object destructor.
964 *
965 * \param vdoomed Object being destroyed.
966 *
967 * \note The associated struct ast_rtp_instance object must not
968 * be locked when unreffing the object. Otherwise we could
969 * deadlock trying to destroy the PJPROJECT ICE structure.
970 */
971static void ice_wrap_dtor(void *vdoomed)
972{
973 struct ice_wrap *ice = vdoomed;
974
975 if (ice->real_ice) {
976 pj_thread_register_check();
977
978 pj_ice_sess_destroy(ice->real_ice);
979 }
980}
981
982static void ast2pj_rtp_ice_role(enum ast_rtp_ice_role ast_role, enum pj_ice_sess_role *pj_role)
983{
984 switch (ast_role) {
986 *pj_role = PJ_ICE_SESS_ROLE_CONTROLLED;
987 break;
989 *pj_role = PJ_ICE_SESS_ROLE_CONTROLLING;
990 break;
991 }
992}
993
994static void pj2ast_rtp_ice_role(enum pj_ice_sess_role pj_role, enum ast_rtp_ice_role *ast_role)
995{
996 switch (pj_role) {
997 case PJ_ICE_SESS_ROLE_CONTROLLED:
998 *ast_role = AST_RTP_ICE_ROLE_CONTROLLED;
999 return;
1000 case PJ_ICE_SESS_ROLE_CONTROLLING:
1001 *ast_role = AST_RTP_ICE_ROLE_CONTROLLING;
1002 return;
1003 case PJ_ICE_SESS_ROLE_UNKNOWN:
1004 /* Don't change anything */
1005 return;
1006 default:
1007 /* If we aren't explicitly handling something, it's a bug */
1008 ast_assert(0);
1009 return;
1010 }
1011}
1012
1013/*! \pre instance is locked */
1014static int ice_reset_session(struct ast_rtp_instance *instance)
1015{
1016 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1017 int res;
1018
1019 ast_debug_ice(3, "(%p) ICE resetting\n", instance);
1020 if (!rtp->ice->real_ice->is_nominating && !rtp->ice->real_ice->is_complete) {
1021 ast_debug_ice(3, " (%p) ICE nevermind, not ready for a reset\n", instance);
1022 return 0;
1023 }
1024
1025 ast_debug_ice(3, "(%p) ICE recreating ICE session %s (%d)\n",
1026 instance, ast_sockaddr_stringify(&rtp->ice_original_rtp_addr), rtp->ice_port);
1027 res = ice_create(instance, &rtp->ice_original_rtp_addr, rtp->ice_port, 1);
1028 if (!res) {
1029 /* Use the current expected role for the ICE session */
1030 enum pj_ice_sess_role role = PJ_ICE_SESS_ROLE_UNKNOWN;
1031 ast2pj_rtp_ice_role(rtp->role, &role);
1032 pj_ice_sess_change_role(rtp->ice->real_ice, role);
1033 }
1034
1035 /* If we only have one component now, and we previously set up TURN for RTCP,
1036 * we need to destroy that TURN socket.
1037 */
1038 if (rtp->ice_num_components == 1 && rtp->turn_rtcp) {
1039 struct timeval wait = ast_tvadd(ast_tvnow(), ast_samp2tv(TURN_STATE_WAIT_TIME, 1000));
1040 struct timespec ts = { .tv_sec = wait.tv_sec, .tv_nsec = wait.tv_usec * 1000, };
1041
1042 rtp->turn_state = PJ_TURN_STATE_NULL;
1043
1044 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
1045 ao2_unlock(instance);
1046 pj_turn_sock_destroy(rtp->turn_rtcp);
1047 ao2_lock(instance);
1048 while (rtp->turn_state != PJ_TURN_STATE_DESTROYING) {
1049 ast_cond_timedwait(&rtp->cond, ao2_object_get_lockaddr(instance), &ts);
1050 }
1051 }
1052
1053 rtp->ice_media_started = 0;
1054
1055 return res;
1056}
1057
1058static int ice_candidates_compare(struct ao2_container *left, struct ao2_container *right)
1059{
1060 struct ao2_iterator i;
1061 struct ast_rtp_engine_ice_candidate *right_candidate;
1062
1063 if (ao2_container_count(left) != ao2_container_count(right)) {
1064 return -1;
1065 }
1066
1067 i = ao2_iterator_init(right, 0);
1068 while ((right_candidate = ao2_iterator_next(&i))) {
1069 struct ast_rtp_engine_ice_candidate *left_candidate = ao2_find(left, right_candidate, OBJ_POINTER);
1070
1071 if (!left_candidate) {
1072 ao2_ref(right_candidate, -1);
1074 return -1;
1075 }
1076
1077 ao2_ref(left_candidate, -1);
1078 ao2_ref(right_candidate, -1);
1079 }
1081
1082 return 0;
1083}
1084
1085/*! \pre instance is locked */
1086static void ast_rtp_ice_start(struct ast_rtp_instance *instance)
1087{
1088 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1089 pj_str_t ufrag = pj_str(rtp->remote_ufrag), passwd = pj_str(rtp->remote_passwd);
1090 pj_ice_sess_cand candidates[PJ_ICE_MAX_CAND];
1091 struct ao2_iterator i;
1092 struct ast_rtp_engine_ice_candidate *candidate;
1093 int cand_cnt = 0, has_rtp = 0, has_rtcp = 0;
1094
1095 if (!rtp->ice || !rtp->ice_proposed_remote_candidates) {
1096 return;
1097 }
1098
1099 /* Check for equivalence in the lists */
1100 if (rtp->ice_active_remote_candidates &&
1101 !ice_candidates_compare(rtp->ice_proposed_remote_candidates, rtp->ice_active_remote_candidates)) {
1102 ast_debug_ice(2, "(%p) ICE proposed equals active candidates\n", instance);
1103 ao2_cleanup(rtp->ice_proposed_remote_candidates);
1104 rtp->ice_proposed_remote_candidates = NULL;
1105 /* If this ICE session is being preserved then go back to the role it currently is */
1106 pj2ast_rtp_ice_role(rtp->ice->real_ice->role, &rtp->role);
1107 return;
1108 }
1109
1110 /* Out with the old, in with the new */
1111 ao2_cleanup(rtp->ice_active_remote_candidates);
1112 rtp->ice_active_remote_candidates = rtp->ice_proposed_remote_candidates;
1113 rtp->ice_proposed_remote_candidates = NULL;
1114
1115 ast_debug_ice(2, "(%p) ICE start\n", instance);
1116
1117 /* Reset the ICE session. Is this going to work? */
1118 if (ice_reset_session(instance)) {
1119 ast_log(LOG_NOTICE, "(%p) ICE failed to create replacement session\n", instance);
1120 return;
1121 }
1122
1123 pj_thread_register_check();
1124
1125 i = ao2_iterator_init(rtp->ice_active_remote_candidates, 0);
1126
1127 while ((candidate = ao2_iterator_next(&i)) && (cand_cnt < PJ_ICE_MAX_CAND)) {
1128 pj_str_t address;
1129
1130 /* there needs to be at least one rtp and rtcp candidate in the list */
1131 has_rtp |= candidate->id == AST_RTP_ICE_COMPONENT_RTP;
1132 has_rtcp |= candidate->id == AST_RTP_ICE_COMPONENT_RTCP;
1133
1134 pj_strdup2(rtp->ice->real_ice->pool, &candidates[cand_cnt].foundation,
1135 candidate->foundation);
1136 candidates[cand_cnt].comp_id = candidate->id;
1137 candidates[cand_cnt].prio = candidate->priority;
1138
1139 pj_sockaddr_parse(pj_AF_UNSPEC(), 0, pj_cstr(&address, ast_sockaddr_stringify(&candidate->address)), &candidates[cand_cnt].addr);
1140
1141 if (!ast_sockaddr_isnull(&candidate->relay_address)) {
1142 pj_sockaddr_parse(pj_AF_UNSPEC(), 0, pj_cstr(&address, ast_sockaddr_stringify(&candidate->relay_address)), &candidates[cand_cnt].rel_addr);
1143 }
1144
1145 if (candidate->type == AST_RTP_ICE_CANDIDATE_TYPE_HOST) {
1146 candidates[cand_cnt].type = PJ_ICE_CAND_TYPE_HOST;
1147 } else if (candidate->type == AST_RTP_ICE_CANDIDATE_TYPE_SRFLX) {
1148 candidates[cand_cnt].type = PJ_ICE_CAND_TYPE_SRFLX;
1149 } else if (candidate->type == AST_RTP_ICE_CANDIDATE_TYPE_RELAYED) {
1150 candidates[cand_cnt].type = PJ_ICE_CAND_TYPE_RELAYED;
1151 }
1152
1153 if (candidate->id == AST_RTP_ICE_COMPONENT_RTP && rtp->turn_rtp) {
1154 ast_debug_ice(2, "(%p) ICE RTP candidate %s\n", instance, ast_sockaddr_stringify(&candidate->address));
1155 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
1156 ao2_unlock(instance);
1157 pj_turn_sock_set_perm(rtp->turn_rtp, 1, &candidates[cand_cnt].addr, 1);
1158 ao2_lock(instance);
1159 } else if (candidate->id == AST_RTP_ICE_COMPONENT_RTCP && rtp->turn_rtcp) {
1160 ast_debug_ice(2, "(%p) ICE RTCP candidate %s\n", instance, ast_sockaddr_stringify(&candidate->address));
1161 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
1162 ao2_unlock(instance);
1163 pj_turn_sock_set_perm(rtp->turn_rtcp, 1, &candidates[cand_cnt].addr, 1);
1164 ao2_lock(instance);
1165 }
1166
1167 cand_cnt++;
1168 ao2_ref(candidate, -1);
1169 }
1170
1172
1173 if (cand_cnt < ao2_container_count(rtp->ice_active_remote_candidates)) {
1174 ast_log(LOG_WARNING, "(%p) ICE lost %d candidates. Consider increasing PJ_ICE_MAX_CAND in PJSIP\n",
1175 instance, ao2_container_count(rtp->ice_active_remote_candidates) - cand_cnt);
1176 }
1177
1178 if (!has_rtp) {
1179 ast_log(LOG_WARNING, "(%p) ICE no RTP candidates; skipping checklist\n", instance);
1180 }
1181
1182 /* If we're only dealing with one ICE component, then we don't care about the lack of RTCP candidates */
1183 if (!has_rtcp && rtp->ice_num_components > 1) {
1184 ast_log(LOG_WARNING, "(%p) ICE no RTCP candidates; skipping checklist\n", instance);
1185 }
1186
1187 if (rtp->ice && has_rtp && (has_rtcp || rtp->ice_num_components == 1)) {
1188 pj_status_t res;
1189 char reason[80];
1190 struct ice_wrap *ice;
1191
1192 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
1193 ice = rtp->ice;
1194 ao2_ref(ice, +1);
1195 ao2_unlock(instance);
1196 res = pj_ice_sess_create_check_list(ice->real_ice, &ufrag, &passwd, cand_cnt, &candidates[0]);
1197 if (res == PJ_SUCCESS) {
1198 ast_debug_ice(2, "(%p) ICE successfully created checklist\n", instance);
1199 ast_test_suite_event_notify("ICECHECKLISTCREATE", "Result: SUCCESS");
1200 pj_ice_sess_start_check(ice->real_ice);
1201 pj_timer_heap_poll(timer_heap, NULL);
1202 ao2_ref(ice, -1);
1203 ao2_lock(instance);
1205 return;
1206 }
1207 ao2_ref(ice, -1);
1208 ao2_lock(instance);
1209
1210 pj_strerror(res, reason, sizeof(reason));
1211 ast_log(LOG_WARNING, "(%p) ICE failed to create session check list: %s\n", instance, reason);
1212 }
1213
1214 ast_test_suite_event_notify("ICECHECKLISTCREATE", "Result: FAILURE");
1215
1216 /* even though create check list failed don't stop ice as
1217 it might still work */
1218 /* however we do need to reset remote candidates since
1219 this function may be re-entered */
1220 ao2_ref(rtp->ice_active_remote_candidates, -1);
1221 rtp->ice_active_remote_candidates = NULL;
1222 if (rtp->ice) {
1223 rtp->ice->real_ice->rcand_cnt = rtp->ice->real_ice->clist.count = 0;
1224 }
1225}
1226
1227/*! \pre instance is locked */
1228static const char *ast_rtp_ice_get_ufrag(struct ast_rtp_instance *instance)
1229{
1230 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1231
1232 return rtp->local_ufrag;
1233}
1234
1235/*! \pre instance is locked */
1236static const char *ast_rtp_ice_get_password(struct ast_rtp_instance *instance)
1237{
1238 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1239
1240 return rtp->local_passwd;
1241}
1242
1243/*! \pre instance is locked */
1244static struct ao2_container *ast_rtp_ice_get_local_candidates(struct ast_rtp_instance *instance)
1245{
1246 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1247
1248 if (rtp->ice_local_candidates) {
1249 ao2_ref(rtp->ice_local_candidates, +1);
1250 }
1251
1252 return rtp->ice_local_candidates;
1253}
1254
1255/*! \pre instance is locked */
1256static void ast_rtp_ice_lite(struct ast_rtp_instance *instance)
1257{
1258 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1259
1260 if (!rtp->ice) {
1261 return;
1262 }
1263
1264 pj_thread_register_check();
1265
1266 pj_ice_sess_change_role(rtp->ice->real_ice, PJ_ICE_SESS_ROLE_CONTROLLING);
1267}
1268
1269/*! \pre instance is locked */
1270static void ast_rtp_ice_set_role(struct ast_rtp_instance *instance, enum ast_rtp_ice_role role)
1271{
1272 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1273
1274 if (!rtp->ice) {
1275 ast_debug_ice(3, "(%p) ICE set role failed; no ice instance\n", instance);
1276 return;
1277 }
1278
1279 rtp->role = role;
1280
1281 if (!rtp->ice->real_ice->is_nominating && !rtp->ice->real_ice->is_complete) {
1282 pj_thread_register_check();
1283 ast_debug_ice(2, "(%p) ICE set role to %s\n",
1284 instance, role == AST_RTP_ICE_ROLE_CONTROLLED ? "CONTROLLED" : "CONTROLLING");
1285 pj_ice_sess_change_role(rtp->ice->real_ice, role == AST_RTP_ICE_ROLE_CONTROLLED ?
1286 PJ_ICE_SESS_ROLE_CONTROLLED : PJ_ICE_SESS_ROLE_CONTROLLING);
1287 } else {
1288 ast_debug_ice(2, "(%p) ICE not setting role because state is %s\n",
1289 instance, rtp->ice->real_ice->is_nominating ? "nominating" : "complete");
1290 }
1291}
1292
1293/*! \pre instance is locked */
1294static void ast_rtp_ice_add_cand(struct ast_rtp_instance *instance, struct ast_rtp *rtp,
1295 unsigned comp_id, unsigned transport_id, pj_ice_cand_type type, pj_uint16_t local_pref,
1296 const pj_sockaddr_t *addr, const pj_sockaddr_t *base_addr, const pj_sockaddr_t *rel_addr,
1297 int addr_len)
1298{
1299 pj_str_t foundation;
1300 struct ast_rtp_engine_ice_candidate *candidate, *existing;
1301 struct ice_wrap *ice;
1302 char address[PJ_INET6_ADDRSTRLEN];
1303 pj_status_t status;
1304
1305 if (!rtp->ice) {
1306 return;
1307 }
1308
1309 pj_thread_register_check();
1310
1311 pj_ice_calc_foundation(rtp->ice->real_ice->pool, &foundation, type, addr);
1312
1313 if (!rtp->ice_local_candidates) {
1314 rtp->ice_local_candidates = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_MUTEX, 0,
1315 NULL, ice_candidate_cmp);
1316 if (!rtp->ice_local_candidates) {
1317 return;
1318 }
1319 }
1320
1321 if (!(candidate = ao2_alloc(sizeof(*candidate), ast_rtp_ice_candidate_destroy))) {
1322 return;
1323 }
1324
1325 candidate->foundation = ast_strndup(pj_strbuf(&foundation), pj_strlen(&foundation));
1326 candidate->id = comp_id;
1327 candidate->transport = ast_strdup("UDP");
1328
1329 ast_sockaddr_parse(&candidate->address, pj_sockaddr_print(addr, address, sizeof(address), 0), 0);
1330 ast_sockaddr_set_port(&candidate->address, pj_sockaddr_get_port(addr));
1331
1332 if (rel_addr) {
1333 ast_sockaddr_parse(&candidate->relay_address, pj_sockaddr_print(rel_addr, address, sizeof(address), 0), 0);
1334 ast_sockaddr_set_port(&candidate->relay_address, pj_sockaddr_get_port(rel_addr));
1335 }
1336
1337 if (type == PJ_ICE_CAND_TYPE_HOST) {
1339 } else if (type == PJ_ICE_CAND_TYPE_SRFLX) {
1341 } else if (type == PJ_ICE_CAND_TYPE_RELAYED) {
1343 }
1344
1345 if ((existing = ao2_find(rtp->ice_local_candidates, candidate, OBJ_POINTER))) {
1346 ao2_ref(existing, -1);
1347 ao2_ref(candidate, -1);
1348 return;
1349 }
1350
1351 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
1352 ice = rtp->ice;
1353 ao2_ref(ice, +1);
1354 ao2_unlock(instance);
1355 status = pj_ice_sess_add_cand(ice->real_ice, comp_id, transport_id, type, local_pref,
1356 &foundation, addr, base_addr, rel_addr, addr_len, NULL);
1357 ao2_ref(ice, -1);
1358 ao2_lock(instance);
1359 if (!rtp->ice || status != PJ_SUCCESS) {
1360 ast_debug_ice(2, "(%p) ICE unable to add candidate: %s, %d\n", instance, ast_sockaddr_stringify(
1361 &candidate->address), candidate->priority);
1362 ao2_ref(candidate, -1);
1363 return;
1364 }
1365
1366 /* By placing the candidate into the ICE session it will have produced the priority, so update the local candidate with it */
1367 candidate->priority = rtp->ice->real_ice->lcand[rtp->ice->real_ice->lcand_cnt - 1].prio;
1368
1369 ast_debug_ice(2, "(%p) ICE add candidate: %s, %d\n", instance, ast_sockaddr_stringify(
1370 &candidate->address), candidate->priority);
1371
1372 ao2_link(rtp->ice_local_candidates, candidate);
1373 ao2_ref(candidate, -1);
1374}
1375
1376/* PJPROJECT TURN callback */
1377static void ast_rtp_on_turn_rx_rtp_data(pj_turn_sock *turn_sock, void *pkt, unsigned pkt_len, const pj_sockaddr_t *peer_addr, unsigned addr_len)
1378{
1379 struct ast_rtp_instance *instance = pj_turn_sock_get_user_data(turn_sock);
1380 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1381 struct ice_wrap *ice;
1382 pj_status_t status;
1383
1384 ao2_lock(instance);
1385 ice = ao2_bump(rtp->ice);
1386 ao2_unlock(instance);
1387
1388 if (ice) {
1389 status = pj_ice_sess_on_rx_pkt(ice->real_ice, AST_RTP_ICE_COMPONENT_RTP,
1390 TRANSPORT_TURN_RTP, pkt, pkt_len, peer_addr, addr_len);
1391 ao2_ref(ice, -1);
1392 if (status != PJ_SUCCESS) {
1393 char buf[100];
1394
1395 pj_strerror(status, buf, sizeof(buf));
1396 ast_log(LOG_WARNING, "(%p) ICE PJ Rx error status code: %d '%s'.\n",
1397 instance, (int)status, buf);
1398 return;
1399 }
1400 if (!rtp->rtp_passthrough) {
1401 return;
1402 }
1403 rtp->rtp_passthrough = 0;
1404 }
1405
1406 ast_sendto(rtp->s, pkt, pkt_len, 0, &rtp->rtp_loop);
1407}
1408
1409/* PJPROJECT TURN callback */
1410static void ast_rtp_on_turn_rtp_state(pj_turn_sock *turn_sock, pj_turn_state_t old_state, pj_turn_state_t new_state)
1411{
1412 struct ast_rtp_instance *instance = pj_turn_sock_get_user_data(turn_sock);
1413 struct ast_rtp *rtp;
1414
1415 /* If this is a leftover from an already notified RTP instance just ignore the state change */
1416 if (!instance) {
1417 return;
1418 }
1419
1420 rtp = ast_rtp_instance_get_data(instance);
1421
1422 ao2_lock(instance);
1423
1424 /* We store the new state so the other thread can actually handle it */
1425 rtp->turn_state = new_state;
1426 ast_cond_signal(&rtp->cond);
1427
1428 if (new_state == PJ_TURN_STATE_DESTROYING) {
1429 pj_turn_sock_set_user_data(rtp->turn_rtp, NULL);
1430 rtp->turn_rtp = NULL;
1431 }
1432
1433 ao2_unlock(instance);
1434}
1435
1436/* RTP TURN Socket interface declaration */
1437static pj_turn_sock_cb ast_rtp_turn_rtp_sock_cb = {
1438 .on_rx_data = ast_rtp_on_turn_rx_rtp_data,
1439 .on_state = ast_rtp_on_turn_rtp_state,
1440};
1441
1442/* PJPROJECT TURN callback */
1443static void ast_rtp_on_turn_rx_rtcp_data(pj_turn_sock *turn_sock, void *pkt, unsigned pkt_len, const pj_sockaddr_t *peer_addr, unsigned addr_len)
1444{
1445 struct ast_rtp_instance *instance = pj_turn_sock_get_user_data(turn_sock);
1446 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1447 struct ice_wrap *ice;
1448 pj_status_t status;
1449
1450 ao2_lock(instance);
1451 ice = ao2_bump(rtp->ice);
1452 ao2_unlock(instance);
1453
1454 if (ice) {
1455 status = pj_ice_sess_on_rx_pkt(ice->real_ice, AST_RTP_ICE_COMPONENT_RTCP,
1456 TRANSPORT_TURN_RTCP, pkt, pkt_len, peer_addr, addr_len);
1457 ao2_ref(ice, -1);
1458 if (status != PJ_SUCCESS) {
1459 char buf[100];
1460
1461 pj_strerror(status, buf, sizeof(buf));
1462 ast_log(LOG_WARNING, "PJ ICE Rx error status code: %d '%s'.\n",
1463 (int)status, buf);
1464 return;
1465 }
1466 if (!rtp->rtcp_passthrough) {
1467 return;
1468 }
1469 rtp->rtcp_passthrough = 0;
1470 }
1471
1472 ast_sendto(rtp->rtcp->s, pkt, pkt_len, 0, &rtp->rtcp_loop);
1473}
1474
1475/* PJPROJECT TURN callback */
1476static void ast_rtp_on_turn_rtcp_state(pj_turn_sock *turn_sock, pj_turn_state_t old_state, pj_turn_state_t new_state)
1477{
1478 struct ast_rtp_instance *instance = pj_turn_sock_get_user_data(turn_sock);
1479 struct ast_rtp *rtp;
1480
1481 /* If this is a leftover from an already destroyed RTP instance just ignore the state change */
1482 if (!instance) {
1483 return;
1484 }
1485
1486 rtp = ast_rtp_instance_get_data(instance);
1487
1488 ao2_lock(instance);
1489
1490 /* We store the new state so the other thread can actually handle it */
1491 rtp->turn_state = new_state;
1492 ast_cond_signal(&rtp->cond);
1493
1494 if (new_state == PJ_TURN_STATE_DESTROYING) {
1495 pj_turn_sock_set_user_data(rtp->turn_rtcp, NULL);
1496 rtp->turn_rtcp = NULL;
1497 }
1498
1499 ao2_unlock(instance);
1500}
1501
1502/* RTCP TURN Socket interface declaration */
1503static pj_turn_sock_cb ast_rtp_turn_rtcp_sock_cb = {
1504 .on_rx_data = ast_rtp_on_turn_rx_rtcp_data,
1505 .on_state = ast_rtp_on_turn_rtcp_state,
1506};
1507
1508/*! \brief Worker thread for ioqueue and timerheap */
1509static int ioqueue_worker_thread(void *data)
1510{
1511 struct ast_rtp_ioqueue_thread *ioqueue = data;
1512
1513 while (!ioqueue->terminate) {
1514 const pj_time_val delay = {0, 10};
1515
1516 pj_ioqueue_poll(ioqueue->ioqueue, &delay);
1517
1518 pj_timer_heap_poll(ioqueue->timerheap, NULL);
1519 }
1520
1521 return 0;
1522}
1523
1524/*! \brief Destroyer for ioqueue thread */
1525static void rtp_ioqueue_thread_destroy(struct ast_rtp_ioqueue_thread *ioqueue)
1526{
1527 if (ioqueue->thread) {
1528 ioqueue->terminate = 1;
1529 pj_thread_join(ioqueue->thread);
1530 pj_thread_destroy(ioqueue->thread);
1531 }
1532
1533 if (ioqueue->pool) {
1534 /* This mimics the behavior of pj_pool_safe_release
1535 * which was introduced in pjproject 2.6.
1536 */
1537 pj_pool_t *temp_pool = ioqueue->pool;
1538
1539 ioqueue->pool = NULL;
1540 pj_pool_release(temp_pool);
1541 }
1542
1543 ast_free(ioqueue);
1544}
1545
1546/*! \brief Removal function for ioqueue thread, determines if it should be terminated and destroyed */
1547static void rtp_ioqueue_thread_remove(struct ast_rtp_ioqueue_thread *ioqueue)
1548{
1549 int destroy = 0;
1550
1551 /* If nothing is using this ioqueue thread destroy it */
1552 AST_LIST_LOCK(&ioqueues);
1553 if ((ioqueue->count -= 2) == 0) {
1554 destroy = 1;
1555 AST_LIST_REMOVE(&ioqueues, ioqueue, next);
1556 }
1557 AST_LIST_UNLOCK(&ioqueues);
1558
1559 if (!destroy) {
1560 return;
1561 }
1562
1563 rtp_ioqueue_thread_destroy(ioqueue);
1564}
1565
1566/*! \brief Finder and allocator for an ioqueue thread */
1567static struct ast_rtp_ioqueue_thread *rtp_ioqueue_thread_get_or_create(void)
1568{
1569 struct ast_rtp_ioqueue_thread *ioqueue;
1570 pj_lock_t *lock;
1571
1572 AST_LIST_LOCK(&ioqueues);
1573
1574 /* See if an ioqueue thread exists that can handle more */
1575 AST_LIST_TRAVERSE(&ioqueues, ioqueue, next) {
1576 if ((ioqueue->count + 2) < PJ_IOQUEUE_MAX_HANDLES) {
1577 break;
1578 }
1579 }
1580
1581 /* If we found one bump it up and return it */
1582 if (ioqueue) {
1583 ioqueue->count += 2;
1584 goto end;
1585 }
1586
1587 ioqueue = ast_calloc(1, sizeof(*ioqueue));
1588 if (!ioqueue) {
1589 goto end;
1590 }
1591
1592 ioqueue->pool = pj_pool_create(&cachingpool.factory, "rtp", 512, 512, NULL);
1593
1594 /* We use a timer on the ioqueue thread for TURN so that two threads aren't operating
1595 * on a session at the same time
1596 */
1597 if (pj_timer_heap_create(ioqueue->pool, 4, &ioqueue->timerheap) != PJ_SUCCESS) {
1598 goto fatal;
1599 }
1600
1601 if (pj_lock_create_recursive_mutex(ioqueue->pool, "rtp%p", &lock) != PJ_SUCCESS) {
1602 goto fatal;
1603 }
1604
1605 pj_timer_heap_set_lock(ioqueue->timerheap, lock, PJ_TRUE);
1606
1607 if (pj_ioqueue_create(ioqueue->pool, PJ_IOQUEUE_MAX_HANDLES, &ioqueue->ioqueue) != PJ_SUCCESS) {
1608 goto fatal;
1609 }
1610
1611 if (pj_thread_create(ioqueue->pool, "ice", &ioqueue_worker_thread, ioqueue, 0, 0, &ioqueue->thread) != PJ_SUCCESS) {
1612 goto fatal;
1613 }
1614
1615 AST_LIST_INSERT_HEAD(&ioqueues, ioqueue, next);
1616
1617 /* Since this is being returned to an active session the count always starts at 2 */
1618 ioqueue->count = 2;
1619
1620 goto end;
1621
1622fatal:
1623 rtp_ioqueue_thread_destroy(ioqueue);
1624 ioqueue = NULL;
1625
1626end:
1627 AST_LIST_UNLOCK(&ioqueues);
1628 return ioqueue;
1629}
1630
1631/*! \pre instance is locked */
1632static void ast_rtp_ice_turn_request(struct ast_rtp_instance *instance, enum ast_rtp_ice_component_type component,
1633 enum ast_transport transport, const char *server, unsigned int port, const char *username, const char *password)
1634{
1635 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1636 pj_turn_sock **turn_sock;
1637 const pj_turn_sock_cb *turn_cb;
1638 pj_turn_tp_type conn_type;
1639 int conn_transport;
1640 pj_stun_auth_cred cred = { 0, };
1641 pj_str_t turn_addr;
1642 struct ast_sockaddr addr = { { 0, } };
1643 pj_stun_config stun_config;
1644 struct timeval wait = ast_tvadd(ast_tvnow(), ast_samp2tv(TURN_STATE_WAIT_TIME, 1000));
1645 struct timespec ts = { .tv_sec = wait.tv_sec, .tv_nsec = wait.tv_usec * 1000, };
1646 pj_turn_session_info info;
1647 struct ast_sockaddr local, loop;
1648 pj_status_t status;
1649 pj_turn_sock_cfg turn_sock_cfg;
1650 struct ice_wrap *ice;
1651
1652 ast_rtp_instance_get_local_address(instance, &local);
1653 if (ast_sockaddr_is_ipv4(&local)) {
1654 ast_sockaddr_parse(&loop, "127.0.0.1", PARSE_PORT_FORBID);
1655 } else {
1657 }
1658
1659 /* Determine what component we are requesting a TURN session for */
1660 if (component == AST_RTP_ICE_COMPONENT_RTP) {
1661 turn_sock = &rtp->turn_rtp;
1662 turn_cb = &ast_rtp_turn_rtp_sock_cb;
1663 conn_transport = TRANSPORT_TURN_RTP;
1665 } else if (component == AST_RTP_ICE_COMPONENT_RTCP) {
1666 turn_sock = &rtp->turn_rtcp;
1667 turn_cb = &ast_rtp_turn_rtcp_sock_cb;
1668 conn_transport = TRANSPORT_TURN_RTCP;
1670 } else {
1671 return;
1672 }
1673
1674 if (transport == AST_TRANSPORT_UDP) {
1675 conn_type = PJ_TURN_TP_UDP;
1676 } else if (transport == AST_TRANSPORT_TCP) {
1677 conn_type = PJ_TURN_TP_TCP;
1678 } else {
1679 ast_assert(0);
1680 return;
1681 }
1682
1683 ast_sockaddr_parse(&addr, server, PARSE_PORT_FORBID);
1684
1685 if (*turn_sock) {
1686 rtp->turn_state = PJ_TURN_STATE_NULL;
1687
1688 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
1689 ao2_unlock(instance);
1690 pj_turn_sock_destroy(*turn_sock);
1691 ao2_lock(instance);
1692 while (rtp->turn_state != PJ_TURN_STATE_DESTROYING) {
1693 ast_cond_timedwait(&rtp->cond, ao2_object_get_lockaddr(instance), &ts);
1694 }
1695 }
1696
1697 if (component == AST_RTP_ICE_COMPONENT_RTP && !rtp->ioqueue) {
1698 /*
1699 * We cannot hold the instance lock because we could wait
1700 * for the ioqueue thread to die and we might deadlock as
1701 * a result.
1702 */
1703 ao2_unlock(instance);
1704 rtp->ioqueue = rtp_ioqueue_thread_get_or_create();
1705 ao2_lock(instance);
1706 if (!rtp->ioqueue) {
1707 return;
1708 }
1709 }
1710
1711 pj_stun_config_init(&stun_config, &cachingpool.factory, 0, rtp->ioqueue->ioqueue, rtp->ioqueue->timerheap);
1712 if (!stun_software_attribute) {
1713 stun_config.software_name = pj_str(NULL);
1714 }
1715
1716 /* Use ICE session group lock for TURN session to avoid deadlock */
1717 pj_turn_sock_cfg_default(&turn_sock_cfg);
1718 ice = rtp->ice;
1719 if (ice) {
1720 turn_sock_cfg.grp_lock = ice->real_ice->grp_lock;
1721 ao2_ref(ice, +1);
1722 }
1723
1724 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
1725 ao2_unlock(instance);
1726 status = pj_turn_sock_create(&stun_config,
1727 ast_sockaddr_is_ipv4(&addr) ? pj_AF_INET() : pj_AF_INET6(), conn_type,
1728 turn_cb, &turn_sock_cfg, instance, turn_sock);
1729 ao2_cleanup(ice);
1730 if (status != PJ_SUCCESS) {
1731 ast_log(LOG_WARNING, "(%p) Could not create a TURN client socket\n", instance);
1732 ao2_lock(instance);
1733 return;
1734 }
1735
1736 cred.type = PJ_STUN_AUTH_CRED_STATIC;
1737 pj_strset2(&cred.data.static_cred.username, (char*)username);
1738 cred.data.static_cred.data_type = PJ_STUN_PASSWD_PLAIN;
1739 pj_strset2(&cred.data.static_cred.data, (char*)password);
1740
1741 pj_turn_sock_alloc(*turn_sock, pj_cstr(&turn_addr, server), port, NULL, &cred, NULL);
1742
1743 ast_debug_ice(2, "(%p) ICE request TURN %s %s candidate\n", instance,
1744 transport == AST_TRANSPORT_UDP ? "UDP" : "TCP",
1745 component == AST_RTP_ICE_COMPONENT_RTP ? "RTP" : "RTCP");
1746
1747 ao2_lock(instance);
1748
1749 /*
1750 * Because the TURN socket is asynchronous and we are synchronous we need to
1751 * wait until it is done
1752 */
1753 while (rtp->turn_state < PJ_TURN_STATE_READY) {
1754 ast_cond_timedwait(&rtp->cond, ao2_object_get_lockaddr(instance), &ts);
1755 }
1756
1757 /* If a TURN session was allocated add it as a candidate */
1758 if (rtp->turn_state != PJ_TURN_STATE_READY) {
1759 return;
1760 }
1761
1762 pj_turn_sock_get_info(*turn_sock, &info);
1763
1764 ast_rtp_ice_add_cand(instance, rtp, component, conn_transport,
1765 PJ_ICE_CAND_TYPE_RELAYED, 65535, &info.relay_addr, &info.relay_addr,
1766 &info.mapped_addr, pj_sockaddr_get_len(&info.relay_addr));
1767
1768 if (component == AST_RTP_ICE_COMPONENT_RTP) {
1769 ast_sockaddr_copy(&rtp->rtp_loop, &loop);
1770 } else if (component == AST_RTP_ICE_COMPONENT_RTCP) {
1771 ast_sockaddr_copy(&rtp->rtcp_loop, &loop);
1772 }
1773}
1774
1775static char *generate_random_string(char *buf, size_t size)
1776{
1777 long val[4];
1778 int x;
1779
1780 for (x=0; x<4; x++) {
1781 val[x] = ast_random();
1782 }
1783 snprintf(buf, size, "%08lx%08lx%08lx%08lx", (long unsigned)val[0], (long unsigned)val[1], (long unsigned)val[2], (long unsigned)val[3]);
1784
1785 return buf;
1786}
1787
1788/*! \pre instance is locked */
1789static void ast_rtp_ice_change_components(struct ast_rtp_instance *instance, int num_components)
1790{
1791 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1792
1793 /* Don't do anything if ICE is unsupported or if we're not changing the
1794 * number of components
1795 */
1796 if (!icesupport || !rtp->ice || rtp->ice_num_components == num_components) {
1797 return;
1798 }
1799
1800 ast_debug_ice(2, "(%p) ICE change number of components %u -> %u\n", instance,
1801 rtp->ice_num_components, num_components);
1802
1803 rtp->ice_num_components = num_components;
1804 ice_reset_session(instance);
1805}
1806
1807/* ICE RTP Engine interface declaration */
1808static struct ast_rtp_engine_ice ast_rtp_ice = {
1810 .add_remote_candidate = ast_rtp_ice_add_remote_candidate,
1811 .start = ast_rtp_ice_start,
1812 .stop = ast_rtp_ice_stop,
1813 .get_ufrag = ast_rtp_ice_get_ufrag,
1814 .get_password = ast_rtp_ice_get_password,
1815 .get_local_candidates = ast_rtp_ice_get_local_candidates,
1816 .ice_lite = ast_rtp_ice_lite,
1817 .set_role = ast_rtp_ice_set_role,
1818 .turn_request = ast_rtp_ice_turn_request,
1819 .change_components = ast_rtp_ice_change_components,
1820};
1821#endif
1822
1823#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
1825{
1826 /* We don't want to actually verify the certificate so just accept what they have provided */
1827 return 1;
1828}
1829
1830static int dtls_details_initialize(struct dtls_details *dtls, SSL_CTX *ssl_ctx,
1831 enum ast_rtp_dtls_setup setup, struct ast_rtp_instance *instance)
1832{
1833 dtls->dtls_setup = setup;
1834
1835 if (!(dtls->ssl = SSL_new(ssl_ctx))) {
1836 ast_log(LOG_ERROR, "Failed to allocate memory for SSL\n");
1837 goto error;
1838 }
1839
1840 if (!(dtls->read_bio = BIO_new(BIO_s_mem()))) {
1841 ast_log(LOG_ERROR, "Failed to allocate memory for inbound SSL traffic\n");
1842 goto error;
1843 }
1844 BIO_set_mem_eof_return(dtls->read_bio, -1);
1845
1846#ifdef HAVE_OPENSSL_BIO_METHOD
1847 if (!(dtls->write_bio = BIO_new(dtls_bio_methods))) {
1848 ast_log(LOG_ERROR, "Failed to allocate memory for outbound SSL traffic\n");
1849 goto error;
1850 }
1851
1852 BIO_set_data(dtls->write_bio, instance);
1853#else
1854 if (!(dtls->write_bio = BIO_new(&dtls_bio_methods))) {
1855 ast_log(LOG_ERROR, "Failed to allocate memory for outbound SSL traffic\n");
1856 goto error;
1857 }
1858 dtls->write_bio->ptr = instance;
1859#endif
1860 SSL_set_bio(dtls->ssl, dtls->read_bio, dtls->write_bio);
1861
1862 if (dtls->dtls_setup == AST_RTP_DTLS_SETUP_PASSIVE) {
1863 SSL_set_accept_state(dtls->ssl);
1864 } else {
1865 SSL_set_connect_state(dtls->ssl);
1866 }
1867 dtls->connection = AST_RTP_DTLS_CONNECTION_NEW;
1868
1869 return 0;
1870
1871error:
1872 if (dtls->read_bio) {
1873 BIO_free(dtls->read_bio);
1874 dtls->read_bio = NULL;
1875 }
1876
1877 if (dtls->write_bio) {
1878 BIO_free(dtls->write_bio);
1879 dtls->write_bio = NULL;
1880 }
1881
1882 if (dtls->ssl) {
1883 SSL_free(dtls->ssl);
1884 dtls->ssl = NULL;
1885 }
1886 return -1;
1887}
1888
1889static int dtls_setup_rtcp(struct ast_rtp_instance *instance)
1890{
1891 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
1892
1893 if (!rtp->ssl_ctx || !rtp->rtcp) {
1894 return 0;
1895 }
1896
1897 ast_debug_dtls(3, "(%p) DTLS RTCP setup\n", instance);
1898 return dtls_details_initialize(&rtp->rtcp->dtls, rtp->ssl_ctx, rtp->dtls.dtls_setup, instance);
1899}
1900
1901static const SSL_METHOD *get_dtls_method(void)
1902{
1903#if OPENSSL_VERSION_NUMBER < 0x10002000L
1904 return DTLSv1_method();
1905#else
1906 return DTLS_method();
1907#endif
1908}
1909
1910struct dtls_cert_info {
1911 EVP_PKEY *private_key;
1912 X509 *certificate;
1913};
1914
1915static int apply_dh_params(SSL_CTX *ctx, BIO *bio)
1916{
1917 int res = 0;
1918
1919#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1920 EVP_PKEY *dhpkey = PEM_read_bio_Parameters(bio, NULL);
1921 if (dhpkey && EVP_PKEY_is_a(dhpkey, "DH")) {
1922 res = SSL_CTX_set0_tmp_dh_pkey(ctx, dhpkey);
1923 }
1924 if (!res) {
1925 /* A successful call to SSL_CTX_set0_tmp_dh_pkey() means
1926 that we lost ownership of dhpkey and should not free
1927 it ourselves */
1928 EVP_PKEY_free(dhpkey);
1929 }
1930#else
1931 DH *dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
1932 if (dh) {
1933 res = SSL_CTX_set_tmp_dh(ctx, dh);
1934 }
1935 DH_free(dh);
1936#endif
1937
1938 return res;
1939}
1940
1941static void configure_dhparams(const struct ast_rtp *rtp, const struct ast_rtp_dtls_cfg *dtls_cfg)
1942{
1943#if !defined(OPENSSL_NO_ECDH) && (OPENSSL_VERSION_NUMBER >= 0x10000000L) && (OPENSSL_VERSION_NUMBER < 0x10100000L)
1944 EC_KEY *ecdh;
1945#endif
1946
1947#ifndef OPENSSL_NO_DH
1948 if (!ast_strlen_zero(dtls_cfg->pvtfile)) {
1949 BIO *bio = BIO_new_file(dtls_cfg->pvtfile, "r");
1950 if (bio) {
1951 if (apply_dh_params(rtp->ssl_ctx, bio)) {
1952 long options = SSL_OP_CIPHER_SERVER_PREFERENCE |
1953 SSL_OP_SINGLE_DH_USE | SSL_OP_SINGLE_ECDH_USE;
1954 options = SSL_CTX_set_options(rtp->ssl_ctx, options);
1955 ast_verb(2, "DTLS DH initialized, PFS enabled\n");
1956 }
1957 BIO_free(bio);
1958 }
1959 }
1960#endif /* !OPENSSL_NO_DH */
1961
1962#if !defined(OPENSSL_NO_ECDH) && (OPENSSL_VERSION_NUMBER >= 0x10000000L) && (OPENSSL_VERSION_NUMBER < 0x10100000L)
1963 /* enables AES-128 ciphers, to get AES-256 use NID_secp384r1 */
1964 ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
1965 if (ecdh) {
1966 if (SSL_CTX_set_tmp_ecdh(rtp->ssl_ctx, ecdh)) {
1967 #ifndef SSL_CTRL_SET_ECDH_AUTO
1968 #define SSL_CTRL_SET_ECDH_AUTO 94
1969 #endif
1970 /* SSL_CTX_set_ecdh_auto(rtp->ssl_ctx, on); requires OpenSSL 1.0.2 which wraps: */
1971 if (SSL_CTX_ctrl(rtp->ssl_ctx, SSL_CTRL_SET_ECDH_AUTO, 1, NULL)) {
1972 ast_verb(2, "DTLS ECDH initialized (automatic), faster PFS enabled\n");
1973 } else {
1974 ast_verb(2, "DTLS ECDH initialized (secp256r1), faster PFS enabled\n");
1975 }
1976 }
1977 EC_KEY_free(ecdh);
1978 }
1979#endif /* !OPENSSL_NO_ECDH */
1980}
1981
1982#if !defined(OPENSSL_NO_ECDH) && (OPENSSL_VERSION_NUMBER >= 0x10000000L)
1983
1984static int create_ephemeral_ec_keypair(EVP_PKEY **keypair)
1985{
1986#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1987 *keypair = EVP_EC_gen(SN_X9_62_prime256v1);
1988 return *keypair ? 0 : -1;
1989#else
1990 EC_KEY *eckey = NULL;
1991 EC_GROUP *group = NULL;
1992
1993 group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
1994 if (!group) {
1995 goto error;
1996 }
1997
1998 EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE);
1999 EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_UNCOMPRESSED);
2000
2001 eckey = EC_KEY_new();
2002 if (!eckey) {
2003 goto error;
2004 }
2005
2006 if (!EC_KEY_set_group(eckey, group)) {
2007 goto error;
2008 }
2009
2010 if (!EC_KEY_generate_key(eckey)) {
2011 goto error;
2012 }
2013
2014 *keypair = EVP_PKEY_new();
2015 if (!*keypair) {
2016 goto error;
2017 }
2018
2019 EVP_PKEY_assign_EC_KEY(*keypair, eckey);
2020 EC_GROUP_free(group);
2021
2022 return 0;
2023
2024error:
2025 EC_KEY_free(eckey);
2026 EC_GROUP_free(group);
2027
2028 return -1;
2029#endif
2030}
2031
2032/* From OpenSSL's x509 command */
2033#define SERIAL_RAND_BITS 159
2034
2035static int create_ephemeral_certificate(EVP_PKEY *keypair, X509 **certificate)
2036{
2037 X509 *cert = NULL;
2038 BIGNUM *serial = NULL;
2039 X509_NAME *name = NULL;
2040
2041 cert = X509_new();
2042 if (!cert) {
2043 goto error;
2044 }
2045
2046 if (!X509_set_version(cert, 2)) {
2047 goto error;
2048 }
2049
2050 /* Set the public key */
2051 X509_set_pubkey(cert, keypair);
2052
2053 /* Generate a random serial number */
2054 if (!(serial = BN_new())
2055 || !BN_rand(serial, SERIAL_RAND_BITS, -1, 0)
2056 || !BN_to_ASN1_INTEGER(serial, X509_get_serialNumber(cert))) {
2057 BN_free(serial);
2058 goto error;
2059 }
2060
2061 BN_free(serial);
2062
2063 /*
2064 * Validity period - Current Chrome & Firefox make it 31 days starting
2065 * with yesterday at the current time, so we will do the same.
2066 */
2067#if OPENSSL_VERSION_NUMBER < 0x10100000L
2068 if (!X509_time_adj_ex(X509_get_notBefore(cert), -1, 0, NULL)
2069 || !X509_time_adj_ex(X509_get_notAfter(cert), 30, 0, NULL)) {
2070 goto error;
2071 }
2072#else
2073 if (!X509_time_adj_ex(X509_getm_notBefore(cert), -1, 0, NULL)
2074 || !X509_time_adj_ex(X509_getm_notAfter(cert), 30, 0, NULL)) {
2075 goto error;
2076 }
2077#endif
2078
2079 /* Set the name and issuer */
2080 if (!(name = X509_get_subject_name(cert))
2081 || !X509_NAME_add_entry_by_NID(name, NID_commonName, MBSTRING_ASC,
2082 (unsigned char *) "asterisk", -1, -1, 0)
2083 || !X509_set_issuer_name(cert, name)) {
2084 goto error;
2085 }
2086
2087 /* Sign it */
2088 if (!X509_sign(cert, keypair, EVP_sha256())) {
2089 goto error;
2090 }
2091
2092 *certificate = cert;
2093
2094 return 0;
2095
2096error:
2097 X509_free(cert);
2098
2099 return -1;
2100}
2101
2102static int create_certificate_ephemeral(struct ast_rtp_instance *instance,
2103 const struct ast_rtp_dtls_cfg *dtls_cfg,
2104 struct dtls_cert_info *cert_info)
2105{
2106 /* Make sure these are initialized */
2107 cert_info->private_key = NULL;
2108 cert_info->certificate = NULL;
2109
2110 if (create_ephemeral_ec_keypair(&cert_info->private_key)) {
2111 ast_log(LOG_ERROR, "Failed to create ephemeral ECDSA keypair\n");
2112 goto error;
2113 }
2114
2115 if (create_ephemeral_certificate(cert_info->private_key, &cert_info->certificate)) {
2116 ast_log(LOG_ERROR, "Failed to create ephemeral X509 certificate\n");
2117 goto error;
2118 }
2119
2120 return 0;
2121
2122 error:
2123 X509_free(cert_info->certificate);
2124 EVP_PKEY_free(cert_info->private_key);
2125
2126 return -1;
2127}
2128
2129#else
2130
2131static int create_certificate_ephemeral(struct ast_rtp_instance *instance,
2132 const struct ast_rtp_dtls_cfg *dtls_cfg,
2133 struct dtls_cert_info *cert_info)
2134{
2135 ast_log(LOG_ERROR, "Your version of OpenSSL does not support ECDSA keys\n");
2136 return -1;
2137}
2138
2139#endif /* !OPENSSL_NO_ECDH */
2140
2141static int create_certificate_from_file(struct ast_rtp_instance *instance,
2142 const struct ast_rtp_dtls_cfg *dtls_cfg,
2143 struct dtls_cert_info *cert_info)
2144{
2145 FILE *fp;
2146 BIO *certbio = NULL;
2147 EVP_PKEY *private_key = NULL;
2148 X509 *cert = NULL;
2149 char *private_key_file = ast_strlen_zero(dtls_cfg->pvtfile) ? dtls_cfg->certfile : dtls_cfg->pvtfile;
2150
2151 fp = fopen(private_key_file, "r");
2152 if (!fp) {
2153 ast_log(LOG_ERROR, "Failed to read private key from file '%s': %s\n", private_key_file, strerror(errno));
2154 goto error;
2155 }
2156
2157 if (!PEM_read_PrivateKey(fp, &private_key, NULL, NULL)) {
2158 ast_log(LOG_ERROR, "Failed to read private key from PEM file '%s'\n", private_key_file);
2159 fclose(fp);
2160 goto error;
2161 }
2162
2163 if (fclose(fp)) {
2164 ast_log(LOG_ERROR, "Failed to close private key file '%s': %s\n", private_key_file, strerror(errno));
2165 goto error;
2166 }
2167
2168 certbio = BIO_new(BIO_s_file());
2169 if (!certbio) {
2170 ast_log(LOG_ERROR, "Failed to allocate memory for certificate fingerprinting on RTP instance '%p'\n",
2171 instance);
2172 goto error;
2173 }
2174
2175 if (!BIO_read_filename(certbio, dtls_cfg->certfile)
2176 || !(cert = PEM_read_bio_X509(certbio, NULL, 0, NULL))) {
2177 ast_log(LOG_ERROR, "Failed to read certificate from file '%s'\n", dtls_cfg->certfile);
2178 goto error;
2179 }
2180
2181 cert_info->private_key = private_key;
2182 cert_info->certificate = cert;
2183
2184 BIO_free_all(certbio);
2185
2186 return 0;
2187
2188error:
2189 X509_free(cert);
2190 BIO_free_all(certbio);
2191 EVP_PKEY_free(private_key);
2192
2193 return -1;
2194}
2195
2196static int load_dtls_certificate(struct ast_rtp_instance *instance,
2197 const struct ast_rtp_dtls_cfg *dtls_cfg,
2198 struct dtls_cert_info *cert_info)
2199{
2200 if (dtls_cfg->ephemeral_cert) {
2201 return create_certificate_ephemeral(instance, dtls_cfg, cert_info);
2202 } else if (!ast_strlen_zero(dtls_cfg->certfile)) {
2203 return create_certificate_from_file(instance, dtls_cfg, cert_info);
2204 } else {
2205 return -1;
2206 }
2207}
2208
2209/*! \pre instance is locked */
2210static int ast_rtp_dtls_set_configuration(struct ast_rtp_instance *instance, const struct ast_rtp_dtls_cfg *dtls_cfg)
2211{
2212 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2213 struct dtls_cert_info cert_info = { 0 };
2214 int res;
2215
2216 if (!dtls_cfg->enabled) {
2217 return 0;
2218 }
2219
2220 ast_debug_dtls(3, "(%p) DTLS RTP setup\n", instance);
2221
2223 ast_log(LOG_ERROR, "SRTP support module is not loaded or available. Try loading res_srtp.so.\n");
2224 return -1;
2225 }
2226
2227 if (rtp->ssl_ctx) {
2228 return 0;
2229 }
2230
2231 rtp->ssl_ctx = SSL_CTX_new(get_dtls_method());
2232 if (!rtp->ssl_ctx) {
2233 return -1;
2234 }
2235
2236 SSL_CTX_set_read_ahead(rtp->ssl_ctx, 1);
2237
2238 configure_dhparams(rtp, dtls_cfg);
2239
2240 rtp->dtls_verify = dtls_cfg->verify;
2241
2242 SSL_CTX_set_verify(rtp->ssl_ctx, (rtp->dtls_verify & AST_RTP_DTLS_VERIFY_FINGERPRINT) || (rtp->dtls_verify & AST_RTP_DTLS_VERIFY_CERTIFICATE) ?
2243 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT : SSL_VERIFY_NONE, !(rtp->dtls_verify & AST_RTP_DTLS_VERIFY_CERTIFICATE) ?
2244 dtls_verify_callback : NULL);
2245
2246 if (dtls_cfg->suite == AST_AES_CM_128_HMAC_SHA1_80) {
2247 SSL_CTX_set_tlsext_use_srtp(rtp->ssl_ctx, "SRTP_AES128_CM_SHA1_80");
2248 } else if (dtls_cfg->suite == AST_AES_CM_128_HMAC_SHA1_32) {
2249 SSL_CTX_set_tlsext_use_srtp(rtp->ssl_ctx, "SRTP_AES128_CM_SHA1_32");
2250 } else {
2251 ast_log(LOG_ERROR, "Unsupported suite specified for DTLS-SRTP on RTP instance '%p'\n", instance);
2252 return -1;
2253 }
2254
2255 rtp->local_hash = dtls_cfg->hash;
2256
2257 if (!load_dtls_certificate(instance, dtls_cfg, &cert_info)) {
2258 const EVP_MD *type;
2259 unsigned int size, i;
2260 unsigned char fingerprint[EVP_MAX_MD_SIZE];
2261 char *local_fingerprint = rtp->local_fingerprint;
2262
2263 if (!SSL_CTX_use_certificate(rtp->ssl_ctx, cert_info.certificate)) {
2264 ast_log(LOG_ERROR, "Specified certificate for RTP instance '%p' could not be used\n",
2265 instance);
2266 return -1;
2267 }
2268
2269 if (!SSL_CTX_use_PrivateKey(rtp->ssl_ctx, cert_info.private_key)
2270 || !SSL_CTX_check_private_key(rtp->ssl_ctx)) {
2271 ast_log(LOG_ERROR, "Specified private key for RTP instance '%p' could not be used\n",
2272 instance);
2273 return -1;
2274 }
2275
2276 if (rtp->local_hash == AST_RTP_DTLS_HASH_SHA1) {
2277 type = EVP_sha1();
2278 } else if (rtp->local_hash == AST_RTP_DTLS_HASH_SHA256) {
2279 type = EVP_sha256();
2280 } else {
2281 ast_log(LOG_ERROR, "Unsupported fingerprint hash type on RTP instance '%p'\n",
2282 instance);
2283 return -1;
2284 }
2285
2286 if (!X509_digest(cert_info.certificate, type, fingerprint, &size) || !size) {
2287 ast_log(LOG_ERROR, "Could not produce fingerprint from certificate for RTP instance '%p'\n",
2288 instance);
2289 return -1;
2290 }
2291
2292 for (i = 0; i < size; i++) {
2293 sprintf(local_fingerprint, "%02hhX:", fingerprint[i]);
2294 local_fingerprint += 3;
2295 }
2296
2297 *(local_fingerprint - 1) = 0;
2298
2299 EVP_PKEY_free(cert_info.private_key);
2300 X509_free(cert_info.certificate);
2301 }
2302
2303 if (!ast_strlen_zero(dtls_cfg->cipher)) {
2304 if (!SSL_CTX_set_cipher_list(rtp->ssl_ctx, dtls_cfg->cipher)) {
2305 ast_log(LOG_ERROR, "Invalid cipher specified in cipher list '%s' for RTP instance '%p'\n",
2306 dtls_cfg->cipher, instance);
2307 return -1;
2308 }
2309 }
2310
2311 if (!ast_strlen_zero(dtls_cfg->cafile) || !ast_strlen_zero(dtls_cfg->capath)) {
2312 if (!SSL_CTX_load_verify_locations(rtp->ssl_ctx, S_OR(dtls_cfg->cafile, NULL), S_OR(dtls_cfg->capath, NULL))) {
2313 ast_log(LOG_ERROR, "Invalid certificate authority file '%s' or path '%s' specified for RTP instance '%p'\n",
2314 S_OR(dtls_cfg->cafile, ""), S_OR(dtls_cfg->capath, ""), instance);
2315 return -1;
2316 }
2317 }
2318
2319 rtp->rekey = dtls_cfg->rekey;
2320 rtp->suite = dtls_cfg->suite;
2321
2322 res = dtls_details_initialize(&rtp->dtls, rtp->ssl_ctx, dtls_cfg->default_setup, instance);
2323 if (!res) {
2324 dtls_setup_rtcp(instance);
2325 }
2326
2327 return res;
2328}
2329
2330/*! \pre instance is locked */
2331static int ast_rtp_dtls_active(struct ast_rtp_instance *instance)
2332{
2333 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2334
2335 return !rtp->ssl_ctx ? 0 : 1;
2336}
2337
2338/*! \pre instance is locked */
2339static void ast_rtp_dtls_stop(struct ast_rtp_instance *instance)
2340{
2341 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2342 SSL *ssl = rtp->dtls.ssl;
2343
2344 ast_debug_dtls(3, "(%p) DTLS stop\n", instance);
2345 ao2_unlock(instance);
2346 dtls_srtp_stop_timeout_timer(instance, rtp, 0);
2347 ao2_lock(instance);
2348
2349 if (rtp->ssl_ctx) {
2350 SSL_CTX_free(rtp->ssl_ctx);
2351 rtp->ssl_ctx = NULL;
2352 }
2353
2354 if (rtp->dtls.ssl) {
2355 SSL_free(rtp->dtls.ssl);
2356 rtp->dtls.ssl = NULL;
2357 }
2358
2359 if (rtp->rtcp) {
2360 ao2_unlock(instance);
2361 dtls_srtp_stop_timeout_timer(instance, rtp, 1);
2362 ao2_lock(instance);
2363
2364 if (rtp->rtcp->dtls.ssl) {
2365 if (rtp->rtcp->dtls.ssl != ssl) {
2366 SSL_free(rtp->rtcp->dtls.ssl);
2367 }
2368 rtp->rtcp->dtls.ssl = NULL;
2369 }
2370 }
2371}
2372
2373/*! \pre instance is locked */
2374static void ast_rtp_dtls_reset(struct ast_rtp_instance *instance)
2375{
2376 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2377
2378 if (SSL_is_init_finished(rtp->dtls.ssl)) {
2379 SSL_shutdown(rtp->dtls.ssl);
2380 rtp->dtls.connection = AST_RTP_DTLS_CONNECTION_NEW;
2381 }
2382
2383 if (rtp->rtcp && SSL_is_init_finished(rtp->rtcp->dtls.ssl)) {
2384 SSL_shutdown(rtp->rtcp->dtls.ssl);
2385 rtp->rtcp->dtls.connection = AST_RTP_DTLS_CONNECTION_NEW;
2386 }
2387}
2388
2389/*! \pre instance is locked */
2390static enum ast_rtp_dtls_connection ast_rtp_dtls_get_connection(struct ast_rtp_instance *instance)
2391{
2392 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2393
2394 return rtp->dtls.connection;
2395}
2396
2397/*! \pre instance is locked */
2398static enum ast_rtp_dtls_setup ast_rtp_dtls_get_setup(struct ast_rtp_instance *instance)
2399{
2400 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2401
2402 return rtp->dtls.dtls_setup;
2403}
2404
2405static void dtls_set_setup(enum ast_rtp_dtls_setup *dtls_setup, enum ast_rtp_dtls_setup setup, SSL *ssl)
2406{
2407 enum ast_rtp_dtls_setup old = *dtls_setup;
2408
2409 switch (setup) {
2411 *dtls_setup = AST_RTP_DTLS_SETUP_PASSIVE;
2412 break;
2414 *dtls_setup = AST_RTP_DTLS_SETUP_ACTIVE;
2415 break;
2417 /* We can't respond to an actpass setup with actpass ourselves... so respond with active, as we can initiate connections */
2418 if (*dtls_setup == AST_RTP_DTLS_SETUP_ACTPASS) {
2419 *dtls_setup = AST_RTP_DTLS_SETUP_ACTIVE;
2420 }
2421 break;
2423 *dtls_setup = AST_RTP_DTLS_SETUP_HOLDCONN;
2424 break;
2425 default:
2426 /* This should never occur... if it does exit early as we don't know what state things are in */
2427 return;
2428 }
2429
2430 /* If the setup state did not change we go on as if nothing happened */
2431 if (old == *dtls_setup) {
2432 return;
2433 }
2434
2435 /* If they don't want us to establish a connection wait until later */
2436 if (*dtls_setup == AST_RTP_DTLS_SETUP_HOLDCONN) {
2437 return;
2438 }
2439
2440 if (*dtls_setup == AST_RTP_DTLS_SETUP_ACTIVE) {
2441 SSL_set_connect_state(ssl);
2442 } else if (*dtls_setup == AST_RTP_DTLS_SETUP_PASSIVE) {
2443 SSL_set_accept_state(ssl);
2444 } else {
2445 return;
2446 }
2447}
2448
2449/*! \pre instance is locked */
2450static void ast_rtp_dtls_set_setup(struct ast_rtp_instance *instance, enum ast_rtp_dtls_setup setup)
2451{
2452 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2453
2454 if (rtp->dtls.ssl) {
2455 dtls_set_setup(&rtp->dtls.dtls_setup, setup, rtp->dtls.ssl);
2456 }
2457
2458 if (rtp->rtcp && rtp->rtcp->dtls.ssl) {
2459 dtls_set_setup(&rtp->rtcp->dtls.dtls_setup, setup, rtp->rtcp->dtls.ssl);
2460 }
2461}
2462
2463/*! \pre instance is locked */
2464static void ast_rtp_dtls_set_fingerprint(struct ast_rtp_instance *instance, enum ast_rtp_dtls_hash hash, const char *fingerprint)
2465{
2466 char *tmp = ast_strdupa(fingerprint), *value;
2467 int pos = 0;
2468 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2469
2470 if (hash != AST_RTP_DTLS_HASH_SHA1 && hash != AST_RTP_DTLS_HASH_SHA256) {
2471 return;
2472 }
2473
2474 rtp->remote_hash = hash;
2475
2476 while ((value = strsep(&tmp, ":")) && (pos != (EVP_MAX_MD_SIZE - 1))) {
2477 sscanf(value, "%02hhx", &rtp->remote_fingerprint[pos++]);
2478 }
2479}
2480
2481/*! \pre instance is locked */
2482static enum ast_rtp_dtls_hash ast_rtp_dtls_get_fingerprint_hash(struct ast_rtp_instance *instance)
2483{
2484 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2485
2486 return rtp->local_hash;
2487}
2488
2489/*! \pre instance is locked */
2490static const char *ast_rtp_dtls_get_fingerprint(struct ast_rtp_instance *instance)
2491{
2492 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2493
2494 return rtp->local_fingerprint;
2495}
2496
2497/* DTLS RTP Engine interface declaration */
2498static struct ast_rtp_engine_dtls ast_rtp_dtls = {
2499 .set_configuration = ast_rtp_dtls_set_configuration,
2500 .active = ast_rtp_dtls_active,
2501 .stop = ast_rtp_dtls_stop,
2502 .reset = ast_rtp_dtls_reset,
2503 .get_connection = ast_rtp_dtls_get_connection,
2504 .get_setup = ast_rtp_dtls_get_setup,
2505 .set_setup = ast_rtp_dtls_set_setup,
2506 .set_fingerprint = ast_rtp_dtls_set_fingerprint,
2507 .get_fingerprint_hash = ast_rtp_dtls_get_fingerprint_hash,
2508 .get_fingerprint = ast_rtp_dtls_get_fingerprint,
2509};
2510
2511#endif
2512
2513#ifdef TEST_FRAMEWORK
2514static size_t get_recv_buffer_count(struct ast_rtp_instance *instance)
2515{
2516 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2517
2518 if (rtp && rtp->recv_buffer) {
2520 }
2521
2522 return 0;
2523}
2524
2525static size_t get_recv_buffer_max(struct ast_rtp_instance *instance)
2526{
2527 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2528
2529 if (rtp && rtp->recv_buffer) {
2530 return ast_data_buffer_max(rtp->recv_buffer);
2531 }
2532
2533 return 0;
2534}
2535
2536static size_t get_send_buffer_count(struct ast_rtp_instance *instance)
2537{
2538 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2539
2540 if (rtp && rtp->send_buffer) {
2542 }
2543
2544 return 0;
2545}
2546
2547static void set_rtp_rtcp_schedid(struct ast_rtp_instance *instance, int id)
2548{
2549 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2550
2551 if (rtp && rtp->rtcp) {
2552 rtp->rtcp->schedid = id;
2553 }
2554}
2555
2556static struct ast_rtp_engine_test ast_rtp_test = {
2557 .packets_to_drop = 0,
2558 .send_report = 0,
2559 .sdes_received = 0,
2560 .recv_buffer_count = get_recv_buffer_count,
2561 .recv_buffer_max = get_recv_buffer_max,
2562 .send_buffer_count = get_send_buffer_count,
2563 .set_schedid = set_rtp_rtcp_schedid,
2564};
2565#endif
2566
2567/* RTP Engine Declaration */
2569 .name = "asterisk",
2570 .new = ast_rtp_new,
2571 .destroy = ast_rtp_destroy,
2572 .dtmf_begin = ast_rtp_dtmf_begin,
2573 .dtmf_end = ast_rtp_dtmf_end,
2574 .dtmf_end_with_duration = ast_rtp_dtmf_end_with_duration,
2575 .dtmf_mode_set = ast_rtp_dtmf_mode_set,
2576 .dtmf_mode_get = ast_rtp_dtmf_mode_get,
2577 .update_source = ast_rtp_update_source,
2578 .change_source = ast_rtp_change_source,
2579 .write = ast_rtp_write,
2580 .read = ast_rtp_read,
2581 .prop_set = ast_rtp_prop_set,
2582 .fd = ast_rtp_fd,
2583 .remote_address_set = ast_rtp_remote_address_set,
2584 .red_init = rtp_red_init,
2585 .red_buffer = rtp_red_buffer,
2586 .local_bridge = ast_rtp_local_bridge,
2587 .get_stat = ast_rtp_get_stat,
2588 .dtmf_compatible = ast_rtp_dtmf_compatible,
2589 .stun_request = ast_rtp_stun_request,
2590 .stop = ast_rtp_stop,
2591 .qos = ast_rtp_qos_set,
2592 .sendcng = ast_rtp_sendcng,
2593#ifdef HAVE_PJPROJECT
2594 .ice = &ast_rtp_ice,
2595#endif
2596#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
2597 .dtls = &ast_rtp_dtls,
2598 .activate = ast_rtp_activate,
2599#endif
2600 .ssrc_get = ast_rtp_get_ssrc,
2601 .cname_get = ast_rtp_get_cname,
2602 .set_remote_ssrc = ast_rtp_set_remote_ssrc,
2603 .set_stream_num = ast_rtp_set_stream_num,
2604 .extension_enable = ast_rtp_extension_enable,
2605 .bundle = ast_rtp_bundle,
2606#ifdef TEST_FRAMEWORK
2607 .test = &ast_rtp_test,
2608#endif
2609};
2610
2611#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
2612/*! \pre instance is locked */
2613static void dtls_perform_handshake(struct ast_rtp_instance *instance, struct dtls_details *dtls, int rtcp)
2614{
2615 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2616
2617 ast_debug_dtls(3, "(%p) DTLS perform handshake - ssl = %p, setup = %d\n",
2618 rtp, dtls->ssl, dtls->dtls_setup);
2619
2620 /* If we are not acting as a client connecting to the remote side then
2621 * don't start the handshake as it will accomplish nothing and would conflict
2622 * with the handshake we receive from the remote side.
2623 */
2624 if (!dtls->ssl || (dtls->dtls_setup != AST_RTP_DTLS_SETUP_ACTIVE)) {
2625 return;
2626 }
2627
2628 SSL_do_handshake(dtls->ssl);
2629
2630 /*
2631 * A race condition is prevented between this function and __rtp_recvfrom()
2632 * because both functions have to get the instance lock before they can do
2633 * anything. Without holding the instance lock, this function could start
2634 * the SSL handshake above in one thread and the __rtp_recvfrom() function
2635 * called by the channel thread could read the response and stop the timeout
2636 * timer before we have a chance to even start it.
2637 */
2638 dtls_srtp_start_timeout_timer(instance, rtp, rtcp);
2639}
2640#endif
2641
2642#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
2643static void dtls_perform_setup(struct dtls_details *dtls)
2644{
2645 if (!dtls->ssl || !SSL_is_init_finished(dtls->ssl)) {
2646 return;
2647 }
2648
2649 SSL_clear(dtls->ssl);
2650 if (dtls->dtls_setup == AST_RTP_DTLS_SETUP_PASSIVE) {
2651 SSL_set_accept_state(dtls->ssl);
2652 } else {
2653 SSL_set_connect_state(dtls->ssl);
2654 }
2655 dtls->connection = AST_RTP_DTLS_CONNECTION_NEW;
2656
2657 ast_debug_dtls(3, "DTLS perform setup - connection reset\n");
2658}
2659#endif
2660
2661#ifdef HAVE_PJPROJECT
2662static void rtp_learning_start(struct ast_rtp *rtp);
2663
2664/* Handles start of media during ICE negotiation or completion */
2665static void ast_rtp_ice_start_media(pj_ice_sess *ice, pj_status_t status)
2666{
2667 struct ast_rtp_instance *instance = ice->user_data;
2668 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2669
2670 ao2_lock(instance);
2671
2672 if (status == PJ_SUCCESS) {
2673 struct ast_sockaddr remote_address;
2674
2675 ast_sockaddr_setnull(&remote_address);
2676 update_address_with_ice_candidate(ice, AST_RTP_ICE_COMPONENT_RTP, &remote_address);
2677 if (!ast_sockaddr_isnull(&remote_address)) {
2678 /* Symmetric RTP must be disabled for the remote address to not get overwritten */
2680
2681 ast_rtp_instance_set_remote_address(instance, &remote_address);
2682 }
2683
2684 if (rtp->rtcp) {
2685 update_address_with_ice_candidate(ice, AST_RTP_ICE_COMPONENT_RTCP, &rtp->rtcp->them);
2686 }
2687 }
2688
2689#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
2690 /* If we've already started media, no need to do all of this again */
2691 if (rtp->ice_media_started) {
2692 ao2_unlock(instance);
2693 return;
2694 }
2695
2697 "(%p) ICE starting media - perform DTLS - (%p)\n", instance, rtp);
2698
2699 /*
2700 * Seemingly no reason to call dtls_perform_setup here. Currently we'll do a full
2701 * protocol level renegotiation if things do change. And if bundled is being used
2702 * then ICE is reused when a stream is added.
2703 *
2704 * Note, if for some reason in the future dtls_perform_setup does need to done here
2705 * be aware that creates a race condition between the call here (on ice completion)
2706 * and potential DTLS handshaking when receiving RTP. What happens is the ssl object
2707 * can get cleared (SSL_clear) during that handshaking process (DTLS init). If that
2708 * happens then Asterisk won't complete DTLS initialization. RTP packets are still
2709 * sent/received but won't be encrypted/decrypted.
2710 */
2711 dtls_perform_handshake(instance, &rtp->dtls, 0);
2712
2713 if (rtp->rtcp && rtp->rtcp->type == AST_RTP_INSTANCE_RTCP_STANDARD) {
2714 dtls_perform_handshake(instance, &rtp->rtcp->dtls, 1);
2715 }
2716#endif
2717
2718 rtp->ice_media_started = 1;
2719
2720 if (!strictrtp) {
2721 ao2_unlock(instance);
2722 return;
2723 }
2724
2725 ast_verb(4, "%p -- Strict RTP learning after ICE completion\n", rtp);
2726 rtp_learning_start(rtp);
2727 ao2_unlock(instance);
2728}
2729
2730#ifdef HAVE_PJPROJECT_ON_VALID_ICE_PAIR_CALLBACK
2731/* PJPROJECT ICE optional callback */
2732static void ast_rtp_on_valid_pair(pj_ice_sess *ice)
2733{
2734 ast_debug_ice(2, "(%p) ICE valid pair, start media\n", ice->user_data);
2735 ast_rtp_ice_start_media(ice, PJ_SUCCESS);
2736}
2737#endif
2738
2739/* PJPROJECT ICE callback */
2740static void ast_rtp_on_ice_complete(pj_ice_sess *ice, pj_status_t status)
2741{
2742 ast_debug_ice(2, "(%p) ICE complete, start media\n", ice->user_data);
2743 ast_rtp_ice_start_media(ice, status);
2744}
2745
2746/* PJPROJECT ICE callback */
2747static void ast_rtp_on_ice_rx_data(pj_ice_sess *ice, unsigned comp_id, unsigned transport_id, void *pkt, pj_size_t size, const pj_sockaddr_t *src_addr, unsigned src_addr_len)
2748{
2749 struct ast_rtp_instance *instance = ice->user_data;
2750 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2751
2752 /* Instead of handling the packet here (which really doesn't work with our architecture) we set a bit to indicate that it should be handled after pj_ice_sess_on_rx_pkt
2753 * returns */
2754 if (transport_id == TRANSPORT_SOCKET_RTP || transport_id == TRANSPORT_SOCKET_RTCP) {
2755 rtp->passthrough = 1;
2756 } else if (transport_id == TRANSPORT_TURN_RTP) {
2757 rtp->rtp_passthrough = 1;
2758 } else if (transport_id == TRANSPORT_TURN_RTCP) {
2759 rtp->rtcp_passthrough = 1;
2760 }
2761}
2762
2763/* PJPROJECT ICE callback */
2764static pj_status_t ast_rtp_on_ice_tx_pkt(pj_ice_sess *ice, unsigned comp_id, unsigned transport_id, const void *pkt, pj_size_t size, const pj_sockaddr_t *dst_addr, unsigned dst_addr_len)
2765{
2766 struct ast_rtp_instance *instance = ice->user_data;
2767 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2768 pj_status_t status = PJ_EINVALIDOP;
2769 pj_ssize_t _size = (pj_ssize_t)size;
2770
2771 if (transport_id == TRANSPORT_SOCKET_RTP) {
2772 /* Traffic is destined to go right out the RTP socket we already have */
2773 status = pj_sock_sendto(rtp->s, pkt, &_size, 0, dst_addr, dst_addr_len);
2774 /* sendto on a connectionless socket should send all the data, or none at all */
2775 ast_assert(_size == size || status != PJ_SUCCESS);
2776 } else if (transport_id == TRANSPORT_SOCKET_RTCP) {
2777 /* Traffic is destined to go right out the RTCP socket we already have */
2778 if (rtp->rtcp) {
2779 status = pj_sock_sendto(rtp->rtcp->s, pkt, &_size, 0, dst_addr, dst_addr_len);
2780 /* sendto on a connectionless socket should send all the data, or none at all */
2781 ast_assert(_size == size || status != PJ_SUCCESS);
2782 } else {
2783 status = PJ_SUCCESS;
2784 }
2785 } else if (transport_id == TRANSPORT_TURN_RTP) {
2786 /* Traffic is going through the RTP TURN relay */
2787 if (rtp->turn_rtp) {
2788 status = pj_turn_sock_sendto(rtp->turn_rtp, pkt, size, dst_addr, dst_addr_len);
2789 }
2790 } else if (transport_id == TRANSPORT_TURN_RTCP) {
2791 /* Traffic is going through the RTCP TURN relay */
2792 if (rtp->turn_rtcp) {
2793 status = pj_turn_sock_sendto(rtp->turn_rtcp, pkt, size, dst_addr, dst_addr_len);
2794 }
2795 }
2796
2797 return status;
2798}
2799
2800/* ICE Session interface declaration */
2801static pj_ice_sess_cb ast_rtp_ice_sess_cb = {
2802#ifdef HAVE_PJPROJECT_ON_VALID_ICE_PAIR_CALLBACK
2803 .on_valid_pair = ast_rtp_on_valid_pair,
2804#endif
2805 .on_ice_complete = ast_rtp_on_ice_complete,
2806 .on_rx_data = ast_rtp_on_ice_rx_data,
2807 .on_tx_pkt = ast_rtp_on_ice_tx_pkt,
2808};
2809
2810/*! \brief Worker thread for timerheap */
2811static int timer_worker_thread(void *data)
2812{
2813 pj_ioqueue_t *ioqueue;
2814
2815 if (pj_ioqueue_create(pool, 1, &ioqueue) != PJ_SUCCESS) {
2816 return -1;
2817 }
2818
2819 while (!timer_terminate) {
2820 const pj_time_val delay = {0, 10};
2821
2822 pj_timer_heap_poll(timer_heap, NULL);
2823 pj_ioqueue_poll(ioqueue, &delay);
2824 }
2825
2826 return 0;
2827}
2828#endif
2829
2830static inline int rtp_debug_test_addr(struct ast_sockaddr *addr)
2831{
2833 return 0;
2834 }
2836 if (rtpdebugport) {
2837 return (ast_sockaddr_cmp(&rtpdebugaddr, addr) == 0); /* look for RTP packets from IP+Port */
2838 } else {
2839 return (ast_sockaddr_cmp_addr(&rtpdebugaddr, addr) == 0); /* only look for RTP packets from IP */
2840 }
2841 }
2842
2843 return 1;
2844}
2845
2846static inline int rtcp_debug_test_addr(struct ast_sockaddr *addr)
2847{
2849 return 0;
2850 }
2852 if (rtcpdebugport) {
2853 return (ast_sockaddr_cmp(&rtcpdebugaddr, addr) == 0); /* look for RTCP packets from IP+Port */
2854 } else {
2855 return (ast_sockaddr_cmp_addr(&rtcpdebugaddr, addr) == 0); /* only look for RTCP packets from IP */
2856 }
2857 }
2858
2859 return 1;
2860}
2861
2862#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
2863/*!
2864 * \brief Handles DTLS timer expiration
2865 *
2866 * \param instance
2867 * \param timeout
2868 * \param rtcp
2869 *
2870 * If DTLSv1_get_timeout() returns 0, it's an error or no timeout was set.
2871 * We need to unref instance and stop the timer in this case. Otherwise,
2872 * new timeout may be a number of milliseconds or 0. If it's 0, OpenSSL
2873 * is telling us to call DTLSv1_handle_timeout() immediately so we'll set
2874 * timeout to 1ms so we get rescheduled almost immediately.
2875 *
2876 * \retval 0 - success
2877 * \retval -1 - failure
2878 */
2879static int dtls_srtp_handle_timeout(struct ast_rtp_instance *instance, int *timeout, int rtcp)
2880{
2881 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
2882 struct dtls_details *dtls = !rtcp ? &rtp->dtls : &rtp->rtcp->dtls;
2883 struct timeval dtls_timeout;
2884 int res = 0;
2885
2886 res = DTLSv1_handle_timeout(dtls->ssl);
2887 ast_debug_dtls(3, "(%p) DTLS srtp - handle timeout - rtcp=%d result: %d\n", instance, rtcp, res);
2888
2889 /* If a timeout can't be retrieved then this recurring scheduled item must stop */
2890 res = DTLSv1_get_timeout(dtls->ssl, &dtls_timeout);
2891 if (!res) {
2892 /* Make sure we don't try to stop the timer later if it's already been stopped */
2893 dtls->timeout_timer = -1;
2894 ao2_ref(instance, -1);
2895 *timeout = 0;
2896 ast_debug_dtls(3, "(%p) DTLS srtp - handle timeout - rtcp=%d get timeout failure\n", instance, rtcp);
2897 return -1;
2898 }
2899 *timeout = dtls_timeout.tv_sec * 1000 + dtls_timeout.tv_usec / 1000;
2900 if (*timeout == 0) {
2901 /*
2902 * If DTLSv1_get_timeout() succeeded with a timeout of 0, OpenSSL
2903 * is telling us to call DTLSv1_handle_timeout() again now HOWEVER...
2904 * Do NOT be tempted to call DTLSv1_handle_timeout() and
2905 * DTLSv1_get_timeout() in a loop while the timeout is 0. There is only
2906 * 1 thread running the scheduler for all PJSIP related RTP instances
2907 * so we don't want to delay here any more than necessary. It's also
2908 * possible that an OpenSSL bug or change in behavior could cause
2909 * DTLSv1_get_timeout() to return 0 forever. If that happens, we'll
2910 * be stuck here and no other RTP instances will get serviced.
2911 * This RTP instance is also locked while this callback runs so we
2912 * don't want to delay other threads that may need to lock this
2913 * RTP instance for their own purpose.
2914 *
2915 * Just set the timeout to 1ms and let the scheduler reschedule us
2916 * as quickly as possible.
2917 */
2918 *timeout = 1;
2919 }
2920 ast_debug_dtls(3, "(%p) DTLS srtp - handle timeout - rtcp=%d timeout=%d\n", instance, rtcp, *timeout);
2921
2922 return 0;
2923}
2924
2925/* Scheduler callback */
2926static int dtls_srtp_handle_rtp_timeout(const void *data)
2927{
2928 struct ast_rtp_instance *instance = (struct ast_rtp_instance *)data;
2929 int timeout = 0;
2930 int res = 0;
2931
2932 ao2_lock(instance);
2933 res = dtls_srtp_handle_timeout(instance, &timeout, 0);
2934 ao2_unlock(instance);
2935 if (res < 0) {
2936 /* Tells the scheduler to stop rescheduling */
2937 return 0;
2938 }
2939
2940 /* Reschedule based on the timeout value */
2941 return timeout;
2942}
2943
2944/* Scheduler callback */
2945static int dtls_srtp_handle_rtcp_timeout(const void *data)
2946{
2947 struct ast_rtp_instance *instance = (struct ast_rtp_instance *)data;
2948 int timeout = 0;
2949 int res = 0;
2950
2951 ao2_lock(instance);
2952 res = dtls_srtp_handle_timeout(instance, &timeout, 1);
2953 ao2_unlock(instance);
2954 if (res < 0) {
2955 /* Tells the scheduler to stop rescheduling */
2956 return 0;
2957 }
2958
2959 /* Reschedule based on the timeout value */
2960 return timeout;
2961}
2962
2963static void dtls_srtp_start_timeout_timer(struct ast_rtp_instance *instance, struct ast_rtp *rtp, int rtcp)
2964{
2965 struct dtls_details *dtls = !rtcp ? &rtp->dtls : &rtp->rtcp->dtls;
2966 ast_sched_cb cb = !rtcp ? dtls_srtp_handle_rtp_timeout : dtls_srtp_handle_rtcp_timeout;
2967 struct timeval dtls_timeout;
2968 int res = 0;
2969 int timeout = 0;
2970
2971 ast_assert(dtls->timeout_timer == -1);
2972
2973 res = DTLSv1_get_timeout(dtls->ssl, &dtls_timeout);
2974 if (res == 0) {
2975 ast_debug_dtls(3, "(%p) DTLS srtp - DTLSv1_get_timeout return an error or there was no timeout set for %s\n",
2976 instance, rtcp ? "RTCP" : "RTP");
2977 return;
2978 }
2979
2980 timeout = dtls_timeout.tv_sec * 1000 + dtls_timeout.tv_usec / 1000;
2981
2982 ao2_ref(instance, +1);
2983 /*
2984 * We want the timer to fire again based on calling DTLSv1_get_timeout()
2985 * inside the callback, not at a fixed interval.
2986 */
2987 if ((dtls->timeout_timer = ast_sched_add_variable(rtp->sched, timeout, cb, instance, 1)) < 0) {
2988 ao2_ref(instance, -1);
2989 ast_log(LOG_WARNING, "Scheduling '%s' DTLS retransmission for RTP instance [%p] failed.\n",
2990 !rtcp ? "RTP" : "RTCP", instance);
2991 } else {
2992 ast_debug_dtls(3, "(%p) DTLS srtp - scheduled timeout timer for '%d' %s\n",
2993 instance, timeout, rtcp ? "RTCP" : "RTP");
2994 }
2995}
2996
2997/*! \pre Must not be called with the instance locked. */
2998static void dtls_srtp_stop_timeout_timer(struct ast_rtp_instance *instance, struct ast_rtp *rtp, int rtcp)
2999{
3000 struct dtls_details *dtls = !rtcp ? &rtp->dtls : &rtp->rtcp->dtls;
3001
3002 AST_SCHED_DEL_UNREF(rtp->sched, dtls->timeout_timer, ao2_ref(instance, -1));
3003 ast_debug_dtls(3, "(%p) DTLS srtp - stopped timeout timer'\n", instance);
3004}
3005
3006/* Scheduler callback */
3007static int dtls_srtp_renegotiate(const void *data)
3008{
3009 struct ast_rtp_instance *instance = (struct ast_rtp_instance *)data;
3010 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
3011
3012 ao2_lock(instance);
3013
3014 ast_debug_dtls(3, "(%p) DTLS srtp - renegotiate'\n", instance);
3015 SSL_renegotiate(rtp->dtls.ssl);
3016 SSL_do_handshake(rtp->dtls.ssl);
3017
3018 if (rtp->rtcp && rtp->rtcp->dtls.ssl && rtp->rtcp->dtls.ssl != rtp->dtls.ssl) {
3019 SSL_renegotiate(rtp->rtcp->dtls.ssl);
3020 SSL_do_handshake(rtp->rtcp->dtls.ssl);
3021 }
3022
3023 rtp->rekeyid = -1;
3024
3025 ao2_unlock(instance);
3026 ao2_ref(instance, -1);
3027
3028 return 0;
3029}
3030
3031static int dtls_srtp_add_local_ssrc(struct ast_rtp *rtp, struct ast_rtp_instance *instance, int rtcp, unsigned int ssrc, int set_remote_policy)
3032{
3033 unsigned char material[SRTP_MASTER_LEN * 2];
3034 unsigned char *local_key, *local_salt, *remote_key, *remote_salt;
3035 struct ast_srtp_policy *local_policy, *remote_policy = NULL;
3036 int res = -1;
3037 struct dtls_details *dtls = !rtcp ? &rtp->dtls : &rtp->rtcp->dtls;
3038
3039 ast_debug_dtls(3, "(%p) DTLS srtp - add local ssrc - rtcp=%d, set_remote_policy=%d'\n",
3040 instance, rtcp, set_remote_policy);
3041
3042 /* Produce key information and set up SRTP */
3043 if (!SSL_export_keying_material(dtls->ssl, material, SRTP_MASTER_LEN * 2, "EXTRACTOR-dtls_srtp", 19, NULL, 0, 0)) {
3044 ast_log(LOG_WARNING, "Unable to extract SRTP keying material from DTLS-SRTP negotiation on RTP instance '%p'\n",
3045 instance);
3046 return -1;
3047 }
3048
3049 /* Whether we are acting as a server or client determines where the keys/salts are */
3050 if (rtp->dtls.dtls_setup == AST_RTP_DTLS_SETUP_ACTIVE) {
3051 local_key = material;
3052 remote_key = local_key + SRTP_MASTER_KEY_LEN;
3053 local_salt = remote_key + SRTP_MASTER_KEY_LEN;
3054 remote_salt = local_salt + SRTP_MASTER_SALT_LEN;
3055 } else {
3056 remote_key = material;
3057 local_key = remote_key + SRTP_MASTER_KEY_LEN;
3058 remote_salt = local_key + SRTP_MASTER_KEY_LEN;
3059 local_salt = remote_salt + SRTP_MASTER_SALT_LEN;
3060 }
3061
3062 if (!(local_policy = res_srtp_policy->alloc())) {
3063 return -1;
3064 }
3065
3066 if (res_srtp_policy->set_master_key(local_policy, local_key, SRTP_MASTER_KEY_LEN, local_salt, SRTP_MASTER_SALT_LEN) < 0) {
3067 ast_log(LOG_WARNING, "Could not set key/salt information on local policy of '%p' when setting up DTLS-SRTP\n", rtp);
3068 goto error;
3069 }
3070
3071 if (res_srtp_policy->set_suite(local_policy, rtp->suite)) {
3072 ast_log(LOG_WARNING, "Could not set suite to '%u' on local policy of '%p' when setting up DTLS-SRTP\n", rtp->suite, rtp);
3073 goto error;
3074 }
3075
3076 res_srtp_policy->set_ssrc(local_policy, ssrc, 0);
3077
3078 if (set_remote_policy) {
3079 if (!(remote_policy = res_srtp_policy->alloc())) {
3080 goto error;
3081 }
3082
3083 if (res_srtp_policy->set_master_key(remote_policy, remote_key, SRTP_MASTER_KEY_LEN, remote_salt, SRTP_MASTER_SALT_LEN) < 0) {
3084 ast_log(LOG_WARNING, "Could not set key/salt information on remote policy of '%p' when setting up DTLS-SRTP\n", rtp);
3085 goto error;
3086 }
3087
3088 if (res_srtp_policy->set_suite(remote_policy, rtp->suite)) {
3089 ast_log(LOG_WARNING, "Could not set suite to '%u' on remote policy of '%p' when setting up DTLS-SRTP\n", rtp->suite, rtp);
3090 goto error;
3091 }
3092
3093 res_srtp_policy->set_ssrc(remote_policy, 0, 1);
3094 }
3095
3096 if (ast_rtp_instance_add_srtp_policy(instance, remote_policy, local_policy, rtcp)) {
3097 ast_log(LOG_WARNING, "Could not set policies when setting up DTLS-SRTP on '%p'\n", rtp);
3098 goto error;
3099 }
3100
3101 res = 0;
3102
3103error:
3104 /* policy->destroy() called even on success to release local reference to these resources */
3105 res_srtp_policy->destroy(local_policy);
3106
3107 if (remote_policy) {
3108 res_srtp_policy->destroy(remote_policy);
3109 }
3110
3111 return res;
3112}
3113
3114static int dtls_srtp_setup(struct ast_rtp *rtp, struct ast_rtp_instance *instance, int rtcp)
3115{
3116 struct dtls_details *dtls = !rtcp ? &rtp->dtls : &rtp->rtcp->dtls;
3117 int index;
3118
3119 ast_debug_dtls(3, "(%p) DTLS setup SRTP rtp=%p'\n", instance, rtp);
3120
3121 /* If a fingerprint is present in the SDP make sure that the peer certificate matches it */
3122 if (rtp->dtls_verify & AST_RTP_DTLS_VERIFY_FINGERPRINT) {
3123 X509 *certificate;
3124
3125 if (!(certificate = SSL_get_peer_certificate(dtls->ssl))) {
3126 ast_log(LOG_WARNING, "No certificate was provided by the peer on RTP instance '%p'\n", instance);
3127 return -1;
3128 }
3129
3130 /* If a fingerprint is present in the SDP make sure that the peer certificate matches it */
3131 if (rtp->remote_fingerprint[0]) {
3132 const EVP_MD *type;
3133 unsigned char fingerprint[EVP_MAX_MD_SIZE];
3134 unsigned int size;
3135
3136 if (rtp->remote_hash == AST_RTP_DTLS_HASH_SHA1) {
3137 type = EVP_sha1();
3138 } else if (rtp->remote_hash == AST_RTP_DTLS_HASH_SHA256) {
3139 type = EVP_sha256();
3140 } else {
3141 ast_log(LOG_WARNING, "Unsupported fingerprint hash type on RTP instance '%p'\n", instance);
3142 return -1;
3143 }
3144
3145 if (!X509_digest(certificate, type, fingerprint, &size) ||
3146 !size ||
3147 memcmp(fingerprint, rtp->remote_fingerprint, size)) {
3148 X509_free(certificate);
3149 ast_log(LOG_WARNING, "Fingerprint provided by remote party does not match that of peer certificate on RTP instance '%p'\n",
3150 instance);
3151 return -1;
3152 }
3153 }
3154
3155 X509_free(certificate);
3156 }
3157
3158 if (dtls_srtp_add_local_ssrc(rtp, instance, rtcp, ast_rtp_instance_get_ssrc(instance), 1)) {
3159 ast_log(LOG_ERROR, "Failed to add local source '%p'\n", rtp);
3160 return -1;
3161 }
3162
3163 for (index = 0; index < AST_VECTOR_SIZE(&rtp->ssrc_mapping); ++index) {
3164 struct rtp_ssrc_mapping *mapping = AST_VECTOR_GET_ADDR(&rtp->ssrc_mapping, index);
3165
3166 if (dtls_srtp_add_local_ssrc(rtp, instance, rtcp, ast_rtp_instance_get_ssrc(mapping->instance), 0)) {
3167 return -1;
3168 }
3169 }
3170
3171 if (rtp->rekey) {
3172 ao2_ref(instance, +1);
3173 if ((rtp->rekeyid = ast_sched_add(rtp->sched, rtp->rekey * 1000, dtls_srtp_renegotiate, instance)) < 0) {
3174 ao2_ref(instance, -1);
3175 return -1;
3176 }
3177 }
3178
3179 return 0;
3180}
3181#endif
3182
3183/*! \brief Helper function to compare an elem in a vector by value */
3184static int compare_by_value(int elem, int value)
3185{
3186 return elem - value;
3187}
3188
3189/*! \brief Helper function to find an elem in a vector by value */
3190static int find_by_value(int elem, int value)
3191{
3192 return elem == value;
3193}
3194
3195static int rtcp_mux(struct ast_rtp *rtp, const unsigned char *packet)
3196{
3197 uint8_t version;
3198 uint8_t pt;
3199 uint8_t m;
3200
3201 if (!rtp->rtcp || rtp->rtcp->type != AST_RTP_INSTANCE_RTCP_MUX) {
3202 return 0;
3203 }
3204
3205 version = (packet[0] & 0XC0) >> 6;
3206 if (version == 0) {
3207 /* version 0 indicates this is a STUN packet and shouldn't
3208 * be interpreted as a possible RTCP packet
3209 */
3210 return 0;
3211 }
3212
3213 /* The second octet of a packet will be one of the following:
3214 * For RTP: The marker bit (1 bit) and the RTP payload type (7 bits)
3215 * For RTCP: The payload type (8)
3216 *
3217 * RTP has a forbidden range of payload types (64-95) since these
3218 * will conflict with RTCP payload numbers if the marker bit is set.
3219 */
3220 m = packet[1] & 0x80;
3221 pt = packet[1] & 0x7F;
3222 if (m && pt >= 64 && pt <= 95) {
3223 return 1;
3224 }
3225 return 0;
3226}
3227
3228/*! \pre instance is locked */
3229static int __rtp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int rtcp)
3230{
3231 int len;
3232 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
3233#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
3234 char *in = buf;
3235#endif
3236#ifdef HAVE_PJPROJECT
3237 struct ast_sockaddr *loop = rtcp ? &rtp->rtcp_loop : &rtp->rtp_loop;
3238#endif
3239#ifdef TEST_FRAMEWORK
3240 struct ast_rtp_engine_test *test = ast_rtp_instance_get_test(instance);
3241#endif
3242
3243 if ((len = ast_recvfrom(rtcp ? rtp->rtcp->s : rtp->s, buf, size, flags, sa)) < 0) {
3244 return len;
3245 }
3246
3247#ifdef TEST_FRAMEWORK
3248 if (test && test->packets_to_drop > 0) {
3249 test->packets_to_drop--;
3250 return 0;
3251 }
3252#endif
3253
3254#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
3255 /* If this is an SSL packet pass it to OpenSSL for processing. RFC section for first byte value:
3256 * https://tools.ietf.org/html/rfc5764#section-5.1.2 */
3257 if ((*in >= 20) && (*in <= 63)) {
3258 struct dtls_details *dtls = !rtcp ? &rtp->dtls : &rtp->rtcp->dtls;
3259 int res = 0;
3260
3261 /* If no SSL session actually exists terminate things */
3262 if (!dtls->ssl) {
3263 ast_log(LOG_ERROR, "Received SSL traffic on RTP instance '%p' without an SSL session\n",
3264 instance);
3265 return -1;
3266 }
3267
3268 ast_debug_dtls(3, "(%p) DTLS - __rtp_recvfrom rtp=%p - Got SSL packet '%d'\n", instance, rtp, *in);
3269
3270#ifdef HAVE_PJPROJECT
3271 /* If this packet arrived via TURN/ICE loopback re-injection,
3272 * substitute the real remote address before the candidate check
3273 * otherwise the DTLS check will see 127.0.0.1 and drop the packet.
3274 */
3275 if (!ast_sockaddr_isnull(&rtp->rtp_loop) && !ast_sockaddr_cmp(&rtp->rtp_loop, sa)) {
3277 } else if (rtcp && !ast_sockaddr_isnull(&rtp->rtcp_loop) && !ast_sockaddr_cmp(&rtp->rtcp_loop, sa)) {
3278 ast_sockaddr_copy(sa, &rtp->rtcp->them);
3279 }
3280#endif
3281
3282 /*
3283 * If ICE is in use, we can prevent a possible DOS attack
3284 * by allowing DTLS protocol messages (client hello, etc)
3285 * only from sources that are in the active remote
3286 * candidates list.
3287 */
3288
3289#ifdef HAVE_PJPROJECT
3290 if (rtp->ice) {
3291 int pass_src_check = 0;
3292 int ix = 0;
3293
3294 /*
3295 * You'd think that this check would cause a "deadlock"
3296 * because ast_rtp_ice_start_media calls dtls_perform_handshake
3297 * before it sets ice_media_started = 1 so how can we do a
3298 * handshake if we're dropping packets before we send them
3299 * to openssl. Fortunately, dtls_perform_handshake just sets
3300 * up openssl to do the handshake and doesn't actually perform it
3301 * itself and the locking prevents __rtp_recvfrom from
3302 * running before the ice_media_started flag is set. So only
3303 * unexpected DTLS packets can get dropped here.
3304 */
3305 if (!rtp->ice_media_started) {
3306 ast_log(LOG_WARNING, "%s: DTLS packet from %s dropped. ICE not completed yet.\n",
3309 return 0;
3310 }
3311
3312 /*
3313 * If we got this far, then there have to be candidates.
3314 * We have to use pjproject's rcands because they may have
3315 * peer reflexive candidates that our ice_active_remote_candidates
3316 * won't.
3317 */
3318 for (ix = 0; ix < rtp->ice->real_ice->rcand_cnt; ix++) {
3319 pj_ice_sess_cand *rcand = &rtp->ice->real_ice->rcand[ix];
3320 if (ast_sockaddr_pj_sockaddr_cmp(sa, &rcand->addr) == 0) {
3321 pass_src_check = 1;
3322 break;
3323 }
3324 }
3325
3326 if (!pass_src_check) {
3327 ast_log(LOG_WARNING, "%s: DTLS packet from %s dropped. Source not in ICE active candidate list.\n",
3330 return 0;
3331 }
3332 }
3333#endif
3334
3335 /*
3336 * A race condition is prevented between dtls_perform_handshake()
3337 * and this function because both functions have to get the
3338 * instance lock before they can do anything. The
3339 * dtls_perform_handshake() function needs to start the timer
3340 * before we stop it below.
3341 */
3342
3343 /* Before we feed data into OpenSSL ensure that the timeout timer is either stopped or completed */
3344 ao2_unlock(instance);
3345 dtls_srtp_stop_timeout_timer(instance, rtp, rtcp);
3346 ao2_lock(instance);
3347
3348 /* If we don't yet know if we are active or passive and we receive a packet... we are obviously passive */
3349 if (dtls->dtls_setup == AST_RTP_DTLS_SETUP_ACTPASS) {
3350 dtls->dtls_setup = AST_RTP_DTLS_SETUP_PASSIVE;
3351 SSL_set_accept_state(dtls->ssl);
3352 }
3353
3354 BIO_write(dtls->read_bio, buf, len);
3355
3356 len = SSL_read(dtls->ssl, buf, len);
3357
3358 if ((len < 0) && (SSL_get_error(dtls->ssl, len) == SSL_ERROR_SSL)) {
3359 unsigned long error = ERR_get_error();
3360 ast_log(LOG_ERROR, "DTLS failure occurred on RTP instance '%p' due to reason '%s', terminating\n",
3361 instance, ERR_reason_error_string(error));
3362 return -1;
3363 }
3364
3365 if (SSL_is_init_finished(dtls->ssl)) {
3366 /* Any further connections will be existing since this is now established */
3367 dtls->connection = AST_RTP_DTLS_CONNECTION_EXISTING;
3368 /* Use the keying material to set up key/salt information */
3369 if ((res = dtls_srtp_setup(rtp, instance, rtcp))) {
3370 return res;
3371 }
3372 /* Notify that dtls has been established */
3374
3375 ast_debug_dtls(3, "(%p) DTLS - __rtp_recvfrom rtp=%p - established'\n", instance, rtp);
3376 } else {
3377 /* Since we've sent additional traffic start the timeout timer for retransmission */
3378 dtls_srtp_start_timeout_timer(instance, rtp, rtcp);
3379 }
3380
3381 return res;
3382 }
3383#endif
3384
3385#ifdef HAVE_PJPROJECT
3386 if (!ast_sockaddr_isnull(loop) && !ast_sockaddr_cmp(loop, sa)) {
3387 /* ICE traffic will have been handled in the TURN callback, so skip it but update the address
3388 * so it reflects the actual source and not the loopback
3389 */
3390 if (rtcp) {
3391 ast_sockaddr_copy(sa, &rtp->rtcp->them);
3392 } else {
3394 }
3395 } else if (rtp->ice) {
3396 pj_str_t combined = pj_str(ast_sockaddr_stringify(sa));
3397 pj_sockaddr address;
3398 pj_status_t status;
3399 struct ice_wrap *ice;
3400
3401 pj_thread_register_check();
3402
3403 pj_sockaddr_parse(pj_AF_UNSPEC(), 0, &combined, &address);
3404
3405 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
3406 ice = rtp->ice;
3407 ao2_ref(ice, +1);
3408 ao2_unlock(instance);
3409 status = pj_ice_sess_on_rx_pkt(ice->real_ice,
3412 pj_sockaddr_get_len(&address));
3413 ao2_ref(ice, -1);
3414 ao2_lock(instance);
3415 if (status != PJ_SUCCESS) {
3416 char err_buf[100];
3417
3418 pj_strerror(status, err_buf, sizeof(err_buf));
3419 ast_log(LOG_WARNING, "PJ ICE Rx error status code: %d '%s'.\n",
3420 (int)status, err_buf);
3421 return -1;
3422 }
3423 if (!rtp->passthrough) {
3424 /* If a unidirectional ICE negotiation occurs then lock on to the source of the
3425 * ICE traffic and use it as the target. This will occur if the remote side only
3426 * wants to receive media but never send to us.
3427 */
3428 if (!rtp->ice_active_remote_candidates && !rtp->ice_proposed_remote_candidates) {
3429 if (rtcp) {
3430 ast_sockaddr_copy(&rtp->rtcp->them, sa);
3431 } else {
3433 }
3434 }
3435 return 0;
3436 }
3437 rtp->passthrough = 0;
3438 }
3439#endif
3440
3441 return len;
3442}
3443
3444/*! \pre instance is locked */
3445static int rtcp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
3446{
3447 return __rtp_recvfrom(instance, buf, size, flags, sa, 1);
3448}
3449
3450/*! \pre instance is locked */
3451static int rtp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
3452{
3453 return __rtp_recvfrom(instance, buf, size, flags, sa, 0);
3454}
3455
3456/*! \pre instance is locked */
3457static int __rtp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int rtcp, int *via_ice, int use_srtp)
3458{
3459 int len = size;
3460 void *temp = buf;
3461 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
3462 struct ast_rtp_instance *transport = rtp->bundled ? rtp->bundled : instance;
3463 struct ast_rtp *transport_rtp = ast_rtp_instance_get_data(transport);
3464 struct ast_srtp *srtp = ast_rtp_instance_get_srtp(transport, rtcp);
3465 int res;
3466#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
3467 char *out = buf;
3468 struct dtls_details *dtls = (!rtcp || rtp->rtcp->type == AST_RTP_INSTANCE_RTCP_MUX) ? &rtp->dtls : &rtp->rtcp->dtls;
3469
3470 /* Don't send RTP if DTLS hasn't finished yet */
3471 if (dtls->ssl && ((*out < 20) || (*out > 63)) && dtls->connection == AST_RTP_DTLS_CONNECTION_NEW) {
3472 *via_ice = 0;
3473 return 0;
3474 }
3475#endif
3476
3477 *via_ice = 0;
3478
3479 if (use_srtp && res_srtp && srtp && res_srtp->protect(srtp, &temp, &len, rtcp) < 0) {
3480 return -1;
3481 }
3482
3483#ifdef HAVE_PJPROJECT
3484 if (transport_rtp->ice) {
3486 pj_status_t status;
3487 struct ice_wrap *ice;
3488
3489 /* If RTCP is sharing the same socket then use the same component */
3490 if (rtcp && rtp->rtcp->s == rtp->s) {
3491 component = AST_RTP_ICE_COMPONENT_RTP;
3492 }
3493
3494 pj_thread_register_check();
3495
3496 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
3497 ice = transport_rtp->ice;
3498 ao2_ref(ice, +1);
3499 if (instance == transport) {
3500 ao2_unlock(instance);
3501 }
3502 status = pj_ice_sess_send_data(ice->real_ice, component, temp, len);
3503 ao2_ref(ice, -1);
3504 if (instance == transport) {
3505 ao2_lock(instance);
3506 }
3507 if (status == PJ_SUCCESS) {
3508 *via_ice = 1;
3509 return len;
3510 }
3511 }
3512#endif
3513
3514 res = ast_sendto(rtcp ? transport_rtp->rtcp->s : transport_rtp->s, temp, len, flags, sa);
3515 if (res > 0) {
3516 ast_rtp_instance_set_last_tx(instance, time(NULL));
3517 }
3518
3519 return res;
3520}
3521
3522/*! \pre instance is locked */
3523static int rtcp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int *ice)
3524{
3525 return __rtp_sendto(instance, buf, size, flags, sa, 1, ice, 1);
3526}
3527
3528/*! \pre instance is locked */
3529static int rtp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int *ice)
3530{
3531 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
3532 int hdrlen = 12;
3533 int res;
3534
3535 if ((res = __rtp_sendto(instance, buf, size, flags, sa, 0, ice, 1)) > 0) {
3536 rtp->txcount++;
3537 rtp->txoctetcount += (res - hdrlen);
3538 }
3539
3540 return res;
3541}
3542
3543static unsigned int ast_rtcp_calc_interval(struct ast_rtp *rtp)
3544{
3545 unsigned int interval;
3546 /*! \todo XXX Do a more reasonable calculation on this one
3547 * Look in RFC 3550 Section A.7 for an example*/
3548 interval = rtcpinterval;
3549 return interval;
3550}
3551
3552static void calc_mean_and_standard_deviation(double new_sample, double *mean, double *std_dev, unsigned int *count)
3553{
3554 double delta1;
3555 double delta2;
3556
3557 /* First convert the standard deviation back into a sum of squares. */
3558 double last_sum_of_squares = (*std_dev) * (*std_dev) * (*count ?: 1);
3559
3560 if (++(*count) == 0) {
3561 /* Avoid potential divide by zero on an overflow */
3562 *count = 1;
3563 }
3564
3565 /*
3566 * Below is an implementation of Welford's online algorithm [1] for calculating
3567 * mean and variance in a single pass.
3568 *
3569 * [1] https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
3570 */
3571
3572 delta1 = new_sample - *mean;
3573 *mean += (delta1 / *count);
3574 delta2 = new_sample - *mean;
3575
3576 /* Now calculate the new variance, and subsequent standard deviation */
3577 *std_dev = sqrt((last_sum_of_squares + (delta1 * delta2)) / *count);
3578}
3579
3580static int create_new_socket(const char *type, struct ast_sockaddr *bind_addr)
3581{
3582 int af, sock;
3583
3584 af = ast_sockaddr_is_ipv4(bind_addr) ? AF_INET :
3585 ast_sockaddr_is_ipv6(bind_addr) ? AF_INET6 : -1;
3586 sock = ast_socket_nonblock(af, SOCK_DGRAM, 0);
3587
3588 if (sock < 0) {
3589 ast_log(LOG_WARNING, "Unable to allocate %s socket: %s\n", type, strerror(errno));
3590 return sock;
3591 }
3592
3593#ifdef SO_NO_CHECK
3594 if (nochecksums) {
3595 setsockopt(sock, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums));
3596 }
3597#endif
3598
3599#ifdef HAVE_SOCK_IPV6_V6ONLY
3600 if (AF_INET6 == af && ast_sockaddr_is_any(bind_addr)) {
3601 /* ICE relies on dual-stack behavior. Ensure it is enabled. */
3602 if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &(int){0}, sizeof(int)) != 0) {
3603 ast_log(LOG_WARNING, "setsockopt IPV6_V6ONLY=0 failed: %s\n", strerror(errno));
3604 }
3605 }
3606#endif
3607
3608 return sock;
3609}
3610
3611/*!
3612 * \internal
3613 * \brief Initializes sequence values and probation for learning mode.
3614 * \note This is an adaptation of pjmedia's pjmedia_rtp_seq_init function.
3615 *
3616 * \param info The learning information to track
3617 * \param seq sequence number read from the rtp header to initialize the information with
3618 */
3619static void rtp_learning_seq_init(struct rtp_learning_info *info, uint16_t seq)
3620{
3621 info->max_seq = seq;
3622 info->packets = learning_min_sequential;
3623 memset(&info->received, 0, sizeof(info->received));
3624}
3625
3626/*!
3627 * \internal
3628 * \brief Updates sequence information for learning mode and determines if probation/learning mode should remain in effect.
3629 * \note This function was adapted from pjmedia's pjmedia_rtp_seq_update function.
3630 *
3631 * \param info Structure tracking the learning progress of some address
3632 * \param seq sequence number read from the rtp header
3633 * \retval 0 if probation mode should exit for this address
3634 * \retval non-zero if probation mode should continue
3635 */
3636static int rtp_learning_rtp_seq_update(struct rtp_learning_info *info, uint16_t seq)
3637{
3638 if (seq == (uint16_t) (info->max_seq + 1)) {
3639 /* packet is in sequence */
3640 info->packets--;
3641 } else {
3642 /* Sequence discontinuity; reset */
3643 info->packets = learning_min_sequential - 1;
3644 info->received = ast_tvnow();
3645 }
3646
3647 /* Only check time if strictrtp is set to yes. Otherwise, we only needed to check seqno */
3648 if (strictrtp == STRICT_RTP_YES) {
3649 switch (info->stream_type) {
3652 /*
3653 * Protect against packet floods by checking that we
3654 * received the packet sequence in at least the minimum
3655 * allowed time.
3656 */
3657 if (ast_tvzero(info->received)) {
3658 info->received = ast_tvnow();
3659 } else if (!info->packets
3660 && ast_tvdiff_ms(ast_tvnow(), info->received) < learning_min_duration) {
3661 /* Packet flood; reset */
3662 info->packets = learning_min_sequential - 1;
3663 info->received = ast_tvnow();
3664 }
3665 break;
3669 case AST_MEDIA_TYPE_END:
3670 break;
3671 }
3672 }
3673
3674 info->max_seq = seq;
3675
3676 return info->packets;
3677}
3678
3679/*!
3680 * \brief Start the strictrtp learning mode.
3681 *
3682 * \param rtp RTP session description
3683 */
3684static void rtp_learning_start(struct ast_rtp *rtp)
3685{
3687 memset(&rtp->rtp_source_learn.proposed_address, 0,
3688 sizeof(rtp->rtp_source_learn.proposed_address));
3690 rtp_learning_seq_init(&rtp->rtp_source_learn, (uint16_t) rtp->lastrxseqno);
3691}
3692
3693#ifdef HAVE_PJPROJECT
3694static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message);
3695
3696/*!
3697 * \internal
3698 * \brief Resets and ACL to empty state.
3699 */
3700static void rtp_unload_acl(ast_rwlock_t *lock, struct ast_acl_list **acl)
3701{
3705}
3706
3707/*!
3708 * \internal
3709 * \brief Checks an address against the ICE blacklist
3710 * \note If there is no ice_blacklist list, always returns 0
3711 *
3712 * \param address The address to consider
3713 * \retval 0 if address is not ICE blacklisted
3714 * \retval 1 if address is ICE blacklisted
3715 */
3716static int rtp_address_is_ice_blacklisted(const struct ast_sockaddr *address)
3717{
3718 int result = 0;
3719
3720 ast_rwlock_rdlock(&ice_acl_lock);
3722 ast_rwlock_unlock(&ice_acl_lock);
3723
3724 return result;
3725}
3726
3727/*!
3728 * \internal
3729 * \brief Checks an address against the STUN blacklist
3730 * \since 13.16.0
3731 *
3732 * \note If there is no stun_blacklist list, always returns 0
3733 *
3734 * \param addr The address to consider
3735 *
3736 * \retval 0 if address is not STUN blacklisted
3737 * \retval 1 if address is STUN blacklisted
3738 */
3739static int stun_address_is_blacklisted(const struct ast_sockaddr *addr)
3740{
3741 int result = 0;
3742
3743 ast_rwlock_rdlock(&stun_acl_lock);
3744 result |= ast_apply_acl_nolog(stun_acl, addr) == AST_SENSE_DENY;
3745 ast_rwlock_unlock(&stun_acl_lock);
3746
3747 return result;
3748}
3749
3750/*! \pre instance is locked */
3751static void rtp_add_candidates_to_ice(struct ast_rtp_instance *instance, struct ast_rtp *rtp, struct ast_sockaddr *addr, int port, int component,
3752 int transport)
3753{
3754 unsigned int count = 0;
3755 struct ifaddrs *ifa, *ia;
3756 struct ast_sockaddr tmp;
3757 pj_sockaddr pjtmp;
3758 struct ast_ice_host_candidate *candidate;
3759 int af_inet_ok = 0, af_inet6_ok = 0;
3760 struct sockaddr_in stunaddr_copy;
3761
3762 if (ast_sockaddr_is_ipv4(addr)) {
3763 af_inet_ok = 1;
3764 } else if (ast_sockaddr_is_any(addr)) {
3765 af_inet_ok = af_inet6_ok = 1;
3766 } else {
3767 af_inet6_ok = 1;
3768 }
3769
3770 if (getifaddrs(&ifa) < 0) {
3771 /* If we can't get addresses, we can't load ICE candidates */
3772 ast_log(LOG_ERROR, "(%p) ICE Error obtaining list of local addresses: %s\n",
3773 instance, strerror(errno));
3774 } else {
3775 ast_debug_ice(2, "(%p) ICE add system candidates\n", instance);
3776 /* Iterate through the list of addresses obtained from the system,
3777 * until we've iterated through all of them, or accepted
3778 * PJ_ICE_MAX_CAND candidates */
3779 for (ia = ifa; ia && count < PJ_ICE_MAX_CAND; ia = ia->ifa_next) {
3780 /* Interface is either not UP or doesn't have an address assigned,
3781 * eg, a ppp that just completed LCP but no IPCP yet */
3782 if (!ia->ifa_addr || (ia->ifa_flags & IFF_UP) == 0) {
3783 continue;
3784 }
3785
3786 /* Filter out non-IPvX addresses, eg, link-layer */
3787 if (ia->ifa_addr->sa_family != AF_INET && ia->ifa_addr->sa_family != AF_INET6) {
3788 continue;
3789 }
3790
3791 ast_sockaddr_from_sockaddr(&tmp, ia->ifa_addr);
3792
3793 if (ia->ifa_addr->sa_family == AF_INET) {
3794 const struct sockaddr_in *sa_in = (struct sockaddr_in*)ia->ifa_addr;
3795 if (!af_inet_ok) {
3796 continue;
3797 }
3798
3799 /* Skip 127.0.0.0/8 (loopback) */
3800 /* Don't use IFF_LOOPBACK check since one could assign usable
3801 * publics to the loopback */
3802 if ((sa_in->sin_addr.s_addr & htonl(0xFF000000)) == htonl(0x7F000000)) {
3803 continue;
3804 }
3805
3806 /* Skip 0.0.0.0/8 based on RFC1122, and from pjproject */
3807 if ((sa_in->sin_addr.s_addr & htonl(0xFF000000)) == 0) {
3808 continue;
3809 }
3810 } else { /* ia->ifa_addr->sa_family == AF_INET6 */
3811 if (!af_inet6_ok) {
3812 continue;
3813 }
3814
3815 /* Filter ::1 */
3816 if (!ast_sockaddr_cmp_addr(&lo6, &tmp)) {
3817 continue;
3818 }
3819 }
3820
3821 /* Pull in the host candidates from [ice_host_candidates] */
3822 AST_RWLIST_RDLOCK(&host_candidates);
3823 AST_LIST_TRAVERSE(&host_candidates, candidate, next) {
3824 if (!ast_sockaddr_cmp(&candidate->local, &tmp)) {
3825 /* candidate->local matches actual assigned, so check if
3826 * advertised is blacklisted, if not, add it to the
3827 * advertised list. Not that it would make sense to remap
3828 * a local address to a blacklisted address, but honour it
3829 * anyway. */
3830 if (!rtp_address_is_ice_blacklisted(&candidate->advertised)) {
3831 ast_sockaddr_to_pj_sockaddr(&candidate->advertised, &pjtmp);
3832 pj_sockaddr_set_port(&pjtmp, port);
3833 ast_rtp_ice_add_cand(instance, rtp, component, transport,
3834 PJ_ICE_CAND_TYPE_HOST, 65535, &pjtmp, &pjtmp, NULL,
3835 pj_sockaddr_get_len(&pjtmp));
3836 ++count;
3837 }
3838
3839 if (!candidate->include_local) {
3840 /* We don't want to advertise the actual address */
3842 }
3843
3844 break;
3845 }
3846 }
3847 AST_RWLIST_UNLOCK(&host_candidates);
3848
3849 /* we had an entry in [ice_host_candidates] that matched, and
3850 * didn't have include_local_address set. Alternatively, adding
3851 * that match resulted in us going to PJ_ICE_MAX_CAND */
3852 if (ast_sockaddr_isnull(&tmp) || count == PJ_ICE_MAX_CAND) {
3853 continue;
3854 }
3855
3856 if (rtp_address_is_ice_blacklisted(&tmp)) {
3857 continue;
3858 }
3859
3860 ast_sockaddr_to_pj_sockaddr(&tmp, &pjtmp);
3861 pj_sockaddr_set_port(&pjtmp, port);
3862 ast_rtp_ice_add_cand(instance, rtp, component, transport,
3863 PJ_ICE_CAND_TYPE_HOST, 65535, &pjtmp, &pjtmp, NULL,
3864 pj_sockaddr_get_len(&pjtmp));
3865 ++count;
3866 }
3867 freeifaddrs(ifa);
3868 }
3869
3870 ast_rwlock_rdlock(&stunaddr_lock);
3871 memcpy(&stunaddr_copy, &stunaddr, sizeof(stunaddr));
3872 ast_rwlock_unlock(&stunaddr_lock);
3873
3874 /* If configured to use a STUN server to get our external mapped address do so */
3875 if (stunaddr_copy.sin_addr.s_addr && !stun_address_is_blacklisted(addr) &&
3876 (ast_sockaddr_is_ipv4(addr) || ast_sockaddr_is_any(addr)) &&
3877 count < PJ_ICE_MAX_CAND) {
3878 struct sockaddr_in answer;
3879 int rsp;
3880
3882 "(%p) ICE request STUN %s %s candidate\n", instance,
3883 transport == AST_TRANSPORT_UDP ? "UDP" : "TCP",
3884 component == AST_RTP_ICE_COMPONENT_RTP ? "RTP" : "RTCP");
3885
3886 /*
3887 * The instance should not be locked because we can block
3888 * waiting for a STUN respone.
3889 */
3890 ao2_unlock(instance);
3892 ? rtp->rtcp->s : rtp->s, &stunaddr_copy, NULL, &answer);
3893 ao2_lock(instance);
3894 if (!rsp) {
3895 struct ast_rtp_engine_ice_candidate *candidate;
3896 pj_sockaddr ext, base;
3897 pj_str_t mapped = pj_str(ast_strdupa(ast_inet_ntoa(answer.sin_addr)));
3898 int srflx = 1, baseset = 0;
3899 struct ao2_iterator i;
3900
3901 pj_sockaddr_init(pj_AF_INET(), &ext, &mapped, ntohs(answer.sin_port));
3902
3903 /*
3904 * If the returned address is the same as one of our host
3905 * candidates, don't send the srflx. At the same time,
3906 * we need to set the base address (raddr).
3907 */
3908 i = ao2_iterator_init(rtp->ice_local_candidates, 0);
3909 while (srflx && (candidate = ao2_iterator_next(&i))) {
3910 if (!baseset && ast_sockaddr_is_ipv4(&candidate->address)) {
3911 baseset = 1;
3912 ast_sockaddr_to_pj_sockaddr(&candidate->address, &base);
3913 }
3914
3915 if (!pj_sockaddr_cmp(&candidate->address, &ext)) {
3916 srflx = 0;
3917 }
3918
3919 ao2_ref(candidate, -1);
3920 }
3922
3923 if (srflx && baseset) {
3924 pj_sockaddr_set_port(&base, port);
3925 ast_rtp_ice_add_cand(instance, rtp, component, transport,
3926 PJ_ICE_CAND_TYPE_SRFLX, 65535, &ext, &base, &base,
3927 pj_sockaddr_get_len(&ext));
3928 }
3929 }
3930 }
3931
3932 /* If configured to use a TURN relay create a session and allocate */
3933 if (pj_strlen(&turnaddr)) {
3934 ast_rtp_ice_turn_request(instance, component, AST_TRANSPORT_TCP, pj_strbuf(&turnaddr), turnport,
3935 pj_strbuf(&turnusername), pj_strbuf(&turnpassword));
3936 }
3937}
3938#endif
3939
3940/*!
3941 * \internal
3942 * \brief Calculates the elapsed time from issue of the first tx packet in an
3943 * rtp session and a specified time
3944 *
3945 * \param rtp pointer to the rtp struct with the transmitted rtp packet
3946 * \param delivery time of delivery - if NULL or zero value, will be ast_tvnow()
3947 *
3948 * \return time elapsed in milliseconds
3949 */
3950static unsigned int calc_txstamp(struct ast_rtp *rtp, struct timeval *delivery)
3951{
3952 struct timeval t;
3953 long ms;
3954
3955 if (ast_tvzero(rtp->txcore)) {
3956 rtp->txcore = ast_tvnow();
3957 rtp->txcore.tv_usec -= rtp->txcore.tv_usec % 20000;
3958 }
3959
3960 t = (delivery && !ast_tvzero(*delivery)) ? *delivery : ast_tvnow();
3961 if ((ms = ast_tvdiff_ms(t, rtp->txcore)) < 0) {
3962 ms = 0;
3963 }
3964 rtp->txcore = t;
3965
3966 return (unsigned int) ms;
3967}
3968
3969#ifdef HAVE_PJPROJECT
3970/*!
3971 * \internal
3972 * \brief Creates an ICE session. Can be used to replace a destroyed ICE session.
3973 *
3974 * \param instance RTP instance for which the ICE session is being replaced
3975 * \param addr ast_sockaddr to use for adding RTP candidates to the ICE session
3976 * \param port port to use for adding RTP candidates to the ICE session
3977 * \param replace 0 when creating a new session, 1 when replacing a destroyed session
3978 *
3979 * \pre instance is locked
3980 *
3981 * \retval 0 on success
3982 * \retval -1 on failure
3983 */
3984static int ice_create(struct ast_rtp_instance *instance, struct ast_sockaddr *addr,
3985 int port, int replace)
3986{
3987 pj_stun_config stun_config;
3988 pj_str_t ufrag, passwd;
3989 pj_status_t status;
3990 struct ice_wrap *ice_old;
3991 struct ice_wrap *ice;
3992 pj_ice_sess *real_ice = NULL;
3993 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
3994
3995 ao2_cleanup(rtp->ice_local_candidates);
3996 rtp->ice_local_candidates = NULL;
3997
3998 ast_debug_ice(2, "(%p) ICE create%s\n", instance, replace ? " and replace" : "");
3999
4000 ice = ao2_alloc_options(sizeof(*ice), ice_wrap_dtor, AO2_ALLOC_OPT_LOCK_NOLOCK);
4001 if (!ice) {
4002 ast_rtp_ice_stop(instance);
4003 return -1;
4004 }
4005
4006 pj_thread_register_check();
4007
4008 pj_stun_config_init(&stun_config, &cachingpool.factory, 0, NULL, timer_heap);
4009 if (!stun_software_attribute) {
4010 stun_config.software_name = pj_str(NULL);
4011 }
4012
4013 ufrag = pj_str(rtp->local_ufrag);
4014 passwd = pj_str(rtp->local_passwd);
4015
4016 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
4017 ao2_unlock(instance);
4018 /* Create an ICE session for ICE negotiation */
4019 status = pj_ice_sess_create(&stun_config, NULL, PJ_ICE_SESS_ROLE_UNKNOWN,
4020 rtp->ice_num_components, &ast_rtp_ice_sess_cb, &ufrag, &passwd, NULL, &real_ice);
4021 ao2_lock(instance);
4022 if (status == PJ_SUCCESS) {
4023 /* Safely complete linking the ICE session into the instance */
4024 real_ice->user_data = instance;
4025 ice->real_ice = real_ice;
4026 ice_old = rtp->ice;
4027 rtp->ice = ice;
4028 if (ice_old) {
4029 ao2_unlock(instance);
4030 ao2_ref(ice_old, -1);
4031 ao2_lock(instance);
4032 }
4033
4034 /* Add all of the available candidates to the ICE session */
4035 rtp_add_candidates_to_ice(instance, rtp, addr, port, AST_RTP_ICE_COMPONENT_RTP,
4037
4038 /* Only add the RTCP candidates to ICE when replacing the session and if
4039 * the ICE session contains more than just an RTP component. New sessions
4040 * handle this in a separate part of the setup phase */
4041 if (replace && rtp->rtcp && rtp->ice_num_components > 1) {
4042 rtp_add_candidates_to_ice(instance, rtp, &rtp->rtcp->us,
4045 }
4046
4047 return 0;
4048 }
4049
4050 /*
4051 * It is safe to unref this while instance is locked here.
4052 * It was not initialized with a real_ice pointer.
4053 */
4054 ao2_ref(ice, -1);
4055
4056 ast_rtp_ice_stop(instance);
4057 return -1;
4058
4059}
4060#endif
4061
4062static int rtp_allocate_transport(struct ast_rtp_instance *instance, struct ast_rtp *rtp)
4063{
4064 int x, startplace, i, maxloops;
4065
4067
4068 /* Create a new socket for us to listen on and use */
4069 if ((rtp->s = create_new_socket("RTP", &rtp->bind_address)) < 0) {
4070 ast_log(LOG_WARNING, "Failed to create a new socket for RTP instance '%p'\n", instance);
4071 return -1;
4072 }
4073
4074 /* Now actually find a free RTP port to use */
4075 x = (ast_random() % (rtpend - rtpstart)) + rtpstart;
4076 x = x & ~1;
4077 startplace = x;
4078
4079 /* Protection against infinite loops in the case there is a potential case where the loop is not broken such as an odd
4080 start port sneaking in (even though this condition is checked at load.) */
4081 maxloops = rtpend - rtpstart;
4082 for (i = 0; i <= maxloops; i++) {
4084 /* Try to bind, this will tell us whether the port is available or not */
4085 if (!ast_bind(rtp->s, &rtp->bind_address)) {
4086 ast_debug_rtp(1, "(%p) RTP allocated port %d\n", instance, x);
4088 ast_test_suite_event_notify("RTP_PORT_ALLOCATED", "Port: %d", x);
4089 break;
4090 }
4091
4092 x += 2;
4093 if (x > rtpend) {
4094 x = (rtpstart + 1) & ~1;
4095 }
4096
4097 /* See if we ran out of ports or if the bind actually failed because of something other than the address being in use */
4098 if (x == startplace || (errno != EADDRINUSE && errno != EACCES)) {
4099 ast_log(LOG_ERROR, "Oh dear... we couldn't allocate a port for RTP instance '%p'\n", instance);
4100 close(rtp->s);
4101 rtp->s = -1;
4102 return -1;
4103 }
4104 }
4105
4106#ifdef HAVE_PJPROJECT
4107 /* Initialize synchronization aspects */
4108 ast_cond_init(&rtp->cond, NULL);
4109
4110 generate_random_string(rtp->local_ufrag, sizeof(rtp->local_ufrag));
4111 generate_random_string(rtp->local_passwd, sizeof(rtp->local_passwd));
4112
4113 /* Create an ICE session for ICE negotiation */
4114 if (icesupport) {
4115 rtp->ice_num_components = 2;
4116 ast_debug_ice(2, "(%p) ICE creating session %s (%d)\n", instance,
4118 if (ice_create(instance, &rtp->bind_address, x, 0)) {
4119 ast_log(LOG_NOTICE, "(%p) ICE failed to create session\n", instance);
4120 } else {
4121 rtp->ice_port = x;
4122 ast_sockaddr_copy(&rtp->ice_original_rtp_addr, &rtp->bind_address);
4123 }
4124 }
4125#endif
4126
4127#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
4128 rtp->rekeyid = -1;
4129 rtp->dtls.timeout_timer = -1;
4130#endif
4131
4132 return 0;
4133}
4134
4135static void rtp_deallocate_transport(struct ast_rtp_instance *instance, struct ast_rtp *rtp)
4136{
4137 int saved_rtp_s = rtp->s;
4138#ifdef HAVE_PJPROJECT
4139 struct timeval wait = ast_tvadd(ast_tvnow(), ast_samp2tv(TURN_STATE_WAIT_TIME, 1000));
4140 struct timespec ts = { .tv_sec = wait.tv_sec, .tv_nsec = wait.tv_usec * 1000, };
4141#endif
4142
4143#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
4144 ast_rtp_dtls_stop(instance);
4145#endif
4146
4147 /* Close our own socket so we no longer get packets */
4148 if (rtp->s > -1) {
4149 close(rtp->s);
4150 rtp->s = -1;
4151 }
4152
4153 /* Destroy RTCP if it was being used */
4154 if (rtp->rtcp && rtp->rtcp->s > -1) {
4155 if (saved_rtp_s != rtp->rtcp->s) {
4156 close(rtp->rtcp->s);
4157 }
4158 rtp->rtcp->s = -1;
4159 }
4160
4161#ifdef HAVE_PJPROJECT
4162 pj_thread_register_check();
4163
4164 /*
4165 * The instance lock is already held.
4166 *
4167 * Destroy the RTP TURN relay if being used
4168 */
4169 if (rtp->turn_rtp) {
4170 rtp->turn_state = PJ_TURN_STATE_NULL;
4171
4172 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
4173 ao2_unlock(instance);
4174 pj_turn_sock_destroy(rtp->turn_rtp);
4175 ao2_lock(instance);
4176 while (rtp->turn_state != PJ_TURN_STATE_DESTROYING) {
4177 ast_cond_timedwait(&rtp->cond, ao2_object_get_lockaddr(instance), &ts);
4178 }
4179 rtp->turn_rtp = NULL;
4180 }
4181
4182 /* Destroy the RTCP TURN relay if being used */
4183 if (rtp->turn_rtcp) {
4184 rtp->turn_state = PJ_TURN_STATE_NULL;
4185
4186 /* Release the instance lock to avoid deadlock with PJPROJECT group lock */
4187 ao2_unlock(instance);
4188 pj_turn_sock_destroy(rtp->turn_rtcp);
4189 ao2_lock(instance);
4190 while (rtp->turn_state != PJ_TURN_STATE_DESTROYING) {
4191 ast_cond_timedwait(&rtp->cond, ao2_object_get_lockaddr(instance), &ts);
4192 }
4193 rtp->turn_rtcp = NULL;
4194 }
4195
4196 ast_debug_ice(2, "(%p) ICE RTP transport deallocating\n", instance);
4197 /* Destroy any ICE session */
4198 ast_rtp_ice_stop(instance);
4199
4200 /* Destroy any candidates */
4201 if (rtp->ice_local_candidates) {
4202 ao2_ref(rtp->ice_local_candidates, -1);
4203 rtp->ice_local_candidates = NULL;
4204 }
4205
4206 if (rtp->ice_active_remote_candidates) {
4207 ao2_ref(rtp->ice_active_remote_candidates, -1);
4208 rtp->ice_active_remote_candidates = NULL;
4209 }
4210
4211 if (rtp->ice_proposed_remote_candidates) {
4212 ao2_ref(rtp->ice_proposed_remote_candidates, -1);
4213 rtp->ice_proposed_remote_candidates = NULL;
4214 }
4215
4216 if (rtp->ioqueue) {
4217 /*
4218 * We cannot hold the instance lock because we could wait
4219 * for the ioqueue thread to die and we might deadlock as
4220 * a result.
4221 */
4222 ao2_unlock(instance);
4223 rtp_ioqueue_thread_remove(rtp->ioqueue);
4224 ao2_lock(instance);
4225 rtp->ioqueue = NULL;
4226 }
4227#endif
4228}
4229
4230/*! \pre instance is locked */
4231static int ast_rtp_new(struct ast_rtp_instance *instance,
4232 struct ast_sched_context *sched, struct ast_sockaddr *addr,
4233 void *data)
4234{
4235 struct ast_rtp *rtp = NULL;
4236
4237 /* Create a new RTP structure to hold all of our data */
4238 if (!(rtp = ast_calloc(1, sizeof(*rtp)))) {
4239 return -1;
4240 }
4241 rtp->owner = instance;
4242 /* Set default parameters on the newly created RTP structure */
4243 rtp->ssrc = ast_random();
4244 ast_uuid_generate_str(rtp->cname, sizeof(rtp->cname));
4245 rtp->seqno = ast_random() & 0xffff;
4246 rtp->expectedrxseqno = -1;
4247 rtp->expectedseqno = -1;
4248 rtp->rxstart = -1;
4249 rtp->sched = sched;
4250 ast_sockaddr_copy(&rtp->bind_address, addr);
4251 /* Transport creation operations can grab the RTP data from the instance, so set it */
4252 ast_rtp_instance_set_data(instance, rtp);
4253
4254 if (rtp_allocate_transport(instance, rtp)) {
4255 return -1;
4256 }
4257
4258 if (AST_VECTOR_INIT(&rtp->ssrc_mapping, 1)) {
4259 return -1;
4260 }
4261
4263 return -1;
4264 }
4265 rtp->transport_wide_cc.schedid = -1;
4266
4270 rtp->stream_num = -1;
4271
4272 return 0;
4273}
4274
4275/*!
4276 * \brief SSRC mapping comparator for AST_VECTOR_REMOVE_CMP_UNORDERED()
4277 *
4278 * \param elem Element to compare against
4279 * \param value Value to compare with the vector element.
4280 *
4281 * \retval 0 if element does not match.
4282 * \retval Non-zero if element matches.
4283 */
4284#define SSRC_MAPPING_ELEM_CMP(elem, value) ((elem).instance == (value))
4285
4286/*! \pre instance is locked */
4287static int ast_rtp_destroy(struct ast_rtp_instance *instance)
4288{
4289 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4290
4291 if (rtp->bundled) {
4292 struct ast_rtp *bundled_rtp;
4293
4294 /* We can't hold our instance lock while removing ourselves from the parent */
4295 ao2_unlock(instance);
4296
4297 ao2_lock(rtp->bundled);
4298 bundled_rtp = ast_rtp_instance_get_data(rtp->bundled);
4300 ao2_unlock(rtp->bundled);
4301
4302 ao2_lock(instance);
4303 ao2_ref(rtp->bundled, -1);
4304 }
4305
4306 rtp_deallocate_transport(instance, rtp);
4307
4308 /* Destroy the smoother that was smoothing out audio if present */
4309 if (rtp->smoother) {
4311 }
4312
4313 /* Destroy RTCP if it was being used */
4314 if (rtp->rtcp) {
4315 /*
4316 * It is not possible for there to be an active RTCP scheduler
4317 * entry at this point since it holds a reference to the
4318 * RTP instance while it's active.
4319 */
4321 ast_free(rtp->rtcp);
4322 }
4323
4324 /* Destroy RED if it was being used */
4325 if (rtp->red) {
4326 ao2_unlock(instance);
4327 AST_SCHED_DEL(rtp->sched, rtp->red->schedid);
4328 ao2_lock(instance);
4329 ast_free(rtp->red);
4330 rtp->red = NULL;
4331 }
4332
4333 /* Destroy the send buffer if it was being used */
4334 if (rtp->send_buffer) {
4336 }
4337
4338 /* Destroy the recv buffer if it was being used */
4339 if (rtp->recv_buffer) {
4341 }
4342
4344
4350
4351 /* Finally destroy ourselves */
4352 rtp->owner = NULL;
4353 ast_free(rtp);
4354
4355 return 0;
4356}
4357
4358/*! \pre instance is locked */
4359static int ast_rtp_dtmf_mode_set(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode)
4360{
4361 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4362 rtp->dtmfmode = dtmf_mode;
4363 return 0;
4364}
4365
4366/*! \pre instance is locked */
4368{
4369 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4370 return rtp->dtmfmode;
4371}
4372
4373/*! \pre instance is locked */
4374static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit)
4375{
4376 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4377 struct ast_sockaddr remote_address = { {0,} };
4378 int hdrlen = 12, res = 0, i = 0, payload = -1, sample_rate = -1;
4379 char data[256];
4380 unsigned int *rtpheader = (unsigned int*)data;
4381 RAII_VAR(struct ast_format *, payload_format, NULL, ao2_cleanup);
4382
4383 ast_rtp_instance_get_remote_address(instance, &remote_address);
4384
4385 /* If we have no remote address information bail out now */
4386 if (ast_sockaddr_isnull(&remote_address)) {
4387 return -1;
4388 }
4389
4390 /* Convert given digit into what we want to transmit */
4391 if ((digit <= '9') && (digit >= '0')) {
4392 digit -= '0';
4393 } else if (digit == '*') {
4394 digit = 10;
4395 } else if (digit == '#') {
4396 digit = 11;
4397 } else if ((digit >= 'A') && (digit <= 'D')) {
4398 digit = digit - 'A' + 12;
4399 } else if ((digit >= 'a') && (digit <= 'd')) {
4400 digit = digit - 'a' + 12;
4401 } else {
4402 ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
4403 return -1;
4404 }
4405
4406
4407 /* g722 is a 16K codec that masquerades as an 8K codec within RTP. ast_rtp_get_rate was written specifically to
4408 handle this. If we use the actual sample rate of g722 in this scenario and there is a 16K telephone-event on
4409 offer, we will end up using that instead of the 8K rate telephone-event that is expected with g722. */
4410 if (rtp->lasttxformat == ast_format_none) {
4411 /* No audio frames have been written yet so we have to lookup both the preferred payload type and bitrate. */
4413 if (payload_format) {
4414 /* If we have a preferred type, use that. Otherwise default to 8K. */
4415 sample_rate = ast_rtp_get_rate(payload_format);
4416 }
4417 } else {
4418 sample_rate = ast_rtp_get_rate(rtp->lasttxformat);
4419 }
4420
4421 if (sample_rate != -1) {
4423 }
4424
4425 if (payload == -1 ||
4428 /* Fall back to the preferred DTMF payload type and sample rate as either we couldn't find an audio codec to try and match
4429 sample rates with or we could, but a telephone-event matching that audio codec's sample rate was not included in the
4430 sdp negotiated by the far end. */
4433 }
4434
4435 /* The sdp negotiation has not yeilded a usable RFC 2833/4733 format. Try a default-rate one as a last resort. */
4436 if (payload == -1 || sample_rate == -1) {
4437 sample_rate = DEFAULT_DTMF_SAMPLE_RATE_MS;
4439 }
4440 /* Even trying a default payload has failed. We are trying to send a digit outside of what was negotiated for. */
4441 if (payload == -1) {
4442 return -1;
4443 }
4444
4445 ast_test_suite_event_notify("DTMF_BEGIN", "Digit: %d\r\nPayload: %d\r\nRate: %d\r\n", digit, payload, sample_rate);
4446 ast_debug(1, "Sending digit '%d' at rate %d with payload %d\n", digit, sample_rate, payload);
4447
4448 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
4449 rtp->send_duration = 160;
4450 rtp->dtmf_samplerate_ms = (sample_rate / 1000);
4451 rtp->lastts += calc_txstamp(rtp, NULL) * rtp->dtmf_samplerate_ms;
4452 rtp->lastdigitts = rtp->lastts + rtp->send_duration;
4453
4454 /* Create the actual packet that we will be sending */
4455 rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno));
4456 rtpheader[1] = htonl(rtp->lastdigitts);
4457 rtpheader[2] = htonl(rtp->ssrc);
4458
4459 /* Actually send the packet */
4460 for (i = 0; i < 2; i++) {
4461 int ice;
4462
4463 rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration));
4464 res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address, &ice);
4465 if (res < 0) {
4466 ast_log(LOG_ERROR, "RTP Transmission error to %s: %s\n",
4467 ast_sockaddr_stringify(&remote_address),
4468 strerror(errno));
4469 }
4470 if (rtp_debug_test_addr(&remote_address)) {
4471 ast_verbose("Sent RTP DTMF packet to %s%s (type %-2.2d, seq %-6.6d, ts %-6.6u, len %-6.6d)\n",
4472 ast_sockaddr_stringify(&remote_address),
4473 ice ? " (via ICE)" : "",
4474 payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
4475 }
4476 rtp->seqno++;
4477 rtp->send_duration += 160;
4478 rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno));
4479 }
4480
4481 /* Record that we are in the process of sending a digit and information needed to continue doing so */
4482 rtp->sending_digit = 1;
4483 rtp->send_digit = digit;
4484 rtp->send_payload = payload;
4485
4486 return 0;
4487}
4488
4489/*! \pre instance is locked */
4491{
4492 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4493 struct ast_sockaddr remote_address = { {0,} };
4494 int hdrlen = 12, res = 0;
4495 char data[256];
4496 unsigned int *rtpheader = (unsigned int*)data;
4497 int ice;
4498
4499 ast_rtp_instance_get_remote_address(instance, &remote_address);
4500
4501 /* Make sure we know where the other side is so we can send them the packet */
4502 if (ast_sockaddr_isnull(&remote_address)) {
4503 return -1;
4504 }
4505
4506 /* Actually create the packet we will be sending */
4507 rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno));
4508 rtpheader[1] = htonl(rtp->lastdigitts);
4509 rtpheader[2] = htonl(rtp->ssrc);
4510 rtpheader[3] = htonl((rtp->send_digit << 24) | (0xa << 16) | (rtp->send_duration));
4511
4512 /* Boom, send it on out */
4513 res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address, &ice);
4514 if (res < 0) {
4515 ast_log(LOG_ERROR, "RTP Transmission error to %s: %s\n",
4516 ast_sockaddr_stringify(&remote_address),
4517 strerror(errno));
4518 }
4519
4520 if (rtp_debug_test_addr(&remote_address)) {
4521 ast_verbose("Sent RTP DTMF packet to %s%s (type %-2.2d, seq %-6.6d, ts %-6.6u, len %-6.6d)\n",
4522 ast_sockaddr_stringify(&remote_address),
4523 ice ? " (via ICE)" : "",
4524 rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
4525 }
4526
4527 /* And now we increment some values for the next time we swing by */
4528 rtp->seqno++;
4529 rtp->send_duration += 160;
4530 rtp->lastts += calc_txstamp(rtp, NULL) * rtp->dtmf_samplerate_ms;
4531
4532 return 0;
4533}
4534
4535/*! \pre instance is locked */
4536static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration)
4537{
4538 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4539 struct ast_sockaddr remote_address = { {0,} };
4540 int hdrlen = 12, res = -1, i = 0;
4541 char data[256];
4542 unsigned int *rtpheader = (unsigned int*)data;
4543 unsigned int measured_samples;
4544
4545 ast_rtp_instance_get_remote_address(instance, &remote_address);
4546
4547 /* Make sure we know where the remote side is so we can send them the packet we construct */
4548 if (ast_sockaddr_isnull(&remote_address)) {
4549 goto cleanup;
4550 }
4551
4552 /* Convert the given digit to the one we are going to send */
4553 if ((digit <= '9') && (digit >= '0')) {
4554 digit -= '0';
4555 } else if (digit == '*') {
4556 digit = 10;
4557 } else if (digit == '#') {
4558 digit = 11;
4559 } else if ((digit >= 'A') && (digit <= 'D')) {
4560 digit = digit - 'A' + 12;
4561 } else if ((digit >= 'a') && (digit <= 'd')) {
4562 digit = digit - 'a' + 12;
4563 } else {
4564 ast_log(LOG_WARNING, "Don't know how to represent '%c'\n", digit);
4565 goto cleanup;
4566 }
4567
4568 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
4569
4570 if (duration > 0 && (measured_samples = duration * ast_rtp_get_rate(rtp->f.subclass.format) / 1000) > rtp->send_duration) {
4571 ast_debug_rtp(2, "(%p) RTP adjusting final end duration from %d to %u\n",
4572 instance, rtp->send_duration, measured_samples);
4573 rtp->send_duration = measured_samples;
4574 }
4575
4576 /* Construct the packet we are going to send */
4577 rtpheader[1] = htonl(rtp->lastdigitts);
4578 rtpheader[2] = htonl(rtp->ssrc);
4579 rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (rtp->send_duration));
4580 rtpheader[3] |= htonl((1 << 23));
4581
4582 /* Send it 3 times, that's the magical number */
4583 for (i = 0; i < 3; i++) {
4584 int ice;
4585
4586 rtpheader[0] = htonl((2 << 30) | (rtp->send_payload << 16) | (rtp->seqno));
4587
4588 res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 4, 0, &remote_address, &ice);
4589
4590 if (res < 0) {
4591 ast_log(LOG_ERROR, "RTP Transmission error to %s: %s\n",
4592 ast_sockaddr_stringify(&remote_address),
4593 strerror(errno));
4594 }
4595
4596 if (rtp_debug_test_addr(&remote_address)) {
4597 ast_verbose("Sent RTP DTMF packet to %s%s (type %-2.2d, seq %-6.6d, ts %-6.6u, len %-6.6d)\n",
4598 ast_sockaddr_stringify(&remote_address),
4599 ice ? " (via ICE)" : "",
4600 rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
4601 }
4602
4603 rtp->seqno++;
4604 }
4605 res = 0;
4606
4607 /* Oh and we can't forget to turn off the stuff that says we are sending DTMF */
4608 rtp->lastts += calc_txstamp(rtp, NULL) * rtp->dtmf_samplerate_ms;
4609
4610 /* Reset the smoother as the delivery time stored in it is now out of date */
4611 if (rtp->smoother) {
4613 rtp->smoother = NULL;
4614 }
4615cleanup:
4616 rtp->sending_digit = 0;
4617 rtp->send_digit = 0;
4618
4619 /* Re-Learn expected seqno */
4620 rtp->expectedseqno = -1;
4621
4622 return res;
4623}
4624
4625/*! \pre instance is locked */
4626static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit)
4627{
4628 return ast_rtp_dtmf_end_with_duration(instance, digit, 0);
4629}
4630
4631/*! \pre instance is locked */
4632static void ast_rtp_update_source(struct ast_rtp_instance *instance)
4633{
4634 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4635
4636 /* We simply set this bit so that the next packet sent will have the marker bit turned on */
4638 ast_debug_rtp(3, "(%p) RTP setting the marker bit due to a source update\n", instance);
4639
4640 return;
4641}
4642
4643/*! \pre instance is locked */
4644static void ast_rtp_change_source(struct ast_rtp_instance *instance)
4645{
4646 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4647 struct ast_srtp *srtp = ast_rtp_instance_get_srtp(instance, 0);
4648 struct ast_srtp *rtcp_srtp = ast_rtp_instance_get_srtp(instance, 1);
4649 unsigned int ssrc = ast_random();
4650
4651 if (rtp->lastts) {
4652 /* We simply set this bit so that the next packet sent will have the marker bit turned on */
4654 }
4655
4656 ast_debug_rtp(3, "(%p) RTP changing ssrc from %u to %u due to a source change\n",
4657 instance, rtp->ssrc, ssrc);
4658
4659 if (srtp) {
4660 ast_debug_rtp(3, "(%p) RTP changing ssrc for SRTP from %u to %u\n",
4661 instance, rtp->ssrc, ssrc);
4662 res_srtp->change_source(srtp, rtp->ssrc, ssrc);
4663 if (rtcp_srtp != srtp) {
4664 res_srtp->change_source(rtcp_srtp, rtp->ssrc, ssrc);
4665 }
4666 }
4667
4668 rtp->ssrc = ssrc;
4669
4670 /* Since the source is changing, we don't know what sequence number to expect next */
4671 rtp->expectedrxseqno = -1;
4672
4673 return;
4674}
4675
4676static void timeval2ntp(struct timeval tv, unsigned int *msw, unsigned int *lsw)
4677{
4678 unsigned int sec, usec, frac;
4679 sec = tv.tv_sec + 2208988800u; /* Sec between 1900 and 1970 */
4680 usec = tv.tv_usec;
4681 /*
4682 * Convert usec to 0.32 bit fixed point without overflow.
4683 *
4684 * = usec * 2^32 / 10^6
4685 * = usec * 2^32 / (2^6 * 5^6)
4686 * = usec * 2^26 / 5^6
4687 *
4688 * The usec value needs 20 bits to represent 999999 usec. So
4689 * splitting the 2^26 to get the most precision using 32 bit
4690 * values gives:
4691 *
4692 * = ((usec * 2^12) / 5^6) * 2^14
4693 *
4694 * Splitting the division into two stages preserves all the
4695 * available significant bits of usec over doing the division
4696 * all at once.
4697 *
4698 * = ((((usec * 2^12) / 5^3) * 2^7) / 5^3) * 2^7
4699 */
4700 frac = ((((usec << 12) / 125) << 7) / 125) << 7;
4701 *msw = sec;
4702 *lsw = frac;
4703}
4704
4705static void ntp2timeval(unsigned int msw, unsigned int lsw, struct timeval *tv)
4706{
4707 tv->tv_sec = msw - 2208988800u;
4708 /* Reverse the sequence in timeval2ntp() */
4709 tv->tv_usec = ((((lsw >> 7) * 125) >> 7) * 125) >> 12;
4710}
4711
4713 unsigned int *lost_packets,
4714 int *fraction_lost)
4715{
4716 unsigned int extended_seq_no;
4717 unsigned int expected_packets;
4718 unsigned int expected_interval;
4719 unsigned int received_interval;
4720 int lost_interval;
4721
4722 /* Compute statistics */
4723 extended_seq_no = rtp->cycles + rtp->lastrxseqno;
4724 expected_packets = extended_seq_no - rtp->seedrxseqno + 1;
4725 if (rtp->rxcount > expected_packets) {
4726 expected_packets += rtp->rxcount - expected_packets;
4727 }
4728 *lost_packets = expected_packets - rtp->rxcount;
4729 expected_interval = expected_packets - rtp->rtcp->expected_prior;
4730 received_interval = rtp->rxcount - rtp->rtcp->received_prior;
4731 if (received_interval > expected_interval) {
4732 /* If we receive some late packets it is possible for the packets
4733 * we received in this interval to exceed the number we expected.
4734 * We update the expected so that the packet loss calculations
4735 * show that no packets are lost.
4736 */
4737 expected_interval = received_interval;
4738 }
4739 lost_interval = expected_interval - received_interval;
4740 if (expected_interval == 0 || lost_interval <= 0) {
4741 *fraction_lost = 0;
4742 } else {
4743 *fraction_lost = (lost_interval << 8) / expected_interval;
4744 }
4745
4746 /* Update RTCP statistics */
4747 rtp->rtcp->received_prior = rtp->rxcount;
4748 rtp->rtcp->expected_prior = expected_packets;
4749
4750 /*
4751 * While rxlost represents the number of packets lost since the last report was sent, for
4752 * the calculations below it should be thought of as a single sample. Thus min/max are the
4753 * lowest/highest sample value seen, and the mean is the average number of packets lost
4754 * between each report. As such rxlost_count only needs to be incremented per report.
4755 */
4756 if (lost_interval <= 0) {
4757 rtp->rtcp->rxlost = 0;
4758 } else {
4759 rtp->rtcp->rxlost = lost_interval;
4760 }
4761 if (rtp->rtcp->rxlost_count == 0) {
4762 rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
4763 }
4764 if (lost_interval && lost_interval < rtp->rtcp->minrxlost) {
4765 rtp->rtcp->minrxlost = rtp->rtcp->rxlost;
4766 }
4767 if (lost_interval > rtp->rtcp->maxrxlost) {
4768 rtp->rtcp->maxrxlost = rtp->rtcp->rxlost;
4769 }
4770
4771 calc_mean_and_standard_deviation(rtp->rtcp->rxlost, &rtp->rtcp->normdev_rxlost,
4772 &rtp->rtcp->stdev_rxlost, &rtp->rtcp->rxlost_count);
4773}
4774
4775static int ast_rtcp_generate_report(struct ast_rtp_instance *instance, unsigned char *rtcpheader,
4776 struct ast_rtp_rtcp_report *rtcp_report, int *sr)
4777{
4778 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4779 int len = 0;
4780 struct timeval now;
4781 unsigned int now_lsw;
4782 unsigned int now_msw;
4783 unsigned int lost_packets;
4784 int fraction_lost;
4785 struct timeval dlsr = { 0, };
4786 struct ast_rtp_rtcp_report_block *report_block = NULL;
4787
4788 if (!rtp || !rtp->rtcp) {
4789 return 0;
4790 }
4791
4792 if (ast_sockaddr_isnull(&rtp->rtcp->them)) { /* This'll stop rtcp for this rtp session */
4793 /* RTCP was stopped. */
4794 return 0;
4795 }
4796
4797 if (!rtcp_report) {
4798 return 1;
4799 }
4800
4801 *sr = rtp->txcount > rtp->rtcp->lastsrtxcount ? 1 : 0;
4802
4803 /* Compute statistics */
4804 calculate_lost_packet_statistics(rtp, &lost_packets, &fraction_lost);
4805 /*
4806 * update_local_mes_stats must be called AFTER
4807 * calculate_lost_packet_statistics
4808 */
4810
4811 gettimeofday(&now, NULL);
4812 rtcp_report->reception_report_count = rtp->themssrc_valid ? 1 : 0;
4813 rtcp_report->ssrc = rtp->ssrc;
4814 rtcp_report->type = *sr ? RTCP_PT_SR : RTCP_PT_RR;
4815 if (*sr) {
4816 rtcp_report->sender_information.ntp_timestamp = now;
4817 rtcp_report->sender_information.rtp_timestamp = rtp->lastts;
4818 rtcp_report->sender_information.packet_count = rtp->txcount;
4819 rtcp_report->sender_information.octet_count = rtp->txoctetcount;
4820 }
4821
4822 if (rtp->themssrc_valid) {
4823 report_block = ast_calloc(1, sizeof(*report_block));
4824 if (!report_block) {
4825 return 1;
4826 }
4827
4828 rtcp_report->report_block[0] = report_block;
4829 report_block->source_ssrc = rtp->themssrc;
4830 report_block->lost_count.fraction = (fraction_lost & 0xff);
4831 report_block->lost_count.packets = (lost_packets & 0xffffff);
4832 report_block->highest_seq_no = (rtp->cycles | (rtp->lastrxseqno & 0xffff));
4833 report_block->ia_jitter = (unsigned int)rtp->rxjitter_samples;
4834 report_block->lsr = rtp->rtcp->themrxlsr;
4835 /* If we haven't received an SR report, DLSR should be 0 */
4836 if (!ast_tvzero(rtp->rtcp->rxlsr)) {
4837 timersub(&now, &rtp->rtcp->rxlsr, &dlsr);
4838 report_block->dlsr = (((dlsr.tv_sec * 1000) + (dlsr.tv_usec / 1000)) * 65536) / 1000;
4839 }
4840 }
4841 timeval2ntp(rtcp_report->sender_information.ntp_timestamp, &now_msw, &now_lsw);
4842 put_unaligned_uint32(rtcpheader + 4, htonl(rtcp_report->ssrc)); /* Our SSRC */
4843 len += 8;
4844 if (*sr) {
4845 put_unaligned_uint32(rtcpheader + len, htonl(now_msw)); /* now, MSW. gettimeofday() + SEC_BETWEEN_1900_AND_1970 */
4846 put_unaligned_uint32(rtcpheader + len + 4, htonl(now_lsw)); /* now, LSW */
4847 put_unaligned_uint32(rtcpheader + len + 8, htonl(rtcp_report->sender_information.rtp_timestamp));
4848 put_unaligned_uint32(rtcpheader + len + 12, htonl(rtcp_report->sender_information.packet_count));
4849 put_unaligned_uint32(rtcpheader + len + 16, htonl(rtcp_report->sender_information.octet_count));
4850 len += 20;
4851 }
4852 if (report_block) {
4853 put_unaligned_uint32(rtcpheader + len, htonl(report_block->source_ssrc)); /* Their SSRC */
4854 put_unaligned_uint32(rtcpheader + len + 4, htonl((report_block->lost_count.fraction << 24) | report_block->lost_count.packets));
4855 put_unaligned_uint32(rtcpheader + len + 8, htonl(report_block->highest_seq_no));
4856 put_unaligned_uint32(rtcpheader + len + 12, htonl(report_block->ia_jitter));
4857 put_unaligned_uint32(rtcpheader + len + 16, htonl(report_block->lsr));
4858 put_unaligned_uint32(rtcpheader + len + 20, htonl(report_block->dlsr));
4859 len += 24;
4860 }
4861
4862 put_unaligned_uint32(rtcpheader, htonl((2 << 30) | (rtcp_report->reception_report_count << 24)
4863 | ((*sr ? RTCP_PT_SR : RTCP_PT_RR) << 16) | ((len/4)-1)));
4864
4865 return len;
4866}
4867
4869 struct ast_rtp_rtcp_report *rtcp_report, struct ast_sockaddr remote_address, int ice, int sr)
4870{
4871 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4872 struct ast_rtp_rtcp_report_block *report_block = NULL;
4873 RAII_VAR(struct ast_json *, message_blob, NULL, ast_json_unref);
4874
4875 if (!rtp || !rtp->rtcp) {
4876 return 0;
4877 }
4878
4879 if (ast_sockaddr_isnull(&rtp->rtcp->them)) {
4880 return 0;
4881 }
4882
4883 if (!rtcp_report) {
4884 return -1;
4885 }
4886
4887 report_block = rtcp_report->report_block[0];
4888
4889 if (sr) {
4890 rtp->rtcp->txlsr = rtcp_report->sender_information.ntp_timestamp;
4891 rtp->rtcp->sr_count++;
4892 rtp->rtcp->lastsrtxcount = rtp->txcount;
4893 } else {
4894 rtp->rtcp->rr_count++;
4895 }
4896
4897 if (rtcp_debug_test_addr(&rtp->rtcp->them)) {
4898 ast_verbose("* Sent RTCP %s to %s%s\n", sr ? "SR" : "RR",
4899 ast_sockaddr_stringify(&remote_address), ice ? " (via ICE)" : "");
4900 ast_verbose(" Our SSRC: %u\n", rtcp_report->ssrc);
4901 if (sr) {
4902 ast_verbose(" Sent(NTP): %u.%06u\n",
4903 (unsigned int)rtcp_report->sender_information.ntp_timestamp.tv_sec,
4904 (unsigned int)rtcp_report->sender_information.ntp_timestamp.tv_usec);
4905 ast_verbose(" Sent(RTP): %u\n", rtcp_report->sender_information.rtp_timestamp);
4906 ast_verbose(" Sent packets: %u\n", rtcp_report->sender_information.packet_count);
4907 ast_verbose(" Sent octets: %u\n", rtcp_report->sender_information.octet_count);
4908 }
4909 if (report_block) {
4910 int rate = ast_rtp_get_rate(rtp->f.subclass.format);
4911 ast_verbose(" Report block:\n");
4912 ast_verbose(" Their SSRC: %u\n", report_block->source_ssrc);
4913 ast_verbose(" Fraction lost: %d\n", report_block->lost_count.fraction);
4914 ast_verbose(" Cumulative loss: %u\n", report_block->lost_count.packets);
4915 ast_verbose(" Highest seq no: %u\n", report_block->highest_seq_no);
4916 ast_verbose(" IA jitter (samp): %u\n", report_block->ia_jitter);
4917 ast_verbose(" IA jitter (secs): %.6f\n", ast_samp2sec(report_block->ia_jitter, rate));
4918 ast_verbose(" Their last SR: %u\n", report_block->lsr);
4919 ast_verbose(" DLSR: %4.4f (sec)\n\n", (double)(report_block->dlsr / 65536.0));
4920 }
4921 }
4922
4923 message_blob = ast_json_pack("{s: s, s: s, s: f}",
4924 "to", ast_sockaddr_stringify(&remote_address),
4925 "from", rtp->rtcp->local_addr_str,
4926 "mes", rtp->rxmes);
4927
4929 rtcp_report, message_blob);
4930
4931 return 1;
4932}
4933
4934static int ast_rtcp_generate_sdes(struct ast_rtp_instance *instance, unsigned char *rtcpheader,
4935 struct ast_rtp_rtcp_report *rtcp_report)
4936{
4937 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
4938 int len = 0;
4939 uint16_t sdes_packet_len_bytes;
4940 uint16_t sdes_packet_len_rounded;
4941
4942 if (!rtp || !rtp->rtcp) {
4943 return 0;
4944 }
4945
4946 if (ast_sockaddr_isnull(&rtp->rtcp->them)) {
4947 return 0;
4948 }
4949
4950 if (!rtcp_report) {
4951 return -1;
4952 }
4953
4954 sdes_packet_len_bytes =
4955 4 + /* RTCP Header */
4956 4 + /* SSRC */
4957 1 + /* Type (CNAME) */
4958 1 + /* Text Length */
4959 AST_UUID_STR_LEN /* Text and NULL terminator */
4960 ;
4961
4962 /* Round to 32 bit boundary */
4963 sdes_packet_len_rounded = (sdes_packet_len_bytes + 3) & ~0x3;
4964
4965 put_unaligned_uint32(rtcpheader, htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | ((sdes_packet_len_rounded / 4) - 1)));
4966 put_unaligned_uint32(rtcpheader + 4, htonl(rtcp_report->ssrc));
4967 rtcpheader[8] = 0x01; /* CNAME */
4968 rtcpheader[9] = AST_UUID_STR_LEN - 1; /* Number of bytes of text */
4969 memcpy(rtcpheader + 10, rtp->cname, AST_UUID_STR_LEN);
4970 len += 10 + AST_UUID_STR_LEN;
4971
4972 /* Padding - Note that we don't set the padded bit on the packet. From
4973 * RFC 3550 Section 6.5:
4974 *
4975 * No length octet follows the null item type octet, but additional null
4976 * octets MUST be included if needd to pad until the next 32-bit
4977 * boundary. Note that this padding is separate from that indicated by
4978 * the P bit in the RTCP header.
4979 *
4980 * These bytes will already be zeroed out during array initialization.
4981 */
4982 len += (sdes_packet_len_rounded - sdes_packet_len_bytes);
4983
4984 return len;
4985}
4986
4987/* Lock instance before calling this if it isn't already
4988 *
4989 * If successful, the overall packet length is returned
4990 * If not, then 0 is returned
4991 */
4992static int ast_rtcp_generate_compound_prefix(struct ast_rtp_instance *instance, unsigned char *rtcpheader,
4993 struct ast_rtp_rtcp_report *report, int *sr)
4994{
4995 int packet_len = 0;
4996 int res;
4997
4998 /* Every RTCP packet needs to be sent out with a SR/RR and SDES prefixing it.
4999 * At the end of this function, rtcpheader should contain both of those packets,
5000 * and will return the length of the overall packet. This can be used to determine
5001 * where further packets can be inserted in the compound packet.
5002 */
5003 res = ast_rtcp_generate_report(instance, rtcpheader, report, sr);
5004
5005 if (res == 0 || res == 1) {
5006 ast_debug_rtcp(1, "(%p) RTCP failed to generate %s report!\n", instance, sr ? "SR" : "RR");
5007 return 0;
5008 }
5009
5010 packet_len += res;
5011
5012 res = ast_rtcp_generate_sdes(instance, rtcpheader + packet_len, report);
5013
5014 if (res == 0 || res == 1) {
5015 ast_debug_rtcp(1, "(%p) RTCP failed to generate SDES!\n", instance);
5016 return 0;
5017 }
5018
5019 return packet_len + res;
5020}
5021
5022static int ast_rtcp_generate_nack(struct ast_rtp_instance *instance, unsigned char *rtcpheader)
5023{
5024 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
5025 int packet_len;
5026 int blp_index = -1;
5027 int current_seqno;
5028 unsigned int fci = 0;
5029 size_t remaining_missing_seqno;
5030
5031 if (!rtp || !rtp->rtcp) {
5032 return 0;
5033 }
5034
5035 if (ast_sockaddr_isnull(&rtp->rtcp->them)) {
5036 return 0;
5037 }
5038
5039 current_seqno = rtp->expectedrxseqno;
5040 remaining_missing_seqno = AST_VECTOR_SIZE(&rtp->missing_seqno);
5041 packet_len = 12; /* The header length is 12 (version line, packet source SSRC, media source SSRC) */
5042
5043 /* If there are no missing sequence numbers then don't bother sending a NACK needlessly */
5044 if (!remaining_missing_seqno) {
5045 return 0;
5046 }
5047
5048 /* This iterates through the possible forward sequence numbers seeing which ones we
5049 * have no packet for, adding it to the NACK until we are out of missing packets.
5050 */
5051 while (remaining_missing_seqno) {
5052 int *missing_seqno;
5053
5054 /* On the first entry to this loop blp_index will be -1, so this will become 0
5055 * and the sequence number will be placed into the packet as the PID.
5056 */
5057 blp_index++;
5058
5059 missing_seqno = AST_VECTOR_GET_CMP(&rtp->missing_seqno, current_seqno,
5061 if (missing_seqno) {
5062 /* We hit the max blp size, reset */
5063 if (blp_index >= 17) {
5064 put_unaligned_uint32(rtcpheader + packet_len, htonl(fci));
5065 fci = 0;
5066 blp_index = 0;
5067 packet_len += 4;
5068 }
5069
5070 if (blp_index == 0) {
5071 fci |= (current_seqno << 16);
5072 } else {
5073 fci |= (1 << (blp_index - 1));
5074 }
5075
5076 /* Since we've used a missing sequence number, we're down one */
5077 remaining_missing_seqno--;
5078 }
5079
5080 /* Handle cycling of the sequence number */
5081 current_seqno++;
5082 if (current_seqno == SEQNO_CYCLE_OVER) {
5083 current_seqno = 0;
5084 }
5085 }
5086
5087 put_unaligned_uint32(rtcpheader + packet_len, htonl(fci));
5088 packet_len += 4;
5089
5090 /* Length MUST be 2+n, where n is the number of NACKs. Same as length in words minus 1 */
5091 put_unaligned_uint32(rtcpheader, htonl((2 << 30) | (AST_RTP_RTCP_FMT_NACK << 24)
5092 | (AST_RTP_RTCP_RTPFB << 16) | ((packet_len / 4) - 1)));
5093 put_unaligned_uint32(rtcpheader + 4, htonl(rtp->ssrc));
5094 put_unaligned_uint32(rtcpheader + 8, htonl(rtp->themssrc));
5095
5096 return packet_len;
5097}
5098
5099/*!
5100 * \brief Write a RTCP packet to the far end
5101 *
5102 * \note Decide if we are going to send an SR (with Reception Block) or RR
5103 * RR is sent if we have not sent any rtp packets in the previous interval
5104 *
5105 * Scheduler callback
5106 */
5107static int ast_rtcp_write(const void *data)
5108{
5109 struct ast_rtp_instance *instance = (struct ast_rtp_instance *) data;
5110 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
5111 int res;
5112 int sr = 0;
5113 int packet_len = 0;
5114 int ice;
5115 struct ast_sockaddr remote_address = { { 0, } };
5116 unsigned char *rtcpheader;
5117 unsigned char bdata[AST_UUID_STR_LEN + 128] = ""; /* More than enough */
5118 RAII_VAR(struct ast_rtp_rtcp_report *, rtcp_report, NULL, ao2_cleanup);
5119
5120 if (!rtp || !rtp->rtcp || rtp->rtcp->schedid == -1) {
5121 ao2_ref(instance, -1);
5122 return 0;
5123 }
5124
5125 ao2_lock(instance);
5126 rtcpheader = bdata;
5127 rtcp_report = ast_rtp_rtcp_report_alloc(rtp->themssrc_valid ? 1 : 0);
5128 res = ast_rtcp_generate_compound_prefix(instance, rtcpheader, rtcp_report, &sr);
5129
5130 if (res == 0 || res == 1) {
5131 goto cleanup;
5132 }
5133
5134 packet_len += res;
5135
5136 if (rtp->bundled) {
5137 ast_rtp_instance_get_remote_address(instance, &remote_address);
5138 } else {
5139 ast_sockaddr_copy(&remote_address, &rtp->rtcp->them);
5140 }
5141
5142 res = rtcp_sendto(instance, (unsigned int *)rtcpheader, packet_len, 0, &remote_address, &ice);
5143 if (res < 0) {
5144 ast_log(LOG_ERROR, "RTCP %s transmission error to %s, rtcp halted %s\n",
5145 sr ? "SR" : "RR",
5147 strerror(errno));
5148 res = 0;
5149 } else {
5150 ast_rtcp_calculate_sr_rr_statistics(instance, rtcp_report, remote_address, ice, sr);
5151 }
5152
5153cleanup:
5154 ao2_unlock(instance);
5155
5156 if (!res) {
5157 /*
5158 * Not being rescheduled.
5159 */
5160 rtp->rtcp->schedid = -1;
5161 ao2_ref(instance, -1);
5162 }
5163
5164 return res;
5165}
5166
5167static void put_unaligned_time24(void *p, uint32_t time_msw, uint32_t time_lsw)
5168{
5169 unsigned char *cp = p;
5170 uint32_t datum;
5171
5172 /* Convert the time to 6.18 format */
5173 datum = (time_msw << 18) & 0x00fc0000;
5174 datum |= (time_lsw >> 14) & 0x0003ffff;
5175
5176 cp[0] = datum >> 16;
5177 cp[1] = datum >> 8;
5178 cp[2] = datum;
5179}
5180
5181/*! \pre instance is locked */
5182static int rtp_raw_write(struct ast_rtp_instance *instance, struct ast_frame *frame, int codec)
5183{
5184 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
5185 int pred, mark = 0;
5186 unsigned int ms = calc_txstamp(rtp, &frame->delivery);
5187 struct ast_sockaddr remote_address = { {0,} };
5188 int rate = ast_rtp_get_rate(frame->subclass.format) / 1000;
5189 unsigned int seqno;
5190#ifdef TEST_FRAMEWORK
5191 struct ast_rtp_engine_test *test = ast_rtp_instance_get_test(instance);
5192#endif
5193
5195 frame->samples /= 2;
5196 }
5197
5198 if (rtp->sending_digit) {
5199 return 0;
5200 }
5201
5202#ifdef TEST_FRAMEWORK
5203 if (test && test->send_report) {
5204 test->send_report = 0;
5205 ast_rtcp_write(instance);
5206 return 0;
5207 }
5208#endif
5209
5210 if (frame->frametype == AST_FRAME_VOICE) {
5211 pred = rtp->lastts + frame->samples;
5212
5213 /* Re-calculate last TS */
5214 rtp->lastts = rtp->lastts + ms * rate;
5215 if (ast_tvzero(frame->delivery)) {
5216 /* If this isn't an absolute delivery time, Check if it is close to our prediction,
5217 and if so, go with our prediction */
5218 if (abs((int)rtp->lastts - pred) < MAX_TIMESTAMP_SKEW) {
5219 rtp->lastts = pred;
5220 } else {
5221 ast_debug_rtp(3, "(%p) RTP audio difference is %d, ms is %u\n",
5222 instance, abs((int)rtp->lastts - pred), ms);
5223 mark = 1;
5224 }
5225 }
5226 } else if (frame->frametype == AST_FRAME_VIDEO) {
5227 mark = frame->subclass.frame_ending;
5228 pred = rtp->lastovidtimestamp + frame->samples;
5229 /* Re-calculate last TS */
5230 rtp->lastts = rtp->lastts + ms * 90;
5231 /* If it's close to our prediction, go for it */
5232 if (ast_tvzero(frame->delivery)) {
5233 if (abs((int)rtp->lastts - pred) < 7200) {
5234 rtp->lastts = pred;
5235 rtp->lastovidtimestamp += frame->samples;
5236 } else {
5237 ast_debug_rtp(3, "(%p) RTP video difference is %d, ms is %u (%u), pred/ts/samples %u/%d/%d\n",
5238 instance, abs((int)rtp->lastts - pred), ms, ms * 90, rtp->lastts, pred, frame->samples);
5239 rtp->lastovidtimestamp = rtp->lastts;
5240 }
5241 }
5242 } else {
5243 pred = rtp->lastotexttimestamp + frame->samples;
5244 /* Re-calculate last TS */
5245 rtp->lastts = rtp->lastts + ms;
5246 /* If it's close to our prediction, go for it */
5247 if (ast_tvzero(frame->delivery)) {
5248 if (abs((int)rtp->lastts - pred) < 7200) {
5249 rtp->lastts = pred;
5250 rtp->lastotexttimestamp += frame->samples;
5251 } else {
5252 ast_debug_rtp(3, "(%p) RTP other difference is %d, ms is %u, pred/ts/samples %u/%d/%d\n",
5253 instance, abs((int)rtp->lastts - pred), ms, rtp->lastts, pred, frame->samples);
5254 rtp->lastotexttimestamp = rtp->lastts;
5255 }
5256 }
5257 }
5258
5259 /* If we have been explicitly told to set the marker bit then do so */
5261 mark = 1;
5263 }
5264
5265 /* If the timestamp for non-digt packets has moved beyond the timestamp for digits, update the digit timestamp */
5266 if (rtp->lastts > rtp->lastdigitts) {
5267 rtp->lastdigitts = rtp->lastts;
5268 }
5269
5270 /* Assume that the sequence number we expect to use is what will be used until proven otherwise */
5271 seqno = rtp->seqno;
5272
5273 /* If the frame contains sequence number information use it to influence our sequence number */
5275 if (rtp->expectedseqno != -1) {
5276 /* Determine where the frame from the core is in relation to where we expected */
5277 int difference = frame->seqno - rtp->expectedseqno;
5278
5279 /* If there is a substantial difference then we've either got packets really out
5280 * of order, or the source is RTP and it has cycled. If this happens we resync
5281 * the sequence number adjustments to this frame. If we also have packet loss
5282 * things won't be reflected correctly but it will sort itself out after a bit.
5283 */
5284 if (abs(difference) > 100) {
5285 difference = 0;
5286 }
5287
5288 /* Adjust the sequence number being used for this packet accordingly */
5289 seqno += difference;
5290
5291 if (difference >= 0) {
5292 /* This frame is on time or in the future */
5293 rtp->expectedseqno = frame->seqno + 1;
5294 rtp->seqno += difference;
5295 }
5296 } else {
5297 /* This is the first frame with sequence number we've seen, so start keeping track */
5298 rtp->expectedseqno = frame->seqno + 1;
5299 }
5300 } else {
5301 rtp->expectedseqno = -1;
5302 }
5303
5305 rtp->lastts = frame->ts * rate;
5306 }
5307
5308 ast_rtp_instance_get_remote_address(instance, &remote_address);
5309
5310 /* If we know the remote address construct a packet and send it out */
5311 if (!ast_sockaddr_isnull(&remote_address)) {
5312 int hdrlen = 12;
5313 int res;
5314 int ice;
5315 int ext = 0;
5316 int abs_send_time_id;
5317 int packet_len;
5318 unsigned char *rtpheader;
5319
5320 /* If the abs-send-time extension has been negotiated determine how much space we need */
5322 if (abs_send_time_id != -1) {
5323 /* 4 bytes for the shared information, 1 byte for identifier, 3 bytes for abs-send-time */
5324 hdrlen += 8;
5325 ext = 1;
5326 }
5327
5328 packet_len = frame->datalen + hdrlen;
5329 rtpheader = (unsigned char *)(frame->data.ptr - hdrlen);
5330
5331 put_unaligned_uint32(rtpheader, htonl((2 << 30) | (ext << 28) | (codec << 16) | (seqno) | (mark << 23)));
5332 put_unaligned_uint32(rtpheader + 4, htonl(rtp->lastts));
5333 put_unaligned_uint32(rtpheader + 8, htonl(rtp->ssrc));
5334
5335 /* We assume right now that we will only ever have the abs-send-time extension in the packet
5336 * which simplifies things a bit.
5337 */
5338 if (abs_send_time_id != -1) {
5339 unsigned int now_msw;
5340 unsigned int now_lsw;
5341
5342 /* This happens before being placed into the retransmission buffer so that when we
5343 * retransmit we only have to update the timestamp, not everything else.
5344 */
5345 put_unaligned_uint32(rtpheader + 12, htonl((0xBEDE << 16) | 1));
5346 rtpheader[16] = (abs_send_time_id << 4) | 2;
5347
5348 timeval2ntp(ast_tvnow(), &now_msw, &now_lsw);
5349 put_unaligned_time24(rtpheader + 17, now_msw, now_lsw);
5350 }
5351
5352 /* If retransmissions are enabled, we need to store this packet for future use */
5353 if (rtp->send_buffer) {
5354 struct ast_rtp_rtcp_nack_payload *payload;
5355
5356 payload = ast_malloc(sizeof(*payload) + packet_len);
5357 if (payload) {
5358 payload->size = packet_len;
5359 memcpy(payload->buf, rtpheader, packet_len);
5360 if (ast_data_buffer_put(rtp->send_buffer, rtp->seqno, payload) == -1) {
5361 ast_free(payload);
5362 }
5363 }
5364 }
5365
5366 res = rtp_sendto(instance, (void *)rtpheader, packet_len, 0, &remote_address, &ice);
5367 if (res < 0) {
5369 ast_debug_rtp(1, "(%p) RTP transmission error of packet %d to %s: %s\n",
5370 instance, rtp->seqno,
5371 ast_sockaddr_stringify(&remote_address),
5372 strerror(errno));
5374 /* Only give this error message once if we are not RTP debugging */
5376 ast_debug(0, "(%p) RTP NAT: Can't write RTP to private address %s, waiting for other end to send audio...\n",
5377 instance, ast_sockaddr_stringify(&remote_address));
5379 }
5380 } else {
5381 if (rtp->rtcp && rtp->rtcp->schedid < 0) {
5382 ast_debug_rtcp(2, "(%s) RTCP starting transmission in %u ms\n",
5384 ao2_ref(instance, +1);
5386 if (rtp->rtcp->schedid < 0) {
5387 ao2_ref(instance, -1);
5388 ast_log(LOG_WARNING, "scheduling RTCP transmission failed.\n");
5389 }
5390 }
5391 }
5392
5393 if (rtp_debug_test_addr(&remote_address)) {
5394 ast_verbose("Sent RTP packet to %s%s (type %-2.2d, seq %-6.6d, ts %-6.6u, len %-6.6d)\n",
5395 ast_sockaddr_stringify(&remote_address),
5396 ice ? " (via ICE)" : "",
5397 codec, rtp->seqno, rtp->lastts, res - hdrlen);
5398 }
5399 }
5400
5401 /* If the sequence number that has been used doesn't match what we expected then this is an out of
5402 * order late packet, so we don't need to increment as we haven't yet gotten the expected frame from
5403 * the core.
5404 */
5405 if (seqno == rtp->seqno) {
5406 rtp->seqno++;
5407 }
5408
5409 return 0;
5410}
5411
5412static struct ast_frame *red_t140_to_red(struct rtp_red *red)
5413{
5414 unsigned char *data = red->t140red.data.ptr;
5415 int len = 0;
5416 int i;
5417
5418 /* replace most aged generation */
5419 if (red->len[0]) {
5420 for (i = 1; i < red->num_gen+1; i++)
5421 len += red->len[i];
5422
5423 memmove(&data[red->hdrlen], &data[red->hdrlen+red->len[0]], len);
5424 }
5425
5426 /* Store length of each generation and primary data length*/
5427 for (i = 0; i < red->num_gen; i++)
5428 red->len[i] = red->len[i+1];
5429 red->len[i] = red->t140.datalen;
5430
5431 /* write each generation length in red header */
5432 len = red->hdrlen;
5433 for (i = 0; i < red->num_gen; i++) {
5434 len += data[i*4+3] = red->len[i];
5435 }
5436
5437 /* add primary data to buffer */
5438 memcpy(&data[len], red->t140.data.ptr, red->t140.datalen);
5439 red->t140red.datalen = len + red->t140.datalen;
5440
5441 /* no primary data and no generations to send */
5442 if (len == red->hdrlen && !red->t140.datalen) {
5443 return NULL;
5444 }
5445
5446 /* reset t.140 buffer */
5447 red->t140.datalen = 0;
5448
5449 return &red->t140red;
5450}
5451
5452static void rtp_write_rtcp_fir(struct ast_rtp_instance *instance, struct ast_rtp *rtp, struct ast_sockaddr *remote_address)
5453{
5454 unsigned char *rtcpheader;
5455 unsigned char bdata[1024];
5456 int packet_len = 0;
5457 int fir_len = 20;
5458 int ice;
5459 int res;
5460 int sr;
5461 RAII_VAR(struct ast_rtp_rtcp_report *, rtcp_report, NULL, ao2_cleanup);
5462
5463 if (!rtp || !rtp->rtcp) {
5464 return;
5465 }
5466
5467 if (ast_sockaddr_isnull(&rtp->rtcp->them) || rtp->rtcp->schedid < 0) {
5468 /*
5469 * RTCP was stopped.
5470 */
5471 return;
5472 }
5473
5474 if (!rtp->themssrc_valid) {
5475 /* We don't know their SSRC value so we don't know who to update. */
5476 return;
5477 }
5478
5479 /* Prepare RTCP FIR (PT=206, FMT=4) */
5480 rtp->rtcp->firseq++;
5481 if(rtp->rtcp->firseq == 256) {
5482 rtp->rtcp->firseq = 0;
5483 }
5484
5485 rtcpheader = bdata;
5486
5487 ao2_lock(instance);
5488 rtcp_report = ast_rtp_rtcp_report_alloc(rtp->themssrc_valid ? 1 : 0);
5489 res = ast_rtcp_generate_compound_prefix(instance, rtcpheader, rtcp_report, &sr);
5490
5491 if (res == 0 || res == 1) {
5492 ao2_unlock(instance);
5493 return;
5494 }
5495
5496 packet_len += res;
5497
5498 put_unaligned_uint32(rtcpheader + packet_len + 0, htonl((2 << 30) | (4 << 24) | (RTCP_PT_PSFB << 16) | ((fir_len/4)-1)));
5499 put_unaligned_uint32(rtcpheader + packet_len + 4, htonl(rtp->ssrc));
5500 put_unaligned_uint32(rtcpheader + packet_len + 8, htonl(rtp->themssrc));
5501 put_unaligned_uint32(rtcpheader + packet_len + 12, htonl(rtp->themssrc)); /* FCI: SSRC */
5502 put_unaligned_uint32(rtcpheader + packet_len + 16, htonl(rtp->rtcp->firseq << 24)); /* FCI: Sequence number */
5503 res = rtcp_sendto(instance, (unsigned int *)rtcpheader, packet_len + fir_len, 0, rtp->bundled ? remote_address : &rtp->rtcp->them, &ice);
5504 if (res < 0) {
5505 ast_log(LOG_ERROR, "RTCP FIR transmission error: %s\n", strerror(errno));
5506 } else {
5507 ast_rtcp_calculate_sr_rr_statistics(instance, rtcp_report, rtp->bundled ? *remote_address : rtp->rtcp->them, ice, sr);
5508 }
5509
5510 ao2_unlock(instance);
5511}
5512
5513static void rtp_write_rtcp_psfb(struct ast_rtp_instance *instance, struct ast_rtp *rtp, struct ast_frame *frame, struct ast_sockaddr *remote_address)
5514{
5515 struct ast_rtp_rtcp_feedback *feedback = frame->data.ptr;
5516 unsigned char *rtcpheader;
5517 unsigned char bdata[1024];
5518 int remb_len = 24;
5519 int ice;
5520 int res;
5521 int sr = 0;
5522 int packet_len = 0;
5523 RAII_VAR(struct ast_rtp_rtcp_report *, rtcp_report, NULL, ao2_cleanup);
5524
5525 if (feedback->fmt != AST_RTP_RTCP_FMT_REMB) {
5526 ast_debug_rtcp(1, "(%p) RTCP provided feedback frame of format %d to write, but only REMB is supported\n",
5527 instance, feedback->fmt);
5528 return;
5529 }
5530
5531 if (!rtp || !rtp->rtcp) {
5532 return;
5533 }
5534
5535 /* If REMB support is not enabled don't send this RTCP packet */
5537 ast_debug_rtcp(1, "(%p) RTCP provided feedback REMB report to write, but REMB support not enabled\n",
5538 instance);
5539 return;
5540 }
5541
5542 if (ast_sockaddr_isnull(&rtp->rtcp->them) || rtp->rtcp->schedid < 0) {
5543 /*
5544 * RTCP was stopped.
5545 */
5546 return;
5547 }
5548
5549 rtcpheader = bdata;
5550
5551 ao2_lock(instance);
5552 rtcp_report = ast_rtp_rtcp_report_alloc(rtp->themssrc_valid ? 1 : 0);
5553 res = ast_rtcp_generate_compound_prefix(instance, rtcpheader, rtcp_report, &sr);
5554
5555 if (res == 0 || res == 1) {
5556 ao2_unlock(instance);
5557 return;
5558 }
5559
5560 packet_len += res;
5561
5562 put_unaligned_uint32(rtcpheader + packet_len + 0, htonl((2 << 30) | (AST_RTP_RTCP_FMT_REMB << 24) | (RTCP_PT_PSFB << 16) | ((remb_len/4)-1)));
5563 put_unaligned_uint32(rtcpheader + packet_len + 4, htonl(rtp->ssrc));
5564 put_unaligned_uint32(rtcpheader + packet_len + 8, htonl(0)); /* Per the draft, this should always be 0 */
5565 put_unaligned_uint32(rtcpheader + packet_len + 12, htonl(('R' << 24) | ('E' << 16) | ('M' << 8) | ('B'))); /* Unique identifier 'R' 'E' 'M' 'B' */
5566 put_unaligned_uint32(rtcpheader + packet_len + 16, htonl((1 << 24) | (feedback->remb.br_exp << 18) | (feedback->remb.br_mantissa))); /* Number of SSRCs / BR Exp / BR Mantissa */
5567 put_unaligned_uint32(rtcpheader + packet_len + 20, htonl(rtp->ssrc)); /* The SSRC this feedback message applies to */
5568 res = rtcp_sendto(instance, (unsigned int *)rtcpheader, packet_len + remb_len, 0, rtp->bundled ? remote_address : &rtp->rtcp->them, &ice);
5569 if (res < 0) {
5570 ast_log(LOG_ERROR, "RTCP PSFB transmission error: %s\n", strerror(errno));
5571 } else {
5572 ast_rtcp_calculate_sr_rr_statistics(instance, rtcp_report, rtp->bundled ? *remote_address : rtp->rtcp->them, ice, sr);
5573 }
5574
5575 ao2_unlock(instance);
5576}
5577
5578/*! \pre instance is locked */
5579static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame)
5580{
5581 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
5582 struct ast_sockaddr remote_address = { {0,} };
5583 struct ast_format *format;
5584 int codec;
5585
5586 ast_rtp_instance_get_remote_address(instance, &remote_address);
5587
5588 /* If we don't actually know the remote address don't even bother doing anything */
5589 if (ast_sockaddr_isnull(&remote_address)) {
5590 ast_debug_rtp(1, "(%p) RTP no remote address on instance, so dropping frame\n", instance);
5591 return 0;
5592 }
5593
5594 /* VP8: is this a request to send a RTCP FIR? */
5596 rtp_write_rtcp_fir(instance, rtp, &remote_address);
5597 return 0;
5598 } else if (frame->frametype == AST_FRAME_RTCP) {
5599 if (frame->subclass.integer == AST_RTP_RTCP_PSFB) {
5600 rtp_write_rtcp_psfb(instance, rtp, frame, &remote_address);
5601 }
5602 return 0;
5603 }
5604
5605 /* If there is no data length we can't very well send the packet */
5606 if (!frame->datalen) {
5607 ast_debug_rtp(1, "(%p) RTP received frame with no data for instance, so dropping frame\n", instance);
5608 return 0;
5609 }
5610
5611 /* If the packet is not one our RTP stack supports bail out */
5612 if (frame->frametype != AST_FRAME_VOICE && frame->frametype != AST_FRAME_VIDEO && frame->frametype != AST_FRAME_TEXT) {
5613 ast_log(LOG_WARNING, "RTP can only send voice, video, and text\n");
5614 return -1;
5615 }
5616
5617 if (rtp->red) {
5618 /* return 0; */
5619 /* no primary data or generations to send */
5620 if ((frame = red_t140_to_red(rtp->red)) == NULL)
5621 return 0;
5622 }
5623
5624 /* Grab the subclass and look up the payload we are going to use */
5626 1, frame->subclass.format, 0);
5627 if (codec < 0) {
5628 ast_log(LOG_WARNING, "Don't know how to send format %s packets with RTP\n",
5630 return -1;
5631 }
5632
5633 /* Note that we do not increase the ref count here as this pointer
5634 * will not be held by any thing explicitly. The format variable is
5635 * merely a convenience reference to frame->subclass.format */
5636 format = frame->subclass.format;
5638 /* Oh dear, if the format changed we will have to set up a new smoother */
5639 ast_debug_rtp(1, "(%s) RTP ooh, format changed from %s to %s\n",
5643 ao2_replace(rtp->lasttxformat, format);
5644 if (rtp->smoother) {
5646 rtp->smoother = NULL;
5647 }
5648 }
5649
5650 /* If no smoother is present see if we have to set one up */
5651 if (!rtp->smoother && ast_format_can_be_smoothed(format)) {
5652 unsigned int smoother_flags = ast_format_get_smoother_flags(format);
5653 unsigned int framing_ms = ast_rtp_codecs_get_framing(ast_rtp_instance_get_codecs(instance));
5654
5655 if (!framing_ms && (smoother_flags & AST_SMOOTHER_FLAG_FORCED)) {
5656 framing_ms = ast_format_get_default_ms(format);
5657 }
5658
5659 if (framing_ms) {
5661 if (!rtp->smoother) {
5662 ast_log(LOG_WARNING, "Unable to create smoother: format %s ms: %u len: %u\n",
5663 ast_format_get_name(format), framing_ms, ast_format_get_minimum_bytes(format));
5664 return -1;
5665 }
5666 ast_smoother_set_flags(rtp->smoother, smoother_flags);
5667 }
5668 }
5669
5670 /* Feed audio frames into the actual function that will create a frame and send it */
5671 if (rtp->smoother) {
5672 struct ast_frame *f;
5673
5675 ast_smoother_feed_be(rtp->smoother, frame);
5676 } else {
5677 ast_smoother_feed(rtp->smoother, frame);
5678 }
5679
5680 while ((f = ast_smoother_read(rtp->smoother)) && (f->data.ptr)) {
5681 rtp_raw_write(instance, f, codec);
5682 }
5683 } else {
5684 int hdrlen = 12;
5685 struct ast_frame *f = NULL;
5686
5687 if (frame->offset < hdrlen) {
5688 f = ast_frdup(frame);
5689 } else {
5690 f = frame;
5691 }
5692 if (f->data.ptr) {
5693 rtp_raw_write(instance, f, codec);
5694 }
5695 if (f != frame) {
5696 ast_frfree(f);
5697 }
5698
5699 }
5700
5701 return 0;
5702}
5703
5704static void calc_rxstamp_and_jitter(struct timeval *tv,
5705 struct ast_rtp *rtp, unsigned int rx_rtp_ts,
5706 int mark)
5707{
5708 int rate = ast_rtp_get_rate(rtp->f.subclass.format);
5709
5710 double jitter = 0.0;
5711 double prev_jitter = 0.0;
5712 struct timeval now;
5713 struct timeval tmp;
5714 double rxnow;
5715 double arrival_sec;
5716 unsigned int arrival;
5717 int transit;
5718 int d;
5719
5720 gettimeofday(&now,NULL);
5721
5722 if (rtp->rxcount == 1 || mark) {
5723 rtp->rxstart = ast_tv2double(&now);
5724 rtp->remote_seed_rx_rtp_ts = rx_rtp_ts;
5725
5726 /*
5727 * "tv" is placed in the received frame's
5728 * "delivered" field and when this frame is
5729 * sent out again on the other side, it's
5730 * used to calculate the timestamp on the
5731 * outgoing RTP packets.
5732 *
5733 * NOTE: We need to do integer math here
5734 * because double math rounding issues can
5735 * generate incorrect timestamps.
5736 */
5737 rtp->rxcore = now;
5738 tmp = ast_samp2tv(rx_rtp_ts, rate);
5739 rtp->rxcore = ast_tvsub(rtp->rxcore, tmp);
5740 rtp->rxcore.tv_usec -= rtp->rxcore.tv_usec % 100;
5741 *tv = ast_tvadd(rtp->rxcore, tmp);
5742
5743 ast_debug_rtcp(3, "%s: "
5744 "Seed ts: %u current time: %f\n",
5746 , rx_rtp_ts
5747 , rtp->rxstart
5748 );
5749
5750 return;
5751 }
5752
5753 tmp = ast_samp2tv(rx_rtp_ts, rate);
5754 /* See the comment about "tv" above. Even if
5755 * we don't use this received packet for jitter
5756 * calculations, we still need to set tv so the
5757 * timestamp will be correct when this packet is
5758 * sent out again.
5759 */
5760 *tv = ast_tvadd(rtp->rxcore, tmp);
5761
5762 /*
5763 * The first few packets are generally unstable so let's
5764 * not use them in the calculations.
5765 */
5767 ast_debug_rtcp(3, "%s: Packet %d < %d. Ignoring\n",
5769 , rtp->rxcount
5771 );
5772
5773 return;
5774 }
5775
5776 /*
5777 * First good packet. Capture the start time and timestamp
5778 * but don't actually use this packet for calculation.
5779 */
5781 rtp->rxstart_stable = ast_tv2double(&now);
5782 rtp->remote_seed_rx_rtp_ts_stable = rx_rtp_ts;
5783 rtp->last_transit_time_samples = -rx_rtp_ts;
5784
5785 ast_debug_rtcp(3, "%s: "
5786 "pkt: %5u Stable Seed ts: %u current time: %f\n",
5788 , rtp->rxcount
5789 , rx_rtp_ts
5790 , rtp->rxstart_stable
5791 );
5792
5793 return;
5794 }
5795
5796 /*
5797 * If the current packet isn't in sequence, don't
5798 * use it in any calculations as remote_current_rx_rtp_ts
5799 * is not going to be correct.
5800 */
5801 if (rtp->lastrxseqno != rtp->prevrxseqno + 1) {
5802 ast_debug_rtcp(3, "%s: Current packet seq %d != last packet seq %d + 1. Ignoring\n",
5804 , rtp->lastrxseqno
5805 , rtp->prevrxseqno
5806 );
5807
5808 return;
5809 }
5810
5811 /*
5812 * The following calculations are taken from
5813 * https://www.rfc-editor.org/rfc/rfc3550#appendix-A.8
5814 *
5815 * The received rtp timestamp is the random "seed"
5816 * timestamp chosen by the sender when they sent the
5817 * first packet, plus the number of samples since then.
5818 *
5819 * To get our arrival time in the same units, we
5820 * calculate the time difference in seconds between
5821 * when we received the first packet and when we
5822 * received this packet and convert that to samples.
5823 */
5824 rxnow = ast_tv2double(&now);
5825 arrival_sec = rxnow - rtp->rxstart_stable;
5826 arrival = ast_sec2samp(arrival_sec, rate);
5827
5828 /*
5829 * Now we can use the exact formula in
5830 * https://www.rfc-editor.org/rfc/rfc3550#appendix-A.8 :
5831 *
5832 * int transit = arrival - r->ts;
5833 * int d = transit - s->transit;
5834 * s->transit = transit;
5835 * if (d < 0) d = -d;
5836 * s->jitter += (1./16.) * ((double)d - s->jitter);
5837 *
5838 * Our rx_rtp_ts is their r->ts.
5839 * Our rtp->last_transit_time_samples is their s->transit.
5840 * Our rtp->rxjitter is their s->jitter.
5841 */
5842 transit = arrival - rx_rtp_ts;
5843 d = transit - rtp->last_transit_time_samples;
5844
5845 if (d < 0) {
5846 d = -d;
5847 }
5848
5849 prev_jitter = rtp->rxjitter_samples;
5850 jitter = (1.0/16.0) * (((double)d) - prev_jitter);
5851 rtp->rxjitter_samples = prev_jitter + jitter;
5852
5853 /*
5854 * We need to hang on to jitter in both samples and seconds.
5855 */
5856 rtp->rxjitter = ast_samp2sec(rtp->rxjitter_samples, rate);
5857
5858 ast_debug_rtcp(3, "%s: pkt: %5u "
5859 "Arrival sec: %7.3f Arrival ts: %10u RX ts: %10u "
5860 "Transit samp: %6d Last transit samp: %6d d: %4d "
5861 "Curr jitter: %7.0f(%7.3f) Prev Jitter: %7.0f(%7.3f) New Jitter: %7.0f(%7.3f)\n",
5863 , rtp->rxcount
5864 , arrival_sec
5865 , arrival
5866 , rx_rtp_ts
5867 , transit
5869 , d
5870 , jitter
5871 , ast_samp2sec(jitter, rate)
5872 , prev_jitter
5873 , ast_samp2sec(prev_jitter, rate)
5874 , rtp->rxjitter_samples
5875 , rtp->rxjitter
5876 );
5877
5878 rtp->last_transit_time_samples = transit;
5879
5880 /*
5881 * Update all the stats.
5882 */
5883 if (rtp->rtcp) {
5884 if (rtp->rxjitter > rtp->rtcp->maxrxjitter)
5885 rtp->rtcp->maxrxjitter = rtp->rxjitter;
5886 if (rtp->rtcp->rxjitter_count == 1)
5887 rtp->rtcp->minrxjitter = rtp->rxjitter;
5888 if (rtp->rtcp && rtp->rxjitter < rtp->rtcp->minrxjitter)
5889 rtp->rtcp->minrxjitter = rtp->rxjitter;
5890
5893 &rtp->rtcp->rxjitter_count);
5894 }
5895
5896 return;
5897}
5898
5899static struct ast_frame *create_dtmf_frame(struct ast_rtp_instance *instance, enum ast_frame_type type, int compensate)
5900{
5901 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
5902 struct ast_sockaddr remote_address = { {0,} };
5903
5904 ast_rtp_instance_get_remote_address(instance, &remote_address);
5905
5906 if (((compensate && type == AST_FRAME_DTMF_END) || (type == AST_FRAME_DTMF_BEGIN)) && ast_tvcmp(ast_tvnow(), rtp->dtmfmute) < 0) {
5907 ast_debug_rtp(1, "(%p) RTP ignore potential DTMF echo from '%s'\n",
5908 instance, ast_sockaddr_stringify(&remote_address));
5909 rtp->resp = 0;
5910 rtp->dtmfsamples = 0;
5911 return &ast_null_frame;
5912 } else if (type == AST_FRAME_DTMF_BEGIN && rtp->resp == 'X') {
5913 ast_debug_rtp(1, "(%p) RTP ignore flash begin from '%s'\n",
5914 instance, ast_sockaddr_stringify(&remote_address));
5915 rtp->resp = 0;
5916 rtp->dtmfsamples = 0;
5917 return &ast_null_frame;
5918 }
5919
5920 if (rtp->resp == 'X') {
5921 ast_debug_rtp(1, "(%p) RTP creating flash Frame at %s\n",
5922 instance, ast_sockaddr_stringify(&remote_address));
5925 } else {
5926 ast_debug_rtp(1, "(%p) RTP creating %s DTMF Frame: %d (%c), at %s\n",
5927 instance, type == AST_FRAME_DTMF_END ? "END" : "BEGIN",
5928 rtp->resp, rtp->resp,
5929 ast_sockaddr_stringify(&remote_address));
5930 rtp->f.frametype = type;
5931 rtp->f.subclass.integer = rtp->resp;
5932 }
5933 rtp->f.datalen = 0;
5934 rtp->f.samples = 0;
5935 rtp->f.mallocd = 0;
5936 rtp->f.src = "RTP";
5937 AST_LIST_NEXT(&rtp->f, frame_list) = NULL;
5938
5939 return &rtp->f;
5940}
5941
5942static void process_dtmf_rfc2833(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, int payloadtype, int mark, struct frame_list *frames)
5943{
5944 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
5945 struct ast_sockaddr remote_address = { {0,} };
5946 unsigned int event, event_end, samples;
5947 char resp = 0;
5948 struct ast_frame *f = NULL;
5949
5950 ast_rtp_instance_get_remote_address(instance, &remote_address);
5951
5952 /* Figure out event, event end, and samples */
5953 event = ntohl(*((unsigned int *)(data)));
5954 event >>= 24;
5955 event_end = ntohl(*((unsigned int *)(data)));
5956 event_end <<= 8;
5957 event_end >>= 24;
5958 samples = ntohl(*((unsigned int *)(data)));
5959 samples &= 0xFFFF;
5960
5961 if (rtp_debug_test_addr(&remote_address)) {
5962 ast_verbose("Got RTP RFC2833 from %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6d, mark %d, event %08x, end %d, duration %-5.5u) \n",
5963 ast_sockaddr_stringify(&remote_address),
5964 payloadtype, seqno, timestamp, len, (mark?1:0), event, ((event_end & 0x80)?1:0), samples);
5965 }
5966
5967 /* Print out debug if turned on */
5969 ast_debug(0, "- RTP 2833 Event: %08x (len = %d)\n", event, len);
5970
5971 /* Figure out what digit was pressed */
5972 if (event < 10) {
5973 resp = '0' + event;
5974 } else if (event < 11) {
5975 resp = '*';
5976 } else if (event < 12) {
5977 resp = '#';
5978 } else if (event < 16) {
5979 resp = 'A' + (event - 12);
5980 } else if (event < 17) { /* Event 16: Hook flash */
5981 resp = 'X';
5982 } else {
5983 /* Not a supported event */
5984 ast_debug_rtp(1, "(%p) RTP ignoring RTP 2833 Event: %08x. Not a DTMF Digit.\n", instance, event);
5985 return;
5986 }
5987
5989 if (!rtp->last_end_timestamp.is_set || rtp->last_end_timestamp.ts != timestamp || (rtp->resp && rtp->resp != resp)) {
5990 rtp->resp = resp;
5991 rtp->dtmf_timeout = 0;
5993 f->len = 0;
5994 rtp->last_end_timestamp.ts = timestamp;
5995 rtp->last_end_timestamp.is_set = 1;
5997 }
5998 } else {
5999 /* The duration parameter measures the complete
6000 duration of the event (from the beginning) - RFC2833.
6001 Account for the fact that duration is only 16 bits long
6002 (about 8 seconds at 8000 Hz) and can wrap is digit
6003 is hold for too long. */
6004 unsigned int new_duration = rtp->dtmf_duration;
6005 unsigned int last_duration = new_duration & 0xFFFF;
6006
6007 if (last_duration > 64000 && samples < last_duration) {
6008 new_duration += 0xFFFF + 1;
6009 }
6010 new_duration = (new_duration & ~0xFFFF) | samples;
6011
6012 if (event_end & 0x80) {
6013 /* End event */
6014 if (rtp->last_seqno != seqno && (!rtp->last_end_timestamp.is_set || timestamp > rtp->last_end_timestamp.ts)) {
6015 rtp->last_end_timestamp.ts = timestamp;
6016 rtp->last_end_timestamp.is_set = 1;
6017 rtp->dtmf_duration = new_duration;
6018 rtp->resp = resp;
6021 rtp->resp = 0;
6022 rtp->dtmf_duration = rtp->dtmf_timeout = 0;
6025 ast_debug_rtp(1, "(%p) RTP dropping duplicate or out of order DTMF END frame (seqno: %u, ts %u, digit %c)\n",
6026 instance, seqno, timestamp, resp);
6027 }
6028 } else {
6029 /* Begin/continuation */
6030
6031 /* The second portion of the seqno check is to not mistakenly
6032 * stop accepting DTMF if the seqno rolls over beyond
6033 * 65535.
6034 */
6035 if ((rtp->last_seqno > seqno && rtp->last_seqno - seqno < 50)
6036 || (rtp->last_end_timestamp.is_set
6037 && timestamp <= rtp->last_end_timestamp.ts)) {
6038 /* Out of order frame. Processing this can cause us to
6039 * improperly duplicate incoming DTMF, so just drop
6040 * this.
6041 */
6043 ast_debug(0, "Dropping out of order DTMF frame (seqno %u, ts %u, digit %c)\n",
6044 seqno, timestamp, resp);
6045 }
6046 return;
6047 }
6048
6049 if (rtp->resp && rtp->resp != resp) {
6050 /* Another digit already began. End it */
6053 rtp->resp = 0;
6054 rtp->dtmf_duration = rtp->dtmf_timeout = 0;
6056 }
6057
6058 if (rtp->resp) {
6059 /* Digit continues */
6060 rtp->dtmf_duration = new_duration;
6061 } else {
6062 /* New digit began */
6063 rtp->resp = resp;
6065 rtp->dtmf_duration = samples;
6067 }
6068
6069 rtp->dtmf_timeout = timestamp + rtp->dtmf_duration + dtmftimeout;
6070 }
6071
6072 rtp->last_seqno = seqno;
6073 }
6074
6075 rtp->dtmfsamples = samples;
6076
6077 return;
6078}
6079
6080static struct ast_frame *process_dtmf_cisco(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, int payloadtype, int mark)
6081{
6082 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
6083 unsigned int event, flags, power;
6084 char resp = 0;
6085 unsigned char seq;
6086 struct ast_frame *f = NULL;
6087
6088 if (len < 4) {
6089 return NULL;
6090 }
6091
6092 /* The format of Cisco RTP DTMF packet looks like next:
6093 +0 - sequence number of DTMF RTP packet (begins from 1,
6094 wrapped to 0)
6095 +1 - set of flags
6096 +1 (bit 0) - flaps by different DTMF digits delimited by audio
6097 or repeated digit without audio???
6098 +2 (+4,+6,...) - power level? (rises from 0 to 32 at begin of tone
6099 then falls to 0 at its end)
6100 +3 (+5,+7,...) - detected DTMF digit (0..9,*,#,A-D,...)
6101 Repeated DTMF information (bytes 4/5, 6/7) is history shifted right
6102 by each new packet and thus provides some redundancy.
6103
6104 Sample of Cisco RTP DTMF packet is (all data in hex):
6105 19 07 00 02 12 02 20 02
6106 showing end of DTMF digit '2'.
6107
6108 The packets
6109 27 07 00 02 0A 02 20 02
6110 28 06 20 02 00 02 0A 02
6111 shows begin of new digit '2' with very short pause (20 ms) after
6112 previous digit '2'. Bit +1.0 flips at begin of new digit.
6113
6114 Cisco RTP DTMF packets comes as replacement of audio RTP packets
6115 so its uses the same sequencing and timestamping rules as replaced
6116 audio packets. Repeat interval of DTMF packets is 20 ms and not rely
6117 on audio framing parameters. Marker bit isn't used within stream of
6118 DTMFs nor audio stream coming immediately after DTMF stream. Timestamps
6119 are not sequential at borders between DTMF and audio streams,
6120 */
6121
6122 seq = data[0];
6123 flags = data[1];
6124 power = data[2];
6125 event = data[3] & 0x1f;
6126
6128 ast_debug(0, "Cisco DTMF Digit: %02x (len=%d, seq=%d, flags=%02x, power=%u, history count=%d)\n", event, len, seq, flags, power, (len - 4) / 2);
6129 if (event < 10) {
6130 resp = '0' + event;
6131 } else if (event < 11) {
6132 resp = '*';
6133 } else if (event < 12) {
6134 resp = '#';
6135 } else if (event < 16) {
6136 resp = 'A' + (event - 12);
6137 } else if (event < 17) {
6138 resp = 'X';
6139 }
6140 if ((!rtp->resp && power) || (rtp->resp && (rtp->resp != resp))) {
6141 rtp->resp = resp;
6142 /* Why we should care on DTMF compensation at reception? */
6144 f = create_dtmf_frame(instance, AST_FRAME_DTMF_BEGIN, 0);
6145 rtp->dtmfsamples = 0;
6146 }
6147 } else if ((rtp->resp == resp) && !power) {
6149 f->samples = rtp->dtmfsamples * (ast_rtp_get_rate(rtp->lastrxformat) / 1000);
6150 rtp->resp = 0;
6151 } else if (rtp->resp == resp) {
6152 rtp->dtmfsamples += 20 * (ast_rtp_get_rate(rtp->lastrxformat) / 1000);
6153 }
6154
6155 rtp->dtmf_timeout = 0;
6156
6157 return f;
6158}
6159
6160static struct ast_frame *process_cn_rfc3389(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, int payloadtype, int mark)
6161{
6162 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
6163
6164 /* Convert comfort noise into audio with various codecs. Unfortunately this doesn't
6165 totally help us out because we don't have an engine to keep it going and we are not
6166 guaranteed to have it every 20ms or anything */
6168 ast_debug(0, "- RTP 3389 Comfort noise event: Format %s (len = %d)\n",
6170 }
6171
6172 if (!ast_test_flag(rtp, FLAG_3389_WARNING)) {
6173 struct ast_sockaddr remote_address = { {0,} };
6174
6175 ast_rtp_instance_get_remote_address(instance, &remote_address);
6176
6177 ast_log(LOG_NOTICE, "Comfort noise support incomplete in Asterisk (RFC 3389). Please turn off on client if possible. Client address: %s\n",
6178 ast_sockaddr_stringify(&remote_address));
6180 }
6181
6182 /* Must have at least one byte */
6183 if (!len) {
6184 return NULL;
6185 }
6186 if (len < 24) {
6187 rtp->f.data.ptr = rtp->rawdata + AST_FRIENDLY_OFFSET;
6188 rtp->f.datalen = len - 1;
6190 memcpy(rtp->f.data.ptr, data + 1, len - 1);
6191 } else {
6192 rtp->f.data.ptr = NULL;
6193 rtp->f.offset = 0;
6194 rtp->f.datalen = 0;
6195 }
6196 rtp->f.frametype = AST_FRAME_CNG;
6197 rtp->f.subclass.integer = data[0] & 0x7f;
6198 rtp->f.samples = 0;
6199 rtp->f.delivery.tv_usec = rtp->f.delivery.tv_sec = 0;
6200
6201 return &rtp->f;
6202}
6203
6204static int update_rtt_stats(struct ast_rtp *rtp, unsigned int lsr, unsigned int dlsr)
6205{
6206 struct timeval now;
6207 struct timeval rtt_tv;
6208 unsigned int msw;
6209 unsigned int lsw;
6210 unsigned int rtt_msw;
6211 unsigned int rtt_lsw;
6212 unsigned int lsr_a;
6213 unsigned int rtt;
6214
6215 gettimeofday(&now, NULL);
6216 timeval2ntp(now, &msw, &lsw);
6217
6218 lsr_a = ((msw & 0x0000ffff) << 16) | ((lsw & 0xffff0000) >> 16);
6219 rtt = lsr_a - lsr - dlsr;
6220 rtt_msw = (rtt & 0xffff0000) >> 16;
6221 rtt_lsw = (rtt & 0x0000ffff);
6222 rtt_tv.tv_sec = rtt_msw;
6223 /*
6224 * Convert 16.16 fixed point rtt_lsw to usec without
6225 * overflow.
6226 *
6227 * = rtt_lsw * 10^6 / 2^16
6228 * = rtt_lsw * (2^6 * 5^6) / 2^16
6229 * = rtt_lsw * 5^6 / 2^10
6230 *
6231 * The rtt_lsw value is in 16.16 fixed point format and 5^6
6232 * requires 14 bits to represent. We have enough space to
6233 * directly do the conversion because there is no integer
6234 * component in rtt_lsw.
6235 */
6236 rtt_tv.tv_usec = (rtt_lsw * 15625) >> 10;
6237 rtp->rtcp->rtt = (double)rtt_tv.tv_sec + ((double)rtt_tv.tv_usec / 1000000);
6238 if (lsr_a - dlsr < lsr) {
6239 return 1;
6240 }
6241
6242 rtp->rtcp->accumulated_transit += rtp->rtcp->rtt;
6243 if (rtp->rtcp->rtt_count == 0 || rtp->rtcp->minrtt > rtp->rtcp->rtt) {
6244 rtp->rtcp->minrtt = rtp->rtcp->rtt;
6245 }
6246 if (rtp->rtcp->maxrtt < rtp->rtcp->rtt) {
6247 rtp->rtcp->maxrtt = rtp->rtcp->rtt;
6248 }
6249
6251 &rtp->rtcp->stdevrtt, &rtp->rtcp->rtt_count);
6252
6253 return 0;
6254}
6255
6256/*!
6257 * \internal
6258 * \brief Update RTCP interarrival jitter stats
6259 */
6260static void update_jitter_stats(struct ast_rtp *rtp, unsigned int ia_jitter)
6261{
6262 int rate = ast_rtp_get_rate(rtp->f.subclass.format);
6263
6264 rtp->rtcp->reported_jitter = ast_samp2sec(ia_jitter, rate);
6265
6266 if (rtp->rtcp->reported_jitter_count == 0) {
6268 }
6269 if (rtp->rtcp->reported_jitter < rtp->rtcp->reported_minjitter) {
6271 }
6272 if (rtp->rtcp->reported_jitter > rtp->rtcp->reported_maxjitter) {
6274 }
6275
6279}
6280
6281/*!
6282 * \internal
6283 * \brief Update RTCP lost packet stats
6284 */
6285static void update_lost_stats(struct ast_rtp *rtp, unsigned int lost_packets)
6286{
6287 double reported_lost;
6288
6289 rtp->rtcp->reported_lost = lost_packets;
6290 reported_lost = (double)rtp->rtcp->reported_lost;
6291 if (rtp->rtcp->reported_lost_count == 0) {
6292 rtp->rtcp->reported_minlost = reported_lost;
6293 }
6294 if (reported_lost < rtp->rtcp->reported_minlost) {
6295 rtp->rtcp->reported_minlost = reported_lost;
6296 }
6297 if (reported_lost > rtp->rtcp->reported_maxlost) {
6298 rtp->rtcp->reported_maxlost = reported_lost;
6299 }
6300
6303}
6304
6305#define RESCALE(in, inmin, inmax, outmin, outmax) ((((in - inmin)/(inmax-inmin))*(outmax-outmin))+outmin)
6306/*!
6307 * \brief Calculate a "media experience score" based on given data
6308 *
6309 * Technically, a mean opinion score (MOS) cannot be calculated without the involvement
6310 * of human eyes (video) and ears (audio). Thus instead we'll approximate an opinion
6311 * using the given parameters, and call it a media experience score.
6312 *
6313 * The tallied score is based upon recommendations and formulas from ITU-T G.107,
6314 * ITU-T G.109, ITU-T G.113, and other various internet sources.
6315 *
6316 * \param instance RTP instance
6317 * \param normdevrtt The average round trip time
6318 * \param normdev_rxjitter The smoothed jitter
6319 * \param stdev_rxjitter The jitter standard deviation value
6320 * \param normdev_rxlost The average number of packets lost since last check
6321 *
6322 * \return A media experience score.
6323 *
6324 * \note The calculations in this function could probably be simplified
6325 * but calculating a MOS using the information available publicly,
6326 * then re-scaling it to 0.0 -> 100.0 makes the process clearer and
6327 * easier to troubleshoot or change.
6328 */
6329static double calc_media_experience_score(struct ast_rtp_instance *instance,
6330 double normdevrtt, double normdev_rxjitter, double stdev_rxjitter,
6331 double normdev_rxlost)
6332{
6333 double r_value;
6334 double pseudo_mos;
6335 double mes = 0;
6336
6337 /*
6338 * While the media itself might be okay, a significant enough delay could make
6339 * for an unpleasant user experience.
6340 *
6341 * Calculate the effective latency by using the given round trip time, and adding
6342 * jitter scaled according to its standard deviation. The scaling is done in order
6343 * to increase jitter's weight since a higher deviation can result in poorer overall
6344 * quality.
6345 */
6346 double effective_latency = (normdevrtt * 1000)
6347 + ((normdev_rxjitter * 2) * (stdev_rxjitter / 3))
6348 + 10;
6349
6350 /*
6351 * Using the defaults for the standard transmission rating factor ("R" value)
6352 * one arrives at 93.2 (see ITU-T G.107 for more details), so we'll use that
6353 * as the starting value and subtract deficiencies that could affect quality.
6354 *
6355 * Calculate the impact of the effective latency. Influence increases with
6356 * values over 160 as the significant "lag" can degrade user experience.
6357 */
6358 if (effective_latency < 160) {
6359 r_value = 93.2 - (effective_latency / 40);
6360 } else {
6361 r_value = 93.2 - (effective_latency - 120) / 10;
6362 }
6363
6364 /* Next evaluate the impact of lost packets */
6365 r_value = r_value - (normdev_rxlost * 2.0);
6366
6367 /*
6368 * Finally convert the "R" value into a opinion/quality score between 1 (really anything
6369 * below 3 should be considered poor) and 4.5 (the highest achievable for VOIP).
6370 */
6371 if (r_value < 0) {
6372 pseudo_mos = 1.0;
6373 } else if (r_value > 100) {
6374 pseudo_mos = 4.5;
6375 } else {
6376 pseudo_mos = 1 + (0.035 * r_value) + (r_value * (r_value - 60) * (100 - r_value) * 0.000007);
6377 }
6378
6379 /*
6380 * We're going to rescale the 0.0->5.0 pseudo_mos to the 0.0->100.0 MES.
6381 * For those ranges, we could actually just multiply the pseudo_mos
6382 * by 20 but we may want to change the scale later.
6383 */
6384 mes = RESCALE(pseudo_mos, 0.0, 5.0, 0.0, 100.0);
6385
6386 return mes;
6387}
6388
6389/*!
6390 * \internal
6391 * \brief Update MES stats based on info received in an SR or RR.
6392 * This is RTP we sent and they received.
6393 */
6394static void update_reported_mes_stats(struct ast_rtp *rtp)
6395{
6396 double mes = calc_media_experience_score(rtp->owner,
6397 rtp->rtcp->normdevrtt,
6398 rtp->rtcp->reported_jitter,
6401
6402 rtp->rtcp->reported_mes = mes;
6403 if (rtp->rtcp->reported_mes_count == 0) {
6404 rtp->rtcp->reported_minmes = mes;
6405 }
6406 if (mes < rtp->rtcp->reported_minmes) {
6407 rtp->rtcp->reported_minmes = mes;
6408 }
6409 if (mes > rtp->rtcp->reported_maxmes) {
6410 rtp->rtcp->reported_maxmes = mes;
6411 }
6412
6415
6416 ast_debug_rtcp(2, "%s: rtt: %.9f j: %.9f sjh: %.9f lost: %.9f mes: %4.1f\n",
6418 rtp->rtcp->normdevrtt,
6419 rtp->rtcp->reported_jitter,
6421 rtp->rtcp->reported_normdev_lost, mes);
6422}
6423
6424/*!
6425 * \internal
6426 * \brief Update MES stats based on info we will send in an SR or RR.
6427 * This is RTP they sent and we received.
6428 */
6429static void update_local_mes_stats(struct ast_rtp *rtp)
6430{
6432 rtp->rtcp->normdevrtt,
6433 rtp->rxjitter,
6434 rtp->rtcp->stdev_rxjitter,
6435 rtp->rtcp->normdev_rxlost);
6436
6437 if (rtp->rtcp->rxmes_count == 0) {
6438 rtp->rtcp->minrxmes = rtp->rxmes;
6439 }
6440 if (rtp->rxmes < rtp->rtcp->minrxmes) {
6441 rtp->rtcp->minrxmes = rtp->rxmes;
6442 }
6443 if (rtp->rxmes > rtp->rtcp->maxrxmes) {
6444 rtp->rtcp->maxrxmes = rtp->rxmes;
6445 }
6446
6448 &rtp->rtcp->stdev_rxmes, &rtp->rtcp->rxmes_count);
6449
6450 ast_debug_rtcp(2, " %s: rtt: %.9f j: %.9f sjh: %.9f lost: %.9f mes: %4.1f\n",
6452 rtp->rtcp->normdevrtt,
6453 rtp->rxjitter,
6454 rtp->rtcp->stdev_rxjitter,
6455 rtp->rtcp->normdev_rxlost, rtp->rxmes);
6456}
6457
6458/*! \pre instance is locked */
6460 struct ast_rtp *rtp, unsigned int ssrc, int source)
6461{
6462 int index;
6463
6464 if (!AST_VECTOR_SIZE(&rtp->ssrc_mapping)) {
6465 /* This instance is not bundled */
6466 return instance;
6467 }
6468
6469 /* Find the bundled child instance */
6470 for (index = 0; index < AST_VECTOR_SIZE(&rtp->ssrc_mapping); ++index) {
6471 struct rtp_ssrc_mapping *mapping = AST_VECTOR_GET_ADDR(&rtp->ssrc_mapping, index);
6472 unsigned int mapping_ssrc = source ? ast_rtp_get_ssrc(mapping->instance) : mapping->ssrc;
6473
6474 if (mapping->ssrc_valid && mapping_ssrc == ssrc) {
6475 return mapping->instance;
6476 }
6477 }
6478
6479 /* Does the SSRC match the bundled parent? */
6480 if (rtp->themssrc_valid && rtp->themssrc == ssrc) {
6481 return instance;
6482 }
6483 return NULL;
6484}
6485
6486/*! \pre instance is locked */
6488 struct ast_rtp *rtp, unsigned int ssrc)
6489{
6490 return __rtp_find_instance_by_ssrc(instance, rtp, ssrc, 0);
6491}
6492
6493/*! \pre instance is locked */
6495 struct ast_rtp *rtp, unsigned int ssrc)
6496{
6497 return __rtp_find_instance_by_ssrc(instance, rtp, ssrc, 1);
6498}
6499
6500static const char *rtcp_payload_type2str(unsigned int pt)
6501{
6502 const char *str;
6503
6504 switch (pt) {
6505 case RTCP_PT_SR:
6506 str = "Sender Report";
6507 break;
6508 case RTCP_PT_RR:
6509 str = "Receiver Report";
6510 break;
6511 case RTCP_PT_FUR:
6512 /* Full INTRA-frame Request / Fast Update Request */
6513 str = "H.261 FUR";
6514 break;
6515 case RTCP_PT_PSFB:
6516 /* Payload Specific Feed Back */
6517 str = "PSFB";
6518 break;
6519 case RTCP_PT_SDES:
6520 str = "Source Description";
6521 break;
6522 case RTCP_PT_BYE:
6523 str = "BYE";
6524 break;
6525 default:
6526 str = "Unknown";
6527 break;
6528 }
6529 return str;
6530}
6531
6532static const char *rtcp_payload_subtype2str(unsigned int pt, unsigned int subtype)
6533{
6534 switch (pt) {
6535 case AST_RTP_RTCP_RTPFB:
6536 if (subtype == AST_RTP_RTCP_FMT_NACK) {
6537 return "NACK";
6538 }
6539 break;
6540 case RTCP_PT_PSFB:
6541 if (subtype == AST_RTP_RTCP_FMT_REMB) {
6542 return "REMB";
6543 }
6544 break;
6545 default:
6546 break;
6547 }
6548
6549 return NULL;
6550}
6551
6552/*! \pre instance is locked */
6553static int ast_rtp_rtcp_handle_nack(struct ast_rtp_instance *instance, unsigned int *nackdata, unsigned int position,
6554 unsigned int length)
6555{
6556 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
6557 int res = 0;
6558 int blp_index;
6559 int packet_index;
6560 int ice;
6561 struct ast_rtp_rtcp_nack_payload *payload;
6562 unsigned int current_word;
6563 unsigned int pid; /* Packet ID which refers to seqno of lost packet */
6564 unsigned int blp; /* Bitmask of following lost packets */
6565 struct ast_sockaddr remote_address = { {0,} };
6566 int abs_send_time_id;
6567 unsigned int now_msw = 0;
6568 unsigned int now_lsw = 0;
6569 unsigned int packets_not_found = 0;
6570
6571 if (!rtp->send_buffer) {
6572 ast_debug_rtcp(1, "(%p) RTCP tried to handle NACK request, "
6573 "but we don't have a RTP packet storage!\n", instance);
6574 return res;
6575 }
6576
6578 if (abs_send_time_id != -1) {
6579 timeval2ntp(ast_tvnow(), &now_msw, &now_lsw);
6580 }
6581
6582 ast_rtp_instance_get_remote_address(instance, &remote_address);
6583
6584 /*
6585 * We use index 3 because with feedback messages, the FCI (Feedback Control Information)
6586 * does not begin until after the version, packet SSRC, and media SSRC words.
6587 */
6588 for (packet_index = 3; packet_index < length; packet_index++) {
6589 current_word = ntohl(nackdata[position + packet_index]);
6590 pid = current_word >> 16;
6591 /* We know the remote end is missing this packet. Go ahead and send it if we still have it. */
6592 payload = (struct ast_rtp_rtcp_nack_payload *)ast_data_buffer_get(rtp->send_buffer, pid);
6593 if (payload) {
6594 if (abs_send_time_id != -1) {
6595 /* On retransmission we need to update the timestamp within the packet, as it
6596 * is supposed to contain when the packet was actually sent.
6597 */
6598 put_unaligned_time24(payload->buf + 17, now_msw, now_lsw);
6599 }
6600 res += rtp_sendto(instance, payload->buf, payload->size, 0, &remote_address, &ice);
6601 } else {
6602 ast_debug_rtcp(1, "(%p) RTCP received NACK request for RTP packet with seqno %d, "
6603 "but we don't have it\n", instance, pid);
6604 packets_not_found++;
6605 }
6606 /*
6607 * The bitmask. Denoting the least significant bit as 1 and its most significant bit
6608 * as 16, then bit i of the bitmask is set to 1 if the receiver has not received RTP
6609 * packet (pid+i)(modulo 2^16). Otherwise, it is set to 0. We cannot assume bits set
6610 * to 0 after a bit set to 1 have actually been received.
6611 */
6612 blp = current_word & 0xffff;
6613 blp_index = 1;
6614 while (blp) {
6615 if (blp & 1) {
6616 /* Packet (pid + i)(modulo 2^16) is missing too. */
6617 unsigned int seqno = (pid + blp_index) % 65536;
6618 payload = (struct ast_rtp_rtcp_nack_payload *)ast_data_buffer_get(rtp->send_buffer, seqno);
6619 if (payload) {
6620 if (abs_send_time_id != -1) {
6621 put_unaligned_time24(payload->buf + 17, now_msw, now_lsw);
6622 }
6623 res += rtp_sendto(instance, payload->buf, payload->size, 0, &remote_address, &ice);
6624 } else {
6625 ast_debug_rtcp(1, "(%p) RTCP remote end also requested RTP packet with seqno %d, "
6626 "but we don't have it\n", instance, seqno);
6627 packets_not_found++;
6628 }
6629 }
6630 blp >>= 1;
6631 blp_index++;
6632 }
6633 }
6634
6635 if (packets_not_found) {
6636 /* Grow the send buffer based on how many packets were not found in the buffer, but
6637 * enforce a maximum.
6638 */
6640 ast_data_buffer_max(rtp->send_buffer) + packets_not_found));
6641 ast_debug_rtcp(2, "(%p) RTCP send buffer on RTP instance is now at maximum of %zu\n",
6642 instance, ast_data_buffer_max(rtp->send_buffer));
6643 }
6644
6645 return res;
6646}
6647
6648/*
6649 * Unshifted RTCP header bit field masks
6650 */
6651#define RTCP_LENGTH_MASK 0xFFFF
6652#define RTCP_PAYLOAD_TYPE_MASK 0xFF
6653#define RTCP_REPORT_COUNT_MASK 0x1F
6654#define RTCP_PADDING_MASK 0x01
6655#define RTCP_VERSION_MASK 0x03
6656
6657/*
6658 * RTCP header bit field shift offsets
6659 */
6660#define RTCP_LENGTH_SHIFT 0
6661#define RTCP_PAYLOAD_TYPE_SHIFT 16
6662#define RTCP_REPORT_COUNT_SHIFT 24
6663#define RTCP_PADDING_SHIFT 29
6664#define RTCP_VERSION_SHIFT 30
6665
6666#define RTCP_VERSION 2U
6667#define RTCP_VERSION_SHIFTED (RTCP_VERSION << RTCP_VERSION_SHIFT)
6668#define RTCP_VERSION_MASK_SHIFTED (RTCP_VERSION_MASK << RTCP_VERSION_SHIFT)
6669
6670/*
6671 * RTCP first packet record validity header mask and value.
6672 *
6673 * RFC3550 intentionally defines the encoding of RTCP_PT_SR and RTCP_PT_RR
6674 * such that they differ in the least significant bit. Either of these two
6675 * payload types MUST be the first RTCP packet record in a compound packet.
6676 *
6677 * RFC3550 checks the padding bit in the algorithm they use to check the
6678 * RTCP packet for validity. However, we aren't masking the padding bit
6679 * to check since we don't know if it is a compound RTCP packet or not.
6680 */
6681#define RTCP_VALID_MASK (RTCP_VERSION_MASK_SHIFTED | (((RTCP_PAYLOAD_TYPE_MASK & ~0x1)) << RTCP_PAYLOAD_TYPE_SHIFT))
6682#define RTCP_VALID_VALUE (RTCP_VERSION_SHIFTED | (RTCP_PT_SR << RTCP_PAYLOAD_TYPE_SHIFT))
6683
6684#define RTCP_SR_BLOCK_WORD_LENGTH 5
6685#define RTCP_RR_BLOCK_WORD_LENGTH 6
6686#define RTCP_HEADER_SSRC_LENGTH 2
6687#define RTCP_FB_REMB_BLOCK_WORD_LENGTH 4
6688#define RTCP_FB_NACK_BLOCK_WORD_LENGTH 2
6689
6690static struct ast_frame *ast_rtcp_interpret(struct ast_rtp_instance *instance, struct ast_srtp *srtp,
6691 const unsigned char *rtcpdata, size_t size, struct ast_sockaddr *addr)
6692{
6693 struct ast_rtp_instance *transport = instance;
6694 struct ast_rtp *transport_rtp = ast_rtp_instance_get_data(instance);
6695 int len = size;
6696 unsigned int *rtcpheader = (unsigned int *)(rtcpdata);
6697 unsigned int packetwords;
6698 unsigned int position;
6699 unsigned int first_word;
6700 /*! True if we have seen an acceptable SSRC to learn the remote RTCP address */
6701 unsigned int ssrc_seen;
6702 struct ast_rtp_rtcp_report_block *report_block;
6703 struct ast_frame *f = &ast_null_frame;
6704#ifdef TEST_FRAMEWORK
6705 struct ast_rtp_engine_test *test_engine;
6706#endif
6707
6708 /* If this is encrypted then decrypt the payload */
6709 if ((*rtcpheader & 0xC0) && res_srtp && srtp && res_srtp->unprotect(
6710 srtp, rtcpheader, &len, 1 | (srtp_replay_protection << 1)) < 0) {
6711 return &ast_null_frame;
6712 }
6713
6714 packetwords = len / 4;
6715
6716 ast_debug_rtcp(2, "(%s) RTCP got report of %d bytes from %s\n",
6719
6720 /*
6721 * Validate the RTCP packet according to an adapted and slightly
6722 * modified RFC3550 validation algorithm.
6723 */
6724 if (packetwords < RTCP_HEADER_SSRC_LENGTH) {
6725 ast_debug_rtcp(2, "(%s) RTCP %p -- from %s: Frame size (%u words) is too short\n",
6727 transport_rtp, ast_sockaddr_stringify(addr), packetwords);
6728 return &ast_null_frame;
6729 }
6730 position = 0;
6731 first_word = ntohl(rtcpheader[position]);
6732 if ((first_word & RTCP_VALID_MASK) != RTCP_VALID_VALUE) {
6733 ast_debug_rtcp(2, "(%s) RTCP %p -- from %s: Failed first packet validity check\n",
6735 transport_rtp, ast_sockaddr_stringify(addr));
6736 return &ast_null_frame;
6737 }
6738 do {
6739 position += ((first_word >> RTCP_LENGTH_SHIFT) & RTCP_LENGTH_MASK) + 1;
6740 if (packetwords <= position) {
6741 break;
6742 }
6743 first_word = ntohl(rtcpheader[position]);
6744 } while ((first_word & RTCP_VERSION_MASK_SHIFTED) == RTCP_VERSION_SHIFTED);
6745 if (position != packetwords) {
6746 ast_debug_rtcp(2, "(%s) RTCP %p -- from %s: Failed packet version or length check\n",
6748 transport_rtp, ast_sockaddr_stringify(addr));
6749 return &ast_null_frame;
6750 }
6751
6752 /*
6753 * Note: RFC3605 points out that true NAT (vs NAPT) can cause RTCP
6754 * to have a different IP address and port than RTP. Otherwise, when
6755 * strictrtp is enabled we could reject RTCP packets not coming from
6756 * the learned RTP IP address if it is available.
6757 */
6758
6759 /*
6760 * strictrtp safety needs SSRC to match before we use the
6761 * sender's address for symmetrical RTP to send our RTCP
6762 * reports.
6763 *
6764 * If strictrtp is not enabled then claim to have already seen
6765 * a matching SSRC so we'll accept this packet's address for
6766 * symmetrical RTP.
6767 */
6768 ssrc_seen = transport_rtp->strict_rtp_state == STRICT_RTP_OPEN;
6769
6770 position = 0;
6771 while (position < packetwords) {
6772 unsigned int i;
6773 unsigned int pt;
6774 unsigned int rc;
6775 unsigned int ssrc;
6776 /*! True if the ssrc value we have is valid and not garbage because it doesn't exist. */
6777 unsigned int ssrc_valid;
6778 unsigned int length;
6779 unsigned int min_length;
6780 /*! Always use packet source SSRC to find the rtp instance unless explicitly told not to. */
6781 unsigned int use_packet_source = 1;
6782
6783 struct ast_json *message_blob;
6784 RAII_VAR(struct ast_rtp_rtcp_report *, rtcp_report, NULL, ao2_cleanup);
6785 struct ast_rtp_instance *child;
6786 struct ast_rtp *rtp;
6787 struct ast_rtp_rtcp_feedback *feedback;
6788
6789 i = position;
6790 first_word = ntohl(rtcpheader[i]);
6791 pt = (first_word >> RTCP_PAYLOAD_TYPE_SHIFT) & RTCP_PAYLOAD_TYPE_MASK;
6792 rc = (first_word >> RTCP_REPORT_COUNT_SHIFT) & RTCP_REPORT_COUNT_MASK;
6793 /* RFC3550 says 'length' is the number of words in the packet - 1 */
6794 length = ((first_word >> RTCP_LENGTH_SHIFT) & RTCP_LENGTH_MASK) + 1;
6795
6796 /* Check expected RTCP packet record length */
6797 min_length = RTCP_HEADER_SSRC_LENGTH;
6798 switch (pt) {
6799 case RTCP_PT_SR:
6800 min_length += RTCP_SR_BLOCK_WORD_LENGTH;
6801 /* fall through */
6802 case RTCP_PT_RR:
6803 min_length += (rc * RTCP_RR_BLOCK_WORD_LENGTH);
6804 use_packet_source = 0;
6805 break;
6806 case RTCP_PT_FUR:
6807 break;
6808 case AST_RTP_RTCP_RTPFB:
6809 switch (rc) {
6811 min_length += RTCP_FB_NACK_BLOCK_WORD_LENGTH;
6812 break;
6813 default:
6814 break;
6815 }
6816 use_packet_source = 0;
6817 break;
6818 case RTCP_PT_PSFB:
6819 switch (rc) {
6821 min_length += RTCP_FB_REMB_BLOCK_WORD_LENGTH;
6822 break;
6823 default:
6824 break;
6825 }
6826 break;
6827 case RTCP_PT_SDES:
6828 case RTCP_PT_BYE:
6829 /*
6830 * There may not be a SSRC/CSRC present. The packet is
6831 * useless but still valid if it isn't present.
6832 *
6833 * We don't know what min_length should be so disable the check
6834 */
6835 min_length = length;
6836 break;
6837 default:
6838 ast_debug_rtcp(1, "(%p) RTCP %p -- from %s: %u(%s) skipping record\n",
6839 instance, transport_rtp, ast_sockaddr_stringify(addr), pt, rtcp_payload_type2str(pt));
6840 if (rtcp_debug_test_addr(addr)) {
6841 ast_verbose("\n");
6842 ast_verbose("RTCP from %s: %u(%s) skipping record\n",
6844 }
6845 position += length;
6846 continue;
6847 }
6848 if (length < min_length) {
6849 ast_debug_rtcp(1, "(%p) RTCP %p -- from %s: %u(%s) length field less than expected minimum. Min:%u Got:%u\n",
6850 instance, transport_rtp, ast_sockaddr_stringify(addr), pt, rtcp_payload_type2str(pt),
6851 min_length - 1, length - 1);
6852 return &ast_null_frame;
6853 }
6854
6855 /* Get the RTCP record SSRC if defined for the record */
6856 ssrc_valid = 1;
6857 switch (pt) {
6858 case RTCP_PT_SR:
6859 case RTCP_PT_RR:
6860 rtcp_report = ast_rtp_rtcp_report_alloc(rc);
6861 if (!rtcp_report) {
6862 return &ast_null_frame;
6863 }
6864 rtcp_report->reception_report_count = rc;
6865
6866 ssrc = ntohl(rtcpheader[i + 2]);
6867 rtcp_report->ssrc = ssrc;
6868 break;
6869 case RTCP_PT_FUR:
6870 case RTCP_PT_PSFB:
6871 ssrc = ntohl(rtcpheader[i + 1]);
6872 break;
6873 case AST_RTP_RTCP_RTPFB:
6874 ssrc = ntohl(rtcpheader[i + 2]);
6875 break;
6876 case RTCP_PT_SDES:
6877 case RTCP_PT_BYE:
6878 default:
6879 ssrc = 0;
6880 ssrc_valid = 0;
6881 break;
6882 }
6883
6884 if (rtcp_debug_test_addr(addr)) {
6885 const char *subtype = rtcp_payload_subtype2str(pt, rc);
6886
6887 ast_verbose("\n");
6888 ast_verbose("RTCP from %s\n", ast_sockaddr_stringify(addr));
6889 ast_verbose("PT: %u (%s)\n", pt, rtcp_payload_type2str(pt));
6890 if (subtype) {
6891 ast_verbose("Packet Subtype: %u (%s)\n", rc, subtype);
6892 } else {
6893 ast_verbose("Reception reports: %u\n", rc);
6894 }
6895 ast_verbose("SSRC of sender: %u\n", ssrc);
6896 }
6897
6898 /* Determine the appropriate instance for this */
6899 if (ssrc_valid) {
6900 /*
6901 * Depending on the payload type, either the packet source or media source
6902 * SSRC is used.
6903 */
6904 if (use_packet_source) {
6905 child = rtp_find_instance_by_packet_source_ssrc(transport, transport_rtp, ssrc);
6906 } else {
6907 child = rtp_find_instance_by_media_source_ssrc(transport, transport_rtp, ssrc);
6908 }
6909 if (child && child != transport) {
6910 /*
6911 * It is safe to hold the child lock while holding the parent lock.
6912 * We guarantee that the locking order is always parent->child or
6913 * that the child lock is not held when acquiring the parent lock.
6914 */
6915 ao2_lock(child);
6916 instance = child;
6917 rtp = ast_rtp_instance_get_data(instance);
6918 } else {
6919 /* The child is the parent! We don't need to unlock it. */
6920 child = NULL;
6921 rtp = transport_rtp;
6922 }
6923 } else {
6924 child = NULL;
6925 rtp = transport_rtp;
6926 }
6927
6928 if (ssrc_valid && rtp->themssrc_valid) {
6929 /*
6930 * If the SSRC is 1, we still need to handle RTCP since this could be a
6931 * special case. For example, if we have a unidirectional video stream, the
6932 * SSRC may be set to 1 by the browser (in the case of chromium), and requests
6933 * will still need to be processed so that video can flow as expected. This
6934 * should only be done for PLI and FUR, since there is not a way to get the
6935 * appropriate rtp instance when the SSRC is 1.
6936 */
6937 int exception = (ssrc == 1 && !((pt == RTCP_PT_PSFB && rc == AST_RTP_RTCP_FMT_PLI) || pt == RTCP_PT_FUR));
6938 if ((ssrc != rtp->themssrc && use_packet_source && ssrc != 1)
6939 || exception) {
6940 /*
6941 * Skip over this RTCP record as it does not contain the
6942 * correct SSRC. We should not act upon RTCP records
6943 * for a different stream.
6944 */
6945 position += length;
6946 ast_debug_rtcp(1, "(%p) RTCP %p -- from %s: Skipping record, received SSRC '%u' != expected '%u'\n",
6947 instance, rtp, ast_sockaddr_stringify(addr), ssrc, rtp->themssrc);
6948 if (child) {
6949 ao2_unlock(child);
6950 }
6951 continue;
6952 }
6953 ssrc_seen = 1;
6954 }
6955
6956 if (ssrc_seen && ast_rtp_instance_get_prop(instance, AST_RTP_PROPERTY_NAT)) {
6957 /* Send to whoever sent to us */
6958 if (ast_sockaddr_cmp(&rtp->rtcp->them, addr)) {
6959 ast_sockaddr_copy(&rtp->rtcp->them, addr);
6961 ast_debug(0, "(%p) RTCP NAT: Got RTCP from other end. Now sending to address %s\n",
6962 instance, ast_sockaddr_stringify(addr));
6963 }
6964 }
6965 }
6966
6967 i += RTCP_HEADER_SSRC_LENGTH; /* Advance past header and ssrc */
6968 switch (pt) {
6969 case RTCP_PT_SR:
6970 gettimeofday(&rtp->rtcp->rxlsr, NULL);
6971 rtp->rtcp->themrxlsr = ((ntohl(rtcpheader[i]) & 0x0000ffff) << 16) | ((ntohl(rtcpheader[i + 1]) & 0xffff0000) >> 16);
6972 rtp->rtcp->spc = ntohl(rtcpheader[i + 3]);
6973 rtp->rtcp->soc = ntohl(rtcpheader[i + 4]);
6974
6975 rtcp_report->type = RTCP_PT_SR;
6976 rtcp_report->sender_information.packet_count = rtp->rtcp->spc;
6977 rtcp_report->sender_information.octet_count = rtp->rtcp->soc;
6978 ntp2timeval((unsigned int)ntohl(rtcpheader[i]),
6979 (unsigned int)ntohl(rtcpheader[i + 1]),
6980 &rtcp_report->sender_information.ntp_timestamp);
6981 rtcp_report->sender_information.rtp_timestamp = ntohl(rtcpheader[i + 2]);
6982 if (rtcp_debug_test_addr(addr)) {
6983 ast_verbose("NTP timestamp: %u.%06u\n",
6984 (unsigned int)rtcp_report->sender_information.ntp_timestamp.tv_sec,
6985 (unsigned int)rtcp_report->sender_information.ntp_timestamp.tv_usec);
6986 ast_verbose("RTP timestamp: %u\n", rtcp_report->sender_information.rtp_timestamp);
6987 ast_verbose("SPC: %u\tSOC: %u\n",
6988 rtcp_report->sender_information.packet_count,
6989 rtcp_report->sender_information.octet_count);
6990 }
6992 /* Intentional fall through */
6993 case RTCP_PT_RR:
6994 if (rtcp_report->type != RTCP_PT_SR) {
6995 rtcp_report->type = RTCP_PT_RR;
6996 }
6997
6998 if (rc > 0) {
6999 /* Don't handle multiple reception reports (rc > 1) yet */
7000 report_block = ast_calloc(1, sizeof(*report_block));
7001 if (!report_block) {
7002 if (child) {
7003 ao2_unlock(child);
7004 }
7005 return &ast_null_frame;
7006 }
7007 rtcp_report->report_block[0] = report_block;
7008 report_block->source_ssrc = ntohl(rtcpheader[i]);
7009 report_block->lost_count.packets = ntohl(rtcpheader[i + 1]) & 0x00ffffff;
7010 report_block->lost_count.fraction = ((ntohl(rtcpheader[i + 1]) & 0xff000000) >> 24);
7011 report_block->highest_seq_no = ntohl(rtcpheader[i + 2]);
7012 report_block->ia_jitter = ntohl(rtcpheader[i + 3]);
7013 report_block->lsr = ntohl(rtcpheader[i + 4]);
7014 report_block->dlsr = ntohl(rtcpheader[i + 5]);
7015 if (report_block->lsr) {
7016 int skewed = update_rtt_stats(rtp, report_block->lsr, report_block->dlsr);
7017 if (skewed && rtcp_debug_test_addr(addr)) {
7018 struct timeval now;
7019 unsigned int lsr_now, lsw, msw;
7020 gettimeofday(&now, NULL);
7021 timeval2ntp(now, &msw, &lsw);
7022 lsr_now = (((msw & 0xffff) << 16) | ((lsw & 0xffff0000) >> 16));
7023 ast_verbose("Internal RTCP NTP clock skew detected: "
7024 "lsr=%u, now=%u, dlsr=%u (%u:%03ums), "
7025 "diff=%u\n",
7026 report_block->lsr, lsr_now, report_block->dlsr, report_block->dlsr / 65536,
7027 (report_block->dlsr % 65536) * 1000 / 65536,
7028 report_block->dlsr - (lsr_now - report_block->lsr));
7029 }
7030 }
7031 update_jitter_stats(rtp, report_block->ia_jitter);
7032 update_lost_stats(rtp, report_block->lost_count.packets);
7033 /*
7034 * update_reported_mes_stats must be called AFTER
7035 * update_rtt_stats, update_jitter_stats and
7036 * update_lost_stats.
7037 */
7039
7040 if (rtcp_debug_test_addr(addr)) {
7041 int rate = ast_rtp_get_rate(rtp->f.subclass.format);
7042
7043 ast_verbose(" Fraction lost: %d\n", report_block->lost_count.fraction);
7044 ast_verbose(" Packets lost so far: %u\n", report_block->lost_count.packets);
7045 ast_verbose(" Highest sequence number: %u\n", report_block->highest_seq_no & 0x0000ffff);
7046 ast_verbose(" Sequence number cycles: %u\n", report_block->highest_seq_no >> 16);
7047 ast_verbose(" Interarrival jitter (samp): %u\n", report_block->ia_jitter);
7048 ast_verbose(" Interarrival jitter (secs): %.6f\n", ast_samp2sec(report_block->ia_jitter, rate));
7049 ast_verbose(" Last SR(our NTP): %lu.%010lu\n",(unsigned long)(report_block->lsr) >> 16,((unsigned long)(report_block->lsr) << 16) * 4096);
7050 ast_verbose(" DLSR: %4.4f (sec)\n",(double)report_block->dlsr / 65536.0);
7051 ast_verbose(" RTT: %4.4f(sec)\n", rtp->rtcp->rtt);
7052 ast_verbose(" MES: %4.1f\n", rtp->rtcp->reported_mes);
7053 }
7054 }
7055 /* If and when we handle more than one report block, this should occur outside
7056 * this loop.
7057 */
7058
7059 message_blob = ast_json_pack("{s: s, s: s, s: f, s: f}",
7060 "from", ast_sockaddr_stringify(addr),
7061 "to", transport_rtp->rtcp->local_addr_str,
7062 "rtt", rtp->rtcp->rtt,
7063 "mes", rtp->rtcp->reported_mes);
7065 rtcp_report,
7066 message_blob);
7067 ast_json_unref(message_blob);
7068
7069 /* Return an AST_FRAME_RTCP frame with the ast_rtp_rtcp_report
7070 * object as a its data */
7071 transport_rtp->f.frametype = AST_FRAME_RTCP;
7072 transport_rtp->f.subclass.integer = pt;
7073 transport_rtp->f.data.ptr = rtp->rtcp->frame_buf + AST_FRIENDLY_OFFSET;
7074 memcpy(transport_rtp->f.data.ptr, rtcp_report, sizeof(struct ast_rtp_rtcp_report));
7075 transport_rtp->f.datalen = sizeof(struct ast_rtp_rtcp_report);
7076 if (rc > 0) {
7077 /* There's always a single report block stored, here */
7078 struct ast_rtp_rtcp_report *rtcp_report2;
7079 report_block = transport_rtp->f.data.ptr + transport_rtp->f.datalen + sizeof(struct ast_rtp_rtcp_report_block *);
7080 memcpy(report_block, rtcp_report->report_block[0], sizeof(struct ast_rtp_rtcp_report_block));
7081 rtcp_report2 = (struct ast_rtp_rtcp_report *)transport_rtp->f.data.ptr;
7082 rtcp_report2->report_block[0] = report_block;
7083 transport_rtp->f.datalen += sizeof(struct ast_rtp_rtcp_report_block);
7084 }
7085 transport_rtp->f.offset = AST_FRIENDLY_OFFSET;
7086 transport_rtp->f.samples = 0;
7087 transport_rtp->f.mallocd = 0;
7088 transport_rtp->f.delivery.tv_sec = 0;
7089 transport_rtp->f.delivery.tv_usec = 0;
7090 transport_rtp->f.src = "RTP";
7091 transport_rtp->f.stream_num = rtp->stream_num;
7092 f = &transport_rtp->f;
7093 break;
7094 case AST_RTP_RTCP_RTPFB:
7095 switch (rc) {
7097 /* If retransmissions are not enabled ignore this message */
7098 if (!rtp->send_buffer) {
7099 break;
7100 }
7101
7102 if (rtcp_debug_test_addr(addr)) {
7103 ast_verbose("Received generic RTCP NACK message\n");
7104 }
7105
7106 ast_rtp_rtcp_handle_nack(instance, rtcpheader, position, length);
7107 break;
7108 default:
7109 break;
7110 }
7111 break;
7112 case RTCP_PT_FUR:
7113 /* Handle RTCP FUR as FIR by setting the format to 4 */
7115 case RTCP_PT_PSFB:
7116 switch (rc) {
7119 if (rtcp_debug_test_addr(addr)) {
7120 ast_verbose("Received an RTCP Fast Update Request\n");
7121 }
7122 transport_rtp->f.frametype = AST_FRAME_CONTROL;
7123 transport_rtp->f.subclass.integer = AST_CONTROL_VIDUPDATE;
7124 transport_rtp->f.datalen = 0;
7125 transport_rtp->f.samples = 0;
7126 transport_rtp->f.mallocd = 0;
7127 transport_rtp->f.src = "RTP";
7128 f = &transport_rtp->f;
7129 break;
7131 /* If REMB support is not enabled ignore this message */
7133 break;
7134 }
7135
7136 if (rtcp_debug_test_addr(addr)) {
7137 ast_verbose("Received REMB report\n");
7138 }
7139 transport_rtp->f.frametype = AST_FRAME_RTCP;
7140 transport_rtp->f.subclass.integer = pt;
7141 transport_rtp->f.stream_num = rtp->stream_num;
7142 transport_rtp->f.data.ptr = rtp->rtcp->frame_buf + AST_FRIENDLY_OFFSET;
7143 feedback = transport_rtp->f.data.ptr;
7144 feedback->fmt = rc;
7145
7146 /* We don't actually care about the SSRC information in the feedback message */
7147 first_word = ntohl(rtcpheader[i + 2]);
7148 feedback->remb.br_exp = (first_word >> 18) & ((1 << 6) - 1);
7149 feedback->remb.br_mantissa = first_word & ((1 << 18) - 1);
7150
7151 transport_rtp->f.datalen = sizeof(struct ast_rtp_rtcp_feedback);
7152 transport_rtp->f.offset = AST_FRIENDLY_OFFSET;
7153 transport_rtp->f.samples = 0;
7154 transport_rtp->f.mallocd = 0;
7155 transport_rtp->f.delivery.tv_sec = 0;
7156 transport_rtp->f.delivery.tv_usec = 0;
7157 transport_rtp->f.src = "RTP";
7158 f = &transport_rtp->f;
7159 break;
7160 default:
7161 break;
7162 }
7163 break;
7164 case RTCP_PT_SDES:
7165 if (rtcp_debug_test_addr(addr)) {
7166 ast_verbose("Received an SDES from %s\n",
7168 }
7169#ifdef TEST_FRAMEWORK
7170 if ((test_engine = ast_rtp_instance_get_test(instance))) {
7171 test_engine->sdes_received = 1;
7172 }
7173#endif
7174 break;
7175 case RTCP_PT_BYE:
7176 if (rtcp_debug_test_addr(addr)) {
7177 ast_verbose("Received a BYE from %s\n",
7179 }
7180 break;
7181 default:
7182 break;
7183 }
7184 position += length;
7185 rtp->rtcp->rtcp_info = 1;
7186
7187 if (child) {
7188 ao2_unlock(child);
7189 }
7190 }
7191
7192 return f;
7193}
7194
7195/*! \pre instance is locked */
7196static struct ast_frame *ast_rtcp_read(struct ast_rtp_instance *instance)
7197{
7198 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
7199 struct ast_srtp *srtp = ast_rtp_instance_get_srtp(instance, 1);
7200 struct ast_sockaddr addr;
7201 unsigned char rtcpdata[8192 + AST_FRIENDLY_OFFSET];
7202 unsigned char *read_area = rtcpdata + AST_FRIENDLY_OFFSET;
7203 size_t read_area_size = sizeof(rtcpdata) - AST_FRIENDLY_OFFSET;
7204 int res;
7205
7206 /* Read in RTCP data from the socket */
7207 if ((res = rtcp_recvfrom(instance, read_area, read_area_size,
7208 0, &addr)) < 0) {
7209 if (res == RTP_DTLS_ESTABLISHED) {
7212 return &rtp->f;
7213 }
7214
7215 ast_assert(errno != EBADF);
7216 if (errno != EAGAIN) {
7217 ast_log(LOG_WARNING, "RTCP Read error: %s. Hanging up.\n",
7218 (errno) ? strerror(errno) : "Unspecified");
7219 return NULL;
7220 }
7221 return &ast_null_frame;
7222 }
7223
7224 /* If this was handled by the ICE session don't do anything further */
7225 if (!res) {
7226 return &ast_null_frame;
7227 }
7228
7229 if (!*read_area) {
7230 struct sockaddr_in addr_tmp;
7231 struct ast_sockaddr addr_v4;
7232
7233 if (ast_sockaddr_is_ipv4(&addr)) {
7234 ast_sockaddr_to_sin(&addr, &addr_tmp);
7235 } else if (ast_sockaddr_ipv4_mapped(&addr, &addr_v4)) {
7236 ast_debug_stun(2, "(%p) STUN using IPv6 mapped address %s\n",
7237 instance, ast_sockaddr_stringify(&addr));
7238 ast_sockaddr_to_sin(&addr_v4, &addr_tmp);
7239 } else {
7240 ast_debug_stun(2, "(%p) STUN cannot do for non IPv4 address %s\n",
7241 instance, ast_sockaddr_stringify(&addr));
7242 return &ast_null_frame;
7243 }
7244 if ((ast_stun_handle_packet(rtp->rtcp->s, &addr_tmp, read_area, res, NULL, NULL) == AST_STUN_ACCEPT)) {
7245 ast_sockaddr_from_sin(&addr, &addr_tmp);
7246 ast_sockaddr_copy(&rtp->rtcp->them, &addr);
7247 }
7248 return &ast_null_frame;
7249 }
7250
7251 return ast_rtcp_interpret(instance, srtp, read_area, res, &addr);
7252}
7253
7254/*! \pre instance is locked */
7255static int bridge_p2p_rtp_write(struct ast_rtp_instance *instance,
7256 struct ast_rtp_instance *instance1, unsigned int *rtpheader, int len, int hdrlen)
7257{
7258 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
7259 struct ast_rtp *bridged;
7260 int res = 0, payload = 0, bridged_payload = 0, mark;
7261 RAII_VAR(struct ast_rtp_payload_type *, payload_type, NULL, ao2_cleanup);
7262 int reconstruct = ntohl(rtpheader[0]);
7263 struct ast_sockaddr remote_address = { {0,} };
7264 int ice;
7265 unsigned int timestamp = ntohl(rtpheader[1]);
7266
7267 /* Get fields from packet */
7268 payload = (reconstruct & 0x7f0000) >> 16;
7269 mark = (reconstruct & 0x800000) >> 23;
7270
7271 /* Check what the payload value should be */
7272 payload_type = ast_rtp_codecs_get_payload(ast_rtp_instance_get_codecs(instance), payload);
7273 if (!payload_type) {
7274 return -1;
7275 }
7276
7277 /* Otherwise adjust bridged payload to match */
7279 payload_type->asterisk_format, payload_type->format, payload_type->rtp_code, payload_type->sample_rate);
7280
7281 /* If no codec could be matched between instance and instance1, then somehow things were made incompatible while we were still bridged. Bail. */
7282 if (bridged_payload < 0) {
7283 return -1;
7284 }
7285
7286 /* 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 */
7287 if (ast_rtp_codecs_find_payload_code(ast_rtp_instance_get_codecs(instance1), bridged_payload) == -1) {
7288 ast_debug_rtp(1, "(%p, %p) RTP unsupported payload type received\n", instance, instance1);
7289 return -1;
7290 }
7291
7292 /*
7293 * Even if we are no longer in dtmf, we could still be receiving
7294 * re-transmissions of the last dtmf end still. Feed those to the
7295 * core so they can be filtered accordingly.
7296 */
7297 if (rtp->last_end_timestamp.is_set && rtp->last_end_timestamp.ts == timestamp) {
7298 ast_debug_rtp(1, "(%p, %p) RTP feeding packet with duplicate timestamp to core\n", instance, instance1);
7299 return -1;
7300 }
7301
7302 if (payload_type->asterisk_format) {
7303 ao2_replace(rtp->lastrxformat, payload_type->format);
7304 }
7305
7306 /*
7307 * We have now determined that we need to send the RTP packet
7308 * out the bridged instance to do local bridging so we must unlock
7309 * the receiving instance to prevent deadlock with the bridged
7310 * instance.
7311 *
7312 * Technically we should grab a ref to instance1 so it won't go
7313 * away on us. However, we should be safe because the bridged
7314 * instance won't change without both channels involved being
7315 * locked and we currently have the channel lock for the receiving
7316 * instance.
7317 */
7318 ao2_unlock(instance);
7319 ao2_lock(instance1);
7320
7321 /*
7322 * Get the peer rtp pointer now to emphasize that using it
7323 * must happen while instance1 is locked.
7324 */
7325 bridged = ast_rtp_instance_get_data(instance1);
7326
7327
7328 /* If bridged peer is in dtmf, feed all packets to core until it finishes to avoid infinite dtmf */
7329 if (bridged->sending_digit) {
7330 ast_debug_rtp(1, "(%p, %p) RTP Feeding packet to core until DTMF finishes\n", instance, instance1);
7331 ao2_unlock(instance1);
7332 ao2_lock(instance);
7333 return -1;
7334 }
7335
7336 if (payload_type->asterisk_format) {
7337 /*
7338 * If bridged peer has already received rtp, perform the asymmetric codec check
7339 * if that feature has been activated
7340 */
7341 if (!bridged->asymmetric_codec
7342 && bridged->lastrxformat != ast_format_none
7343 && ast_format_cmp(payload_type->format, bridged->lastrxformat) == AST_FORMAT_CMP_NOT_EQUAL) {
7344 ast_debug_rtp(1, "(%p, %p) RTP asymmetric RTP codecs detected (TX: %s, RX: %s) sending frame to core\n",
7345 instance, instance1, ast_format_get_name(payload_type->format),
7347 ao2_unlock(instance1);
7348 ao2_lock(instance);
7349 return -1;
7350 }
7351
7352 ao2_replace(bridged->lasttxformat, payload_type->format);
7353 }
7354
7355 ast_rtp_instance_get_remote_address(instance1, &remote_address);
7356
7357 if (ast_sockaddr_isnull(&remote_address)) {
7358 ast_debug_rtp(5, "(%p, %p) RTP remote address is null, most likely RTP has been stopped\n",
7359 instance, instance1);
7360 ao2_unlock(instance1);
7361 ao2_lock(instance);
7362 return 0;
7363 }
7364
7365 /* If the marker bit has been explicitly set turn it on */
7366 if (ast_test_flag(bridged, FLAG_NEED_MARKER_BIT)) {
7367 mark = 1;
7369 }
7370
7371 /* Set the marker bit for the first local bridged packet which has the first bridged peer's SSRC. */
7373 mark = 1;
7375 }
7376
7377 /* Reconstruct part of the packet */
7378 reconstruct &= 0xFF80FFFF;
7379 reconstruct |= (bridged_payload << 16);
7380 reconstruct |= (mark << 23);
7381 rtpheader[0] = htonl(reconstruct);
7382
7383 if (mark) {
7384 /* make this rtp instance aware of the new ssrc it is sending */
7385 bridged->ssrc = ntohl(rtpheader[2]);
7386 }
7387
7388 /* Send the packet back out */
7389 res = rtp_sendto(instance1, (void *)rtpheader, len, 0, &remote_address, &ice);
7390 if (res < 0) {
7393 "RTP Transmission error of packet to %s: %s\n",
7394 ast_sockaddr_stringify(&remote_address),
7395 strerror(errno));
7399 "RTP NAT: Can't write RTP to private "
7400 "address %s, waiting for other end to "
7401 "send audio...\n",
7402 ast_sockaddr_stringify(&remote_address));
7403 }
7405 }
7406 ao2_unlock(instance1);
7407 ao2_lock(instance);
7408 return 0;
7409 }
7410
7411 if (rtp_debug_test_addr(&remote_address)) {
7412 ast_verbose("Sent RTP P2P packet to %s%s (type %-2.2d, len %-6.6d)\n",
7413 ast_sockaddr_stringify(&remote_address),
7414 ice ? " (via ICE)" : "",
7415 bridged_payload, len - hdrlen);
7416 }
7417
7418 ao2_unlock(instance1);
7419 ao2_lock(instance);
7420 return 0;
7421}
7422
7423static void rtp_instance_unlock(struct ast_rtp_instance *instance)
7424{
7425 if (instance) {
7426 ao2_unlock(instance);
7427 }
7428}
7429
7435
7436static void rtp_transport_wide_cc_feedback_status_vector_append(unsigned char *rtcpheader, int *packet_len, int *status_vector_chunk_bits,
7437 uint16_t *status_vector_chunk, int status)
7438{
7439 /* Appending this status will use up 2 bits */
7440 *status_vector_chunk_bits -= 2;
7441
7442 /* We calculate which bits we want to update the status of. Since a status vector
7443 * is 16 bits we take away 2 (for the header), and then we take away any that have
7444 * already been used.
7445 */
7446 *status_vector_chunk |= (status << (16 - 2 - (14 - *status_vector_chunk_bits)));
7447
7448 /* If there are still bits available we can return early */
7449 if (*status_vector_chunk_bits) {
7450 return;
7451 }
7452
7453 /* Otherwise we have to place this chunk into the packet */
7454 put_unaligned_uint16(rtcpheader + *packet_len, htons(*status_vector_chunk));
7455 *status_vector_chunk_bits = 14;
7456
7457 /* The first bit being 1 indicates that this is a status vector chunk and the second
7458 * bit being 1 indicates that we are using 2 bits to represent each status for a
7459 * packet.
7460 */
7461 *status_vector_chunk = (1 << 15) | (1 << 14);
7462 *packet_len += 2;
7463}
7464
7465static void rtp_transport_wide_cc_feedback_status_append(unsigned char *rtcpheader, int *packet_len, int *status_vector_chunk_bits,
7466 uint16_t *status_vector_chunk, int *run_length_chunk_count, int *run_length_chunk_status, int status)
7467{
7468 if (*run_length_chunk_status != status) {
7469 while (*run_length_chunk_count > 0 && *run_length_chunk_count < 8) {
7470 /* Realistically it only makes sense to use a run length chunk if there were 8 or more
7471 * consecutive packets of the same type, otherwise we could end up making the packet larger
7472 * if we have lots of small blocks of the same type. To help with this we backfill the status
7473 * vector (since it always represents 7 packets). Best case we end up with only that single
7474 * status vector and the rest are run length chunks.
7475 */
7476 rtp_transport_wide_cc_feedback_status_vector_append(rtcpheader, packet_len, status_vector_chunk_bits,
7477 status_vector_chunk, *run_length_chunk_status);
7478 *run_length_chunk_count -= 1;
7479 }
7480
7481 if (*run_length_chunk_count) {
7482 /* There is a run length chunk which needs to be written out */
7483 put_unaligned_uint16(rtcpheader + *packet_len, htons((0 << 15) | (*run_length_chunk_status << 13) | *run_length_chunk_count));
7484 *packet_len += 2;
7485 }
7486
7487 /* In all cases the run length chunk has to be reset */
7488 *run_length_chunk_count = 0;
7489 *run_length_chunk_status = -1;
7490
7491 if (*status_vector_chunk_bits == 14) {
7492 /* We aren't in the middle of a status vector so we can try for a run length chunk */
7493 *run_length_chunk_status = status;
7494 *run_length_chunk_count = 1;
7495 } else {
7496 /* We're doing a status vector so populate it accordingly */
7497 rtp_transport_wide_cc_feedback_status_vector_append(rtcpheader, packet_len, status_vector_chunk_bits,
7498 status_vector_chunk, status);
7499 }
7500 } else {
7501 /* This is easy, the run length chunk count can just get bumped up */
7502 *run_length_chunk_count += 1;
7503 }
7504}
7505
7506static int rtp_transport_wide_cc_feedback_produce(const void *data)
7507{
7508 struct ast_rtp_instance *instance = (struct ast_rtp_instance *) data;
7509 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
7510 unsigned char *rtcpheader;
7511 char bdata[1024];
7512 struct rtp_transport_wide_cc_packet_statistics *first_packet;
7513 struct rtp_transport_wide_cc_packet_statistics *previous_packet;
7514 int i;
7515 int status_vector_chunk_bits = 14;
7516 uint16_t status_vector_chunk = (1 << 15) | (1 << 14);
7517 int run_length_chunk_count = 0;
7518 int run_length_chunk_status = -1;
7519 int packet_len = 20;
7520 int delta_len = 0;
7521 int packet_count = 0;
7522 unsigned int received_msw;
7523 unsigned int received_lsw;
7524 struct ast_sockaddr remote_address = { { 0, } };
7525 int res;
7526 int ice;
7527 unsigned int large_delta_count = 0;
7528 unsigned int small_delta_count = 0;
7529 unsigned int lost_count = 0;
7530
7531 if (!rtp || !rtp->rtcp || rtp->transport_wide_cc.schedid == -1) {
7532 ao2_ref(instance, -1);
7533 return 0;
7534 }
7535
7536 ao2_lock(instance);
7537
7538 /* If no packets have been received then do nothing */
7540 ao2_unlock(instance);
7541 return 1000;
7542 }
7543
7544 rtcpheader = (unsigned char *)bdata;
7545
7546 /* The first packet in the vector acts as our base sequence number and reference time */
7548 previous_packet = first_packet;
7549
7550 /* We go through each packet that we have statistics for, adding it either to a status
7551 * vector chunk or a run length chunk. The code tries to be as efficient as possible to
7552 * reduce packet size and will favor run length chunks when it makes sense.
7553 */
7554 for (i = 0; i < AST_VECTOR_SIZE(&rtp->transport_wide_cc.packet_statistics); ++i) {
7556 int lost = 0;
7557 int res = 0;
7558
7560
7561 packet_count++;
7562
7563 if (first_packet != statistics) {
7564 /* The vector stores statistics in a sorted fashion based on the sequence
7565 * number. This ensures we can detect any packets that have been lost/not
7566 * received by comparing the sequence numbers.
7567 */
7568 lost = statistics->seqno - (previous_packet->seqno + 1);
7569 lost_count += lost;
7570 }
7571
7572 while (lost) {
7573 /* We append a not received status until all the lost packets have been accounted for */
7574 rtp_transport_wide_cc_feedback_status_append(rtcpheader, &packet_len, &status_vector_chunk_bits,
7575 &status_vector_chunk, &run_length_chunk_count, &run_length_chunk_status, 0);
7576 packet_count++;
7577
7578 /* If there is no more room left for storing packets stop now, we leave 20
7579 * extra bits at the end just in case.
7580 */
7581 if (packet_len + delta_len + 20 > sizeof(bdata)) {
7582 res = -1;
7583 break;
7584 }
7585
7586 lost--;
7587 }
7588
7589 /* If the lost packet appending bailed out because we have no more space, then exit here too */
7590 if (res) {
7591 break;
7592 }
7593
7594 /* Per the spec the delta is in increments of 250 */
7595 statistics->delta = ast_tvdiff_us(statistics->received, previous_packet->received) / 250;
7596
7597 /* Based on the delta determine the status of this packet */
7598 if (statistics->delta < 0 || statistics->delta > 127) {
7599 /* Large or negative delta */
7600 rtp_transport_wide_cc_feedback_status_append(rtcpheader, &packet_len, &status_vector_chunk_bits,
7601 &status_vector_chunk, &run_length_chunk_count, &run_length_chunk_status, 2);
7602 delta_len += 2;
7603 large_delta_count++;
7604 } else {
7605 /* Small delta */
7606 rtp_transport_wide_cc_feedback_status_append(rtcpheader, &packet_len, &status_vector_chunk_bits,
7607 &status_vector_chunk, &run_length_chunk_count, &run_length_chunk_status, 1);
7608 delta_len += 1;
7609 small_delta_count++;
7610 }
7611
7612 previous_packet = statistics;
7613
7614 /* If there is no more room left in the packet stop handling of any subsequent packets */
7615 if (packet_len + delta_len + 20 > sizeof(bdata)) {
7616 break;
7617 }
7618 }
7619
7620 if (status_vector_chunk_bits != 14) {
7621 /* If the status vector chunk has packets in it then place it in the RTCP packet */
7622 put_unaligned_uint16(rtcpheader + packet_len, htons(status_vector_chunk));
7623 packet_len += 2;
7624 } else if (run_length_chunk_count) {
7625 /* If there is a run length chunk in progress then place it in the RTCP packet */
7626 put_unaligned_uint16(rtcpheader + packet_len, htons((0 << 15) | (run_length_chunk_status << 13) | run_length_chunk_count));
7627 packet_len += 2;
7628 }
7629
7630 /* We iterate again to build delta chunks */
7631 for (i = 0; i < AST_VECTOR_SIZE(&rtp->transport_wide_cc.packet_statistics); ++i) {
7633
7635
7636 if (statistics->delta < 0 || statistics->delta > 127) {
7637 /* We need 2 bytes to store this delta */
7638 put_unaligned_uint16(rtcpheader + packet_len, htons(statistics->delta));
7639 packet_len += 2;
7640 } else {
7641 /* We can store this delta in 1 byte */
7642 rtcpheader[packet_len] = statistics->delta;
7643 packet_len += 1;
7644 }
7645
7646 /* If this is the last packet handled by the run length chunk or status vector chunk code
7647 * then we can go no further.
7648 */
7649 if (statistics == previous_packet) {
7650 break;
7651 }
7652 }
7653
7654 /* Zero pad the end of the packet */
7655 while (packet_len % 4) {
7656 rtcpheader[packet_len++] = 0;
7657 }
7658
7659 /* Add the general RTCP header information */
7660 put_unaligned_uint32(rtcpheader, htonl((2 << 30) | (AST_RTP_RTCP_FMT_TRANSPORT_WIDE_CC << 24)
7661 | (AST_RTP_RTCP_RTPFB << 16) | ((packet_len / 4) - 1)));
7662 put_unaligned_uint32(rtcpheader + 4, htonl(rtp->ssrc));
7663 put_unaligned_uint32(rtcpheader + 8, htonl(rtp->themssrc));
7664
7665 /* Add the transport-cc specific header information */
7666 put_unaligned_uint32(rtcpheader + 12, htonl((first_packet->seqno << 16) | packet_count));
7667
7668 timeval2ntp(first_packet->received, &received_msw, &received_lsw);
7669 put_unaligned_time24(rtcpheader + 16, received_msw, received_lsw);
7670 rtcpheader[19] = rtp->transport_wide_cc.feedback_count;
7671
7672 /* The packet is now fully constructed so send it out */
7673 ast_sockaddr_copy(&remote_address, &rtp->rtcp->them);
7674
7675 ast_debug_rtcp(2, "(%p) RTCP sending transport-cc feedback packet of size '%d' on '%s' with packet count of %d (small = %d, large = %d, lost = %d)\n",
7676 instance, packet_len, ast_rtp_instance_get_channel_id(instance), packet_count, small_delta_count, large_delta_count, lost_count);
7677
7678 res = rtcp_sendto(instance, (unsigned int *)rtcpheader, packet_len, 0, &remote_address, &ice);
7679 if (res < 0) {
7680 ast_log(LOG_ERROR, "RTCP transport-cc feedback error to %s due to %s\n",
7681 ast_sockaddr_stringify(&remote_address), strerror(errno));
7682 }
7683
7685
7687
7688 ao2_unlock(instance);
7689
7690 return 1000;
7691}
7692
7693static void rtp_instance_parse_transport_wide_cc(struct ast_rtp_instance *instance, struct ast_rtp *rtp,
7694 unsigned char *data, int len)
7695{
7696 uint16_t *seqno = (uint16_t *)data;
7698 struct ast_rtp_instance *transport = rtp->bundled ? rtp->bundled : instance;
7699 struct ast_rtp *transport_rtp = ast_rtp_instance_get_data(transport);
7700
7701 /* If the sequence number has cycled over then record it as such */
7702 if (((int)transport_rtp->transport_wide_cc.last_seqno - (int)ntohs(*seqno)) > 100) {
7703 transport_rtp->transport_wide_cc.cycles += RTP_SEQ_MOD;
7704 }
7705
7706 /* Populate the statistics information for this packet */
7707 statistics.seqno = transport_rtp->transport_wide_cc.cycles + ntohs(*seqno);
7708 statistics.received = ast_tvnow();
7709
7710 /* We allow at a maximum 1000 packet statistics in play at a time, if we hit the
7711 * limit we give up and start fresh.
7712 */
7713 if (AST_VECTOR_SIZE(&transport_rtp->transport_wide_cc.packet_statistics) > 1000) {
7715 }
7716
7717 if (!AST_VECTOR_SIZE(&transport_rtp->transport_wide_cc.packet_statistics) ||
7718 statistics.seqno > transport_rtp->transport_wide_cc.last_extended_seqno) {
7719 /* This is the expected path */
7721 return;
7722 }
7723
7724 transport_rtp->transport_wide_cc.last_extended_seqno = statistics.seqno;
7725 transport_rtp->transport_wide_cc.last_seqno = ntohs(*seqno);
7726 } else {
7727 /* This packet was out of order, so reorder it within the vector accordingly */
7730 return;
7731 }
7732 }
7733
7734 /* If we have not yet scheduled the periodic sending of feedback for this transport then do so */
7735 if (transport_rtp->transport_wide_cc.schedid < 0 && transport_rtp->rtcp) {
7736 ast_debug_rtcp(1, "(%p) RTCP starting transport-cc feedback transmission on RTP instance '%p'\n", instance, transport);
7737 ao2_ref(transport, +1);
7738 transport_rtp->transport_wide_cc.schedid = ast_sched_add(rtp->sched, 1000,
7740 if (transport_rtp->transport_wide_cc.schedid < 0) {
7741 ao2_ref(transport, -1);
7742 ast_log(LOG_WARNING, "Scheduling RTCP transport-cc feedback transmission failed on RTP instance '%p'\n",
7743 transport);
7744 }
7745 }
7746}
7747
7748static void rtp_instance_parse_extmap_extensions(struct ast_rtp_instance *instance, struct ast_rtp *rtp,
7749 unsigned char *extension, int len)
7750{
7751 int transport_wide_cc_id = ast_rtp_instance_extmap_get_id(instance, AST_RTP_EXTENSION_TRANSPORT_WIDE_CC);
7752 int pos = 0;
7753
7754 /* We currently only care about the transport-cc extension, so if that's not negotiated then do nothing */
7755 if (transport_wide_cc_id == -1) {
7756 return;
7757 }
7758
7759 /* Only while we do not exceed available extension data do we continue */
7760 while (pos < len) {
7761 int id = extension[pos] >> 4;
7762 int extension_len = (extension[pos] & 0xF) + 1;
7763
7764 /* We've handled the first byte as it contains the extension id and length, so always
7765 * skip ahead now
7766 */
7767 pos += 1;
7768
7769 if (id == 0) {
7770 /* From the RFC:
7771 * In both forms, padding bytes have the value of 0 (zero). They may be
7772 * placed between extension elements, if desired for alignment, or after
7773 * the last extension element, if needed for padding. A padding byte
7774 * does not supply the ID of an element, nor the length field. When a
7775 * padding byte is found, it is ignored and the parser moves on to
7776 * interpreting the next byte.
7777 */
7778 continue;
7779 } else if (id == 15) {
7780 /* From the RFC:
7781 * The local identifier value 15 is reserved for future extension and
7782 * MUST NOT be used as an identifier. If the ID value 15 is
7783 * encountered, its length field should be ignored, processing of the
7784 * entire extension should terminate at that point, and only the
7785 * extension elements present prior to the element with ID 15
7786 * considered.
7787 */
7788 break;
7789 } else if ((pos + extension_len) > len) {
7790 /* The extension is corrupted and is stating that it contains more data than is
7791 * available in the extensions data.
7792 */
7793 break;
7794 }
7795
7796 /* If this is transport-cc then we need to parse it further */
7797 if (id == transport_wide_cc_id) {
7798 rtp_instance_parse_transport_wide_cc(instance, rtp, extension + pos, extension_len);
7799 }
7800
7801 /* Skip ahead to the next extension */
7802 pos += extension_len;
7803 }
7804}
7805
7806static struct ast_frame *ast_rtp_interpret(struct ast_rtp_instance *instance, struct ast_srtp *srtp,
7807 const struct ast_sockaddr *remote_address, unsigned char *read_area, int length, int prev_seqno,
7808 unsigned int bundled)
7809{
7810 unsigned int *rtpheader = (unsigned int*)(read_area);
7811 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
7812 struct ast_rtp_instance *instance1;
7813 int res = length, hdrlen = 12, ssrc, seqno, payloadtype, padding, mark, ext, cc;
7814 unsigned int timestamp;
7815 RAII_VAR(struct ast_rtp_payload_type *, payload, NULL, ao2_cleanup);
7816 struct frame_list frames;
7817
7818 /* If this payload is encrypted then decrypt it using the given SRTP instance */
7819 if ((*read_area & 0xC0) && res_srtp && srtp && res_srtp->unprotect(
7820 srtp, read_area, &res, 0 | (srtp_replay_protection << 1)) < 0) {
7821 return &ast_null_frame;
7822 }
7823
7824 /* If we are currently sending DTMF to the remote party send a continuation packet */
7825 if (rtp->sending_digit) {
7826 ast_rtp_dtmf_continuation(instance);
7827 }
7828
7829 /* Pull out the various other fields we will need */
7830 ssrc = ntohl(rtpheader[2]);
7831 seqno = ntohl(rtpheader[0]);
7832 payloadtype = (seqno & 0x7f0000) >> 16;
7833 padding = seqno & (1 << 29);
7834 mark = seqno & (1 << 23);
7835 ext = seqno & (1 << 28);
7836 cc = (seqno & 0xF000000) >> 24;
7837 seqno &= 0xffff;
7838 timestamp = ntohl(rtpheader[1]);
7839
7841
7842 /* Remove any padding bytes that may be present */
7843 if (padding) {
7844 res -= read_area[res - 1];
7845 }
7846
7847 /* Skip over any CSRC fields */
7848 if (cc) {
7849 hdrlen += cc * 4;
7850 }
7851
7852 /* Look for any RTP extensions, currently we do not support any */
7853 if (ext) {
7854 int extensions_size = (ntohl(rtpheader[hdrlen/4]) & 0xffff) << 2;
7855 unsigned int profile;
7856 profile = (ntohl(rtpheader[3]) & 0xffff0000) >> 16;
7857
7858 if (profile == 0xbede) {
7859 /* We skip over the first 4 bytes as they are just for the one byte extension header */
7860 rtp_instance_parse_extmap_extensions(instance, rtp, read_area + hdrlen + 4, extensions_size);
7861 } else if (DEBUG_ATLEAST(1)) {
7862 if (profile == 0x505a) {
7863 ast_log(LOG_DEBUG, "Found Zfone extension in RTP stream - zrtp - not supported.\n");
7864 } else {
7865 /* SDP negotiated RTP extensions can not currently be output in logging */
7866 ast_log(LOG_DEBUG, "Found unknown RTP Extensions %x\n", profile);
7867 }
7868 }
7869
7870 hdrlen += extensions_size;
7871 hdrlen += 4;
7872 }
7873
7874 /* Make sure after we potentially mucked with the header length that it is once again valid */
7875 if (res < hdrlen) {
7876 ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d\n", res, hdrlen);
7878 }
7879
7880 /* Only non-bundled instances can change/learn the remote's SSRC implicitly. */
7881 if (!bundled) {
7882 /* Force a marker bit and change SSRC if the SSRC changes */
7883 if (rtp->themssrc_valid && rtp->themssrc != ssrc) {
7884 struct ast_frame *f, srcupdate = {
7887 };
7888
7889 if (!mark) {
7891 ast_debug(0, "(%p) RTP forcing Marker bit, because SSRC has changed\n", instance);
7892 }
7893 mark = 1;
7894 }
7895
7896 f = ast_frisolate(&srcupdate);
7898
7899 rtp->seedrxseqno = 0;
7900 rtp->rxcount = 0;
7901 rtp->rxoctetcount = 0;
7902 rtp->cycles = 0;
7903 prev_seqno = 0;
7904 rtp->last_seqno = 0;
7905 rtp->last_end_timestamp.ts = 0;
7906 rtp->last_end_timestamp.is_set = 0;
7907 if (rtp->rtcp) {
7908 rtp->rtcp->expected_prior = 0;
7909 rtp->rtcp->received_prior = 0;
7910 }
7911 }
7912
7913 rtp->themssrc = ssrc; /* Record their SSRC to put in future RR */
7914 rtp->themssrc_valid = 1;
7915 }
7916
7917 rtp->rxcount++;
7918 rtp->rxoctetcount += (res - hdrlen);
7919 if (rtp->rxcount == 1) {
7920 rtp->seedrxseqno = seqno;
7921 }
7922
7923 /* Do not schedule RR if RTCP isn't run */
7924 if (rtp->rtcp && !ast_sockaddr_isnull(&rtp->rtcp->them) && rtp->rtcp->schedid < 0) {
7925 /* Schedule transmission of Receiver Report */
7926 ao2_ref(instance, +1);
7928 if (rtp->rtcp->schedid < 0) {
7929 ao2_ref(instance, -1);
7930 ast_log(LOG_WARNING, "scheduling RTCP transmission failed.\n");
7931 }
7932 }
7933 if ((int)prev_seqno - (int)seqno > 100) /* if so it would indicate that the sender cycled; allow for misordering */
7934 rtp->cycles += RTP_SEQ_MOD;
7935
7936 /* If we are directly bridged to another instance send the audio directly out,
7937 * but only after updating core information about the received traffic so that
7938 * outgoing RTCP reflects it.
7939 */
7940 instance1 = ast_rtp_instance_get_bridged(instance);
7941 if (instance1
7942 && !bridge_p2p_rtp_write(instance, instance1, rtpheader, res, hdrlen)) {
7943 struct timeval rxtime;
7944 struct ast_frame *f;
7945
7946 /* Update statistics for jitter so they are correct in RTCP */
7947 calc_rxstamp_and_jitter(&rxtime, rtp, timestamp, mark);
7948
7949
7950 /* When doing P2P we don't need to raise any frames about SSRC change to the core */
7951 while ((f = AST_LIST_REMOVE_HEAD(&frames, frame_list)) != NULL) {
7952 ast_frfree(f);
7953 }
7954
7955 return &ast_null_frame;
7956 }
7957
7958 payload = ast_rtp_codecs_get_payload(ast_rtp_instance_get_codecs(instance), payloadtype);
7959 if (!payload) {
7960 /* Unknown payload type. */
7962 }
7963
7964 /* If the payload is not actually an Asterisk one but a special one pass it off to the respective handler */
7965 if (!payload->asterisk_format) {
7966 struct ast_frame *f = NULL;
7967 if (payload->rtp_code == AST_RTP_DTMF) {
7968 /* process_dtmf_rfc2833 may need to return multiple frames. We do this
7969 * by passing the pointer to the frame list to it so that the method
7970 * can append frames to the list as needed.
7971 */
7972 process_dtmf_rfc2833(instance, read_area + hdrlen, res - hdrlen, seqno, timestamp, payloadtype, mark, &frames);
7973 } else if (payload->rtp_code == AST_RTP_CISCO_DTMF) {
7974 f = process_dtmf_cisco(instance, read_area + hdrlen, res - hdrlen, seqno, timestamp, payloadtype, mark);
7975 } else if (payload->rtp_code == AST_RTP_CN) {
7976 f = process_cn_rfc3389(instance, read_area + hdrlen, res - hdrlen, seqno, timestamp, payloadtype, mark);
7977 } else {
7978 ast_log(LOG_NOTICE, "Unknown RTP codec %d received from '%s'\n",
7979 payloadtype,
7980 ast_sockaddr_stringify(remote_address));
7981 }
7982
7983 if (f) {
7985 }
7986 /* Even if no frame was returned by one of the above methods,
7987 * we may have a frame to return in our frame list
7988 */
7990 }
7991
7992 ao2_replace(rtp->lastrxformat, payload->format);
7993 ao2_replace(rtp->f.subclass.format, payload->format);
7994 switch (ast_format_get_type(rtp->f.subclass.format)) {
7997 break;
8000 break;
8002 rtp->f.frametype = AST_FRAME_TEXT;
8003 break;
8005 /* Fall through */
8006 default:
8007 ast_log(LOG_WARNING, "Unknown or unsupported media type: %s\n",
8009 return &ast_null_frame;
8010 }
8011
8012 if (rtp->dtmf_timeout && rtp->dtmf_timeout < timestamp) {
8013 rtp->dtmf_timeout = 0;
8014
8015 if (rtp->resp) {
8016 struct ast_frame *f;
8017 f = create_dtmf_frame(instance, AST_FRAME_DTMF_END, 0);
8019 rtp->resp = 0;
8020 rtp->dtmf_timeout = rtp->dtmf_duration = 0;
8022 return AST_LIST_FIRST(&frames);
8023 }
8024 }
8025
8026 rtp->f.src = "RTP";
8027 rtp->f.mallocd = 0;
8028 rtp->f.datalen = res - hdrlen;
8029 rtp->f.data.ptr = read_area + hdrlen;
8030 rtp->f.offset = hdrlen + AST_FRIENDLY_OFFSET;
8032 rtp->f.seqno = seqno;
8033 rtp->f.stream_num = rtp->stream_num;
8034
8036 && ((int)seqno - (prev_seqno + 1) > 0)
8037 && ((int)seqno - (prev_seqno + 1) < 10)) {
8038 unsigned char *data = rtp->f.data.ptr;
8039
8040 memmove(rtp->f.data.ptr+3, rtp->f.data.ptr, rtp->f.datalen);
8041 rtp->f.datalen +=3;
8042 *data++ = 0xEF;
8043 *data++ = 0xBF;
8044 *data = 0xBD;
8045 }
8046
8048 unsigned char *data = rtp->f.data.ptr;
8049 unsigned char *header_end;
8050 int num_generations;
8051 int header_length;
8052 int len;
8053 int diff =(int)seqno - (prev_seqno+1); /* if diff = 0, no drop*/
8054 int x;
8055
8057 header_end = memchr(data, ((*data) & 0x7f), rtp->f.datalen);
8058 if (header_end == NULL) {
8060 }
8061 header_end++;
8062
8063 header_length = header_end - data;
8064 num_generations = header_length / 4;
8065 len = header_length;
8066
8067 if (!diff) {
8068 for (x = 0; x < num_generations; x++)
8069 len += data[x * 4 + 3];
8070
8071 if (!(rtp->f.datalen - len))
8073
8074 rtp->f.data.ptr += len;
8075 rtp->f.datalen -= len;
8076 } else if (diff > num_generations && diff < 10) {
8077 len -= 3;
8078 rtp->f.data.ptr += len;
8079 rtp->f.datalen -= len;
8080
8081 data = rtp->f.data.ptr;
8082 *data++ = 0xEF;
8083 *data++ = 0xBF;
8084 *data = 0xBD;
8085 } else {
8086 for ( x = 0; x < num_generations - diff; x++)
8087 len += data[x * 4 + 3];
8088
8089 rtp->f.data.ptr += len;
8090 rtp->f.datalen -= len;
8091 }
8092 }
8093
8095 rtp->f.samples = ast_codec_samples_count(&rtp->f);
8097 ast_frame_byteswap_be(&rtp->f);
8098 }
8099 calc_rxstamp_and_jitter(&rtp->f.delivery, rtp, timestamp, mark);
8100 /* Add timing data to let ast_generic_bridge() put the frame into a jitterbuf */
8102 rtp->f.ts = timestamp / (ast_rtp_get_rate(rtp->f.subclass.format) / 1000);
8103 rtp->f.len = rtp->f.samples / ((ast_format_get_sample_rate(rtp->f.subclass.format) / 1000));
8105 /* Video -- samples is # of samples vs. 90000 */
8106 if (!rtp->lastividtimestamp)
8107 rtp->lastividtimestamp = timestamp;
8108 calc_rxstamp_and_jitter(&rtp->f.delivery, rtp, timestamp, mark);
8110 rtp->f.ts = timestamp / (ast_rtp_get_rate(rtp->f.subclass.format) / 1000);
8111 rtp->f.samples = timestamp - rtp->lastividtimestamp;
8112 rtp->lastividtimestamp = timestamp;
8113 rtp->f.delivery.tv_sec = 0;
8114 rtp->f.delivery.tv_usec = 0;
8115 /* Pass the RTP marker bit as bit */
8116 rtp->f.subclass.frame_ending = mark ? 1 : 0;
8118 /* TEXT -- samples is # of samples vs. 1000 */
8119 if (!rtp->lastitexttimestamp)
8120 rtp->lastitexttimestamp = timestamp;
8121 rtp->f.samples = timestamp - rtp->lastitexttimestamp;
8122 rtp->lastitexttimestamp = timestamp;
8123 rtp->f.delivery.tv_sec = 0;
8124 rtp->f.delivery.tv_usec = 0;
8125 } else {
8126 ast_log(LOG_WARNING, "Unknown or unsupported media type: %s\n",
8128 return &ast_null_frame;
8129 }
8130
8132 return AST_LIST_FIRST(&frames);
8133}
8134
8135#ifdef AST_DEVMODE
8136
8137struct rtp_drop_packets_data {
8138 /* Whether or not to randomize the number of packets to drop. */
8139 unsigned int use_random_num;
8140 /* Whether or not to randomize the time interval between packets drops. */
8141 unsigned int use_random_interval;
8142 /* The total number of packets to drop. If 'use_random_num' is true then this
8143 * value becomes the upper bound for a number of random packets to drop. */
8144 unsigned int num_to_drop;
8145 /* The current number of packets that have been dropped during an interval. */
8146 unsigned int num_dropped;
8147 /* The optional interval to use between packet drops. If 'use_random_interval'
8148 * is true then this values becomes the upper bound for a random interval used. */
8149 struct timeval interval;
8150 /* The next time a packet drop should be triggered. */
8151 struct timeval next;
8152 /* An optional IP address from which to drop packets from. */
8153 struct ast_sockaddr addr;
8154 /* The optional port from which to drop packets from. */
8155 unsigned int port;
8156};
8157
8158static struct rtp_drop_packets_data drop_packets_data;
8159
8160static void drop_packets_data_update(struct timeval tv)
8161{
8162 /*
8163 * num_dropped keeps up with the number of packets that have been dropped for a
8164 * given interval. Once the specified number of packets have been dropped and
8165 * the next time interval is ready to trigger then set this number to zero (drop
8166 * the next 'n' packets up to 'num_to_drop'), or if 'use_random_num' is set to
8167 * true then set to a random number between zero and 'num_to_drop'.
8168 */
8169 drop_packets_data.num_dropped = drop_packets_data.use_random_num ?
8170 ast_random() % drop_packets_data.num_to_drop : 0;
8171
8172 /*
8173 * A specified number of packets can be dropped at a given interval (e.g every
8174 * 30 seconds). If 'use_random_interval' is false simply add the interval to
8175 * the given time to get the next trigger point. If set to true, then get a
8176 * random time between the given time and up to the specified interval.
8177 */
8178 if (drop_packets_data.use_random_interval) {
8179 /* Calculate as a percentage of the specified drop packets interval */
8180 struct timeval interval = ast_time_create_by_unit(ast_time_tv_to_usec(
8181 &drop_packets_data.interval) * ((double)(ast_random() % 100 + 1) / 100),
8183
8184 drop_packets_data.next = ast_tvadd(tv, interval);
8185 } else {
8186 drop_packets_data.next = ast_tvadd(tv, drop_packets_data.interval);
8187 }
8188}
8189
8190static int should_drop_packets(struct ast_sockaddr *addr)
8191{
8192 struct timeval tv;
8193
8194 if (!drop_packets_data.num_to_drop) {
8195 return 0;
8196 }
8197
8198 /*
8199 * If an address has been specified then filter on it, and also the port if
8200 * it too was included.
8201 */
8202 if (!ast_sockaddr_isnull(&drop_packets_data.addr) &&
8203 (drop_packets_data.port ?
8204 ast_sockaddr_cmp(&drop_packets_data.addr, addr) :
8205 ast_sockaddr_cmp_addr(&drop_packets_data.addr, addr)) != 0) {
8206 /* Address and/or port does not match */
8207 return 0;
8208 }
8209
8210 /* Keep dropping packets until we've reached the total to drop */
8211 if (drop_packets_data.num_dropped < drop_packets_data.num_to_drop) {
8212 ++drop_packets_data.num_dropped;
8213 return 1;
8214 }
8215
8216 /*
8217 * Once the set number of packets has been dropped check to see if it's
8218 * time to drop more.
8219 */
8220
8221 if (ast_tvzero(drop_packets_data.interval)) {
8222 /* If no interval then drop specified number of packets and be done */
8223 drop_packets_data.num_to_drop = 0;
8224 return 0;
8225 }
8226
8227 tv = ast_tvnow();
8228 if (ast_tvcmp(tv, drop_packets_data.next) == -1) {
8229 /* Still waiting for the next time interval to elapse */
8230 return 0;
8231 }
8232
8233 /*
8234 * The next time interval has elapsed so update the tracking structure
8235 * in order to start dropping more packets, and figure out when the next
8236 * time interval is.
8237 */
8238 drop_packets_data_update(tv);
8239 return 1;
8240}
8241
8242#endif
8243
8244/*! \pre instance is locked */
8245static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtcp)
8246{
8247 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
8248 struct ast_srtp *srtp;
8250 struct ast_sockaddr addr;
8251 int res, hdrlen = 12, version, payloadtype;
8252 unsigned char *read_area = rtp->rawdata + AST_FRIENDLY_OFFSET;
8253 size_t read_area_size = sizeof(rtp->rawdata) - AST_FRIENDLY_OFFSET;
8254 unsigned int *rtpheader = (unsigned int*)(read_area), seqno, ssrc, timestamp, prev_seqno;
8255 struct ast_sockaddr remote_address = { {0,} };
8256 struct frame_list frames;
8257 struct ast_frame *frame;
8258 unsigned int bundled;
8259
8260 /* If this is actually RTCP let's hop on over and handle it */
8261 if (rtcp) {
8262 if (rtp->rtcp && rtp->rtcp->type == AST_RTP_INSTANCE_RTCP_STANDARD) {
8263 return ast_rtcp_read(instance);
8264 }
8265 return &ast_null_frame;
8266 }
8267
8268 /* Actually read in the data from the socket */
8269 if ((res = rtp_recvfrom(instance, read_area, read_area_size, 0,
8270 &addr)) < 0) {
8271 if (res == RTP_DTLS_ESTABLISHED) {
8274 return &rtp->f;
8275 }
8276
8277 ast_assert(errno != EBADF);
8278 if (errno != EAGAIN) {
8279 ast_log(LOG_WARNING, "RTP Read error: %s. Hanging up.\n",
8280 (errno) ? strerror(errno) : "Unspecified");
8281 return NULL;
8282 }
8283 return &ast_null_frame;
8284 }
8285
8286 /* If this was handled by the ICE session don't do anything */
8287 if (!res) {
8288 return &ast_null_frame;
8289 }
8290
8291 /* This could be a multiplexed RTCP packet. If so, be sure to interpret it correctly */
8292 if (rtcp_mux(rtp, read_area)) {
8293 return ast_rtcp_interpret(instance, ast_rtp_instance_get_srtp(instance, 1), read_area, res, &addr);
8294 }
8295
8296 /* Make sure the data that was read in is actually enough to make up an RTP packet */
8297 if (res < hdrlen) {
8298 /* If this is a keepalive containing only nulls, don't bother with a warning */
8299 int i;
8300 for (i = 0; i < res; ++i) {
8301 if (read_area[i] != '\0') {
8302 ast_log(LOG_WARNING, "RTP Read too short\n");
8303 return &ast_null_frame;
8304 }
8305 }
8306 return &ast_null_frame;
8307 }
8308
8309 /* Get fields and verify this is an RTP packet */
8310 seqno = ntohl(rtpheader[0]);
8311
8312 ast_rtp_instance_get_remote_address(instance, &remote_address);
8313
8314 if (!(version = (seqno & 0xC0000000) >> 30)) {
8315 struct sockaddr_in addr_tmp;
8316 struct ast_sockaddr addr_v4;
8317 if (ast_sockaddr_is_ipv4(&addr)) {
8318 ast_sockaddr_to_sin(&addr, &addr_tmp);
8319 } else if (ast_sockaddr_ipv4_mapped(&addr, &addr_v4)) {
8320 ast_debug_stun(1, "(%p) STUN using IPv6 mapped address %s\n",
8321 instance, ast_sockaddr_stringify(&addr));
8322 ast_sockaddr_to_sin(&addr_v4, &addr_tmp);
8323 } else {
8324 ast_debug_stun(1, "(%p) STUN cannot do for non IPv4 address %s\n",
8325 instance, ast_sockaddr_stringify(&addr));
8326 return &ast_null_frame;
8327 }
8328 if ((ast_stun_handle_packet(rtp->s, &addr_tmp, read_area, res, NULL, NULL) == AST_STUN_ACCEPT) &&
8329 ast_sockaddr_isnull(&remote_address)) {
8330 ast_sockaddr_from_sin(&addr, &addr_tmp);
8331 ast_rtp_instance_set_remote_address(instance, &addr);
8332 }
8333 return &ast_null_frame;
8334 }
8335
8336 /* If the version is not what we expected by this point then just drop the packet */
8337 if (version != 2) {
8338 return &ast_null_frame;
8339 }
8340
8341 /* We use the SSRC to determine what RTP instance this packet is actually for */
8342 ssrc = ntohl(rtpheader[2]);
8343
8344 /* We use the SRTP data from the provided instance that it came in on, not the child */
8345 srtp = ast_rtp_instance_get_srtp(instance, 0);
8346
8347 /* Determine the appropriate instance for this */
8348 child = rtp_find_instance_by_packet_source_ssrc(instance, rtp, ssrc);
8349 if (!child) {
8350 /* Neither the bundled parent nor any child has this SSRC */
8351 return &ast_null_frame;
8352 }
8353 if (child != instance) {
8354 /* It is safe to hold the child lock while holding the parent lock, we guarantee that the locking order
8355 * is always parent->child or that the child lock is not held when acquiring the parent lock.
8356 */
8357 ao2_lock(child);
8358 instance = child;
8359 rtp = ast_rtp_instance_get_data(instance);
8360 } else {
8361 /* The child is the parent! We don't need to unlock it. */
8362 child = NULL;
8363 }
8364
8365 /* If strict RTP protection is enabled see if we need to learn the remote address or if we need to drop the packet */
8366 switch (rtp->strict_rtp_state) {
8367 case STRICT_RTP_LEARN:
8368 /*
8369 * Scenario setup:
8370 * PartyA -- Ast1 -- Ast2 -- PartyB
8371 *
8372 * The learning timeout is necessary for Ast1 to handle the above
8373 * setup where PartyA calls PartyB and Ast2 initiates direct media
8374 * between Ast1 and PartyB. Ast1 may lock onto the Ast2 stream and
8375 * never learn the PartyB stream when it starts. The timeout makes
8376 * Ast1 stay in the learning state long enough to see and learn the
8377 * RTP stream from PartyB.
8378 *
8379 * To mitigate against attack, the learning state cannot switch
8380 * streams while there are competing streams. The competing streams
8381 * interfere with each other's qualification. Once we accept a
8382 * stream and reach the timeout, an attacker cannot interfere
8383 * anymore.
8384 *
8385 * Here are a few scenarios and each one assumes that the streams
8386 * are continuous:
8387 *
8388 * 1) We already have a known stream source address and the known
8389 * stream wants to change to a new source address. An attacking
8390 * stream will block learning the new stream source. After the
8391 * timeout we re-lock onto the original stream source address which
8392 * likely went away. The result is one way audio.
8393 *
8394 * 2) We already have a known stream source address and the known
8395 * stream doesn't want to change source addresses. An attacking
8396 * stream will not be able to replace the known stream. After the
8397 * timeout we re-lock onto the known stream. The call is not
8398 * affected.
8399 *
8400 * 3) We don't have a known stream source address. This presumably
8401 * is the start of a call. Competing streams will result in staying
8402 * in learning mode until a stream becomes the victor and we reach
8403 * the timeout. We cannot exit learning if we have no known stream
8404 * to lock onto. The result is one way audio until there is a victor.
8405 *
8406 * If we learn a stream source address before the timeout we will be
8407 * in scenario 1) or 2) when a competing stream starts.
8408 */
8411 ast_verb(4, "%p -- Strict RTP learning complete - Locking on source address %s\n",
8413 ast_test_suite_event_notify("STRICT_RTP_LEARN", "Source: %s",
8416 } else {
8417 struct ast_sockaddr target_address;
8418
8419 if (!ast_sockaddr_cmp(&rtp->strict_rtp_address, &addr)) {
8420 /*
8421 * We are open to learning a new address but have received
8422 * traffic from the current address, accept it and reset
8423 * the learning counts for a new source. When no more
8424 * current source packets arrive a new source can take over
8425 * once sufficient traffic is received.
8426 */
8428 break;
8429 }
8430
8431 /*
8432 * We give preferential treatment to the requested target address
8433 * (negotiated SDP address) where we are to send our RTP. However,
8434 * the other end has no obligation to send from that address even
8435 * though it is practically a requirement when NAT is involved.
8436 */
8437 ast_rtp_instance_get_requested_target_address(instance, &target_address);
8438 if (!ast_sockaddr_cmp(&target_address, &addr)) {
8439 /* Accept the negotiated target RTP stream as the source */
8440 ast_verb(4, "%p -- Strict RTP switching to RTP target address %s as source\n",
8441 rtp, ast_sockaddr_stringify(&addr));
8444 break;
8445 }
8446
8447 /*
8448 * Trying to learn a new address. If we pass a probationary period
8449 * with it, that means we've stopped getting RTP from the original
8450 * source and we should switch to it.
8451 */
8454 struct ast_rtp_codecs *codecs;
8455
8459 ast_verb(4, "%p -- Strict RTP qualifying stream type: %s\n",
8461 }
8462 if (!rtp_learning_rtp_seq_update(&rtp->rtp_source_learn, seqno)) {
8463 /* Accept the new RTP stream */
8464 ast_verb(4, "%p -- Strict RTP switching source address to %s\n",
8465 rtp, ast_sockaddr_stringify(&addr));
8468 break;
8469 }
8470 /* Not ready to accept the RTP stream candidate */
8471 ast_debug_rtp(1, "(%p) RTP %p -- Received packet from %s, dropping due to strict RTP protection. Will switch to it in %d packets.\n",
8472 instance, rtp, ast_sockaddr_stringify(&addr), rtp->rtp_source_learn.packets);
8473 } else {
8474 /*
8475 * This is either an attacking stream or
8476 * the start of the expected new stream.
8477 */
8480 ast_debug_rtp(1, "(%p) RTP %p -- Received packet from %s, dropping due to strict RTP protection. Qualifying new stream.\n",
8481 instance, rtp, ast_sockaddr_stringify(&addr));
8482 }
8483 return &ast_null_frame;
8484 }
8485 /* Fall through */
8486 case STRICT_RTP_CLOSED:
8487 /*
8488 * We should not allow a stream address change if the SSRC matches
8489 * once strictrtp learning is closed. Any kind of address change
8490 * like this should have happened while we were in the learning
8491 * state. We do not want to allow the possibility of an attacker
8492 * interfering with the RTP stream after the learning period.
8493 * An attacker could manage to get an RTCP packet redirected to
8494 * them which can contain the SSRC value.
8495 */
8496 if (!ast_sockaddr_cmp(&rtp->strict_rtp_address, &addr)) {
8497 break;
8498 }
8499 ast_debug_rtp(1, "(%p) RTP %p -- Received packet from %s, dropping due to strict RTP protection.\n",
8500 instance, rtp, ast_sockaddr_stringify(&addr));
8501#ifdef TEST_FRAMEWORK
8502 {
8503 static int strict_rtp_test_event = 1;
8504 if (strict_rtp_test_event) {
8505 ast_test_suite_event_notify("STRICT_RTP_CLOSED", "Source: %s",
8506 ast_sockaddr_stringify(&addr));
8507 strict_rtp_test_event = 0; /* Only run this event once to prevent possible spam */
8508 }
8509 }
8510#endif
8511 return &ast_null_frame;
8512 case STRICT_RTP_OPEN:
8513 break;
8514 }
8515
8516 /* If symmetric RTP is enabled see if the remote side is not what we expected and change where we are sending audio */
8518 if (ast_sockaddr_cmp(&remote_address, &addr)) {
8519 /* do not update the originally given address, but only the remote */
8521 ast_sockaddr_copy(&remote_address, &addr);
8522 if (rtp->rtcp && rtp->rtcp->type == AST_RTP_INSTANCE_RTCP_STANDARD) {
8523 ast_sockaddr_copy(&rtp->rtcp->them, &addr);
8525 }
8528 ast_debug(0, "(%p) RTP NAT: Got audio from other end. Now sending to address %s\n",
8529 instance, ast_sockaddr_stringify(&remote_address));
8530 }
8531 }
8532
8533 /* Pull out the various other fields we will need */
8534 payloadtype = (seqno & 0x7f0000) >> 16;
8535 seqno &= 0xffff;
8536 timestamp = ntohl(rtpheader[1]);
8537
8538#ifdef AST_DEVMODE
8539 if (should_drop_packets(&addr)) {
8540 ast_debug(0, "(%p) RTP: drop received packet from %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6d)\n",
8541 instance, ast_sockaddr_stringify(&addr), payloadtype, seqno, timestamp, res - hdrlen);
8542 return &ast_null_frame;
8543 }
8544#endif
8545
8546 if (rtp_debug_test_addr(&addr)) {
8547 ast_verbose("Got RTP packet from %s (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6d)\n",
8549 payloadtype, seqno, timestamp, res - hdrlen);
8550 }
8551
8553
8554 bundled = (child || AST_VECTOR_SIZE(&rtp->ssrc_mapping)) ? 1 : 0;
8555
8556 prev_seqno = rtp->lastrxseqno;
8557 /* We need to save lastrxseqno for use by jitter before resetting it. */
8558 rtp->prevrxseqno = rtp->lastrxseqno;
8559 rtp->lastrxseqno = seqno;
8560
8561 if (!rtp->recv_buffer) {
8562 /* If there is no receive buffer then we can pass back the frame directly */
8563 frame = ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno, bundled);
8565 return AST_LIST_FIRST(&frames);
8566 } else if (rtp->expectedrxseqno == -1 || seqno == rtp->expectedrxseqno) {
8567 rtp->expectedrxseqno = seqno + 1;
8568
8569 /* We've cycled over, so go back to 0 */
8570 if (rtp->expectedrxseqno == SEQNO_CYCLE_OVER) {
8571 rtp->expectedrxseqno = 0;
8572 }
8573
8574 /* If there are no buffered packets that will be placed after this frame then we can
8575 * return it directly without duplicating it.
8576 */
8578 frame = ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno, bundled);
8580 return AST_LIST_FIRST(&frames);
8581 }
8582
8585 ast_debug_rtp(2, "(%p) RTP Packet with sequence number '%d' on instance is no longer missing\n",
8586 instance, seqno);
8587 }
8588
8589 /* If we don't have the next packet after this we can directly return the frame, as there is no
8590 * chance it will be overwritten.
8591 */
8593 frame = ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno, bundled);
8595 return AST_LIST_FIRST(&frames);
8596 }
8597
8598 /* Otherwise we need to dupe the frame so that the potential processing of frames placed after
8599 * it do not overwrite the data. You may be thinking that we could just add the current packet
8600 * to the head of the frames list and avoid having to duplicate it but this would result in out
8601 * of order packet processing by libsrtp which we are trying to avoid.
8602 */
8603 frame = ast_frdup(ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno, bundled));
8604 if (frame) {
8606 prev_seqno = seqno;
8607 }
8608
8609 /* Add any additional packets that we have buffered and that are available */
8610 while (ast_data_buffer_count(rtp->recv_buffer)) {
8611 struct ast_rtp_rtcp_nack_payload *payload;
8612
8614 if (!payload) {
8615 break;
8616 }
8617
8618 frame = ast_frdup(ast_rtp_interpret(instance, srtp, &addr, payload->buf, payload->size, prev_seqno, bundled));
8619 ast_free(payload);
8620
8621 if (!frame) {
8622 /* If this packet can't be interpreted due to being out of memory we return what we have and assume
8623 * that we will determine it is a missing packet later and NACK for it.
8624 */
8625 return AST_LIST_FIRST(&frames);
8626 }
8627
8628 ast_debug_rtp(2, "(%p) RTP pulled buffered packet with sequence number '%d' to additionally return\n",
8629 instance, frame->seqno);
8631 prev_seqno = rtp->expectedrxseqno;
8632 rtp->expectedrxseqno++;
8633 if (rtp->expectedrxseqno == SEQNO_CYCLE_OVER) {
8634 rtp->expectedrxseqno = 0;
8635 }
8636 }
8637
8638 return AST_LIST_FIRST(&frames);
8639 } else if ((((seqno - rtp->expectedrxseqno) > 100) && timestamp > rtp->lastividtimestamp) ||
8641 int inserted = 0;
8642
8643 /* We have a large number of outstanding buffered packets or we've jumped far ahead in time.
8644 * To compensate we dump what we have in the buffer and place the current packet in a logical
8645 * spot. In the case of video we also require a full frame to give the decoding side a fighting
8646 * chance.
8647 */
8648
8650 ast_debug_rtp(2, "(%p) RTP source has wild gap or packet loss, sending FIR\n",
8651 instance);
8652 rtp_write_rtcp_fir(instance, rtp, &remote_address);
8653 }
8654
8655 /* This works by going through the progression of the sequence number retrieving buffered packets
8656 * or inserting the current received packet until we've run out of packets. This ensures that the
8657 * packets are in the correct sequence number order.
8658 */
8659 while (ast_data_buffer_count(rtp->recv_buffer)) {
8660 struct ast_rtp_rtcp_nack_payload *payload;
8661
8662 /* If the packet we received is the one we are expecting at this point then add it in */
8663 if (rtp->expectedrxseqno == seqno) {
8664 frame = ast_frdup(ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno, bundled));
8665 if (frame) {
8667 prev_seqno = seqno;
8668 ast_debug_rtp(2, "(%p) RTP inserted just received packet with sequence number '%d' in correct order\n",
8669 instance, seqno);
8670 }
8671 /* It is possible due to packet retransmission for this packet to also exist in the receive
8672 * buffer so we explicitly remove it in case this occurs, otherwise the receive buffer will
8673 * never be empty.
8674 */
8675 payload = (struct ast_rtp_rtcp_nack_payload *)ast_data_buffer_remove(rtp->recv_buffer, seqno);
8676 if (payload) {
8677 ast_free(payload);
8678 }
8679 rtp->expectedrxseqno++;
8680 if (rtp->expectedrxseqno == SEQNO_CYCLE_OVER) {
8681 rtp->expectedrxseqno = 0;
8682 }
8683 inserted = 1;
8684 continue;
8685 }
8686
8688 if (payload) {
8689 frame = ast_frdup(ast_rtp_interpret(instance, srtp, &addr, payload->buf, payload->size, prev_seqno, bundled));
8690 if (frame) {
8692 prev_seqno = rtp->expectedrxseqno;
8693 ast_debug_rtp(2, "(%p) RTP emptying queue and returning packet with sequence number '%d'\n",
8694 instance, frame->seqno);
8695 }
8696 ast_free(payload);
8697 }
8698
8699 rtp->expectedrxseqno++;
8700 if (rtp->expectedrxseqno == SEQNO_CYCLE_OVER) {
8701 rtp->expectedrxseqno = 0;
8702 }
8703 }
8704
8705 if (!inserted) {
8706 /* This current packet goes after them, and we assume that packets going forward will follow
8707 * that new sequence number increment. It is okay for this to not be duplicated as it is guaranteed
8708 * to be the last packet processed right now and it is also guaranteed that it will always return
8709 * non-NULL.
8710 */
8711 frame = ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno, bundled);
8713 rtp->expectedrxseqno = seqno + 1;
8714 if (rtp->expectedrxseqno == SEQNO_CYCLE_OVER) {
8715 rtp->expectedrxseqno = 0;
8716 }
8717
8718 ast_debug_rtp(2, "(%p) RTP adding just received packet with sequence number '%d' to end of dumped queue\n",
8719 instance, seqno);
8720 }
8721
8722 /* When we flush increase our chance for next time by growing the receive buffer when possible
8723 * by how many packets we missed, to give ourselves a bit more breathing room.
8724 */
8727 ast_debug_rtp(2, "(%p) RTP receive buffer is now at maximum of %zu\n", instance, ast_data_buffer_max(rtp->recv_buffer));
8728
8729 /* As there is such a large gap we don't want to flood the order side with missing packets, so we
8730 * give up and start anew.
8731 */
8733
8734 return AST_LIST_FIRST(&frames);
8735 }
8736
8737 /* We're finished with the frames list */
8739
8740 /* Determine if the received packet is from the last OLD_PACKET_COUNT (1000 by default) packets or not.
8741 * For the case where the received sequence number exceeds that of the expected sequence number we calculate
8742 * the past sequence number that would be 1000 sequence numbers ago. If the received sequence number
8743 * exceeds or meets that then it is within OLD_PACKET_COUNT packets ago. For example if the expected
8744 * sequence number is 100 and we receive 65530, then it would be considered old. This is because
8745 * 65535 - 1000 + 100 = 64635 which gives us the sequence number at which we would consider the packets
8746 * old. Since 65530 is above that, it would be considered old.
8747 * For the case where the received sequence number is less than the expected sequence number we can do
8748 * a simple subtraction to see if it is 1000 packets ago or not.
8749 */
8750 if ((seqno < rtp->expectedrxseqno && ((rtp->expectedrxseqno - seqno) <= OLD_PACKET_COUNT)) ||
8751 (seqno > rtp->expectedrxseqno && (seqno >= (65535 - OLD_PACKET_COUNT + rtp->expectedrxseqno)))) {
8752 /* If this is a packet from the past then we have received a duplicate packet, so just drop it */
8753 ast_debug_rtp(2, "(%p) RTP received an old packet with sequence number '%d', dropping it\n",
8754 instance, seqno);
8755 return &ast_null_frame;
8756 } else if (ast_data_buffer_get(rtp->recv_buffer, seqno)) {
8757 /* If this is a packet we already have buffered then it is a duplicate, so just drop it */
8758 ast_debug_rtp(2, "(%p) RTP received a duplicate transmission of packet with sequence number '%d', dropping it\n",
8759 instance, seqno);
8760 return &ast_null_frame;
8761 } else {
8762 /* This is an out of order packet from the future */
8763 struct ast_rtp_rtcp_nack_payload *payload;
8764 int missing_seqno;
8765 int remove_failed;
8766 unsigned int missing_seqnos_added = 0;
8767
8768 ast_debug_rtp(2, "(%p) RTP received an out of order packet with sequence number '%d' while expecting '%d' from the future\n",
8769 instance, seqno, rtp->expectedrxseqno);
8770
8771 payload = ast_malloc(sizeof(*payload) + res);
8772 if (!payload) {
8773 /* If the payload can't be allocated then we can't defer this packet right now.
8774 * Instead of dumping what we have we pretend we lost this packet. It will then
8775 * get NACKed later or the existing buffer will be returned entirely. Well, we may
8776 * try since we're seemingly out of memory. It's a bad situation all around and
8777 * packets are likely to get lost anyway.
8778 */
8779 return &ast_null_frame;
8780 }
8781
8782 payload->size = res;
8783 memcpy(payload->buf, rtpheader, res);
8784 if (ast_data_buffer_put(rtp->recv_buffer, seqno, payload) == -1) {
8785 ast_free(payload);
8786 }
8787
8788 /* If this sequence number is removed that means we had a gap and this packet has filled it in
8789 * some. Since it was part of the gap we will have already added any other missing sequence numbers
8790 * before it (and possibly after it) to the vector so we don't need to do that again. Note that
8791 * remove_failed will be set to -1 if the sequence number isn't removed, and 0 if it is.
8792 */
8793 remove_failed = AST_VECTOR_REMOVE_CMP_ORDERED(&rtp->missing_seqno, seqno, find_by_value,
8795 if (!remove_failed) {
8796 ast_debug_rtp(2, "(%p) RTP packet with sequence number '%d' is no longer missing\n",
8797 instance, seqno);
8798 }
8799
8800 /* The missing sequence number code works by taking the sequence number of the
8801 * packet we've just received and going backwards until we hit the sequence number
8802 * of the last packet we've received. While doing so we check to make sure that the
8803 * sequence number is not already missing and that it is not already buffered.
8804 */
8805 missing_seqno = seqno;
8806 while (remove_failed) {
8807 missing_seqno -= 1;
8808
8809 /* If we've cycled backwards then start back at the top */
8810 if (missing_seqno < 0) {
8811 missing_seqno = 65535;
8812 }
8813
8814 /* We've gone backwards enough such that we've hit the previous sequence number */
8815 if (missing_seqno == prev_seqno) {
8816 break;
8817 }
8818
8819 /* We don't want missing sequence number duplicates. If, for some reason,
8820 * packets are really out of order, we could end up in this scenario:
8821 *
8822 * We are expecting sequence number 100
8823 * We receive sequence number 105
8824 * Sequence numbers 100 through 104 get added to the vector
8825 * We receive sequence number 101 (this section is skipped)
8826 * We receive sequence number 103
8827 * Sequence number 102 is added to the vector
8828 *
8829 * This will prevent the duplicate from being added.
8830 */
8831 if (AST_VECTOR_GET_CMP(&rtp->missing_seqno, missing_seqno,
8832 find_by_value)) {
8833 continue;
8834 }
8835
8836 /* If this packet has been buffered already then don't count it amongst the
8837 * missing.
8838 */
8839 if (ast_data_buffer_get(rtp->recv_buffer, missing_seqno)) {
8840 continue;
8841 }
8842
8843 ast_debug_rtp(2, "(%p) RTP added missing sequence number '%d'\n",
8844 instance, missing_seqno);
8845 AST_VECTOR_ADD_SORTED(&rtp->missing_seqno, missing_seqno,
8847 missing_seqnos_added++;
8848 }
8849
8850 /* When we add a large number of missing sequence numbers we assume there was a substantial
8851 * gap in reception so we trigger an immediate NACK. When our data buffer is 1/4 full we
8852 * assume that the packets aren't just out of order but have actually been lost. At 1/2
8853 * full we get more aggressive and ask for retransmission when we get a new packet.
8854 * To get them back we construct and send a NACK causing the sender to retransmit them.
8855 */
8856 if (missing_seqnos_added >= MISSING_SEQNOS_ADDED_TRIGGER ||
8859 int packet_len = 0;
8860 int res = 0;
8861 int ice;
8862 int sr;
8863 size_t data_size = AST_UUID_STR_LEN + 128 + (AST_VECTOR_SIZE(&rtp->missing_seqno) * 4);
8864 RAII_VAR(unsigned char *, rtcpheader, NULL, ast_free_ptr);
8865 RAII_VAR(struct ast_rtp_rtcp_report *, rtcp_report,
8867 ao2_cleanup);
8868
8869 /* Sufficient space for RTCP headers and report, SDES with CNAME, NACK header,
8870 * and worst case 4 bytes per missing sequence number.
8871 */
8872 rtcpheader = ast_malloc(sizeof(*rtcpheader) + data_size);
8873 if (!rtcpheader) {
8874 ast_debug_rtcp(1, "(%p) RTCP failed to allocate memory for NACK\n", instance);
8875 return &ast_null_frame;
8876 }
8877
8878 memset(rtcpheader, 0, data_size);
8879
8880 res = ast_rtcp_generate_compound_prefix(instance, rtcpheader, rtcp_report, &sr);
8881
8882 if (res == 0 || res == 1) {
8883 return &ast_null_frame;
8884 }
8885
8886 packet_len += res;
8887
8888 res = ast_rtcp_generate_nack(instance, rtcpheader + packet_len);
8889
8890 if (res == 0) {
8891 ast_debug_rtcp(1, "(%p) RTCP failed to construct NACK, stopping here\n", instance);
8892 return &ast_null_frame;
8893 }
8894
8895 packet_len += res;
8896
8897 res = rtcp_sendto(instance, rtcpheader, packet_len, 0, &remote_address, &ice);
8898 if (res < 0) {
8899 ast_debug_rtcp(1, "(%p) RTCP failed to send NACK request out\n", instance);
8900 } else {
8901 ast_debug_rtcp(2, "(%p) RTCP sending a NACK request to get missing packets\n", instance);
8902 /* Update RTCP SR/RR statistics */
8903 ast_rtcp_calculate_sr_rr_statistics(instance, rtcp_report, remote_address, ice, sr);
8904 }
8905 }
8906 }
8907
8908 return &ast_null_frame;
8909}
8910
8911/*! \pre instance is locked */
8912static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value)
8913{
8914 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
8915
8916 if (property == AST_RTP_PROPERTY_RTCP) {
8917 if (value) {
8918 struct ast_sockaddr local_addr;
8919
8920 if (rtp->rtcp && rtp->rtcp->type == value) {
8921 ast_debug_rtcp(1, "(%p) RTCP ignoring duplicate property\n", instance);
8922 return;
8923 }
8924
8925 if (!rtp->rtcp) {
8926 rtp->rtcp = ast_calloc(1, sizeof(*rtp->rtcp));
8927 if (!rtp->rtcp) {
8928 return;
8929 }
8930 rtp->rtcp->s = -1;
8931#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
8932 rtp->rtcp->dtls.timeout_timer = -1;
8933#endif
8934 rtp->rtcp->schedid = -1;
8935 }
8936
8937 rtp->rtcp->type = value;
8938
8939 /* Grab the IP address and port we are going to use */
8940 ast_rtp_instance_get_local_address(instance, &rtp->rtcp->us);
8943 ast_sockaddr_port(&rtp->rtcp->us) + 1);
8944 }
8945
8946 ast_sockaddr_copy(&local_addr, &rtp->rtcp->us);
8947 if (!ast_find_ourip(&local_addr, &rtp->rtcp->us, 0)) {
8948 ast_sockaddr_set_port(&local_addr, ast_sockaddr_port(&rtp->rtcp->us));
8949 } else {
8950 /* Failed to get local address reset to use default. */
8951 ast_sockaddr_copy(&local_addr, &rtp->rtcp->us);
8952 }
8953
8956 if (!rtp->rtcp->local_addr_str) {
8957 ast_free(rtp->rtcp);
8958 rtp->rtcp = NULL;
8959 return;
8960 }
8961
8963 /* We're either setting up RTCP from scratch or
8964 * switching from MUX. Either way, we won't have
8965 * a socket set up, and we need to set it up
8966 */
8967 if ((rtp->rtcp->s = create_new_socket("RTCP", &rtp->rtcp->us)) < 0) {
8968 ast_debug_rtcp(1, "(%p) RTCP failed to create a new socket\n", instance);
8970 ast_free(rtp->rtcp);
8971 rtp->rtcp = NULL;
8972 return;
8973 }
8974
8975 /* 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 */
8976 if (ast_bind(rtp->rtcp->s, &rtp->rtcp->us)) {
8977 ast_debug_rtcp(1, "(%p) RTCP failed to setup RTP instance\n", instance);
8978 close(rtp->rtcp->s);
8980 ast_free(rtp->rtcp);
8981 rtp->rtcp = NULL;
8982 return;
8983 }
8984#ifdef HAVE_PJPROJECT
8985 if (rtp->ice) {
8986 rtp_add_candidates_to_ice(instance, rtp, &rtp->rtcp->us, ast_sockaddr_port(&rtp->rtcp->us), AST_RTP_ICE_COMPONENT_RTCP, TRANSPORT_SOCKET_RTCP);
8987 }
8988#endif
8989#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
8990 dtls_setup_rtcp(instance);
8991#endif
8992 } else {
8993 struct ast_sockaddr addr;
8994 /* RTCPMUX uses the same socket as RTP. If we were previously using standard RTCP
8995 * then close the socket we previously created.
8996 *
8997 * It may seem as though there is a possible race condition here where we might try
8998 * to close the RTCP socket while it is being used to send data. However, this is not
8999 * a problem in practice since setting and adjusting of RTCP properties happens prior
9000 * to activating RTP. It is not until RTP is activated that timers start for RTCP
9001 * transmission
9002 */
9003 if (rtp->rtcp->s > -1 && rtp->rtcp->s != rtp->s) {
9004 close(rtp->rtcp->s);
9005 }
9006 rtp->rtcp->s = rtp->s;
9007 ast_rtp_instance_get_remote_address(instance, &addr);
9008 ast_sockaddr_copy(&rtp->rtcp->them, &addr);
9009#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
9010 if (rtp->rtcp->dtls.ssl && rtp->rtcp->dtls.ssl != rtp->dtls.ssl) {
9011 SSL_free(rtp->rtcp->dtls.ssl);
9012 }
9013 rtp->rtcp->dtls.ssl = rtp->dtls.ssl;
9014#endif
9015 }
9016
9017 ast_debug_rtcp(1, "(%s) RTCP setup on RTP instance\n",
9019 } else {
9020 if (rtp->rtcp) {
9021 if (rtp->rtcp->schedid > -1) {
9022 ao2_unlock(instance);
9023 if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
9024 /* Successfully cancelled scheduler entry. */
9025 ao2_ref(instance, -1);
9026 } else {
9027 /* Unable to cancel scheduler entry */
9028 ast_debug_rtcp(1, "(%p) RTCP failed to tear down RTCP\n", instance);
9029 ao2_lock(instance);
9030 return;
9031 }
9032 ao2_lock(instance);
9033 rtp->rtcp->schedid = -1;
9034 }
9035 if (rtp->transport_wide_cc.schedid > -1) {
9036 ao2_unlock(instance);
9037 if (!ast_sched_del(rtp->sched, rtp->transport_wide_cc.schedid)) {
9038 ao2_ref(instance, -1);
9039 } else {
9040 ast_debug_rtcp(1, "(%p) RTCP failed to tear down transport-cc feedback\n", instance);
9041 ao2_lock(instance);
9042 return;
9043 }
9044 ao2_lock(instance);
9045 rtp->transport_wide_cc.schedid = -1;
9046 }
9047 if (rtp->rtcp->s > -1 && rtp->rtcp->s != rtp->s) {
9048 close(rtp->rtcp->s);
9049 }
9050#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
9051 ao2_unlock(instance);
9052 dtls_srtp_stop_timeout_timer(instance, rtp, 1);
9053 ao2_lock(instance);
9054
9055 if (rtp->rtcp->dtls.ssl && rtp->rtcp->dtls.ssl != rtp->dtls.ssl) {
9056 SSL_free(rtp->rtcp->dtls.ssl);
9057 }
9058#endif
9060 ast_free(rtp->rtcp);
9061 rtp->rtcp = NULL;
9062 ast_debug_rtcp(1, "(%s) RTCP torn down on RTP instance\n",
9064 }
9065 }
9066 } else if (property == AST_RTP_PROPERTY_ASYMMETRIC_CODEC) {
9067 rtp->asymmetric_codec = value;
9068 } else if (property == AST_RTP_PROPERTY_RETRANS_SEND) {
9069 if (value) {
9070 if (!rtp->send_buffer) {
9072 }
9073 } else {
9074 if (rtp->send_buffer) {
9076 rtp->send_buffer = NULL;
9077 }
9078 }
9079 } else if (property == AST_RTP_PROPERTY_RETRANS_RECV) {
9080 if (value) {
9081 if (!rtp->recv_buffer) {
9084 }
9085 } else {
9086 if (rtp->recv_buffer) {
9088 rtp->recv_buffer = NULL;
9090 }
9091 }
9092 }
9093}
9094
9095/*! \pre instance is locked */
9096static int ast_rtp_fd(struct ast_rtp_instance *instance, int rtcp)
9097{
9098 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9099
9100 return rtcp ? (rtp->rtcp ? rtp->rtcp->s : -1) : rtp->s;
9101}
9102
9103/*! \pre instance is locked */
9104static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr)
9105{
9106 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9107 struct ast_sockaddr local;
9108 int index;
9109
9110 ast_rtp_instance_get_local_address(instance, &local);
9111 if (!ast_sockaddr_isnull(addr)) {
9112 /* Update the local RTP address with what is being used */
9113 if (ast_ouraddrfor(addr, &local)) {
9114 /* Failed to update our address so reuse old local address */
9115 ast_rtp_instance_get_local_address(instance, &local);
9116 } else {
9117 ast_rtp_instance_set_local_address(instance, &local);
9118 }
9119 }
9120
9121 if (rtp->rtcp && !ast_sockaddr_isnull(addr)) {
9122 ast_debug_rtcp(1, "(%p) RTCP setting address on RTP instance\n", instance);
9123 ast_sockaddr_copy(&rtp->rtcp->them, addr);
9124
9127
9128 /* Update the local RTCP address with what is being used */
9129 ast_sockaddr_set_port(&local, ast_sockaddr_port(&local) + 1);
9130 }
9131 ast_sockaddr_copy(&rtp->rtcp->us, &local);
9132
9135 }
9136
9137 /* Update any bundled RTP instances */
9138 for (index = 0; index < AST_VECTOR_SIZE(&rtp->ssrc_mapping); ++index) {
9139 struct rtp_ssrc_mapping *mapping = AST_VECTOR_GET_ADDR(&rtp->ssrc_mapping, index);
9140
9142 }
9143
9144 /* Need to reset the DTMF last sequence number and the timestamp of the last END packet */
9145 rtp->last_seqno = 0;
9146 rtp->last_end_timestamp.ts = 0;
9147 rtp->last_end_timestamp.is_set = 0;
9148
9150 && !ast_sockaddr_isnull(addr) && ast_sockaddr_cmp(addr, &rtp->strict_rtp_address)) {
9151 /* We only need to learn a new strict source address if we've been told the source is
9152 * changing to something different.
9153 */
9154 ast_verb(4, "%p -- Strict RTP learning after remote address set to: %s\n",
9155 rtp, ast_sockaddr_stringify(addr));
9156 rtp_learning_start(rtp);
9157 }
9158}
9159
9160/*!
9161 * \brief Write t140 redundancy frame
9162 *
9163 * \param data primary data to be buffered
9164 *
9165 * Scheduler callback
9166 */
9167static int red_write(const void *data)
9168{
9169 struct ast_rtp_instance *instance = (struct ast_rtp_instance*) data;
9170 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9171
9172 ao2_lock(instance);
9173 if (rtp->red->t140.datalen > 0) {
9174 ast_rtp_write(instance, &rtp->red->t140);
9175 }
9176 ao2_unlock(instance);
9177
9178 return 1;
9179}
9180
9181/*! \pre instance is locked */
9182static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations)
9183{
9184 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9185 int x;
9186
9187 rtp->red = ast_calloc(1, sizeof(*rtp->red));
9188 if (!rtp->red) {
9189 return -1;
9190 }
9191
9194 rtp->red->t140.data.ptr = &rtp->red->buf_data;
9195
9196 rtp->red->t140red = rtp->red->t140;
9197 rtp->red->t140red.data.ptr = &rtp->red->t140red_data;
9198
9199 rtp->red->num_gen = generations;
9200 rtp->red->hdrlen = generations * 4 + 1;
9201
9202 for (x = 0; x < generations; x++) {
9203 rtp->red->pt[x] = payloads[x];
9204 rtp->red->pt[x] |= 1 << 7; /* mark redundant generations pt */
9205 rtp->red->t140red_data[x*4] = rtp->red->pt[x];
9206 }
9207 rtp->red->t140red_data[x*4] = rtp->red->pt[x] = payloads[x]; /* primary pt */
9208 rtp->red->schedid = ast_sched_add(rtp->sched, buffer_time, red_write, instance);
9209
9210 return 0;
9211}
9212
9213/*! \pre instance is locked */
9214static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame)
9215{
9216 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9217 struct rtp_red *red = rtp->red;
9218
9219 if (!red) {
9220 return 0;
9221 }
9222
9223 if (frame->datalen > 0) {
9224 if (red->t140.datalen > 0) {
9225 const unsigned char *primary = red->buf_data;
9226
9227 /* There is something already in the T.140 buffer */
9228 if (primary[0] == 0x08 || primary[0] == 0x0a || primary[0] == 0x0d) {
9229 /* Flush the previous T.140 packet if it is a command */
9230 ast_rtp_write(instance, &rtp->red->t140);
9231 } else {
9232 primary = frame->data.ptr;
9233 if (primary[0] == 0x08 || primary[0] == 0x0a || primary[0] == 0x0d) {
9234 /* Flush the previous T.140 packet if we are buffering a command now */
9235 ast_rtp_write(instance, &rtp->red->t140);
9236 }
9237 }
9238 }
9239
9240 memcpy(&red->buf_data[red->t140.datalen], frame->data.ptr, frame->datalen);
9241 red->t140.datalen += frame->datalen;
9242 red->t140.ts = frame->ts;
9243 }
9244
9245 return 0;
9246}
9247
9248/*! \pre Neither instance0 nor instance1 are locked */
9249static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_rtp_instance *instance1)
9250{
9251 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance0);
9252
9253 ao2_lock(instance0);
9255 if (rtp->smoother) {
9257 rtp->smoother = NULL;
9258 }
9259
9260 /* We must use a new SSRC when local bridge ends */
9261 if (!instance1) {
9262 rtp->ssrc = rtp->ssrc_orig;
9263 rtp->ssrc_orig = 0;
9264 rtp->ssrc_saved = 0;
9265 } else if (!rtp->ssrc_saved) {
9266 /* In case ast_rtp_local_bridge is called multiple times, only save the ssrc from before local bridge began */
9267 rtp->ssrc_orig = rtp->ssrc;
9268 rtp->ssrc_saved = 1;
9269 }
9270
9271 ao2_unlock(instance0);
9272
9273 return 0;
9274}
9275
9276/*! \pre instance is locked */
9277static int ast_rtp_get_stat(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat)
9278{
9279 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9280
9281 if (!rtp->rtcp) {
9282 return -1;
9283 }
9284
9289
9301
9313
9320
9332
9333
9337
9338 return 0;
9339}
9340
9341/*! \pre Neither instance0 nor instance1 are locked */
9342static int ast_rtp_dtmf_compatible(struct ast_channel *chan0, struct ast_rtp_instance *instance0, struct ast_channel *chan1, struct ast_rtp_instance *instance1)
9343{
9344 /* If both sides are not using the same method of DTMF transmission
9345 * (ie: one is RFC2833, other is INFO... then we can not do direct media.
9346 * --------------------------------------------------
9347 * | DTMF Mode | HAS_DTMF | Accepts Begin Frames |
9348 * |-----------|------------|-----------------------|
9349 * | Inband | False | True |
9350 * | RFC2833 | True | True |
9351 * | SIP INFO | False | False |
9352 * --------------------------------------------------
9353 */
9355 (!ast_channel_tech(chan0)->send_digit_begin != !ast_channel_tech(chan1)->send_digit_begin)) ? 0 : 1);
9356}
9357
9358/*! \pre instance is NOT locked */
9359static void ast_rtp_stun_request(struct ast_rtp_instance *instance, struct ast_sockaddr *suggestion, const char *username)
9360{
9361 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9362 struct sockaddr_in suggestion_tmp;
9363
9364 /*
9365 * The instance should not be locked because we can block
9366 * waiting for a STUN respone.
9367 */
9368 ast_sockaddr_to_sin(suggestion, &suggestion_tmp);
9369 ast_stun_request(rtp->s, &suggestion_tmp, username, NULL);
9370 ast_sockaddr_from_sin(suggestion, &suggestion_tmp);
9371}
9372
9373/*! \pre instance is locked */
9374static void ast_rtp_stop(struct ast_rtp_instance *instance)
9375{
9376 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9377 struct ast_sockaddr addr = { {0,} };
9378
9379#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
9380 ao2_unlock(instance);
9381 AST_SCHED_DEL_UNREF(rtp->sched, rtp->rekeyid, ao2_ref(instance, -1));
9382
9383 dtls_srtp_stop_timeout_timer(instance, rtp, 0);
9384 if (rtp->rtcp) {
9385 dtls_srtp_stop_timeout_timer(instance, rtp, 1);
9386 }
9387 ao2_lock(instance);
9388#endif
9389 ast_debug_rtp(1, "(%s) RTP Stop\n",
9391
9392 if (rtp->rtcp && rtp->rtcp->schedid > -1) {
9393 ao2_unlock(instance);
9394 if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
9395 /* successfully cancelled scheduler entry. */
9396 ao2_ref(instance, -1);
9397 }
9398 ao2_lock(instance);
9399 rtp->rtcp->schedid = -1;
9400 }
9401
9402 if (rtp->transport_wide_cc.schedid > -1) {
9403 ao2_unlock(instance);
9404 if (!ast_sched_del(rtp->sched, rtp->transport_wide_cc.schedid)) {
9405 ao2_ref(instance, -1);
9406 }
9407 ao2_lock(instance);
9408 rtp->transport_wide_cc.schedid = -1;
9409 }
9410
9411 if (rtp->red) {
9412 ao2_unlock(instance);
9413 AST_SCHED_DEL(rtp->sched, rtp->red->schedid);
9414 ao2_lock(instance);
9415 ast_free(rtp->red);
9416 rtp->red = NULL;
9417 }
9418
9419 ast_rtp_instance_set_remote_address(instance, &addr);
9420
9422}
9423
9424/*! \pre instance is locked */
9425static int ast_rtp_qos_set(struct ast_rtp_instance *instance, int tos, int cos, const char *desc)
9426{
9427 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9428
9429 return ast_set_qos(rtp->s, tos, cos, desc);
9430}
9431
9432/*!
9433 * \brief generate comfort noice (CNG)
9434 *
9435 * \pre instance is locked
9436 */
9437static int ast_rtp_sendcng(struct ast_rtp_instance *instance, int level)
9438{
9439 unsigned int *rtpheader;
9440 int hdrlen = 12;
9441 int res, payload = 0;
9442 char data[256];
9443 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9444 struct ast_sockaddr remote_address = { {0,} };
9445 int ice;
9446
9447 ast_rtp_instance_get_remote_address(instance, &remote_address);
9448
9449 if (ast_sockaddr_isnull(&remote_address)) {
9450 return -1;
9451 }
9452
9454
9455 level = 127 - (level & 0x7f);
9456
9457 rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
9458
9459 /* Get a pointer to the header */
9460 rtpheader = (unsigned int *)data;
9461 rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno));
9462 rtpheader[1] = htonl(rtp->lastts);
9463 rtpheader[2] = htonl(rtp->ssrc);
9464 data[12] = level;
9465
9466 res = rtp_sendto(instance, (void *) rtpheader, hdrlen + 1, 0, &remote_address, &ice);
9467
9468 if (res < 0) {
9469 ast_log(LOG_ERROR, "RTP Comfort Noise Transmission error to %s: %s\n", ast_sockaddr_stringify(&remote_address), strerror(errno));
9470 return res;
9471 }
9472
9473 if (rtp_debug_test_addr(&remote_address)) {
9474 ast_verbose("Sent Comfort Noise RTP packet to %s%s (type %-2.2d, seq %-6.6d, ts %-6.6u, len %-6.6d)\n",
9475 ast_sockaddr_stringify(&remote_address),
9476 ice ? " (via ICE)" : "",
9477 AST_RTP_CN, rtp->seqno, rtp->lastdigitts, res - hdrlen);
9478 }
9479
9480 rtp->seqno++;
9481
9482 return res;
9483}
9484
9485/*! \pre instance is locked */
9486static unsigned int ast_rtp_get_ssrc(struct ast_rtp_instance *instance)
9487{
9488 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9489
9490 return rtp->ssrc;
9491}
9492
9493/*! \pre instance is locked */
9494static const char *ast_rtp_get_cname(struct ast_rtp_instance *instance)
9495{
9496 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9497
9498 return rtp->cname;
9499}
9500
9501/*! \pre instance is locked */
9502static void ast_rtp_set_remote_ssrc(struct ast_rtp_instance *instance, unsigned int ssrc)
9503{
9504 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9505
9506 if (rtp->themssrc_valid && rtp->themssrc == ssrc) {
9507 return;
9508 }
9509
9510 rtp->themssrc = ssrc;
9511 rtp->themssrc_valid = 1;
9512
9513 /* If this is bundled we need to update the SSRC mapping */
9514 if (rtp->bundled) {
9515 struct ast_rtp *bundled_rtp;
9516 int index;
9517
9518 ao2_unlock(instance);
9519
9520 /* The child lock can't be held while accessing the parent */
9521 ao2_lock(rtp->bundled);
9522 bundled_rtp = ast_rtp_instance_get_data(rtp->bundled);
9523
9524 for (index = 0; index < AST_VECTOR_SIZE(&bundled_rtp->ssrc_mapping); ++index) {
9525 struct rtp_ssrc_mapping *mapping = AST_VECTOR_GET_ADDR(&bundled_rtp->ssrc_mapping, index);
9526
9527 if (mapping->instance == instance) {
9528 mapping->ssrc = ssrc;
9529 mapping->ssrc_valid = 1;
9530 break;
9531 }
9532 }
9533
9534 ao2_unlock(rtp->bundled);
9535
9537 }
9538}
9539
9540static void ast_rtp_set_stream_num(struct ast_rtp_instance *instance, int stream_num)
9541{
9542 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9543
9544 rtp->stream_num = stream_num;
9545}
9546
9548{
9549 switch (extension) {
9552 return 1;
9553 default:
9554 return 0;
9555 }
9556}
9557
9558/*! \pre child is locked */
9559static int ast_rtp_bundle(struct ast_rtp_instance *child, struct ast_rtp_instance *parent)
9560{
9561 struct ast_rtp *child_rtp = ast_rtp_instance_get_data(child);
9562 struct ast_rtp *parent_rtp;
9563 struct rtp_ssrc_mapping mapping;
9564 struct ast_sockaddr them = { { 0, } };
9565
9566 if (child_rtp->bundled == parent) {
9567 return 0;
9568 }
9569
9570 /* If this instance was already bundled then remove the SSRC mapping */
9571 if (child_rtp->bundled) {
9572 struct ast_rtp *bundled_rtp;
9573
9574 ao2_unlock(child);
9575
9576 /* The child lock can't be held while accessing the parent */
9577 ao2_lock(child_rtp->bundled);
9578 bundled_rtp = ast_rtp_instance_get_data(child_rtp->bundled);
9580 ao2_unlock(child_rtp->bundled);
9581
9582 ao2_lock(child);
9583 ao2_ref(child_rtp->bundled, -1);
9584 child_rtp->bundled = NULL;
9585 }
9586
9587 if (!parent) {
9588 /* We transitioned away from bundle so we need our own transport resources once again */
9589 rtp_allocate_transport(child, child_rtp);
9590 return 0;
9591 }
9592
9593 parent_rtp = ast_rtp_instance_get_data(parent);
9594
9595 /* We no longer need any transport related resources as we will use our parent RTP instance instead */
9596 rtp_deallocate_transport(child, child_rtp);
9597
9598 /* Children maintain a reference to the parent to guarantee that the transport doesn't go away on them */
9599 child_rtp->bundled = ao2_bump(parent);
9600
9601 mapping.ssrc = child_rtp->themssrc;
9602 mapping.ssrc_valid = child_rtp->themssrc_valid;
9603 mapping.instance = child;
9604
9605 ao2_unlock(child);
9606
9607 ao2_lock(parent);
9608
9609 AST_VECTOR_APPEND(&parent_rtp->ssrc_mapping, mapping);
9610
9611#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
9612 /* If DTLS-SRTP is already in use then add the local SSRC to it, otherwise it will get added once DTLS
9613 * negotiation has been completed.
9614 */
9615 if (parent_rtp->dtls.connection == AST_RTP_DTLS_CONNECTION_EXISTING) {
9616 dtls_srtp_add_local_ssrc(parent_rtp, parent, 0, child_rtp->ssrc, 0);
9617 }
9618#endif
9619
9620 /* Bundle requires that RTCP-MUX be in use so only the main remote address needs to match */
9622
9623 ao2_unlock(parent);
9624
9625 ao2_lock(child);
9626
9628
9629 return 0;
9630}
9631
9632#ifdef HAVE_PJPROJECT
9633static void stunaddr_resolve_callback(const struct ast_dns_query *query)
9634{
9635 const int lowest_ttl = ast_dns_result_get_lowest_ttl(ast_dns_query_get_result(query));
9636 const char *stunaddr_name = ast_dns_query_get_name(query);
9637 const char *stunaddr_resolved_str;
9638
9639 if (!store_stunaddr_resolved(query)) {
9640 ast_log(LOG_WARNING, "Failed to resolve stunaddr '%s'. Cancelling recurring resolution.\n", stunaddr_name);
9641 return;
9642 }
9643
9644 if (DEBUG_ATLEAST(2)) {
9645 ast_rwlock_rdlock(&stunaddr_lock);
9646 stunaddr_resolved_str = ast_inet_ntoa(stunaddr.sin_addr);
9647 ast_rwlock_unlock(&stunaddr_lock);
9648
9649 ast_debug_stun(2, "Resolved stunaddr '%s' to '%s'. Lowest TTL = %d.\n",
9650 stunaddr_name,
9651 stunaddr_resolved_str,
9652 lowest_ttl);
9653 }
9654
9655 if (!lowest_ttl) {
9656 ast_log(LOG_WARNING, "Resolution for stunaddr '%s' returned TTL = 0. Recurring resolution was cancelled.\n", ast_dns_query_get_name(query));
9657 }
9658}
9659
9660static int store_stunaddr_resolved(const struct ast_dns_query *query)
9661{
9662 const struct ast_dns_result *result = ast_dns_query_get_result(query);
9663 const struct ast_dns_record *record;
9664
9665 for (record = ast_dns_result_get_records(result); record; record = ast_dns_record_get_next(record)) {
9666 const size_t data_size = ast_dns_record_get_data_size(record);
9667 const unsigned char *data = (unsigned char *)ast_dns_record_get_data(record);
9668 const int rr_type = ast_dns_record_get_rr_type(record);
9669
9670 if (rr_type == ns_t_a && data_size == 4) {
9671 ast_rwlock_wrlock(&stunaddr_lock);
9672 memcpy(&stunaddr.sin_addr, data, data_size);
9673 stunaddr.sin_family = AF_INET;
9674 ast_rwlock_unlock(&stunaddr_lock);
9675
9676 return 1;
9677 } else {
9678 ast_debug_stun(3, "Unrecognized rr_type '%u' or data_size '%zu' from DNS query for stunaddr '%s'\n",
9679 rr_type, data_size, ast_dns_query_get_name(query));
9680 continue;
9681 }
9682 }
9683 return 0;
9684}
9685
9686static void clean_stunaddr(void) {
9687 if (stunaddr_resolver) {
9688 if (ast_dns_resolve_recurring_cancel(stunaddr_resolver)) {
9689 ast_log(LOG_ERROR, "Failed to cancel recurring DNS resolution of previous stunaddr.\n");
9690 }
9691 ao2_ref(stunaddr_resolver, -1);
9692 stunaddr_resolver = NULL;
9693 }
9694 ast_rwlock_wrlock(&stunaddr_lock);
9695 memset(&stunaddr, 0, sizeof(stunaddr));
9696 ast_rwlock_unlock(&stunaddr_lock);
9697}
9698#endif
9699
9700#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
9701/*! \pre instance is locked */
9702static int ast_rtp_activate(struct ast_rtp_instance *instance)
9703{
9704 struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
9705
9706 /* If ICE negotiation is enabled the DTLS Handshake will be performed upon completion of it */
9707#ifdef HAVE_PJPROJECT
9708 if (rtp->ice) {
9709 return 0;
9710 }
9711#endif
9712
9713 ast_debug_dtls(3, "(%p) DTLS - ast_rtp_activate rtp=%p - setup and perform DTLS'\n", instance, rtp);
9714
9715 dtls_perform_setup(&rtp->dtls);
9716 dtls_perform_handshake(instance, &rtp->dtls, 0);
9717
9718 if (rtp->rtcp && rtp->rtcp->type == AST_RTP_INSTANCE_RTCP_STANDARD) {
9719 dtls_perform_setup(&rtp->rtcp->dtls);
9720 dtls_perform_handshake(instance, &rtp->rtcp->dtls, 1);
9721 }
9722
9723 return 0;
9724}
9725#endif
9726
9727static char *rtp_do_debug_ip(struct ast_cli_args *a)
9728{
9729 char *arg = ast_strdupa(a->argv[4]);
9730 char *debughost = NULL;
9731 char *debugport = NULL;
9732
9733 if (!ast_sockaddr_parse(&rtpdebugaddr, arg, 0) || !ast_sockaddr_split_hostport(arg, &debughost, &debugport, 0)) {
9734 ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
9735 return CLI_FAILURE;
9736 }
9737 rtpdebugport = (!ast_strlen_zero(debugport) && debugport[0] != '0');
9738 ast_cli(a->fd, "RTP Packet Debugging Enabled for address: %s\n",
9741 return CLI_SUCCESS;
9742}
9743
9744static char *rtcp_do_debug_ip(struct ast_cli_args *a)
9745{
9746 char *arg = ast_strdupa(a->argv[4]);
9747 char *debughost = NULL;
9748 char *debugport = NULL;
9749
9750 if (!ast_sockaddr_parse(&rtcpdebugaddr, arg, 0) || !ast_sockaddr_split_hostport(arg, &debughost, &debugport, 0)) {
9751 ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
9752 return CLI_FAILURE;
9753 }
9754 rtcpdebugport = (!ast_strlen_zero(debugport) && debugport[0] != '0');
9755 ast_cli(a->fd, "RTCP Packet Debugging Enabled for address: %s\n",
9758 return CLI_SUCCESS;
9759}
9760
9761static char *handle_cli_rtp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
9762{
9763 switch (cmd) {
9764 case CLI_INIT:
9765 e->command = "rtp set debug {on|off|ip}";
9766 e->usage =
9767 "Usage: rtp set debug {on|off|ip host[:port]}\n"
9768 " Enable/Disable dumping of all RTP packets. If 'ip' is\n"
9769 " specified, limit the dumped packets to those to and from\n"
9770 " the specified 'host' with optional port.\n";
9771 return NULL;
9772 case CLI_GENERATE:
9773 return NULL;
9774 }
9775
9776 if (a->argc == e->args) { /* set on or off */
9777 if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
9779 memset(&rtpdebugaddr, 0, sizeof(rtpdebugaddr));
9780 ast_cli(a->fd, "RTP Packet Debugging Enabled\n");
9781 return CLI_SUCCESS;
9782 } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
9784 ast_cli(a->fd, "RTP Packet Debugging Disabled\n");
9785 return CLI_SUCCESS;
9786 }
9787 } else if (a->argc == e->args +1) { /* ip */
9788 return rtp_do_debug_ip(a);
9789 }
9790
9791 return CLI_SHOWUSAGE; /* default, failure */
9792}
9793
9794
9795static char *handle_cli_rtp_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
9796{
9797#ifdef HAVE_PJPROJECT
9798 struct sockaddr_in stunaddr_copy;
9799#endif
9800 switch (cmd) {
9801 case CLI_INIT:
9802 e->command = "rtp show settings";
9803 e->usage =
9804 "Usage: rtp show settings\n"
9805 " Display RTP configuration settings\n";
9806 return NULL;
9807 case CLI_GENERATE:
9808 return NULL;
9809 }
9810
9811 if (a->argc != 3) {
9812 return CLI_SHOWUSAGE;
9813 }
9814
9815 ast_cli(a->fd, "\n\nGeneral Settings:\n");
9816 ast_cli(a->fd, "----------------\n");
9817 ast_cli(a->fd, " Port start: %d\n", rtpstart);
9818 ast_cli(a->fd, " Port end: %d\n", rtpend);
9819#ifdef SO_NO_CHECK
9820 ast_cli(a->fd, " Checksums: %s\n", AST_CLI_YESNO(nochecksums == 0));
9821#endif
9822 ast_cli(a->fd, " DTMF Timeout: %d\n", dtmftimeout);
9823 ast_cli(a->fd, " Strict RTP: %s\n", AST_CLI_YESNO(strictrtp));
9824
9825 if (strictrtp) {
9826 ast_cli(a->fd, " Probation: %d frames\n", learning_min_sequential);
9827 }
9828
9829 ast_cli(a->fd, " Replay Protect: %s\n", AST_CLI_YESNO(srtp_replay_protection));
9830#ifdef HAVE_PJPROJECT
9831 ast_cli(a->fd, " ICE support: %s\n", AST_CLI_YESNO(icesupport));
9832
9833 ast_rwlock_rdlock(&stunaddr_lock);
9834 memcpy(&stunaddr_copy, &stunaddr, sizeof(stunaddr));
9835 ast_rwlock_unlock(&stunaddr_lock);
9836 ast_cli(a->fd, " STUN address: %s:%d\n", ast_inet_ntoa(stunaddr_copy.sin_addr), htons(stunaddr_copy.sin_port));
9837#endif
9838 return CLI_SUCCESS;
9839}
9840
9841
9842static char *handle_cli_rtcp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
9843{
9844 switch (cmd) {
9845 case CLI_INIT:
9846 e->command = "rtcp set debug {on|off|ip}";
9847 e->usage =
9848 "Usage: rtcp set debug {on|off|ip host[:port]}\n"
9849 " Enable/Disable dumping of all RTCP packets. If 'ip' is\n"
9850 " specified, limit the dumped packets to those to and from\n"
9851 " the specified 'host' with optional port.\n";
9852 return NULL;
9853 case CLI_GENERATE:
9854 return NULL;
9855 }
9856
9857 if (a->argc == e->args) { /* set on or off */
9858 if (!strncasecmp(a->argv[e->args-1], "on", 2)) {
9860 memset(&rtcpdebugaddr, 0, sizeof(rtcpdebugaddr));
9861 ast_cli(a->fd, "RTCP Packet Debugging Enabled\n");
9862 return CLI_SUCCESS;
9863 } else if (!strncasecmp(a->argv[e->args-1], "off", 3)) {
9865 ast_cli(a->fd, "RTCP Packet Debugging Disabled\n");
9866 return CLI_SUCCESS;
9867 }
9868 } else if (a->argc == e->args +1) { /* ip */
9869 return rtcp_do_debug_ip(a);
9870 }
9871
9872 return CLI_SHOWUSAGE; /* default, failure */
9873}
9874
9875static char *handle_cli_rtcp_set_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
9876{
9877 switch (cmd) {
9878 case CLI_INIT:
9879 e->command = "rtcp set stats {on|off}";
9880 e->usage =
9881 "Usage: rtcp set stats {on|off}\n"
9882 " Enable/Disable dumping of RTCP stats.\n";
9883 return NULL;
9884 case CLI_GENERATE:
9885 return NULL;
9886 }
9887
9888 if (a->argc != e->args)
9889 return CLI_SHOWUSAGE;
9890
9891 if (!strncasecmp(a->argv[e->args-1], "on", 2))
9892 rtcpstats = 1;
9893 else if (!strncasecmp(a->argv[e->args-1], "off", 3))
9894 rtcpstats = 0;
9895 else
9896 return CLI_SHOWUSAGE;
9897
9898 ast_cli(a->fd, "RTCP Stats %s\n", rtcpstats ? "Enabled" : "Disabled");
9899 return CLI_SUCCESS;
9900}
9901
9902#ifdef AST_DEVMODE
9903
9904static unsigned int use_random(struct ast_cli_args *a, int pos, unsigned int index)
9905{
9906 return pos >= index && !ast_strlen_zero(a->argv[index - 1]) &&
9907 !strcasecmp(a->argv[index - 1], "random");
9908}
9909
9910static char *handle_cli_rtp_drop_incoming_packets(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
9911{
9912 static const char * const completions_2[] = { "stop", "<N>", NULL };
9913 static const char * const completions_3[] = { "random", "incoming packets", NULL };
9914 static const char * const completions_5[] = { "on", "every", NULL };
9915 static const char * const completions_units[] = { "random", "usec", "msec", "sec", "min", NULL };
9916
9917 unsigned int use_random_num = 0;
9918 unsigned int use_random_interval = 0;
9919 unsigned int num_to_drop = 0;
9920 unsigned int interval = 0;
9921 const char *interval_s = NULL;
9922 const char *unit_s = NULL;
9923 struct ast_sockaddr addr;
9924 const char *addr_s = NULL;
9925
9926 switch (cmd) {
9927 case CLI_INIT:
9928 e->command = "rtp drop";
9929 e->usage =
9930 "Usage: rtp drop [stop|[<N> [random] incoming packets[ every <N> [random] {usec|msec|sec|min}][ on <ip[:port]>]]\n"
9931 " Drop RTP incoming packets.\n";
9932 return NULL;
9933 case CLI_GENERATE:
9934 use_random_num = use_random(a, a->pos, 4);
9935 use_random_interval = use_random(a, a->pos, 8 + use_random_num) ||
9936 use_random(a, a->pos, 10 + use_random_num);
9937
9938 switch (a->pos - use_random_num - use_random_interval) {
9939 case 2:
9940 return ast_cli_complete(a->word, completions_2, a->n);
9941 case 3:
9942 return ast_cli_complete(a->word, completions_3 + use_random_num, a->n);
9943 case 5:
9944 return ast_cli_complete(a->word, completions_5, a->n);
9945 case 7:
9946 if (!strcasecmp(a->argv[a->pos - 2], "on")) {
9948 break;
9949 }
9950 /* Fall through */
9951 case 9:
9952 if (!strcasecmp(a->argv[a->pos - 2 - use_random_interval], "every")) {
9953 return ast_cli_complete(a->word, completions_units + use_random_interval, a->n);
9954 }
9955 break;
9956 case 8:
9957 if (!strcasecmp(a->argv[a->pos - 3 - use_random_interval], "every")) {
9959 }
9960 break;
9961 }
9962
9963 return NULL;
9964 }
9965
9966 if (a->argc < 3) {
9967 return CLI_SHOWUSAGE;
9968 }
9969
9970 use_random_num = use_random(a, a->argc, 4);
9971 use_random_interval = use_random(a, a->argc, 8 + use_random_num) ||
9972 use_random(a, a->argc, 10 + use_random_num);
9973
9974 if (!strcasecmp(a->argv[2], "stop")) {
9975 /* rtp drop stop */
9976 } else if (a->argc < 5) {
9977 return CLI_SHOWUSAGE;
9978 } else if (ast_str_to_uint(a->argv[2], &num_to_drop)) {
9979 ast_cli(a->fd, "%s is not a valid number of packets to drop\n", a->argv[2]);
9980 return CLI_FAILURE;
9981 } else if (a->argc - use_random_num == 5) {
9982 /* rtp drop <N> [random] incoming packets */
9983 } else if (a->argc - use_random_num >= 7 && !strcasecmp(a->argv[5 + use_random_num], "on")) {
9984 /* rtp drop <N> [random] incoming packets on <ip[:port]> */
9985 addr_s = a->argv[6 + use_random_num];
9986 if (a->argc - use_random_num - use_random_interval == 10 &&
9987 !strcasecmp(a->argv[7 + use_random_num], "every")) {
9988 /* rtp drop <N> [random] incoming packets on <ip[:port]> every <N> [random] {usec|msec|sec|min} */
9989 interval_s = a->argv[8 + use_random_num];
9990 unit_s = a->argv[9 + use_random_num + use_random_interval];
9991 }
9992 } else if (a->argc - use_random_num >= 8 && !strcasecmp(a->argv[5 + use_random_num], "every")) {
9993 /* rtp drop <N> [random] incoming packets every <N> [random] {usec|msec|sec|min} */
9994 interval_s = a->argv[6 + use_random_num];
9995 unit_s = a->argv[7 + use_random_num + use_random_interval];
9996 if (a->argc == 10 + use_random_num + use_random_interval &&
9997 !strcasecmp(a->argv[8 + use_random_num + use_random_interval], "on")) {
9998 /* rtp drop <N> [random] incoming packets every <N> [random] {usec|msec|sec|min} on <ip[:port]> */
9999 addr_s = a->argv[9 + use_random_num + use_random_interval];
10000 }
10001 } else {
10002 return CLI_SHOWUSAGE;
10003 }
10004
10005 if (a->argc - use_random_num >= 8 && !interval_s && !addr_s) {
10006 return CLI_SHOWUSAGE;
10007 }
10008
10009 if (interval_s && ast_str_to_uint(interval_s, &interval)) {
10010 ast_cli(a->fd, "%s is not a valid interval number\n", interval_s);
10011 return CLI_FAILURE;
10012 }
10013
10014 memset(&addr, 0, sizeof(addr));
10015 if (addr_s && !ast_sockaddr_parse(&addr, addr_s, 0)) {
10016 ast_cli(a->fd, "%s is not a valid hostname[:port]\n", addr_s);
10017 return CLI_FAILURE;
10018 }
10019
10020 drop_packets_data.use_random_num = use_random_num;
10021 drop_packets_data.use_random_interval = use_random_interval;
10022 drop_packets_data.num_to_drop = num_to_drop;
10023 drop_packets_data.interval = ast_time_create_by_unit_str(interval, unit_s);
10024 ast_sockaddr_copy(&drop_packets_data.addr, &addr);
10025 drop_packets_data.port = ast_sockaddr_port(&addr);
10026
10027 drop_packets_data_update(ast_tvnow());
10028
10029 return CLI_SUCCESS;
10030}
10031#endif
10032
10033static struct ast_cli_entry cli_rtp[] = {
10034 AST_CLI_DEFINE(handle_cli_rtp_set_debug, "Enable/Disable RTP debugging"),
10035 AST_CLI_DEFINE(handle_cli_rtp_settings, "Display RTP settings"),
10036 AST_CLI_DEFINE(handle_cli_rtcp_set_debug, "Enable/Disable RTCP debugging"),
10037 AST_CLI_DEFINE(handle_cli_rtcp_set_stats, "Enable/Disable RTCP stats"),
10038#ifdef AST_DEVMODE
10039 AST_CLI_DEFINE(handle_cli_rtp_drop_incoming_packets, "Drop RTP incoming packets"),
10040#endif
10041};
10042
10043static int rtp_reload(int reload, int by_external_config)
10044{
10045 struct ast_config *cfg;
10046 const char *s;
10047 struct ast_flags config_flags = { (reload && !by_external_config) ? CONFIG_FLAG_FILEUNCHANGED : 0 };
10048
10049#ifdef HAVE_PJPROJECT
10050 struct ast_variable *var;
10051 struct ast_ice_host_candidate *candidate;
10052 int acl_subscription_flag = 0;
10053#endif
10054
10055 cfg = ast_config_load2("rtp.conf", "rtp", config_flags);
10056 if (!cfg || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID) {
10057 return 0;
10058 }
10059
10060#ifdef SO_NO_CHECK
10061 nochecksums = 0;
10062#endif
10063
10072
10073 /** This resource is not "reloaded" so much as unloaded and loaded again.
10074 * In the case of the TURN related variables, the memory referenced by a
10075 * previously loaded instance *should* have been released when the
10076 * corresponding pool was destroyed. If at some point in the future this
10077 * resource were to support ACTUAL live reconfiguration and did NOT release
10078 * the pool this will cause a small memory leak.
10079 */
10080
10081#ifdef HAVE_PJPROJECT
10082 icesupport = DEFAULT_ICESUPPORT;
10083 stun_software_attribute = DEFAULT_STUN_SOFTWARE_ATTRIBUTE;
10084 turnport = DEFAULT_TURN_PORT;
10085 clean_stunaddr();
10086 turnaddr = pj_str(NULL);
10087 turnusername = pj_str(NULL);
10088 turnpassword = pj_str(NULL);
10089 host_candidate_overrides_clear();
10090#endif
10091
10092#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
10093 dtls_mtu = DEFAULT_DTLS_MTU;
10094#endif
10095
10096 if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
10097 rtpstart = atoi(s);
10102 }
10103 if ((s = ast_variable_retrieve(cfg, "general", "rtpend"))) {
10104 rtpend = atoi(s);
10109 }
10110 if ((s = ast_variable_retrieve(cfg, "general", "rtcpinterval"))) {
10111 rtcpinterval = atoi(s);
10112 if (rtcpinterval == 0)
10113 rtcpinterval = 0; /* Just so we're clear... it's zero */
10115 rtcpinterval = RTCP_MIN_INTERVALMS; /* This catches negative numbers too */
10118 }
10119 if ((s = ast_variable_retrieve(cfg, "general", "rtpchecksums"))) {
10120#ifdef SO_NO_CHECK
10121 nochecksums = ast_false(s) ? 1 : 0;
10122#else
10123 if (ast_false(s))
10124 ast_log(LOG_WARNING, "Disabling RTP checksums is not supported on this operating system!\n");
10125#endif
10126 }
10127 if ((s = ast_variable_retrieve(cfg, "general", "dtmftimeout"))) {
10128 dtmftimeout = atoi(s);
10129 if ((dtmftimeout < 0) || (dtmftimeout > 64000)) {
10130 ast_log(LOG_WARNING, "DTMF timeout of '%d' outside range, using default of '%d' instead\n",
10133 };
10134 }
10135 if ((s = ast_variable_retrieve(cfg, "general", "strictrtp"))) {
10136 if (ast_true(s)) {
10138 } else if (!strcasecmp(s, "seqno")) {
10140 } else {
10142 }
10143 }
10144 if ((s = ast_variable_retrieve(cfg, "general", "probation"))) {
10145 if ((sscanf(s, "%d", &learning_min_sequential) != 1) || learning_min_sequential <= 1) {
10146 ast_log(LOG_WARNING, "Value for 'probation' could not be read, using default of '%d' instead\n",
10149 }
10151 }
10152 if ((s = ast_variable_retrieve(cfg, "general", "srtpreplayprotection"))) {
10154 }
10155#ifdef HAVE_PJPROJECT
10156 if ((s = ast_variable_retrieve(cfg, "general", "icesupport"))) {
10157 icesupport = ast_true(s);
10158 }
10159 if ((s = ast_variable_retrieve(cfg, "general", "stun_software_attribute"))) {
10160 stun_software_attribute = ast_true(s);
10161 }
10162 if ((s = ast_variable_retrieve(cfg, "general", "stunaddr"))) {
10163 char *hostport, *host, *port;
10164 unsigned int port_parsed = STANDARD_STUN_PORT;
10165 struct ast_sockaddr stunaddr_parsed;
10166
10167 hostport = ast_strdupa(s);
10168
10169 if (!ast_parse_arg(hostport, PARSE_ADDR, &stunaddr_parsed)) {
10170 ast_debug_stun(3, "stunaddr = '%s' does not need name resolution\n",
10171 ast_sockaddr_stringify_host(&stunaddr_parsed));
10172 if (!ast_sockaddr_port(&stunaddr_parsed)) {
10173 ast_sockaddr_set_port(&stunaddr_parsed, STANDARD_STUN_PORT);
10174 }
10175 ast_rwlock_wrlock(&stunaddr_lock);
10176 ast_sockaddr_to_sin(&stunaddr_parsed, &stunaddr);
10177 ast_rwlock_unlock(&stunaddr_lock);
10178 } else if (ast_sockaddr_split_hostport(hostport, &host, &port, 0)) {
10179 if (port) {
10180 ast_parse_arg(port, PARSE_UINT32|PARSE_IN_RANGE, &port_parsed, 1, 65535);
10181 }
10182 stunaddr.sin_port = htons(port_parsed);
10183
10184 stunaddr_resolver = ast_dns_resolve_recurring(host, T_A, C_IN,
10185 &stunaddr_resolve_callback, NULL);
10186 if (!stunaddr_resolver) {
10187 ast_log(LOG_ERROR, "Failed to setup recurring DNS resolution of stunaddr '%s'",
10188 host);
10189 }
10190 } else {
10191 ast_log(LOG_ERROR, "Failed to parse stunaddr '%s'", hostport);
10192 }
10193 }
10194 if ((s = ast_variable_retrieve(cfg, "general", "turnaddr"))) {
10195 struct sockaddr_in addr;
10196 addr.sin_port = htons(DEFAULT_TURN_PORT);
10197 if (ast_parse_arg(s, PARSE_INADDR, &addr)) {
10198 ast_log(LOG_WARNING, "Invalid TURN server address: %s\n", s);
10199 } else {
10200 pj_strdup2_with_null(pool, &turnaddr, ast_inet_ntoa(addr.sin_addr));
10201 /* ntohs() is not a bug here. The port number is used in host byte order with
10202 * a pjnat API. */
10203 turnport = ntohs(addr.sin_port);
10204 }
10205 }
10206 if ((s = ast_variable_retrieve(cfg, "general", "turnusername"))) {
10207 pj_strdup2_with_null(pool, &turnusername, s);
10208 }
10209 if ((s = ast_variable_retrieve(cfg, "general", "turnpassword"))) {
10210 pj_strdup2_with_null(pool, &turnpassword, s);
10211 }
10212
10213 AST_RWLIST_WRLOCK(&host_candidates);
10214 for (var = ast_variable_browse(cfg, "ice_host_candidates"); var; var = var->next) {
10215 struct ast_sockaddr local_addr, advertised_addr;
10216 unsigned int include_local_address = 0;
10217 char *sep;
10218
10219 ast_sockaddr_setnull(&local_addr);
10220 ast_sockaddr_setnull(&advertised_addr);
10221
10222 if (ast_parse_arg(var->name, PARSE_ADDR | PARSE_PORT_IGNORE, &local_addr)) {
10223 ast_log(LOG_WARNING, "Invalid local ICE host address: %s\n", var->name);
10224 continue;
10225 }
10226
10227 sep = strchr((char *)var->value,',');
10228 if (sep) {
10229 *sep = '\0';
10230 sep++;
10231 sep = ast_skip_blanks(sep);
10232 include_local_address = strcmp(sep, "include_local_address") == 0;
10233 }
10234
10235 if (ast_parse_arg(var->value, PARSE_ADDR | PARSE_PORT_IGNORE, &advertised_addr)) {
10236 ast_log(LOG_WARNING, "Invalid advertised ICE host address: %s\n", var->value);
10237 continue;
10238 }
10239
10240 if (!(candidate = ast_calloc(1, sizeof(*candidate)))) {
10241 ast_log(LOG_ERROR, "Failed to allocate ICE host candidate mapping.\n");
10242 break;
10243 }
10244
10245 candidate->include_local = include_local_address;
10246
10247 ast_sockaddr_copy(&candidate->local, &local_addr);
10248 ast_sockaddr_copy(&candidate->advertised, &advertised_addr);
10249
10250 AST_RWLIST_INSERT_TAIL(&host_candidates, candidate, next);
10251 }
10252 AST_RWLIST_UNLOCK(&host_candidates);
10253
10254 ast_rwlock_wrlock(&ice_acl_lock);
10255 ast_rwlock_wrlock(&stun_acl_lock);
10256
10257 ice_acl = ast_free_acl_list(ice_acl);
10258 stun_acl = ast_free_acl_list(stun_acl);
10259
10260 for (var = ast_variable_browse(cfg, "general"); var; var = var->next) {
10261 const char* sense = NULL;
10262 struct ast_acl_list **acl = NULL;
10263 if (strncasecmp(var->name, "ice_", 4) == 0) {
10264 sense = var->name + 4;
10265 acl = &ice_acl;
10266 } else if (strncasecmp(var->name, "stun_", 5) == 0) {
10267 sense = var->name + 5;
10268 acl = &stun_acl;
10269 } else {
10270 continue;
10271 }
10272
10273 if (strcasecmp(sense, "blacklist") == 0) {
10274 sense = "deny";
10275 }
10276
10277 if (strcasecmp(sense, "acl") && strcasecmp(sense, "permit") && strcasecmp(sense, "deny")) {
10278 continue;
10279 }
10280
10281 ast_append_acl(sense, var->value, acl, NULL, &acl_subscription_flag);
10282 }
10283 ast_rwlock_unlock(&ice_acl_lock);
10284 ast_rwlock_unlock(&stun_acl_lock);
10285
10286 if (acl_subscription_flag && !acl_change_sub) {
10290 } else if (!acl_subscription_flag && acl_change_sub) {
10292 }
10293#endif
10294#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP)
10295 if ((s = ast_variable_retrieve(cfg, "general", "dtls_mtu"))) {
10296 if ((sscanf(s, "%d", &dtls_mtu) != 1) || dtls_mtu < 256) {
10297 ast_log(LOG_WARNING, "Value for 'dtls_mtu' could not be read, using default of '%d' instead\n",
10299 dtls_mtu = DEFAULT_DTLS_MTU;
10300 }
10301 }
10302#endif
10303
10304 ast_config_destroy(cfg);
10305
10306 /* Choosing an odd start port casues issues (like a potential infinite loop) and as odd parts are not
10307 chosen anyway, we are going to round up and issue a warning */
10308 if (rtpstart & 1) {
10309 rtpstart++;
10310 ast_log(LOG_WARNING, "Odd start value for RTP port in rtp.conf, rounding up to %d\n", rtpstart);
10311 }
10312
10313 if (rtpstart >= rtpend) {
10314 ast_log(LOG_WARNING, "Unreasonable values for RTP start/end port in rtp.conf\n");
10317 }
10318 ast_verb(2, "RTP Allocating from port range %d -> %d\n", rtpstart, rtpend);
10319 return 0;
10320}
10321
10322static int reload_module(void)
10323{
10324 rtp_reload(1, 0);
10325 return 0;
10326}
10327
10328#ifdef HAVE_PJPROJECT
10329static void rtp_terminate_pjproject(void)
10330{
10331 pj_thread_register_check();
10332
10333 if (timer_thread) {
10334 timer_terminate = 1;
10335 pj_thread_join(timer_thread);
10336 pj_thread_destroy(timer_thread);
10337 }
10338
10340 pj_shutdown();
10341}
10342
10343static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
10344{
10346 return;
10347 }
10348
10349 /* There is no simple way to just reload the ACLs, so just execute a forced reload. */
10350 rtp_reload(1, 1);
10351}
10352#endif
10353
10354static int load_module(void)
10355{
10356#ifdef HAVE_PJPROJECT
10357 pj_lock_t *lock;
10358
10360
10362 if (pj_init() != PJ_SUCCESS) {
10364 }
10365
10366 if (pjlib_util_init() != PJ_SUCCESS) {
10367 rtp_terminate_pjproject();
10369 }
10370
10371 if (pjnath_init() != PJ_SUCCESS) {
10372 rtp_terminate_pjproject();
10374 }
10375
10376 ast_pjproject_caching_pool_init(&cachingpool, &pj_pool_factory_default_policy, 0);
10377
10378 pool = pj_pool_create(&cachingpool.factory, "timer", 512, 512, NULL);
10379
10380 if (pj_timer_heap_create(pool, 100, &timer_heap) != PJ_SUCCESS) {
10381 rtp_terminate_pjproject();
10383 }
10384
10385 if (pj_lock_create_recursive_mutex(pool, "rtp%p", &lock) != PJ_SUCCESS) {
10386 rtp_terminate_pjproject();
10388 }
10389
10390 pj_timer_heap_set_lock(timer_heap, lock, PJ_TRUE);
10391
10392 if (pj_thread_create(pool, "timer", &timer_worker_thread, NULL, 0, 0, &timer_thread) != PJ_SUCCESS) {
10393 rtp_terminate_pjproject();
10395 }
10396
10397#endif
10398
10399#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP) && defined(HAVE_OPENSSL_BIO_METHOD)
10400 dtls_bio_methods = BIO_meth_new(BIO_TYPE_BIO, "rtp write");
10401 if (!dtls_bio_methods) {
10402#ifdef HAVE_PJPROJECT
10403 rtp_terminate_pjproject();
10404#endif
10406 }
10407 BIO_meth_set_write(dtls_bio_methods, dtls_bio_write);
10408 BIO_meth_set_ctrl(dtls_bio_methods, dtls_bio_ctrl);
10409 BIO_meth_set_create(dtls_bio_methods, dtls_bio_new);
10410 BIO_meth_set_destroy(dtls_bio_methods, dtls_bio_free);
10411#endif
10412
10414#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP) && defined(HAVE_OPENSSL_BIO_METHOD)
10415 BIO_meth_free(dtls_bio_methods);
10416#endif
10417#ifdef HAVE_PJPROJECT
10418 rtp_terminate_pjproject();
10419#endif
10421 }
10422
10424#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP) && defined(HAVE_OPENSSL_BIO_METHOD)
10425 BIO_meth_free(dtls_bio_methods);
10426#endif
10427#ifdef HAVE_PJPROJECT
10429 rtp_terminate_pjproject();
10430#endif
10432 }
10433
10434 rtp_reload(0, 0);
10435
10437}
10438
10439static int unload_module(void)
10440{
10443
10444#if defined(HAVE_OPENSSL) && (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRTP) && defined(HAVE_OPENSSL_BIO_METHOD)
10445 if (dtls_bio_methods) {
10446 BIO_meth_free(dtls_bio_methods);
10447 }
10448#endif
10449
10450#ifdef HAVE_PJPROJECT
10451 host_candidate_overrides_clear();
10452 pj_thread_register_check();
10453 rtp_terminate_pjproject();
10454
10456 rtp_unload_acl(&ice_acl_lock, &ice_acl);
10457 rtp_unload_acl(&stun_acl_lock, &stun_acl);
10458 clean_stunaddr();
10459#endif
10460
10461 return 0;
10462}
10463
10465 .support_level = AST_MODULE_SUPPORT_CORE,
10466 .load = load_module,
10467 .unload = unload_module,
10469 .load_pri = AST_MODPRI_CHANNEL_DEPEND,
10470#ifdef HAVE_PJPROJECT
10471 .requires = "res_pjproject",
10472#endif
Access Control of various sorts.
struct stasis_message_type * ast_named_acl_change_type(void)
a stasis_message_type for changes against a named ACL or the set of all named ACLs
int ast_ouraddrfor(const struct ast_sockaddr *them, struct ast_sockaddr *us)
Get our local IP address when contacting a remote host.
Definition acl.c:1021
void ast_append_acl(const char *sense, const char *stuff, struct ast_acl_list **path, int *error, int *named_acl_flag)
Add a rule to an ACL struct.
Definition acl.c:429
int ast_find_ourip(struct ast_sockaddr *ourip, const struct ast_sockaddr *bindaddr, int family)
Find our IP address.
Definition acl.c:1068
@ AST_SENSE_DENY
Definition acl.h:37
enum ast_acl_sense ast_apply_acl_nolog(struct ast_acl_list *acl_list, const struct ast_sockaddr *addr)
Apply a set of rules to a given IP address, don't log failure.
Definition acl.c:803
struct ast_acl_list * ast_free_acl_list(struct ast_acl_list *acl)
Free a list of ACLs.
Definition acl.c:233
void ast_cli_unregister_multiple(void)
Definition ael_main.c:408
char digit
jack_status_t status
Definition app_jack.c:149
const char * str
Definition app_jack.c:150
enum queue_result id
Definition app_queue.c:1790
pthread_t thread
Definition app_sla.c:335
ast_cond_t cond
Definition app_sla.c:336
ast_mutex_t lock
Definition app_sla.c:337
static volatile unsigned int seq
Definition app_sms.c:126
#define var
Definition ast_expr2f.c:605
void timersub(struct timeval *tvend, struct timeval *tvstart, struct timeval *tvdiff)
char * strsep(char **str, const char *delims)
Asterisk main include file. File version handling, generic pbx functions.
#define ast_free(a)
Definition astmm.h:180
#define ast_strndup(str, len)
A wrapper for strndup()
Definition astmm.h:256
#define ast_strdup(str)
A wrapper for strdup()
Definition astmm.h:241
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition astmm.h:298
void ast_free_ptr(void *ptr)
free() wrapper
Definition astmm.c:1739
#define ast_calloc(num, len)
A wrapper for calloc()
Definition astmm.h:202
#define ast_malloc(len)
A wrapper for malloc()
Definition astmm.h:191
#define ast_log
Definition astobj2.c:42
#define ao2_iterator_next(iter)
Definition astobj2.h:1911
#define ao2_link(container, obj)
Add an object to a container.
Definition astobj2.h:1532
@ CMP_MATCH
Definition astobj2.h:1027
@ CMP_STOP
Definition astobj2.h:1028
#define OBJ_POINTER
Definition astobj2.h:1150
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition astobj2.h:367
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition astobj2.h:363
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define ao2_cleanup(obj)
Definition astobj2.h:1934
#define ao2_find(container, arg, flags)
Definition astobj2.h:1736
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_unlock(a)
Definition astobj2.h:729
#define ao2_replace(dst, src)
Replace one object reference with another cleaning up the original.
Definition astobj2.h:501
#define ao2_lock(a)
Definition astobj2.h:717
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition astobj2.h:404
void * ao2_object_get_lockaddr(void *obj)
Return the mutex lock address of an object.
Definition astobj2.c:476
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition astobj2.h:480
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
Allocate and initialize a list container.
Definition astobj2.h:1327
#define ao2_alloc(data_size, destructor_fn)
Definition astobj2.h:409
static const char desc[]
Definition cdr_radius.c:84
static PGresult * result
Definition cel_pgsql.c:84
unsigned int tos
Definition chan_iax2.c:379
static struct stasis_subscription * acl_change_sub
Definition chan_iax2.c:352
unsigned int cos
Definition chan_iax2.c:380
static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Definition chan_iax2.c:1584
static const char type[]
static char version[AST_MAX_EXTENSION]
static int answer(void *data)
Definition chan_pjsip.c:687
General Asterisk PBX channel definitions.
Standard Command Line Interface.
#define CLI_SHOWUSAGE
Definition cli.h:45
#define AST_CLI_YESNO(x)
Return Yes or No depending on the argument.
Definition cli.h:71
#define CLI_SUCCESS
Definition cli.h:44
#define AST_CLI_DEFINE(fn, txt,...)
Definition cli.h:197
int ast_cli_completion_add(char *value)
Add a result to a request for completion options.
Definition main/cli.c:2845
void ast_cli(int fd, const char *fmt,...)
Definition clicompat.c:6
char * ast_cli_complete(const char *word, const char *const choices[], int pos)
Definition main/cli.c:1931
@ CLI_INIT
Definition cli.h:152
@ CLI_GENERATE
Definition cli.h:153
#define CLI_FAILURE
Definition cli.h:46
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition cli.h:265
static struct ao2_container * codecs
Registered codecs.
Definition codec.c:48
ast_media_type
Types of media.
Definition codec.h:30
@ AST_MEDIA_TYPE_AUDIO
Definition codec.h:32
@ AST_MEDIA_TYPE_UNKNOWN
Definition codec.h:31
@ AST_MEDIA_TYPE_VIDEO
Definition codec.h:33
@ AST_MEDIA_TYPE_END
Definition codec.h:36
@ AST_MEDIA_TYPE_IMAGE
Definition codec.h:34
@ AST_MEDIA_TYPE_TEXT
Definition codec.h:35
unsigned int ast_codec_samples_count(struct ast_frame *frame)
Get the number of samples contained within a frame.
Definition codec.c:379
const char * ast_codec_media_type2str(enum ast_media_type type)
Conversion function to take a media type and turn it into a string.
Definition codec.c:348
static int reconstruct(int sign, int dqln, int y)
Definition codec_g726.c:331
Conversion utility functions.
int ast_str_to_uint(const char *str, unsigned int *res)
Convert the given string to an unsigned integer.
Definition conversions.c:56
Data Buffer API.
void * ast_data_buffer_get(const struct ast_data_buffer *buffer, size_t pos)
Retrieve a data payload from the data buffer.
struct ast_data_buffer * ast_data_buffer_alloc(ast_data_buffer_free_callback free_fn, size_t size)
Allocate a data buffer.
size_t ast_data_buffer_count(const struct ast_data_buffer *buffer)
Return the number of payloads in a data buffer.
void ast_data_buffer_resize(struct ast_data_buffer *buffer, size_t size)
Resize a data buffer.
int ast_data_buffer_put(struct ast_data_buffer *buffer, size_t pos, void *payload)
Place a data payload at a position in the data buffer.
size_t ast_data_buffer_max(const struct ast_data_buffer *buffer)
Return the maximum number of payloads a data buffer can hold.
void * ast_data_buffer_remove(struct ast_data_buffer *buffer, size_t pos)
Remove a data payload from the data buffer.
void ast_data_buffer_free(struct ast_data_buffer *buffer)
Free a data buffer (and all held data payloads)
Core DNS API.
const struct ast_dns_record * ast_dns_record_get_next(const struct ast_dns_record *record)
Get the next DNS record.
Definition dns_core.c:170
int ast_dns_result_get_lowest_ttl(const struct ast_dns_result *result)
Retrieve the lowest TTL from a result.
Definition dns_core.c:112
const char * ast_dns_record_get_data(const struct ast_dns_record *record)
Retrieve the raw DNS record.
Definition dns_core.c:160
const struct ast_dns_record * ast_dns_result_get_records(const struct ast_dns_result *result)
Get the first record of a DNS Result.
Definition dns_core.c:102
struct ast_dns_result * ast_dns_query_get_result(const struct ast_dns_query *query)
Get the result information for a DNS query.
Definition dns_core.c:77
int ast_dns_record_get_rr_type(const struct ast_dns_record *record)
Get the resource record type of a DNS record.
Definition dns_core.c:145
const char * ast_dns_query_get_name(const struct ast_dns_query *query)
Get the name queried in a DNS query.
Definition dns_core.c:57
size_t ast_dns_record_get_data_size(const struct ast_dns_record *record)
Retrieve the size of the raw DNS record.
Definition dns_core.c:165
Internal DNS structure definitions.
DNS Recurring Resolution API.
int ast_dns_resolve_recurring_cancel(struct ast_dns_query_recurring *recurring)
Cancel an asynchronous recurring DNS resolution.
struct ast_dns_query_recurring * ast_dns_resolve_recurring(const char *name, int rr_type, int rr_class, ast_dns_resolve_callback callback, void *data)
Asynchronously resolve a DNS query, and continue resolving it according to the lowest TTL available.
char * end
Definition eagi_proxy.c:73
char buf[BUFSIZE]
Definition eagi_proxy.c:66
char * address
Definition f2c.h:59
#define abs(x)
Definition f2c.h:195
int ast_format_get_smoother_flags(const struct ast_format *format)
Get smoother flags for this format.
Definition format.c:349
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition format.c:354
int ast_format_can_be_smoothed(const struct ast_format *format)
Get whether or not the format can be smoothed.
Definition format.c:344
unsigned int ast_format_get_minimum_bytes(const struct ast_format *format)
Get the minimum number of bytes expected in a frame for this format.
Definition format.c:374
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition format.c:379
unsigned int ast_format_get_minimum_ms(const struct ast_format *format)
Get the minimum amount of media carried in this format.
Definition format.c:364
enum ast_format_cmp_res ast_format_cmp(const struct ast_format *format1, const struct ast_format *format2)
Compare two formats.
Definition format.c:201
@ AST_FORMAT_CMP_EQUAL
Definition format.h:36
@ AST_FORMAT_CMP_NOT_EQUAL
Definition format.h:38
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition format.c:334
unsigned int ast_format_get_default_ms(const struct ast_format *format)
Get the default framing size (in milliseconds) for a format.
Definition format.c:359
Media Format Cache API.
int ast_format_cache_is_slinear(struct ast_format *format)
Determines if a format is one of the cached slin formats.
struct ast_format * ast_format_none
Built-in "null" format.
struct ast_format * ast_format_t140_red
Built-in cached t140 red format.
struct ast_format * ast_format_g722
Built-in cached g722 format.
struct ast_format * ast_format_t140
Built-in cached t140 format.
static const char name[]
Definition format_mp3.c:68
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
struct stasis_message_type * ast_rtp_rtcp_sent_type(void)
Message type for an RTCP message sent from this Asterisk instance.
struct stasis_message_type * ast_rtp_rtcp_received_type(void)
Message type for an RTCP message received from some external source.
const char * ext
Definition http.c:151
Configuration File Parser.
struct ast_config * ast_config_load2(const char *filename, const char *who_asked, struct ast_flags flags)
Load a config file.
#define CONFIG_STATUS_FILEUNCHANGED
@ CONFIG_FLAG_FILEUNCHANGED
#define CONFIG_STATUS_FILEINVALID
int ast_parse_arg(const char *arg, enum ast_parse_flags flags, void *p_result,...)
The argument parsing routine.
void ast_config_destroy(struct ast_config *cfg)
Destroys a config.
Definition extconf.c:1287
const char * ast_variable_retrieve(struct ast_config *config, const char *category, const char *variable)
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Definition extconf.c:1213
Asterisk internal frame definitions.
#define ast_frame_byteswap_be(fr)
#define ast_frisolate(fr)
Makes a frame independent of any static storage.
void ast_frame_free(struct ast_frame *frame, int cache)
Frees a frame or list of frames.
Definition main/frame.c:176
#define ast_frdup(fr)
Copies a frame.
#define ast_frfree(fr)
@ AST_FRFLAG_HAS_SEQUENCE_NUMBER
@ AST_FRFLAG_HAS_TIMING_INFO
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
ast_frame_type
Frame types.
@ AST_FRAME_DTMF_END
@ AST_FRAME_DTMF_BEGIN
@ AST_FRAME_CONTROL
@ AST_CONTROL_VIDUPDATE
@ AST_CONTROL_FLASH
@ AST_CONTROL_SRCCHANGE
struct ast_frame ast_null_frame
Definition main/frame.c:79
#define DEBUG_ATLEAST(level)
#define ast_debug(level,...)
Log a DEBUG message.
#define LOG_DEBUG
#define LOG_ERROR
#define ast_verb(level,...)
#define LOG_NOTICE
#define LOG_WARNING
#define ast_verbose(...)
struct ssl_ctx_st SSL_CTX
Definition iostream.h:38
struct ssl_st SSL
Definition iostream.h:37
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition json.c:73
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition json.c:612
#define AST_RWLIST_REMOVE_CURRENT
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition linkedlists.h:78
#define AST_LIST_HEAD_INIT_NOLOCK(head)
Initializes a list head structure.
#define AST_LIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a list of specified type, statically initialized.
#define AST_LIST_HEAD_NOLOCK(name, type)
Defines a structure to be used to hold a list of specified type (with no lock).
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
#define AST_RWLIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a read/write list of specified type, statically initialized.
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
#define AST_RWLIST_TRAVERSE_SAFE_END
#define AST_LIST_LOCK(head)
Locks a list.
Definition linkedlists.h:40
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
#define AST_RWLIST_INSERT_TAIL
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
#define AST_RWLIST_ENTRY
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Asterisk locking-related definitions:
#define ast_rwlock_wrlock(a)
Definition lock.h:243
#define AST_RWLOCK_INIT_VALUE
Definition lock.h:105
#define ast_cond_init(cond, attr)
Definition lock.h:208
#define ast_cond_timedwait(cond, mutex, time)
Definition lock.h:213
#define ast_rwlock_rdlock(a)
Definition lock.h:242
pthread_cond_t ast_cond_t
Definition lock.h:185
#define ast_rwlock_unlock(a)
Definition lock.h:241
#define ast_cond_signal(cond)
Definition lock.h:210
#define AST_LOG_CATEGORY_DISABLED
#define AST_LOG_CATEGORY_ENABLED
#define ast_debug_category(sublevel, ids,...)
Log for a debug category.
int ast_debug_category_set_sublevel(const char *name, int sublevel)
Set the debug category's sublevel.
int errno
The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party ...
Asterisk module definitions.
@ AST_MODFLAG_LOAD_ORDER
Definition module.h:331
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...)
Definition module.h:557
@ AST_MODPRI_CHANNEL_DEPEND
Definition module.h:340
@ AST_MODULE_SUPPORT_CORE
Definition module.h:121
#define ASTERISK_GPL_KEY
The text the key() function should return.
Definition module.h:46
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition module.h:78
int ast_sockaddr_ipv4_mapped(const struct ast_sockaddr *addr, struct ast_sockaddr *ast_mapped)
Convert an IPv4-mapped IPv6 address into an IPv4 address.
Definition netsock2.c:37
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition netsock2.h:256
#define ast_sockaddr_port(addr)
Get the port number of a socket address.
Definition netsock2.h:517
static void ast_sockaddr_copy(struct ast_sockaddr *dst, const struct ast_sockaddr *src)
Copies the data from one ast_sockaddr to another.
Definition netsock2.h:167
int ast_sockaddr_is_ipv6(const struct ast_sockaddr *addr)
Determine if this is an IPv6 address.
Definition netsock2.c:524
int ast_bind(int sockfd, const struct ast_sockaddr *addr)
Wrapper around bind(2) that uses struct ast_sockaddr.
Definition netsock2.c:590
#define ast_sockaddr_from_sockaddr(addr, sa)
Converts a struct sockaddr to a struct ast_sockaddr.
Definition netsock2.h:819
int ast_sockaddr_cmp_addr(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares the addresses of two ast_sockaddr structures.
Definition netsock2.c:413
static char * ast_sockaddr_stringify_host(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brack...
Definition netsock2.h:327
ssize_t ast_sendto(int sockfd, const void *buf, size_t len, int flags, const struct ast_sockaddr *dest_addr)
Wrapper around sendto(2) that uses ast_sockaddr.
Definition netsock2.c:614
int ast_sockaddr_is_any(const struct ast_sockaddr *addr)
Determine if the address type is unspecified, or "any" address.
Definition netsock2.c:534
int ast_sockaddr_split_hostport(char *str, char **host, char **port, int flags)
Splits a string into its host and port components.
Definition netsock2.c:164
int ast_set_qos(int sockfd, int tos, int cos, const char *desc)
Set type of service.
Definition netsock2.c:621
ast_transport
Definition netsock2.h:59
@ AST_TRANSPORT_UDP
Definition netsock2.h:60
@ AST_TRANSPORT_TCP
Definition netsock2.h:61
#define ast_sockaddr_to_sin(addr, sin)
Converts a struct ast_sockaddr to a struct sockaddr_in.
Definition netsock2.h:765
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
Definition netsock2.c:230
static int ast_sockaddr_isnull(const struct ast_sockaddr *addr)
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized,...
Definition netsock2.h:127
ssize_t ast_recvfrom(int sockfd, void *buf, size_t len, int flags, struct ast_sockaddr *src_addr)
Wrapper around recvfrom(2) that uses struct ast_sockaddr.
Definition netsock2.c:606
int ast_sockaddr_cmp(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares two ast_sockaddr structures.
Definition netsock2.c:388
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
Definition netsock2.h:532
#define ast_sockaddr_from_sin(addr, sin)
Converts a struct sockaddr_in to a struct ast_sockaddr.
Definition netsock2.h:778
static void ast_sockaddr_setnull(struct ast_sockaddr *addr)
Sets address addr to null.
Definition netsock2.h:138
int ast_sockaddr_is_ipv4(const struct ast_sockaddr *addr)
Determine if the address is an IPv4 address.
Definition netsock2.c:497
const char * ast_inet_ntoa(struct in_addr ia)
thread-safe replacement for inet_ntoa().
Definition utils.c:962
Options provided by main asterisk program.
#define AST_PJPROJECT_INIT_LOG_LEVEL()
Get maximum log level pjproject was compiled with.
Definition options.h:177
static int frames
Definition parser.c:51
Core PBX routines and definitions.
static char * generate_random_string(char *buf, size_t size)
Generate 32 byte random string (stolen from chan_sip.c)
static struct stasis_subscription * sub
Statsd channel stats. Exmaple of how to subscribe to Stasis events.
static int reload(void)
int ast_sockaddr_to_pj_sockaddr(const struct ast_sockaddr *addr, pj_sockaddr *pjaddr)
Fill a pj_sockaddr from an ast_sockaddr.
void ast_pjproject_caching_pool_destroy(pj_caching_pool *cp)
Destroy caching pool factory and all cached pools.
int ast_sockaddr_pj_sockaddr_cmp(const struct ast_sockaddr *addr, const pj_sockaddr *pjaddr)
Compare an ast_sockaddr to a pj_sockaddr.
void ast_pjproject_caching_pool_init(pj_caching_pool *cp, const pj_pool_factory_policy *policy, pj_size_t max_capacity)
Initialize the caching pool factory.
static pj_caching_pool cachingpool
Pool factory used by pjlib to allocate memory.
#define OLD_PACKET_COUNT
#define TURN_STATE_WAIT_TIME
static int ast_rtp_dtmf_compatible(struct ast_channel *chan0, struct ast_rtp_instance *instance0, struct ast_channel *chan1, struct ast_rtp_instance *instance1)
static int rtpdebugport
static void ast_rtp_update_source(struct ast_rtp_instance *instance)
#define TRANSPORT_TURN_RTCP
static int ast_rtp_destroy(struct ast_rtp_instance *instance)
#define RTCP_LENGTH_SHIFT
struct ast_srtp_res * res_srtp
Definition rtp_engine.c:182
static int ast_rtp_rtcp_handle_nack(struct ast_rtp_instance *instance, unsigned int *nackdata, unsigned int position, unsigned int length)
static int rtp_reload(int reload, int by_external_config)
#define RTCP_PAYLOAD_TYPE_SHIFT
#define DEFAULT_RTP_RECV_BUFFER_SIZE
#define MAX_TIMESTAMP_SKEW
#define DEFAULT_ICESUPPORT
static void ntp2timeval(unsigned int msw, unsigned int lsw, struct timeval *tv)
#define RTCP_VALID_VALUE
#define RTCP_FB_NACK_BLOCK_WORD_LENGTH
static struct ast_sockaddr rtpdebugaddr
#define DEFAULT_LEARNING_MIN_SEQUENTIAL
#define FLAG_3389_WARNING
static int rtp_learning_rtp_seq_update(struct rtp_learning_info *info, uint16_t seq)
static int create_new_socket(const char *type, struct ast_sockaddr *bind_addr)
static int rtp_transport_wide_cc_feedback_produce(const void *data)
#define RTCP_RR_BLOCK_WORD_LENGTH
static struct ast_frame * ast_rtcp_interpret(struct ast_rtp_instance *instance, struct ast_srtp *srtp, const unsigned char *rtcpdata, size_t size, struct ast_sockaddr *addr)
static const char * rtcp_payload_subtype2str(unsigned int pt, unsigned int subtype)
static int ast_rtp_new(struct ast_rtp_instance *instance, struct ast_sched_context *sched, struct ast_sockaddr *addr, void *data)
static char * handle_cli_rtp_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct ast_frame * ast_rtcp_read(struct ast_rtp_instance *instance)
#define RTP_IGNORE_FIRST_PACKETS_COUNT
static int rtp_raw_write(struct ast_rtp_instance *instance, struct ast_frame *frame, int codec)
static int rtcpdebugport
#define RTCP_SR_BLOCK_WORD_LENGTH
static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration)
#define DEFAULT_RTP_END
static int rtcp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
static struct ast_rtp_instance * rtp_find_instance_by_packet_source_ssrc(struct ast_rtp_instance *instance, struct ast_rtp *rtp, unsigned int ssrc)
#define SRTP_MASTER_LEN
#define RTCP_REPORT_COUNT_SHIFT
#define RTCP_PT_FUR
#define RTCP_DEFAULT_INTERVALMS
static void rtp_deallocate_transport(struct ast_rtp_instance *instance, struct ast_rtp *rtp)
#define RTP_DTLS_ESTABLISHED
static int bridge_p2p_rtp_write(struct ast_rtp_instance *instance, struct ast_rtp_instance *instance1, unsigned int *rtpheader, int len, int hdrlen)
#define DEFAULT_DTMF_TIMEOUT
static void put_unaligned_time24(void *p, uint32_t time_msw, uint32_t time_lsw)
#define RTCP_MAX_INTERVALMS
static int ast_rtcp_generate_nack(struct ast_rtp_instance *instance, unsigned char *rtcpheader)
static char * handle_cli_rtp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
strict_rtp_mode
@ STRICT_RTP_SEQNO
@ STRICT_RTP_YES
@ STRICT_RTP_NO
static void rtp_transport_wide_cc_feedback_status_append(unsigned char *rtcpheader, int *packet_len, int *status_vector_chunk_bits, uint16_t *status_vector_chunk, int *run_length_chunk_count, int *run_length_chunk_status, int status)
static int ast_rtp_bundle(struct ast_rtp_instance *child, struct ast_rtp_instance *parent)
static struct ast_rtp_engine asterisk_rtp_engine
static const char * rtcp_payload_type2str(unsigned int pt)
#define TRANSPORT_SOCKET_RTP
static int rtpend
static void rtp_instance_parse_transport_wide_cc(struct ast_rtp_instance *instance, struct ast_rtp *rtp, unsigned char *data, int len)
static void calc_rxstamp_and_jitter(struct timeval *tv, struct ast_rtp *rtp, unsigned int rx_rtp_ts, int mark)
static unsigned int calc_txstamp(struct ast_rtp *rtp, struct timeval *delivery)
static int ast_rtp_dtmf_continuation(struct ast_rtp_instance *instance)
#define RTCP_PT_RR
#define SRTP_MASTER_KEY_LEN
static int learning_min_sequential
static int rtp_allocate_transport(struct ast_rtp_instance *instance, struct ast_rtp *rtp)
static char * rtcp_do_debug_ip(struct ast_cli_args *a)
static int ast_rtcp_generate_report(struct ast_rtp_instance *instance, unsigned char *rtcpheader, struct ast_rtp_rtcp_report *rtcp_report, int *sr)
static struct ast_frame * ast_rtp_read(struct ast_rtp_instance *instance, int rtcp)
static char * handle_cli_rtcp_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
struct ast_srtp_policy_res * res_srtp_policy
Definition rtp_engine.c:183
#define RTCP_PT_BYE
static struct ast_rtp_instance * __rtp_find_instance_by_ssrc(struct ast_rtp_instance *instance, struct ast_rtp *rtp, unsigned int ssrc, int source)
static void calculate_lost_packet_statistics(struct ast_rtp *rtp, unsigned int *lost_packets, int *fraction_lost)
#define RTCP_HEADER_SSRC_LENGTH
static void process_dtmf_rfc2833(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, int payloadtype, int mark, struct frame_list *frames)
#define RTCP_VALID_MASK
static int srtp_replay_protection
static void ast_rtp_set_stream_num(struct ast_rtp_instance *instance, int stream_num)
static int learning_min_duration
static int ast_rtp_fd(struct ast_rtp_instance *instance, int rtcp)
static int ast_rtcp_generate_compound_prefix(struct ast_rtp_instance *instance, unsigned char *rtcpheader, struct ast_rtp_rtcp_report *report, int *sr)
static void update_jitter_stats(struct ast_rtp *rtp, unsigned int ia_jitter)
#define RTCP_FB_REMB_BLOCK_WORD_LENGTH
#define RTCP_PT_PSFB
static struct ast_frame * process_cn_rfc3389(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, int payloadtype, int mark)
#define DEFAULT_SRTP_REPLAY_PROTECTION
#define DEFAULT_DTLS_MTU
static int reload_module(void)
#define FLAG_NAT_INACTIVE
static int rtcp_debug_test_addr(struct ast_sockaddr *addr)
static int ast_rtp_qos_set(struct ast_rtp_instance *instance, int tos, int cos, const char *desc)
static void ast_rtp_change_source(struct ast_rtp_instance *instance)
static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit)
static void calc_mean_and_standard_deviation(double new_sample, double *mean, double *std_dev, unsigned int *count)
static int compare_by_value(int elem, int value)
Helper function to compare an elem in a vector by value.
static int update_rtt_stats(struct ast_rtp *rtp, unsigned int lsr, unsigned int dlsr)
static int rtcp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int *ice)
static struct ast_sockaddr rtcpdebugaddr
static struct ast_rtp_instance * rtp_find_instance_by_media_source_ssrc(struct ast_rtp_instance *instance, struct ast_rtp *rtp, unsigned int ssrc)
#define MAXIMUM_RTP_RECV_BUFFER_SIZE
static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame)
#define STRICT_RTP_LEARN_TIMEOUT
Strict RTP learning timeout time in milliseconds.
#define RTCP_VERSION_SHIFTED
static int rtcpinterval
static int strictrtp
static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit)
static void rtp_instance_parse_extmap_extensions(struct ast_rtp_instance *instance, struct ast_rtp *rtp, unsigned char *extension, int len)
static int find_by_value(int elem, int value)
Helper function to find an elem in a vector by value.
#define RTCP_REPORT_COUNT_MASK
static void rtp_instance_unlock(struct ast_rtp_instance *instance)
#define DEFAULT_RTP_START
#define TRANSPORT_TURN_RTP
static int rtp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa)
static int rtpstart
#define MINIMUM_RTP_PORT
static struct ast_cli_entry cli_rtp[]
static int ast_rtp_get_stat(struct ast_rtp_instance *instance, struct ast_rtp_instance_stats *stats, enum ast_rtp_instance_stat stat)
#define RESCALE(in, inmin, inmax, outmin, outmax)
#define RTCP_PT_SDES
#define MISSING_SEQNOS_ADDED_TRIGGER
#define SRTP_MASTER_SALT_LEN
static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame)
#define RTCP_PAYLOAD_TYPE_MASK
#define DEFAULT_RTP_SEND_BUFFER_SIZE
#define FLAG_NAT_ACTIVE
#define FLAG_NEED_MARKER_BIT
static int __rtp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int rtcp)
#define RTCP_MIN_INTERVALMS
static void ast_rtp_stop(struct ast_rtp_instance *instance)
#define FLAG_REQ_LOCAL_BRIDGE_BIT
#define RTCP_PT_SR
static int __rtp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int rtcp, int *via_ice, int use_srtp)
static int load_module(void)
static int ast_rtcp_calculate_sr_rr_statistics(struct ast_rtp_instance *instance, struct ast_rtp_rtcp_report *rtcp_report, struct ast_sockaddr remote_address, int ice, int sr)
#define RTCP_VERSION_MASK_SHIFTED
#define CALC_LEARNING_MIN_DURATION(count)
Calculate the min learning duration in ms.
static int rtp_transport_wide_cc_packet_statistics_cmp(struct rtp_transport_wide_cc_packet_statistics a, struct rtp_transport_wide_cc_packet_statistics b)
#define SSRC_MAPPING_ELEM_CMP(elem, value)
SSRC mapping comparator for AST_VECTOR_REMOVE_CMP_UNORDERED()
static int rtp_debug_test_addr(struct ast_sockaddr *addr)
static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int *payloads, int generations)
strict_rtp_state
@ STRICT_RTP_LEARN
@ STRICT_RTP_OPEN
@ STRICT_RTP_CLOSED
static int unload_module(void)
static void ast_rtp_set_remote_ssrc(struct ast_rtp_instance *instance, unsigned int ssrc)
static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value)
#define FLAG_NAT_INACTIVE_NOWARN
static int rtcp_mux(struct ast_rtp *rtp, const unsigned char *packet)
static void rtp_learning_seq_init(struct rtp_learning_info *info, uint16_t seq)
#define TRANSPORT_SOCKET_RTCP
static void rtp_learning_start(struct ast_rtp *rtp)
Start the strictrtp learning mode.
static int ast_rtp_dtmf_mode_set(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode)
static unsigned int ast_rtcp_calc_interval(struct ast_rtp *rtp)
static char * rtp_do_debug_ip(struct ast_cli_args *a)
static enum ast_rtp_dtmf_mode ast_rtp_dtmf_mode_get(struct ast_rtp_instance *instance)
static int rtp_sendto(struct ast_rtp_instance *instance, void *buf, size_t size, int flags, struct ast_sockaddr *sa, int *ice)
static unsigned int ast_rtp_get_ssrc(struct ast_rtp_instance *instance)
#define MAXIMUM_RTP_PORT
static void timeval2ntp(struct timeval tv, unsigned int *msw, unsigned int *lsw)
static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct ast_sockaddr *addr)
static struct ast_frame * ast_rtp_interpret(struct ast_rtp_instance *instance, struct ast_srtp *srtp, const struct ast_sockaddr *remote_address, unsigned char *read_area, int length, int prev_seqno, unsigned int bundled)
static int ast_rtp_local_bridge(struct ast_rtp_instance *instance0, struct ast_rtp_instance *instance1)
static struct ast_frame * red_t140_to_red(struct rtp_red *red)
static int ast_rtcp_generate_sdes(struct ast_rtp_instance *instance, unsigned char *rtcpheader, struct ast_rtp_rtcp_report *rtcp_report)
#define SEQNO_CYCLE_OVER
static double calc_media_experience_score(struct ast_rtp_instance *instance, double normdevrtt, double normdev_rxjitter, double stdev_rxjitter, double normdev_rxlost)
Calculate a "media experience score" based on given data.
static void update_reported_mes_stats(struct ast_rtp *rtp)
static int dtmftimeout
#define DEFAULT_STRICT_RTP
static int ast_rtp_sendcng(struct ast_rtp_instance *instance, int level)
generate comfort noice (CNG)
static char * handle_cli_rtcp_set_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void update_lost_stats(struct ast_rtp *rtp, unsigned int lost_packets)
static void ast_rtp_stun_request(struct ast_rtp_instance *instance, struct ast_sockaddr *suggestion, const char *username)
static const char * ast_rtp_get_cname(struct ast_rtp_instance *instance)
static void rtp_write_rtcp_psfb(struct ast_rtp_instance *instance, struct ast_rtp *rtp, struct ast_frame *frame, struct ast_sockaddr *remote_address)
static int rtcpstats
static struct ast_frame * process_dtmf_cisco(struct ast_rtp_instance *instance, unsigned char *data, int len, unsigned int seqno, unsigned int timestamp, int payloadtype, int mark)
#define RTP_SEQ_MOD
static struct ast_frame * create_dtmf_frame(struct ast_rtp_instance *instance, enum ast_frame_type type, int compensate)
static void rtp_write_rtcp_fir(struct ast_rtp_instance *instance, struct ast_rtp *rtp, struct ast_sockaddr *remote_address)
#define DEFAULT_TURN_PORT
#define MAXIMUM_RTP_SEND_BUFFER_SIZE
static int red_write(const void *data)
Write t140 redundancy frame.
#define DEFAULT_STUN_SOFTWARE_ATTRIBUTE
#define RTCP_LENGTH_MASK
#define DEFAULT_LEARNING_MIN_DURATION
static void update_local_mes_stats(struct ast_rtp *rtp)
static void rtp_transport_wide_cc_feedback_status_vector_append(unsigned char *rtcpheader, int *packet_len, int *status_vector_chunk_bits, uint16_t *status_vector_chunk, int status)
static int ast_rtp_extension_enable(struct ast_rtp_instance *instance, enum ast_rtp_extension extension)
static int ast_rtcp_write(const void *data)
Write a RTCP packet to the far end.
ast_srtp_suite
Definition res_srtp.h:56
@ AST_AES_CM_128_HMAC_SHA1_80
Definition res_srtp.h:58
@ AST_AES_CM_128_HMAC_SHA1_32
Definition res_srtp.h:59
static void cleanup(void)
Clean up any old apps that we don't need any more.
Definition res_stasis.c:327
#define NULL
Definition resample.c:96
Pluggable RTP Architecture.
ast_rtp_dtls_setup
DTLS setup types.
Definition rtp_engine.h:564
@ AST_RTP_DTLS_SETUP_PASSIVE
Definition rtp_engine.h:566
@ AST_RTP_DTLS_SETUP_HOLDCONN
Definition rtp_engine.h:568
@ AST_RTP_DTLS_SETUP_ACTPASS
Definition rtp_engine.h:567
@ AST_RTP_DTLS_SETUP_ACTIVE
Definition rtp_engine.h:565
#define AST_RTP_RTCP_PSFB
Definition rtp_engine.h:329
#define AST_DEBUG_CATEGORY_DTLS
#define ast_debug_rtcp_packet_is_allowed
ast_rtp_ice_role
ICE role during negotiation.
Definition rtp_engine.h:519
@ AST_RTP_ICE_ROLE_CONTROLLING
Definition rtp_engine.h:521
@ AST_RTP_ICE_ROLE_CONTROLLED
Definition rtp_engine.h:520
#define AST_RTP_RTCP_FMT_FIR
Definition rtp_engine.h:337
#define ast_debug_rtcp(sublevel,...)
Log debug level RTCP information.
struct ast_format * ast_rtp_codecs_get_preferred_format(struct ast_rtp_codecs *codecs)
Retrieve rx preferred format.
ast_rtp_ice_component_type
ICE component types.
Definition rtp_engine.h:513
@ AST_RTP_ICE_COMPONENT_RTCP
Definition rtp_engine.h:515
@ AST_RTP_ICE_COMPONENT_RTP
Definition rtp_engine.h:514
struct ast_rtp_rtcp_report * ast_rtp_rtcp_report_alloc(unsigned int report_blocks)
Allocate an ao2 ref counted instance of ast_rtp_rtcp_report.
struct ast_rtp_payload_type * ast_rtp_codecs_get_payload(struct ast_rtp_codecs *codecs, int payload)
Retrieve rx payload mapped information by payload type.
int ast_rtp_instance_get_prop(struct ast_rtp_instance *instance, enum ast_rtp_property property)
Get the value of an RTP instance property.
Definition rtp_engine.c:744
ast_rtp_dtls_hash
DTLS fingerprint hashes.
Definition rtp_engine.h:578
@ AST_RTP_DTLS_HASH_SHA1
Definition rtp_engine.h:580
@ AST_RTP_DTLS_HASH_SHA256
Definition rtp_engine.h:579
int ast_rtp_engine_srtp_is_registered(void)
ast_rtp_dtmf_mode
Definition rtp_engine.h:151
#define AST_RED_MAX_GENERATION
Definition rtp_engine.h:98
#define AST_RTP_DTMF
Definition rtp_engine.h:294
ast_rtp_instance_rtcp
Definition rtp_engine.h:283
@ AST_RTP_INSTANCE_RTCP_MUX
Definition rtp_engine.h:289
@ AST_RTP_INSTANCE_RTCP_STANDARD
Definition rtp_engine.h:287
void ast_rtp_publish_rtcp_message(struct ast_rtp_instance *rtp, struct stasis_message_type *message_type, struct ast_rtp_rtcp_report *report, struct ast_json *blob)
Publish an RTCP message to Stasis Message Bus API.
struct ast_srtp * ast_rtp_instance_get_srtp(struct ast_rtp_instance *instance, int rtcp)
Obtain the SRTP instance associated with an RTP instance.
#define AST_RTP_STAT_TERMINATOR(combined)
Definition rtp_engine.h:500
#define AST_RTP_RTCP_RTPFB
Definition rtp_engine.h:327
struct ast_rtp_instance * ast_rtp_instance_get_bridged(struct ast_rtp_instance *instance)
Get the other RTP instance that an instance is bridged to.
ast_rtp_dtls_verify
DTLS verification settings.
Definition rtp_engine.h:584
@ AST_RTP_DTLS_VERIFY_FINGERPRINT
Definition rtp_engine.h:586
@ AST_RTP_DTLS_VERIFY_CERTIFICATE
Definition rtp_engine.h:587
#define ast_debug_rtp_packet_is_allowed
#define AST_LOG_CATEGORY_RTCP_PACKET
ast_rtp_instance_stat
Definition rtp_engine.h:185
@ AST_RTP_INSTANCE_STAT_LOCAL_MAXRXPLOSS
Definition rtp_engine.h:207
@ AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVRXPLOSS
Definition rtp_engine.h:203
@ AST_RTP_INSTANCE_STAT_REMOTE_MAXRXPLOSS
Definition rtp_engine.h:199
@ AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVMES
Definition rtp_engine.h:270
@ AST_RTP_INSTANCE_STAT_REMOTE_MINJITTER
Definition rtp_engine.h:223
@ AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVMES
Definition rtp_engine.h:278
@ AST_RTP_INSTANCE_STAT_MIN_RTT
Definition rtp_engine.h:243
@ AST_RTP_INSTANCE_STAT_TXMES
Definition rtp_engine.h:262
@ AST_RTP_INSTANCE_STAT_CHANNEL_UNIQUEID
Definition rtp_engine.h:253
@ AST_RTP_INSTANCE_STAT_TXPLOSS
Definition rtp_engine.h:195
@ AST_RTP_INSTANCE_STAT_MAX_RTT
Definition rtp_engine.h:241
@ AST_RTP_INSTANCE_STAT_RXPLOSS
Definition rtp_engine.h:197
@ AST_RTP_INSTANCE_STAT_REMOTE_MAXJITTER
Definition rtp_engine.h:221
@ AST_RTP_INSTANCE_STAT_LOCAL_MAXJITTER
Definition rtp_engine.h:229
@ AST_RTP_INSTANCE_STAT_REMOTE_MINMES
Definition rtp_engine.h:268
@ AST_RTP_INSTANCE_STAT_REMOTE_STDEVJITTER
Definition rtp_engine.h:227
@ AST_RTP_INSTANCE_STAT_REMOTE_MINRXPLOSS
Definition rtp_engine.h:201
@ AST_RTP_INSTANCE_STAT_LOCAL_MINMES
Definition rtp_engine.h:276
@ AST_RTP_INSTANCE_STAT_TXOCTETCOUNT
Definition rtp_engine.h:255
@ AST_RTP_INSTANCE_STAT_RXMES
Definition rtp_engine.h:264
@ AST_RTP_INSTANCE_STAT_REMOTE_STDEVMES
Definition rtp_engine.h:272
@ AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVRXPLOSS
Definition rtp_engine.h:211
@ AST_RTP_INSTANCE_STAT_REMOTE_STDEVRXPLOSS
Definition rtp_engine.h:205
@ AST_RTP_INSTANCE_STAT_LOCAL_STDEVRXPLOSS
Definition rtp_engine.h:213
@ AST_RTP_INSTANCE_STAT_REMOTE_MAXMES
Definition rtp_engine.h:266
@ AST_RTP_INSTANCE_STAT_TXCOUNT
Definition rtp_engine.h:189
@ AST_RTP_INSTANCE_STAT_STDEVRTT
Definition rtp_engine.h:247
@ AST_RTP_INSTANCE_STAT_COMBINED_MES
Definition rtp_engine.h:260
@ AST_RTP_INSTANCE_STAT_LOCAL_MAXMES
Definition rtp_engine.h:274
@ AST_RTP_INSTANCE_STAT_RXJITTER
Definition rtp_engine.h:219
@ AST_RTP_INSTANCE_STAT_LOCAL_MINRXPLOSS
Definition rtp_engine.h:209
@ AST_RTP_INSTANCE_STAT_LOCAL_SSRC
Definition rtp_engine.h:249
@ AST_RTP_INSTANCE_STAT_REMOTE_NORMDEVJITTER
Definition rtp_engine.h:225
@ AST_RTP_INSTANCE_STAT_COMBINED_JITTER
Definition rtp_engine.h:215
@ AST_RTP_INSTANCE_STAT_TXJITTER
Definition rtp_engine.h:217
@ AST_RTP_INSTANCE_STAT_LOCAL_MINJITTER
Definition rtp_engine.h:231
@ AST_RTP_INSTANCE_STAT_COMBINED_LOSS
Definition rtp_engine.h:193
@ AST_RTP_INSTANCE_STAT_LOCAL_STDEVJITTER
Definition rtp_engine.h:235
@ AST_RTP_INSTANCE_STAT_COMBINED_RTT
Definition rtp_engine.h:237
@ AST_RTP_INSTANCE_STAT_NORMDEVRTT
Definition rtp_engine.h:245
@ AST_RTP_INSTANCE_STAT_RTT
Definition rtp_engine.h:239
@ AST_RTP_INSTANCE_STAT_RXOCTETCOUNT
Definition rtp_engine.h:257
@ AST_RTP_INSTANCE_STAT_LOCAL_STDEVMES
Definition rtp_engine.h:280
@ AST_RTP_INSTANCE_STAT_LOCAL_NORMDEVJITTER
Definition rtp_engine.h:233
@ AST_RTP_INSTANCE_STAT_RXCOUNT
Definition rtp_engine.h:191
@ AST_RTP_INSTANCE_STAT_REMOTE_SSRC
Definition rtp_engine.h:251
void * ast_rtp_instance_get_data(struct ast_rtp_instance *instance)
Get the data portion of an RTP instance.
Definition rtp_engine.c:591
#define ast_rtp_instance_get_remote_address(instance, address)
Get the address of the remote endpoint that we are sending RTP to.
enum ast_media_type ast_rtp_codecs_get_stream_type(struct ast_rtp_codecs *codecs)
Determine the type of RTP stream media from the codecs mapped.
#define AST_RTP_RTCP_FMT_NACK
Definition rtp_engine.h:333
#define ast_debug_rtp(sublevel,...)
Log debug level RTP information.
void ast_rtp_instance_set_last_tx(struct ast_rtp_instance *rtp, time_t time)
Set the last RTP transmission time.
void ast_rtp_instance_set_data(struct ast_rtp_instance *instance, void *data)
Set the data portion of an RTP instance.
Definition rtp_engine.c:586
int ast_rtp_codecs_payload_code_tx_sample_rate(struct ast_rtp_codecs *codecs, int asterisk_format, const struct ast_format *format, int code, unsigned int sample_rate)
Retrieve a tx mapped payload type based on whether it is an Asterisk format and the code.
void ast_rtp_instance_set_prop(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value)
Set the value of an RTP instance property.
Definition rtp_engine.c:733
int ast_rtp_codecs_find_payload_code(struct ast_rtp_codecs *codecs, int payload)
Search for the tx payload type in the ast_rtp_codecs structure.
int ast_rtp_codecs_get_preferred_dtmf_format_rate(struct ast_rtp_codecs *codecs)
Retrieve rx preferred dtmf format sample rate.
void ast_rtp_instance_get_local_address(struct ast_rtp_instance *instance, struct ast_sockaddr *address)
Get the local address that we are expecting RTP on.
Definition rtp_engine.c:671
@ AST_RTP_ICE_CANDIDATE_TYPE_RELAYED
Definition rtp_engine.h:509
@ AST_RTP_ICE_CANDIDATE_TYPE_SRFLX
Definition rtp_engine.h:508
@ AST_RTP_ICE_CANDIDATE_TYPE_HOST
Definition rtp_engine.h:507
#define AST_DEBUG_CATEGORY_ICE
int ast_rtp_instance_set_local_address(struct ast_rtp_instance *instance, const struct ast_sockaddr *address)
Set the address that we are expecting to receive RTP on.
Definition rtp_engine.c:616
int ast_rtp_get_rate(const struct ast_format *format)
Retrieve the sample rate of a format according to RTP specifications.
int ast_rtp_codecs_payload_code_tx(struct ast_rtp_codecs *codecs, int asterisk_format, const struct ast_format *format, int code)
Retrieve a tx mapped payload type based on whether it is an Asterisk format and the code.
ast_rtp_extension
Known RTP extensions.
Definition rtp_engine.h:593
@ AST_RTP_EXTENSION_TRANSPORT_WIDE_CC
Definition rtp_engine.h:599
@ AST_RTP_EXTENSION_ABS_SEND_TIME
Definition rtp_engine.h:597
int ast_rtp_payload_mapping_tx_is_present(struct ast_rtp_codecs *codecs, const struct ast_rtp_payload_type *to_match)
Determine if a type of payload is already present in mappings.
#define ast_rtp_instance_set_remote_address(instance, address)
Set the address of the remote endpoint that we are sending RTP to.
#define AST_RTP_RTCP_FMT_REMB
Definition rtp_engine.h:339
ast_rtp_dtls_connection
DTLS connection states.
Definition rtp_engine.h:572
@ AST_RTP_DTLS_CONNECTION_NEW
Definition rtp_engine.h:573
@ AST_RTP_DTLS_CONNECTION_EXISTING
Definition rtp_engine.h:574
#define ast_debug_dtls(sublevel,...)
Log debug level DTLS information.
ast_rtp_property
Definition rtp_engine.h:116
@ AST_RTP_PROPERTY_NAT
Definition rtp_engine.h:118
@ AST_RTP_PROPERTY_RETRANS_RECV
Definition rtp_engine.h:130
@ AST_RTP_PROPERTY_RETRANS_SEND
Definition rtp_engine.h:132
@ AST_RTP_PROPERTY_RTCP
Definition rtp_engine.h:126
@ AST_RTP_PROPERTY_ASYMMETRIC_CODEC
Definition rtp_engine.h:128
@ AST_RTP_PROPERTY_DTMF
Definition rtp_engine.h:120
@ AST_RTP_PROPERTY_DTMF_COMPENSATE
Definition rtp_engine.h:122
@ AST_RTP_PROPERTY_REMB
Definition rtp_engine.h:134
#define ast_debug_dtls_packet_is_allowed
#define AST_LOG_CATEGORY_RTP_PACKET
#define AST_RTP_STAT_STRCPY(current_stat, combined, placement, value)
Definition rtp_engine.h:492
#define ast_debug_ice(sublevel,...)
Log debug level ICE information.
void ast_rtp_instance_get_requested_target_address(struct ast_rtp_instance *instance, struct ast_sockaddr *address)
Get the requested target address of the remote endpoint.
Definition rtp_engine.c:701
int ast_rtp_instance_set_incoming_source_address(struct ast_rtp_instance *instance, const struct ast_sockaddr *address)
Set the incoming source address of the remote endpoint that we are sending RTP to.
Definition rtp_engine.c:634
int ast_rtp_instance_extmap_get_id(struct ast_rtp_instance *instance, enum ast_rtp_extension extension)
Retrieve the id for an RTP extension.
Definition rtp_engine.c:914
#define AST_RTP_CN
Definition rtp_engine.h:296
int ast_rtp_codecs_get_preferred_dtmf_format_pt(struct ast_rtp_codecs *codecs)
Retrieve rx preferred dtmf format payload type.
int ast_rtp_engine_unregister(struct ast_rtp_engine *engine)
Unregister an RTP engine.
Definition rtp_engine.c:370
#define AST_RTP_RTCP_FMT_TRANSPORT_WIDE_CC
Definition rtp_engine.h:341
struct ast_rtp_codecs * ast_rtp_instance_get_codecs(struct ast_rtp_instance *instance)
Get the codecs structure of an RTP instance.
Definition rtp_engine.c:755
const char * ast_rtp_instance_get_channel_id(struct ast_rtp_instance *instance)
Get the unique ID of the channel that owns this RTP instance.
Definition rtp_engine.c:576
unsigned int ast_rtp_codecs_get_framing(struct ast_rtp_codecs *codecs)
Get the framing used for a set of codecs.
unsigned int ast_rtp_instance_get_ssrc(struct ast_rtp_instance *rtp)
Retrieve the local SSRC value that we will be using.
#define AST_RTP_STAT_SET(current_stat, combined, placement, value)
Definition rtp_engine.h:484
#define DEFAULT_DTMF_SAMPLE_RATE_MS
Definition rtp_engine.h:110
int ast_rtp_instance_add_srtp_policy(struct ast_rtp_instance *instance, struct ast_srtp_policy *remote_policy, struct ast_srtp_policy *local_policy, int rtcp)
Add or replace the SRTP policies for the given RTP instance.
#define AST_RTP_RTCP_FMT_PLI
Definition rtp_engine.h:335
#define ast_rtp_engine_register(engine)
Definition rtp_engine.h:852
#define AST_RTP_CISCO_DTMF
Definition rtp_engine.h:298
#define AST_SCHED_DEL_UNREF(sched, id, refcall)
schedule task to get deleted and call unref function
Definition sched.h:82
#define AST_SCHED_DEL(sched, id)
Remove a scheduler entry.
Definition sched.h:46
int ast_sched_del(struct ast_sched_context *con, int id) attribute_warn_unused_result
Deletes a scheduled event.
Definition sched.c:614
int ast_sched_add(struct ast_sched_context *con, int when, ast_sched_cb callback, const void *data) attribute_warn_unused_result
Adds a scheduled event.
Definition sched.c:567
int ast_sched_add_variable(struct ast_sched_context *con, int when, ast_sched_cb callback, const void *data, int variable) attribute_warn_unused_result
Adds a scheduled event with rescheduling support.
Definition sched.c:526
int(* ast_sched_cb)(const void *data)
scheduler callback
Definition sched.h:178
Security Event Reporting API.
struct stasis_topic * ast_security_topic(void)
A stasis_topic which publishes messages for security related issues.
Asterisk internal frame definitions.
void ast_smoother_set_flags(struct ast_smoother *smoother, int flags)
Definition smoother.c:123
#define ast_smoother_feed_be(s, f)
Definition smoother.h:77
int ast_smoother_test_flag(struct ast_smoother *s, int flag)
Definition smoother.c:128
void ast_smoother_free(struct ast_smoother *s)
Definition smoother.c:220
#define AST_SMOOTHER_FLAG_FORCED
Definition smoother.h:36
struct ast_frame * ast_smoother_read(struct ast_smoother *s)
Definition smoother.c:169
#define ast_smoother_feed(s, f)
Definition smoother.h:75
struct ast_smoother * ast_smoother_new(int bytes)
Definition smoother.c:108
#define AST_SMOOTHER_FLAG_BE
Definition smoother.h:35
@ STASIS_SUBSCRIPTION_FILTER_SELECTIVE
Definition stasis.h:297
int stasis_subscription_accept_message_type(struct stasis_subscription *subscription, const struct stasis_message_type *type)
Indicate to a subscription that we are interested in a message type.
Definition stasis.c:1090
int stasis_subscription_set_filter(struct stasis_subscription *subscription, enum stasis_subscription_message_filter filter)
Set the message type filtering level on a subscription.
Definition stasis.c:1144
struct stasis_subscription * stasis_unsubscribe_and_join(struct stasis_subscription *subscription)
Cancel a subscription, blocking until the last message is processed.
Definition stasis.c:1201
#define stasis_subscribe(topic, callback, data)
Definition stasis.h:649
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition strings.h:80
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
Definition utils.c:2233
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
int attribute_pure ast_false(const char *val)
Make sure something is false. Determine if a string containing a boolean value is "false"....
Definition utils.c:2250
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
char *attribute_pure ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition strings.h:161
Generic container type.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition astobj2.h:1821
Wrapper for an ast_acl linked list.
Definition acl.h:76
Structure to describe a channel "technology", ie a channel driver See for examples:
Definition channel.h:648
Main Channel structure associated with a channel.
descriptor for a cli entry.
Definition cli.h:171
int args
This gets set in ast_cli_register()
Definition cli.h:185
char * command
Definition cli.h:186
const char * usage
Definition cli.h:177
Data buffer containing fixed number of data payloads.
Definition data_buffer.c:59
A recurring DNS query.
A DNS query.
For AST_LIST.
char data[0]
The raw DNS record.
int rr_type
Resource record type.
The result of a DNS query.
Structure used to handle boolean flags.
Definition utils.h:220
Definition of a media format.
Definition format.c:43
struct ast_codec * codec
Pointer to the codec in use for this format.
Definition format.c:47
struct ast_format * format
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
struct timeval delivery
enum ast_frame_type frametype
union ast_frame::@235 data
Abstract JSON element (object, array, string, int, ...).
Structure defining an RTCP session.
double reported_mes
unsigned int themrxlsr
unsigned int rxmes_count
unsigned int received_prior
unsigned int sr_count
unsigned char frame_buf[512+AST_FRIENDLY_OFFSET]
double reported_maxjitter
unsigned int reported_mes_count
double reported_normdev_lost
double reported_minlost
double normdevrtt
double reported_normdev_mes
double minrxjitter
unsigned int soc
unsigned int lastsrtxcount
double reported_maxmes
struct ast_sockaddr them
unsigned int reported_lost
double reported_stdev_jitter
unsigned int reported_jitter_count
double normdev_rxjitter
double accumulated_transit
double reported_stdev_lost
struct timeval txlsr
enum ast_rtp_instance_rtcp type
unsigned int spc
unsigned int rxjitter_count
unsigned int reported_lost_count
double normdev_rxlost
double reported_stdev_mes
unsigned int rtt_count
double normdev_rxmes
double maxrxjitter
double reported_normdev_jitter
double reported_maxlost
unsigned int rxlost_count
unsigned int rr_count
double stdev_rxjitter
double reported_jitter
double stdev_rxmes
double reported_minjitter
struct ast_sockaddr us
struct timeval rxlsr
char * local_addr_str
unsigned int expected_prior
double reported_minmes
double stdev_rxlost
DTLS configuration structure.
Definition rtp_engine.h:605
enum ast_rtp_dtls_setup default_setup
Definition rtp_engine.h:608
enum ast_rtp_dtls_verify verify
Definition rtp_engine.h:611
unsigned int rekey
Definition rtp_engine.h:607
enum ast_rtp_dtls_hash hash
Definition rtp_engine.h:610
unsigned int enabled
Definition rtp_engine.h:606
unsigned int ephemeral_cert
Definition rtp_engine.h:617
enum ast_srtp_suite suite
Definition rtp_engine.h:609
Structure that represents the optional DTLS SRTP support within an RTP engine.
Definition rtp_engine.h:621
int(* set_configuration)(struct ast_rtp_instance *instance, const struct ast_rtp_dtls_cfg *dtls_cfg)
Definition rtp_engine.h:623
Structure for an ICE candidate.
Definition rtp_engine.h:525
struct ast_sockaddr address
Definition rtp_engine.h:530
enum ast_rtp_ice_component_type id
Definition rtp_engine.h:527
struct ast_sockaddr relay_address
Definition rtp_engine.h:531
enum ast_rtp_ice_candidate_type type
Definition rtp_engine.h:532
Structure that represents the optional ICE support within an RTP engine.
Definition rtp_engine.h:536
void(* set_authentication)(struct ast_rtp_instance *instance, const char *ufrag, const char *password)
Definition rtp_engine.h:538
void(* start)(struct ast_rtp_instance *instance)
Definition rtp_engine.h:542
const char * name
Definition rtp_engine.h:667
struct ast_rtp_engine_dtls * dtls
Definition rtp_engine.h:744
unsigned int remote_ssrc
Definition rtp_engine.h:454
unsigned int local_ssrc
Definition rtp_engine.h:452
unsigned int rxoctetcount
Definition rtp_engine.h:460
unsigned int txoctetcount
Definition rtp_engine.h:458
char channel_uniqueid[MAX_CHANNEL_ID]
Definition rtp_engine.h:456
An object that represents data received in a feedback report.
Definition rtp_engine.h:388
struct ast_rtp_rtcp_feedback_remb remb
Definition rtp_engine.h:391
Structure for storing RTP packets for retransmission.
A report block within a SR/RR report.
Definition rtp_engine.h:346
unsigned int highest_seq_no
Definition rtp_engine.h:352
unsigned short fraction
Definition rtp_engine.h:349
struct ast_rtp_rtcp_report_block::@287 lost_count
An object that represents data sent during a SR/RR RTCP report.
Definition rtp_engine.h:361
struct ast_rtp_rtcp_report::@288 sender_information
unsigned int type
Definition rtp_engine.h:364
unsigned short reception_report_count
Definition rtp_engine.h:362
unsigned int rtp_timestamp
Definition rtp_engine.h:367
struct ast_rtp_rtcp_report_block * report_block[0]
Definition rtp_engine.h:374
struct timeval ntp_timestamp
Definition rtp_engine.h:366
unsigned int octet_count
Definition rtp_engine.h:369
unsigned int ssrc
Definition rtp_engine.h:363
unsigned int packet_count
Definition rtp_engine.h:368
RTP session description.
unsigned int rxcount
unsigned int lastividtimestamp
unsigned int dtmf_duration
unsigned int dtmfsamples
unsigned int ssrc_orig
struct ast_format * lasttxformat
struct rtp_transport_wide_cc_statistics transport_wide_cc
unsigned int lastts
struct ast_smoother * smoother
struct ast_sched_context * sched
unsigned short seedrxseqno
struct timeval txcore
unsigned int remote_seed_rx_rtp_ts_stable
struct ast_rtp::@512 ssrc_mapping
enum ast_rtp_dtmf_mode dtmfmode
struct ast_sockaddr strict_rtp_address
double rxstart_stable
enum strict_rtp_state strict_rtp_state
unsigned short seqno
unsigned int rxoctetcount
struct timeval rxcore
unsigned int last_seqno
struct ast_frame f
struct ast_rtcp * rtcp
unsigned int themssrc_valid
double rxjitter
unsigned int dtmf_timeout
char cname[AST_UUID_STR_LEN]
unsigned int txcount
unsigned char rawdata[8192+AST_FRIENDLY_OFFSET]
unsigned int last_transit_time_samples
unsigned int cycles
struct ast_rtp::@511 missing_seqno
unsigned int lastovidtimestamp
unsigned int ssrc
unsigned int asymmetric_codec
double rxjitter_samples
struct ast_data_buffer * recv_buffer
optional_ts last_end_timestamp
unsigned int lastotexttimestamp
unsigned int flags
struct timeval dtmfmute
struct ast_sockaddr bind_address
unsigned char ssrc_saved
struct ast_data_buffer * send_buffer
struct rtp_learning_info rtp_source_learn
struct ast_rtp_instance * owner
The RTP instance owning us (used for debugging purposes) We don't hold a reference to the instance be...
unsigned int remote_seed_rx_rtp_ts
unsigned int lastitexttimestamp
unsigned int dtmf_samplerate_ms
unsigned int lastdigitts
unsigned int txoctetcount
struct ast_rtp_instance * bundled
struct rtp_red * red
struct ast_format * lastrxformat
unsigned int themssrc
Structure for rwlock and tracking information.
Definition lock.h:164
Socket address structure.
Definition netsock2.h:97
socklen_t len
Definition netsock2.h:99
void(* destroy)(struct ast_srtp_policy *policy)
Definition res_srtp.h:72
int(* set_master_key)(struct ast_srtp_policy *policy, const unsigned char *key, size_t key_len, const unsigned char *salt, size_t salt_len)
Definition res_srtp.h:74
void(* set_ssrc)(struct ast_srtp_policy *policy, unsigned long ssrc, int inbound)
Definition res_srtp.h:75
int(* set_suite)(struct ast_srtp_policy *policy, enum ast_srtp_suite suite)
Definition res_srtp.h:73
struct ast_srtp_policy *(* alloc)(void)
Definition res_srtp.h:71
int(* unprotect)(struct ast_srtp *srtp, void *buf, int *size, int rtcp)
Definition res_srtp.h:48
int(* change_source)(struct ast_srtp *srtp, unsigned int from_ssrc, unsigned int to_ssrc)
Definition res_srtp.h:44
int(* protect)(struct ast_srtp *srtp, void **buf, int *size, int rtcp)
Definition res_srtp.h:50
struct ast_rtp_instance * rtp
Definition res_srtp.c:93
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
structure to hold extensions
unsigned int ts
unsigned char is_set
RTP learning mode tracking information.
enum ast_media_type stream_type
struct timeval received
struct ast_sockaddr proposed_address
struct timeval start
struct ast_frame t140
unsigned char t140red_data[64000]
unsigned char ts[AST_RED_MAX_GENERATION]
unsigned char len[AST_RED_MAX_GENERATION]
unsigned char buf_data[64000]
unsigned char pt[AST_RED_MAX_GENERATION]
long int prev_ts
struct ast_frame t140red
Structure used for mapping an incoming SSRC to an RTP instance.
unsigned int ssrc
The received SSRC.
unsigned int ssrc_valid
struct ast_rtp_instance * instance
The RTP instance this SSRC belongs to.
Packet statistics (used for transport-cc)
Statistics information (used for transport-cc)
struct rtp_transport_wide_cc_statistics::@510 packet_statistics
Definition sched.c:76
STUN support.
int ast_stun_request(int s, struct sockaddr_in *dst, const char *username, struct sockaddr_in *answer)
Generic STUN request.
Definition stun.c:415
int ast_stun_handle_packet(int s, struct sockaddr_in *src, unsigned char *data, size_t len, stun_cb_f *stun_cb, void *arg)
handle an incoming STUN message.
Definition stun.c:293
#define ast_debug_stun(sublevel,...)
Log debug level STUN information.
Definition stun.h:54
#define AST_DEBUG_CATEGORY_STUN
Definition stun.h:45
static const int STANDARD_STUN_PORT
Definition stun.h:61
@ AST_STUN_ACCEPT
Definition stun.h:65
int value
Definition syslog.c:37
Test Framework API.
#define ast_test_suite_event_notify(s, f,...)
Definition test.h:189
static struct test_options options
static struct test_val b
static struct test_val a
static struct test_val d
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
#define AST_THREADSTORAGE(name)
Define a thread storage variable.
int64_t ast_tvdiff_us(struct timeval end, struct timeval start)
Computes the difference (in microseconds) between two struct timeval instances.
Definition time.h:87
struct timeval ast_samp2tv(unsigned int _nsamp, unsigned int _rate)
Returns a timeval corresponding to the duration of n samples at rate r. Useful to convert samples to ...
Definition time.h:282
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition time.h:117
@ TIME_UNIT_MICROSECOND
Definition time.h:341
int ast_tvcmp(struct timeval _a, struct timeval _b)
Compress two struct timeval instances returning -1, 0, 1 if the first arg is smaller,...
Definition time.h:137
struct timeval ast_time_create_by_unit(unsigned long val, enum TIME_UNIT unit)
Convert the given unit value, and create a timeval object from it.
Definition time.c:113
double ast_samp2sec(unsigned int _nsamp, unsigned int _rate)
Returns the duration in seconds of _nsamp samples at rate _rate.
Definition time.h:316
unsigned int ast_sec2samp(double _seconds, int _rate)
Returns the number of samples at _rate in the duration in _seconds.
Definition time.h:333
struct timeval ast_tvadd(struct timeval a, struct timeval b)
Returns the sum of two timevals a + b.
Definition extconf.c:2280
struct timeval ast_time_create_by_unit_str(unsigned long val, const char *unit)
Convert the given unit value, and create a timeval object from it.
Definition time.c:143
struct timeval ast_tvsub(struct timeval a, struct timeval b)
Returns the difference of two timevals a - b.
Definition extconf.c:2295
double ast_tv2double(const struct timeval *tv)
Returns a double corresponding to the number of seconds in the timeval tv.
Definition time.h:270
ast_suseconds_t ast_time_tv_to_usec(const struct timeval *tv)
Convert a timeval structure to microseconds.
Definition time.c:90
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition time.h:107
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition time.h:159
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
Definition time.h:235
static void destroy(struct ast_trans_pvt *pvt)
Definition translate.c:292
Handle unaligned data access.
static void put_unaligned_uint16(void *p, unsigned short datum)
Definition unaligned.h:65
static void put_unaligned_uint32(void *p, unsigned int datum)
Definition unaligned.h:58
FILE * out
Definition utils/frame.c:33
int error(const char *format,...)
static void statistics(void)
FILE * in
Definition utils/frame.c:33
Utility functions.
#define ast_test_flag(p, flag)
Definition utils.h:64
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition utils.h:981
#define ast_assert(a)
Definition utils.h:779
#define MIN(a, b)
Definition utils.h:252
#define ast_socket_nonblock(domain, type, protocol)
Create a non-blocking socket.
Definition utils.h:1113
#define ast_clear_flag(p, flag)
Definition utils.h:78
long int ast_random(void)
Definition utils.c:2346
#define ast_set_flag(p, flag)
Definition utils.h:71
#define ARRAY_LEN(a)
Definition utils.h:706
Universally unique identifier support.
#define AST_UUID_STR_LEN
Definition uuid.h:27
char * ast_uuid_generate_str(char *buf, size_t size)
Generate a UUID string.
Definition uuid.c:141
#define AST_VECTOR_RESET(vec, cleanup)
Reset vector.
Definition vector.h:636
#define AST_VECTOR_ELEM_CLEANUP_NOOP(elem)
Vector element cleanup that does nothing.
Definition vector.h:582
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition vector.h:620
#define AST_VECTOR_REMOVE_CMP_ORDERED(vec, value, cmp, cleanup)
Remove an element from a vector that matches the given comparison while maintaining order.
Definition vector.h:551
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
Definition vector.h:185
#define AST_VECTOR_REMOVE_CMP_UNORDERED(vec, value, cmp, cleanup)
Remove an element from a vector that matches the given comparison.
Definition vector.h:499
#define AST_VECTOR_GET_CMP(vec, value, cmp)
Get an element from a vector that matches the given comparison.
Definition vector.h:742
#define AST_VECTOR_ADD_SORTED(vec, elem, cmp)
Add an element into a sorted vector.
Definition vector.h:382
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition vector.h:124
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition vector.h:267
#define AST_VECTOR(name, type)
Define a vector structure.
Definition vector.h:44
#define AST_VECTOR_GET_ADDR(vec, idx)
Get an address of element in a vector.
Definition vector.h:679