Merge "res_rtp_asterisk: Trim trailing byte off of SDES packet"
This commit is contained in:
commit
4ea4364eef
1 changed files with 29 additions and 5 deletions
|
@ -3771,6 +3771,7 @@ static int ast_rtcp_write_report(struct ast_rtp_instance *instance, int sr)
|
||||||
RAII_VAR(struct ast_json *, message_blob, NULL, ast_json_unref);
|
RAII_VAR(struct ast_json *, message_blob, NULL, ast_json_unref);
|
||||||
int res;
|
int res;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
uint16_t sdes_packet_len_bytes, sdes_packet_len_rounded;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
unsigned int now_lsw;
|
unsigned int now_lsw;
|
||||||
unsigned int now_msw;
|
unsigned int now_msw;
|
||||||
|
@ -3778,7 +3779,7 @@ static int ast_rtcp_write_report(struct ast_rtp_instance *instance, int sr)
|
||||||
unsigned int lost_packets;
|
unsigned int lost_packets;
|
||||||
int fraction_lost;
|
int fraction_lost;
|
||||||
struct timeval dlsr = { 0, };
|
struct timeval dlsr = { 0, };
|
||||||
unsigned char bdata[512] = "";
|
unsigned char bdata[AST_UUID_STR_LEN + 128] = ""; /* More than enough */
|
||||||
int rate = rtp_get_rate(rtp->f.subclass.format);
|
int rate = rtp_get_rate(rtp->f.subclass.format);
|
||||||
int ice;
|
int ice;
|
||||||
struct ast_sockaddr remote_address = { { 0, } };
|
struct ast_sockaddr remote_address = { { 0, } };
|
||||||
|
@ -3858,12 +3859,35 @@ static int ast_rtcp_write_report(struct ast_rtp_instance *instance, int sr)
|
||||||
put_unaligned_uint32(rtcpheader, htonl((2 << 30) | (rtcp_report->reception_report_count << 24)
|
put_unaligned_uint32(rtcpheader, htonl((2 << 30) | (rtcp_report->reception_report_count << 24)
|
||||||
| ((sr ? RTCP_PT_SR : RTCP_PT_RR) << 16) | ((len/4)-1)));
|
| ((sr ? RTCP_PT_SR : RTCP_PT_RR) << 16) | ((len/4)-1)));
|
||||||
|
|
||||||
put_unaligned_uint32(rtcpheader + len, htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | (2 + (AST_UUID_STR_LEN / 4))));
|
sdes_packet_len_bytes =
|
||||||
|
4 + /* RTCP Header */
|
||||||
|
4 + /* SSRC */
|
||||||
|
1 + /* Type (CNAME) */
|
||||||
|
1 + /* Text Length */
|
||||||
|
AST_UUID_STR_LEN /* Text and NULL terminator */
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Round to 32 bit boundary */
|
||||||
|
sdes_packet_len_rounded = (sdes_packet_len_bytes + 3) & ~0x3;
|
||||||
|
|
||||||
|
put_unaligned_uint32(rtcpheader + len, htonl((2 << 30) | (1 << 24) | (RTCP_PT_SDES << 16) | ((sdes_packet_len_rounded / 4) - 1)));
|
||||||
put_unaligned_uint32(rtcpheader + len + 4, htonl(rtcp_report->ssrc));
|
put_unaligned_uint32(rtcpheader + len + 4, htonl(rtcp_report->ssrc));
|
||||||
put_unaligned_uint16(rtcpheader + len + 8, htonl(0x01 << 24));
|
rtcpheader[len + 8] = 0x01; /* CNAME */
|
||||||
put_unaligned_uint16(rtcpheader + len + 9, htonl(AST_UUID_STR_LEN << 24));
|
rtcpheader[len + 9] = AST_UUID_STR_LEN - 1; /* Number of bytes of text */
|
||||||
memcpy(rtcpheader + len + 10, rtp->cname, AST_UUID_STR_LEN);
|
memcpy(rtcpheader + len + 10, rtp->cname, AST_UUID_STR_LEN);
|
||||||
len += 12 + AST_UUID_STR_LEN;
|
len += 10 + AST_UUID_STR_LEN;
|
||||||
|
|
||||||
|
/* Padding - Note that we don't set the padded bit on the packet. From
|
||||||
|
* RFC 3550 Section 6.5:
|
||||||
|
*
|
||||||
|
* No length octet follows the null item type octet, but additional null
|
||||||
|
* octets MUST be included if needed to pad until the next 32-bit
|
||||||
|
* boundary. Note that this padding is separate from that indicated by
|
||||||
|
* the P bit in the RTCP header.
|
||||||
|
*
|
||||||
|
* These bytes will already be zeroed out during array initialization.
|
||||||
|
*/
|
||||||
|
len += (sdes_packet_len_rounded - sdes_packet_len_bytes);
|
||||||
|
|
||||||
if (rtp->bundled) {
|
if (rtp->bundled) {
|
||||||
ast_rtp_instance_get_remote_address(instance, &remote_address);
|
ast_rtp_instance_get_remote_address(instance, &remote_address);
|
||||||
|
|
Loading…
Reference in a new issue