@ -5212,8 +5212,12 @@ static uint32_t rtp_packet_index(struct re_crypto_context *c,
spin_lock_irqsave ( & c - > lock , flags ) ;
spin_lock_irqsave ( & c - > lock , flags ) ;
/* rfc 3711 section 3.3.1 */
/* rfc 3711 section 3.3.1 */
index = atomic_read ( & ssrc_stats [ ssrc_idx ] - > ext_seq ) ;
if ( unlikely ( ! index ) )
if ( ssrc_stats [ ssrc_idx ] ) {
index = atomic_read ( & ssrc_stats [ ssrc_idx ] - > ext_seq ) ;
if ( unlikely ( ! index ) )
index = seq ;
}
else
index = seq ;
index = seq ;
/* rfc 3711 appendix A, modified, and sections 3.3 and 3.3.1 */
/* rfc 3711 appendix A, modified, and sections 3.3 and 3.3.1 */
@ -5234,7 +5238,8 @@ static uint32_t rtp_packet_index(struct re_crypto_context *c,
}
}
index = ( v < < 16 ) | seq ;
index = ( v < < 16 ) | seq ;
atomic_set ( & ssrc_stats [ ssrc_idx ] - > ext_seq , index ) ;
if ( ssrc_stats [ ssrc_idx ] )
atomic_set ( & ssrc_stats [ ssrc_idx ] - > ext_seq , index ) ;
spin_unlock_irqrestore ( & c - > lock , flags ) ;
spin_unlock_irqrestore ( & c - > lock , flags ) ;
@ -5248,7 +5253,8 @@ static void update_packet_index(struct re_crypto_context *c,
if ( ssrc_idx < 0 )
if ( ssrc_idx < 0 )
ssrc_idx = 0 ;
ssrc_idx = 0 ;
atomic_set ( & ssrc_stats [ ssrc_idx ] - > ext_seq , idx ) ;
if ( ssrc_stats [ ssrc_idx ] )
atomic_set ( & ssrc_stats [ ssrc_idx ] - > ext_seq , idx ) ;
}
}
static int srtp_hash ( unsigned char * hmac ,
static int srtp_hash ( unsigned char * hmac ,
@ -6155,6 +6161,9 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
int32_t d ;
int32_t d ;
uint32_t new_seq ;
uint32_t new_seq ;
if ( ! s )
return ;
uint16_t seq = ntohs ( rtp - > rtp_header - > seq_num ) ;
uint16_t seq = ntohs ( rtp - > rtp_header - > seq_num ) ;
uint32_t ts = ntohl ( rtp - > rtp_header - > timestamp ) ;
uint32_t ts = ntohl ( rtp - > rtp_header - > timestamp ) ;
@ -6374,7 +6383,7 @@ static unsigned int rtpengine46(struct sk_buff *skb, struct sk_buff *oskb,
if ( g - > target . pt_filter )
if ( g - > target . pt_filter )
goto out ;
goto out ;
}
}
else if ( ssrc_idx > = 0 ) {
else if ( ssrc_idx > = 0 & & g - > target . ssrc_stats [ ssrc_idx ] ) {
atomic_set ( & g - > target . ssrc_stats [ ssrc_idx ] - > last_pt ,
atomic_set ( & g - > target . ssrc_stats [ ssrc_idx ] - > last_pt ,
g - > target . pt_stats [ rtp_pt_idx ] - > payload_type ) ;
g - > target . pt_stats [ rtp_pt_idx ] - > payload_type ) ;
atomic64_set ( & g - > target . ssrc_stats [ ssrc_idx ] - > last_packet , packet_ts ) ;
atomic64_set ( & g - > target . ssrc_stats [ ssrc_idx ] - > last_packet , packet_ts ) ;