|
|
|
@ -66,6 +66,7 @@ struct packet_handler_ctx { |
|
|
|
sink_handler_q *sinks; // where to send output packets to (forward destination) |
|
|
|
rewrite_func decrypt_func, encrypt_func; // handlers for decrypt/encrypt |
|
|
|
rtcp_filter_func *rtcp_filter; |
|
|
|
struct packet_stream *orig_stream; // saved input stream in case of demux change |
|
|
|
struct packet_stream *in_srtp, *out_srtp; // SRTP contexts for decrypt/encrypt (relevant for muxed RTCP) |
|
|
|
int payload_type; // -1 if unknown or not RTP |
|
|
|
bool rtcp; // true if this is an RTCP packet |
|
|
|
@ -2823,6 +2824,7 @@ static void media_packet_demux_pt(struct packet_handler_ctx *phc) { |
|
|
|
|
|
|
|
// sets in_srtp and sinks |
|
|
|
static void media_packet_set_streams(struct packet_handler_ctx *phc) { |
|
|
|
phc->orig_stream = phc->mp.stream; |
|
|
|
phc->in_srtp = phc->mp.stream; |
|
|
|
phc->sinks = &phc->mp.stream->rtp_sinks; |
|
|
|
|
|
|
|
@ -3175,6 +3177,14 @@ static bool media_packet_address_check(struct packet_handler_ctx *phc) |
|
|
|
goto update_addr; |
|
|
|
} |
|
|
|
|
|
|
|
// try some other options before dropping |
|
|
|
if (!matched && !MEDIA_ISSET(phc->mp.media, ASYMMETRIC)) |
|
|
|
matched = memcmp(&phc->mp.fsin, &phc->orig_stream->endpoint, |
|
|
|
sizeof(phc->mp.fsin)) == 0; |
|
|
|
if (!matched) |
|
|
|
matched = memcmp(&phc->mp.fsin, &phc->orig_stream->learned_endpoint, |
|
|
|
sizeof(phc->mp.fsin)) == 0; |
|
|
|
|
|
|
|
if (!matched && PS_ISSET(phc->mp.stream, STRICT_SOURCE)) { |
|
|
|
ilog(LOG_INFO | LOG_FLAG_LIMIT, "Drop due to strict-source attribute; " |
|
|
|
"got %s%s%s, " |
|
|
|
|