|
|
|
|
@ -256,6 +256,8 @@ struct rtp_learning_info {
|
|
|
|
|
struct timeval received; /*!< The time of the first received packet */
|
|
|
|
|
int max_seq; /*!< The highest sequence number received */
|
|
|
|
|
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
|
|
|
|
|
@ -3095,18 +3097,30 @@ static int rtp_learning_rtp_seq_update(struct rtp_learning_info *info, uint16_t
|
|
|
|
|
info->received = ast_tvnow();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Protect against packet floods by checking that we
|
|
|
|
|
* received the packet sequence in at least the minimum
|
|
|
|
|
* allowed time.
|
|
|
|
|
*/
|
|
|
|
|
if (ast_tvzero(info->received)) {
|
|
|
|
|
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();
|
|
|
|
|
switch (info->stream_type) {
|
|
|
|
|
case AST_MEDIA_TYPE_UNKNOWN:
|
|
|
|
|
case AST_MEDIA_TYPE_AUDIO:
|
|
|
|
|
/*
|
|
|
|
|
* Protect against packet floods by checking that we
|
|
|
|
|
* received the packet sequence in at least the minimum
|
|
|
|
|
* allowed time.
|
|
|
|
|
*/
|
|
|
|
|
if (ast_tvzero(info->received)) {
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
*/
|
|
|
|
|
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)) {
|
|
|
|
|
/* Accept the new RTP stream */
|
|
|
|
|
ast_verb(4, "%p -- Strict RTP switching source address to %s\n",
|
|
|
|
|
|