#ifdef HAVE_OPENSSL_SRTP
static int ast_rtp_activate(struct ast_rtp_instance *instance);
static void dtls_srtp_check_pending(struct ast_rtp_instance *instance, struct ast_rtp *rtp, int rtcp);
-static void dtls_srtp_flush_pending(struct ast_rtp_instance *instance, struct ast_rtp *rtp);
static void dtls_srtp_start_timeout_timer(struct ast_rtp_instance *instance, struct ast_rtp *rtp, int rtcp);
static void dtls_srtp_stop_timeout_timer(struct ast_rtp_instance *instance, struct ast_rtp *rtp, int rtcp);
#endif
if (rtp->rtcp) {
update_address_with_ice_candidate(rtp, AST_RTP_ICE_COMPONENT_RTCP, &rtp->rtcp->them);
}
+ }
#ifdef HAVE_OPENSSL_SRTP
- if (rtp->dtls.dtls_setup != AST_RTP_DTLS_SETUP_PASSIVE) {
- dtls_perform_handshake(instance, &rtp->dtls, 0);
- }
- else {
- dtls_srtp_flush_pending(instance, rtp); /* this flushes pending BIO for both rtp & rtcp as needed. */
- }
+ dtls_perform_handshake(instance, &rtp->dtls, 0);
- if (rtp->rtcp && rtp->rtcp->dtls.dtls_setup != AST_RTP_DTLS_SETUP_PASSIVE) {
- dtls_perform_handshake(instance, &rtp->rtcp->dtls, 1);
- }
-#endif
+ if (rtp->rtcp) {
+ dtls_perform_handshake(instance, &rtp->rtcp->dtls, 1);
}
+#endif
if (!strictrtp) {
return;
AST_SCHED_DEL_UNREF(rtp->sched, dtls->timeout_timer, ao2_ref(instance, -1));
}
-static void dtls_srtp_flush_pending(struct ast_rtp_instance *instance, struct ast_rtp *rtp)
-{
- struct dtls_details *dtls;
-
- dtls = &rtp->dtls;
- ast_mutex_lock(&dtls->lock);
- dtls_srtp_check_pending(instance, rtp, 0);
- ast_mutex_unlock(&dtls->lock);
-
- if (rtp->rtcp) {
- dtls = &rtp->rtcp->dtls;
- ast_mutex_lock(&dtls->lock);
- dtls_srtp_check_pending(instance, rtp, 1);
- ast_mutex_unlock(&dtls->lock);
- }
-}
-
static void dtls_srtp_check_pending(struct ast_rtp_instance *instance, struct ast_rtp *rtp, int rtcp)
{
struct dtls_details *dtls = !rtcp ? &rtp->dtls : &rtp->rtcp->dtls;
SSL_set_accept_state(dtls->ssl);
}
- ast_mutex_lock(&dtls->lock);
-
dtls_srtp_check_pending(instance, rtp, rtcp);
BIO_write(dtls->read_bio, buf, len);
unsigned long error = ERR_get_error();
ast_log(LOG_ERROR, "DTLS failure occurred on RTP instance '%p' due to reason '%s', terminating\n",
instance, ERR_reason_error_string(error));
- ast_mutex_unlock(&dtls->lock);
return -1;
}
dtls_srtp_start_timeout_timer(instance, rtp, rtcp);
}
- ast_mutex_unlock(&dtls->lock);
-
return res;
}
#endif
rtp_learning_seq_init(&rtp->rtp_source_learn, rtp->seqno);
}
-#ifdef HAVE_OPENSSL_SRTP
- /* Trigger pending outbound DTLS packets received before the address was set. Avoid unnecessary locking
- * by checking if we're passive. Without this, we only send the pending packets once a new SSL packet is
- * received in __rtp_recvfrom. If rtp->ice, this is instead done on_ice_complete
- */
-#ifdef HAVE_PJPROJECT
- if (rtp->ice) {
- return;
- }
-#endif
- if (rtp->dtls.dtls_setup == AST_RTP_DTLS_SETUP_PASSIVE) {
- dtls_srtp_flush_pending(instance, rtp);
- }
-#endif
+ return;
}
/*! \brief Write t140 redundacy frame