# HG changeset patch # User Mychaela Falconia # Date 1680839409 28800 # Node ID 0047c4c08d9e951e7f72713a599fbf56583bde0f # Parent de7c64c4d6fd685b1f952d42674ae49dacc2590b mgw: accept the new TRAUlike RTP format in addition to standard, old BFI and zero-length payload formats diff -r de7c64c4d6fd -r 0047c4c08d9e include/codec_defs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/codec_defs.h Thu Apr 06 19:50:09 2023 -0800 @@ -0,0 +1,6 @@ +/* + * This header file holds some definitions for the codecs we work with. + */ + +#define GSM_FR_BYTES 33 +#define GSM_EFR_BYTES 31 diff -r de7c64c4d6fd -r 0047c4c08d9e mgw/dtmf_ctrl.c --- a/mgw/dtmf_ctrl.c Tue Apr 04 21:21:04 2023 -0800 +++ b/mgw/dtmf_ctrl.c Thu Apr 06 19:50:09 2023 -0800 @@ -16,7 +16,6 @@ #include "../include/tmgw_ctrl.h" #include "../include/tmgw_const.h" #include "struct.h" -#include "int_defs.h" #include "dtmf_defs.h" extern struct endpoint *find_ep_by_id(); diff -r de7c64c4d6fd -r 0047c4c08d9e mgw/gsm2pstn.c --- a/mgw/gsm2pstn.c Tue Apr 04 21:21:04 2023 -0800 +++ b/mgw/gsm2pstn.c Thu Apr 06 19:50:09 2023 -0800 @@ -17,6 +17,7 @@ #include /* libgsm dependency */ #include #include +#include "../include/codec_defs.h" #include "../include/rtp_defs.h" #include "../include/tmgw_ctrl.h" #include "../include/tmgw_const.h" @@ -41,8 +42,9 @@ unsigned pktsize; int16_t seq_delta; int32_t ts_delta; + uint8_t codec_frame[GSM_FR_BYTES]; int16_t pcm_samples[SAMPLES_PER_FRAME]; - int rc, bfi, taf, m_out; + int rc, bfi, bfi_nodata, taf, m_out; addrlen = sizeof(struct sockaddr_in); rc = recvfrom(in_fd, &pkt, sizeof pkt, 0, @@ -70,16 +72,38 @@ goto bad_rtp_pkt; if ((pkt.m_pt & 0x7F) != ep->gsm_payload_type) goto bad_rtp_pkt; - if (pktsize == ep->gsm_rtp_pkt_size && - (pkt.payload[0] & 0xF0) == ep->gsm_payload_magic) { - bfi = 0; + pktsize -= RTP_PACKET_HDR_SIZE; + if (!pktsize) { + /* zero length payload */ + bfi = bfi_nodata = 1; + taf = 0; + } else if (pktsize == ep->gsm_payload_len && + (pkt.payload[0] & 0xF0) == ep->gsm_payload_magic) { + /* standard RFC 3551 or TS 101 318 payload */ + bfi = bfi_nodata = 0; taf = 0; - } else if (pktsize == RTP_PACKET_SIZE_BFI && pkt.payload[0] == 0xBF) { - bfi = 1; + bcopy(pkt.payload, codec_frame, pktsize); + } else if (pktsize == 2 && pkt.payload[0] == 0xBF) { + /* old BFI marker */ + bfi = bfi_nodata = 1; taf = pkt.payload[1] & 1; - } else if (pktsize == RTP_PACKET_HDR_SIZE) { - bfi = 1; - taf = 0; + } else if ((pkt.payload[0] & 0xF0) == 0xE0) { + /* new TRAUlike RTP payload format */ + bfi_nodata = (pkt.payload[0] & 0x04) >> 2; + bfi = (pkt.payload[0] & 0x02) >> 1; + taf = pkt.payload[0] & 0x01; + if (bfi_nodata) { + if (!bfi) + goto bad_rtp_pkt; + if (pktsize != 1) + goto bad_rtp_pkt; + } else { + if (pktsize != ep->gsm_payload_len + 1) + goto bad_rtp_pkt; + if ((pkt.payload[1] & 0xF0) != ep->gsm_payload_magic) + goto bad_rtp_pkt; + bcopy(pkt.payload+1, codec_frame, ep->gsm_payload_len); + } } else goto bad_rtp_pkt; if (ep->g2p_state && pkt.ssrc != ep->g2p_ssrc) { @@ -127,19 +151,19 @@ case GSM_TCHF_FRAME: if (bfi) gsmfr_preproc_bfi(ep->gsm_decoder_extra_state, taf, - pkt.payload); + codec_frame); else gsmfr_preproc_good_frame(ep->gsm_decoder_extra_state, - pkt.payload); - gsm_decode(ep->gsm_decoder_state, pkt.payload, pcm_samples); + codec_frame); + gsm_decode(ep->gsm_decoder_state, codec_frame, pcm_samples); break; case GSM_TCHF_FRAME_EFR: - if (bfi) + if (bfi_nodata) EFR_decode_bfi_nodata(ep->gsm_decoder_state, taf, pcm_samples); else - EFR_decode_frame(ep->gsm_decoder_state, pkt.payload, - 0, 0, pcm_samples); + EFR_decode_frame(ep->gsm_decoder_state, codec_frame, + bfi, taf, pcm_samples); break; } if (ep->dtmf_sample_ptr) { diff -r de7c64c4d6fd -r 0047c4c08d9e mgw/int_defs.h --- a/mgw/int_defs.h Tue Apr 04 21:21:04 2023 -0800 +++ b/mgw/int_defs.h Thu Apr 06 19:50:09 2023 -0800 @@ -2,8 +2,4 @@ * This header file holds miscellaneous internal definitions for themwi-mgw. */ -#define RTP_PACKET_SIZE_GSM_FR 45 -#define RTP_PACKET_SIZE_GSM_EFR 43 -#define RTP_PACKET_SIZE_BFI 14 - #define SAMPLES_PER_FRAME 160 diff -r de7c64c4d6fd -r 0047c4c08d9e mgw/mdcx.c --- a/mgw/mdcx.c Tue Apr 04 21:21:04 2023 -0800 +++ b/mgw/mdcx.c Thu Apr 06 19:50:09 2023 -0800 @@ -12,10 +12,10 @@ #include #include #include +#include "../include/codec_defs.h" #include "../include/tmgw_ctrl.h" #include "../include/tmgw_const.h" #include "struct.h" -#include "int_defs.h" extern struct endpoint *find_ep_by_id(); @@ -25,11 +25,11 @@ { switch (ep->gsm_payload_msg_type) { case GSM_TCHF_FRAME: - ep->gsm_rtp_pkt_size = RTP_PACKET_SIZE_GSM_FR; + ep->gsm_payload_len = GSM_FR_BYTES; ep->gsm_payload_magic = 0xD0; return; case GSM_TCHF_FRAME_EFR: - ep->gsm_rtp_pkt_size = RTP_PACKET_SIZE_GSM_EFR; + ep->gsm_payload_len = GSM_EFR_BYTES; ep->gsm_payload_magic = 0xC0; return; } diff -r de7c64c4d6fd -r 0047c4c08d9e mgw/pstn2gsm.c --- a/mgw/pstn2gsm.c Tue Apr 04 21:21:04 2023 -0800 +++ b/mgw/pstn2gsm.c Thu Apr 06 19:50:09 2023 -0800 @@ -136,7 +136,8 @@ break; } addrlen = sizeof(struct sockaddr_in); - sendto(ep->rtp_gsm.rtp_fd, &pkt, ep->gsm_rtp_pkt_size, 0, + sendto(ep->rtp_gsm.rtp_fd, &pkt, + RTP_PACKET_HDR_SIZE + ep->gsm_payload_len, 0, (struct sockaddr *) &ep->rtp_gsm.remote_addr, addrlen); } diff -r de7c64c4d6fd -r 0047c4c08d9e mgw/struct.h --- a/mgw/struct.h Tue Apr 04 21:21:04 2023 -0800 +++ b/mgw/struct.h Thu Apr 06 19:50:09 2023 -0800 @@ -23,7 +23,7 @@ struct rtp_one_end rtp_pstn; unsigned gsm_payload_type; unsigned gsm_payload_msg_type; - unsigned gsm_rtp_pkt_size; + unsigned gsm_payload_len; unsigned gsm_payload_magic; unsigned pstn_payload_type; unsigned fwd_mode;