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