mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-13 16:21:01 +00:00
Merge "res_rtp_asterisk.c: Disable packet flood detection for video streams."
This commit is contained in:
@@ -21,9 +21,17 @@ rtpend=20000
|
|||||||
; rtcpinterval = 5000 ; Milliseconds between rtcp reports
|
; rtcpinterval = 5000 ; Milliseconds between rtcp reports
|
||||||
;(min 500, max 60000, default 5000)
|
;(min 500, max 60000, default 5000)
|
||||||
;
|
;
|
||||||
; Enable strict RTP protection. This will drop RTP packets that
|
; Enable strict RTP protection. This will drop RTP packets that do not come
|
||||||
; do not come from the source of the RTP stream. This option is
|
; from the recoginized source of the RTP stream. Strict RTP qualifies RTP
|
||||||
; enabled by default.
|
; packet stream sources before accepting them upon initial connection and
|
||||||
|
; when the connection is renegotiated (e.g., transfers and direct media).
|
||||||
|
; Initial connection and renegotiation starts a learning mode to qualify
|
||||||
|
; stream source addresses. Once Asterisk has recognized a stream it will
|
||||||
|
; allow other streams to qualify and replace the current stream for 5
|
||||||
|
; seconds after starting learning mode. Once learning mode completes the
|
||||||
|
; current stream is locked in and cannot change until the next
|
||||||
|
; renegotiation.
|
||||||
|
; This option is enabled by default.
|
||||||
; strictrtp=yes
|
; strictrtp=yes
|
||||||
;
|
;
|
||||||
; Number of packets containing consecutive sequence values needed
|
; Number of packets containing consecutive sequence values needed
|
||||||
|
@@ -1382,6 +1382,16 @@ int ast_rtp_codecs_payloads_set_rtpmap_type_rate(struct ast_rtp_codecs *codecs,
|
|||||||
*/
|
*/
|
||||||
void ast_rtp_codecs_payloads_unset(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload);
|
void ast_rtp_codecs_payloads_unset(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, int payload);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Determine the type of RTP stream media from the codecs mapped.
|
||||||
|
* \since 13.19.0
|
||||||
|
*
|
||||||
|
* \param codecs Codecs structure to look in
|
||||||
|
*
|
||||||
|
* \return Media type or AST_MEDIA_TYPE_UNKNOWN if no codecs mapped.
|
||||||
|
*/
|
||||||
|
enum ast_media_type ast_rtp_codecs_get_stream_type(struct ast_rtp_codecs *codecs);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Retrieve rx payload mapped information by payload type
|
* \brief Retrieve rx payload mapped information by payload type
|
||||||
*
|
*
|
||||||
|
@@ -1176,6 +1176,25 @@ void ast_rtp_codecs_payloads_unset(struct ast_rtp_codecs *codecs, struct ast_rtp
|
|||||||
ast_rwlock_unlock(&codecs->codecs_lock);
|
ast_rwlock_unlock(&codecs->codecs_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ast_media_type ast_rtp_codecs_get_stream_type(struct ast_rtp_codecs *codecs)
|
||||||
|
{
|
||||||
|
enum ast_media_type stream_type = AST_MEDIA_TYPE_UNKNOWN;
|
||||||
|
int payload;
|
||||||
|
struct ast_rtp_payload_type *type;
|
||||||
|
|
||||||
|
ast_rwlock_rdlock(&codecs->codecs_lock);
|
||||||
|
for (payload = 0; payload < AST_VECTOR_SIZE(&codecs->payload_mapping_rx); ++payload) {
|
||||||
|
type = AST_VECTOR_GET(&codecs->payload_mapping_rx, payload);
|
||||||
|
if (type && type->asterisk_format) {
|
||||||
|
stream_type = ast_format_get_type(type->format);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ast_rwlock_unlock(&codecs->codecs_lock);
|
||||||
|
|
||||||
|
return stream_type;
|
||||||
|
}
|
||||||
|
|
||||||
struct ast_rtp_payload_type *ast_rtp_codecs_get_payload(struct ast_rtp_codecs *codecs, int payload)
|
struct ast_rtp_payload_type *ast_rtp_codecs_get_payload(struct ast_rtp_codecs *codecs, int payload)
|
||||||
{
|
{
|
||||||
struct ast_rtp_payload_type *type = NULL;
|
struct ast_rtp_payload_type *type = NULL;
|
||||||
|
@@ -256,6 +256,8 @@ struct rtp_learning_info {
|
|||||||
struct timeval received; /*!< The time of the first received packet */
|
struct timeval received; /*!< The time of the first received packet */
|
||||||
int max_seq; /*!< The highest sequence number received */
|
int max_seq; /*!< The highest sequence number received */
|
||||||
int packets; /*!< The number of remaining packets before the source is accepted */
|
int packets; /*!< The number of remaining packets before the source is accepted */
|
||||||
|
/*! Type of media stream carried by the RTP instance */
|
||||||
|
enum ast_media_type stream_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef HAVE_OPENSSL_SRTP
|
#ifdef HAVE_OPENSSL_SRTP
|
||||||
@@ -3095,18 +3097,30 @@ static int rtp_learning_rtp_seq_update(struct rtp_learning_info *info, uint16_t
|
|||||||
info->received = ast_tvnow();
|
info->received = ast_tvnow();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
switch (info->stream_type) {
|
||||||
* Protect against packet floods by checking that we
|
case AST_MEDIA_TYPE_UNKNOWN:
|
||||||
* received the packet sequence in at least the minimum
|
case AST_MEDIA_TYPE_AUDIO:
|
||||||
* allowed time.
|
/*
|
||||||
*/
|
* Protect against packet floods by checking that we
|
||||||
if (ast_tvzero(info->received)) {
|
* received the packet sequence in at least the minimum
|
||||||
info->received = ast_tvnow();
|
* allowed time.
|
||||||
} else if (!info->packets && (ast_tvdiff_ms(ast_tvnow(), info->received) < learning_min_duration )) {
|
*/
|
||||||
/* Packet flood; reset */
|
if (ast_tvzero(info->received)) {
|
||||||
info->packets = learning_min_sequential - 1;
|
info->received = ast_tvnow();
|
||||||
info->received = ast_tvnow();
|
} else if (!info->packets
|
||||||
|
&& ast_tvdiff_ms(ast_tvnow(), info->received) < learning_min_duration) {
|
||||||
|
/* Packet flood; reset */
|
||||||
|
info->packets = learning_min_sequential - 1;
|
||||||
|
info->received = ast_tvnow();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case AST_MEDIA_TYPE_VIDEO:
|
||||||
|
case AST_MEDIA_TYPE_IMAGE:
|
||||||
|
case AST_MEDIA_TYPE_TEXT:
|
||||||
|
case AST_MEDIA_TYPE_END:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
info->max_seq = seq;
|
info->max_seq = seq;
|
||||||
|
|
||||||
return info->packets;
|
return info->packets;
|
||||||
@@ -5951,6 +5965,15 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc
|
|||||||
* source and we should switch to it.
|
* source and we should switch to it.
|
||||||
*/
|
*/
|
||||||
if (!ast_sockaddr_cmp(&rtp->rtp_source_learn.proposed_address, &addr)) {
|
if (!ast_sockaddr_cmp(&rtp->rtp_source_learn.proposed_address, &addr)) {
|
||||||
|
if (rtp->rtp_source_learn.stream_type == AST_MEDIA_TYPE_UNKNOWN) {
|
||||||
|
struct ast_rtp_codecs *codecs;
|
||||||
|
|
||||||
|
codecs = ast_rtp_instance_get_codecs(instance);
|
||||||
|
rtp->rtp_source_learn.stream_type =
|
||||||
|
ast_rtp_codecs_get_stream_type(codecs);
|
||||||
|
ast_verb(4, "%p -- Strict RTP qualifying stream type: %s\n",
|
||||||
|
rtp, ast_codec_media_type2str(rtp->rtp_source_learn.stream_type));
|
||||||
|
}
|
||||||
if (!rtp_learning_rtp_seq_update(&rtp->rtp_source_learn, seqno)) {
|
if (!rtp_learning_rtp_seq_update(&rtp->rtp_source_learn, seqno)) {
|
||||||
/* Accept the new RTP stream */
|
/* Accept the new RTP stream */
|
||||||
ast_verb(4, "%p -- Strict RTP switching source address to %s\n",
|
ast_verb(4, "%p -- Strict RTP switching source address to %s\n",
|
||||||
|
Reference in New Issue
Block a user