AST-2017-008: Improve RTP and RTCP packet processing.
authorRichard Mudgett <rmudgett@digium.com>
Fri, 25 Aug 2017 22:01:57 +0000 (17:01 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Fri, 15 Sep 2017 20:50:43 +0000 (15:50 -0500)
commit087f667ab11fea1487d9195549268ed5cf2ee831
tree82046fbf075bb9206637202ec9d6a55c235bb6fe
parent317b62c8b4fc06b962a3e11749950853fb0cd897
AST-2017-008: Improve RTP and RTCP packet processing.

Validate RTCP packets before processing them.

* Validate that the received packet is of a minimum length and apply the
RFC3550 RTCP packet validation checks.

* Fixed potentially reading garbage beyond the received RTCP record data.

* Fixed rtp->themssrc only being set once when the remote could change
the SSRC.  We would effectively stop handling the RTCP statistic records.

* Fixed rtp->themssrc to not treat a zero value as special by adding
rtp->themssrc_valid to indicate if rtp->themssrc is available.

ASTERISK-27274

Make strict RTP learning more flexible.

Direct media can cause strict RTP to attempt to learn a remote address
again before it has had a chance to learn the remote address the first
time.  Because of the rapid relearn requests, strict RTP could latch onto
the first remote address and fail to latch onto the direct media remote
address.  As a result, you have one way audio until the call is placed on
and off hold.

The new algorithm learns remote addresses for a set time (1.5 seconds)
before locking the remote address.  In addition, we must see a configured
number of remote packets from the same address in a row before switching.

* Fixed strict RTP learning from always accepting the first new address
packet as the new stream.

* Fixed strict RTP to initialize the expected sequence number with the
last received sequence number instead of the last transmitted sequence
number.

* Fixed the predicted next sequence number calculation in
rtp_learning_rtp_seq_update() to handle overflow.

ASTERISK-27252

Change-Id: Ia2d3aa6e0f22906c25971e74f10027d96525f31c
res/res_rtp_asterisk.c