# HG changeset patch # User Mychaela Falconia # Date 1679044497 28800 # Node ID 6aecee01cf0afdeef0eff296aa39f5ff2cc64d57 # Parent 258932879f8b8677234047811d15027e47788061 sip-manual-out: add RTP stream continuity analysis diff -r 258932879f8b -r 6aecee01cf0a include/rtp_defs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/rtp_defs.h Fri Mar 17 01:14:57 2023 -0800 @@ -0,0 +1,19 @@ +/* + * This header file holds some definitions for RTP, as this protocol + * functions in our GSM and PSTN environment. + */ + +#define RTP_PACKET_SIZE_PSTN 172 +#define RTP_PACKET_SIZE_GSM_FR 45 +#define RTP_PACKET_SIZE_GSM_EFR 43 +#define RTP_PACKET_SIZE_BFI 14 +#define RTP_MAX_PAYLOAD 160 + +struct rtp_packet { + uint8_t v_p_x_cc; + uint8_t m_pt; + uint16_t seq; + uint32_t tstamp; + uint32_t ssrc; + uint8_t payload[RTP_MAX_PAYLOAD]; +}; diff -r 258932879f8b -r 6aecee01cf0a sip-manual-out/rtp.c --- a/sip-manual-out/rtp.c Thu Mar 16 23:46:17 2023 -0800 +++ b/sip-manual-out/rtp.c Fri Mar 17 01:14:57 2023 -0800 @@ -8,16 +8,24 @@ #include #include #include +#include #include #include #include #include "../include/tmgw_const.h" +#include "../include/rtp_defs.h" #include "../librtpalloc/rtp_alloc_simple.h" struct sockaddr_in rtp_local_addr; int rtp_udp_fd, rtcp_udp_fd; -static int got_some_rtp, got_some_rtcp; +static int rtp_start_flag, rtp_bad_flag, rtp_ssrc_chg_flag; +static int rtp_seq_brk_flag, rtp_seq_zero_flag, rtp_seq_neg_flag; +static int rtp_ts_brk_flag; +static uint32_t rtp_ssrc; +static uint32_t rtp_last_ts; +static uint16_t rtp_last_seq; +static int got_some_rtcp; void obtain_rtp_endp() @@ -36,12 +44,75 @@ void rtp_rx_select() { - u_char buf[512]; + struct rtp_packet pkt; + struct sockaddr_in sin_from; + socklen_t addrlen; + int16_t seq_delta; + int32_t ts_delta; + int rc; - recv(rtp_udp_fd, buf, sizeof buf, 0); - if (!got_some_rtp) { - printf("Got some RTP\n"); - got_some_rtp = 1; + addrlen = sizeof(struct sockaddr_in); + rc = recvfrom(rtp_udp_fd, &pkt, sizeof pkt, 0, + (struct sockaddr *) &sin_from, &addrlen); + if (rc < 0) + return; + if (rc != RTP_PACKET_SIZE_PSTN) { +bad_rtp_pkt: if (!rtp_bad_flag) { + printf("Got a bad RTP packet\n"); + rtp_bad_flag = 1; + } + return; + } + if (pkt.v_p_x_cc != 0x80) + goto bad_rtp_pkt; + switch (pkt.m_pt & 0x7F) { + case PSTN_CODEC_PCMU: + case PSTN_CODEC_PCMA: + break; + default: + goto bad_rtp_pkt; + } + if (rtp_start_flag && pkt.ssrc != rtp_ssrc) { + if (!rtp_ssrc_chg_flag) { + printf("Rx RTP stream changed SSRC\n"); + rtp_ssrc_chg_flag = 1; + } + } else if (rtp_start_flag) { + seq_delta = ntohs(pkt.seq) - rtp_last_seq; + ts_delta = ntohl(pkt.tstamp) - rtp_last_ts; + if (seq_delta == 0) { + if (!rtp_seq_zero_flag) { + printf("Rx RTP seq zero increment\n"); + rtp_seq_zero_flag = 1; + } + return; + } + if (seq_delta < 0) { + if (!rtp_seq_neg_flag) { + printf("Rx RTP seq negative increment\n"); + rtp_seq_neg_flag = 1; + } + return; + } + if (seq_delta != 1) { + if (!rtp_seq_brk_flag) { + printf("Rx RTP stream seq break\n"); + rtp_seq_brk_flag = 1; + } + } else if (ts_delta != 160) { + if (!rtp_ts_brk_flag) { + printf("Rx RTP stream tstamp break\n"); + rtp_ts_brk_flag = 1; + } + } + } + rtp_ssrc = pkt.ssrc; + rtp_last_ts = ntohl(pkt.tstamp); + rtp_last_seq = ntohs(pkt.seq); + if (!rtp_start_flag) { + printf("Rx RTP stream begins with seq=%u ts=%u\n", + rtp_last_seq, rtp_last_ts); + rtp_start_flag = 1; } }