diff --git a/src/switch_rtp.c b/src/switch_rtp.c index ca3d8487ca..9a6c3cf5e0 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -66,7 +66,8 @@ #define RTP_END_PORT 32768 #define MASTER_KEY_LEN 30 #define RTP_MAGIC_NUMBER 42 -#define MAX_SRTP_ERRS 10 +#define WARN_SRTP_ERRS 10 +#define MAX_SRTP_ERRS 100 #define DTMF_SANITY (rtp_session->one_second * 30) @@ -4801,13 +4802,25 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t } if (stat && rtp_session->recv_msg.header.pt != rtp_session->recv_te && rtp_session->recv_msg.header.pt != rtp_session->cng_pt) { - if (++rtp_session->srtp_errs[rtp_session->srtp_idx_rtp] >= MAX_SRTP_ERRS && stat != 10) { - switch_channel_t *channel = switch_core_session_get_channel(rtp_session->session); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_ERROR, - "Error: SRTP %s unprotect failed with code %d%s %ld\n", rtp_type(rtp_session), stat, - stat == err_status_replay_fail ? " (replay check failed)" : stat == - err_status_auth_fail ? " (auth check failed)" : "", (long)*bytes); - switch_channel_hangup(channel, SWITCH_CAUSE_SRTP_READ_ERROR); + int errs = ++rtp_session->srtp_errs[rtp_session->srtp_idx_rtp]; + if (stat != 10) { + char *msg; + if (stat == err_status_replay_fail) msg="replay check failed"; + else if (stat == err_status_auth_fail) msg="auth check failed"; + else msg=""; + if (errs >= WARN_SRTP_ERRS && !(errs % WARN_SRTP_ERRS)) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_WARNING, + "SRTP %s unprotect failed with code %d (%s) %ld bytes %d errors\n", + rtp_type(rtp_session), stat, msg, (long)*bytes, errs); + } else if (errs >= MAX_SRTP_ERRS) { + switch_channel_t *channel = switch_core_session_get_channel(rtp_session->session); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_ERROR, + "SRTP %s unprotect failed with code %d (%s) %ld bytes %d errors\n", + rtp_type(rtp_session), stat, msg, (long)*bytes, errs); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_ERROR, + "Ending call due to SRTP error\n"); + switch_channel_hangup(channel, SWITCH_CAUSE_SRTP_READ_ERROR); + } } sbytes = 0; } else {